Chore: MEGA - Make Eslint Great Again 💅 (#26094)

* Fix lint error in types.ts

* Bump eslint and its deps to latest

* Add eslintignore and remove not needed eslintrcs

* Change webpack configs eslint config

* Update package.jsons and removed unused eslintrc files

* Chore yarn lint --fix 💅

* Add devenv to eslintignore

* Remove eslint disable comments for rules that are not used

* Remaining eslint fixes 💅

* Bump grafana/eslint-config 💥

* Modify package.json

No need for duplicate checks.

* Modify eslintignore to ignore data and dist folders

* Revert removing .eslintrc to make sure not to use certain packages

* Modify package.json to remove not needed command

* Use gitignore for ignoring paths
This commit is contained in:
Zoltán Bedi 2020-08-11 17:52:44 +02:00 committed by GitHub
parent e4da0fcb5e
commit ae30482465
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
94 changed files with 873 additions and 892 deletions

View File

@ -1,4 +1,13 @@
{ {
"extends": ["@grafana/eslint-config"], "extends": ["@grafana/eslint-config"],
"root": true "root": true,
"overrides": [
{
"files": ["packages/**/*.{ts,tsx}", "public/app/**/*.{ts,tsx}"],
"rules": {
"react-hooks/rules-of-hooks": "off",
"react-hooks/exhaustive-deps": "off"
}
}
]
} }

1
.gitignore vendored
View File

@ -15,7 +15,6 @@ awsconfig
.yarnrc .yarnrc
.yarn/ .yarn/
vendor/ vendor/
.eslintcache
# Enterprise emails # Enterprise emails
/emails/templates/enterprise_* /emails/templates/enterprise_*

View File

@ -1,5 +1,5 @@
'use strict'; 'use strict';
module.exports = function (grunt) { module.exports = function(grunt) {
var os = require('os'); var os = require('os');
var config = { var config = {
pkg: grunt.file.readJSON('package.json'), pkg: grunt.file.readJSON('package.json'),
@ -47,18 +47,20 @@ module.exports = function (grunt) {
// Utility function to load plugin settings into config // Utility function to load plugin settings into config
function loadConfig(config, path) { function loadConfig(config, path) {
require('glob').sync('*', {cwd: path}).forEach(function(option) { require('glob')
var key = option.replace(/\.js$/,''); .sync('*', { cwd: path })
// If key already exists, extend it. It is your responsibility to avoid naming collisions .forEach(function(option) {
config[key] = config[key] || {}; var key = option.replace(/\.js$/, '');
grunt.util._.extend(config[key], require(path + option)(config,grunt)); // If key already exists, extend it. It is your responsibility to avoid naming collisions
}); config[key] = config[key] || {};
grunt.util._.extend(config[key], require(path + option)(config, grunt));
});
// technically not required // technically not required
return config; return config;
} }
// Merge that object with what with whatever we have here // Merge that object with what with whatever we have here
loadConfig(config,'./scripts/grunt/options/'); loadConfig(config, './scripts/grunt/options/');
// pass the config to grunt // pass the config to grunt
grunt.initConfig(config); grunt.initConfig(config);
}; };

View File

@ -3,7 +3,7 @@ import { createClient, createBasicAuthClient } from './modules/client.js';
import { createTestOrgIfNotExists, createTestdataDatasourceIfNotExists } from './modules/util.js'; import { createTestOrgIfNotExists, createTestdataDatasourceIfNotExists } from './modules/util.js';
export let options = { export let options = {
noCookiesReset: true noCookiesReset: true,
}; };
let endpoint = __ENV.URL || 'http://localhost:3000'; let endpoint = __ENV.URL || 'http://localhost:3000';
@ -18,35 +18,38 @@ export const setup = () => {
orgId: orgId, orgId: orgId,
datasourceId: datasourceId, datasourceId: datasourceId,
}; };
} };
export default (data) => { export default data => {
group("annotation by tag test", () => { group('annotation by tag test', () => {
if (__ITER === 0) { if (__ITER === 0) {
group("user authenticates thru ui with username and password", () => { group('user authenticates thru ui with username and password', () => {
let res = client.ui.login('admin', 'admin'); let res = client.ui.login('admin', 'admin');
check(res, { check(res, {
'response status is 200': (r) => r.status === 200, 'response status is 200': r => r.status === 200,
'response has cookie \'grafana_session\' with 32 characters': (r) => r.cookies.grafana_session[0].value.length === 32, "response has cookie 'grafana_session' with 32 characters": r =>
r.cookies.grafana_session[0].value.length === 32,
}); });
}); });
} }
if (__ITER !== 0) { if (__ITER !== 0) {
group("batch tsdb requests with annotations by tag", () => { group('batch tsdb requests with annotations by tag', () => {
const batchCount = 20; const batchCount = 20;
const requests = []; const requests = [];
const payload = { const payload = {
from: '1547765247624', from: '1547765247624',
to: '1547768847624', to: '1547768847624',
queries: [{ queries: [
refId: 'A', {
scenarioId: 'random_walk', refId: 'A',
intervalMs: 10000, scenarioId: 'random_walk',
maxDataPoints: 433, intervalMs: 10000,
datasourceId: data.datasourceId, maxDataPoints: 433,
}] datasourceId: data.datasourceId,
},
],
}; };
requests.push({ method: 'GET', url: '/api/annotations?from=1580825186534&to=1580846786535' }); requests.push({ method: 'GET', url: '/api/annotations?from=1580825186534&to=1580846786535' });
@ -58,14 +61,14 @@ export default (data) => {
let responses = client.batch(requests); let responses = client.batch(requests);
for (let n = 0; n < batchCount; n++) { for (let n = 0; n < batchCount; n++) {
check(responses[n], { check(responses[n], {
'response status is 200': (r) => r.status === 200, 'response status is 200': r => r.status === 200,
}); });
} }
}); });
} }
}); });
sleep(5) sleep(5);
} };
export const teardown = (data) => {} export const teardown = data => {};

View File

@ -2,7 +2,7 @@ import { sleep, check, group } from 'k6';
import { createBasicAuthClient } from './modules/client.js'; import { createBasicAuthClient } from './modules/client.js';
export let options = { export let options = {
noCookiesReset: true noCookiesReset: true,
}; };
let endpoint = __ENV.URL || 'http://localhost:10080/grafana'; let endpoint = __ENV.URL || 'http://localhost:10080/grafana';
@ -19,17 +19,17 @@ export const setup = () => {
return { return {
datasourceId: res.json().id, datasourceId: res.json().id,
}; };
} };
export default (data) => { export default data => {
group("auth proxy test", () => { group('auth proxy test', () => {
group("batch proxy requests", () => { group('batch proxy requests', () => {
const d = new Date(); const d = new Date();
const batchCount = 300; const batchCount = 300;
const requests = []; const requests = [];
const query = encodeURI('topk(5, max(scrape_duration_seconds) by (job))'); const query = encodeURI('topk(5, max(scrape_duration_seconds) by (job))');
const start = (d.getTime() / 1000) - 3600; const start = d.getTime() / 1000 - 3600;
const end = (d.getTime() / 1000); const end = d.getTime() / 1000;
const step = 20; const step = 20;
requests.push({ method: 'GET', url: '/api/annotations?dashboardId=8&from=1558670300607&to=1558691900607' }); requests.push({ method: 'GET', url: '/api/annotations?dashboardId=8&from=1558670300607&to=1558691900607' });
@ -44,13 +44,13 @@ export default (data) => {
let responses = client.batch(requests); let responses = client.batch(requests);
for (let n = 0; n < batchCount; n++) { for (let n = 0; n < batchCount; n++) {
check(responses[n], { check(responses[n], {
'response status is 200': (r) => r.status === 200, 'response status is 200': r => r.status === 200,
}); });
} }
}); });
}); });
sleep(5) sleep(5);
} };
export const teardown = (data) => {} export const teardown = data => {};

View File

@ -3,11 +3,11 @@ import { createClient, createBasicAuthClient } from './modules/client.js';
import { createTestOrgIfNotExists, createTestdataDatasourceIfNotExists } from './modules/util.js'; import { createTestOrgIfNotExists, createTestdataDatasourceIfNotExists } from './modules/util.js';
export let options = { export let options = {
noCookiesReset: true noCookiesReset: true,
}; };
let endpoint = __ENV.URL || 'http://localhost:3000'; let endpoint = __ENV.URL || 'http://localhost:3000';
const slowQuery = (__ENV.SLOW_QUERY && __ENV.SLOW_QUERY.length > 0) ? parseInt(__ENV.SLOW_QUERY, 10) : 5; const slowQuery = __ENV.SLOW_QUERY && __ENV.SLOW_QUERY.length > 0 ? parseInt(__ENV.SLOW_QUERY, 10) : 5;
const client = createClient(endpoint); const client = createClient(endpoint);
export const setup = () => { export const setup = () => {
@ -19,17 +19,18 @@ export const setup = () => {
orgId: orgId, orgId: orgId,
datasourceId: datasourceId, datasourceId: datasourceId,
}; };
} };
export default (data) => { export default data => {
group(`user auth token slow test (queries between 1 and ${slowQuery} seconds)`, () => { group(`user auth token slow test (queries between 1 and ${slowQuery} seconds)`, () => {
if (__ITER === 0) { if (__ITER === 0) {
group("user authenticates thru ui with username and password", () => { group('user authenticates thru ui with username and password', () => {
let res = client.ui.login('admin', 'admin'); let res = client.ui.login('admin', 'admin');
check(res, { check(res, {
'response status is 200': (r) => r.status === 200, 'response status is 200': r => r.status === 200,
'response has cookie \'grafana_session\' with 32 characters': (r) => r.cookies.grafana_session[0].value.length === 32, "response has cookie 'grafana_session' with 32 characters": r =>
r.cookies.grafana_session[0].value.length === 32,
}); });
}); });
} }
@ -41,14 +42,16 @@ export default (data) => {
const payload = { const payload = {
from: '1547765247624', from: '1547765247624',
to: '1547768847624', to: '1547768847624',
queries: [{ queries: [
refId: 'A', {
scenarioId: 'slow_query', refId: 'A',
stringInput: `${Math.floor(Math.random() * slowQuery) + 1}s`, scenarioId: 'slow_query',
intervalMs: 10000, stringInput: `${Math.floor(Math.random() * slowQuery) + 1}s`,
maxDataPoints: 433, intervalMs: 10000,
datasourceId: data.datasourceId, maxDataPoints: 433,
}] datasourceId: data.datasourceId,
},
],
}; };
requests.push({ method: 'GET', url: '/api/annotations?dashboardId=2074&from=1548078832772&to=1548082432772' }); requests.push({ method: 'GET', url: '/api/annotations?dashboardId=2074&from=1548078832772&to=1548082432772' });
@ -60,14 +63,14 @@ export default (data) => {
let responses = client.batch(requests); let responses = client.batch(requests);
for (let n = 0; n < batchCount; n++) { for (let n = 0; n < batchCount; n++) {
check(responses[n], { check(responses[n], {
'response status is 200': (r) => r.status === 200, 'response status is 200': r => r.status === 200,
}); });
} }
}); });
} }
}); });
sleep(5) sleep(5);
} };
export const teardown = (data) => {} export const teardown = data => {};

View File

@ -3,7 +3,7 @@ import { createClient, createBasicAuthClient } from './modules/client.js';
import { createTestOrgIfNotExists, createTestdataDatasourceIfNotExists } from './modules/util.js'; import { createTestOrgIfNotExists, createTestdataDatasourceIfNotExists } from './modules/util.js';
export let options = { export let options = {
noCookiesReset: true noCookiesReset: true,
}; };
let endpoint = __ENV.URL || 'http://localhost:3000'; let endpoint = __ENV.URL || 'http://localhost:3000';
@ -18,35 +18,38 @@ export const setup = () => {
orgId: orgId, orgId: orgId,
datasourceId: datasourceId, datasourceId: datasourceId,
}; };
} };
export default (data) => { export default data => {
group("user auth token test", () => { group('user auth token test', () => {
if (__ITER === 0) { if (__ITER === 0) {
group("user authenticates thru ui with username and password", () => { group('user authenticates thru ui with username and password', () => {
let res = client.ui.login('admin', 'admin'); let res = client.ui.login('admin', 'admin');
check(res, { check(res, {
'response status is 200': (r) => r.status === 200, 'response status is 200': r => r.status === 200,
'response has cookie \'grafana_session\' with 32 characters': (r) => r.cookies.grafana_session[0].value.length === 32, "response has cookie 'grafana_session' with 32 characters": r =>
r.cookies.grafana_session[0].value.length === 32,
}); });
}); });
} }
if (__ITER !== 0) { if (__ITER !== 0) {
group("batch tsdb requests", () => { group('batch tsdb requests', () => {
const batchCount = 20; const batchCount = 20;
const requests = []; const requests = [];
const payload = { const payload = {
from: '1547765247624', from: '1547765247624',
to: '1547768847624', to: '1547768847624',
queries: [{ queries: [
refId: 'A', {
scenarioId: 'random_walk', refId: 'A',
intervalMs: 10000, scenarioId: 'random_walk',
maxDataPoints: 433, intervalMs: 10000,
datasourceId: data.datasourceId, maxDataPoints: 433,
}] datasourceId: data.datasourceId,
},
],
}; };
requests.push({ method: 'GET', url: '/api/annotations?dashboardId=2074&from=1548078832772&to=1548082432772' }); requests.push({ method: 'GET', url: '/api/annotations?dashboardId=2074&from=1548078832772&to=1548082432772' });
@ -58,14 +61,14 @@ export default (data) => {
let responses = client.batch(requests); let responses = client.batch(requests);
for (let n = 0; n < batchCount; n++) { for (let n = 0; n < batchCount; n++) {
check(responses[n], { check(responses[n], {
'response status is 200': (r) => r.status === 200, 'response status is 200': r => r.status === 200,
}); });
} }
}); });
} }
}); });
sleep(5) sleep(5);
} };
export const teardown = (data) => {} export const teardown = data => {};

View File

@ -1,4 +1,4 @@
import http from "k6/http"; import http from 'k6/http';
import encoding from 'k6/encoding'; import encoding from 'k6/encoding';
export const UIEndpoint = class UIEndpoint { export const UIEndpoint = class UIEndpoint {
@ -10,7 +10,7 @@ export const UIEndpoint = class UIEndpoint {
const payload = { user: username, password: pwd }; const payload = { user: username, password: pwd };
return this.httpClient.formPost('/login', payload); return this.httpClient.formPost('/login', payload);
} }
} };
export const DatasourcesEndpoint = class DatasourcesEndpoint { export const DatasourcesEndpoint = class DatasourcesEndpoint {
constructor(httpClient) { constructor(httpClient) {
@ -32,7 +32,7 @@ export const DatasourcesEndpoint = class DatasourcesEndpoint {
delete(id) { delete(id) {
return this.httpClient.delete(`/datasources/${id}`); return this.httpClient.delete(`/datasources/${id}`);
} }
} };
export const OrganizationsEndpoint = class OrganizationsEndpoint { export const OrganizationsEndpoint = class OrganizationsEndpoint {
constructor(httpClient) { constructor(httpClient) {
@ -57,7 +57,7 @@ export const OrganizationsEndpoint = class OrganizationsEndpoint {
delete(id) { delete(id) {
return this.httpClient.delete(`/orgs/${id}`); return this.httpClient.delete(`/orgs/${id}`);
} }
} };
export const GrafanaClient = class GrafanaClient { export const GrafanaClient = class GrafanaClient {
constructor(httpClient) { constructor(httpClient) {
@ -79,10 +79,10 @@ export const GrafanaClient = class GrafanaClient {
onBeforeRequest(params) { onBeforeRequest(params) {
if (this.orgId && this.orgId > 0) { if (this.orgId && this.orgId > 0) {
params = params.headers || {}; params = params.headers || {};
params.headers["X-Grafana-Org-Id"] = this.orgId; params.headers['X-Grafana-Org-Id'] = this.orgId;
} }
} }
} };
export const BaseClient = class BaseClient { export const BaseClient = class BaseClient {
constructor(url, subUrl) { constructor(url, subUrl) {
@ -99,14 +99,12 @@ export const BaseClient = class BaseClient {
} }
withUrl(subUrl) { withUrl(subUrl) {
let c = new BaseClient(this.url, subUrl); let c = new BaseClient(this.url, subUrl);
c.onBeforeRequest = this.onBeforeRequest; c.onBeforeRequest = this.onBeforeRequest;
return c; return c;
} }
beforeRequest(params) { beforeRequest(params) {}
}
get(url, params) { get(url, params) {
params = params || {}; params = params || {};
@ -156,7 +154,7 @@ export const BaseClient = class BaseClient {
return http.batch(requests); return http.batch(requests);
} }
} };
export class BasicAuthClient extends BaseClient { export class BasicAuthClient extends BaseClient {
constructor(url, subUrl, username, password) { constructor(url, subUrl, username, password) {
@ -166,7 +164,7 @@ export class BasicAuthClient extends BaseClient {
} }
withUrl(subUrl) { withUrl(subUrl) {
let c = new BasicAuthClient(this.url, subUrl, this.username, this.password); let c = new BasicAuthClient(this.url, subUrl, this.username, this.password);
c.onBeforeRequest = this.onBeforeRequest; c.onBeforeRequest = this.onBeforeRequest;
return c; return c;
} }
@ -179,10 +177,10 @@ export class BasicAuthClient extends BaseClient {
} }
} }
export const createClient = (url) => { export const createClient = url => {
return new GrafanaClient(new BaseClient(url, '')); return new GrafanaClient(new BaseClient(url, ''));
} };
export const createBasicAuthClient = (url, username, password) => { export const createBasicAuthClient = (url, username, password) => {
return new GrafanaClient(new BasicAuthClient(url, '', username, password)); return new GrafanaClient(new BasicAuthClient(url, '', username, password));
} };

View File

@ -1,4 +1,4 @@
export const createTestOrgIfNotExists = (client) => { export const createTestOrgIfNotExists = client => {
let orgId = 0; let orgId = 0;
let res = client.orgs.getByName('k6'); let res = client.orgs.getByName('k6');
if (res.status === 404) { if (res.status === 404) {
@ -13,9 +13,9 @@ export const createTestOrgIfNotExists = (client) => {
client.withOrgId(orgId); client.withOrgId(orgId);
return orgId; return orgId;
} };
export const createTestdataDatasourceIfNotExists = (client) => { export const createTestdataDatasourceIfNotExists = client => {
const payload = { const payload = {
access: 'proxy', access: 'proxy',
isDefault: false, isDefault: false,
@ -32,4 +32,4 @@ export const createTestdataDatasourceIfNotExists = (client) => {
} }
return res.json().id; return res.json().id;
} };

View File

@ -1,19 +1,15 @@
module.exports = { module.exports = {
verbose: true, verbose: true,
"globals": { globals: {
"ts-jest": { 'ts-jest': {
"tsConfigFile": "tsconfig.json" tsConfigFile: 'tsconfig.json',
} },
}, },
"transform": { transform: {
"^.+\\.tsx?$": "<rootDir>/../../node_modules/ts-jest/preprocessor.js" '^.+\\.tsx?$': '<rootDir>/../../node_modules/ts-jest/preprocessor.js',
}, },
"moduleDirectories": ["node_modules"], moduleDirectories: ['node_modules'],
"testRegex": "(\\.|/)(test)\\.ts$", testRegex: '(\\.|/)(test)\\.ts$',
"testEnvironment": "node", testEnvironment: 'node',
"moduleFileExtensions": [ moduleFileExtensions: ['ts', 'js', 'json'],
"ts",
"js",
"json"
],
}; };

View File

@ -1,16 +1,16 @@
module.exports = function() { module.exports = function() {
'use strict'; 'use strict';
return { return {
options: { options: {
layout: 'templates/layouts/default.html', layout: 'templates/layouts/default.html',
partials: ['templates/partials/*.hbs'], partials: ['templates/partials/*.hbs'],
helpers: ['templates/helpers/**/*.js'], helpers: ['templates/helpers/**/*.js'],
data: [], data: [],
flatten: true flatten: true,
}, },
pages: { pages: {
src: ['templates/*.html'], src: ['templates/*.html'],
dest: 'dist/' dest: 'dist/',
} },
}; };
}; };

View File

@ -1,14 +1,16 @@
module.exports = { module.exports = {
main: { main: {
options: { options: {
verbose: true, verbose: true,
removeComments: true removeComments: true,
}, },
files: [{ files: [
expand: true, // Enable dynamic expansion. {
cwd: 'dist', // Src matches are relative to this path. expand: true, // Enable dynamic expansion.
cwd: 'dist', // Src matches are relative to this path.
src: ['*.html'], // Actual pattern(s) to match. src: ['*.html'], // Actual pattern(s) to match.
dest: '../public/emails/', // Destination path prefix. dest: '../public/emails/', // Destination path prefix.
}], },
} ],
},
}; };

View File

@ -1,10 +1,12 @@
module.exports = { module.exports = {
dist: { dist: {
files: [{ files: [
expand: true, // Enable dynamic expansion. {
cwd: 'dist', // Src matches are relative to this path. expand: true, // Enable dynamic expansion.
src: ['*.html'], // Actual pattern(s) to match. cwd: 'dist', // Src matches are relative to this path.
dest: 'dist/', // Destination path prefix. src: ['*.html'], // Actual pattern(s) to match.
}], dest: 'dist/', // Destination path prefix.
} },
],
},
}; };

View File

@ -1,13 +1,16 @@
module.exports = { module.exports = {
dist: { dist: {
overwrite: true, overwrite: true,
src: ['dist/*.html'], src: ['dist/*.html'],
replacements: [{ replacements: [
from: '[[', {
to: '{{' from: '[[',
}, { to: '{{',
from: ']]', },
to: '}}' {
}] from: ']]',
} to: '}}',
},
],
},
}; };

View File

@ -1,9 +1,9 @@
module.exports = { module.exports = {
dist: { dist: {
src: ['dist/*.html'], src: ['dist/*.html'],
dest: 'dist/css/tidy.css', dest: 'dist/css/tidy.css',
options: { options: {
report: 'min' // optional: include to report savings report: 'min', // optional: include to report savings
} },
} },
}; };

View File

@ -1,16 +1,15 @@
module.exports = { module.exports = {
src: { src: {
files: [ files: [
//what are the files that we want to watch //what are the files that we want to watch
'assets/css/*.css', 'assets/css/*.css',
'templates/**/*.html', 'templates/**/*.html',
'grunt/*.js', 'grunt/*.js',
], ],
tasks: ['default'], tasks: ['default'],
options: { options: {
nospawn: true, nospawn: true,
livereload: false, livereload: false,
} },
} },
}; };

View File

@ -1,6 +1,4 @@
module.exports = function(grunt) { module.exports = function(grunt) {
// load grunt config // load grunt config
require('load-grunt-config')(grunt); require('load-grunt-config')(grunt);
}; };

View File

@ -13,13 +13,12 @@
"e2e:debug": "./e2e/start-and-run-suite debug", "e2e:debug": "./e2e/start-and-run-suite debug",
"e2e:dev": "./e2e/start-and-run-suite dev", "e2e:dev": "./e2e/start-and-run-suite dev",
"jest": "jest --notify --watch", "jest": "jest --notify --watch",
"lint": "eslint . --ext .js,.tsx,.ts --cache --ignore-path .gitignore --ignore-pattern devenv",
"jest-ci": "mkdir -p reports/junit && export JEST_JUNIT_OUTPUT_DIR=reports/junit && jest --ci --reporters=default --reporters=jest-junit -w ${TEST_MAX_WORKERS:-100%}", "jest-ci": "mkdir -p reports/junit && export JEST_JUNIT_OUTPUT_DIR=reports/junit && jest --ci --reporters=default --reporters=jest-junit -w ${TEST_MAX_WORKERS:-100%}",
"lint": "eslint public/app e2e/suite1 public/test --ext=.js,.ts,.tsx",
"lint:fix": "yarn lint --fix", "lint:fix": "yarn lint --fix",
"packages:build": "lerna run clean && lerna run build --ignore @grafana-plugins/input-datasource", "packages:build": "lerna run clean && lerna run build --ignore @grafana-plugins/input-datasource",
"packages:docsExtract": "rm -rf ./reports/docs && lerna run docsExtract", "packages:docsExtract": "rm -rf ./reports/docs && lerna run docsExtract",
"packages:docsToMarkdown": "api-documenter markdown --input-folder ./reports/docs/ --output-folder ./docs/sources/packages_api/ --hugo", "packages:docsToMarkdown": "api-documenter markdown --input-folder ./reports/docs/ --output-folder ./docs/sources/packages_api/ --hugo",
"packages:lint": "lerna run lint",
"packages:prepare": "lerna version --no-push --no-git-tag-version --force-publish --exact", "packages:prepare": "lerna version --no-push --no-git-tag-version --force-publish --exact",
"packages:publish": "lerna publish from-package --contents dist", "packages:publish": "lerna publish from-package --contents dist",
"packages:publishCanary": "lerna publish from-package --contents dist --dist-tag canary --yes", "packages:publishCanary": "lerna publish from-package --contents dist --dist-tag canary --yes",
@ -53,7 +52,10 @@
} }
}, },
"lint-staged": { "lint-staged": {
"*.{ts,tsx,json,scss}": [ "*.{js,ts,tsx}": [
"eslint --ext .js,.tsx,.ts --cache --fix"
],
"*.{json,scss}": [
"prettier --write" "prettier --write"
], ],
"*pkg/**/*.go": [ "*pkg/**/*.go": [
@ -70,6 +72,7 @@
"@babel/preset-typescript": "7.8.3", "@babel/preset-typescript": "7.8.3",
"@emotion/core": "10.0.27", "@emotion/core": "10.0.27",
"@grafana/api-documenter": "0.9.3", "@grafana/api-documenter": "0.9.3",
"@grafana/eslint-config": "2.0.0",
"@microsoft/api-extractor": "7.8.2-pr1796.0", "@microsoft/api-extractor": "7.8.2-pr1796.0",
"@rtsao/plugin-proposal-class-properties": "7.0.1-patch.1", "@rtsao/plugin-proposal-class-properties": "7.0.1-patch.1",
"@testing-library/react-hooks": "^3.2.1", "@testing-library/react-hooks": "^3.2.1",
@ -111,8 +114,8 @@
"@types/slate-react": "0.22.5", "@types/slate-react": "0.22.5",
"@types/testing-library__react-hooks": "^3.2.0", "@types/testing-library__react-hooks": "^3.2.0",
"@types/tinycolor2": "1.4.2", "@types/tinycolor2": "1.4.2",
"@typescript-eslint/eslint-plugin": "2.19.0", "@typescript-eslint/eslint-plugin": "3.6.0",
"@typescript-eslint/parser": "2.19.0", "@typescript-eslint/parser": "3.6.0",
"angular-mocks": "1.6.6", "angular-mocks": "1.6.6",
"autoprefixer": "9.7.4", "autoprefixer": "9.7.4",
"axios": "0.19.2", "axios": "0.19.2",
@ -127,11 +130,11 @@
"enzyme-to-json": "3.4.4", "enzyme-to-json": "3.4.4",
"es6-promise": "4.2.8", "es6-promise": "4.2.8",
"es6-shim": "0.35.5", "es6-shim": "0.35.5",
"eslint": "6.8.0", "eslint": "7.4.0",
"eslint-config-prettier": "6.10.0", "eslint-config-prettier": "6.11.0",
"eslint-plugin-jsdoc": "22.1.0", "eslint-plugin-jsdoc": "28.6.1",
"eslint-plugin-prettier": "3.1.2", "eslint-plugin-prettier": "3.1.4",
"eslint-plugin-react": "7.18.3", "eslint-plugin-react-hooks": "4.0.5",
"expect.js": "0.3.1", "expect.js": "0.3.1",
"expose-loader": "0.7.5", "expose-loader": "0.7.5",
"file-loader": "5.0.2", "file-loader": "5.0.2",

View File

@ -1,6 +1,13 @@
{ {
"extends": ["@grafana/eslint-config"],
"rules": { "rules": {
"no-restricted-imports": [2, "^@grafana/data.*", "^@grafana/runtime.*", "^@grafana/ui.*"] "no-restricted-imports": ["error", { "patterns": ["@grafana/runtime", "@grafana/ui", "@grafana/data"] }]
} },
"overrides": [
{
"files": ["**/*.test.{ts,tsx}"],
"rules": {
"no-restricted-imports": "off"
}
}
]
} }

View File

@ -1,4 +1,4 @@
'use strict' 'use strict';
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
module.exports = require('./index.production.js'); module.exports = require('./index.production.js');

View File

@ -19,7 +19,6 @@
"bundle": "rollup -c rollup.config.ts", "bundle": "rollup -c rollup.config.ts",
"clean": "rimraf ./dist ./compiled", "clean": "rimraf ./dist ./compiled",
"docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log", "docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log",
"lint": "eslint src/ --ext=.js,.ts,.tsx",
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
@ -30,7 +29,6 @@
"xss": "1.0.6" "xss": "1.0.6"
}, },
"devDependencies": { "devDependencies": {
"@grafana/eslint-config": "^1.0.0-rc1",
"@grafana/tsconfig": "^1.0.0-rc1", "@grafana/tsconfig": "^1.0.0-rc1",
"@rollup/plugin-commonjs": "11.0.2", "@rollup/plugin-commonjs": "11.0.2",
"@rollup/plugin-json": "4.0.3", "@rollup/plugin-json": "4.0.3",

View File

@ -21,7 +21,6 @@
"bundle": "rollup -c rollup.config.ts", "bundle": "rollup -c rollup.config.ts",
"clean": "rimraf ./dist ./compiled", "clean": "rimraf ./dist ./compiled",
"docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log", "docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log",
"lint": "eslint src/ --ext=.js,.ts,.tsx",
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"devDependencies": { "devDependencies": {

View File

@ -24,7 +24,6 @@
"bundle": "rollup -c rollup.config.ts", "bundle": "rollup -c rollup.config.ts",
"clean": "rimraf ./dist ./compiled", "clean": "rimraf ./dist ./compiled",
"docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log", "docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log",
"lint": "eslint cypress/ src/ --ext=.js,.ts,.tsx",
"open": "cypress open", "open": "cypress open",
"start": "cypress run --headless --browser chrome", "start": "cypress run --headless --browser chrome",
"test": "pushd test && node ../dist/bin/grafana-e2e.js run", "test": "pushd test && node ../dist/bin/grafana-e2e.js run",

View File

@ -1,6 +1,5 @@
{ {
"extends": ["@grafana/eslint-config"],
"rules": { "rules": {
"no-restricted-imports": [2, "^@grafana/runtime.*"] "no-restricted-imports": ["error", { "patterns": ["@grafana/runtime"] }]
} }
} }

View File

@ -1,4 +1,4 @@
'use strict' 'use strict';
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
module.exports = require('./index.production.js'); module.exports = require('./index.production.js');

View File

@ -19,7 +19,6 @@
"bundle": "rollup -c rollup.config.ts", "bundle": "rollup -c rollup.config.ts",
"clean": "rimraf ./dist ./compiled", "clean": "rimraf ./dist ./compiled",
"docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log", "docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log",
"lint": "eslint src/ --ext=.js,.ts,.tsx",
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {

View File

@ -1,6 +1,5 @@
{ {
"extends": ["@grafana/eslint-config"],
"rules": { "rules": {
"no-restricted-imports": [2, "^@grafana/runtime.*"] "no-restricted-imports": ["error", { "patterns": ["@grafana/runtime"] }]
} }
} }

View File

@ -1,121 +1,153 @@
"use strict"; 'use strict';
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, '__esModule', { value: true });
var tslib_1 = require("tslib"); var tslib_1 = require('tslib');
var getPluginId_1 = require("../../config/utils/getPluginId"); var getPluginId_1 = require('../../config/utils/getPluginId');
var pluginValidation_1 = require("../../config/utils/pluginValidation"); var pluginValidation_1 = require('../../config/utils/pluginValidation');
var env_1 = require("../../plugins/env"); var env_1 = require('../../plugins/env');
var path = require("path"); var path = require('path');
var fs = require("fs"); var fs = require('fs');
// @ts-ignore // @ts-ignore
// import execa = require('execa'); // import execa = require('execa');
var githubClient_1 = tslib_1.__importDefault(require("./githubClient")); var githubClient_1 = tslib_1.__importDefault(require('./githubClient'));
var resolveContentType = function (extension) { var resolveContentType = function(extension) {
if (extension.startsWith('.')) { if (extension.startsWith('.')) {
extension = extension.substr(1); extension = extension.substr(1);
} }
switch (extension) { switch (extension) {
case 'zip': case 'zip':
return 'application/zip'; return 'application/zip';
case 'json': case 'json':
return 'application/json'; return 'application/json';
case 'sha1': case 'sha1':
return 'text/plain'; return 'text/plain';
default: default:
return 'application/octet-stream'; return 'application/octet-stream';
} }
}; };
var GitHubRelease = /** @class */ (function () { var GitHubRelease = /** @class */ (function() {
function GitHubRelease(token, username, repository, releaseNotes, commitHash) { function GitHubRelease(token, username, repository, releaseNotes, commitHash) {
this.token = token; this.token = token;
this.username = username; this.username = username;
this.repository = repository; this.repository = repository;
this.releaseNotes = releaseNotes; this.releaseNotes = releaseNotes;
this.commitHash = commitHash; this.commitHash = commitHash;
this.git = new githubClient_1.default({ this.git = new githubClient_1.default({
required: true, required: true,
repo: repository, repo: repository,
});
}
GitHubRelease.prototype.publishAssets = function(srcLocation, destUrl) {
var _this = this;
// Add the assets. Loop through files in the ci/dist folder and upload each asset.
var files = fs.readdirSync(srcLocation);
return files.map(function(file) {
return tslib_1.__awaiter(_this, void 0, void 0, function() {
var fileStat, fileData;
return tslib_1.__generator(this, function(_a) {
fileStat = fs.statSync(srcLocation + '/' + file);
fileData = fs.readFileSync(srcLocation + '/' + file);
return [
2 /*return*/,
this.git.client.post(destUrl + '?name=' + file, fileData, {
headers: {
'Content-Type': resolveContentType(path.extname(file)),
'Content-Length': fileStat.size,
},
maxContentLength: fileStat.size * 2 * 1024 * 1024,
}),
];
}); });
} });
GitHubRelease.prototype.publishAssets = function (srcLocation, destUrl) { });
var _this = this; };
// Add the assets. Loop through files in the ci/dist folder and upload each asset. GitHubRelease.prototype.release = function() {
var files = fs.readdirSync(srcLocation); var _a, _b, _c, _d;
return files.map(function (file) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__awaiter(this, void 0, void 0, function() {
var fileStat, fileData; var ciDir,
return tslib_1.__generator(this, function (_a) { distDir,
fileStat = fs.statSync(srcLocation + "/" + file); distContentDir,
fileData = fs.readFileSync(srcLocation + "/" + file); pluginJsonFile,
return [2 /*return*/, this.git.client.post(destUrl + "?name=" + file, fileData, { pluginInfo,
headers: { PUBLISH_DIR,
'Content-Type': resolveContentType(path.extname(file)), commitHash,
'Content-Length': fileStat.size, latestRelease,
}, reason_1,
maxContentLength: fileStat.size * 2 * 1024 * 1024, newReleaseResponse,
})]; publishPromises,
}); reason_2;
}); }); return tslib_1.__generator(this, function(_e) {
}; switch (_e.label) {
GitHubRelease.prototype.release = function () { case 0:
var _a, _b, _c, _d; ciDir = env_1.getCiFolder();
return tslib_1.__awaiter(this, void 0, void 0, function () { distDir = path.resolve(ciDir, 'dist');
var ciDir, distDir, distContentDir, pluginJsonFile, pluginInfo, PUBLISH_DIR, commitHash, latestRelease, reason_1, newReleaseResponse, publishPromises, reason_2; distContentDir = path.resolve(distDir, getPluginId_1.getPluginId());
return tslib_1.__generator(this, function (_e) { pluginJsonFile = path.resolve(distContentDir, 'plugin.json');
switch (_e.label) { pluginInfo = pluginValidation_1.getPluginJson(pluginJsonFile).info;
case 0: PUBLISH_DIR = path.resolve(env_1.getCiFolder(), 'packages');
ciDir = env_1.getCiFolder(); commitHash = this.commitHash || ((_a = pluginInfo.build) === null || _a === void 0 ? void 0 : _a.hash);
distDir = path.resolve(ciDir, 'dist'); _e.label = 1;
distContentDir = path.resolve(distDir, getPluginId_1.getPluginId()); case 1:
pluginJsonFile = path.resolve(distContentDir, 'plugin.json'); _e.trys.push([1, 5, , 6]);
pluginInfo = pluginValidation_1.getPluginJson(pluginJsonFile).info; return [4 /*yield*/, this.git.client.get('releases/tags/v' + pluginInfo.version)];
PUBLISH_DIR = path.resolve(env_1.getCiFolder(), 'packages'); case 2:
commitHash = this.commitHash || ((_a = pluginInfo.build) === null || _a === void 0 ? void 0 : _a.hash); latestRelease = _e.sent();
_e.label = 1; if (!(latestRelease.data.tag_name === 'v' + pluginInfo.version)) {
case 1: return [3 /*break*/, 4];
_e.trys.push([1, 5, , 6]); }
return [4 /*yield*/, this.git.client.get("releases/tags/v" + pluginInfo.version)]; return [4 /*yield*/, this.git.client.delete('releases/' + latestRelease.data.id)];
case 2: case 3:
latestRelease = _e.sent(); _e.sent();
if (!(latestRelease.data.tag_name === "v" + pluginInfo.version)) return [3 /*break*/, 4]; _e.label = 4;
return [4 /*yield*/, this.git.client.delete("releases/" + latestRelease.data.id)]; case 4:
case 3: return [3 /*break*/, 6];
_e.sent(); case 5:
_e.label = 4; reason_1 = _e.sent();
case 4: return [3 /*break*/, 6]; if (reason_1.response.status !== 404) {
case 5: // 404 just means no release found. Not an error. Anything else though, re throw the error
reason_1 = _e.sent(); throw reason_1;
if (reason_1.response.status !== 404) { }
// 404 just means no release found. Not an error. Anything else though, re throw the error return [3 /*break*/, 6];
throw reason_1; case 6:
} _e.trys.push([6, 9, , 10]);
return [3 /*break*/, 6]; return [
case 6: 4 /*yield*/,
_e.trys.push([6, 9, , 10]); this.git.client.post('releases', {
return [4 /*yield*/, this.git.client.post('releases', { tag_name: 'v' + pluginInfo.version,
tag_name: "v" + pluginInfo.version, target_commitish: commitHash,
target_commitish: commitHash, name: 'v' + pluginInfo.version,
name: "v" + pluginInfo.version, body: this.releaseNotes,
body: this.releaseNotes, draft: false,
draft: false, prerelease: false,
prerelease: false, }),
})]; ];
case 7: case 7:
newReleaseResponse = _e.sent(); newReleaseResponse = _e.sent();
publishPromises = this.publishAssets(PUBLISH_DIR, "https://uploads.github.com/repos/" + this.username + "/" + this.repository + "/releases/" + newReleaseResponse.data.id + "/assets"); publishPromises = this.publishAssets(
return [4 /*yield*/, Promise.all(publishPromises)]; PUBLISH_DIR,
case 8: 'https://uploads.github.com/repos/' +
_e.sent(); this.username +
return [3 /*break*/, 10]; '/' +
case 9: this.repository +
reason_2 = _e.sent(); '/releases/' +
console.log(reason_2); newReleaseResponse.data.id +
// Rethrow the error so that we can trigger a non-zero exit code to circle-ci '/assets'
throw reason_2; );
case 10: return [2 /*return*/]; return [4 /*yield*/, Promise.all(publishPromises)];
} case 8:
}); _e.sent();
}); return [3 /*break*/, 10];
}; case 9:
return GitHubRelease; reason_2 = _e.sent();
}()); console.log(reason_2);
// Rethrow the error so that we can trigger a non-zero exit code to circle-ci
throw reason_2;
case 10:
return [2 /*return*/];
}
});
});
};
return GitHubRelease;
})();
exports.GitHubRelease = GitHubRelease; exports.GitHubRelease = GitHubRelease;
//# sourceMappingURL=githubRelease.js.map7027e10521e9 //# sourceMappingURL=githubRelease.js.map7027e10521e9

View File

@ -21,7 +21,6 @@
"scripts": { "scripts": {
"build": "grafana-toolkit toolkit:build", "build": "grafana-toolkit toolkit:build",
"clean": "rimraf ./dist ./compiled", "clean": "rimraf ./dist ./compiled",
"lint": "eslint src/ --ext=.js,.ts,.tsx",
"precommit": "npm run lint & npm run typecheck", "precommit": "npm run lint & npm run typecheck",
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
@ -30,7 +29,7 @@
"@babel/core": "7.9.0", "@babel/core": "7.9.0",
"@babel/preset-env": "7.9.0", "@babel/preset-env": "7.9.0",
"@grafana/data": "next", "@grafana/data": "next",
"@grafana/eslint-config": "^1.0.0-rc1", "@grafana/eslint-config": "2.0.0",
"@grafana/tsconfig": "^1.0.0-rc1", "@grafana/tsconfig": "^1.0.0-rc1",
"@grafana/ui": "next", "@grafana/ui": "next",
"@types/command-exists": "^1.2.0", "@types/command-exists": "^1.2.0",
@ -48,8 +47,8 @@
"@types/semver": "^6.0.0", "@types/semver": "^6.0.0",
"@types/tmp": "^0.1.0", "@types/tmp": "^0.1.0",
"@types/webpack": "4.41.7", "@types/webpack": "4.41.7",
"@typescript-eslint/eslint-plugin": "2.24.0", "@typescript-eslint/eslint-plugin": "3.6.0",
"@typescript-eslint/parser": "2.24.0", "@typescript-eslint/parser": "3.6.0",
"axios": "0.19.2", "axios": "0.19.2",
"babel-jest": "24.8.0", "babel-jest": "24.8.0",
"babel-loader": "8.1.0", "babel-loader": "8.1.0",
@ -60,10 +59,11 @@
"concurrently": "4.1.0", "concurrently": "4.1.0",
"copy-webpack-plugin": "5.1.1", "copy-webpack-plugin": "5.1.1",
"css-loader": "^3.0.0", "css-loader": "^3.0.0",
"eslint": "6.8.0", "eslint": "7.4.0",
"eslint-config-prettier": "6.10.0", "eslint-config-prettier": "6.11.0",
"eslint-plugin-jsdoc": "22.1.0", "eslint-plugin-jsdoc": "28.6.1",
"eslint-plugin-prettier": "3.1.2", "eslint-plugin-prettier": "3.1.4",
"eslint-plugin-react-hooks": "4.0.5",
"execa": "^1.0.0", "execa": "^1.0.0",
"expect-puppeteer": "4.1.1", "expect-puppeteer": "4.1.1",
"file-loader": "^4.0.0", "file-loader": "^4.0.0",

View File

@ -1,6 +1,13 @@
{ {
"extends": ["@grafana/eslint-config"],
"rules": { "rules": {
"no-restricted-imports": [2, "^@grafana/runtime.*", "^@grafana/ui.*", "^@grafana/e2e.*"] "no-restricted-imports": ["error", { "patterns": ["@grafana/runtime", "@grafana/ui", "@grafana/e2e"] }]
} },
"overrides": [
{
"files": ["**/*.{test,story}.{ts,tsx}"],
"rules": {
"no-restricted-imports": "off"
}
}
]
} }

View File

@ -1,4 +1,4 @@
'use strict' 'use strict';
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
module.exports = require('./index.production.js'); module.exports = require('./index.production.js');

View File

@ -21,7 +21,6 @@
"bundle": "rollup -c rollup.config.ts", "bundle": "rollup -c rollup.config.ts",
"clean": "rimraf ./dist ./compiled", "clean": "rimraf ./dist ./compiled",
"docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log", "docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log",
"lint": "eslint .storybook/ src/ --ext=.js,.ts,.tsx",
"storybook": "start-storybook -p 9001 -c .storybook -s .storybook/static", "storybook": "start-storybook -p 9001 -c .storybook -s .storybook/static",
"storybook:build": "build-storybook -o ./dist/storybook -c .storybook -s .storybook/static", "storybook:build": "build-storybook -o ./dist/storybook -c .storybook -s .storybook/static",
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"

View File

@ -357,6 +357,7 @@ export default class Colors {
let bgColor: Color; let bgColor: Color;
function reset() { function reset() {
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
(color = new Color()), (color = new Color()),
(bgColor = new Color(true /* background */)), (bgColor = new Color(true /* background */)),
(brightness = undefined), (brightness = undefined),

View File

@ -1,6 +0,0 @@
{
"extends": ["@grafana/eslint-config"],
"rules": {
"no-restricted-imports": [2, "^@grafana/runtime.*", "^@grafana/ui.*"]
}
}

View File

@ -12,7 +12,6 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
/* eslint-disable import/first */
jest.mock('./scroll-page'); jest.mock('./scroll-page');
import { scrollBy, scrollTo } from './scroll-page'; import { scrollBy, scrollTo } from './scroll-page';
@ -179,8 +178,7 @@ describe('ScrollManager', () => {
it('scrolls to last visible row when boundary is hidden', () => { it('scrolls to last visible row when boundary is hidden', () => {
const parentOfLastRowWithHiddenChildrenIndex = trace.spans.length - 2; const parentOfLastRowWithHiddenChildrenIndex = trace.spans.length - 2;
accessors.getBottomRowIndexVisible.mockReturnValue(0); accessors.getBottomRowIndexVisible.mockReturnValue(0);
accessors.getCollapsedChildren = () => accessors.getCollapsedChildren = () => new Set([trace.spans[parentOfLastRowWithHiddenChildrenIndex].spanID]);
new Set([trace.spans[parentOfLastRowWithHiddenChildrenIndex].spanID]);
accessors.getSearchedSpanIDs = () => new Set([trace.spans[0].spanID]); accessors.getSearchedSpanIDs = () => new Set([trace.spans[0].spanID]);
trace.spans[trace.spans.length - 1].references = getRefs( trace.spans[trace.spans.length - 1].references = getRefs(
trace.spans[parentOfLastRowWithHiddenChildrenIndex].spanID trace.spans[parentOfLastRowWithHiddenChildrenIndex].spanID

View File

@ -27,8 +27,7 @@ import renderIntoCanvas, {
const getCanvasWidth = () => window.innerWidth * 2; const getCanvasWidth = () => window.innerWidth * 2;
const getBgFillRect = items => ({ const getBgFillRect = items => ({
fillStyle: BG_COLOR, fillStyle: BG_COLOR,
height: height: !items || items.length < MIN_TOTAL_HEIGHT ? MIN_TOTAL_HEIGHT : Math.min(MAX_TOTAL_HEIGHT, items.length),
!items || items.length < MIN_TOTAL_HEIGHT ? MIN_TOTAL_HEIGHT : Math.min(MAX_TOTAL_HEIGHT, items.length),
width: getCanvasWidth(), width: getCanvasWidth(),
x: 0, x: 0,
y: 0, y: 0,
@ -125,8 +124,7 @@ describe('renderIntoCanvas()', () => {
{ input: items[1].serviceName, output: [1, 1, 1] }, { input: items[1].serviceName, output: [1, 1, 1] },
{ input: items[2].serviceName, output: [2, 2, 2] }, { input: items[2].serviceName, output: [2, 2, 2] },
]; ];
const cHeight = const cHeight = items.length < MIN_TOTAL_HEIGHT ? MIN_TOTAL_HEIGHT : Math.min(items.length, MAX_TOTAL_HEIGHT);
items.length < MIN_TOTAL_HEIGHT ? MIN_TOTAL_HEIGHT : Math.min(items.length, MAX_TOTAL_HEIGHT);
const expectedDrawings = [ const expectedDrawings = [
getBgFillRect(), getBgFillRect(),

View File

@ -44,7 +44,6 @@ describe('<ListView>', () => {
} }
function Item(props) { function Item(props) {
// eslint-disable-next-line react/prop-types
const { children, ...rest } = props; const { children, ...rest } = props;
return <div {...rest}>{children}</div>; return <div {...rest}>{children}</div>;
} }

View File

@ -71,7 +71,6 @@ describe(ReferencesButton, () => {
// here // here
const menuInstance = shallow( const menuInstance = shallow(
shallow(dropdown.first().props().overlay).prop('children')({ shallow(dropdown.first().props().overlay).prop('children')({
// eslint-disable-next-line react/prop-types
Menu: ({ children }) => <div>{children}</div>, Menu: ({ children }) => <div>{children}</div>,
}) })
); );

View File

@ -49,7 +49,10 @@ describe('<SpanBar>', () => {
logs: [ logs: [
{ {
timestamp: 10, timestamp: 10,
fields: [{ key: 'message', value: 'oh the log message' }, { key: 'something', value: 'else' }], fields: [
{ key: 'message', value: 'oh the log message' },
{ key: 'something', value: 'else' },
],
}, },
{ {
timestamp: 10, timestamp: 10,
@ -60,7 +63,10 @@ describe('<SpanBar>', () => {
}, },
{ {
timestamp: 20, timestamp: 20,
fields: [{ key: 'message', value: 'oh the next log message' }, { key: 'more', value: 'stuff' }], fields: [
{ key: 'message', value: 'oh the next log message' },
{ key: 'more', value: 'stuff' },
],
}, },
], ],
}, },

View File

@ -106,7 +106,10 @@ describe('<SpanBarRow>', () => {
props.span props.span
); );
const spanRow = shallow(<SpanBarRow {...props} span={span} />).dive().dive().dive(); const spanRow = shallow(<SpanBarRow {...props} span={span} />)
.dive()
.dive()
.dive();
const refButton = spanRow.find(ReferencesButton); const refButton = spanRow.find(ReferencesButton);
expect(refButton.length).toEqual(1); expect(refButton.length).toEqual(1);
expect(refButton.at(0).props().tooltipText).toEqual('Contains multiple references'); expect(refButton.at(0).props().tooltipText).toEqual('Contains multiple references');
@ -128,7 +131,10 @@ describe('<SpanBarRow>', () => {
}, },
props.span props.span
); );
const spanRow = shallow(<SpanBarRow {...props} span={span} />).dive().dive().dive(); const spanRow = shallow(<SpanBarRow {...props} span={span} />)
.dive()
.dive()
.dive();
const refButton = spanRow.find(ReferencesButton); const refButton = spanRow.find(ReferencesButton);
expect(refButton.length).toEqual(1); expect(refButton.length).toEqual(1);
expect(refButton.at(0).props().tooltipText).toEqual('This span is referenced by another span'); expect(refButton.at(0).props().tooltipText).toEqual('This span is referenced by another span');
@ -158,7 +164,10 @@ describe('<SpanBarRow>', () => {
}, },
props.span props.span
); );
const spanRow = shallow(<SpanBarRow {...props} span={span} />).dive().dive().dive(); const spanRow = shallow(<SpanBarRow {...props} span={span} />)
.dive()
.dive()
.dive();
const refButton = spanRow.find(ReferencesButton); const refButton = spanRow.find(ReferencesButton);
expect(refButton.length).toEqual(1); expect(refButton.length).toEqual(1);
expect(refButton.at(0).props().tooltipText).toEqual('This span is referenced by multiple other spans'); expect(refButton.at(0).props().tooltipText).toEqual('This span is referenced by multiple other spans');

View File

@ -19,7 +19,10 @@ import AccordianKeyValues, { KeyValuesSummary } from './AccordianKeyValues';
import * as markers from './AccordianKeyValues.markers'; import * as markers from './AccordianKeyValues.markers';
import KeyValuesTable from './KeyValuesTable'; import KeyValuesTable from './KeyValuesTable';
const tags = [{ key: 'span.kind', value: 'client' }, { key: 'omg', value: 'mos-def' }]; const tags = [
{ key: 'span.kind', value: 'client' },
{ key: 'omg', value: 'mos-def' },
];
describe('<KeyValuesSummary>', () => { describe('<KeyValuesSummary>', () => {
let wrapper; let wrapper;

View File

@ -24,11 +24,17 @@ describe('<AccordianLogs>', () => {
const logs = [ const logs = [
{ {
timestamp: 10, timestamp: 10,
fields: [{ key: 'message', value: 'oh the log message' }, { key: 'something', value: 'else' }], fields: [
{ key: 'message', value: 'oh the log message' },
{ key: 'something', value: 'else' },
],
}, },
{ {
timestamp: 20, timestamp: 20,
fields: [{ key: 'message', value: 'oh the next log message' }, { key: 'more', value: 'stuff' }], fields: [
{ key: 'message', value: 'oh the next log message' },
{ key: 'more', value: 'stuff' },
],
}, },
]; ];
const props = { const props = {

View File

@ -112,7 +112,6 @@ describe('<KeyValuesTable>', () => {
const overlay = shallow(dropdown.prop('overlay')); const overlay = shallow(dropdown.prop('overlay'));
// We have some wrappers here that dynamically inject specific component so we need to traverse a bit // We have some wrappers here that dynamically inject specific component so we need to traverse a bit
// here // here
// eslint-disable-next-line react/prop-types
const menu = shallow(overlay.prop('children')({ Menu: ({ children }) => <div>{children}</div> })); const menu = shallow(overlay.prop('children')({ Menu: ({ children }) => <div>{children}</div> }));
const anchors = menu.find(LinkValue); const anchors = menu.find(LinkValue);
expect(anchors).toHaveLength(2); expect(anchors).toHaveLength(2);

View File

@ -19,7 +19,10 @@ import TextList from './TextList';
describe('<TextList>', () => { describe('<TextList>', () => {
let wrapper; let wrapper;
const data = [{ key: 'span.kind', value: 'client' }, { key: 'omg', value: 'mos-def' }]; const data = [
{ key: 'span.kind', value: 'client' },
{ key: 'omg', value: 'mos-def' },
];
beforeEach(() => { beforeEach(() => {
wrapper = shallow(<TextList data={data} />); wrapper = shallow(<TextList data={data} />);

View File

@ -12,7 +12,6 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
/* eslint-disable import/first */
jest.mock('../utils'); jest.mock('../utils');
import React from 'react'; import React from 'react';
@ -53,11 +52,17 @@ describe('<SpanDetail>', () => {
span.logs = [ span.logs = [
{ {
timestamp: 10, timestamp: 10,
fields: [{ key: 'message', value: 'oh the log message' }, { key: 'something', value: 'else' }], fields: [
{ key: 'message', value: 'oh the log message' },
{ key: 'something', value: 'else' },
],
}, },
{ {
timestamp: 20, timestamp: 20,
fields: [{ key: 'message', value: 'oh the next log message' }, { key: 'more', value: 'stuff' }], fields: [
{ key: 'message', value: 'oh the next log message' },
{ key: 'more', value: 'stuff' },
],
}, },
]; ];
@ -141,9 +146,7 @@ describe('<SpanDetail>', () => {
}); });
it('renders the process tags', () => { it('renders the process tags', () => {
const target = ( const target = <AccordianKeyValues data={span.process.tags} label="Process" isOpen={detailState.isProcessOpen} />;
<AccordianKeyValues data={span.process.tags} label="Process" isOpen={detailState.isProcessOpen} />
);
expect(wrapper.containsMatchingElement(target)).toBe(true); expect(wrapper.containsMatchingElement(target)).toBe(true);
wrapper.find({ data: span.process.tags }).simulate('toggle'); wrapper.find({ data: span.process.tags }).simulate('toggle');
expect(props.processToggle).toHaveBeenLastCalledWith(span.spanID); expect(props.processToggle).toHaveBeenLastCalledWith(span.spanID);

View File

@ -48,7 +48,10 @@ describe('<SpanDetailRow>', () => {
props.logsToggle.mockReset(); props.logsToggle.mockReset();
props.processToggle.mockReset(); props.processToggle.mockReset();
props.tagsToggle.mockReset(); props.tagsToggle.mockReset();
wrapper = shallow(<SpanDetailRow {...props} />).dive().dive().dive(); wrapper = shallow(<SpanDetailRow {...props} />)
.dive()
.dive()
.dive();
}); });
it('renders without exploding', () => { it('renders without exploding', () => {

View File

@ -19,7 +19,7 @@ import IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';
import SpanTreeOffset, { getStyles } from './SpanTreeOffset'; import SpanTreeOffset, { getStyles } from './SpanTreeOffset';
import spanAncestorIdsSpy from '../utils/span-ancestor-ids'; import spanAncestorIdsSpy from '../utils/span-ancestor-ids';
import {defaultTheme} from "../Theme"; import { defaultTheme } from '../Theme';
jest.mock('../utils/span-ancestor-ids'); jest.mock('../utils/span-ancestor-ids');
@ -43,13 +43,19 @@ describe('SpanTreeOffset', () => {
spanID: ownSpanID, spanID: ownSpanID,
}, },
}; };
wrapper = shallow(<SpanTreeOffset {...props} />).dive().dive().dive(); wrapper = shallow(<SpanTreeOffset {...props} />)
.dive()
.dive()
.dive();
}); });
describe('.SpanTreeOffset--indentGuide', () => { describe('.SpanTreeOffset--indentGuide', () => {
it('renders only one .SpanTreeOffset--indentGuide for entire trace if span has no ancestors', () => { it('renders only one .SpanTreeOffset--indentGuide for entire trace if span has no ancestors', () => {
spanAncestorIdsSpy.mockReturnValue([]); spanAncestorIdsSpy.mockReturnValue([]);
wrapper = shallow(<SpanTreeOffset {...props} />).dive().dive().dive(); wrapper = shallow(<SpanTreeOffset {...props} />)
.dive()
.dive()
.dive();
const indentGuides = wrapper.find('[data-test-id="SpanTreeOffset--indentGuide"]'); const indentGuides = wrapper.find('[data-test-id="SpanTreeOffset--indentGuide"]');
expect(indentGuides.length).toBe(1); expect(indentGuides.length).toBe(1);
expect(indentGuides.prop('data-ancestor-id')).toBe(specialRootID); expect(indentGuides.prop('data-ancestor-id')).toBe(specialRootID);
@ -65,7 +71,10 @@ describe('SpanTreeOffset', () => {
it('adds .is-active to correct indentGuide', () => { it('adds .is-active to correct indentGuide', () => {
props.hoverIndentGuideIds = new Set([parentSpanID]); props.hoverIndentGuideIds = new Set([parentSpanID]);
wrapper = shallow(<SpanTreeOffset {...props} />).dive().dive().dive(); wrapper = shallow(<SpanTreeOffset {...props} />)
.dive()
.dive()
.dive();
const styles = getStyles(defaultTheme); const styles = getStyles(defaultTheme);
const activeIndentGuide = wrapper.find(`.${styles.indentGuideActive}`); const activeIndentGuide = wrapper.find(`.${styles.indentGuideActive}`);
expect(activeIndentGuide.length).toBe(1); expect(activeIndentGuide.length).toBe(1);

View File

@ -86,12 +86,8 @@ describe('<TimelineColumnResizer>', () => {
it('does not render a dragging indicator when not dragging', () => { it('does not render a dragging indicator when not dragging', () => {
const styles = getStyles(); const styles = getStyles();
expect(wrapper.find('[data-test-id="TimelineColumnResizer--dragger"]').prop('style').right).toBe( expect(wrapper.find('[data-test-id="TimelineColumnResizer--dragger"]').prop('style').right).toBe(undefined);
undefined expect(wrapper.find('[data-test-id="TimelineColumnResizer--dragger"]').prop('className')).toBe(styles.dragger);
);
expect(wrapper.find('[data-test-id="TimelineColumnResizer--dragger"]').prop('className')).toBe(
styles.dragger
);
}); });
it('renders a dragging indicator when dragging', () => { it('renders a dragging indicator when dragging', () => {

View File

@ -159,12 +159,7 @@ describe('<TimelineViewingLayer>', () => {
.find('[data-test-id="Dragged"]') .find('[data-test-id="Dragged"]')
.prop('className') .prop('className')
.indexOf( .indexOf(
cx( cx(styles.dragged, styles.draggedDraggingLeft, styles.draggedDraggingRight, styles.draggedReframeDrag)
styles.dragged,
styles.draggedDraggingLeft,
styles.draggedDraggingRight,
styles.draggedReframeDrag
)
) >= 0 ) >= 0
).toBe(true); ).toBe(true);
}); });
@ -178,12 +173,7 @@ describe('<TimelineViewingLayer>', () => {
.find('[data-test-id="Dragged"]') .find('[data-test-id="Dragged"]')
.prop('className') .prop('className')
.indexOf( .indexOf(
cx( cx(styles.dragged, styles.draggedDraggingLeft, styles.draggedDraggingRight, styles.draggedShiftDrag)
styles.dragged,
styles.draggedDraggingLeft,
styles.draggedDraggingRight,
styles.draggedShiftDrag
)
) >= 0 ) >= 0
).toBe(true); ).toBe(true);
}); });

View File

@ -49,7 +49,10 @@ describe('<TraceTimelineViewer>', () => {
let wrapper; let wrapper;
beforeEach(() => { beforeEach(() => {
wrapper = shallow(<TraceTimelineViewer {...props} />).dive().dive().dive(); wrapper = shallow(<TraceTimelineViewer {...props} />)
.dive()
.dive()
.dive();
}); });
it('it does not explode', () => { it('it does not explode', () => {

View File

@ -85,8 +85,7 @@ describe('TraceTimelineViewer/utils', () => {
describe('spanContainsErredSpan()', () => { describe('spanContainsErredSpan()', () => {
it('returns true only when a descendant has an error tag', () => { it('returns true only when a descendant has an error tag', () => {
const errorTag = { key: 'error', type: 'bool', value: true }; const errorTag = { key: 'error', type: 'bool', value: true };
const getTags = withError => const getTags = withError => (withError ? traceGenerator.tags().concat(errorTag) : traceGenerator.tags());
withError ? traceGenerator.tags().concat(errorTag) : traceGenerator.tags();
// Using a string to generate the test spans. Each line results in a span. The // Using a string to generate the test spans. Each line results in a span. The
// left number indicates whether or not the generated span has a descendant // left number indicates whether or not the generated span has a descendant

View File

@ -16,12 +16,12 @@ import ease from 'tween-functions';
import { TNil } from './types'; import { TNil } from './types';
interface ITweenState { interface TweenState {
done: boolean; done: boolean;
value: number; value: number;
} }
type TTweenCallback = (state: ITweenState) => void; type TTweenCallback = (state: TweenState) => void;
type TTweenOptions = { type TTweenOptions = {
delay?: number; delay?: number;
@ -98,7 +98,7 @@ export default class Tween {
this.callbackUpdate = undefined; this.callbackUpdate = undefined;
} }
getCurrent(): ITweenState { getCurrent(): TweenState {
const t = Date.now() - this.startTime; const t = Date.now() - this.startTime;
if (t <= 0) { if (t <= 0) {
// still in the delay period // still in the delay period

View File

@ -17,7 +17,7 @@ import { shallow } from 'enzyme';
import debounceMock from 'lodash/debounce'; import debounceMock from 'lodash/debounce';
import UiFindInput from './UiFindInput'; import UiFindInput from './UiFindInput';
import {UIInput} from "../uiElementsContext"; import { UIInput } from '../uiElementsContext';
jest.mock('lodash/debounce'); jest.mock('lodash/debounce');
@ -58,8 +58,8 @@ describe('UiFindInput', () => {
}); });
it('renders props.uiFind when state.ownInputValue is `undefined`', () => { it('renders props.uiFind when state.ownInputValue is `undefined`', () => {
wrapper.setProps({value: uiFind}); wrapper.setProps({ value: uiFind });
expect(wrapper.find(UIInput).prop('value')).toBe(uiFind); expect(wrapper.find(UIInput).prop('value')).toBe(uiFind);
}); });
}) });
}); });

View File

@ -52,15 +52,14 @@ function getParentSpanId(span, levels) {
function attachReferences(spans, depth, spansPerLevel) { function attachReferences(spans, depth, spansPerLevel) {
let levels = [[getSpanId(spans[0])]]; let levels = [[getSpanId(spans[0])]];
const duplicateLevelFilter = currentLevels => span => const duplicateLevelFilter = currentLevels => span => !currentLevels.find(level => level.indexOf(span.spanID) >= 0);
!currentLevels.find(level => level.indexOf(span.spanID) >= 0);
while (levels.length < depth) { while (levels.length < depth) {
const remainingSpans = spans.filter(duplicateLevelFilter(levels)); const remainingSpans = spans.filter(duplicateLevelFilter(levels));
if (remainingSpans.length <= 0) break; if (remainingSpans.length <= 0) {
const newLevel = chance break;
.pickset(remainingSpans, spansPerLevel || chance.integer({ min: 4, max: 8 })) }
.map(getSpanId); const newLevel = chance.pickset(remainingSpans, spansPerLevel || chance.integer({ min: 4, max: 8 })).map(getSpanId);
levels.push(newLevel); levels.push(newLevel);
} }

View File

@ -37,12 +37,16 @@ export default class PathElem {
result.push(current); result.push(current);
current = current.externalSideNeighbor; current = current.externalSideNeighbor;
} }
if (this.distance < 0) result.reverse(); if (this.distance < 0) {
result.reverse();
}
return result; return result;
} }
get externalSideNeighbor(): PathElem | null | undefined { get externalSideNeighbor(): PathElem | null | undefined {
if (!this.distance) return null; if (!this.distance) {
return null;
}
return this.memberOf.members[this.memberIdx + Math.sign(this.distance)]; return this.memberOf.members[this.memberIdx + Math.sign(this.distance)];
} }
@ -53,12 +57,16 @@ export default class PathElem {
result.push(current); result.push(current);
current = current.focalSideNeighbor; current = current.focalSideNeighbor;
} }
if (this.distance > 0) result.reverse(); if (this.distance > 0) {
result.reverse();
}
return result; return result;
} }
get focalSideNeighbor(): PathElem | null { get focalSideNeighbor(): PathElem | null {
if (!this.distance) return null; if (!this.distance) {
return null;
}
return this.memberOf.members[this.memberIdx - Math.sign(this.distance)]; return this.memberOf.members[this.memberIdx - Math.sign(this.distance)];
} }

View File

@ -49,21 +49,9 @@ export const afterPayloadElem = simplePayloadElemMaker('after');
export const lastPayloadElem = simplePayloadElemMaker('last'); export const lastPayloadElem = simplePayloadElemMaker('last');
export const shortPath = [beforePayloadElem, focalPayloadElem]; export const shortPath = [beforePayloadElem, focalPayloadElem];
export const simplePath = [ export const simplePath = [firstPayloadElem, beforePayloadElem, focalPayloadElem, afterPayloadElem, lastPayloadElem];
firstPayloadElem,
beforePayloadElem,
focalPayloadElem,
afterPayloadElem,
lastPayloadElem,
];
export const longSimplePath = pathLengthener(simplePath); export const longSimplePath = pathLengthener(simplePath);
export const noFocalPath = [ export const noFocalPath = [firstPayloadElem, beforePayloadElem, midPayloadElem, afterPayloadElem, lastPayloadElem];
firstPayloadElem,
beforePayloadElem,
midPayloadElem,
afterPayloadElem,
lastPayloadElem,
];
export const doubleFocalPath = [ export const doubleFocalPath = [
firstPayloadElem, firstPayloadElem,
beforePayloadElem, beforePayloadElem,

View File

@ -151,7 +151,10 @@ describe('createTestFunction()', () => {
}); });
describe('getParameterInArray()', () => { describe('getParameterInArray()', () => {
const data = [{ key: 'mykey', value: 'ok' }, { key: 'otherkey', value: 'v' }]; const data = [
{ key: 'mykey', value: 'ok' },
{ key: 'otherkey', value: 'v' },
];
it('returns an entry that is present', () => { it('returns an entry that is present', () => {
expect(getParameterInArray('mykey', data)).toBe(data[0]); expect(getParameterInArray('mykey', data)).toBe(data[0]);
@ -224,12 +227,19 @@ describe('getParameterInAncestor()', () => {
{ key: 'd', value: 'd3' }, { key: 'd', value: 'd3' },
], ],
}, },
tags: [{ key: 'a', value: 'a2' }, { key: 'b', value: 'b2' }, { key: 'c', value: 'c2' }], tags: [
{ key: 'a', value: 'a2' },
{ key: 'b', value: 'b2' },
{ key: 'c', value: 'c2' },
],
}, },
{ {
depth: 2, depth: 2,
process: { process: {
tags: [{ key: 'a', value: 'a1' }, { key: 'b', value: 'b1' }], tags: [
{ key: 'a', value: 'a1' },
{ key: 'b', value: 'b1' },
],
}, },
tags: [{ key: 'a', value: 'a0' }], tags: [{ key: 'a', value: 'a0' }],
}, },

View File

@ -12,7 +12,6 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
/* eslint-disable import/first */
jest.mock('./Tween'); jest.mock('./Tween');
import { scrollBy, scrollTo, cancel } from './scroll-page'; import { scrollBy, scrollTo, cancel } from './scroll-page';

View File

@ -28,7 +28,7 @@ function _onTweenUpdate({ done, value }: { done: boolean; value: number }) {
} }
} }
export function scrollBy(yDelta: number, appendToLast: boolean = false) { export function scrollBy(yDelta: number, appendToLast = false) {
const { scrollY } = window; const { scrollY } = window;
let targetFrom = scrollY; let targetFrom = scrollY;
if (appendToLast && lastTween) { if (appendToLast && lastTween) {

View File

@ -24,10 +24,7 @@ export const getSpanTimestamp = span => span.startTime;
export const getSpanProcessId = span => span.processID; export const getSpanProcessId = span => span.processID;
export const getSpanReferences = span => span.references || []; export const getSpanReferences = span => span.references || [];
export const getSpanReferenceByType = createSelector( export const getSpanReferenceByType = createSelector(
createSelector( createSelector(({ span }) => span, getSpanReferences),
({ span }) => span,
getSpanReferences
),
({ type }) => type, ({ type }) => type,
(references, type) => references.find(ref => ref.refType === type) (references, type) => references.find(ref => ref.refType === type)
); );
@ -49,10 +46,7 @@ export const getSpanProcess = span => {
return span.process; return span.process;
}; };
export const getSpanServiceName = createSelector( export const getSpanServiceName = createSelector(getSpanProcess, getProcessServiceName);
getSpanProcess,
getProcessServiceName
);
export const filterSpansForTimestamps = createSelector( export const filterSpansForTimestamps = createSelector(
({ spans }) => spans, ({ spans }) => spans,
@ -73,16 +67,14 @@ export const filterSpansForText = createSelector(
.map(({ original }) => original) .map(({ original }) => original)
); );
const getTextFilterdSpansAsMap = createSelector( const getTextFilterdSpansAsMap = createSelector(filterSpansForText, matchingSpans =>
filterSpansForText, matchingSpans.reduce(
matchingSpans => (obj, span) => ({
matchingSpans.reduce( ...obj,
(obj, span) => ({ [getSpanId(span)]: span,
...obj, }),
[getSpanId(span)]: span, {}
}), )
{}
)
); );
export const highlightSpansForTextFilter = createSelector( export const highlightSpansForTextFilter = createSelector(

View File

@ -42,9 +42,7 @@ it('getSpanTimestamp() should return the timestamp of the span', () => {
}); });
it('getSpanReferences() should return the span reference array', () => { it('getSpanReferences() should return the span reference array', () => {
expect(spanSelectors.getSpanReferences(generatedTrace.spans[0])).toEqual( expect(spanSelectors.getSpanReferences(generatedTrace.spans[0])).toEqual(generatedTrace.spans[0].references);
generatedTrace.spans[0].references
);
}); });
it('getSpanReferences() should return empty array for null references', () => { it('getSpanReferences() should return empty array for null references', () => {

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
// See https://github.com/jaegertracing/jaeger-ui/issues/115 for details. // See https://github.com/jaegertracing/jaeger-ui/issues/115 for details.
// eslint-disable-next-line import/prefer-default-export
export const followsFromRef = { export const followsFromRef = {
processes: { processes: {
p1: { p1: {

View File

@ -42,9 +42,8 @@ const getSpanWithProcess = createSelector(
}) })
); );
export const getTraceSpansAsMap = createSelector( export const getTraceSpansAsMap = createSelector(getTraceSpans, spans =>
getTraceSpans, spans.reduce((map, span) => map.set(getSpanId(span), span), new Map())
spans => spans.reduce((map, span) => map.set(getSpanId(span), span), new Map())
); );
export const TREE_ROOT_ID = '__root__'; export const TREE_ROOT_ID = '__root__';
@ -107,32 +106,23 @@ export const hydrateSpansWithProcesses = trace => {
}; };
}; };
export const getTraceSpanCount = createSelector( export const getTraceSpanCount = createSelector(getTraceSpans, spans => spans.length);
getTraceSpans,
spans => spans.length export const getTraceTimestamp = createSelector(getTraceSpans, spans =>
spans.reduce(
(prevTimestamp, span) => (prevTimestamp ? Math.min(prevTimestamp, getSpanTimestamp(span)) : getSpanTimestamp(span)),
null
)
); );
export const getTraceTimestamp = createSelector( export const getTraceDuration = createSelector(getTraceSpans, getTraceTimestamp, (spans, timestamp) =>
getTraceSpans, spans.reduce(
spans => (prevDuration, span) =>
spans.reduce( prevDuration
(prevTimestamp, span) => ? Math.max(getSpanTimestamp(span) - timestamp + getSpanDuration(span), prevDuration)
prevTimestamp ? Math.min(prevTimestamp, getSpanTimestamp(span)) : getSpanTimestamp(span), : getSpanDuration(span),
null null
) )
);
export const getTraceDuration = createSelector(
getTraceSpans,
getTraceTimestamp,
(spans, timestamp) =>
spans.reduce(
(prevDuration, span) =>
prevDuration
? Math.max(getSpanTimestamp(span) - timestamp + getSpanDuration(span), prevDuration)
: getSpanDuration(span),
null
)
); );
export const getTraceEndTimestamp = createSelector( export const getTraceEndTimestamp = createSelector(
@ -150,36 +140,22 @@ export const getParentSpan = createSelector(
.sort((spanA, spanB) => numberSortComparator(getSpanTimestamp(spanA), getSpanTimestamp(spanB)))[0] .sort((spanA, spanB) => numberSortComparator(getSpanTimestamp(spanA), getSpanTimestamp(spanB)))[0]
); );
export const getTraceDepth = createSelector( export const getTraceDepth = createSelector(getTraceSpanIdsAsTree, spanTree => spanTree.depth - 1);
getTraceSpanIdsAsTree,
spanTree => spanTree.depth - 1
);
export const getSpanDepthForTrace = createSelector( export const getSpanDepthForTrace = createSelector(
createSelector( createSelector(state => state.trace, getTraceSpanIdsAsTree),
state => state.trace, createSelector(state => state.span, getSpanId),
getTraceSpanIdsAsTree
),
createSelector(
state => state.span,
getSpanId
),
(node, spanID) => node.getPath(spanID).length - 1 (node, spanID) => node.getPath(spanID).length - 1
); );
export const getTraceServices = createSelector( export const getTraceServices = createSelector(getTraceProcesses, processes =>
getTraceProcesses, Object.keys(processes).reduce(
processes => (services, processID) => services.add(getProcessServiceName(processes[processID])),
Object.keys(processes).reduce( new Set()
(services, processID) => services.add(getProcessServiceName(processes[processID])), )
new Set()
)
); );
export const getTraceServiceCount = createSelector( export const getTraceServiceCount = createSelector(getTraceServices, services => services.size);
getTraceServices,
services => services.size
);
// establish constants to determine how math should be handled // establish constants to determine how math should be handled
// for nanosecond-to-millisecond conversions. // for nanosecond-to-millisecond conversions.
@ -188,9 +164,8 @@ export const DURATION_FORMATTERS = {
s: formatSecondTime, s: formatSecondTime,
}; };
const getDurationFormatterForTrace = createSelector( const getDurationFormatterForTrace = createSelector(getTraceDuration, totalDuration =>
getTraceDuration, totalDuration >= ONE_SECOND ? DURATION_FORMATTERS.s : DURATION_FORMATTERS.ms
totalDuration => (totalDuration >= ONE_SECOND ? DURATION_FORMATTERS.s : DURATION_FORMATTERS.ms)
); );
export const formatDurationForUnit = createSelector( export const formatDurationForUnit = createSelector(
@ -201,10 +176,7 @@ export const formatDurationForUnit = createSelector(
export const formatDurationForTrace = createSelector( export const formatDurationForTrace = createSelector(
({ duration }) => duration, ({ duration }) => duration,
createSelector( createSelector(({ trace }) => trace, getDurationFormatterForTrace),
({ trace }) => trace,
getDurationFormatterForTrace
),
(duration, formatter) => formatter(duration) (duration, formatter) => formatter(duration)
); );
@ -216,25 +188,16 @@ export const getSortedSpans = createSelector(
[...spans].sort((spanA, spanB) => dir * comparator(selector(spanA, trace), selector(spanB, trace))) [...spans].sort((spanA, spanB) => dir * comparator(selector(spanA, trace), selector(spanB, trace)))
); );
const getTraceSpansByHierarchyPosition = createSelector( const getTraceSpansByHierarchyPosition = createSelector(getTraceSpanIdsAsTree, tree => {
getTraceSpanIdsAsTree, const hierarchyPositionMap = new Map();
tree => { let i = 0;
const hierarchyPositionMap = new Map(); tree.walk(spanID => hierarchyPositionMap.set(spanID, i++));
let i = 0; return hierarchyPositionMap;
tree.walk(spanID => hierarchyPositionMap.set(spanID, i++)); });
return hierarchyPositionMap;
}
);
export const getTreeSizeForTraceSpan = createSelector( export const getTreeSizeForTraceSpan = createSelector(
createSelector( createSelector(state => state.trace, getTraceSpanIdsAsTree),
state => state.trace, createSelector(state => state.span, getSpanId),
getTraceSpanIdsAsTree
),
createSelector(
state => state.span,
getSpanId
),
(tree, spanID) => { (tree, spanID) => {
const node = tree.find(spanID); const node = tree.find(spanID);
if (!node) { if (!node) {
@ -245,20 +208,14 @@ export const getTreeSizeForTraceSpan = createSelector(
); );
export const getSpanHierarchySortPositionForTrace = createSelector( export const getSpanHierarchySortPositionForTrace = createSelector(
createSelector( createSelector(({ trace }) => trace, getTraceSpansByHierarchyPosition),
({ trace }) => trace,
getTraceSpansByHierarchyPosition
),
({ span }) => span, ({ span }) => span,
(hierarchyPositionMap, span) => hierarchyPositionMap.get(getSpanId(span)) (hierarchyPositionMap, span) => hierarchyPositionMap.get(getSpanId(span))
); );
export const getTraceName = createSelector( export const getTraceName = createSelector(
createSelector( createSelector(
createSelector( createSelector(hydrateSpansWithProcesses, getParentSpan),
hydrateSpansWithProcesses,
getParentSpan
),
createStructuredSelector({ createStructuredSelector({
name: getSpanName, name: getSpanName,
serviceName: getSpanServiceName, serviceName: getSpanServiceName,
@ -269,10 +226,7 @@ export const getTraceName = createSelector(
export const omitCollapsedSpans = createSelector( export const omitCollapsedSpans = createSelector(
({ spans }) => spans, ({ spans }) => spans,
createSelector( createSelector(({ trace }) => trace, getTraceSpanIdsAsTree),
({ trace }) => trace,
getTraceSpanIdsAsTree
),
({ collapsed }) => collapsed, ({ collapsed }) => collapsed,
(spans, tree, collapse) => { (spans, tree, collapse) => {
const hiddenSpanIds = collapse.reduce((result, collapsedSpanId) => { const hiddenSpanIds = collapse.reduce((result, collapsedSpanId) => {
@ -313,9 +267,7 @@ export const enforceUniqueSpanIds = createSelector(
return { return {
...trace, ...trace,
spans: spans.reduce((result, span) => { spans: spans.reduce((result, span) => {
const spanID = map.has(getSpanId(span)) const spanID = map.has(getSpanId(span)) ? `${getSpanId(span)}_${map.get(getSpanId(span))}` : getSpanId(span);
? `${getSpanId(span)}_${map.get(getSpanId(span))}`
: getSpanId(span);
const updatedSpan = { ...span, spanID }; const updatedSpan = { ...span, spanID };
if (spanID !== getSpanId(span)) { if (spanID !== getSpanId(span)) {

View File

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
export type ApiError = // eslint-disable-line import/prefer-default-export export type ApiError =
| string | string
| { | {
message: string; message: string;

View File

@ -41,15 +41,15 @@ export type Config = {
archiveEnabled?: boolean; archiveEnabled?: boolean;
deepDependencies?: { menuEnabled?: boolean }; deepDependencies?: { menuEnabled?: boolean };
dependencies?: { dagMaxServicesLen?: number; menuEnabled?: boolean }; dependencies?: { dagMaxServicesLen?: number; menuEnabled?: boolean };
menu: (ConfigMenuGroup | ConfigMenuItem)[]; menu: Array<ConfigMenuGroup | ConfigMenuItem>;
search?: { maxLookback: { label: string; value: string }; maxLimit: number }; search?: { maxLookback: { label: string; value: string }; maxLimit: number };
scripts?: TScript[]; scripts?: TScript[];
topTagPrefixes?: string[]; topTagPrefixes?: string[];
tracking?: { tracking?: {
cookieToDimension?: { cookieToDimension?: Array<{
cookie: string; cookie: string;
dimension: string; dimension: string;
}[]; }>;
gaID: string | TNil; gaID: string | TNil;
trackErrors: boolean | TNil; trackErrors: boolean | TNil;
}; };

View File

@ -22,4 +22,4 @@ type EmbeddedStateV0 = {
}; };
}; };
export type EmbeddedState = EmbeddedStateV0; // eslint-disable-line import/prefer-default-export export type EmbeddedState = EmbeddedStateV0;

View File

@ -42,7 +42,7 @@ export type TraceSummary = {
traceID: string; traceID: string;
numberOfErredSpans: number; numberOfErredSpans: number;
numberOfSpans: number; numberOfSpans: number;
services: { name: string; numberOfSpans: number }[]; services: Array<{ name: string; numberOfSpans: number }>;
}; };
export type TraceSummaries = { export type TraceSummaries = {

View File

@ -174,9 +174,7 @@ describe('DraggableManager', () => {
const { type, handler, callback, updateType } = testCase; const { type, handler, callback, updateType } = testCase;
const event = { ...baseMouseEvt, type }; const event = { ...baseMouseEvt, type };
handler(event); handler(event);
expect(callback.mock.calls).toEqual([ expect(callback.mock.calls).toEqual([[{ event, tag, value, x, manager: instance, type: updateType }]]);
[{ event, tag, value, x, manager: instance, type: updateType }],
]);
}); });
}); });
}); });
@ -294,9 +292,7 @@ describe('DraggableManager', () => {
const { type, handler, callback, updateType } = testCase; const { type, handler, callback, updateType } = testCase;
const event = { ...baseMouseEvt, type }; const event = { ...baseMouseEvt, type };
handler(event); handler(event);
expect(callback.mock.calls).toEqual([ expect(callback.mock.calls).toEqual([[{ event, tag, value, x, manager: instance, type: updateType }]]);
[{ event, tag, value, x, manager: instance, type: updateType }],
]);
}); });
}); });
}); });

View File

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import moment from 'moment'; import moment from 'moment-timezone';
import _round from 'lodash/round'; import _round from 'lodash/round';
import { toFloatPrecision } from './number'; import { toFloatPrecision } from './number';

View File

@ -84,9 +84,7 @@ it('createSortClickHandler() should return a function', () => {
const currentSortDir = 1; const currentSortDir = 1;
const updateSort = sinon.spy(); const updateSort = sinon.spy();
expect(typeof sortUtils.createSortClickHandler(column, currentSortKey, currentSortDir, updateSort)).toBe( expect(typeof sortUtils.createSortClickHandler(column, currentSortKey, currentSortDir, updateSort)).toBe('function');
'function'
);
}); });
it('createSortClickHandler() should call updateSort with the new sort vals', () => { it('createSortClickHandler() should call updateSort with the new sort vals', () => {

View File

@ -1,15 +0,0 @@
// Copyright (c) 2019 Uber Technologies, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/// <reference path="custom.d.ts" />

View File

@ -13,8 +13,6 @@ import { VariableRefresh } from '../types';
import { updateVariableOptions } from '../query/reducer'; import { updateVariableOptions } from '../query/reducer';
import { customBuilder, queryBuilder } from '../shared/testing/builders'; import { customBuilder, queryBuilder } from '../shared/testing/builders';
'../shared/testing/builders';
jest.mock('app/features/dashboard/services/TimeSrv', () => ({ jest.mock('app/features/dashboard/services/TimeSrv', () => ({
getTimeSrv: jest.fn().mockReturnValue({ getTimeSrv: jest.fn().mockReturnValue({
timeRange: jest.fn().mockReturnValue({ timeRange: jest.fn().mockReturnValue({

View File

@ -120,7 +120,7 @@ export const formatCloudMonitoringError = (error: any) => {
try { try {
message = JSON.parse(error.data.message).error.message; message = JSON.parse(error.data.message).error.message;
} catch (err) { } catch (err) {
error.error; error.error = err;
} }
} }
return message; return message;

View File

@ -1,4 +1,5 @@
// Generated from ScrollQLParser.g4 by ANTLR 4.8 // Generated from ScrollQLParser.g4 by ANTLR 4.8
/* eslint-disable */
// jshint ignore: start // jshint ignore: start
// @ts-nocheck // @ts-nocheck
var antlr4 = require('antlr4/index'); var antlr4 = require('antlr4/index');

View File

@ -24,6 +24,6 @@ export interface SetupStep {
subheading: string; subheading: string;
title: string; title: string;
info: string; info: string;
cards: (Card | TutorialCardType)[]; cards: Array<Card | TutorialCardType>;
done: boolean; done: boolean;
} }

View File

@ -20,11 +20,12 @@ var window, document, ARGS, $, jQuery, moment, kbn;
var dashboard; var dashboard;
// All url parameters are available via the ARGS object // All url parameters are available via the ARGS object
// eslint-disable-next-line no-redeclare
var ARGS; var ARGS;
// Initialize a skeleton with nothing but a rows array and service object // Initialize a skeleton with nothing but a rows array and service object
dashboard = { dashboard = {
rows : [], rows: [],
}; };
// Set a title // Set a title
@ -34,23 +35,22 @@ dashboard.title = 'Scripted dash';
// time can be overridden in the url using from/to parameters, but this is // time can be overridden in the url using from/to parameters, but this is
// handled automatically in grafana core during dashboard initialization // handled automatically in grafana core during dashboard initialization
dashboard.time = { dashboard.time = {
from: "now-6h", from: 'now-6h',
to: "now" to: 'now',
}; };
var rows = 1; var rows = 1;
var seriesName = 'argName'; var seriesName = 'argName';
if(!_.isUndefined(ARGS.rows)) { if (!_.isUndefined(ARGS.rows)) {
rows = parseInt(ARGS.rows, 10); rows = parseInt(ARGS.rows, 10);
} }
if(!_.isUndefined(ARGS.name)) { if (!_.isUndefined(ARGS.name)) {
seriesName = ARGS.name; seriesName = ARGS.name;
} }
for (var i = 0; i < rows; i++) { for (var i = 0; i < rows; i++) {
dashboard.rows.push({ dashboard.rows.push({
title: 'Chart', title: 'Chart',
height: '300px', height: '300px',
@ -63,27 +63,26 @@ for (var i = 0; i < rows; i++) {
linewidth: 2, linewidth: 2,
targets: [ targets: [
{ {
'target': "randomWalk('" + seriesName + "')" target: "randomWalk('" + seriesName + "')",
}, },
{ {
'target': "randomWalk('random walk2')" target: "randomWalk('random walk2')",
} },
], ],
seriesOverrides: [ seriesOverrides: [
{ {
alias: '/random/', alias: '/random/',
yaxis: 2, yaxis: 2,
fill: 0, fill: 0,
linewidth: 5 linewidth: 5,
} },
], ],
tooltip: { tooltip: {
shared: true shared: true,
} },
} },
] ],
}); });
} }
return dashboard; return dashboard;

View File

@ -20,14 +20,13 @@
var window, document, ARGS, $, jQuery, moment, kbn; var window, document, ARGS, $, jQuery, moment, kbn;
return function(callback) { return function(callback) {
// Setup some variables // Setup some variables
var dashboard; var dashboard;
// Initialize a skeleton with nothing but a rows array and service object // Initialize a skeleton with nothing but a rows array and service object
dashboard = { dashboard = {
rows : [], rows: [],
services : {} services: {},
}; };
// Set a title // Set a title
@ -37,27 +36,25 @@ return function(callback) {
// time can be overridden in the url using from/to parameters, but this is // time can be overridden in the url using from/to parameters, but this is
// handled automatically in grafana core during dashboard initialization // handled automatically in grafana core during dashboard initialization
dashboard.time = { dashboard.time = {
from: "now-6h", from: 'now-6h',
to: "now" to: 'now',
}; };
var rows = 1; var rows = 1;
var seriesName = 'argName'; var seriesName = 'argName';
if(!_.isUndefined(ARGS.rows)) { if (!_.isUndefined(ARGS.rows)) {
rows = parseInt(ARGS.rows, 10); rows = parseInt(ARGS.rows, 10);
} }
if(!_.isUndefined(ARGS.name)) { if (!_.isUndefined(ARGS.name)) {
seriesName = ARGS.name; seriesName = ARGS.name;
} }
$.ajax({ $.ajax({
method: 'GET', method: 'GET',
url: '/' url: '/',
}) }).done(function(result) {
.done(function(result) {
dashboard.rows.push({ dashboard.rows.push({
title: 'Chart', title: 'Chart',
height: '300px', height: '300px',
@ -67,14 +64,13 @@ return function(callback) {
type: 'text', type: 'text',
span: 12, span: 12,
fill: 1, fill: 1,
content: '# Async test' content: '# Async test',
} },
] ],
}); });
// when dashboard is composed call the callback // when dashboard is composed call the callback
// function and pass the dashboard // function and pass the dashboard
callback(dashboard); callback(dashboard);
}); });
} };

View File

@ -20,15 +20,15 @@ var window, document, ARGS, $, jQuery, moment, kbn;
var dashboard; var dashboard;
// All url parameters are available via the ARGS object // All url parameters are available via the ARGS object
// eslint-disable-next-line no-redeclare
var ARGS; var ARGS;
// Initialize a skeleton with nothing but a rows array and service object // Initialize a skeleton with nothing but a rows array and service object
dashboard = { dashboard = {
rows : [], rows: [],
schemaVersion: 13, schemaVersion: 13,
}; };
// Set a title // Set a title
dashboard.title = 'Scripted and templated dash'; dashboard.title = 'Scripted and templated dash';
@ -36,8 +36,8 @@ dashboard.title = 'Scripted and templated dash';
// time can be overridden in the url using from/to parameters, but this is // time can be overridden in the url using from/to parameters, but this is
// handled automatically in grafana core during dashboard initialization // handled automatically in grafana core during dashboard initialization
dashboard.time = { dashboard.time = {
from: "now-6h", from: 'now-6h',
to: "now" to: 'now',
}; };
dashboard.templating = { dashboard.templating = {
@ -57,23 +57,22 @@ dashboard.templating = {
type: 'query', type: 'query',
datasource: null, datasource: null,
hide: 2, hide: 2,
} },
] ],
}; };
var rows = 1; var rows = 1;
var seriesName = 'argName'; var seriesName = 'argName';
if(!_.isUndefined(ARGS.rows)) { if (!_.isUndefined(ARGS.rows)) {
rows = parseInt(ARGS.rows, 10); rows = parseInt(ARGS.rows, 10);
} }
if(!_.isUndefined(ARGS.name)) { if (!_.isUndefined(ARGS.name)) {
seriesName = ARGS.name; seriesName = ARGS.name;
} }
for (var i = 0; i < rows; i++) { for (var i = 0; i < rows; i++) {
dashboard.rows.push({ dashboard.rows.push({
title: 'Chart', title: 'Chart',
height: '300px', height: '300px',
@ -86,16 +85,15 @@ for (var i = 0; i < rows; i++) {
linewidth: 2, linewidth: 2,
targets: [ targets: [
{ {
'target': "randomWalk('" + seriesName + "')" target: "randomWalk('" + seriesName + "')",
}, },
{ {
'target': "randomWalk('[[test2]]')" target: "randomWalk('[[test2]]')",
} },
], ],
} },
] ],
}); });
} }
return dashboard; return dashboard;

View File

@ -1,12 +1,6 @@
module.exports = function(grunt) { module.exports = function(grunt) {
"use strict"; 'use strict';
// Concat and Minify the src directory into dist // Concat and Minify the src directory into dist
grunt.registerTask('build', [ grunt.registerTask('build', ['clean:release', 'clean:build', 'exec:webpack']);
'clean:release',
'clean:build',
'exec:webpack',
]);
}; };

View File

@ -19,8 +19,7 @@ module.exports = function(grunt) {
// prettier-ignore // prettier-ignore
grunt.registerTask('eslint', [ grunt.registerTask('eslint', [
'newer:exec:eslintPackages', 'newer:exec:eslint'
'newer:exec:eslintRoot'
]); ]);
// prettier-ignore // prettier-ignore

View File

@ -5,7 +5,6 @@ module.exports = function(config) {
release: ['<%= destDir %>', '<%= tempDir %>', '<%= genDir %>'], release: ['<%= destDir %>', '<%= tempDir %>', '<%= genDir %>'],
build: ['<%= srcDir %>/build'], build: ['<%= srcDir %>/build'],
temp: ['<%= tempDir %>'], temp: ['<%= tempDir %>'],
packaging: [ packaging: [],
],
}; };
}; };

View File

@ -4,9 +4,10 @@ module.exports = function(config) {
var task = { var task = {
release: { release: {
options: { options: {
archive: '<%= destDir %>/<%= pkg.name %><%= enterprise ? "-enterprise" : "" %>-<%= pkg.version %>.<%= platform %>-<%= arch %><%= libc ? "-" + libc : "" %>.tar.gz' archive:
'<%= destDir %>/<%= pkg.name %><%= enterprise ? "-enterprise" : "" %>-<%= pkg.version %>.<%= platform %>-<%= arch %><%= libc ? "-" + libc : "" %>.tar.gz',
}, },
files : [ files: [
{ {
expand: true, expand: true,
cwd: '<%= tempDir %>', cwd: '<%= tempDir %>',
@ -17,13 +18,14 @@ module.exports = function(config) {
expand: true, expand: true,
src: ['LICENSE', 'README.md', 'NOTICE.md'], src: ['LICENSE', 'README.md', 'NOTICE.md'],
dest: '<%= pkg.name %>-<%= pkg.version %>/', dest: '<%= pkg.name %>-<%= pkg.version %>/',
} },
] ],
} },
}; };
if (config.platform === 'windows') { if (config.platform === 'windows') {
task.release.options.archive = '<%= destDir %>/<%= pkg.name %><%= enterprise ? "-enterprise" : "" %>-<%= pkg.version %>.<%= platform %>-<%= arch %>.zip'; task.release.options.archive =
'<%= destDir %>/<%= pkg.name %><%= enterprise ? "-enterprise" : "" %>-<%= pkg.version %>.<%= platform %>-<%= arch %>.zip';
} }
return task; return task;

View File

@ -2,10 +2,7 @@ module.exports = function(config, grunt) {
'use strict'; 'use strict';
return { return {
eslintPackages: { eslint: {
command: 'yarn packages:lint',
},
eslintRoot: {
command: 'yarn lint', command: 'yarn lint',
}, },
typecheckPackages: { typecheckPackages: {

View File

@ -4,10 +4,6 @@ module.exports = function(config) {
options: { options: {
configFile: 'public/sass/.sass-lint.yml', configFile: 'public/sass/.sass-lint.yml',
}, },
src: [ src: ['public/sass/**/*.scss', 'packages/**/*.scss', '!**/node_modules/**/*.scss'],
'public/sass/**/*.scss',
'packages/**/*.scss',
'!**/node_modules/**/*.scss'
],
}; };
}; };

View File

@ -8,6 +8,6 @@ module.exports = function() {
stats: false, stats: false,
}, },
dev: dev, dev: dev,
prod: prod prod: prod,
}; };
}; };

View File

@ -1,21 +1,13 @@
var path = require('path'); var path = require('path');
module.exports = function(grunt) { module.exports = function(grunt) {
"use strict"; 'use strict';
// build then zip // build then zip
grunt.registerTask('release', [ grunt.registerTask('release', ['build', 'build-post-process', 'compress:release']);
'build',
'build-post-process',
'compress:release'
]);
// package into archives // package into archives
grunt.registerTask('package', [ grunt.registerTask('package', ['clean:temp', 'build-post-process', 'compress:release']);
'clean:temp',
'build-post-process',
'compress:release'
]);
grunt.registerTask('build-post-process', function() { grunt.registerTask('build-post-process', function() {
grunt.config('copy.public_to_temp', { grunt.config('copy.public_to_temp', {
@ -28,14 +20,14 @@ module.exports = function(grunt) {
cwd: 'bin/<%= platform %>-<%= arch %><%= libc ? "-" + libc : "" %>', cwd: 'bin/<%= platform %>-<%= arch %><%= libc ? "-" + libc : "" %>',
expand: true, expand: true,
src: ['*'], src: ['*'],
options: { mode: true}, options: { mode: true },
dest: '<%= tempDir %>/bin/' dest: '<%= tempDir %>/bin/',
}); });
grunt.config('copy.backend_files', { grunt.config('copy.backend_files', {
expand: true, expand: true,
src: ['conf/**', 'tools/**', 'scripts/*'], src: ['conf/**', 'tools/**', 'scripts/*'],
options: { mode: true}, options: { mode: true },
dest: '<%= tempDir %>' dest: '<%= tempDir %>',
}); });
grunt.task.run('copy:public_to_temp'); grunt.task.run('copy:public_to_temp');

View File

@ -1,8 +1,8 @@
module.exports = function(grunt) { module.exports = function(grunt) {
"use strict"; 'use strict';
function escapeRegExp(str) { function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
} }
function extractColour(line) { function extractColour(line) {
@ -12,8 +12,8 @@ module.exports = function(grunt) {
} }
function extractVariable(line) { function extractVariable(line) {
var matches = line.match(/(\$[0-9a-zA-Z_-]+)\s*(!default|!default;)?/) var matches = line.match(/(\$[0-9a-zA-Z_-]+)\s*(!default|!default;)?/);
return matches ? matches[1] : matches return matches ? matches[1] : matches;
} }
function readVars(file, obj) { function readVars(file, obj) {
@ -33,7 +33,8 @@ module.exports = function(grunt) {
grunt.registerTask('styleguide', function() { grunt.registerTask('styleguide', function() {
var data = { var data = {
dark: {}, light: {} dark: {},
light: {},
}; };
readVars('public/sass/_variables.dark.scss', data.dark); readVars('public/sass/_variables.dark.scss', data.dark);
@ -41,7 +42,5 @@ module.exports = function(grunt) {
var styleGuideJson = grunt.config().srcDir + '/build/styleguide.json'; var styleGuideJson = grunt.config().srcDir + '/build/styleguide.json';
grunt.file.write(styleGuideJson, JSON.stringify(data, null, 4)); grunt.file.write(styleGuideJson, JSON.stringify(data, null, 4));
}); });
}; };

View File

@ -2,5 +2,7 @@ const loaderUtils = require('loader-utils');
module.exports = function blobUrl(source) { module.exports = function blobUrl(source) {
const { type } = loaderUtils.getOptions(this) || {}; const { type } = loaderUtils.getOptions(this) || {};
return `module.exports = URL.createObjectURL(new Blob([${JSON.stringify(source)}]${type ? `, { type: ${JSON.stringify(type)} }` : ''}));`; return `module.exports = URL.createObjectURL(new Blob([${JSON.stringify(source)}]${
type ? `, { type: ${JSON.stringify(type)} }` : ''
}));`;
}; };

View File

@ -40,7 +40,7 @@ module.exports.pitch = function pitch(remainingRequest) {
// https://github.com/webpack/webpack/blob/master/lib/WebpackOptionsApply.js // https://github.com/webpack/webpack/blob/master/lib/WebpackOptionsApply.js
new WebWorkerTemplatePlugin(outputOptions), new WebWorkerTemplatePlugin(outputOptions),
new LoaderTargetPlugin('webworker'), new LoaderTargetPlugin('webworker'),
...((this.target === 'web') || (this.target === 'webworker') ? [] : [new NodeTargetPlugin()]), ...(this.target === 'web' || this.target === 'webworker' ? [] : [new NodeTargetPlugin()]),
// https://github.com/webpack-contrib/worker-loader/issues/95#issuecomment-352856617 // https://github.com/webpack-contrib/worker-loader/issues/95#issuecomment-352856617
...(compilerOptions.externals ? [new ExternalsPlugin(compilerOptions.externals)] : []), ...(compilerOptions.externals ? [new ExternalsPlugin(compilerOptions.externals)] : []),
@ -52,19 +52,29 @@ module.exports.pitch = function pitch(remainingRequest) {
const subCache = `subcache ${__dirname} ${remainingRequest}`; const subCache = `subcache ${__dirname} ${remainingRequest}`;
childCompiler.plugin('compilation', (compilation) => { childCompiler.plugin('compilation', compilation => {
if (!compilation.cache) { return; } if (!compilation.cache) {
if (!(subCache in compilation.cache)) { Object.assign(compilation.cache, { [subCache]: {} }); } return;
}
if (!(subCache in compilation.cache)) {
Object.assign(compilation.cache, { [subCache]: {} });
}
Object.assign(compilation, { cache: compilation.cache[subCache] }); Object.assign(compilation, { cache: compilation.cache[subCache] });
}); });
const callback = this.async(); const callback = this.async();
childCompiler.runAsChild((error, entries, compilation) => { childCompiler.runAsChild((error, entries, compilation) => {
if (error) { return callback(error); } if (error) {
if (entries.length === 0) { return callback(null, null); } return callback(error);
}
if (entries.length === 0) {
return callback(null, null);
}
const mainFilename = entries[0].files[0]; const mainFilename = entries[0].files[0];
if (emit === false) { delete currentCompilation.assets[mainFilename]; } if (emit === false) {
delete currentCompilation.assets[mainFilename];
}
callback(null, compilation.assets[mainFilename].source(), null, { callback(null, compilation.assets[mainFilename].source(), null, {
[COMPILATION_METADATA]: entries[0].files, [COMPILATION_METADATA]: entries[0].files,
}); });
@ -72,8 +82,12 @@ module.exports.pitch = function pitch(remainingRequest) {
}; };
function getOutputFilename(options, { target }) { function getOutputFilename(options, { target }) {
if (!options) { return { filename: `[hash].${target}.js`, options: undefined }; } if (!options) {
if (typeof options === 'string') { return { filename: options, options: undefined }; } return { filename: `[hash].${target}.js`, options: undefined };
}
if (typeof options === 'string') {
return { filename: options, options: undefined };
}
if (typeof options === 'object') { if (typeof options === 'object') {
return { return {
filename: options.filename, filename: options.filename,

View File

@ -4,6 +4,6 @@ module.exports = () => {
autoprefixer: {}, autoprefixer: {},
'postcss-reporter': {}, 'postcss-reporter': {},
'postcss-browser-reporter': {}, 'postcss-browser-reporter': {},
} },
}; };
}; };

View File

@ -12,7 +12,7 @@ module.exports = function(options) {
options: { options: {
importLoaders: 2, importLoaders: 2,
url: options.preserveUrl, url: options.preserveUrl,
sourceMap: options.sourceMap sourceMap: options.sourceMap,
}, },
}, },
{ {
@ -25,7 +25,7 @@ module.exports = function(options) {
{ {
loader: 'sass-loader', loader: 'sass-loader',
options: { options: {
sourceMap: options.sourceMap sourceMap: options.sourceMap,
}, },
}, },
], ],

View File

@ -89,15 +89,7 @@ module.exports = (env = {}) =>
: new ForkTsCheckerWebpackPlugin({ : new ForkTsCheckerWebpackPlugin({
eslint: { eslint: {
enabled: true, enabled: true,
files: [ files: ['public/app/**/*.{ts,tsx}', 'packages/*/src/**/*.{ts,tsx}'],
'public/app/**/*.{ts,tsx}',
// this can't be written like this packages/**/src/**/*.ts because it throws an error
'packages/grafana-ui/src/**/*.{ts,tsx}',
'packages/grafana-data/src/**/*.{ts,tsx}',
'packages/grafana-runtime/src/**/*.{ts,tsx}',
'packages/grafana-e2e-selectors/src/**/*.{ts,tsx}',
'packages/jaeger-ui-components/src/**/*.{ts,tsx}',
],
options: { options: {
cache: true, cache: true,
}, },

View File

@ -89,15 +89,7 @@ module.exports = merge(common, {
new ForkTsCheckerWebpackPlugin({ new ForkTsCheckerWebpackPlugin({
eslint: { eslint: {
enabled: true, enabled: true,
files: [ files: ['public/app/**/*.{ts,tsx}', 'packages/*/src/**/*.{ts,tsx}'],
'public/app/**/*.{ts,tsx}',
// this can't be written like this packages/**/src/**/*.ts because it throws an error
'packages/grafana-ui/src/**/*.{ts,tsx}',
'packages/grafana-data/src/**/*.{ts,tsx}',
'packages/grafana-runtime/src/**/*.{ts,tsx}',
'packages/grafana-e2e-selectors/src/**/*.{ts,tsx}',
'packages/jaeger-ui-components/src/**/*.{ts,tsx}',
],
}, },
typescript: { typescript: {
mode: 'write-references', mode: 'write-references',

426
yarn.lock
View File

@ -3331,10 +3331,10 @@
typescript "3.7.5" typescript "3.7.5"
yaml "^1.8.3" yaml "^1.8.3"
"@grafana/eslint-config@^1.0.0-rc1": "@grafana/eslint-config@2.0.0":
version "1.0.0-rc1" version "2.0.0"
resolved "https://registry.yarnpkg.com/@grafana/eslint-config/-/eslint-config-1.0.0-rc1.tgz#3b0a1abddfea900a57abc9526ad31abb1da2d42c" resolved "https://registry.yarnpkg.com/@grafana/eslint-config/-/eslint-config-2.0.0.tgz#6e2b03e6d9f2afe3a0afa68560184be4e47abcd8"
integrity sha512-xmcJR6mUYw1llq3m8gT2kE7xoq6yLMUgNf2Mf1yZvDCx2cXFSyaLlGs1dqjFWjJDbV46GdhYRAyRbyGR+J9QKg== integrity sha512-AktBgoo/WzaPgjITkemP/ItcAc5E7Ga0mgjflP/fUGsHnx+d4C2Lxxxpf9BjhNgqj3G82Db8tjXDFHEqWW19hQ==
"@grafana/slate-react@0.22.9-grafana": "@grafana/slate-react@0.22.9-grafana":
version "0.22.9-grafana" version "0.22.9-grafana"
@ -6808,91 +6808,65 @@
dependencies: dependencies:
"@types/yargs-parser" "*" "@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@2.19.0": "@typescript-eslint/eslint-plugin@3.6.0":
version "2.19.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.19.0.tgz#bf743448a4633e4b52bee0c40148ba072ab3adbd" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.6.0.tgz#ba2b6cae478b8fca3f2e58ff1313e4198eea2d8a"
integrity sha512-u7IcQ9qwsB6U806LupZmINRnQjC+RJyv36sV/ugaFWMHTbFm/hlLTRx3gGYJgHisxcGSTnf+I/fPDieRMhPSQQ== integrity sha512-ubHlHVt1lsPQB/CZdEov9XuOFhNG9YRC//kuiS1cMQI6Bs1SsqKrEmZnpgRwthGR09/kEDtr9MywlqXyyYd8GA==
dependencies:
"@typescript-eslint/experimental-utils" "2.19.0"
eslint-utils "^1.4.3"
functional-red-black-tree "^1.0.1"
regexpp "^3.0.0"
tsutils "^3.17.1"
"@typescript-eslint/eslint-plugin@2.24.0":
version "2.24.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz#a86cf618c965a462cddf3601f594544b134d6d68"
integrity sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA==
dependencies:
"@typescript-eslint/experimental-utils" "2.24.0"
eslint-utils "^1.4.3"
functional-red-black-tree "^1.0.1"
regexpp "^3.0.0"
tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@2.19.0":
version "2.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.19.0.tgz#d5ca732f22c009e515ba09fcceb5f2127d841568"
integrity sha512-zwpg6zEOPbhB3+GaQfufzlMUOO6GXCNZq6skk+b2ZkZAIoBhVoanWK255BS1g5x9bMwHpLhX0Rpn5Fc3NdCZdg==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "2.19.0"
eslint-scope "^5.0.0"
"@typescript-eslint/experimental-utils@2.24.0":
version "2.24.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz#a5cb2ed89fedf8b59638dc83484eb0c8c35e1143"
integrity sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "2.24.0"
eslint-scope "^5.0.0"
"@typescript-eslint/parser@2.19.0":
version "2.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.19.0.tgz#912160d9425395d09857dcd5382352bc98be11ae"
integrity sha512-s0jZoxAWjHnuidbbN7aA+BFVXn4TCcxEVGPV8lWMxZglSs3NRnFFAlL+aIENNmzB2/1jUJuySi6GiM6uACPmpg==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "2.19.0"
"@typescript-eslint/typescript-estree" "2.19.0"
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/parser@2.24.0":
version "2.24.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.24.0.tgz#2cf0eae6e6dd44d162486ad949c126b887f11eb8"
integrity sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "2.24.0"
"@typescript-eslint/typescript-estree" "2.24.0"
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/typescript-estree@2.19.0":
version "2.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.19.0.tgz#6bd7310b9827e04756fe712909f26956aac4b196"
integrity sha512-n6/Xa37k0jQdwpUszffi19AlNbVCR0sdvCs3DmSKMD7wBttKY31lhD2fug5kMD91B2qW4mQldaTEc1PEzvGu8w==
dependencies: dependencies:
"@typescript-eslint/experimental-utils" "3.6.0"
debug "^4.1.1" debug "^4.1.1"
functional-red-black-tree "^1.0.1"
regexpp "^3.0.0"
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@3.6.0":
version "3.6.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.6.0.tgz#0138152d66e3e53a6340f606793fb257bf2d76a1"
integrity sha512-4Vdf2hvYMUnTdkCNZu+yYlFtL2v+N2R7JOynIOkFbPjf9o9wQvRwRkzUdWlFd2YiiUwJLbuuLnl5civNg5ykOQ==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/types" "3.6.0"
"@typescript-eslint/typescript-estree" "3.6.0"
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
"@typescript-eslint/parser@3.6.0":
version "3.6.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.6.0.tgz#79b5232e1a2d06f1fc745942b690cd87aca7b60e"
integrity sha512-taghDxuLhbDAD1U5Fk8vF+MnR0yiFE9Z3v2/bYScFb0N1I9SK8eKHkdJl1DAD48OGFDMFTeOTX0z7g0W6SYUXw==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "3.6.0"
"@typescript-eslint/types" "3.6.0"
"@typescript-eslint/typescript-estree" "3.6.0"
eslint-visitor-keys "^1.1.0" eslint-visitor-keys "^1.1.0"
"@typescript-eslint/types@3.6.0":
version "3.6.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.6.0.tgz#4bd6eee55d2f9d35a4b36c4804be1880bf68f7bc"
integrity sha512-JwVj74ohUSt0ZPG+LZ7hb95fW8DFOqBuR6gE7qzq55KDI3BepqsCtHfBIoa0+Xi1AI7fq5nCu2VQL8z4eYftqg==
"@typescript-eslint/typescript-estree@3.6.0":
version "3.6.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.6.0.tgz#9b4cab43f1192b64ff51530815b8919f166ce177"
integrity sha512-G57NDSABHjvob7zVV09ehWyD1K6/YUKjz5+AufObFyjNO4DVmKejj47MHjVHHlZZKgmpJD2yyH9lfCXHrPITFg==
dependencies:
"@typescript-eslint/types" "3.6.0"
"@typescript-eslint/visitor-keys" "3.6.0"
debug "^4.1.1"
glob "^7.1.6" glob "^7.1.6"
is-glob "^4.0.1" is-glob "^4.0.1"
lodash "^4.17.15" lodash "^4.17.15"
semver "^6.3.0" semver "^7.3.2"
tsutils "^3.17.1" tsutils "^3.17.1"
"@typescript-eslint/typescript-estree@2.24.0": "@typescript-eslint/visitor-keys@3.6.0":
version "2.24.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz#38bbc8bb479790d2f324797ffbcdb346d897c62a" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.6.0.tgz#44185eb0cc47651034faa95c5e2e8b314ecebb26"
integrity sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA== integrity sha512-p1izllL2Ubwunite0ITjubuMQRBGgjdVYwyG7lXPX8GbrA6qF0uwSRz9MnXZaHMxID4948gX0Ez8v9tUDi/KfQ==
dependencies: dependencies:
debug "^4.1.1"
eslint-visitor-keys "^1.1.0" eslint-visitor-keys "^1.1.0"
glob "^7.1.6"
is-glob "^4.0.1"
lodash "^4.17.15"
semver "^6.3.0"
tsutils "^3.17.1"
"@webassemblyjs/ast@1.8.5": "@webassemblyjs/ast@1.8.5":
version "1.8.5" version "1.8.5"
@ -7159,6 +7133,11 @@ acorn-jsx@^5.1.0:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384"
integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==
acorn-jsx@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
acorn-walk@^6.0.1, acorn-walk@^6.1.1: acorn-walk@^6.0.1, acorn-walk@^6.1.1:
version "6.2.0" version "6.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
@ -7199,7 +7178,7 @@ acorn@^7.1.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
acorn@^7.1.1: acorn@^7.1.1, acorn@^7.2.0:
version "7.3.1" version "7.3.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd"
integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==
@ -7415,6 +7394,11 @@ ansi-colors@^3.0.0:
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
ansi-colors@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
ansi-escapes@^1.1.0: ansi-escapes@^1.1.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
@ -7681,15 +7665,6 @@ array-includes@^3.0.3:
define-properties "^1.1.2" define-properties "^1.1.2"
es-abstract "^1.7.0" es-abstract "^1.7.0"
array-includes@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
dependencies:
define-properties "^1.1.3"
es-abstract "^1.17.0"
is-string "^1.0.5"
array-slice@^1.0.0: array-slice@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
@ -9756,10 +9731,10 @@ commander@~2.19.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
comment-parser@^0.7.2: comment-parser@^0.7.5:
version "0.7.2" version "0.7.5"
resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.7.2.tgz#baf6d99b42038678b81096f15b630d18142f4b8a" resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.7.5.tgz#06db157a3b34addf8502393743e41897e2c73059"
integrity sha512-4Rjb1FnxtOcv9qsfuaNuVsmmVn4ooVoBHzYfyKteiXwIU84PClyGA5jASoFMwPV93+FPh9spwueXauxFJZkGAg== integrity sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==
common-tags@1.8.0, common-tags@^1.8.0: common-tags@1.8.0, common-tags@^1.8.0:
version "1.8.0" version "1.8.0"
@ -10303,6 +10278,15 @@ cross-spawn@^5.0.1:
shebang-command "^1.2.0" shebang-command "^1.2.0"
which "^1.2.9" which "^1.2.9"
cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
which "^2.0.1"
crypt@~0.0.1: crypt@~0.0.1:
version "0.0.2" version "0.0.2"
resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
@ -11124,7 +11108,7 @@ deep-freeze@^0.0.1:
resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84"
integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=
deep-is@~0.1.3: deep-is@^0.1.3, deep-is@~0.1.3:
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
@ -11409,13 +11393,6 @@ doctrine@^1.2.2:
esutils "^2.0.2" esutils "^2.0.2"
isarray "^1.0.0" isarray "^1.0.0"
doctrine@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
dependencies:
esutils "^2.0.2"
doctrine@^3.0.0: doctrine@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
@ -11777,6 +11754,13 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
memory-fs "^0.5.0" memory-fs "^0.5.0"
tapable "^1.0.0" tapable "^1.0.0"
enquirer@^2.3.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
dependencies:
ansi-colors "^4.1.1"
entities@^1.1.1, entities@^1.1.2, entities@~1.1.1: entities@^1.1.1, entities@^1.1.2, entities@~1.1.1:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
@ -12121,48 +12105,37 @@ escope@^3.6.0:
esrecurse "^4.1.0" esrecurse "^4.1.0"
estraverse "^4.1.1" estraverse "^4.1.1"
eslint-config-prettier@6.10.0: eslint-config-prettier@6.11.0:
version "6.10.0" version "6.11.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz#7b15e303bf9c956875c948f6b21500e48ded6a7f" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1"
integrity sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg== integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==
dependencies: dependencies:
get-stdin "^6.0.0" get-stdin "^6.0.0"
eslint-plugin-jsdoc@22.1.0: eslint-plugin-jsdoc@28.6.1:
version "22.1.0" version "28.6.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-22.1.0.tgz#dadfa62653fc0d87f900d810307f5ed07ef6ecd5" resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-28.6.1.tgz#c9e9da59d0d3cef4fb45ffb91c0acde43af4e418"
integrity sha512-54NdbICM7KrxsGUqQsev9aIMqPXyvyBx2218Qcm0TQ16P9CtBI+YY4hayJR6adrxlq4Ej0JLpgfUXWaQVFqmQg== integrity sha512-Z3y7hcNPDuhL339D1KOf9SY8pMAxYxhaG4QLtu3KVn20k/hNF1u6WQv44wvuSCb6OfPJ4say37RUlSNqIjR+mw==
dependencies: dependencies:
comment-parser "^0.7.2" comment-parser "^0.7.5"
debug "^4.1.1" debug "^4.1.1"
jsdoctypeparser "^6.1.0" jsdoctypeparser "^7.0.0"
lodash "^4.17.15" lodash "^4.17.15"
regextras "^0.7.0" regextras "^0.7.1"
semver "^6.3.0" semver "^7.3.2"
spdx-expression-parse "^3.0.0" spdx-expression-parse "^3.0.1"
eslint-plugin-prettier@3.1.2: eslint-plugin-prettier@3.1.4:
version "3.1.2" version "3.1.4"
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2"
integrity sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA== integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==
dependencies: dependencies:
prettier-linter-helpers "^1.0.0" prettier-linter-helpers "^1.0.0"
eslint-plugin-react@7.18.3: eslint-plugin-react-hooks@4.0.5:
version "7.18.3" version "4.0.5"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.18.3.tgz#8be671b7f6be095098e79d27ac32f9580f599bc8" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.5.tgz#4879003aa38e5d05d0312175beb6e4a1f617bfcf"
integrity sha512-Bt56LNHAQCoou88s8ViKRjMB2+36XRejCQ1VoLj716KI1MoE99HpTVvIThJ0rvFmG4E4Gsq+UgToEjn+j044Bg== integrity sha512-3YLSjoArsE2rUwL8li4Yxx1SUg3DQWp+78N3bcJQGWVZckcp+yeQGsap/MSq05+thJk57o+Ww4PtZukXGL02TQ==
dependencies:
array-includes "^3.1.1"
doctrine "^2.1.0"
has "^1.0.3"
jsx-ast-utils "^2.2.3"
object.entries "^1.1.1"
object.fromentries "^2.0.2"
object.values "^1.1.1"
prop-types "^15.7.2"
resolve "^1.14.2"
string.prototype.matchall "^4.0.2"
eslint-scope@^4.0.3: eslint-scope@^4.0.3:
version "4.0.3" version "4.0.3"
@ -12180,10 +12153,18 @@ eslint-scope@^5.0.0:
esrecurse "^4.1.0" esrecurse "^4.1.0"
estraverse "^4.1.1" estraverse "^4.1.1"
eslint-utils@^1.4.3: eslint-scope@^5.1.0:
version "1.4.3" version "5.1.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5"
integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==
dependencies:
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint-utils@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
dependencies: dependencies:
eslint-visitor-keys "^1.1.0" eslint-visitor-keys "^1.1.0"
@ -12192,22 +12173,28 @@ eslint-visitor-keys@^1.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
eslint@6.8.0: eslint-visitor-keys@^1.2.0:
version "6.8.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
eslint@7.4.0:
version "7.4.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.4.0.tgz#4e35a2697e6c1972f9d6ef2b690ad319f80f206f"
integrity sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==
dependencies: dependencies:
"@babel/code-frame" "^7.0.0" "@babel/code-frame" "^7.0.0"
ajv "^6.10.0" ajv "^6.10.0"
chalk "^2.1.0" chalk "^4.0.0"
cross-spawn "^6.0.5" cross-spawn "^7.0.2"
debug "^4.0.1" debug "^4.0.1"
doctrine "^3.0.0" doctrine "^3.0.0"
eslint-scope "^5.0.0" enquirer "^2.3.5"
eslint-utils "^1.4.3" eslint-scope "^5.1.0"
eslint-visitor-keys "^1.1.0" eslint-utils "^2.0.0"
espree "^6.1.2" eslint-visitor-keys "^1.2.0"
esquery "^1.0.1" espree "^7.1.0"
esquery "^1.2.0"
esutils "^2.0.2" esutils "^2.0.2"
file-entry-cache "^5.0.1" file-entry-cache "^5.0.1"
functional-red-black-tree "^1.0.1" functional-red-black-tree "^1.0.1"
@ -12216,21 +12203,19 @@ eslint@6.8.0:
ignore "^4.0.6" ignore "^4.0.6"
import-fresh "^3.0.0" import-fresh "^3.0.0"
imurmurhash "^0.1.4" imurmurhash "^0.1.4"
inquirer "^7.0.0"
is-glob "^4.0.0" is-glob "^4.0.0"
js-yaml "^3.13.1" js-yaml "^3.13.1"
json-stable-stringify-without-jsonify "^1.0.1" json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.3.0" levn "^0.4.1"
lodash "^4.17.14" lodash "^4.17.14"
minimatch "^3.0.4" minimatch "^3.0.4"
mkdirp "^0.5.1"
natural-compare "^1.4.0" natural-compare "^1.4.0"
optionator "^0.8.3" optionator "^0.9.1"
progress "^2.0.0" progress "^2.0.0"
regexpp "^2.0.1" regexpp "^3.1.0"
semver "^6.1.2" semver "^7.2.1"
strip-ansi "^5.2.0" strip-ansi "^6.0.0"
strip-json-comments "^3.0.1" strip-json-comments "^3.1.0"
table "^5.2.3" table "^5.2.3"
text-table "^0.2.0" text-table "^0.2.0"
v8-compile-cache "^2.0.3" v8-compile-cache "^2.0.3"
@ -12282,14 +12267,14 @@ espree@^3.1.6:
acorn "^5.5.0" acorn "^5.5.0"
acorn-jsx "^3.0.0" acorn-jsx "^3.0.0"
espree@^6.1.2: espree@^7.1.0:
version "6.1.2" version "7.1.0"
resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c"
integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==
dependencies: dependencies:
acorn "^7.1.0" acorn "^7.2.0"
acorn-jsx "^5.1.0" acorn-jsx "^5.2.0"
eslint-visitor-keys "^1.1.0" eslint-visitor-keys "^1.2.0"
esprima@^3.1.3, esprima@~3.1.0: esprima@^3.1.3, esprima@~3.1.0:
version "3.1.3" version "3.1.3"
@ -12308,12 +12293,12 @@ espurify@^1.6.0:
dependencies: dependencies:
core-js "^2.0.0" core-js "^2.0.0"
esquery@^1.0.1: esquery@^1.2.0:
version "1.0.1" version "1.3.1"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
dependencies: dependencies:
estraverse "^4.0.0" estraverse "^5.1.0"
esrecurse@^4.1.0: esrecurse@^4.1.0:
version "4.2.1" version "4.2.1"
@ -12327,11 +12312,16 @@ esrever@^0.2.0:
resolved "https://registry.yarnpkg.com/esrever/-/esrever-0.2.0.tgz#96e9d28f4f1b1a76784cd5d490eaae010e7407b8" resolved "https://registry.yarnpkg.com/esrever/-/esrever-0.2.0.tgz#96e9d28f4f1b1a76784cd5d490eaae010e7407b8"
integrity sha1-lunSj08bGnZ4TNXUkOquAQ50B7g= integrity sha1-lunSj08bGnZ4TNXUkOquAQ50B7g=
estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
version "4.3.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
estraverse@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
estree-walker@^0.6.1: estree-walker@^0.6.1:
version "0.6.1" version "0.6.1"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
@ -12720,7 +12710,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6: fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4:
version "2.0.6" version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
@ -16741,10 +16731,10 @@ jscodeshift@^0.7.0:
temp "^0.8.1" temp "^0.8.1"
write-file-atomic "^2.3.0" write-file-atomic "^2.3.0"
jsdoctypeparser@^6.1.0: jsdoctypeparser@^7.0.0:
version "6.1.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz#acfb936c26300d98f1405cb03e20b06748e512a8" resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-7.0.0.tgz#957192fbcb8c574240092cca4635383a6ed706eb"
integrity sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA== integrity sha512-6vWPn5qSy+MbgCVjXsQKVkRywhs+IxFU7Chw72DKsWoGueYp6QX8eTc55+EA0yPGYfhmglb1gfi283asXirfGQ==
jsdom@^11.5.1: jsdom@^11.5.1:
version "11.12.0" version "11.12.0"
@ -16968,14 +16958,6 @@ jsurl@^0.1.5:
resolved "https://registry.yarnpkg.com/jsurl/-/jsurl-0.1.5.tgz#2a5c8741de39cacafc12f448908bf34e960dcee8" resolved "https://registry.yarnpkg.com/jsurl/-/jsurl-0.1.5.tgz#2a5c8741de39cacafc12f448908bf34e960dcee8"
integrity sha1-KlyHQd45ysr8EvRIkIvzTpYNzug= integrity sha1-KlyHQd45ysr8EvRIkIvzTpYNzug=
jsx-ast-utils@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f"
integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==
dependencies:
array-includes "^3.0.3"
object.assign "^4.1.0"
just-extend@^4.0.2: just-extend@^4.0.2:
version "4.0.2" version "4.0.2"
resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc"
@ -17178,6 +17160,14 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2" prelude-ls "~1.1.2"
type-check "~0.3.2" type-check "~0.3.2"
levn@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
dependencies:
prelude-ls "^1.2.1"
type-check "~0.4.0"
liftoff@~2.5.0: liftoff@~2.5.0:
version "2.5.0" version "2.5.0"
resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
@ -19274,17 +19264,17 @@ optionator@^0.8.1:
type-check "~0.3.2" type-check "~0.3.2"
wordwrap "~1.0.0" wordwrap "~1.0.0"
optionator@^0.8.3: optionator@^0.9.1:
version "0.8.3" version "0.9.1"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
dependencies: dependencies:
deep-is "~0.1.3" deep-is "^0.1.3"
fast-levenshtein "~2.0.6" fast-levenshtein "^2.0.6"
levn "~0.3.0" levn "^0.4.1"
prelude-ls "~1.1.2" prelude-ls "^1.2.1"
type-check "~0.3.2" type-check "^0.4.0"
word-wrap "~1.2.3" word-wrap "^1.2.3"
ora@^4.0.3: ora@^4.0.3:
version "4.0.3" version "4.0.3"
@ -20791,6 +20781,11 @@ prefix-style@2.0.1:
resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06" resolved "https://registry.yarnpkg.com/prefix-style/-/prefix-style-2.0.1.tgz#66bba9a870cfda308a5dc20e85e9120932c95a06"
integrity sha1-ZrupqHDP2jCKXcIOhekSCTLJWgY= integrity sha1-ZrupqHDP2jCKXcIOhekSCTLJWgY=
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
prelude-ls@~1.1.2: prelude-ls@~1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@ -22646,16 +22641,16 @@ regexp.prototype.flags@^1.3.0:
define-properties "^1.1.3" define-properties "^1.1.3"
es-abstract "^1.17.0-next.1" es-abstract "^1.17.0-next.1"
regexpp@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
regexpp@^3.0.0: regexpp@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e"
integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==
regexpp@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
regexpu-core@^4.6.0: regexpu-core@^4.6.0:
version "4.6.0" version "4.6.0"
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6"
@ -22680,10 +22675,10 @@ regexpu-core@^4.7.0:
unicode-match-property-ecmascript "^1.0.4" unicode-match-property-ecmascript "^1.0.4"
unicode-match-property-value-ecmascript "^1.2.0" unicode-match-property-value-ecmascript "^1.2.0"
regextras@^0.7.0: regextras@^0.7.1:
version "0.7.0" version "0.7.1"
resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.0.tgz#2298bef8cfb92b1b7e3b9b12aa8f69547b7d71e4" resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.1.tgz#be95719d5f43f9ef0b9fa07ad89b7c606995a3b2"
integrity sha512-ds+fL+Vhl918gbAUb0k2gVKbTZLsg84Re3DI6p85Et0U0tYME3hyW4nMK8Px4dtDaBA2qNjvG5uWyW7eK5gfmw== integrity sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==
registry-auth-token@^3.0.1: registry-auth-token@^3.0.1:
version "3.4.0" version "3.4.0"
@ -23663,7 +23658,7 @@ semver@7.x, semver@^7.2.1, semver@^7.3.2:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
version "6.3.0" version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@ -24269,6 +24264,14 @@ spdx-expression-parse@^3.0.0:
spdx-exceptions "^2.1.0" spdx-exceptions "^2.1.0"
spdx-license-ids "^3.0.0" spdx-license-ids "^3.0.0"
spdx-expression-parse@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
dependencies:
spdx-exceptions "^2.1.0"
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0: spdx-license-ids@^3.0.0:
version "3.0.5" version "3.0.5"
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
@ -24607,7 +24610,7 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0:
is-fullwidth-code-point "^3.0.0" is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0" strip-ansi "^6.0.0"
"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.2: "string.prototype.matchall@^4.0.0 || ^3.0.1":
version "4.0.2" version "4.0.2"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e"
integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==
@ -24808,10 +24811,10 @@ strip-json-comments@2.0.1, strip-json-comments@~2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
strip-json-comments@^3.0.1: strip-json-comments@^3.1.0:
version "3.0.1" version "3.1.0"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
strip-json-comments@~1.0.1: strip-json-comments@~1.0.1:
version "1.0.4" version "1.0.4"
@ -25724,6 +25727,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
dependencies:
prelude-ls "^1.2.1"
type-check@~0.3.2: type-check@~0.3.2:
version "0.3.2" version "0.3.2"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
@ -26880,7 +26890,7 @@ wolfy87-eventemitter@~5.1.0:
resolved "https://registry.yarnpkg.com/wolfy87-eventemitter/-/wolfy87-eventemitter-5.1.0.tgz#35c1ac0dd1ac0c15e35d981508fc22084a13a011" resolved "https://registry.yarnpkg.com/wolfy87-eventemitter/-/wolfy87-eventemitter-5.1.0.tgz#35c1ac0dd1ac0c15e35d981508fc22084a13a011"
integrity sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE= integrity sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE=
word-wrap@~1.2.3: word-wrap@^1.2.3:
version "1.2.3" version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==