From 97c12d6c93d9cad0bb8d8f8952cc4f2a5060f248 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 27 Oct 2022 09:52:08 -0400 Subject: [PATCH 01/67] get traces page working with queries Signed-off-by: Derek Ho --- common/constants/trace_analytics.ts | 4 +- .../components/common/helper_functions.tsx | 4 +- .../components/traces/traces_content.tsx | 4 +- .../requests/queries/traces_queries.ts | 318 +++++++++++++++++- 4 files changed, 316 insertions(+), 14 deletions(-) diff --git a/common/constants/trace_analytics.ts b/common/constants/trace_analytics.ts index f480a25f6d..1fb828892e 100644 --- a/common/constants/trace_analytics.ts +++ b/common/constants/trace_analytics.ts @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -export const DATA_PREPPER_INDEX_NAME = 'otel-v1-apm-span-*'; -export const DATA_PREPPER_SERVICE_INDEX_NAME = 'otel-v1-apm-service-map*'; +export const DATA_PREPPER_INDEX_NAME = '*jaeger-span-*'; +export const DATA_PREPPER_SERVICE_INDEX_NAME = '*jaeger-service*'; export const TRACE_ANALYTICS_DATE_FORMAT = 'MM/DD/YYYY HH:mm:ss'; export const TRACE_ANALYTICS_PLOTS_DATE_FORMAT = 'MMM D, YYYY HH:mm:ss'; export const SERVICE_MAP_MAX_NODES = 500; diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index 04e48f6b15..7effcf5889 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -296,8 +296,8 @@ export const getPercentileFilter = ( export const filtersToDsl = ( filters: FilterType[], query: string, - startTime: string, - endTime: string, + startTime: any, + endTime: any, page?: string, appConfigs: FilterType[] = [] ) => { diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index b71a243341..72d2ed6ff5 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -54,8 +54,8 @@ export function TracesContent(props: TracesProps) { const refresh = async (sort?: PropertySort) => { setLoading(true); - const DSL = filtersToDsl(filters, query, startTime, endTime, page, appConfigs); - const timeFilterDSL = filtersToDsl([], '', startTime, endTime, page); + const DSL = filtersToDsl(filters, query, 0, 166638045873223500, page, appConfigs); + const timeFilterDSL = filtersToDsl([], '', 0, 166638045873223500, page); await handleTracesRequest(http, DSL, timeFilterDSL, tableItems, setTableItems, sort); setLoading(false); }; diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 89d63a42e7..1e35b76322 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -8,6 +8,308 @@ import { TRACES_MAX_NUM } from '../../../../../common/constants/trace_analytics' import { SpanSearchParams } from '../../components/traces/span_detail_table'; export const getTraceGroupPercentilesQuery = () => { + const query: any = { + size: 0, + query: { + bool: { + must: [ + { + term: { + references: { + value: [], + }, + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + trace_group_name: { + terms: { + field: 'operationName', + size: 10000, + }, + // aggs: { + // percentiles: { + // percentiles: { + // field: 'durationInNanos', + // percents: Array.from({ length: 101 }, (v, i) => i), + // }, + // }, + // }, + }, + }, + }; + return query; +}; + +export const getTracesQuery = (traceId: string = '', sort?: PropertySort) => { + const field = sort?.field || '_key'; + const direction = sort?.direction || 'asc'; + const query: any = { + size: 0, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + traces: { + terms: { + field: 'traceID', + size: TRACES_MAX_NUM, + order: { + [field]: direction, + }, + }, + aggs: { + latency: { + max: { + script: { + source: ` + if (doc.containsKey('traceGroupFields.durationInNanos') && !doc['traceGroupFields.durationInNanos'].empty) { + return Math.round(doc['traceGroupFields.durationInNanos'].value / 10000) / 100.0 + } + + return 0 + `, + lang: 'painless', + }, + }, + }, + trace_group: { + terms: { + field: 'traceGroup', + size: 1, + }, + }, + error_count: { + filter: { + term: { + 'traceGroupFields.statusCode': '2', + }, + }, + }, + last_updated: { + max: { + field: 'traceGroupFields.endTime', + }, + }, + }, + }, + }, + }; + if (traceId) { + query.query.bool.must.push({ + term: { + traceId, + }, + }); + } + return query; +}; + +export const getServiceBreakdownQuery = (traceId: string) => { + const query = { + size: 0, + query: { + bool: { + must: [ + { + term: { + traceId, + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + service_type: { + terms: { + field: 'serviceName', + order: [ + { + total_latency_nanos: 'desc', + }, + ], + }, + aggs: { + total_latency_nanos: { + sum: { + field: 'durationInNanos', + }, + }, + total_latency: { + bucket_script: { + buckets_path: { + count: '_count', + latency: 'total_latency_nanos.value', + }, + script: 'Math.round(params.latency / 10000) / 100.0', + }, + }, + }, + }, + }, + }; + return query; +}; + +export const getSpanDetailQuery = (traceId: string, size = 3000) => { + const query = { + size, + query: { + bool: { + must: [ + { + term: { + traceId, + }, + }, + { + exists: { + field: 'serviceName', + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + sort: [ + { + startTime: { + order: 'desc', + }, + }, + ], + _source: { + includes: [ + 'serviceName', + 'name', + 'startTime', + 'endTime', + 'spanId', + 'status.code', + 'durationInNanos', + ], + }, + }; + return query; +}; + +export const getPayloadQuery = (traceId: string, size = 1000) => { + return { + size, + query: { + bool: { + must: [ + { + term: { + traceId, + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + }; +}; + +export const getSpanFlyoutQuery = (spanId?: string, size = 1000) => { + return { + size, + query: { + bool: { + must: [ + { + term: { + spanId, + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + }; +}; + +export const getSpansQuery = (spanSearchParams: SpanSearchParams) => { + const query: any = { + size: spanSearchParams.size, + from: spanSearchParams.from, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + sort: spanSearchParams.sortingColumns, + }; + return query; +}; + +export const getValidTraceIdsQuery = (DSL) => { + const query: any = { + size: 0, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + traces: { + terms: { + field: 'traceId', + size: 10000, + }, + }, + }, + }; + if (DSL.custom?.timeFilter.length > 0) query.query.bool.must.push(...DSL.custom.timeFilter); + if (DSL.custom?.traceGroupFields.length > 0) { + query.query.bool.filter.push({ + terms: { + traceGroup: DSL.custom.traceGroup, + }, + }); + } + if (DSL.custom?.percentiles?.query.bool.should.length > 0) { + query.query.bool.should.push(...DSL.custom.percentiles.query.bool.should); + query.query.bool.minimum_should_match = DSL.custom.percentiles.query.bool.minimum_should_match; + } + if (DSL.custom?.serviceNames.length > 0) { + query.query.bool.filter.push({ + terms: { + serviceName: DSL.custom.serviceNames, + }, + }); + } + return query; +}; + +// JAEGER QUERIES + +export const getJaegerTraceGroupPercentilesQuery = () => { const query: any = { size: 0, query: { @@ -46,7 +348,7 @@ export const getTraceGroupPercentilesQuery = () => { return query; }; -export const getTracesQuery = (traceId: string = '', sort?: PropertySort) => { +export const getJaegerTracesQuery = (traceId: string = '', sort?: PropertySort) => { const field = sort?.field || '_key'; const direction = sort?.direction || 'asc'; const query: any = { @@ -115,7 +417,7 @@ export const getTracesQuery = (traceId: string = '', sort?: PropertySort) => { return query; }; -export const getServiceBreakdownQuery = (traceId: string) => { +export const getJaegerServiceBreakdownQuery = (traceId: string) => { const query = { size: 0, query: { @@ -164,7 +466,7 @@ export const getServiceBreakdownQuery = (traceId: string) => { return query; }; -export const getSpanDetailQuery = (traceId: string, size = 3000) => { +export const getJaegerSpanDetailQuery = (traceId: string, size = 3000) => { const query = { size, query: { @@ -208,7 +510,7 @@ export const getSpanDetailQuery = (traceId: string, size = 3000) => { return query; }; -export const getPayloadQuery = (traceId: string, size = 1000) => { +export const getJaegerPayloadQuery = (traceId: string, size = 1000) => { return { size, query: { @@ -228,7 +530,7 @@ export const getPayloadQuery = (traceId: string, size = 1000) => { }; }; -export const getSpanFlyoutQuery = (spanId?: string, size = 1000) => { +export const getJaegerSpanFlyoutQuery = (spanId?: string, size = 1000) => { return { size, query: { @@ -248,7 +550,7 @@ export const getSpanFlyoutQuery = (spanId?: string, size = 1000) => { }; }; -export const getSpansQuery = (spanSearchParams: SpanSearchParams) => { +export const getJaegerSpansQuery = (spanSearchParams: SpanSearchParams) => { const query: any = { size: spanSearchParams.size, from: spanSearchParams.from, @@ -265,7 +567,7 @@ export const getSpansQuery = (spanSearchParams: SpanSearchParams) => { return query; }; -export const getValidTraceIdsQuery = (DSL) => { +export const getJaegerValidTraceIdsQuery = (DSL) => { const query: any = { size: 0, query: { @@ -305,4 +607,4 @@ export const getValidTraceIdsQuery = (DSL) => { }); } return query; -}; +}; \ No newline at end of file From 5fcb2cac8e3d59d4c4bf2042d4f2fe0143242987 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 27 Oct 2022 10:15:39 -0400 Subject: [PATCH 02/67] get trace individual page partially working Signed-off-by: Derek Ho --- .../requests/queries/traces_queries.ts | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 1e35b76322..5e8449eb69 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -32,21 +32,21 @@ export const getTraceGroupPercentilesQuery = () => { field: 'operationName', size: 10000, }, - // aggs: { - // percentiles: { - // percentiles: { - // field: 'durationInNanos', - // percents: Array.from({ length: 101 }, (v, i) => i), - // }, - // }, - // }, + aggs: { + percentiles: { + percentiles: { + field: 'duration', + percents: Array.from({ length: 101 }, (v, i) => i), + }, + }, + }, }, }, }; return query; }; -export const getTracesQuery = (traceId: string = '', sort?: PropertySort) => { +export const getTracesQuery = (traceID: string = '', sort?: PropertySort) => { const field = sort?.field || '_key'; const direction = sort?.direction || 'asc'; const query: any = { @@ -73,8 +73,8 @@ export const getTracesQuery = (traceId: string = '', sort?: PropertySort) => { max: { script: { source: ` - if (doc.containsKey('traceGroupFields.durationInNanos') && !doc['traceGroupFields.durationInNanos'].empty) { - return Math.round(doc['traceGroupFields.durationInNanos'].value / 10000) / 100.0 + if (doc.containsKey('duration') && !doc['duration'].empty) { + return Math.round(doc['duration'].value) / 1000.0 } return 0 @@ -105,17 +105,17 @@ export const getTracesQuery = (traceId: string = '', sort?: PropertySort) => { }, }, }; - if (traceId) { + if (traceID) { query.query.bool.must.push({ term: { - traceId, + traceID, }, }); } return query; }; -export const getServiceBreakdownQuery = (traceId: string) => { +export const getServiceBreakdownQuery = (traceID: string) => { const query = { size: 0, query: { @@ -123,7 +123,7 @@ export const getServiceBreakdownQuery = (traceId: string) => { must: [ { term: { - traceId, + traceID, }, }, ], @@ -164,7 +164,7 @@ export const getServiceBreakdownQuery = (traceId: string) => { return query; }; -export const getSpanDetailQuery = (traceId: string, size = 3000) => { +export const getSpanDetailQuery = (traceID: string, size = 3000) => { const query = { size, query: { @@ -172,7 +172,7 @@ export const getSpanDetailQuery = (traceId: string, size = 3000) => { must: [ { term: { - traceId, + traceID, }, }, { @@ -208,7 +208,7 @@ export const getSpanDetailQuery = (traceId: string, size = 3000) => { return query; }; -export const getPayloadQuery = (traceId: string, size = 1000) => { +export const getPayloadQuery = (traceID: string, size = 1000) => { return { size, query: { @@ -216,7 +216,7 @@ export const getPayloadQuery = (traceId: string, size = 1000) => { must: [ { term: { - traceId, + traceID, }, }, ], @@ -279,7 +279,7 @@ export const getValidTraceIdsQuery = (DSL) => { aggs: { traces: { terms: { - field: 'traceId', + field: 'traceID', size: 10000, }, }, From 71ac2970f95ef50d5f94f01f7caed495184e4cbb Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 27 Oct 2022 11:35:14 -0400 Subject: [PATCH 03/67] get service page working initially Signed-off-by: Derek Ho --- .../components/services/service_view.tsx | 2 +- .../components/services/services_content.tsx | 2 +- .../requests/queries/services_queries.ts | 28 +- .../requests/queries/traces_queries.ts | 308 +----------------- .../requests/services_request_handler.ts | 13 +- 5 files changed, 26 insertions(+), 327 deletions(-) diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index 555446ac27..eabc697638 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -46,7 +46,7 @@ export function ServiceView(props: ServiceViewProps) { const [redirect, setRedirect] = useState(false); const refresh = () => { - const DSL = filtersToDsl(props.filters, props.query, props.startTime, props.endTime); + const DSL = filtersToDsl(props.filters, props.query, 0, 166638045873223500); handleServiceViewRequest(props.serviceName, props.http, DSL, setFields); handleServiceMapRequest(props.http, DSL, setServiceMap, props.serviceName); }; diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index e4fa97e25d..12c1b07c9e 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -74,7 +74,7 @@ export function ServicesContent(props: ServicesProps) { const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query, startTime, endTime, page, appConfigs); + const DSL = filtersToDsl(filters, query, 0, 166638045873223500, page, appConfigs); // service map should not be filtered by service name const serviceMapDSL = _.cloneDeep(DSL); serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 327e029d42..37951fa231 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -25,13 +25,13 @@ export const getServicesQuery = (serviceName: string | undefined, DSL?: any) => aggs: { service: { terms: { - field: 'serviceName', + field: 'process.serviceName', size: 10000, }, aggs: { trace_count: { cardinality: { - field: 'traceId', + field: 'traceID', }, }, }, @@ -41,21 +41,21 @@ export const getServicesQuery = (serviceName: string | undefined, DSL?: any) => if (serviceName) { query.query.bool.must.push({ term: { - serviceName, + "process.serviceName": serviceName, }, }); } DSL?.custom?.serviceNames?.map((service: string) => { query.query.bool.must.push({ term: { - serviceName: service, + "process.serviceName": service, }, }); }); DSL?.custom?.serviceNamesExclude?.map((service: string) => { query.query.bool.must_not.push({ term: { - serviceName: service, + "process.serviceName": service, }, }); }); @@ -76,13 +76,13 @@ export const getRelatedServicesQuery = (serviceName: string) => { aggs: { traces: { terms: { - field: 'traceId', + field: 'traceID', size: 10000, }, aggs: { all_services: { terms: { - field: 'serviceName', + field: 'porcess.serviceName', size: 10000, }, }, @@ -92,7 +92,7 @@ export const getRelatedServicesQuery = (serviceName: string) => { must: [ { term: { - serviceName, + "process.serviceName": serviceName, }, }, ], @@ -161,7 +161,7 @@ export const getServiceEdgesQuery = (source: 'destination' | 'target') => { aggs: { service_name: { terms: { - field: 'serviceName', + field: 'process.serviceName', size: SERVICE_MAP_MAX_EDGES, }, aggs: { @@ -214,7 +214,7 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se filter: [ { terms: { - serviceName: serviceNames, + "process.serviceName": serviceNames, }, }, { @@ -227,8 +227,8 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se bool: { must_not: { term: { - parentSpanId: { - value: '', + references: { + value: [], }, }, }, @@ -264,7 +264,7 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se aggregations: { service_name: { terms: { - field: 'serviceName', + field: 'process.serviceName', size: SERVICE_MAP_MAX_NODES, min_doc_count: 1, shard_min_doc_count: 0, @@ -281,7 +281,7 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se aggregations: { average_latency_nanos: { avg: { - field: 'durationInNanos', + field: 'duration', }, }, average_latency: { diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 5e8449eb69..83074e49d3 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -199,7 +199,7 @@ export const getSpanDetailQuery = (traceID: string, size = 3000) => { 'name', 'startTime', 'endTime', - 'spanId', + 'spanID', 'status.code', 'durationInNanos', ], @@ -228,7 +228,7 @@ export const getPayloadQuery = (traceID: string, size = 1000) => { }; }; -export const getSpanFlyoutQuery = (spanId?: string, size = 1000) => { +export const getSpanFlyoutQuery = (spanID?: string, size = 1000) => { return { size, query: { @@ -236,7 +236,7 @@ export const getSpanFlyoutQuery = (spanId?: string, size = 1000) => { must: [ { term: { - spanId, + spanID, }, }, ], @@ -305,306 +305,4 @@ export const getValidTraceIdsQuery = (DSL) => { }); } return query; -}; - -// JAEGER QUERIES - -export const getJaegerTraceGroupPercentilesQuery = () => { - const query: any = { - size: 0, - query: { - bool: { - must: [ - { - term: { - parentSpanId: { - value: '', - }, - }, - }, - ], - filter: [], - should: [], - must_not: [], - }, - }, - aggs: { - trace_group_name: { - terms: { - field: 'name', - size: 10000, - }, - aggs: { - percentiles: { - percentiles: { - field: 'durationInNanos', - percents: Array.from({ length: 101 }, (v, i) => i), - }, - }, - }, - }, - }, - }; - return query; -}; - -export const getJaegerTracesQuery = (traceId: string = '', sort?: PropertySort) => { - const field = sort?.field || '_key'; - const direction = sort?.direction || 'asc'; - const query: any = { - size: 0, - query: { - bool: { - must: [], - filter: [], - should: [], - must_not: [], - }, - }, - aggs: { - traces: { - terms: { - field: 'traceId', - size: TRACES_MAX_NUM, - order: { - [field]: direction, - }, - }, - aggs: { - latency: { - max: { - script: { - source: ` - if (doc.containsKey('traceGroupFields.durationInNanos') && !doc['traceGroupFields.durationInNanos'].empty) { - return Math.round(doc['traceGroupFields.durationInNanos'].value / 10000) / 100.0 - } - - return 0 - `, - lang: 'painless', - }, - }, - }, - trace_group: { - terms: { - field: 'traceGroup', - size: 1, - }, - }, - error_count: { - filter: { - term: { - 'traceGroupFields.statusCode': '2', - }, - }, - }, - last_updated: { - max: { - field: 'traceGroupFields.endTime', - }, - }, - }, - }, - }, - }; - if (traceId) { - query.query.bool.must.push({ - term: { - traceId, - }, - }); - } - return query; -}; - -export const getJaegerServiceBreakdownQuery = (traceId: string) => { - const query = { - size: 0, - query: { - bool: { - must: [ - { - term: { - traceId, - }, - }, - ], - filter: [], - should: [], - must_not: [], - }, - }, - aggs: { - service_type: { - terms: { - field: 'serviceName', - order: [ - { - total_latency_nanos: 'desc', - }, - ], - }, - aggs: { - total_latency_nanos: { - sum: { - field: 'durationInNanos', - }, - }, - total_latency: { - bucket_script: { - buckets_path: { - count: '_count', - latency: 'total_latency_nanos.value', - }, - script: 'Math.round(params.latency / 10000) / 100.0', - }, - }, - }, - }, - }, - }; - return query; -}; - -export const getJaegerSpanDetailQuery = (traceId: string, size = 3000) => { - const query = { - size, - query: { - bool: { - must: [ - { - term: { - traceId, - }, - }, - { - exists: { - field: 'serviceName', - }, - }, - ], - filter: [], - should: [], - must_not: [], - }, - }, - sort: [ - { - startTime: { - order: 'desc', - }, - }, - ], - _source: { - includes: [ - 'serviceName', - 'name', - 'startTime', - 'endTime', - 'spanId', - 'status.code', - 'durationInNanos', - ], - }, - }; - return query; -}; - -export const getJaegerPayloadQuery = (traceId: string, size = 1000) => { - return { - size, - query: { - bool: { - must: [ - { - term: { - traceId, - }, - }, - ], - filter: [], - should: [], - must_not: [], - }, - }, - }; -}; - -export const getJaegerSpanFlyoutQuery = (spanId?: string, size = 1000) => { - return { - size, - query: { - bool: { - must: [ - { - term: { - spanId, - }, - }, - ], - filter: [], - should: [], - must_not: [], - }, - }, - }; -}; - -export const getJaegerSpansQuery = (spanSearchParams: SpanSearchParams) => { - const query: any = { - size: spanSearchParams.size, - from: spanSearchParams.from, - query: { - bool: { - must: [], - filter: [], - should: [], - must_not: [], - }, - }, - sort: spanSearchParams.sortingColumns, - }; - return query; -}; - -export const getJaegerValidTraceIdsQuery = (DSL) => { - const query: any = { - size: 0, - query: { - bool: { - must: [], - filter: [], - should: [], - must_not: [], - }, - }, - aggs: { - traces: { - terms: { - field: 'traceId', - size: 10000, - }, - }, - }, - }; - if (DSL.custom?.timeFilter.length > 0) query.query.bool.must.push(...DSL.custom.timeFilter); - if (DSL.custom?.traceGroupFields.length > 0) { - query.query.bool.filter.push({ - terms: { - traceGroup: DSL.custom.traceGroup, - }, - }); - } - if (DSL.custom?.percentiles?.query.bool.should.length > 0) { - query.query.bool.should.push(...DSL.custom.percentiles.query.bool.should); - query.query.bool.minimum_should_match = DSL.custom.percentiles.query.bool.minimum_should_match; - } - if (DSL.custom?.serviceNames.length > 0) { - query.query.bool.filter.push({ - terms: { - serviceName: DSL.custom.serviceNames, - }, - }); - } - return query; }; \ No newline at end of file diff --git a/public/components/trace_analytics/requests/services_request_handler.ts b/public/components/trace_analytics/requests/services_request_handler.ts index 7351113fad..56a24daa37 100644 --- a/public/components/trace_analytics/requests/services_request_handler.ts +++ b/public/components/trace_analytics/requests/services_request_handler.ts @@ -61,12 +61,13 @@ export const handleServiceMapRequest = async ( currService?: string ) => { let minutesInDateRange: number; - const startTime = DSL.custom?.timeFilter?.[0]?.range?.startTime; - if (startTime) { - const gte = dateMath.parse(startTime.gte)!; - const lte = dateMath.parse(startTime.lte, { roundUp: true })!; - minutesInDateRange = lte.diff(gte, 'minutes', true); - } + // const startTime = DSL.custom?.timeFilter?.[0]?.range?.startTime; + // if (startTime) { + // const gte = dateMath.parse(startTime.gte)!; + // const lte = dateMath.parse(startTime.lte)!; + // minutesInDateRange = lte.diff(gte, 'minutes', true); + // } + minutesInDateRange=100000000 const map: ServiceObject = {}; let id = 1; From 8bf47475c8cdff2af58e5ae68287a9b3e69bcdf5 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 27 Oct 2022 12:32:39 -0400 Subject: [PATCH 04/67] get services page mainly working Signed-off-by: Derek Ho --- .../service_detail_flyout.tsx | 2 +- .../requests/queries/services_queries.ts | 36 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx index 07a7e0a5a2..b17ffb5b32 100644 --- a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx @@ -116,7 +116,7 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { }, [serviceName, fields, serviceMap, DSL, serviceMapIdSelected]); useEffect(() => { - const serviceDSL = filtersToDsl(filters, query, startTime, endTime, 'app', appConfigs); + const serviceDSL = filtersToDsl(filters, query, 0, 166638045873223500, 'app', appConfigs); handleServiceViewRequest(serviceName, http, serviceDSL, setFields); handleServiceMapRequest(http, serviceDSL, setServiceMap, serviceName); const spanDSL = filtersToDsl(filters, query, startTime, endTime, 'app', appConfigs); diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 37951fa231..5451980400 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -161,7 +161,7 @@ export const getServiceEdgesQuery = (source: 'destination' | 'target') => { aggs: { service_name: { terms: { - field: 'process.serviceName', + field: 'serviceName', size: SERVICE_MAP_MAX_EDGES, }, aggs: { @@ -234,25 +234,25 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se }, }, }, - { - terms: { - name: targetResource, - }, - }, + // { + // terms: { + // name: targetResource, + // }, + // }, ], }, }, - { - bool: { - must: { - term: { - parentSpanId: { - value: '', - }, - }, - }, - }, - }, + // { + // bool: { + // must: { + // term: { + // parentSpanId: { + // value: '', + // }, + // }, + // }, + // }, + // }, ], adjust_pure_negative: true, boost: 1, @@ -290,7 +290,7 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se count: '_count', latency: 'average_latency_nanos.value', }, - script: 'Math.round(params.latency / 10000) / 100.0', + script: 'Math.round(params.latency / 10) / 100.0', }, }, error_count: { From c36129814cbbcb311113b90e487f4e4653a696ae Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 27 Oct 2022 15:06:14 -0400 Subject: [PATCH 05/67] get most things working except for dashboards Signed-off-by: Derek Ho --- .../components/dashboard/dashboard_content.tsx | 10 +++++----- .../components/services/service_view.tsx | 2 +- .../trace_analytics/requests/queries/traces_queries.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 4faa2a1ede..8c623c0ea0 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -86,14 +86,14 @@ export function DashboardContent(props: DashboardProps) { const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query, startTime, endTime, page, appConfigs); - const timeFilterDSL = filtersToDsl([], '', startTime, endTime, page, appConfigs); - const latencyTrendStartTime = dateMath.parse(endTime, { roundUp: true })?.subtract(24, 'hours').toISOString()!; + const DSL = filtersToDsl(filters, query, 0, 166638045873223500, page, appConfigs); + const timeFilterDSL = filtersToDsl([], '', 0, 166638045873223500, page, appConfigs); + const latencyTrendStartTime = dateMath.parse(endTime)?.subtract(24, 'hours').toISOString()!; const latencyTrendDSL = filtersToDsl( filters, query, - latencyTrendStartTime, - endTime, + 0, + 166638045873223500, page, appConfigs ); diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index eabc697638..894507f959 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -121,7 +121,7 @@ export function ServiceView(props: ServiceViewProps) { Connected services - {fields.connected_services + {fields.connected_services && fields.connected_services.length ? fields.connected_services .map((service: string) => ( diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 83074e49d3..216c4e3a67 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -177,7 +177,7 @@ export const getSpanDetailQuery = (traceID: string, size = 3000) => { }, { exists: { - field: 'serviceName', + field: 'process.serviceName', }, }, ], From d79bc9c768836b3ed465a18d03a4ca1b72775eb7 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 27 Oct 2022 16:19:08 -0400 Subject: [PATCH 06/67] something is broken Signed-off-by: Derek Ho --- .../components/common/filters/filter_helpers.tsx | 8 ++++---- .../components/common/helper_functions.tsx | 5 +++++ .../components/services/service_view.tsx | 2 +- .../components/traces/span_detail_table.tsx | 14 ++++++++------ .../requests/queries/traces_queries.ts | 2 +- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/public/components/trace_analytics/components/common/filters/filter_helpers.tsx b/public/components/trace_analytics/components/common/filters/filter_helpers.tsx index 1410bfea00..0786d77dd1 100644 --- a/public/components/trace_analytics/components/common/filters/filter_helpers.tsx +++ b/public/components/trace_analytics/components/common/filters/filter_helpers.tsx @@ -15,10 +15,10 @@ import React from 'react'; const getFields = (page: 'dashboard' | 'traces' | 'services' | 'app') => ({ - dashboard: ['traceGroup', 'serviceName', 'error', 'status.message', 'latency'], - traces: ['traceId', 'traceGroup', 'serviceName', 'error', 'status.message', 'latency'], - services: ['traceGroup', 'serviceName', 'error', 'status.message', 'latency'], - app: ['traceId', 'traceGroup', 'serviceName'], + dashboard: ['traceGroup', 'process.serviceName', 'error', 'status.message', 'latency'], + traces: ['traceId', 'traceGroup', 'process.serviceName', 'error', 'status.message', 'latency'], + services: ['traceGroup', 'process.serviceName', 'error', 'status.message', 'latency'], + app: ['traceId', 'traceGroup', 'process.serviceName'], }[page]); // filters will take effect and can be manually added export const getFilterFields = (page: 'dashboard' | 'traces' | 'services' | 'app') => getFields(page); diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index 7effcf5889..33bab95cc4 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -89,6 +89,11 @@ export function nanoToMilliSec(nano: number) { return nano / 1000000; } +export function microToMilliSec(nano: number) { + if (typeof nano !== 'number') return 0; + return nano / 1000; +} + export function milliToNanoSec(ms: number) { if (typeof ms !== 'number') return 0; return ms * 1000000; diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index 894507f959..9937d0f721 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -170,7 +170,7 @@ export function ServiceView(props: ServiceViewProps) { onClick={() => { setRedirect(true); props.addFilter({ - field: 'serviceName', + field: 'process.serviceName', operator: 'is', value: props.serviceName, inverted: false, diff --git a/public/components/trace_analytics/components/traces/span_detail_table.tsx b/public/components/trace_analytics/components/traces/span_detail_table.tsx index 32108b1c92..29346982ef 100644 --- a/public/components/trace_analytics/components/traces/span_detail_table.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_table.tsx @@ -11,7 +11,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { HttpSetup } from '../../../../../../../src/core/public'; import { TRACE_ANALYTICS_DATE_FORMAT } from '../../../../../common/constants/trace_analytics'; import { handleSpansRequest } from '../../requests/traces_request_handler'; -import { nanoToMilliSec, NoMatchMessage } from '../common/helper_functions'; +import { microToMilliSec, nanoToMilliSec, NoMatchMessage } from '../common/helper_functions'; interface SpanDetailTableProps { http: HttpSetup; @@ -56,7 +56,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { const columns: EuiDataGridColumn[] = [ { - id: 'spanId', + id: 'spanID', display: 'Span ID', }, { @@ -64,7 +64,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { display: 'Parent span ID', }, { - id: 'traceId', + id: 'traceID', display: 'Trace ID', }, { @@ -72,15 +72,15 @@ export function SpanDetailTable(props: SpanDetailTableProps) { display: 'Trace group', }, { - id: 'serviceName', + id: 'process.serviceName', display: 'Service', }, { - id: 'name', + id: 'operationName', display: 'Operation', }, { - id: 'durationInNanos', + id: 'duration', display: 'Duration', }, { @@ -114,6 +114,8 @@ export function SpanDetailTable(props: SpanDetailTableProps) { return props.openFlyout(value)}>{value}; case 'durationInNanos': return `${_.round(nanoToMilliSec(Math.max(0, value)), 2)} ms`; + case 'duration': + return `${_.round(microToMilliSec(Math.max(0, value)), 2)} ms`; case 'startTime': case 'endTime': return moment(value).format(TRACE_ANALYTICS_DATE_FORMAT); diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 216c4e3a67..a35f7e27cc 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -195,7 +195,7 @@ export const getSpanDetailQuery = (traceID: string, size = 3000) => { ], _source: { includes: [ - 'serviceName', + 'process.serviceName', 'name', 'startTime', 'endTime', From 29b85523028a0015704335eb5e7b1ba27cce4cd2 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 27 Oct 2022 17:32:43 -0400 Subject: [PATCH 07/67] get time working on traces query Signed-off-by: Derek Ho --- .../components/services/services_table.tsx | 2 +- .../requests/queries/services_queries.ts | 2 +- .../requests/queries/traces_queries.ts | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/public/components/trace_analytics/components/services/services_table.tsx b/public/components/trace_analytics/components/services/services_table.tsx index d294f13ef4..2e6eef9c1a 100644 --- a/public/components/trace_analytics/components/services/services_table.tsx +++ b/public/components/trace_analytics/components/services/services_table.tsx @@ -123,7 +123,7 @@ export function ServicesTable(props: ServicesTableProps) { onClick={() => { setRedirect(true); addFilter({ - field: 'serviceName', + field: 'process.serviceName', operator: 'is', value: row.name, inverted: false, diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 5451980400..5ce524606d 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -82,7 +82,7 @@ export const getRelatedServicesQuery = (serviceName: string) => { aggs: { all_services: { terms: { - field: 'porcess.serviceName', + field: 'process.serviceName', size: 10000, }, }, diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index a35f7e27cc..eb3afc3e84 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -98,7 +98,16 @@ export const getTracesQuery = (traceID: string = '', sort?: PropertySort) => { }, last_updated: { max: { - field: 'traceGroupFields.endTime', + script: { + source: ` + if (doc.containsKey('startTime') && !doc['startTime'].empty && doc.containsKey('duration') && !doc['duration'].empty) { + return (Math.round(doc['duration'].value) + Math.round(doc['startTime'].value)) / 1000.0 + } + + return 0 + `, + lang: 'painless', + }, }, }, }, From 7bf63748e420a323ca8f054d0ce1c4951795217d Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 27 Oct 2022 17:51:53 -0400 Subject: [PATCH 08/67] last commit for today Signed-off-by: Derek Ho --- .../trace_analytics/components/traces/span_detail_table.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/components/trace_analytics/components/traces/span_detail_table.tsx b/public/components/trace_analytics/components/traces/span_detail_table.tsx index 29346982ef..90807cf3af 100644 --- a/public/components/trace_analytics/components/traces/span_detail_table.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_table.tsx @@ -118,7 +118,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { return `${_.round(microToMilliSec(Math.max(0, value)), 2)} ms`; case 'startTime': case 'endTime': - return moment(value).format(TRACE_ANALYTICS_DATE_FORMAT); + return moment(_.round(microToMilliSec(Math.max(0, value)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT); case 'status.code': return value === 2 ? ( From 75fd5f527a3fb22c0c602438a2fffa66f8f2e0e8 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 27 Oct 2022 18:11:25 -0400 Subject: [PATCH 09/67] done for today for real Signed-off-by: Derek Ho --- .../components/traces/span_detail_table.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/public/components/trace_analytics/components/traces/span_detail_table.tsx b/public/components/trace_analytics/components/traces/span_detail_table.tsx index 90807cf3af..e1c3d992ca 100644 --- a/public/components/trace_analytics/components/traces/span_detail_table.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_table.tsx @@ -72,7 +72,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { display: 'Trace group', }, { - id: 'process.serviceName', + id: 'process', display: 'Service', }, { @@ -88,7 +88,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { display: 'Start time', }, { - id: 'endTime', + id: 'startTime', display: 'End time', }, { @@ -110,15 +110,18 @@ export function SpanDetailTable(props: SpanDetailTableProps) { const value = items[adjustedRowIndex][columnId]; if (value == null || value === '') return '-'; switch (columnId) { - case 'spanId': + case 'process': + return value["serviceName"] + case 'spanID': return props.openFlyout(value)}>{value}; case 'durationInNanos': return `${_.round(nanoToMilliSec(Math.max(0, value)), 2)} ms`; case 'duration': return `${_.round(microToMilliSec(Math.max(0, value)), 2)} ms`; case 'startTime': - case 'endTime': return moment(_.round(microToMilliSec(Math.max(0, value)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT); + case 'endTime': + return moment(_.round(microToMilliSec(Math.max(0, value + items[adjustedRowIndex["duration"]])), 2)).format(TRACE_ANALYTICS_DATE_FORMAT); case 'status.code': return value === 2 ? ( From 0d6a4be0447946b6cd6c5331c50dab2c2203756b Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 28 Oct 2022 10:40:43 -0400 Subject: [PATCH 10/67] fix date filter Signed-off-by: Derek Ho --- .../components/flyout_components/service_detail_flyout.tsx | 4 ++-- .../trace_analytics/components/common/helper_functions.tsx | 6 ++++++ .../components/dashboard/dashboard_content.tsx | 5 +++-- .../trace_analytics/components/services/service_view.tsx | 4 ++-- .../components/services/services_content.tsx | 4 ++-- .../trace_analytics/components/traces/traces_content.tsx | 6 +++--- 6 files changed, 18 insertions(+), 11 deletions(-) diff --git a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx index b17ffb5b32..2e762af433 100644 --- a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx @@ -19,7 +19,7 @@ import { handleServiceMapRequest, handleServiceViewRequest, } from '../../../../../public/components/trace_analytics/requests/services_request_handler'; -import { filtersToDsl } from '../../../../../public/components/trace_analytics/components/common/helper_functions'; +import { filtersToDsl, processTimeStamp } from '../../../../../public/components/trace_analytics/components/common/helper_functions'; import { ServiceMap } from '../../../../../public/components/trace_analytics/components/services'; import { ServiceObject } from '../../../../../public/components/trace_analytics/components/common/plots/service_map'; import { SpanDetailTable } from '../../../../../public/components/trace_analytics/components/traces/span_detail_table'; @@ -116,7 +116,7 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { }, [serviceName, fields, serviceMap, DSL, serviceMapIdSelected]); useEffect(() => { - const serviceDSL = filtersToDsl(filters, query, 0, 166638045873223500, 'app', appConfigs); + const serviceDSL = filtersToDsl(filters, query, processTimeStamp(startTime), processTimeStamp(endTime), 'app', appConfigs); handleServiceViewRequest(serviceName, http, serviceDSL, setFields); handleServiceMapRequest(http, serviceDSL, setServiceMap, serviceName); const spanDSL = filtersToDsl(filters, query, startTime, endTime, 'app', appConfigs); diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index 33bab95cc4..48e02edf8e 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -73,6 +73,12 @@ export function MissingConfigurationMessage() { ); } +export function processTimeStamp(time: string) { + const timeMoment = dateMath.parse(time)!; + return timeMoment.unix() * 1000000; + +} + export function renderBenchmark(value: number) { if (typeof value !== 'number') return null; const benchmarkColor = value === 0 ? '#9ea8a9' : value > 0 ? '#c23f25' : '#3f7e23'; diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 8c623c0ea0..519a1c1e13 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -22,6 +22,7 @@ import { milliToNanoSec, minFixedInterval, MissingConfigurationMessage, + processTimeStamp, } from '../common/helper_functions'; import { ErrorRatePlt } from '../common/plots/error_rate_plt'; import { ServiceMap, ServiceObject } from '../common/plots/service_map'; @@ -86,8 +87,8 @@ export function DashboardContent(props: DashboardProps) { const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query, 0, 166638045873223500, page, appConfigs); - const timeFilterDSL = filtersToDsl([], '', 0, 166638045873223500, page, appConfigs); + const DSL = filtersToDsl(filters, query, processTimeStamp(startTime), processTimeStamp(endTime), page, appConfigs); + const timeFilterDSL = filtersToDsl([], '',processTimeStamp(startTime), processTimeStamp(endTime), page, appConfigs); const latencyTrendStartTime = dateMath.parse(endTime)?.subtract(24, 'hours').toISOString()!; const latencyTrendDSL = filtersToDsl( filters, diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index 9937d0f721..8790f30d12 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -26,7 +26,7 @@ import { handleServiceViewRequest, } from '../../requests/services_request_handler'; import { FilterType } from '../common/filters/filters'; -import { filtersToDsl, PanelTitle } from '../common/helper_functions'; +import { filtersToDsl, PanelTitle, processTimeStamp } from '../common/helper_functions'; import { ServiceMap, ServiceObject } from '../common/plots/service_map'; import { renderDatePicker, SearchBarProps } from '../common/search_bar'; import { SpanDetailFlyout } from '../traces/span_detail_flyout'; @@ -46,7 +46,7 @@ export function ServiceView(props: ServiceViewProps) { const [redirect, setRedirect] = useState(false); const refresh = () => { - const DSL = filtersToDsl(props.filters, props.query, 0, 166638045873223500); + const DSL = filtersToDsl(props.filters, props.query,processTimeStamp(props.startTime), processTimeStamp(props.endTime)); handleServiceViewRequest(props.serviceName, props.http, DSL, setFields); handleServiceMapRequest(props.http, DSL, setServiceMap, props.serviceName); }; diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index 12c1b07c9e..4fa7febbfd 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -13,7 +13,7 @@ import { } from '../../requests/services_request_handler'; import { FilterType } from '../common/filters/filters'; import { getValidFilterFields } from '../common/filters/filter_helpers'; -import { filtersToDsl } from '../common/helper_functions'; +import { filtersToDsl, processTimeStamp } from '../common/helper_functions'; import { ServiceMap, ServiceObject } from '../common/plots/service_map'; import { SearchBar } from '../common/search_bar'; import { ServicesProps } from './services'; @@ -74,7 +74,7 @@ export function ServicesContent(props: ServicesProps) { const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query, 0, 166638045873223500, page, appConfigs); + const DSL = filtersToDsl(filters, query,processTimeStamp(startTime), processTimeStamp(endTime), page, appConfigs); // service map should not be filtered by service name const serviceMapDSL = _.cloneDeep(DSL); serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index 72d2ed6ff5..3e39533ff7 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -8,7 +8,7 @@ import { EuiSpacer, PropertySort } from '@elastic/eui'; import React, { useEffect, useState } from 'react'; import { handleTracesRequest } from '../../requests/traces_request_handler'; import { getValidFilterFields } from '../common/filters/filter_helpers'; -import { filtersToDsl } from '../common/helper_functions'; +import { filtersToDsl, processTimeStamp } from '../common/helper_functions'; import { SearchBar } from '../common/search_bar'; import { TracesProps } from './traces'; import { TracesTable } from './traces_table'; @@ -54,8 +54,8 @@ export function TracesContent(props: TracesProps) { const refresh = async (sort?: PropertySort) => { setLoading(true); - const DSL = filtersToDsl(filters, query, 0, 166638045873223500, page, appConfigs); - const timeFilterDSL = filtersToDsl([], '', 0, 166638045873223500, page); + const DSL = filtersToDsl(filters, query, processTimeStamp(startTime), processTimeStamp(endTime), page, appConfigs); + const timeFilterDSL = filtersToDsl([], '', processTimeStamp(startTime), processTimeStamp(endTime), page); await handleTracesRequest(http, DSL, timeFilterDSL, tableItems, setTableItems, sort); setLoading(false); }; From 58d108843ff0a4dc9ed2c7fdd4c0d7d4271c584d Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 28 Oct 2022 12:13:58 -0400 Subject: [PATCH 11/67] trying to fix span table Signed-off-by: Derek Ho --- .../trace_analytics/components/services/service_view.tsx | 4 ++-- .../components/traces/span_detail_panel.tsx | 7 ++++++- .../trace_analytics/components/traces/trace_view.tsx | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index 8790f30d12..8af611757f 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -227,10 +227,10 @@ export function ServiceView(props: ServiceViewProps) { }; useEffect(() => { - const spanDSL = filtersToDsl(props.filters, props.query, props.startTime, props.endTime); + const spanDSL = filtersToDsl(props.filters, props.query, processTimeStamp(props.startTime), processTimeStamp(props.endTime)); spanDSL.query.bool.must.push({ term: { - serviceName: props.serviceName, + "process.serviceName": props.serviceName, }, }); spanFilters.map(({ field, value }) => { diff --git a/public/components/trace_analytics/components/traces/span_detail_panel.tsx b/public/components/trace_analytics/components/traces/span_detail_panel.tsx index 466a12b428..062bc2a969 100644 --- a/public/components/trace_analytics/components/traces/span_detail_panel.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_panel.tsx @@ -31,6 +31,7 @@ export function SpanDetailPanel(props: { data?: { gantt: any[]; table: any[]; ganttMaxX: number }; setData?: (data: { gantt: any[]; table: any[]; ganttMaxX: number }) => void; }) { + console.log(props.traceId); const storedFilters = sessionStorage.getItem('TraceAnalyticsSpanFilters'); const fromApp = props.page === 'app'; const [spanFilters, setSpanFilters] = useState>( @@ -81,6 +82,10 @@ export function SpanDetailPanel(props: { handleSpansGanttRequest(props.traceId, props.http, setData, props.colorMap, refreshDSL); }, 150); + useEffect(() => { + console.log("dsl", JSON.stringify(DSL)); + }, [DSL]) + const spanFiltersToDSL = () => { const spanDSL: any = { query: { @@ -88,7 +93,7 @@ export function SpanDetailPanel(props: { must: [ { term: { - traceId: props.traceId, + traceID: props.traceId, }, }, ], diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index e839a87ecf..2fae06ab2b 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -27,7 +27,7 @@ import { handleServicesPieChartRequest, handleTraceViewRequest, } from '../../requests/traces_request_handler'; -import { filtersToDsl, PanelTitle } from '../common/helper_functions'; +import { filtersToDsl, PanelTitle, processTimeStamp } from '../common/helper_functions'; import { ServiceMap, ServiceObject } from '../common/plots/service_map'; import { ServiceBreakdownPanel } from './service_breakdown_panel'; import { SpanDetailPanel } from './span_detail_panel'; @@ -146,7 +146,7 @@ export function TraceView(props: TraceViewProps) { >('latency'); const refresh = async () => { - const DSL = filtersToDsl([], '', 'now', 'now', page); + const DSL = filtersToDsl([], '', processTimeStamp('now'), processTimeStamp('now'), page); handleTraceViewRequest(props.traceId, props.http, fields, setFields); handlePayloadRequest(props.traceId, props.http, payloadData, setPayloadData); handleServicesPieChartRequest(props.traceId, props.http, setServiceBreakdownData, setColorMap); From 5abd7d303b97f3a9da3dbabf152ce3092e9f7eaf Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Mon, 31 Oct 2022 13:43:17 -0400 Subject: [PATCH 12/67] save work Signed-off-by: Derek Ho --- .../trace_analytics/components/traces/span_detail_panel.tsx | 3 +-- .../trace_analytics/components/traces/trace_view.tsx | 2 +- .../trace_analytics/requests/queries/services_queries.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/components/trace_analytics/components/traces/span_detail_panel.tsx b/public/components/trace_analytics/components/traces/span_detail_panel.tsx index 062bc2a969..6272b77445 100644 --- a/public/components/trace_analytics/components/traces/span_detail_panel.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_panel.tsx @@ -31,7 +31,6 @@ export function SpanDetailPanel(props: { data?: { gantt: any[]; table: any[]; ganttMaxX: number }; setData?: (data: { gantt: any[]; table: any[]; ganttMaxX: number }) => void; }) { - console.log(props.traceId); const storedFilters = sessionStorage.getItem('TraceAnalyticsSpanFilters'); const fromApp = props.page === 'app'; const [spanFilters, setSpanFilters] = useState>( @@ -209,7 +208,7 @@ export function SpanDetailPanel(props: { () => ( { if (fromApp) { diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index 2fae06ab2b..2247cdada0 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -146,7 +146,7 @@ export function TraceView(props: TraceViewProps) { >('latency'); const refresh = async () => { - const DSL = filtersToDsl([], '', processTimeStamp('now'), processTimeStamp('now'), page); + const DSL = filtersToDsl([], '', "now", "now", page); handleTraceViewRequest(props.traceId, props.http, fields, setFields); handlePayloadRequest(props.traceId, props.http, payloadData, setPayloadData); handleServicesPieChartRequest(props.traceId, props.http, setServiceBreakdownData, setColorMap); diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 5ce524606d..12972050b7 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -296,7 +296,7 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se error_count: { filter: { term: { - 'status.code': '2', + 'tag.error': true, }, }, }, From 5a99cb461bebf9d9a17c6ad0403ee15f8d8b8389 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 3 Nov 2022 10:26:13 -0400 Subject: [PATCH 13/67] mostly fix trace page Signed-off-by: Derek Ho --- .../components/traces/span_detail_panel.tsx | 4 ---- .../requests/queries/services_queries.ts | 2 +- .../requests/queries/traces_queries.ts | 12 ++++++------ .../requests/traces_request_handler.ts | 16 ++++++++-------- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/public/components/trace_analytics/components/traces/span_detail_panel.tsx b/public/components/trace_analytics/components/traces/span_detail_panel.tsx index 6272b77445..afecb32481 100644 --- a/public/components/trace_analytics/components/traces/span_detail_panel.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_panel.tsx @@ -81,10 +81,6 @@ export function SpanDetailPanel(props: { handleSpansGanttRequest(props.traceId, props.http, setData, props.colorMap, refreshDSL); }, 150); - useEffect(() => { - console.log("dsl", JSON.stringify(DSL)); - }, [DSL]) - const spanFiltersToDSL = () => { const spanDSL: any = { query: { diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 12972050b7..5c0294b563 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -122,7 +122,7 @@ export const getServiceNodesQuery = () => { aggs: { service_name: { terms: { - field: 'serviceName', + field: 'process.serviceName', size: SERVICE_MAP_MAX_NODES, }, aggs: { diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index eb3afc3e84..1d51f94ada 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -144,7 +144,7 @@ export const getServiceBreakdownQuery = (traceID: string) => { aggs: { service_type: { terms: { - field: 'serviceName', + field: 'process.serviceName', order: [ { total_latency_nanos: 'desc', @@ -154,7 +154,7 @@ export const getServiceBreakdownQuery = (traceID: string) => { aggs: { total_latency_nanos: { sum: { - field: 'durationInNanos', + field: 'duration', }, }, total_latency: { @@ -163,7 +163,7 @@ export const getServiceBreakdownQuery = (traceID: string) => { count: '_count', latency: 'total_latency_nanos.value', }, - script: 'Math.round(params.latency / 10000) / 100.0', + script: 'Math.round(params.latency / 10) / 100.0', }, }, }, @@ -205,12 +205,12 @@ export const getSpanDetailQuery = (traceID: string, size = 3000) => { _source: { includes: [ 'process.serviceName', - 'name', + 'operationName', 'startTime', 'endTime', 'spanID', - 'status.code', - 'durationInNanos', + 'tag.error', + 'duration', ], }, }; diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index 8766808658..325762eb69 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -10,7 +10,7 @@ import moment from 'moment'; import { v1 as uuid } from 'uuid'; import { HttpSetup } from '../../../../../../src/core/public'; import { TRACE_ANALYTICS_DATE_FORMAT } from '../../../../common/constants/trace_analytics'; -import { nanoToMilliSec } from '../components/common/helper_functions'; +import { microToMilliSec, nanoToMilliSec } from '../components/common/helper_functions'; import { SpanSearchParams } from '../components/traces/span_detail_table'; import { getPayloadQuery, @@ -213,21 +213,21 @@ const hitsToSpanDetailData = async (hits: any, colorMap: any) => { }; if (hits.length === 0) return data; - const minStartTime = nanoToMilliSec(hits[hits.length - 1].sort[0]); + const minStartTime = microToMilliSec(hits[hits.length - 1].sort[0]); let maxEndTime = 0; hits.forEach((hit: any) => { - const startTime = nanoToMilliSec(hit.sort[0]) - minStartTime; - const duration = _.round(nanoToMilliSec(hit._source.durationInNanos), 2); - const serviceName = _.get(hit, ['_source', 'serviceName']); - const name = _.get(hit, '_source.name'); - const error = hit._source['status.code'] === 2 ? ' \u26a0 Error' : ''; + const startTime = microToMilliSec(hit.sort[0]) - minStartTime; + const duration = _.round(microToMilliSec(hit._source.duration), 2); + const serviceName = _.get(hit, ['_source', 'process'])['serviceName']; + const name = _.get(hit, '_source.operationName'); + const error = hit._source['tag.error'] === true ? ' \u26a0 Error' : ''; const uniqueLabel = `${serviceName}
${name} ` + uuid(); maxEndTime = Math.max(maxEndTime, startTime + duration); data.table.push({ service_name: serviceName, - span_id: hit._source.spanId, + span_id: hit._source.spanID, latency: duration, vs_benchmark: 0, error, From 2cb7d9fc8acd809078d3e58ef971643c40a59592 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 3 Nov 2022 11:03:51 -0400 Subject: [PATCH 14/67] services working and traces working Signed-off-by: Derek Ho --- .../trace_analytics/requests/queries/services_queries.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 5c0294b563..12972050b7 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -122,7 +122,7 @@ export const getServiceNodesQuery = () => { aggs: { service_name: { terms: { - field: 'process.serviceName', + field: 'serviceName', size: SERVICE_MAP_MAX_NODES, }, aggs: { From 555319ba26cff0dacdfad986fd71a4e70df55b42 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 3 Nov 2022 11:37:26 -0400 Subject: [PATCH 15/67] fix some more stuff Signed-off-by: Derek Ho --- .../trace_analytics/components/common/plots/service_map.tsx | 2 +- .../trace_analytics/components/traces/trace_view.tsx | 4 +++- public/components/trace_analytics/home.tsx | 1 + .../trace_analytics/requests/queries/dashboard_queries.ts | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/public/components/trace_analytics/components/common/plots/service_map.tsx b/public/components/trace_analytics/components/common/plots/service_map.tsx index a636049682..d3fa9f6421 100644 --- a/public/components/trace_analytics/components/common/plots/service_map.tsx +++ b/public/components/trace_analytics/components/common/plots/service_map.tsx @@ -124,7 +124,7 @@ export function ServiceMap({ const serviceName = items?.graph.nodes.find((node: any) => node.id === nodes[0])?.label; if (serviceName) { addFilter({ - field: 'serviceName', + field: 'process.serviceName', operator: 'is', value: serviceName, inverted: false, diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index 2247cdada0..7d8b22e977 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -34,6 +34,8 @@ import { SpanDetailPanel } from './span_detail_panel'; interface TraceViewProps extends TraceAnalyticsCoreDeps { traceId: string; + startTime: string; + endTime: string; } export function TraceView(props: TraceViewProps) { @@ -146,7 +148,7 @@ export function TraceView(props: TraceViewProps) { >('latency'); const refresh = async () => { - const DSL = filtersToDsl([], '', "now", "now", page); + const DSL = filtersToDsl([], '', processTimeStamp(props.startTime), processTimeStamp(props.endTime), page); handleTraceViewRequest(props.traceId, props.http, fields, setFields); handlePayloadRequest(props.traceId, props.http, payloadData, setPayloadData); handleServicesPieChartRequest(props.traceId, props.http, setServiceBreakdownData, setColorMap); diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index ab04874366..7e3baf24a0 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -157,6 +157,7 @@ export const Home = (props: HomeProps) => { chrome={props.chrome} http={props.http} traceId={decodeURIComponent(routerProps.match.params.id)} + {...commonProps} /> )} /> diff --git a/public/components/trace_analytics/requests/queries/dashboard_queries.ts b/public/components/trace_analytics/requests/queries/dashboard_queries.ts index bdc9111ac1..09067d9f97 100644 --- a/public/components/trace_analytics/requests/queries/dashboard_queries.ts +++ b/public/components/trace_analytics/requests/queries/dashboard_queries.ts @@ -275,7 +275,7 @@ export const getDashboardThroughputPltQuery = (fixedInterval) => { aggs: { trace_count: { cardinality: { - field: 'traceId', + field: 'traceID', }, }, }, From b848af98c9775f5616096254d669a9f1c42aea34 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 3 Nov 2022 12:16:54 -0400 Subject: [PATCH 16/67] fix error shown on span detail chart Signed-off-by: Derek Ho --- .../trace_analytics/requests/queries/traces_queries.ts | 2 +- .../trace_analytics/requests/traces_request_handler.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 1d51f94ada..1a1ba1c64a 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -209,7 +209,7 @@ export const getSpanDetailQuery = (traceID: string, size = 3000) => { 'startTime', 'endTime', 'spanID', - 'tag.error', + 'tag', 'duration', ], }, diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index 325762eb69..ce09188834 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -221,7 +221,7 @@ const hitsToSpanDetailData = async (hits: any, colorMap: any) => { const duration = _.round(microToMilliSec(hit._source.duration), 2); const serviceName = _.get(hit, ['_source', 'process'])['serviceName']; const name = _.get(hit, '_source.operationName'); - const error = hit._source['tag.error'] === true ? ' \u26a0 Error' : ''; + const error = hit._source['tag']['error'] === true ? ' \u26a0 Error' : ''; const uniqueLabel = `${serviceName}
${name} ` + uuid(); maxEndTime = Math.max(maxEndTime, startTime + duration); From 283fd1d0cdd337a8df44f4a2160cd61615ebe97f Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Tue, 29 Nov 2022 21:03:38 -0500 Subject: [PATCH 17/67] fix Signed-off-by: Derek Ho --- .../flyout_components/service_detail_flyout.tsx | 3 ++- .../components/common/helper_functions.tsx | 15 ++++++++++----- .../components/dashboard/dashboard_content.tsx | 5 +++-- .../components/services/service_view.tsx | 5 +++-- .../components/services/services_content.tsx | 3 ++- .../components/traces/trace_view.tsx | 3 ++- .../components/traces/traces_content.tsx | 5 +++-- .../requests/queries/services_queries.ts | 6 ++++-- 8 files changed, 29 insertions(+), 16 deletions(-) diff --git a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx index 2e762af433..54de457916 100644 --- a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx @@ -25,6 +25,7 @@ import { ServiceObject } from '../../../../../public/components/trace_analytics/ import { SpanDetailTable } from '../../../../../public/components/trace_analytics/components/traces/span_detail_table'; import { TraceAnalyticsComponentDeps } from '../../../../../public/components/trace_analytics/home'; import { getListItem } from '../../helpers/utils'; +import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; interface ServiceFlyoutProps extends TraceAnalyticsComponentDeps { serviceName: string; @@ -116,7 +117,7 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { }, [serviceName, fields, serviceMap, DSL, serviceMapIdSelected]); useEffect(() => { - const serviceDSL = filtersToDsl(filters, query, processTimeStamp(startTime), processTimeStamp(endTime), 'app', appConfigs); + const serviceDSL = filtersToDsl(filters, query, processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), 'app', appConfigs); handleServiceViewRequest(serviceName, http, serviceDSL, setFields); handleServiceMapRequest(http, serviceDSL, setServiceMap, serviceName); const spanDSL = filtersToDsl(filters, query, startTime, endTime, 'app', appConfigs); diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index 48e02edf8e..172271b07b 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -10,9 +10,12 @@ import { SpacerSize } from '@elastic/eui/src/components/spacer/spacer'; import { isEmpty, round } from 'lodash'; import React from 'react'; import { + USE_JAEGER, DATA_PREPPER_INDEX_NAME, DATA_PREPPER_SERVICE_INDEX_NAME, TRACE_ANALYTICS_DOCUMENTATION_LINK, + JAEGER_INDEX_NAME, + JAEGER_SERVICE_INDEX_NAME, } from '../../../../../common/constants/trace_analytics'; import { uiSettingsService } from '../../../../../common/utils'; import { serviceMapColorPalette } from './color_palette'; @@ -55,7 +58,7 @@ export function MissingConfigurationMessage() { title={

Trace Analytics not set up

} body={ - {`The indices required for trace analytics (${DATA_PREPPER_INDEX_NAME} and ${DATA_PREPPER_SERVICE_INDEX_NAME}) do not exist or you do not have permission to access them.`} + {`The indices required for trace analytics (${USE_JAEGER ? JAEGER_INDEX_NAME : DATA_PREPPER_INDEX_NAME} and ${USE_JAEGER ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME}) do not exist or you do not have permission to access them.`} } actions={ @@ -73,10 +76,12 @@ export function MissingConfigurationMessage() { ); } -export function processTimeStamp(time: string) { - const timeMoment = dateMath.parse(time)!; - return timeMoment.unix() * 1000000; - +export function processTimeStamp(time: string, jaeger: boolean) { + if (jaeger) { + const timeMoment = dateMath.parse(time)!; + return timeMoment.unix() * 1000000; + } + return time; } export function renderBenchmark(value: number) { diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 519a1c1e13..87901d0452 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -6,6 +6,7 @@ import dateMath from '@elastic/datemath'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; +import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; import _ from 'lodash'; import React, { useEffect, useState } from 'react'; import { @@ -87,8 +88,8 @@ export function DashboardContent(props: DashboardProps) { const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query, processTimeStamp(startTime), processTimeStamp(endTime), page, appConfigs); - const timeFilterDSL = filtersToDsl([], '',processTimeStamp(startTime), processTimeStamp(endTime), page, appConfigs); + const DSL = filtersToDsl(filters, query, processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page, appConfigs); + const timeFilterDSL = filtersToDsl([], '',processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page, appConfigs); const latencyTrendStartTime = dateMath.parse(endTime)?.subtract(24, 'hours').toISOString()!; const latencyTrendDSL = filtersToDsl( filters, diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index 8af611757f..78425b4237 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -18,6 +18,7 @@ import { EuiText, EuiTitle, } from '@elastic/eui'; +import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; import _ from 'lodash'; import React, { useEffect, useMemo, useState } from 'react'; import { TraceAnalyticsComponentDeps } from '../../home'; @@ -46,7 +47,7 @@ export function ServiceView(props: ServiceViewProps) { const [redirect, setRedirect] = useState(false); const refresh = () => { - const DSL = filtersToDsl(props.filters, props.query,processTimeStamp(props.startTime), processTimeStamp(props.endTime)); + const DSL = filtersToDsl(props.filters, props.query,processTimeStamp(props.startTime, USE_JAEGER), processTimeStamp(props.endTime, USE_JAEGER)); handleServiceViewRequest(props.serviceName, props.http, DSL, setFields); handleServiceMapRequest(props.http, DSL, setServiceMap, props.serviceName); }; @@ -227,7 +228,7 @@ export function ServiceView(props: ServiceViewProps) { }; useEffect(() => { - const spanDSL = filtersToDsl(props.filters, props.query, processTimeStamp(props.startTime), processTimeStamp(props.endTime)); + const spanDSL = filtersToDsl(props.filters, props.query, processTimeStamp(props.startTime, USE_JAEGER), processTimeStamp(props.endTime, USE_JAEGER)); spanDSL.query.bool.must.push({ term: { "process.serviceName": props.serviceName, diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index 4fa7febbfd..03ea90eb70 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -5,6 +5,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { EuiSpacer } from '@elastic/eui'; +import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; import _ from 'lodash'; import React, { useEffect, useState } from 'react'; import { @@ -74,7 +75,7 @@ export function ServicesContent(props: ServicesProps) { const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query,processTimeStamp(startTime), processTimeStamp(endTime), page, appConfigs); + const DSL = filtersToDsl(filters, query,processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page, appConfigs); // service map should not be filtered by service name const serviceMapDSL = _.cloneDeep(DSL); serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index 7d8b22e977..377bb2db78 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -18,6 +18,7 @@ import { EuiText, EuiTitle, } from '@elastic/eui'; +import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; import _ from 'lodash'; import React, { useEffect, useState } from 'react'; import { TraceAnalyticsCoreDeps } from '../../home'; @@ -148,7 +149,7 @@ export function TraceView(props: TraceViewProps) { >('latency'); const refresh = async () => { - const DSL = filtersToDsl([], '', processTimeStamp(props.startTime), processTimeStamp(props.endTime), page); + const DSL = filtersToDsl([], '', processTimeStamp(props.startTime, USE_JAEGER), processTimeStamp(props.endTime, USE_JAEGER), page); handleTraceViewRequest(props.traceId, props.http, fields, setFields); handlePayloadRequest(props.traceId, props.http, payloadData, setPayloadData); handleServicesPieChartRequest(props.traceId, props.http, setServiceBreakdownData, setColorMap); diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index 3e39533ff7..87a6e69f02 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -5,6 +5,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { EuiSpacer, PropertySort } from '@elastic/eui'; +import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; import React, { useEffect, useState } from 'react'; import { handleTracesRequest } from '../../requests/traces_request_handler'; import { getValidFilterFields } from '../common/filters/filter_helpers'; @@ -54,8 +55,8 @@ export function TracesContent(props: TracesProps) { const refresh = async (sort?: PropertySort) => { setLoading(true); - const DSL = filtersToDsl(filters, query, processTimeStamp(startTime), processTimeStamp(endTime), page, appConfigs); - const timeFilterDSL = filtersToDsl([], '', processTimeStamp(startTime), processTimeStamp(endTime), page); + const DSL = filtersToDsl(filters, query, processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page, appConfigs); + const timeFilterDSL = filtersToDsl([], '', processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page); await handleTracesRequest(http, DSL, timeFilterDSL, tableItems, setTableItems, sort); setLoading(false); }; diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 12972050b7..552f5c6b8b 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -5,8 +5,10 @@ import { DATA_PREPPER_SERVICE_INDEX_NAME, + JAEGER_SERVICE_INDEX_NAME, SERVICE_MAP_MAX_EDGES, SERVICE_MAP_MAX_NODES, + USE_JAEGER, } from '../../../../../common/constants/trace_analytics'; import { getServiceMapTargetResources } from '../../components/common/helper_functions'; import { ServiceObject } from '../../components/common/plots/service_map'; @@ -109,7 +111,7 @@ export const getRelatedServicesQuery = (serviceName: string) => { export const getServiceNodesQuery = () => { return { - index: DATA_PREPPER_SERVICE_INDEX_NAME, + index: USE_JAEGER ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, size: 0, query: { bool: { @@ -148,7 +150,7 @@ export const getServiceNodesQuery = () => { export const getServiceEdgesQuery = (source: 'destination' | 'target') => { return { - index: DATA_PREPPER_SERVICE_INDEX_NAME, + index: USE_JAEGER ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, size: 0, query: { bool: { From 041d38f66a520adbd4c739e18bd88e13d4f0c230 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Tue, 29 Nov 2022 21:04:01 -0500 Subject: [PATCH 18/67] make general Signed-off-by: Derek Ho --- common/constants/trace_analytics.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/constants/trace_analytics.ts b/common/constants/trace_analytics.ts index 1fb828892e..116e13e9e3 100644 --- a/common/constants/trace_analytics.ts +++ b/common/constants/trace_analytics.ts @@ -3,6 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ +export const USE_JAEGER = true; +export const JAEGER_INDEX_NAME = '*jaeger-span-*'; +export const JAEGER_SERVICE_INDEX_NAME = '*jaeger-service*'; export const DATA_PREPPER_INDEX_NAME = '*jaeger-span-*'; export const DATA_PREPPER_SERVICE_INDEX_NAME = '*jaeger-service*'; export const TRACE_ANALYTICS_DATE_FORMAT = 'MM/DD/YYYY HH:mm:ss'; From 676f0820dd545c19ea05dc8a2acfa9780bf3c04f Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 8 Dec 2022 10:06:39 -0500 Subject: [PATCH 19/67] make everything more general and get traces and services top level pages to work with this framework Signed-off-by: Derek Ho --- common/constants/trace_analytics.ts | 8 ++--- .../service_detail_flyout.tsx | 8 ++--- .../components/common/helper_functions.tsx | 8 ++--- .../dashboard/dashboard_content.tsx | 14 ++++---- .../components/services/service_view.tsx | 10 +++--- .../components/services/services_content.tsx | 14 ++++---- .../components/services/services_table.tsx | 7 ++-- .../components/traces/trace_view.tsx | 8 ++--- .../components/traces/traces_content.tsx | 14 ++++---- .../components/traces/traces_table.tsx | 7 ++-- public/components/trace_analytics/home.tsx | 31 +++++++++++++---- .../requests/queries/services_queries.ts | 10 +++--- .../requests/request_handler.ts | 30 ++++++++++++---- .../requests/services_request_handler.ts | 29 +++++++++------- .../requests/traces_request_handler.ts | 14 +++++--- server/routes/trace_analytics_dsl_router.ts | 34 +++++++++++++++++-- 16 files changed, 160 insertions(+), 86 deletions(-) diff --git a/common/constants/trace_analytics.ts b/common/constants/trace_analytics.ts index 116e13e9e3..cce82380bb 100644 --- a/common/constants/trace_analytics.ts +++ b/common/constants/trace_analytics.ts @@ -3,11 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -export const USE_JAEGER = true; export const JAEGER_INDEX_NAME = '*jaeger-span-*'; export const JAEGER_SERVICE_INDEX_NAME = '*jaeger-service*'; -export const DATA_PREPPER_INDEX_NAME = '*jaeger-span-*'; -export const DATA_PREPPER_SERVICE_INDEX_NAME = '*jaeger-service*'; +export const DATA_PREPPER_INDEX_NAME = 'otel-v1-apm-span-*'; +export const DATA_PREPPER_SERVICE_INDEX_NAME = 'otel-v1-apm-service-map*'; export const TRACE_ANALYTICS_DATE_FORMAT = 'MM/DD/YYYY HH:mm:ss'; export const TRACE_ANALYTICS_PLOTS_DATE_FORMAT = 'MMM D, YYYY HH:mm:ss'; export const SERVICE_MAP_MAX_NODES = 500; @@ -16,5 +15,6 @@ export const SERVICE_MAP_MAX_EDGES = 1000; export const TRACES_MAX_NUM = 3000; export const TRACE_ANALYTICS_DOCUMENTATION_LINK = 'https://opensearch.org/docs/latest/observability-plugin/trace/index/'; -export const TRACE_ANALYTICS_INDICES_ROUTE = '/api/observability/trace_analytics/indices'; +export const TRACE_ANALYTICS_JAEGER_INDICES_ROUTE = '/api/observability/trace_analytics/jaegerindices'; +export const TRACE_ANALYTICS_DATA_PREPPER_INDICES_ROUTE = '/api/observability/trace_analytics/data_prepper_indices'; export const TRACE_ANALYTICS_DSL_ROUTE = '/api/observability/trace_analytics/query'; diff --git a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx index 54de457916..3c4b11a60b 100644 --- a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx @@ -25,7 +25,6 @@ import { ServiceObject } from '../../../../../public/components/trace_analytics/ import { SpanDetailTable } from '../../../../../public/components/trace_analytics/components/traces/span_detail_table'; import { TraceAnalyticsComponentDeps } from '../../../../../public/components/trace_analytics/home'; import { getListItem } from '../../helpers/utils'; -import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; interface ServiceFlyoutProps extends TraceAnalyticsComponentDeps { serviceName: string; @@ -45,6 +44,7 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { query, closeServiceFlyout, openSpanFlyout, + mode, } = props; const [fields, setFields] = useState({}); const [serviceMap, setServiceMap] = useState({}); @@ -117,9 +117,9 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { }, [serviceName, fields, serviceMap, DSL, serviceMapIdSelected]); useEffect(() => { - const serviceDSL = filtersToDsl(filters, query, processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), 'app', appConfigs); - handleServiceViewRequest(serviceName, http, serviceDSL, setFields); - handleServiceMapRequest(http, serviceDSL, setServiceMap, serviceName); + const serviceDSL = filtersToDsl(filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), 'app', appConfigs); + handleServiceViewRequest(serviceName, http, serviceDSL, setFields, mode); + handleServiceMapRequest(http, serviceDSL, mode, setServiceMap, serviceName); const spanDSL = filtersToDsl(filters, query, startTime, endTime, 'app', appConfigs); spanDSL.query.bool.must.push({ term: { diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index 172271b07b..eb39eec6d9 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -10,7 +10,6 @@ import { SpacerSize } from '@elastic/eui/src/components/spacer/spacer'; import { isEmpty, round } from 'lodash'; import React from 'react'; import { - USE_JAEGER, DATA_PREPPER_INDEX_NAME, DATA_PREPPER_SERVICE_INDEX_NAME, TRACE_ANALYTICS_DOCUMENTATION_LINK, @@ -18,6 +17,7 @@ import { JAEGER_SERVICE_INDEX_NAME, } from '../../../../../common/constants/trace_analytics'; import { uiSettingsService } from '../../../../../common/utils'; +import { TraceAnalyticsMode } from '../../home'; import { serviceMapColorPalette } from './color_palette'; import { FilterType } from './filters/filters'; import { ServiceObject } from './plots/service_map'; @@ -58,7 +58,7 @@ export function MissingConfigurationMessage() { title={

Trace Analytics not set up

} body={ - {`The indices required for trace analytics (${USE_JAEGER ? JAEGER_INDEX_NAME : DATA_PREPPER_INDEX_NAME} and ${USE_JAEGER ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME}) do not exist or you do not have permission to access them.`} + {`The indices required for trace analytics (${JAEGER_INDEX_NAME} and ${JAEGER_SERVICE_INDEX_NAME} or ${DATA_PREPPER_INDEX_NAME} and ${DATA_PREPPER_SERVICE_INDEX_NAME}) do not exist or you do not have permission to access them.`} } actions={ @@ -76,8 +76,8 @@ export function MissingConfigurationMessage() { ); } -export function processTimeStamp(time: string, jaeger: boolean) { - if (jaeger) { +export function processTimeStamp(time: string, mode: TraceAnalyticsMode) { + if (mode === TraceAnalyticsMode.Jaeger) { const timeMoment = dateMath.parse(time)!; return timeMoment.unix() * 1000000; } diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 87901d0452..fca0d187a1 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -6,7 +6,6 @@ import dateMath from '@elastic/datemath'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; import _ from 'lodash'; import React, { useEffect, useState } from 'react'; import { @@ -31,6 +30,7 @@ import { ThroughputPlt } from '../common/plots/throughput_plt'; import { SearchBar } from '../common/search_bar'; import { DashboardProps } from './dashboard'; import { DashboardTable } from './dashboard_table'; +import { TraceAnalyticsMode } from '../../home'; export function DashboardContent(props: DashboardProps) { const { @@ -44,7 +44,7 @@ export function DashboardContent(props: DashboardProps) { childBreadcrumbs, parentBreadcrumbs, filters, - indicesExist, + mode, setStartTime, setEndTime, setQuery, @@ -83,14 +83,14 @@ export function DashboardContent(props: DashboardProps) { } } setFilteredService(newFilteredService); - if (!redirect && indicesExist) refresh(newFilteredService); + if (!redirect && mode !== TraceAnalyticsMode.None) refresh(newFilteredService); }, [filters, startTime, endTime, appConfigs]); const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query, processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page, appConfigs); - const timeFilterDSL = filtersToDsl([], '',processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page, appConfigs); - const latencyTrendStartTime = dateMath.parse(endTime)?.subtract(24, 'hours').toISOString()!; + const DSL = filtersToDsl(filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); + const timeFilterDSL = filtersToDsl([], '',processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); + const latencyTrendStartTime = dateMath.parse(endTime, { roundUp: true })?.subtract(24, 'hours').toISOString()!; const latencyTrendDSL = filtersToDsl( filters, query, @@ -201,7 +201,7 @@ export function DashboardContent(props: DashboardProps) { page={page} /> - {indicesExist ? ( + {mode !== TraceAnalyticsMode.None ? ( <> ({}); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< @@ -47,9 +47,9 @@ export function ServiceView(props: ServiceViewProps) { const [redirect, setRedirect] = useState(false); const refresh = () => { - const DSL = filtersToDsl(props.filters, props.query,processTimeStamp(props.startTime, USE_JAEGER), processTimeStamp(props.endTime, USE_JAEGER)); - handleServiceViewRequest(props.serviceName, props.http, DSL, setFields); - handleServiceMapRequest(props.http, DSL, setServiceMap, props.serviceName); + const DSL = filtersToDsl(props.filters, props.query, processTimeStamp(props.startTime, mode), processTimeStamp(props.endTime, mode)); + handleServiceViewRequest(props.serviceName, props.http, DSL, setFields, mode); + handleServiceMapRequest(props.http, DSL, mode, setServiceMap, props.serviceName); }; useEffect(() => { @@ -228,7 +228,7 @@ export function ServiceView(props: ServiceViewProps) { }; useEffect(() => { - const spanDSL = filtersToDsl(props.filters, props.query, processTimeStamp(props.startTime, USE_JAEGER), processTimeStamp(props.endTime, USE_JAEGER)); + const spanDSL = filtersToDsl(props.filters, props.query, processTimeStamp(props.startTime, mode), processTimeStamp(props.endTime, mode)); spanDSL.query.bool.must.push({ term: { "process.serviceName": props.serviceName, diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index 03ea90eb70..160f035be8 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -5,7 +5,6 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { EuiSpacer } from '@elastic/eui'; -import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; import _ from 'lodash'; import React, { useEffect, useState } from 'react'; import { @@ -19,6 +18,7 @@ import { ServiceMap, ServiceObject } from '../common/plots/service_map'; import { SearchBar } from '../common/search_bar'; import { ServicesProps } from './services'; import { ServicesTable } from './services_table'; +import { TraceAnalyticsMode } from '../../home'; export function ServicesContent(props: ServicesProps) { const { @@ -29,7 +29,7 @@ export function ServicesContent(props: ServicesProps) { query, startTime, endTime, - indicesExist, + mode, appConfigs = [], childBreadcrumbs, parentBreadcrumbs, @@ -70,20 +70,20 @@ export function ServicesContent(props: ServicesProps) { } } setFilteredService(newFilteredService); - if (!redirect && indicesExist) refresh(newFilteredService); + if (!redirect && mode !== TraceAnalyticsMode.None) refresh(newFilteredService); }, [filters, appConfigs]); const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query,processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page, appConfigs); + const DSL = filtersToDsl(filters, query,processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); // service map should not be filtered by service name const serviceMapDSL = _.cloneDeep(DSL); serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( (must: any) => must?.term?.serviceName == null ); await Promise.all([ - handleServicesRequest(http, DSL, setTableItems), - handleServiceMapRequest(http, serviceMapDSL, setServiceMap, currService || filteredService), + handleServicesRequest(http, DSL, setTableItems, mode), + handleServiceMapRequest(http, serviceMapDSL, mode, setServiceMap, currService || filteredService), ]); setLoading(false); }; @@ -123,7 +123,7 @@ export function ServicesContent(props: ServicesProps) { items={tableItems} addFilter={addFilter} setRedirect={setRedirect} - indicesExist={indicesExist} + mode={mode} loading={loading} nameColumnAction={nameColumnAction} traceColumnAction={traceColumnAction} diff --git a/public/components/trace_analytics/components/services/services_table.tsx b/public/components/trace_analytics/components/services/services_table.tsx index 2e6eef9c1a..ddb89767a6 100644 --- a/public/components/trace_analytics/components/services/services_table.tsx +++ b/public/components/trace_analytics/components/services/services_table.tsx @@ -18,6 +18,7 @@ import { } from '@elastic/eui'; import _ from 'lodash'; import React, { useMemo } from 'react'; +import { TraceAnalyticsMode } from '../../home'; import { FilterType } from '../common/filters/filters'; import { MissingConfigurationMessage, @@ -27,7 +28,7 @@ import { interface ServicesTableProps { items: any[]; - indicesExist: boolean; + mode: TraceAnalyticsMode; loading: boolean; nameColumnAction: (item: any) => any; traceColumnAction: any; @@ -38,7 +39,7 @@ interface ServicesTableProps { export function ServicesTable(props: ServicesTableProps) { const { items, - indicesExist, + mode, loading, nameColumnAction, traceColumnAction, @@ -169,7 +170,7 @@ export function ServicesTable(props: ServicesTableProps) { }} loading={loading} /> - ) : indicesExist ? ( + ) : mode !== TraceAnalyticsMode.None ? ( ) : ( diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index 377bb2db78..6dda3d3613 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -18,7 +18,6 @@ import { EuiText, EuiTitle, } from '@elastic/eui'; -import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; import _ from 'lodash'; import React, { useEffect, useState } from 'react'; import { TraceAnalyticsCoreDeps } from '../../home'; @@ -40,6 +39,7 @@ interface TraceViewProps extends TraceAnalyticsCoreDeps { } export function TraceView(props: TraceViewProps) { + const { mode } = props; const page = 'traceView'; const renderTitle = (traceId: string) => { return ( @@ -149,11 +149,11 @@ export function TraceView(props: TraceViewProps) { >('latency'); const refresh = async () => { - const DSL = filtersToDsl([], '', processTimeStamp(props.startTime, USE_JAEGER), processTimeStamp(props.endTime, USE_JAEGER), page); - handleTraceViewRequest(props.traceId, props.http, fields, setFields); + const DSL = filtersToDsl([], '', processTimeStamp(props.startTime, mode), processTimeStamp(props.endTime, mode), page); + handleTraceViewRequest(props.traceId, props.http, fields, setFields, mode); handlePayloadRequest(props.traceId, props.http, payloadData, setPayloadData); handleServicesPieChartRequest(props.traceId, props.http, setServiceBreakdownData, setColorMap); - handleServiceMapRequest(props.http, DSL, setServiceMap); + handleServiceMapRequest(props.http, DSL, mode, setServiceMap); }; useEffect(() => { diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index 87a6e69f02..3c76c13ac7 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -5,7 +5,6 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { EuiSpacer, PropertySort } from '@elastic/eui'; -import { USE_JAEGER } from '../../../../../common/constants/trace_analytics'; import React, { useEffect, useState } from 'react'; import { handleTracesRequest } from '../../requests/traces_request_handler'; import { getValidFilterFields } from '../common/filters/filter_helpers'; @@ -13,6 +12,7 @@ import { filtersToDsl, processTimeStamp } from '../common/helper_functions'; import { SearchBar } from '../common/search_bar'; import { TracesProps } from './traces'; import { TracesTable } from './traces_table'; +import { TraceAnalyticsMode } from '../../home'; export function TracesContent(props: TracesProps) { const { @@ -24,7 +24,7 @@ export function TracesContent(props: TracesProps) { appConfigs, startTime, endTime, - indicesExist, + mode, parentBreadcrumbs, childBreadcrumbs, traceIdColumnAction, @@ -50,14 +50,14 @@ export function TracesContent(props: TracesProps) { }, []); useEffect(() => { - if (!redirect && indicesExist) refresh(); + if (!redirect && mode !== TraceAnalyticsMode.None) refresh(); }, [filters, appConfigs]); const refresh = async (sort?: PropertySort) => { setLoading(true); - const DSL = filtersToDsl(filters, query, processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page, appConfigs); - const timeFilterDSL = filtersToDsl([], '', processTimeStamp(startTime, USE_JAEGER), processTimeStamp(endTime, USE_JAEGER), page); - await handleTracesRequest(http, DSL, timeFilterDSL, tableItems, setTableItems, sort); + const DSL = filtersToDsl(filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); + const timeFilterDSL = filtersToDsl([], '', processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page); + await handleTracesRequest(http, DSL, timeFilterDSL, tableItems, setTableItems, sort, mode); setLoading(false); }; @@ -80,7 +80,7 @@ export function TracesContent(props: TracesProps) { diff --git a/public/components/trace_analytics/components/traces/traces_table.tsx b/public/components/trace_analytics/components/traces/traces_table.tsx index 40f1396067..080c108ab8 100644 --- a/public/components/trace_analytics/components/traces/traces_table.tsx +++ b/public/components/trace_analytics/components/traces/traces_table.tsx @@ -21,6 +21,7 @@ import { import _ from 'lodash'; import React, { useMemo, useState } from 'react'; import { TRACES_MAX_NUM } from '../../../../../common/constants/trace_analytics'; +import { TraceAnalyticsMode } from '../../home'; import { MissingConfigurationMessage, NoMatchMessage, @@ -30,13 +31,13 @@ import { interface TracesTableProps { items: any[]; refresh: (sort?: PropertySort) => void; - indicesExist: boolean; + mode: TraceAnalyticsMode; loading: boolean; traceIdColumnAction: any; } export function TracesTable(props: TracesTableProps) { - const { items, refresh, indicesExist, loading, traceIdColumnAction } = props; + const { items, refresh, mode, loading, traceIdColumnAction } = props; const renderTitleBar = (totalItems?: number) => { return ( @@ -207,7 +208,7 @@ export function TracesTable(props: TracesTableProps) { onTableChange={onTableChange} loading={loading} /> - ) : indicesExist ? ( + ) : mode !== TraceAnalyticsMode.None ? ( ) : ( diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index 7e3baf24a0..a4a1122188 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -3,13 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { EuiLink } from '@elastic/eui'; import React, { useEffect, useState } from 'react'; import { Route, RouteComponentProps } from 'react-router-dom'; import { ChromeBreadcrumb, ChromeStart, - CoreStart, HttpStart, } from '../../../../../src/core/public'; import { ObservabilitySideBar } from '../common/side_nav'; @@ -18,7 +16,7 @@ import { SearchBarProps } from './components/common/search_bar'; import { Dashboard } from './components/dashboard'; import { Services, ServiceView } from './components/services'; import { Traces, TraceView } from './components/traces'; -import { handleIndicesExistRequest } from './requests/request_handler'; +import { handleDataPrepperIndicesExistRequest, handleJaegerIndicesExistRequest } from './requests/request_handler'; export interface TraceAnalyticsCoreDeps { parentBreadcrumbs: ChromeBreadcrumb[]; @@ -28,12 +26,20 @@ export interface TraceAnalyticsCoreDeps { interface HomeProps extends RouteComponentProps, TraceAnalyticsCoreDeps {} +export enum TraceAnalyticsMode { + Jaeger, + Data_Prepper, + None +} + export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, SearchBarProps { - indicesExist: boolean; + mode: TraceAnalyticsMode; } export const Home = (props: HomeProps) => { - const [indicesExist, setIndicesExist] = useState(true); + const [dataPrepperIndicesExist, setDataPrepperIndicesExist] = useState(true); + const [jaegerIndicesExist, setJaegerIndicesExist] = useState(true); + const [mode, setMode] = useState(TraceAnalyticsMode.None) const storedFilters = sessionStorage.getItem('TraceAnalyticsFilters'); const [query, setQuery] = useState(sessionStorage.getItem('TraceAnalyticsQuery') || ''); const [filters, setFilters] = useState( @@ -64,9 +70,20 @@ export const Home = (props: HomeProps) => { }; useEffect(() => { - handleIndicesExistRequest(props.http, setIndicesExist); + handleDataPrepperIndicesExistRequest(props.http, setDataPrepperIndicesExist) + handleJaegerIndicesExistRequest(props.http, setJaegerIndicesExist); }, []); + useEffect(() => { + if (dataPrepperIndicesExist) { + setMode(TraceAnalyticsMode.Data_Prepper); + } else if (jaegerIndicesExist) { + setMode(TraceAnalyticsMode.Jaeger); + } else { + setMode(TraceAnalyticsMode.None); + } + }, [jaegerIndicesExist, dataPrepperIndicesExist]); + const dashboardBreadcrumbs = [ { text: 'Trace analytics', @@ -121,7 +138,7 @@ export const Home = (props: HomeProps) => { setStartTime: setStartTimeWithStorage, endTime, setEndTime: setEndTimeWithStorage, - indicesExist, + mode, }; return ( diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 552f5c6b8b..599c66e804 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -8,10 +8,10 @@ import { JAEGER_SERVICE_INDEX_NAME, SERVICE_MAP_MAX_EDGES, SERVICE_MAP_MAX_NODES, - USE_JAEGER, } from '../../../../../common/constants/trace_analytics'; import { getServiceMapTargetResources } from '../../components/common/helper_functions'; import { ServiceObject } from '../../components/common/plots/service_map'; +import { TraceAnalyticsMode } from '../../home'; export const getServicesQuery = (serviceName: string | undefined, DSL?: any) => { const query = { @@ -109,9 +109,9 @@ export const getRelatedServicesQuery = (serviceName: string) => { return query; }; -export const getServiceNodesQuery = () => { +export const getServiceNodesQuery = (mode: TraceAnalyticsMode) => { return { - index: USE_JAEGER ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, + index: mode === TraceAnalyticsMode.Jaeger ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, size: 0, query: { bool: { @@ -148,9 +148,9 @@ export const getServiceNodesQuery = () => { }; }; -export const getServiceEdgesQuery = (source: 'destination' | 'target') => { +export const getServiceEdgesQuery = (source: 'destination' | 'target', mode: TraceAnalyticsMode) => { return { - index: USE_JAEGER ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, + index: mode === TraceAnalyticsMode.Jaeger ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, size: 0, query: { bool: { diff --git a/public/components/trace_analytics/requests/request_handler.ts b/public/components/trace_analytics/requests/request_handler.ts index a115cc7872..cf3825386b 100644 --- a/public/components/trace_analytics/requests/request_handler.ts +++ b/public/components/trace_analytics/requests/request_handler.ts @@ -7,10 +7,14 @@ import { CoreStart } from '../../../../../../src/core/public'; import { TRACE_ANALYTICS_DSL_ROUTE, - TRACE_ANALYTICS_INDICES_ROUTE, + TRACE_ANALYTICS_DATA_PREPPER_INDICES_ROUTE, + TRACE_ANALYTICS_JAEGER_INDICES_ROUTE, + JAEGER_INDEX_NAME, + DATA_PREPPER_INDEX_NAME } from '../../../../common/constants/trace_analytics'; +import { TraceAnalyticsMode } from '../home'; -export function handleDslRequest(http: CoreStart['http'], DSL: any, bodyQuery: any) { +export function handleDslRequest(http: CoreStart['http'], DSL: any, bodyQuery: any, mode: TraceAnalyticsMode) { if (DSL?.query) { bodyQuery.query.bool.must.push(...DSL.query.bool.must); bodyQuery.query.bool.filter.push(...DSL.query.bool.filter); @@ -19,16 +23,28 @@ export function handleDslRequest(http: CoreStart['http'], DSL: any, bodyQuery: a if (DSL.query.bool.minimum_should_match) bodyQuery.query.bool.minimum_should_match = DSL.query.bool.minimum_should_match; } + let body = bodyQuery; + if (!bodyQuery.index) { + body = {...bodyQuery, index: ((mode === TraceAnalyticsMode.Jaeger ? JAEGER_INDEX_NAME : DATA_PREPPER_INDEX_NAME)) } + } + console.log(body) return http .post(TRACE_ANALYTICS_DSL_ROUTE, { - body: JSON.stringify(bodyQuery), + body: JSON.stringify(body), }) .catch((error) => console.error(error)); } -export async function handleIndicesExistRequest(http: CoreStart['http'], setIndicesExist) { +export async function handleJaegerIndicesExistRequest(http: CoreStart['http'], setJaegerIndicesExist) { + http + .post(TRACE_ANALYTICS_JAEGER_INDICES_ROUTE) + .then((exists) => setJaegerIndicesExist(exists)) + .catch(() => setJaegerIndicesExist(false)); +} + +export async function handleDataPrepperIndicesExistRequest(http: CoreStart['http'], setDataPrepperIndicesExist) { http - .post(TRACE_ANALYTICS_INDICES_ROUTE) - .then((exists) => setIndicesExist(exists)) - .catch(() => setIndicesExist(false)); + .post(TRACE_ANALYTICS_DATA_PREPPER_INDICES_ROUTE) + .then((exists) => setDataPrepperIndicesExist(exists)) + .catch(() => setDataPrepperIndicesExist(false)); } diff --git a/public/components/trace_analytics/requests/services_request_handler.ts b/public/components/trace_analytics/requests/services_request_handler.ts index 56a24daa37..44f7ed6bc4 100644 --- a/public/components/trace_analytics/requests/services_request_handler.ts +++ b/public/components/trace_analytics/requests/services_request_handler.ts @@ -17,17 +17,19 @@ import { } from './queries/services_queries'; import { handleDslRequest } from './request_handler'; import { HttpSetup } from '../../../../../../src/core/public'; +import { TraceAnalyticsMode } from '../home'; export const handleServicesRequest = async ( http: HttpSetup, DSL: any, setItems: any, + mode: TraceAnalyticsMode, setServiceMap?: any, - serviceNameFilter?: string + serviceNameFilter?: string, ) => { - return handleDslRequest(http, DSL, getServicesQuery(serviceNameFilter, DSL)) + return handleDslRequest(http, DSL, getServicesQuery(serviceNameFilter, DSL), mode) .then(async (response) => { - const serviceObject: ServiceObject = await handleServiceMapRequest(http, DSL, setServiceMap); + const serviceObject: ServiceObject = await handleServiceMapRequest(http, DSL, mode, setServiceMap); return Promise.all( response.aggregations.service.buckets .filter((bucket: any) => serviceObject[bucket.key]) @@ -57,8 +59,9 @@ export const handleServicesRequest = async ( export const handleServiceMapRequest = async ( http: HttpSetup, DSL: DSLService | any, + mode: TraceAnalyticsMode, setItems?: any, - currService?: string + currService?: string, ) => { let minutesInDateRange: number; // const startTime = DSL.custom?.timeFilter?.[0]?.range?.startTime; @@ -71,7 +74,7 @@ export const handleServiceMapRequest = async ( const map: ServiceObject = {}; let id = 1; - await handleDslRequest(http, null, getServiceNodesQuery()) + await handleDslRequest(http, null, getServiceNodesQuery(mode), mode) .then((response) => response.aggregations.service_name.buckets.map( (bucket: any) => @@ -90,7 +93,7 @@ export const handleServiceMapRequest = async ( .catch((error) => console.error(error)); const targets = {}; - await handleDslRequest(http, null, getServiceEdgesQuery('target')) + await handleDslRequest(http, null, getServiceEdgesQuery('target'), mode) .then((response) => response.aggregations.service_name.buckets.map((bucket: any) => { bucket.resource.buckets.map((resource: any) => { @@ -101,7 +104,7 @@ export const handleServiceMapRequest = async ( }) ) .catch((error) => console.error(error)); - await handleDslRequest(http, null, getServiceEdgesQuery('destination')) + await handleDslRequest(http, null, getServiceEdgesQuery('destination'), mode) .then((response) => Promise.all( response.aggregations.service_name.buckets.map((bucket: any) => { @@ -125,7 +128,8 @@ export const handleServiceMapRequest = async ( const latencies = await handleDslRequest( http, DSL, - getServiceMetricsQuery(DSL, Object.keys(map), map) + getServiceMetricsQuery(DSL, Object.keys(map), map), + mode, ); latencies.aggregations.service_name.buckets.map((bucket: any) => { map[bucket.key].latency = bucket.average_latency.value; @@ -136,7 +140,7 @@ export const handleServiceMapRequest = async ( }); if (currService) { - await handleDslRequest(http, DSL, getRelatedServicesQuery(currService)) + await handleDslRequest(http, DSL, getRelatedServicesQuery(currService), mode) .then((response) => response.aggregations.traces.buckets.filter((bucket: any) => bucket.service.doc_count > 0) ) @@ -160,13 +164,14 @@ export const handleServiceViewRequest = ( serviceName: string, http: HttpSetup, DSL: any, - setFields: any + setFields: any, + mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, DSL, getServicesQuery(serviceName)) + handleDslRequest(http, DSL, getServicesQuery(serviceName), mode) .then(async (response) => { const bucket = response.aggregations.service.buckets[0]; if (!bucket) return {}; - const serviceObject: ServiceObject = await handleServiceMapRequest(http, DSL); + const serviceObject: ServiceObject = await handleServiceMapRequest(http, DSL, mode); const connectedServices = [ ...serviceObject[bucket.key].targetServices, ...serviceObject[bucket.key].destServices, diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index ce09188834..ed38e40268 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -23,6 +23,7 @@ import { getValidTraceIdsQuery, } from './queries/traces_queries'; import { handleDslRequest } from './request_handler'; +import { TraceAnalyticsMode } from '../home'; export const handleValidTraceIds = (http: HttpSetup, DSL: any) => { return handleDslRequest(http, {}, getValidTraceIdsQuery(DSL)) @@ -36,7 +37,8 @@ export const handleTracesRequest = async ( timeFilterDSL: any, items: any, setItems: (items: any) => void, - sort?: any + sort?: any, + mode: TraceAnalyticsMode, ) => { const binarySearch = (arr: number[], target: number) => { if (!arr) return Number.NaN; @@ -55,7 +57,8 @@ export const handleTracesRequest = async ( const percentileRanges = await handleDslRequest( http, timeFilterDSL, - getTraceGroupPercentilesQuery() + getTraceGroupPercentilesQuery(), + mode ).then((response) => { const map: any = {}; response.aggregations.trace_group_name.buckets.forEach((traceGroup: any) => { @@ -66,7 +69,7 @@ export const handleTracesRequest = async ( return map; }); - return handleDslRequest(http, DSL, getTracesQuery(undefined, sort)) + return handleDslRequest(http, DSL, getTracesQuery(undefined, sort), mode) .then((response) => { return Promise.all( response.aggregations.traces.buckets.map((bucket: any) => { @@ -95,9 +98,10 @@ export const handleTraceViewRequest = ( traceId: string, http: HttpSetup, fields: {}, - setFields: (fields: any) => void + setFields: (fields: any) => void, + mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, null, getTracesQuery(traceId)) + handleDslRequest(http, null, getTracesQuery(traceId), mode) .then(async (response) => { const bucket = response.aggregations.traces.buckets[0]; return { diff --git a/server/routes/trace_analytics_dsl_router.ts b/server/routes/trace_analytics_dsl_router.ts index b648436220..171483fd9b 100644 --- a/server/routes/trace_analytics_dsl_router.ts +++ b/server/routes/trace_analytics_dsl_router.ts @@ -9,15 +9,18 @@ import { IRouter } from '../../../../src/core/server'; import { DATA_PREPPER_INDEX_NAME, DATA_PREPPER_SERVICE_INDEX_NAME, + JAEGER_INDEX_NAME, + JAEGER_SERVICE_INDEX_NAME, TRACE_ANALYTICS_DSL_ROUTE, - TRACE_ANALYTICS_INDICES_ROUTE, + TRACE_ANALYTICS_DATA_PREPPER_INDICES_ROUTE, + TRACE_ANALYTICS_JAEGER_INDICES_ROUTE, } from '../../common/constants/trace_analytics'; import { addRequestToMetric } from '../common/metrics/metrics_helper'; export function registerTraceAnalyticsDslRouter(router: IRouter) { router.post( { - path: TRACE_ANALYTICS_INDICES_ROUTE, + path: TRACE_ANALYTICS_DATA_PREPPER_INDICES_ROUTE, validate: false, }, async (context, request, response) => { @@ -42,6 +45,33 @@ export function registerTraceAnalyticsDslRouter(router: IRouter) { } } ); + router.post( + { + path: TRACE_ANALYTICS_JAEGER_INDICES_ROUTE, + validate: false, + }, + async (context, request, response) => { + const params: RequestParams.IndicesExists = { + index: [JAEGER_INDEX_NAME, JAEGER_SERVICE_INDEX_NAME], + allow_no_indices: false, + }; + try { + const resp = await context.core.opensearch.legacy.client.callAsCurrentUser( + 'indices.exists', + params + ); + return response.ok({ + body: resp, + }); + } catch (error) { + console.error(error); + return response.custom({ + statusCode: error.statusCode || 500, + body: error.message, + }); + } + } + ); router.post( { path: TRACE_ANALYTICS_DSL_ROUTE, From 58a3a0ec68c176e43ae5a2ee4f65723ee0ec808c Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 8 Dec 2022 10:59:11 -0500 Subject: [PATCH 20/67] get subpages working and get rid of servicemap when in jaeger mode Signed-off-by: Derek Ho --- .../components/services/services_content.tsx | 18 ++++++----- .../components/traces/span_detail_panel.tsx | 6 +++- .../components/traces/span_detail_table.tsx | 5 ++- .../components/traces/trace_view.tsx | 25 ++++++++------- .../components/traces/traces_content.tsx | 2 +- public/components/trace_analytics/home.tsx | 2 +- .../requests/traces_request_handler.ts | 31 +++++++++++-------- 7 files changed, 53 insertions(+), 36 deletions(-) diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index 160f035be8..4edae1c570 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -129,14 +129,16 @@ export function ServicesContent(props: ServicesProps) { traceColumnAction={traceColumnAction} /> - + { mode === TraceAnalyticsMode.Data_Prepper ? + : (
) + } ); } diff --git a/public/components/trace_analytics/components/traces/span_detail_panel.tsx b/public/components/trace_analytics/components/traces/span_detail_panel.tsx index afecb32481..e212a9aa48 100644 --- a/public/components/trace_analytics/components/traces/span_detail_panel.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_panel.tsx @@ -17,6 +17,7 @@ import _ from 'lodash'; import React, { useEffect, useMemo, useState } from 'react'; import { HttpSetup } from '../../../../../../../src/core/public'; import { Plt } from '../../../visualizations/plotly/plot'; +import { TraceAnalyticsMode } from '../../home'; import { handleSpansGanttRequest } from '../../requests/traces_request_handler'; import { PanelTitle } from '../common/helper_functions'; import { SpanDetailFlyout } from './span_detail_flyout'; @@ -26,11 +27,13 @@ export function SpanDetailPanel(props: { http: HttpSetup; traceId: string; colorMap: any; + mode: TraceAnalyticsMode page?: string; openSpanFlyout?: any; data?: { gantt: any[]; table: any[]; ganttMaxX: number }; setData?: (data: { gantt: any[]; table: any[]; ganttMaxX: number }) => void; }) { + const { mode } = props; const storedFilters = sessionStorage.getItem('TraceAnalyticsSpanFilters'); const fromApp = props.page === 'app'; const [spanFilters, setSpanFilters] = useState>( @@ -78,7 +81,7 @@ export function SpanDetailPanel(props: { if (_.isEmpty(props.colorMap)) return; const refreshDSL = spanFiltersToDSL(); setDSL(refreshDSL); - handleSpansGanttRequest(props.traceId, props.http, setData, props.colorMap, refreshDSL); + handleSpansGanttRequest(props.traceId, props.http, setData, props.colorMap, refreshDSL, mode); }, 150); const spanFiltersToDSL = () => { @@ -206,6 +209,7 @@ export function SpanDetailPanel(props: { http={props.http} hiddenColumns={['traceID', 'traceGroup']} DSL={DSL} + mode={mode} openFlyout={(spanId: string) => { if (fromApp) { props.openSpanFlyout(spanId); diff --git a/public/components/trace_analytics/components/traces/span_detail_table.tsx b/public/components/trace_analytics/components/traces/span_detail_table.tsx index e1c3d992ca..02f1e060f6 100644 --- a/public/components/trace_analytics/components/traces/span_detail_table.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_table.tsx @@ -10,6 +10,7 @@ import moment from 'moment'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { HttpSetup } from '../../../../../../../src/core/public'; import { TRACE_ANALYTICS_DATE_FORMAT } from '../../../../../common/constants/trace_analytics'; +import { TraceAnalyticsMode } from '../../home'; import { handleSpansRequest } from '../../requests/traces_request_handler'; import { microToMilliSec, nanoToMilliSec, NoMatchMessage } from '../common/helper_functions'; @@ -17,6 +18,7 @@ interface SpanDetailTableProps { http: HttpSetup; hiddenColumns: string[]; openFlyout: (spanId: string) => void; + mode: TraceAnalyticsMode DSL?: any; setTotal?: (total: number) => void; } @@ -38,6 +40,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { direction: 'asc' | 'desc'; }>, }); + const { mode } = props; const [items, setItems] = useState([]); const [total, setTotal] = useState(0); @@ -47,7 +50,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { size: tableParams.size, sortingColumns: tableParams.sortingColumns.map(({ id, direction }) => ({ [id]: direction })), }; - handleSpansRequest(props.http, setItems, setTotal, spanSearchParams, props.DSL); + handleSpansRequest(props.http, setItems, setTotal, spanSearchParams, props.DSL, mode); }, [tableParams, props.DSL]); useEffect(() => { diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index 6dda3d3613..5724fcd132 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -20,7 +20,7 @@ import { } from '@elastic/eui'; import _ from 'lodash'; import React, { useEffect, useState } from 'react'; -import { TraceAnalyticsCoreDeps } from '../../home'; +import { TraceAnalyticsCoreDeps, TraceAnalyticsMode } from '../../home'; import { handleServiceMapRequest } from '../../requests/services_request_handler'; import { handlePayloadRequest, @@ -36,6 +36,7 @@ interface TraceViewProps extends TraceAnalyticsCoreDeps { traceId: string; startTime: string; endTime: string; + mode: TraceAnalyticsMode; } export function TraceView(props: TraceViewProps) { @@ -151,8 +152,8 @@ export function TraceView(props: TraceViewProps) { const refresh = async () => { const DSL = filtersToDsl([], '', processTimeStamp(props.startTime, mode), processTimeStamp(props.endTime, mode), page); handleTraceViewRequest(props.traceId, props.http, fields, setFields, mode); - handlePayloadRequest(props.traceId, props.http, payloadData, setPayloadData); - handleServicesPieChartRequest(props.traceId, props.http, setServiceBreakdownData, setColorMap); + handlePayloadRequest(props.traceId, props.http, payloadData, setPayloadData, mode); + handleServicesPieChartRequest(props.traceId, props.http, setServiceBreakdownData, setColorMap, mode); handleServiceMapRequest(props.http, DSL, mode, setServiceMap); }; @@ -227,6 +228,7 @@ export function TraceView(props: TraceViewProps) { traceId={props.traceId} http={props.http} colorMap={colorMap} + mode={mode} data={ganttData} setData={setGanttData} /> @@ -248,14 +250,15 @@ export function TraceView(props: TraceViewProps) { ) : null} - - + { mode === TraceAnalyticsMode.Data_Prepper ? + : (
) + } diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index 3c76c13ac7..450a48265a 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -57,7 +57,7 @@ export function TracesContent(props: TracesProps) { setLoading(true); const DSL = filtersToDsl(filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); const timeFilterDSL = filtersToDsl([], '', processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page); - await handleTracesRequest(http, DSL, timeFilterDSL, tableItems, setTableItems, sort, mode); + await handleTracesRequest(http, DSL, timeFilterDSL, tableItems, setTableItems, mode, sort); setLoading(false); }; diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index a4a1122188..5e1e0cb7da 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -39,7 +39,7 @@ export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, Sea export const Home = (props: HomeProps) => { const [dataPrepperIndicesExist, setDataPrepperIndicesExist] = useState(true); const [jaegerIndicesExist, setJaegerIndicesExist] = useState(true); - const [mode, setMode] = useState(TraceAnalyticsMode.None) + const [mode, setMode] = useState(TraceAnalyticsMode.Jaeger) const storedFilters = sessionStorage.getItem('TraceAnalyticsFilters'); const [query, setQuery] = useState(sessionStorage.getItem('TraceAnalyticsQuery') || ''); const [filters, setFilters] = useState( diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index ed38e40268..99e1069ce2 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -25,8 +25,8 @@ import { import { handleDslRequest } from './request_handler'; import { TraceAnalyticsMode } from '../home'; -export const handleValidTraceIds = (http: HttpSetup, DSL: any) => { - return handleDslRequest(http, {}, getValidTraceIdsQuery(DSL)) +export const handleValidTraceIds = (http: HttpSetup, DSL: any, mode: TraceAnalyticsMode,) => { + return handleDslRequest(http, {}, getValidTraceIdsQuery(DSL), mode) .then((response) => response.aggregations.traces.buckets.map((bucket: any) => bucket.key)) .catch((error) => console.error(error)); }; @@ -37,8 +37,8 @@ export const handleTracesRequest = async ( timeFilterDSL: any, items: any, setItems: (items: any) => void, - sort?: any, mode: TraceAnalyticsMode, + sort?: any, ) => { const binarySearch = (arr: number[], target: number) => { if (!arr) return Number.NaN; @@ -127,7 +127,8 @@ export const handleServicesPieChartRequest = async ( traceId: string, http: HttpSetup, setServiceBreakdownData: (serviceBreakdownData: any) => void, - setColorMap: (colorMap: any) => void + setColorMap: (colorMap: any) => void, + mode: TraceAnalyticsMode, ) => { const colors = [ '#7492e7', @@ -145,7 +146,7 @@ export const handleServicesPieChartRequest = async ( ]; const colorMap: any = {}; let index = 0; - await handleDslRequest(http, null, getServiceBreakdownQuery(traceId)) + await handleDslRequest(http, null, getServiceBreakdownQuery(traceId), mode) .then((response) => Promise.all( response.aggregations.service_type.buckets.map((bucket: any) => { @@ -189,9 +190,10 @@ export const handleSpansGanttRequest = ( http: HttpSetup, setSpanDetailData: (spanDetailData: any) => void, colorMap: any, - spanFiltersDSL: any + spanFiltersDSL: any, + mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, spanFiltersDSL, getSpanDetailQuery(traceId)) + handleDslRequest(http, spanFiltersDSL, getSpanDetailQuery(traceId), mode) .then((response) => hitsToSpanDetailData(response.hits.hits, colorMap)) .then((newItems) => setSpanDetailData(newItems)) .catch((error) => console.error(error)); @@ -200,9 +202,10 @@ export const handleSpansGanttRequest = ( export const handleSpansFlyoutRequest = ( http: HttpSetup, spanId: string, - setItems: (items: any) => void + setItems: (items: any) => void, + mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, null, getSpanFlyoutQuery(spanId)) + handleDslRequest(http, null, getSpanFlyoutQuery(spanId), mode) .then((response) => { setItems(response?.hits.hits?.[0]?._source); }) @@ -278,9 +281,10 @@ export const handlePayloadRequest = ( traceId: string, http: HttpSetup, payloadData: any, - setPayloadData: (payloadData: any) => void + setPayloadData: (payloadData: any) => void, + mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, null, getPayloadQuery(traceId)) + handleDslRequest(http, null, getPayloadQuery(traceId), mode) .then((response) => setPayloadData(JSON.stringify(response.hits.hits, null, 2))) .catch((error) => console.error(error)); }; @@ -290,9 +294,10 @@ export const handleSpansRequest = ( setItems: (items: any) => void, setTotal: (total: number) => void, spanSearchParams: SpanSearchParams, - DSL: any + DSL: any, + mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, DSL, getSpansQuery(spanSearchParams)) + handleDslRequest(http, DSL, getSpansQuery(spanSearchParams), mode) .then((response) => { setItems(response.hits.hits.map((hit: any) => hit._source)); setTotal(response.hits.total?.value || 0); From a3d87ec6df577f8f8c8124032bc932ee8313374b Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 8 Dec 2022 12:10:48 -0500 Subject: [PATCH 21/67] make most work on both Signed-off-by: Derek Ho --- .../dashboard/dashboard_content.tsx | 6 +- .../components/traces/traces_table.tsx | 76 ++++++++++++++++++- public/components/trace_analytics/home.tsx | 18 ++--- .../requests/queries/services_queries.ts | 72 ++++++++++++------ .../requests/queries/traces_queries.ts | 75 ++++++++++++++++-- .../requests/services_request_handler.ts | 4 +- .../requests/traces_request_handler.ts | 14 +++- 7 files changed, 216 insertions(+), 49 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index fca0d187a1..7f8fa2a0f4 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -94,8 +94,8 @@ export function DashboardContent(props: DashboardProps) { const latencyTrendDSL = filtersToDsl( filters, query, - 0, - 166638045873223500, + processTimeStamp(latencyTrendStartTime, mode), + processTimeStamp(endTime, mode), page, appConfigs ); @@ -129,7 +129,7 @@ export function DashboardContent(props: DashboardProps) { serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( (must: any) => must?.term?.serviceName == null ); - handleServiceMapRequest(http, serviceMapDSL, setServiceMap, currService || filteredService); + handleServiceMapRequest(http, serviceMapDSL, mode, setServiceMap, currService || filteredService); }; const addFilter = (filter: FilterType) => { diff --git a/public/components/trace_analytics/components/traces/traces_table.tsx b/public/components/trace_analytics/components/traces/traces_table.tsx index 080c108ab8..2c1e4ff6dc 100644 --- a/public/components/trace_analytics/components/traces/traces_table.tsx +++ b/public/components/trace_analytics/components/traces/traces_table.tsx @@ -49,7 +49,9 @@ export function TracesTable(props: TracesTableProps) { }; const columns = useMemo( - () => + () => { + if (mode === TraceAnalyticsMode.Data_Prepper) { + return( [ { field: 'trace_id', @@ -147,7 +149,77 @@ export function TracesTable(props: TracesTableProps) { sortable: true, render: (item) => (item === 0 || item ? item : '-'), }, - ] as Array>, + ] as Array>) + } else { + return ( + [ + { + field: 'trace_id', + name: 'Trace ID', + align: 'left', + sortable: true, + truncateText: true, + render: (item) => ( + + + traceIdColumnAction(item)}> + {item.length < 24 ? ( + item + ) : ( +
{_.truncate(item, { length: 24 })}
+ )} +
+
+ + + {(copy) => ( + + Click to copy + + )} + + + +
+ ), + }, + { + field: 'latency', + name: 'Latency (ms)', + align: 'right', + sortable: true, + truncateText: true, + }, + { + field: 'error_count', + name: 'Errors', + align: 'right', + sortable: true, + render: (item) => + item == null ? ( + '-' + ) : item > 0 ? ( + + Yes + + ) : ( + 'No' + ), + }, + { + field: 'last_updated', + name: 'Last updated', + align: 'left', + sortable: true, + render: (item) => (item === 0 || item ? item : '-'), + }, + ] as Array>) + } + }, [items] ); diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index 5e1e0cb7da..57b7bae19a 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -74,15 +74,15 @@ export const Home = (props: HomeProps) => { handleJaegerIndicesExistRequest(props.http, setJaegerIndicesExist); }, []); - useEffect(() => { - if (dataPrepperIndicesExist) { - setMode(TraceAnalyticsMode.Data_Prepper); - } else if (jaegerIndicesExist) { - setMode(TraceAnalyticsMode.Jaeger); - } else { - setMode(TraceAnalyticsMode.None); - } - }, [jaegerIndicesExist, dataPrepperIndicesExist]); + // useEffect(() => { + // if (dataPrepperIndicesExist) { + // setMode(TraceAnalyticsMode.Data_Prepper); + // } else if (jaegerIndicesExist) { + // setMode(TraceAnalyticsMode.Jaeger); + // } else { + // setMode(TraceAnalyticsMode.None); + // } + // }, [jaegerIndicesExist, dataPrepperIndicesExist]); const dashboardBreadcrumbs = [ { diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 599c66e804..75a1cf3ca4 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -13,7 +13,7 @@ import { getServiceMapTargetResources } from '../../components/common/helper_fun import { ServiceObject } from '../../components/common/plots/service_map'; import { TraceAnalyticsMode } from '../../home'; -export const getServicesQuery = (serviceName: string | undefined, DSL?: any) => { +export const getServicesQuery = (mode: TraceAnalyticsMode, serviceName: string | undefined, DSL?: any) => { const query = { size: 0, query: { @@ -27,40 +27,64 @@ export const getServicesQuery = (serviceName: string | undefined, DSL?: any) => aggs: { service: { terms: { - field: 'process.serviceName', + field: mode === TraceAnalyticsMode.Jaeger ? 'process.serviceName' : 'serviceName', size: 10000, }, aggs: { trace_count: { cardinality: { - field: 'traceID', + field: mode === TraceAnalyticsMode.Jaeger? 'traceID': 'traceId', }, }, }, }, }, }; - if (serviceName) { - query.query.bool.must.push({ - term: { - "process.serviceName": serviceName, - }, + if (mode === TraceAnalyticsMode.Jaeger) { + if (serviceName) { + query.query.bool.must.push({ + term: { + "process.serviceName": serviceName, + }, + }); + } + DSL?.custom?.serviceNames?.map((service: string) => { + query.query.bool.must.push({ + term: { + "process.serviceName": service, + }, + }); }); - } - DSL?.custom?.serviceNames?.map((service: string) => { - query.query.bool.must.push({ - term: { - "process.serviceName": service, - }, + DSL?.custom?.serviceNamesExclude?.map((service: string) => { + query.query.bool.must_not.push({ + term: { + "process.serviceName": service, + }, + }); }); - }); - DSL?.custom?.serviceNamesExclude?.map((service: string) => { - query.query.bool.must_not.push({ - term: { - "process.serviceName": service, - }, + } else { + if (serviceName) { + query.query.bool.must.push({ + term: { + "serviceName": serviceName, + }, + }); + } + DSL?.custom?.serviceNames?.map((service: string) => { + query.query.bool.must.push({ + term: { + "serviceName": service, + }, + }); }); - }); + DSL?.custom?.serviceNamesExclude?.map((service: string) => { + query.query.bool.must_not.push({ + term: { + "serviceName": service, + }, + }); + }); + } return query; }; @@ -78,13 +102,13 @@ export const getRelatedServicesQuery = (serviceName: string) => { aggs: { traces: { terms: { - field: 'traceID', + field: 'traceId', size: 10000, }, aggs: { all_services: { terms: { - field: 'process.serviceName', + field: 'serviceName', size: 10000, }, }, @@ -94,7 +118,7 @@ export const getRelatedServicesQuery = (serviceName: string) => { must: [ { term: { - "process.serviceName": serviceName, + "serviceName": serviceName, }, }, ], diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 1a1ba1c64a..21347f096a 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -6,6 +6,7 @@ import { PropertySort } from '@elastic/eui'; import { TRACES_MAX_NUM } from '../../../../../common/constants/trace_analytics'; import { SpanSearchParams } from '../../components/traces/span_detail_table'; +import { TraceAnalyticsMode } from '../../home'; export const getTraceGroupPercentilesQuery = () => { const query: any = { @@ -46,10 +47,10 @@ export const getTraceGroupPercentilesQuery = () => { return query; }; -export const getTracesQuery = (traceID: string = '', sort?: PropertySort) => { +export const getTracesQuery = (mode: TraceAnalyticsMode, traceId: string = '', sort?: PropertySort) => { const field = sort?.field || '_key'; const direction = sort?.direction || 'asc'; - const query: any = { + const jaegerQuery: any = { size: 0, query: { bool: { @@ -92,7 +93,7 @@ export const getTracesQuery = (traceID: string = '', sort?: PropertySort) => { error_count: { filter: { term: { - 'traceGroupFields.statusCode': '2', + 'tag.error': true, }, }, }, @@ -114,14 +115,74 @@ export const getTracesQuery = (traceID: string = '', sort?: PropertySort) => { }, }, }; - if (traceID) { - query.query.bool.must.push({ + const dataPrepperQuery: any = { + size: 0, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + traces: { + terms: { + field: 'traceId', + size: TRACES_MAX_NUM, + order: { + [field]: direction, + }, + }, + aggs: { + latency: { + max: { + script: { + source: ` + if (doc.containsKey('traceGroupFields.durationInNanos') && !doc['traceGroupFields.durationInNanos'].empty) { + return Math.round(doc['traceGroupFields.durationInNanos'].value / 10000) / 100.0 + } + return 0 + `, + lang: 'painless', + }, + }, + }, + trace_group: { + terms: { + field: 'traceGroup', + size: 1, + }, + }, + error_count: { + filter: { + term: { + 'traceGroupFields.statusCode': '2', + }, + }, + }, + last_updated: { + max: { + field: 'traceGroupFields.endTime', + }, + }, + }, + }, + }, + }; + if (traceId) { + jaegerQuery.query.bool.must.push({ term: { - traceID, + "traceID": traceId, + }, + }); + dataPrepperQuery.query.bool.must.push({ + term: { + traceId, }, }); } - return query; + return mode === TraceAnalyticsMode.Jaeger ? jaegerQuery : dataPrepperQuery; }; export const getServiceBreakdownQuery = (traceID: string) => { diff --git a/public/components/trace_analytics/requests/services_request_handler.ts b/public/components/trace_analytics/requests/services_request_handler.ts index 44f7ed6bc4..2995582c8d 100644 --- a/public/components/trace_analytics/requests/services_request_handler.ts +++ b/public/components/trace_analytics/requests/services_request_handler.ts @@ -27,7 +27,7 @@ export const handleServicesRequest = async ( setServiceMap?: any, serviceNameFilter?: string, ) => { - return handleDslRequest(http, DSL, getServicesQuery(serviceNameFilter, DSL), mode) + return handleDslRequest(http, DSL, getServicesQuery(mode, serviceNameFilter, DSL), mode) .then(async (response) => { const serviceObject: ServiceObject = await handleServiceMapRequest(http, DSL, mode, setServiceMap); return Promise.all( @@ -167,7 +167,7 @@ export const handleServiceViewRequest = ( setFields: any, mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, DSL, getServicesQuery(serviceName), mode) + handleDslRequest(http, DSL, getServicesQuery(mode, serviceName), mode) .then(async (response) => { const bucket = response.aggregations.service.buckets[0]; if (!bucket) return {}; diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index 99e1069ce2..292d4f09dc 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -69,10 +69,11 @@ export const handleTracesRequest = async ( return map; }); - return handleDslRequest(http, DSL, getTracesQuery(undefined, sort), mode) + return handleDslRequest(http, DSL, getTracesQuery(mode, undefined, sort), mode) .then((response) => { return Promise.all( response.aggregations.traces.buckets.map((bucket: any) => { + if (mode === TraceAnalyticsMode.Data_Prepper) { return { trace_id: bucket.key, trace_group: bucket.trace_group.buckets[0]?.key, @@ -85,6 +86,15 @@ export const handleTracesRequest = async ( ), actions: '#', }; + } + return { + trace_id: bucket.key, + latency: bucket.latency.value, + last_updated: moment(bucket.last_updated.value).format(TRACE_ANALYTICS_DATE_FORMAT), + error_count: bucket.error_count.doc_count, + actions: '#', + }; + }) ); }) @@ -101,7 +111,7 @@ export const handleTraceViewRequest = ( setFields: (fields: any) => void, mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, null, getTracesQuery(traceId), mode) + handleDslRequest(http, null, getTracesQuery(mode, traceId), mode) .then(async (response) => { const bucket = response.aggregations.traces.buckets[0]; return { From fc6bbd71900e9abbc828c2f8d40adac62c31ae5f Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 8 Dec 2022 16:27:35 -0500 Subject: [PATCH 22/67] pushing work Signed-off-by: Derek Ho --- .../dashboard/dashboard_content.tsx | 92 +++++----- .../components/traces/span_detail_panel.tsx | 17 +- .../components/traces/trace_view.tsx | 14 +- .../requests/queries/services_queries.ts | 24 +-- .../requests/queries/traces_queries.ts | 164 +++++++++++++++--- .../requests/services_request_handler.ts | 6 +- .../requests/traces_request_handler.ts | 8 +- 7 files changed, 236 insertions(+), 89 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 7f8fa2a0f4..c4ea84682d 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -202,49 +202,55 @@ export function DashboardContent(props: DashboardProps) { /> {mode !== TraceAnalyticsMode.None ? ( - <> - - - - - - - - - - - - - - - - - - - ) : ( +
+ { mode === TraceAnalyticsMode.Data_Prepper ? ( + <> + + + + + + + + + + + + + + + + + + ) : ( +
You are looking at raw jaeger data, so some features may not be available. Click on the traces or services subpage to start exploring your data!
+ ) + } +
+ ) : ( )} diff --git a/public/components/trace_analytics/components/traces/span_detail_panel.tsx b/public/components/trace_analytics/components/traces/span_detail_panel.tsx index e212a9aa48..9763be6b88 100644 --- a/public/components/trace_analytics/components/traces/span_detail_panel.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_panel.tsx @@ -85,7 +85,7 @@ export function SpanDetailPanel(props: { }, 150); const spanFiltersToDSL = () => { - const spanDSL: any = { + const spanDSL: any = mode === TraceAnalyticsMode.Jaeger ? { query: { bool: { must: [ @@ -100,6 +100,21 @@ export function SpanDetailPanel(props: { must_not: [], }, }, + } : { + query: { + bool: { + must: [ + { + term: { + traceId: props.traceId, + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, }; spanFilters.map(({ field, value }) => { if (value != null) { diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index 5724fcd132..cb70ddefb6 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -87,12 +87,14 @@ export function TraceView(props: TraceViewProps) { )} - - Trace group name - - {fields.trace_group || '-'} - - + { mode === TraceAnalyticsMode.Data_Prepper ? ( + + Trace group name + + {fields.trace_group || '-'} + + ) : (
) + } diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 75a1cf3ca4..4ac8e7cffe 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -211,7 +211,7 @@ export const getServiceEdgesQuery = (source: 'destination' | 'target', mode: Tra }; }; -export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: ServiceObject) => { +export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: ServiceObject, mode: TraceAnalyticsMode) => { const traceGroupFilter = new Set( DSL?.query?.bool.must .filter((must: any) => must.term?.['traceGroup']) @@ -268,17 +268,17 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se ], }, }, - // { - // bool: { - // must: { - // term: { - // parentSpanId: { - // value: '', - // }, - // }, - // }, - // }, - // }, + { + bool: { + must: { + term: { + references: { + value: [], + }, + }, + }, + }, + }, ], adjust_pure_negative: true, boost: 1, diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 21347f096a..d8384e6958 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -30,13 +30,13 @@ export const getTraceGroupPercentilesQuery = () => { aggs: { trace_group_name: { terms: { - field: 'operationName', + field: 'name', size: 10000, }, aggs: { percentiles: { percentiles: { - field: 'duration', + field: 'durationInNanos', percents: Array.from({ length: 101 }, (v, i) => i), }, }, @@ -185,15 +185,15 @@ export const getTracesQuery = (mode: TraceAnalyticsMode, traceId: string = '', s return mode === TraceAnalyticsMode.Jaeger ? jaegerQuery : dataPrepperQuery; }; -export const getServiceBreakdownQuery = (traceID: string) => { - const query = { +export const getServiceBreakdownQuery = (traceId: string, mode: TraceAnalyticsMode) => { + const jaegerQuery = { size: 0, query: { bool: { must: [ { term: { - traceID, + "traceID": traceId, }, }, ], @@ -231,23 +231,110 @@ export const getServiceBreakdownQuery = (traceID: string) => { }, }, }; - return query; + const dataPrepperQuery = { + size: 0, + query: { + bool: { + must: [ + { + term: { + traceId, + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + service_type: { + terms: { + field: 'serviceName', + order: [ + { + total_latency_nanos: 'desc', + }, + ], + }, + aggs: { + total_latency_nanos: { + sum: { + field: 'durationInNanos', + }, + }, + total_latency: { + bucket_script: { + buckets_path: { + count: '_count', + latency: 'total_latency_nanos.value', + }, + script: 'Math.round(params.latency / 10000) / 100.0', + }, + }, + }, + }, + }, + }; + return mode === TraceAnalyticsMode.Jaeger? jaegerQuery : dataPrepperQuery; }; -export const getSpanDetailQuery = (traceID: string, size = 3000) => { - const query = { +export const getSpanDetailQuery = (mode: TraceAnalyticsMode, traceId: string, size = 3000) => { + if (mode === TraceAnalyticsMode.Jaeger) { + return { + size, + query: { + bool: { + must: [ + { + term: { + "traceID": traceId, + }, + }, + { + exists: { + field: mode === TraceAnalyticsMode.Jaeger ? 'process.serviceName' : 'serviceName', + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + sort: [ + { + startTime: { + order: 'desc', + }, + }, + ], + _source: { + includes: [ + 'process.serviceName', + 'operationName', + 'startTime', + 'endTime', + 'spanID', + 'tag', + 'duration', + ] + }, + }; + } + return { size, query: { bool: { must: [ { term: { - traceID, + traceId, }, }, { exists: { - field: 'process.serviceName', + field: 'serviceName', }, }, ], @@ -265,20 +352,38 @@ export const getSpanDetailQuery = (traceID: string, size = 3000) => { ], _source: { includes: [ - 'process.serviceName', - 'operationName', + 'serviceName', + 'name', 'startTime', 'endTime', - 'spanID', - 'tag', - 'duration', + 'spanId', + 'status.code', + 'durationInNanos', ], }, }; - return query; }; -export const getPayloadQuery = (traceID: string, size = 1000) => { +export const getPayloadQuery = (mode: TraceAnalyticsMode, traceId: string, size = 1000) => { + if (mode === TraceAnalyticsMode.Jaeger) { + return { + size, + query: { + bool: { + must: [ + { + term: { + "traceID": traceId, + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + }; + } return { size, query: { @@ -286,7 +391,7 @@ export const getPayloadQuery = (traceID: string, size = 1000) => { must: [ { term: { - traceID, + traceId, }, }, ], @@ -298,7 +403,26 @@ export const getPayloadQuery = (traceID: string, size = 1000) => { }; }; -export const getSpanFlyoutQuery = (spanID?: string, size = 1000) => { +export const getSpanFlyoutQuery = (mode: TraceAnalyticsMode, spanId?: string, size = 1000) => { + if (mode === TraceAnalyticsMode.Jaeger) { + return { + size, + query: { + bool: { + must: [ + { + term: { + "spanID": spanId, + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + }; + } return { size, query: { @@ -306,7 +430,7 @@ export const getSpanFlyoutQuery = (spanID?: string, size = 1000) => { must: [ { term: { - spanID, + spanId, }, }, ], diff --git a/public/components/trace_analytics/requests/services_request_handler.ts b/public/components/trace_analytics/requests/services_request_handler.ts index 2995582c8d..1b5b6f7c6c 100644 --- a/public/components/trace_analytics/requests/services_request_handler.ts +++ b/public/components/trace_analytics/requests/services_request_handler.ts @@ -93,7 +93,7 @@ export const handleServiceMapRequest = async ( .catch((error) => console.error(error)); const targets = {}; - await handleDslRequest(http, null, getServiceEdgesQuery('target'), mode) + await handleDslRequest(http, null, getServiceEdgesQuery('target', mode), mode) .then((response) => response.aggregations.service_name.buckets.map((bucket: any) => { bucket.resource.buckets.map((resource: any) => { @@ -104,7 +104,7 @@ export const handleServiceMapRequest = async ( }) ) .catch((error) => console.error(error)); - await handleDslRequest(http, null, getServiceEdgesQuery('destination'), mode) + await handleDslRequest(http, null, getServiceEdgesQuery('destination', mode), mode) .then((response) => Promise.all( response.aggregations.service_name.buckets.map((bucket: any) => { @@ -128,7 +128,7 @@ export const handleServiceMapRequest = async ( const latencies = await handleDslRequest( http, DSL, - getServiceMetricsQuery(DSL, Object.keys(map), map), + getServiceMetricsQuery(DSL, Object.keys(map), map, mode), mode, ); latencies.aggregations.service_name.buckets.map((bucket: any) => { diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index 292d4f09dc..1e1badd255 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -156,7 +156,7 @@ export const handleServicesPieChartRequest = async ( ]; const colorMap: any = {}; let index = 0; - await handleDslRequest(http, null, getServiceBreakdownQuery(traceId), mode) + await handleDslRequest(http, null, getServiceBreakdownQuery(traceId, mode), mode) .then((response) => Promise.all( response.aggregations.service_type.buckets.map((bucket: any) => { @@ -203,7 +203,7 @@ export const handleSpansGanttRequest = ( spanFiltersDSL: any, mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, spanFiltersDSL, getSpanDetailQuery(traceId), mode) + handleDslRequest(http, spanFiltersDSL, getSpanDetailQuery(mode, traceId), mode) .then((response) => hitsToSpanDetailData(response.hits.hits, colorMap)) .then((newItems) => setSpanDetailData(newItems)) .catch((error) => console.error(error)); @@ -215,7 +215,7 @@ export const handleSpansFlyoutRequest = ( setItems: (items: any) => void, mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, null, getSpanFlyoutQuery(spanId), mode) + handleDslRequest(http, null, getSpanFlyoutQuery(mode, spanId), mode) .then((response) => { setItems(response?.hits.hits?.[0]?._source); }) @@ -294,7 +294,7 @@ export const handlePayloadRequest = ( setPayloadData: (payloadData: any) => void, mode: TraceAnalyticsMode, ) => { - handleDslRequest(http, null, getPayloadQuery(traceId), mode) + handleDslRequest(http, null, getPayloadQuery(mode, traceId), mode) .then((response) => setPayloadData(JSON.stringify(response.hits.hits, null, 2))) .catch((error) => console.error(error)); }; From 6750c6fb72f2255ef1e9348ebcc70444b1d828cd Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 8 Dec 2022 16:55:55 -0500 Subject: [PATCH 23/67] fix service map for data prepper Signed-off-by: Derek Ho --- .../components/services/service_view.tsx | 70 ++++++----- public/components/trace_analytics/home.tsx | 2 +- .../requests/queries/services_queries.ts | 119 +++++++++++++++++- 3 files changed, 155 insertions(+), 36 deletions(-) diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index fabeabdb29..eca0904f89 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -20,7 +20,7 @@ import { } from '@elastic/eui'; import _ from 'lodash'; import React, { useEffect, useMemo, useState } from 'react'; -import { TraceAnalyticsComponentDeps } from '../../home'; +import { TraceAnalyticsComponentDeps, TraceAnalyticsMode } from '../../home'; import { handleServiceMapRequest, handleServiceViewRequest, @@ -111,30 +111,34 @@ export function ServiceView(props: ServiceViewProps) { {props.serviceName || '-'} - - Number of connected services - - {fields.number_of_connected_services !== undefined - ? fields.number_of_connected_services - : 0} - - - - Connected services - - {fields.connected_services && fields.connected_services.length - ? fields.connected_services - .map((service: string) => ( - - {service} - - )) - .reduce((prev: React.ReactNode, curr: React.ReactNode) => { - return [prev, ', ', curr]; - }) - : '-'} - - + { mode === TraceAnalyticsMode.Data_Prepper ? + + Number of connected services + + {fields.number_of_connected_services !== undefined + ? fields.number_of_connected_services + : 0} + + : + } + { mode === TraceAnalyticsMode.Data_Prepper ? + + Connected services + + {fields.connected_services && fields.connected_services.length + ? fields.connected_services + .map((service: string) => ( + + {service} + + )) + .reduce((prev: React.ReactNode, curr: React.ReactNode) => { + return [prev, ', ', curr]; + }) + : '-'} + + : + } @@ -310,13 +314,15 @@ export function ServiceView(props: ServiceViewProps) { {overview} - + { mode === TraceAnalyticsMode.Data_Prepper ? + :
+ } diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index 57b7bae19a..60427038f3 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -39,7 +39,7 @@ export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, Sea export const Home = (props: HomeProps) => { const [dataPrepperIndicesExist, setDataPrepperIndicesExist] = useState(true); const [jaegerIndicesExist, setJaegerIndicesExist] = useState(true); - const [mode, setMode] = useState(TraceAnalyticsMode.Jaeger) + const [mode, setMode] = useState(TraceAnalyticsMode.Data_Prepper) const storedFilters = sessionStorage.getItem('TraceAnalyticsFilters'); const [query, setQuery] = useState(sessionStorage.getItem('TraceAnalyticsQuery') || ''); const [filters, setFilters] = useState( diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 4ac8e7cffe..ef4b8a620b 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -230,7 +230,7 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se ) ) : [].concat(...Object.keys(map).map((service) => getServiceMapTargetResources(map, service))); - const query: any = { + const jaegerQuery: any = { size: 0, query: { bool: { @@ -339,6 +339,119 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se }, }, }; - if (DSL.custom?.timeFilter.length > 0) query.query.bool.must.push(...DSL.custom.timeFilter); - return query; + + const dataPrepperQuery: any = { + size: 0, + query: { + bool: { + must: [], + should: [], + must_not: [], + filter: [ + { + terms: { + serviceName: serviceNames, + }, + }, + { + bool: { + should: [ + { + bool: { + filter: [ + { + bool: { + must_not: { + term: { + parentSpanId: { + value: '', + }, + }, + }, + }, + }, + { + terms: { + name: targetResource, + }, + }, + ], + }, + }, + { + bool: { + must: { + term: { + parentSpanId: { + value: '', + }, + }, + }, + }, + }, + ], + adjust_pure_negative: true, + boost: 1, + }, + }, + ], + }, + }, + aggregations: { + service_name: { + terms: { + field: 'serviceName', + size: SERVICE_MAP_MAX_NODES, + min_doc_count: 1, + shard_min_doc_count: 0, + show_term_doc_count_error: false, + order: [ + { + _count: 'desc', + }, + { + _key: 'asc', + }, + ], + }, + aggregations: { + average_latency_nanos: { + avg: { + field: 'durationInNanos', + }, + }, + average_latency: { + bucket_script: { + buckets_path: { + count: '_count', + latency: 'average_latency_nanos.value', + }, + script: 'Math.round(params.latency / 10000) / 100.0', + }, + }, + error_count: { + filter: { + term: { + 'status.code': '2', + }, + }, + }, + error_rate: { + bucket_script: { + buckets_path: { + total: '_count', + errors: 'error_count._count', + }, + script: 'params.errors / params.total * 100', + }, + }, + }, + }, + }, + }; + if (DSL.custom?.timeFilter.length > 0) { + jaegerQuery.query.bool.must.push(...DSL.custom.timeFilter); + dataPrepperQuery.query.bool.must.push(...DSL.custom.timeFilter); + } + return mode === TraceAnalyticsMode.Jaeger ? jaegerQuery : dataPrepperQuery; }; From 7237845cfe53dd07cca804abf1eb20441776b69f Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 8 Dec 2022 17:17:43 -0500 Subject: [PATCH 24/67] get more things to work Signed-off-by: Derek Ho --- .../dashboard/dashboard_content.tsx | 9 ++++--- .../requests/dashboard_request_handler.ts | 12 ++++++---- .../requests/queries/dashboard_queries.ts | 9 +++---- .../requests/queries/traces_queries.ts | 4 ++-- .../requests/traces_request_handler.ts | 24 +++++++++---------- 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index c4ea84682d..a581acbad7 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -108,21 +108,24 @@ export function DashboardContent(props: DashboardProps) { latencyTrendDSL, tableItems, setTableItems, - setPercentileMap + mode, + setPercentileMap, ).then(() => setLoading(false)); handleDashboardThroughputPltRequest( http, DSL, fixedInterval, throughputPltItems, - setThroughputPltItems + setThroughputPltItems, + mode ); handleDashboardErrorRatePltRequest( http, DSL, fixedInterval, errorRatePltItems, - setErrorRatePltItems + setErrorRatePltItems, + mode ); // service map should not be filtered by service name (https://github.com/opensearch-project/observability/issues/442) const serviceMapDSL = _.cloneDeep(DSL); diff --git a/public/components/trace_analytics/requests/dashboard_request_handler.ts b/public/components/trace_analytics/requests/dashboard_request_handler.ts index 322ebf8ed5..5c66782f71 100644 --- a/public/components/trace_analytics/requests/dashboard_request_handler.ts +++ b/public/components/trace_analytics/requests/dashboard_request_handler.ts @@ -23,13 +23,15 @@ export const handleDashboardRequest = async ( latencyTrendDSL, items, setItems, + mode, setPercentileMap? ) => { // latency_variance should only be affected by timefilter const latencyVariances = await handleDslRequest( http, timeFilterDSL, - getDashboardTraceGroupPercentiles() + getDashboardTraceGroupPercentiles(), + mode ) .then((response) => { const map: any = {}; @@ -120,8 +122,8 @@ export const handleDashboardRequest = async ( .catch((error) => console.error(error)); }; -export const handleDashboardThroughputPltRequest = (http, DSL, fixedInterval, items, setItems) => { - return handleDslRequest(http, DSL, getDashboardThroughputPltQuery(fixedInterval)) +export const handleDashboardThroughputPltRequest = (http, DSL, fixedInterval, items, setItems, mode) => { + return handleDslRequest(http, DSL, getDashboardThroughputPltQuery(mode, fixedInterval), mode) .then((response) => { const buckets = response.aggregations.throughput.buckets; const texts = buckets.map( @@ -153,8 +155,8 @@ export const handleDashboardThroughputPltRequest = (http, DSL, fixedInterval, it .catch((error) => console.error(error)); }; -export const handleDashboardErrorRatePltRequest = (http, DSL, fixedInterval, items, setItems) => { - return handleDslRequest(http, DSL, getErrorRatePltQuery(fixedInterval)) +export const handleDashboardErrorRatePltRequest = (http, DSL, fixedInterval, items, setItems, mode) => { + return handleDslRequest(http, DSL, getErrorRatePltQuery(fixedInterval), mode) .then((response) => { const buckets = response.aggregations.error_rate.buckets; const texts = buckets.map( diff --git a/public/components/trace_analytics/requests/queries/dashboard_queries.ts b/public/components/trace_analytics/requests/queries/dashboard_queries.ts index 09067d9f97..576d4b43f4 100644 --- a/public/components/trace_analytics/requests/queries/dashboard_queries.ts +++ b/public/components/trace_analytics/requests/queries/dashboard_queries.ts @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { TraceAnalyticsMode } from "../../home"; + export const getDashboardQuery = () => { const query = { size: 0, @@ -255,8 +257,8 @@ export const getErrorRatePltQuery = (fixedInterval) => { return query; }; -export const getDashboardThroughputPltQuery = (fixedInterval) => { - const query: any = { +export const getDashboardThroughputPltQuery = (mode: TraceAnalyticsMode, fixedInterval) => { + return { size: 0, query: { bool: { @@ -275,12 +277,11 @@ export const getDashboardThroughputPltQuery = (fixedInterval) => { aggs: { trace_count: { cardinality: { - field: 'traceID', + field: mode === TraceAnalyticsMode.Jaeger ? 'traceID': 'traceId', }, }, }, }, }, }; - return query; }; diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index d8384e6958..103283c82e 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -16,8 +16,8 @@ export const getTraceGroupPercentilesQuery = () => { must: [ { term: { - references: { - value: [], + parentSpanId: { + value: '', }, }, }, diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index 1e1badd255..0c254bae68 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -74,18 +74,18 @@ export const handleTracesRequest = async ( return Promise.all( response.aggregations.traces.buckets.map((bucket: any) => { if (mode === TraceAnalyticsMode.Data_Prepper) { - return { - trace_id: bucket.key, - trace_group: bucket.trace_group.buckets[0]?.key, - latency: bucket.latency.value, - last_updated: moment(bucket.last_updated.value).format(TRACE_ANALYTICS_DATE_FORMAT), - error_count: bucket.error_count.doc_count, - percentile_in_trace_group: binarySearch( - percentileRanges[bucket.trace_group.buckets[0]?.key], - bucket.latency.value - ), - actions: '#', - }; + return { + trace_id: bucket.key, + trace_group: bucket.trace_group.buckets[0]?.key, + latency: bucket.latency.value, + last_updated: moment(bucket.last_updated.value).format(TRACE_ANALYTICS_DATE_FORMAT), + error_count: bucket.error_count.doc_count, + percentile_in_trace_group: binarySearch( + percentileRanges[bucket.trace_group.buckets[0]?.key], + bucket.latency.value + ), + actions: '#', + }; } return { trace_id: bucket.key, From 1e7bad3148a9a1b1be83c5dd51b637ce4a2e4cdd Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 8 Dec 2022 18:07:37 -0500 Subject: [PATCH 25/67] push work Signed-off-by: Derek Ho --- public/components/trace_analytics/home.tsx | 2 +- .../trace_analytics/requests/queries/traces_queries.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index 60427038f3..57b7bae19a 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -39,7 +39,7 @@ export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, Sea export const Home = (props: HomeProps) => { const [dataPrepperIndicesExist, setDataPrepperIndicesExist] = useState(true); const [jaegerIndicesExist, setJaegerIndicesExist] = useState(true); - const [mode, setMode] = useState(TraceAnalyticsMode.Data_Prepper) + const [mode, setMode] = useState(TraceAnalyticsMode.Jaeger) const storedFilters = sessionStorage.getItem('TraceAnalyticsFilters'); const [query, setQuery] = useState(sessionStorage.getItem('TraceAnalyticsQuery') || ''); const [filters, setFilters] = useState( diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 103283c82e..714a3829c5 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -293,7 +293,7 @@ export const getSpanDetailQuery = (mode: TraceAnalyticsMode, traceId: string, si }, { exists: { - field: mode === TraceAnalyticsMode.Jaeger ? 'process.serviceName' : 'serviceName', + field: 'process.serviceName', }, }, ], From 08a0bff380a28d8f8eebf2a1b1b5daf5d7c934b2 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 9 Dec 2022 12:32:35 -0500 Subject: [PATCH 26/67] get almost everything working Signed-off-by: Derek Ho --- .../components/services/services_table.tsx | 8 +-- .../components/traces/span_detail_panel.tsx | 2 +- .../components/traces/span_detail_table.tsx | 71 ++++++++++++++----- .../requests/queries/traces_queries.ts | 1 + .../requests/request_handler.ts | 1 - .../requests/traces_request_handler.ts | 16 ++--- 6 files changed, 66 insertions(+), 33 deletions(-) diff --git a/public/components/trace_analytics/components/services/services_table.tsx b/public/components/trace_analytics/components/services/services_table.tsx index ddb89767a6..aca89444f4 100644 --- a/public/components/trace_analytics/components/services/services_table.tsx +++ b/public/components/trace_analytics/components/services/services_table.tsx @@ -93,7 +93,7 @@ export function ServicesTable(props: ServicesTableProps) { truncateText: true, render: (item: any) => (item === 0 || item ? : '-'), }, - { + ... mode === TraceAnalyticsMode.Data_Prepper ? [{ field: 'number_of_connected_services', name: 'No. of connected services', align: 'right', @@ -101,8 +101,8 @@ export function ServicesTable(props: ServicesTableProps) { truncateText: true, width: '80px', render: (item: any) => (item === 0 || item ? item : '-'), - }, - { + }] : [], + ... mode === TraceAnalyticsMode.Data_Prepper ? [{ field: 'connected_services', name: 'Connected services', align: 'left', @@ -110,7 +110,7 @@ export function ServicesTable(props: ServicesTableProps) { truncateText: true, render: (item: any) => item ? {_.truncate(item.join(', '), { length: 50 })} : '-', - }, + }] : [], { field: 'traces', name: 'Traces', diff --git a/public/components/trace_analytics/components/traces/span_detail_panel.tsx b/public/components/trace_analytics/components/traces/span_detail_panel.tsx index 9763be6b88..39ec1d3f0e 100644 --- a/public/components/trace_analytics/components/traces/span_detail_panel.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_panel.tsx @@ -222,7 +222,7 @@ export function SpanDetailPanel(props: { () => ( { diff --git a/public/components/trace_analytics/components/traces/span_detail_table.tsx b/public/components/trace_analytics/components/traces/span_detail_table.tsx index 02f1e060f6..f5e9726c13 100644 --- a/public/components/trace_analytics/components/traces/span_detail_table.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_table.tsx @@ -58,34 +58,52 @@ export function SpanDetailTable(props: SpanDetailTableProps) { }, [total]); const columns: EuiDataGridColumn[] = [ - { + ... mode === TraceAnalyticsMode.Jaeger ? [{ id: 'spanID', display: 'Span ID', - }, - { + }] : [{ + id: 'spanId', + display: 'Span ID', + }], + ... mode === TraceAnalyticsMode.Jaeger ? [{ id: 'parentSpanId', display: 'Parent span ID', - }, - { + }] : [{ + id: 'references', + display: 'Parent span ID', + }], + ... mode === TraceAnalyticsMode.Jaeger ? [{ id: 'traceID', display: 'Trace ID', - }, - { + }] : [{ + id: 'traceId', + display: 'Trace ID', + }], + ... mode === TraceAnalyticsMode.Jaeger ? [] : [{ id: 'traceGroup', display: 'Trace group', - }, - { + }], + ... mode === TraceAnalyticsMode.Jaeger ? [{ id: 'process', display: 'Service', - }, - { + }] : [{ + id: 'serviceName', + display: 'Service', + }], + ... mode === TraceAnalyticsMode.Jaeger ? [{ id: 'operationName', display: 'Operation', - }, - { + }] : [{ + id: 'name', + display: 'Operation', + }], + ... mode === TraceAnalyticsMode.Jaeger ? [{ id: 'duration', display: 'Duration', - }, + }] : [{ + id: 'durationInNanos', + display: 'Duration', + }], { id: 'startTime', display: 'Start time', @@ -94,10 +112,13 @@ export function SpanDetailTable(props: SpanDetailTableProps) { id: 'startTime', display: 'End time', }, - { + ... mode === TraceAnalyticsMode.Jaeger ? [{ + id: 'tag', + display: 'Errors', + }] : [{ id: 'status.code', display: 'Errors', - }, + }], ]; const [visibleColumns, setVisibleColumns] = useState(() => @@ -113,8 +134,20 @@ export function SpanDetailTable(props: SpanDetailTableProps) { const value = items[adjustedRowIndex][columnId]; if (value == null || value === '') return '-'; switch (columnId) { + case 'tag': + return (value["error"] !== undefined && value["error"] === true) ? ( + + Yes + + ) : ( + 'No' + );; + case 'references': + return value["spanID"]; case 'process': - return value["serviceName"] + return value["serviceName"]; + case 'spanId': + return props.openFlyout(value)}>{value}; case 'spanID': return props.openFlyout(value)}>{value}; case 'durationInNanos': @@ -122,9 +155,9 @@ export function SpanDetailTable(props: SpanDetailTableProps) { case 'duration': return `${_.round(microToMilliSec(Math.max(0, value)), 2)} ms`; case 'startTime': - return moment(_.round(microToMilliSec(Math.max(0, value)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT); + return mode === TraceAnalyticsMode.Jaeger ? moment(_.round(microToMilliSec(Math.max(0, value)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(value).format(TRACE_ANALYTICS_DATE_FORMAT); case 'endTime': - return moment(_.round(microToMilliSec(Math.max(0, value + items[adjustedRowIndex["duration"]])), 2)).format(TRACE_ANALYTICS_DATE_FORMAT); + return mode === TraceAnalyticsMode.Jaeger ? moment(_.round(microToMilliSec(Math.max(0, value + items[adjustedRowIndex["duration"]])), 2)).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(value).format(TRACE_ANALYTICS_DATE_FORMAT); case 'status.code': return value === 2 ? ( diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 714a3829c5..2ea0a5e26b 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -318,6 +318,7 @@ export const getSpanDetailQuery = (mode: TraceAnalyticsMode, traceId: string, si 'spanID', 'tag', 'duration', + 'references' ] }, }; diff --git a/public/components/trace_analytics/requests/request_handler.ts b/public/components/trace_analytics/requests/request_handler.ts index cf3825386b..f7fd145730 100644 --- a/public/components/trace_analytics/requests/request_handler.ts +++ b/public/components/trace_analytics/requests/request_handler.ts @@ -27,7 +27,6 @@ export function handleDslRequest(http: CoreStart['http'], DSL: any, bodyQuery: a if (!bodyQuery.index) { body = {...bodyQuery, index: ((mode === TraceAnalyticsMode.Jaeger ? JAEGER_INDEX_NAME : DATA_PREPPER_INDEX_NAME)) } } - console.log(body) return http .post(TRACE_ANALYTICS_DSL_ROUTE, { body: JSON.stringify(body), diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index 0c254bae68..77be9eaf79 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -204,7 +204,7 @@ export const handleSpansGanttRequest = ( mode: TraceAnalyticsMode, ) => { handleDslRequest(http, spanFiltersDSL, getSpanDetailQuery(mode, traceId), mode) - .then((response) => hitsToSpanDetailData(response.hits.hits, colorMap)) + .then((response) => hitsToSpanDetailData(response.hits.hits, colorMap, mode)) .then((newItems) => setSpanDetailData(newItems)) .catch((error) => console.error(error)); }; @@ -222,7 +222,7 @@ export const handleSpansFlyoutRequest = ( .catch((error) => console.error(error)); }; -const hitsToSpanDetailData = async (hits: any, colorMap: any) => { +const hitsToSpanDetailData = async (hits: any, colorMap: any, mode: TraceAnalyticsMode) => { const data: { gantt: any[]; table: any[]; ganttMaxX: number } = { gantt: [], table: [], @@ -230,15 +230,15 @@ const hitsToSpanDetailData = async (hits: any, colorMap: any) => { }; if (hits.length === 0) return data; - const minStartTime = microToMilliSec(hits[hits.length - 1].sort[0]); + const minStartTime = mode === TraceAnalyticsMode.Jaeger ? microToMilliSec(hits[hits.length - 1].sort[0]) : nanoToMilliSec(hits[hits.length - 1].sort[0]); let maxEndTime = 0; hits.forEach((hit: any) => { - const startTime = microToMilliSec(hit.sort[0]) - minStartTime; - const duration = _.round(microToMilliSec(hit._source.duration), 2); - const serviceName = _.get(hit, ['_source', 'process'])['serviceName']; - const name = _.get(hit, '_source.operationName'); - const error = hit._source['tag']['error'] === true ? ' \u26a0 Error' : ''; + const startTime = mode === TraceAnalyticsMode.Jaeger ? microToMilliSec(hit.sort[0]) - minStartTime : nanoToMilliSec(hit.sort[0]) - minStartTime; + const duration = mode === TraceAnalyticsMode.Jaeger ? _.round(microToMilliSec(hit._source.duration), 2) : _.round(nanoToMilliSec(hit._source.durationInNanos), 2);; + const serviceName = mode === TraceAnalyticsMode.Jaeger? _.get(hit, ['_source', 'process'])['serviceName'] : _.get(hit, ['_source', 'serviceName']); + const name = mode === TraceAnalyticsMode.Jaeger ? _.get(hit, '_source.operationName') : _.get(hit, '_source.name'); + const error = mode === TraceAnalyticsMode.Jaeger ? (hit._source['tag']['error'] === true ? ' \u26a0 Error' : '') : (hit._source['status.code'] === 2 ? ' \u26a0 Error' : ''); const uniqueLabel = `${serviceName}
${name} ` + uuid(); maxEndTime = Math.max(maxEndTime, startTime + duration); From 0742d803ce04fa04d9191f5eb9d2439c9924e339 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 9 Dec 2022 16:45:32 -0500 Subject: [PATCH 27/67] everything on parity - new features and UX fixes only needed from here on out Signed-off-by: Derek Ho --- .../components/common/plots/service_map.tsx | 2 +- .../components/traces/span_detail_table.tsx | 26 ++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/public/components/trace_analytics/components/common/plots/service_map.tsx b/public/components/trace_analytics/components/common/plots/service_map.tsx index d3fa9f6421..a636049682 100644 --- a/public/components/trace_analytics/components/common/plots/service_map.tsx +++ b/public/components/trace_analytics/components/common/plots/service_map.tsx @@ -124,7 +124,7 @@ export function ServiceMap({ const serviceName = items?.graph.nodes.find((node: any) => node.id === nodes[0])?.label; if (serviceName) { addFilter({ - field: 'process.serviceName', + field: 'serviceName', operator: 'is', value: serviceName, inverted: false, diff --git a/public/components/trace_analytics/components/traces/span_detail_table.tsx b/public/components/trace_analytics/components/traces/span_detail_table.tsx index f5e9726c13..8cd5ef7a1c 100644 --- a/public/components/trace_analytics/components/traces/span_detail_table.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_table.tsx @@ -66,10 +66,10 @@ export function SpanDetailTable(props: SpanDetailTableProps) { display: 'Span ID', }], ... mode === TraceAnalyticsMode.Jaeger ? [{ - id: 'parentSpanId', + id: 'references', display: 'Parent span ID', }] : [{ - id: 'references', + id: 'parentSpanId', display: 'Parent span ID', }], ... mode === TraceAnalyticsMode.Jaeger ? [{ @@ -108,10 +108,13 @@ export function SpanDetailTable(props: SpanDetailTableProps) { id: 'startTime', display: 'Start time', }, - { - id: 'startTime', + ... mode === TraceAnalyticsMode.Jaeger ? [{ + id: 'jaegerEndTime', display: 'End time', - }, + }] : [{ + id: 'endTime', + display: 'End time', + }], ... mode === TraceAnalyticsMode.Jaeger ? [{ id: 'tag', display: 'Errors', @@ -132,10 +135,10 @@ export function SpanDetailTable(props: SpanDetailTableProps) { const adjustedRowIndex = rowIndex - tableParams.page * tableParams.size; if (!items.hasOwnProperty(adjustedRowIndex)) return '-'; const value = items[adjustedRowIndex][columnId]; - if (value == null || value === '') return '-'; + if ((value == null || value === '') && columnId !== 'jaegerEndTime') return '-'; switch (columnId) { case 'tag': - return (value["error"] !== undefined && value["error"] === true) ? ( + return (value["error"] === true) ? ( Yes @@ -143,7 +146,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { 'No' );; case 'references': - return value["spanID"]; + return value.length > 0 ? value[0]["spanID"] : ''; case 'process': return value["serviceName"]; case 'spanId': @@ -156,8 +159,10 @@ export function SpanDetailTable(props: SpanDetailTableProps) { return `${_.round(microToMilliSec(Math.max(0, value)), 2)} ms`; case 'startTime': return mode === TraceAnalyticsMode.Jaeger ? moment(_.round(microToMilliSec(Math.max(0, value)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(value).format(TRACE_ANALYTICS_DATE_FORMAT); + case 'jaegerEndTime': + return moment(_.round(microToMilliSec(Math.max(0, items[adjustedRowIndex]["startTime"] + items[adjustedRowIndex]["duration"])), 2)).format(TRACE_ANALYTICS_DATE_FORMAT); case 'endTime': - return mode === TraceAnalyticsMode.Jaeger ? moment(_.round(microToMilliSec(Math.max(0, value + items[adjustedRowIndex["duration"]])), 2)).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(value).format(TRACE_ANALYTICS_DATE_FORMAT); + return moment(value).format(TRACE_ANALYTICS_DATE_FORMAT); case 'status.code': return value === 2 ? ( @@ -200,7 +205,8 @@ export function SpanDetailTable(props: SpanDetailTableProps) { columnVisibility={{ visibleColumns, setVisibleColumns }} rowCount={total} renderCellValue={renderCellValue} - sorting={{ columns: tableParams.sortingColumns, onSort }} + sorting={mode === TraceAnalyticsMode.Jaeger ? undefined : { columns: tableParams.sortingColumns, onSort }} + toolbarVisibility={mode === TraceAnalyticsMode.Jaeger ? false : true} pagination={{ pageIndex: tableParams.page, pageSize: tableParams.size, From 81d3abfae201673d1e65395324c00cf669bd95ed Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Mon, 12 Dec 2022 12:00:47 -0500 Subject: [PATCH 28/67] fix service flyout pannel Signed-off-by: Derek Ho --- .../components/services/service_view.tsx | 2 ++ .../components/traces/span_detail_flyout.tsx | 36 +++++++++++-------- .../components/traces/span_detail_panel.tsx | 1 + 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index eca0904f89..01c27432f4 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -294,6 +294,7 @@ export function ServiceView(props: ServiceViewProps) { DSL={DSL} openFlyout={(spanId: string) => setCurrentSpan(spanId)} setTotal={setTotal} + mode={mode} /> ), [DSL, setCurrentSpan] @@ -344,6 +345,7 @@ export function ServiceView(props: ServiceViewProps) { isFlyoutVisible={!!currentSpan} closeFlyout={() => setCurrentSpan('')} addSpanFilter={addSpanFilter} + mode={mode} /> )} diff --git a/public/components/trace_analytics/components/traces/span_detail_flyout.tsx b/public/components/trace_analytics/components/traces/span_detail_flyout.tsx index a49432d615..9a99abab95 100644 --- a/public/components/trace_analytics/components/traces/span_detail_flyout.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_flyout.tsx @@ -22,8 +22,9 @@ import moment from 'moment'; import React, { useEffect, useState } from 'react'; import { HttpSetup } from '../../../../../../../src/core/public'; import { TRACE_ANALYTICS_DATE_FORMAT } from '../../../../../common/constants/trace_analytics'; +import { TraceAnalyticsMode } from '../../home'; import { handleSpansFlyoutRequest } from '../../requests/traces_request_handler'; -import { nanoToMilliSec } from '../common/helper_functions'; +import { microToMilliSec, nanoToMilliSec } from '../common/helper_functions'; import { FlyoutListItem } from './flyout_list_item'; export function SpanDetailFlyout(props: { @@ -32,11 +33,13 @@ export function SpanDetailFlyout(props: { isFlyoutVisible: boolean; closeFlyout: () => void; addSpanFilter: (field: string, value: any) => void; + mode?: TraceAnalyticsMode; }) { + const mode = props.mode !== undefined ? props.mode: TraceAnalyticsMode.Data_Prepper; const [span, setSpan] = useState({}); useEffect(() => { - handleSpansFlyoutRequest(props.http, props.spanId, setSpan); + handleSpansFlyoutRequest(props.http, props.spanId, setSpan, mode); }, [props.spanId]); const getListItem = (field: string, title: React.ReactNode, description: React.ReactNode) => { @@ -64,16 +67,16 @@ export function SpanDetailFlyout(props: { getListItem( 'spanId', 'Span ID', - span.spanId ? ( + (mode === TraceAnalyticsMode.Data_Prepper ? span.spanId : span.spanID) ? ( - + {(copy) => ( )} - {span.spanId} + {mode === TraceAnalyticsMode.Data_Prepper ? span.spanId : span.spanID} ) : ( '-' @@ -82,38 +85,38 @@ export function SpanDetailFlyout(props: { getListItem( 'parentSpanId', 'Parent span ID', - span.parentSpanId ? ( + (mode === TraceAnalyticsMode.Data_Prepper ? span.parentSpanId : span.references.length) ? ( - + {(copy) => ( )} - {span.parentSpanId} + {mode === TraceAnalyticsMode.Data_Prepper ? span.parentSpanId : span.references[0].spanID} ) : ( '-' ) ), - getListItem('serviceName', 'Service', span.serviceName || '-'), - getListItem('name', 'Operation', span.name || '-'), + getListItem('serviceName', 'Service', (mode === TraceAnalyticsMode.Data_Prepper ? span.serviceName : span.process['serviceName']) || '-'), + getListItem('name', 'Operation', (mode === TraceAnalyticsMode.Data_Prepper ? span.name : span.operationName) || '-'), getListItem( 'durationInNanos', 'Duration', - `${_.round(nanoToMilliSec(Math.max(0, span.durationInNanos)), 2)} ms` + `${(mode === TraceAnalyticsMode.Data_Prepper ? _.round(nanoToMilliSec(Math.max(0, span.durationInNanos)), 2) : _.round(microToMilliSec(Math.max(0, span.duration)), 2))} ms` ), getListItem( 'startTime', 'Start time', - moment(span.startTime).format(TRACE_ANALYTICS_DATE_FORMAT) + mode === TraceAnalyticsMode.Data_Prepper ? moment(span.startTime).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(_.round(microToMilliSec(Math.max(0, span.startTime)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT) ), - getListItem('endTime', 'End time', moment(span.endTime).format(TRACE_ANALYTICS_DATE_FORMAT)), + getListItem('endTime', 'End time', mode === TraceAnalyticsMode.Data_Prepper ? moment(span.endTime).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(_.round(microToMilliSec(Math.max(0, span.startTime + span.duration)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT)), getListItem( 'status.code', 'Errors', - span['status.code'] === 2 ? ( + (mode === TraceAnalyticsMode.Data_Prepper ? span['status.code'] === 2 : span.tag['error']) ? ( Yes @@ -124,15 +127,20 @@ export function SpanDetailFlyout(props: { ]; const ignoredKeys = new Set([ 'spanId', + 'spanID', 'parentSpanId', 'serviceName', 'name', + 'operationName', 'durationInNanos', + 'duration', 'startTime', + 'startTimeMillis', 'endTime', 'status.code', 'events', 'traceId', + 'traceID', 'traceGroup', 'traceGroupFields.endTime', 'traceGroupFields.statusCode', diff --git a/public/components/trace_analytics/components/traces/span_detail_panel.tsx b/public/components/trace_analytics/components/traces/span_detail_panel.tsx index 39ec1d3f0e..95ff0368d4 100644 --- a/public/components/trace_analytics/components/traces/span_detail_panel.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_panel.tsx @@ -283,6 +283,7 @@ export function SpanDetailPanel(props: { isFlyoutVisible={!!currentSpan} closeFlyout={() => setCurrentSpan('')} addSpanFilter={addSpanFilter} + mode={mode} /> )} From 9ec8533ea4f57bd1f8072d593d9eb6f0a8494a13 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Mon, 12 Dec 2022 12:08:32 -0500 Subject: [PATCH 29/67] fix app analytics Signed-off-by: Derek Ho --- public/components/application_analytics/home.tsx | 5 ++--- public/components/trace_analytics/home.tsx | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/components/application_analytics/home.tsx b/public/components/application_analytics/home.tsx index 4e44470fd3..3d9abaebd4 100644 --- a/public/components/application_analytics/home.tsx +++ b/public/components/application_analytics/home.tsx @@ -20,7 +20,7 @@ import { Application } from './components/application'; import { CreateApp } from './components/create'; import { TraceAnalyticsComponentDeps, TraceAnalyticsCoreDeps } from '../trace_analytics/home'; import { FilterType } from '../trace_analytics/components/common/filters/filters'; -import { handleIndicesExistRequest } from '../trace_analytics/requests/request_handler'; +import { handleDataPrepperIndicesExistRequest } from '../trace_analytics/requests/request_handler'; import { ObservabilitySideBar } from '../common/side_nav'; import { NotificationsStart } from '../../../../../src/core/public'; import { APP_ANALYTICS_API_PREFIX } from '../../../common/constants/application_analytics'; @@ -114,7 +114,7 @@ export const Home = (props: HomeProps) => { }; useEffect(() => { - handleIndicesExistRequest(http, setIndicesExist); + handleDataPrepperIndicesExistRequest(http, setIndicesExist); }, []); const commonProps: AppAnalyticsComponentDeps = { @@ -137,7 +137,6 @@ export const Home = (props: HomeProps) => { setStartTime, endTime, setEndTime, - indicesExist, }; const setToast = (title: string, color = 'success', text?: ReactChild) => { diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index 57b7bae19a..c94f6a889e 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -33,7 +33,7 @@ export enum TraceAnalyticsMode { } export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, SearchBarProps { - mode: TraceAnalyticsMode; + mode?: TraceAnalyticsMode; } export const Home = (props: HomeProps) => { From 5dba2451feb0e94cf5e1723b22c72b33457f1792 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Mon, 12 Dec 2022 12:45:28 -0500 Subject: [PATCH 30/67] default to data prepper for app analytics Signed-off-by: Derek Ho --- .../components/dashboard/dashboard_content.tsx | 2 +- .../trace_analytics/components/services/service_view.tsx | 2 +- .../trace_analytics/components/services/services_content.tsx | 2 +- .../trace_analytics/components/traces/span_detail_table.tsx | 4 ++-- .../trace_analytics/components/traces/trace_view.tsx | 4 ++-- .../trace_analytics/components/traces/traces_content.tsx | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index a581acbad7..322571c6bc 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -44,12 +44,12 @@ export function DashboardContent(props: DashboardProps) { childBreadcrumbs, parentBreadcrumbs, filters, - mode, setStartTime, setEndTime, setQuery, setFilters, } = props; + const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper const [tableItems, setTableItems] = useState([]); const [throughputPltItems, setThroughputPltItems] = useState({ items: [], fixedInterval: '1h' }); const [errorRatePltItems, setErrorRatePltItems] = useState({ items: [], fixedInterval: '1h' }); diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index 01c27432f4..bf200492b2 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -38,7 +38,7 @@ interface ServiceViewProps extends TraceAnalyticsComponentDeps { } export function ServiceView(props: ServiceViewProps) { - const { mode } = props; + const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper const [fields, setFields] = useState({}); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index 4edae1c570..911bbdfbc4 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -29,7 +29,6 @@ export function ServicesContent(props: ServicesProps) { query, startTime, endTime, - mode, appConfigs = [], childBreadcrumbs, parentBreadcrumbs, @@ -40,6 +39,7 @@ export function ServicesContent(props: ServicesProps) { setStartTime, setEndTime, } = props; + const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper; const [tableItems, setTableItems] = useState([]); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< diff --git a/public/components/trace_analytics/components/traces/span_detail_table.tsx b/public/components/trace_analytics/components/traces/span_detail_table.tsx index 8cd5ef7a1c..904184c6b0 100644 --- a/public/components/trace_analytics/components/traces/span_detail_table.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_table.tsx @@ -18,7 +18,7 @@ interface SpanDetailTableProps { http: HttpSetup; hiddenColumns: string[]; openFlyout: (spanId: string) => void; - mode: TraceAnalyticsMode + mode?: TraceAnalyticsMode DSL?: any; setTotal?: (total: number) => void; } @@ -40,7 +40,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { direction: 'asc' | 'desc'; }>, }); - const { mode } = props; + const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper; const [items, setItems] = useState([]); const [total, setTotal] = useState(0); diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index cb70ddefb6..8146a69bc1 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -36,11 +36,11 @@ interface TraceViewProps extends TraceAnalyticsCoreDeps { traceId: string; startTime: string; endTime: string; - mode: TraceAnalyticsMode; + mode?: TraceAnalyticsMode; } export function TraceView(props: TraceViewProps) { - const { mode } = props; + const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper const page = 'traceView'; const renderTitle = (traceId: string) => { return ( diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index 450a48265a..1e1a3adf48 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -24,7 +24,6 @@ export function TracesContent(props: TracesProps) { appConfigs, startTime, endTime, - mode, parentBreadcrumbs, childBreadcrumbs, traceIdColumnAction, @@ -33,6 +32,7 @@ export function TracesContent(props: TracesProps) { setStartTime, setEndTime, } = props; + const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper const [tableItems, setTableItems] = useState([]); const [redirect, setRedirect] = useState(true); const [loading, setLoading] = useState(false); From cabf24ff7532ffe02c1f88c7d380cef34478cf24 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 16 Dec 2022 09:52:05 -0500 Subject: [PATCH 31/67] try to fix failing tests Signed-off-by: Derek Ho --- .babelrc | 1 + package.json | 2 ++ .../common/filters/filter_helpers.tsx | 8 ++--- .../dashboard/__tests__/dashboard.test.tsx | 2 -- .../services/__tests__/service_view.test.tsx | 1 - .../services/__tests__/services.test.tsx | 2 -- .../__tests__/services_table.test.tsx | 2 -- .../components/services/services_table.tsx | 4 +-- .../components/traces/span_detail_flyout.tsx | 4 +-- public/components/trace_analytics/home.tsx | 16 +++++---- .../requests/services_request_handler.ts | 8 ++--- yarn.lock | 34 +++++++++++++++++++ 12 files changed, 58 insertions(+), 26 deletions(-) diff --git a/.babelrc b/.babelrc index e21b3f2f2b..39d2796c65 100644 --- a/.babelrc +++ b/.babelrc @@ -10,6 +10,7 @@ "@babel/preset-typescript" ], "plugins": [ + "@babel/plugin-syntax-flow", "@babel/plugin-transform-modules-commonjs", ["@babel/plugin-transform-runtime", { "regenerator": true }], "@babel/plugin-proposal-class-properties", diff --git a/package.json b/package.json index 2b9abcc485..110ba45c46 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,8 @@ "redux-persist": "^6.0.0" }, "devDependencies": { + "@babel/plugin-syntax-flow": "^7.18.6", + "@babel/preset-flow": "^7.18.6", "@cypress/skip-test": "^2.6.1", "@types/enzyme-adapter-react-16": "^1.0.6", "@types/react-plotly.js": "^2.5.0", diff --git a/public/components/trace_analytics/components/common/filters/filter_helpers.tsx b/public/components/trace_analytics/components/common/filters/filter_helpers.tsx index 0786d77dd1..1410bfea00 100644 --- a/public/components/trace_analytics/components/common/filters/filter_helpers.tsx +++ b/public/components/trace_analytics/components/common/filters/filter_helpers.tsx @@ -15,10 +15,10 @@ import React from 'react'; const getFields = (page: 'dashboard' | 'traces' | 'services' | 'app') => ({ - dashboard: ['traceGroup', 'process.serviceName', 'error', 'status.message', 'latency'], - traces: ['traceId', 'traceGroup', 'process.serviceName', 'error', 'status.message', 'latency'], - services: ['traceGroup', 'process.serviceName', 'error', 'status.message', 'latency'], - app: ['traceId', 'traceGroup', 'process.serviceName'], + dashboard: ['traceGroup', 'serviceName', 'error', 'status.message', 'latency'], + traces: ['traceId', 'traceGroup', 'serviceName', 'error', 'status.message', 'latency'], + services: ['traceGroup', 'serviceName', 'error', 'status.message', 'latency'], + app: ['traceId', 'traceGroup', 'serviceName'], }[page]); // filters will take effect and can be manually added export const getFilterFields = (page: 'dashboard' | 'traces' | 'services' | 'app') => getFields(page); diff --git a/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx b/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx index 0f5c169188..9c1a7c3a50 100644 --- a/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx +++ b/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx @@ -48,7 +48,6 @@ describe('Dashboard component', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={false} page="dashboard" /> ); @@ -91,7 +90,6 @@ describe('Dashboard component', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} page="dashboard" /> ); diff --git a/public/components/trace_analytics/components/services/__tests__/service_view.test.tsx b/public/components/trace_analytics/components/services/__tests__/service_view.test.tsx index b480555482..bd0db0fb0d 100644 --- a/public/components/trace_analytics/components/services/__tests__/service_view.test.tsx +++ b/public/components/trace_analytics/components/services/__tests__/service_view.test.tsx @@ -34,7 +34,6 @@ describe('Service view component', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={false} addFilter={addFilter} /> ); diff --git a/public/components/trace_analytics/components/services/__tests__/services.test.tsx b/public/components/trace_analytics/components/services/__tests__/services.test.tsx index fca7a6c44b..d7b3482d25 100644 --- a/public/components/trace_analytics/components/services/__tests__/services.test.tsx +++ b/public/components/trace_analytics/components/services/__tests__/services.test.tsx @@ -48,7 +48,6 @@ describe('Services component', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={false} page="services" /> ); @@ -92,7 +91,6 @@ describe('Services component', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} page="services" /> ); diff --git a/public/components/trace_analytics/components/services/__tests__/services_table.test.tsx b/public/components/trace_analytics/components/services/__tests__/services_table.test.tsx index a4eb24e3c2..5a00bdd205 100644 --- a/public/components/trace_analytics/components/services/__tests__/services_table.test.tsx +++ b/public/components/trace_analytics/components/services/__tests__/services_table.test.tsx @@ -24,7 +24,6 @@ describe('Services table component', () => { traceColumnAction={traceColumnAction} addFilter={addFilter} setRedirect={setRedirect} - indicesExist={true} loading={false} /> ); @@ -56,7 +55,6 @@ describe('Services table component', () => { traceColumnAction={traceColumnAction} addFilter={addFilter} setRedirect={setRedirect} - indicesExist={true} loading={false} /> ); diff --git a/public/components/trace_analytics/components/services/services_table.tsx b/public/components/trace_analytics/components/services/services_table.tsx index aca89444f4..6a94c1d8cc 100644 --- a/public/components/trace_analytics/components/services/services_table.tsx +++ b/public/components/trace_analytics/components/services/services_table.tsx @@ -18,7 +18,7 @@ import { } from '@elastic/eui'; import _ from 'lodash'; import React, { useMemo } from 'react'; -import { TraceAnalyticsMode } from '../../home'; +import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../../home'; import { FilterType } from '../common/filters/filters'; import { MissingConfigurationMessage, @@ -28,12 +28,12 @@ import { interface ServicesTableProps { items: any[]; - mode: TraceAnalyticsMode; loading: boolean; nameColumnAction: (item: any) => any; traceColumnAction: any; addFilter: (filter: FilterType) => void; setRedirect: (redirect: boolean) => void; + mode?: TraceAnalyticsModeType; } export function ServicesTable(props: ServicesTableProps) { diff --git a/public/components/trace_analytics/components/traces/span_detail_flyout.tsx b/public/components/trace_analytics/components/traces/span_detail_flyout.tsx index 9a99abab95..7094c61f69 100644 --- a/public/components/trace_analytics/components/traces/span_detail_flyout.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_flyout.tsx @@ -22,7 +22,7 @@ import moment from 'moment'; import React, { useEffect, useState } from 'react'; import { HttpSetup } from '../../../../../../../src/core/public'; import { TRACE_ANALYTICS_DATE_FORMAT } from '../../../../../common/constants/trace_analytics'; -import { TraceAnalyticsMode } from '../../home'; +import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../../home'; import { handleSpansFlyoutRequest } from '../../requests/traces_request_handler'; import { microToMilliSec, nanoToMilliSec } from '../common/helper_functions'; import { FlyoutListItem } from './flyout_list_item'; @@ -33,7 +33,7 @@ export function SpanDetailFlyout(props: { isFlyoutVisible: boolean; closeFlyout: () => void; addSpanFilter: (field: string, value: any) => void; - mode?: TraceAnalyticsMode; + mode?: TraceAnalyticsModeType; }) { const mode = props.mode !== undefined ? props.mode: TraceAnalyticsMode.Data_Prepper; const [span, setSpan] = useState({}); diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index c94f6a889e..3f883d6209 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -26,20 +26,22 @@ export interface TraceAnalyticsCoreDeps { interface HomeProps extends RouteComponentProps, TraceAnalyticsCoreDeps {} -export enum TraceAnalyticsMode { - Jaeger, - Data_Prepper, - None -} +export const TraceAnalyticsMode = { + Jaeger : 'jaeger', + Data_Prepper : 'data_prepper', + None : 'none' +} as const; + +export type TraceAnalyticsModeType = typeof TraceAnalyticsMode[keyof typeof TraceAnalyticsMode]; export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, SearchBarProps { - mode?: TraceAnalyticsMode; + mode?: TraceAnalyticsModeType; } export const Home = (props: HomeProps) => { const [dataPrepperIndicesExist, setDataPrepperIndicesExist] = useState(true); const [jaegerIndicesExist, setJaegerIndicesExist] = useState(true); - const [mode, setMode] = useState(TraceAnalyticsMode.Jaeger) + const [mode, setMode] = useState(TraceAnalyticsMode.Jaeger) const storedFilters = sessionStorage.getItem('TraceAnalyticsFilters'); const [query, setQuery] = useState(sessionStorage.getItem('TraceAnalyticsQuery') || ''); const [filters, setFilters] = useState( diff --git a/public/components/trace_analytics/requests/services_request_handler.ts b/public/components/trace_analytics/requests/services_request_handler.ts index 1b5b6f7c6c..3946306bf5 100644 --- a/public/components/trace_analytics/requests/services_request_handler.ts +++ b/public/components/trace_analytics/requests/services_request_handler.ts @@ -17,13 +17,13 @@ import { } from './queries/services_queries'; import { handleDslRequest } from './request_handler'; import { HttpSetup } from '../../../../../../src/core/public'; -import { TraceAnalyticsMode } from '../home'; +import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../home'; export const handleServicesRequest = async ( http: HttpSetup, DSL: any, setItems: any, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, setServiceMap?: any, serviceNameFilter?: string, ) => { @@ -59,7 +59,7 @@ export const handleServicesRequest = async ( export const handleServiceMapRequest = async ( http: HttpSetup, DSL: DSLService | any, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, setItems?: any, currService?: string, ) => { @@ -165,7 +165,7 @@ export const handleServiceViewRequest = ( http: HttpSetup, DSL: any, setFields: any, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, ) => { handleDslRequest(http, DSL, getServicesQuery(mode, serviceName), mode) .then(async (response) => { diff --git a/yarn.lock b/yarn.lock index 44525fa761..2f7d6c6cfc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,11 +26,21 @@ dependencies: "@babel/highlight" "^7.16.7" +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "@babel/highlight@^7.16.7": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" @@ -40,6 +50,30 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-flow-strip-types@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" + integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-flow" "^7.18.6" + +"@babel/preset-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.18.6.tgz#83f7602ba566e72a9918beefafef8ef16d2810cb" + integrity sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-flow-strip-types" "^7.18.6" + "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" From 3342e38194643f2798404ffd507e4291688dab1b Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 16 Dec 2022 10:54:47 -0500 Subject: [PATCH 32/67] try to fix some more syntax and test issues Signed-off-by: Derek Ho --- .../__tests__/create.test.tsx | 9 +-------- .../config_components/service_config.tsx | 4 +++- .../config_components/trace_config.tsx | 5 ++++- .../service_detail_flyout.tsx | 4 ++-- .../flyout_components/trace_detail_render.tsx | 12 +++++++---- .../components/common/helper_functions.tsx | 4 ++-- .../components/services/services_content.tsx | 2 +- .../components/traces/trace_view.tsx | 8 +++----- public/components/trace_analytics/home.tsx | 2 +- .../requests/dashboard_request_handler.ts | 4 ++-- .../requests/queries/services_queries.ts | 10 +++++----- .../requests/request_handler.ts | 4 ++-- .../requests/traces_request_handler.ts | 20 +++++++++---------- 13 files changed, 44 insertions(+), 44 deletions(-) diff --git a/public/components/application_analytics/__tests__/create.test.tsx b/public/components/application_analytics/__tests__/create.test.tsx index 5fda0c03a8..c75b691efa 100644 --- a/public/components/application_analytics/__tests__/create.test.tsx +++ b/public/components/application_analytics/__tests__/create.test.tsx @@ -11,6 +11,7 @@ import { coreStartMock } from '../../../../test/__mocks__/coreMocks'; import DSLService from 'public/services/requests/dsl'; import PPLService from 'public/services/requests/ppl'; import { render } from '@testing-library/react'; +import { TraceAnalyticsMode } from 'public/components/trace_analytics/home'; describe('Create Page', () => { configure({ adapter: new Adapter() }); @@ -56,7 +57,6 @@ describe('Create Page', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} name="" description="" setNameWithStorage={setNameWithStorage} @@ -120,7 +120,6 @@ describe('Create Page', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} name="Chic Application" description="This is my chic application." setNameWithStorage={setNameWithStorage} @@ -184,7 +183,6 @@ describe('Create Page', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} name="" description="" setNameWithStorage={setNameWithStorage} @@ -251,7 +249,6 @@ describe('Create Page', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} name="" description="" setNameWithStorage={setNameWithStorage} @@ -327,7 +324,6 @@ describe('Create Page', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} name="" description="" setNameWithStorage={setNameWithStorage} @@ -403,7 +399,6 @@ describe('Create Page', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} name="" description="" setNameWithStorage={setNameWithStorage} @@ -479,7 +474,6 @@ describe('Create Page', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} name="" description="" setNameWithStorage={setNameWithStorage} @@ -555,7 +549,6 @@ describe('Create Page', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} name="" description="" setNameWithStorage={setNameWithStorage} diff --git a/public/components/application_analytics/components/config_components/service_config.tsx b/public/components/application_analytics/components/config_components/service_config.tsx index 30b78adcdc..638349f02d 100644 --- a/public/components/application_analytics/components/config_components/service_config.tsx +++ b/public/components/application_analytics/components/config_components/service_config.tsx @@ -24,6 +24,7 @@ import { handleServiceMapRequest } from '../../../trace_analytics/requests/servi import { AppAnalyticsComponentDeps } from '../../home'; import { OptionType } from '../../../../../common/types/application_analytics'; import { getClearModal } from '../../helpers/modal_containers'; +import { TraceAnalyticsMode } from '../../../../../public/components/trace_analytics/home'; interface ServiceConfigProps extends AppAnalyticsComponentDeps { dslService: DSLService; @@ -40,6 +41,7 @@ export const ServiceConfig = (props: ServiceConfigProps) => { selectedServices, setSelectedServices, } = props; + const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper; const [servicesOpen, setServicesOpen] = useState(false); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< @@ -49,7 +51,7 @@ export const ServiceConfig = (props: ServiceConfigProps) => { const [modalLayout, setModalLayout] = useState(); useEffect(() => { - handleServiceMapRequest(http, dslService, setServiceMap); + handleServiceMapRequest(http, dslService, mode, setServiceMap); }, []); useEffect(() => { diff --git a/public/components/application_analytics/components/config_components/trace_config.tsx b/public/components/application_analytics/components/config_components/trace_config.tsx index 92d0d40bf1..b8f634e6b5 100644 --- a/public/components/application_analytics/components/config_components/trace_config.tsx +++ b/public/components/application_analytics/components/config_components/trace_config.tsx @@ -17,13 +17,14 @@ import { } from '@elastic/eui'; import DSLService from 'public/services/requests/dsl'; import React, { useEffect, useState } from 'react'; -import { FilterType } from 'public/components/trace_analytics/components/common/filters/filters'; +import { FilterType } from '../../../../../public/components/trace_analytics/components/common/filters/filters'; import { OptionType } from '../../../../../common/types/application_analytics'; import { filtersToDsl } from '../../../trace_analytics/components/common/helper_functions'; import { handleDashboardRequest } from '../../../trace_analytics/requests/dashboard_request_handler'; import { AppAnalyticsComponentDeps } from '../../home'; import { DashboardTable } from '../../../trace_analytics/components/dashboard/dashboard_table'; import { getClearModal } from '../../helpers/modal_containers'; +import { TraceAnalyticsMode } from '../../../../../public/components/trace_analytics/home'; interface TraceConfigProps extends AppAnalyticsComponentDeps { dslService: DSLService; @@ -43,6 +44,7 @@ export const TraceConfig = (props: TraceConfigProps) => { selectedTraces, setSelectedTraces, } = props; + const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper; const [traceOpen, setTraceOpen] = useState(false); const [loading, setLoading] = useState(false); const [traceItems, setTraceItems] = useState([]); @@ -64,6 +66,7 @@ export const TraceConfig = (props: TraceConfigProps) => { latencyTrendDSL, traceItems, setTraceItems, + mode, setPercentileMap ).then(() => setLoading(false)); setRedirect(false); diff --git a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx index 3c4b11a60b..7bcf9426e4 100644 --- a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx @@ -23,7 +23,7 @@ import { filtersToDsl, processTimeStamp } from '../../../../../public/components import { ServiceMap } from '../../../../../public/components/trace_analytics/components/services'; import { ServiceObject } from '../../../../../public/components/trace_analytics/components/common/plots/service_map'; import { SpanDetailTable } from '../../../../../public/components/trace_analytics/components/traces/span_detail_table'; -import { TraceAnalyticsComponentDeps } from '../../../../../public/components/trace_analytics/home'; +import { TraceAnalyticsComponentDeps, TraceAnalyticsMode } from '../../../../../public/components/trace_analytics/home'; import { getListItem } from '../../helpers/utils'; interface ServiceFlyoutProps extends TraceAnalyticsComponentDeps { @@ -44,8 +44,8 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { query, closeServiceFlyout, openSpanFlyout, - mode, } = props; + const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper; const [fields, setFields] = useState({}); const [serviceMap, setServiceMap] = useState({}); const [total, setTotal] = useState(0); diff --git a/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx b/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx index 34a91e01b1..9b4289df45 100644 --- a/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx +++ b/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx @@ -14,14 +14,17 @@ import { } from '../../../trace_analytics/requests/traces_request_handler'; import { HttpStart } from '../../../../../../../src/core/public'; import { getListItem } from '../../helpers/utils'; +import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../../../../../public/components/trace_analytics/home'; interface TraceDetailRenderProps { traceId: string; http: HttpStart; openSpanFlyout: (spanId: string) => void; + traceAnalyticsMode? : TraceAnalyticsModeType } -export const TraceDetailRender = ({ traceId, http, openSpanFlyout }: TraceDetailRenderProps) => { +export const TraceDetailRender = ({ traceId, http, openSpanFlyout, traceAnalyticsMode }: TraceDetailRenderProps) => { + const mode = traceAnalyticsMode !== undefined ? traceAnalyticsMode : TraceAnalyticsMode.Data_Prepper; const [fields, setFields] = useState({}); const [serviceBreakdownData, setServiceBreakdownData] = useState([]); const [payloadData, setPayloadData] = useState(''); @@ -66,6 +69,7 @@ export const TraceDetailRender = ({ traceId, http, openSpanFlyout }: TraceDetail colorMap={colorMap} page="app" openSpanFlyout={openSpanFlyout} + mode={mode} /> @@ -83,9 +87,9 @@ export const TraceDetailRender = ({ traceId, http, openSpanFlyout }: TraceDetail }, [traceId, fields, serviceBreakdownData, colorMap, payloadData]); useEffect(() => { - handleTraceViewRequest(traceId, http, fields, setFields); - handleServicesPieChartRequest(traceId, http, setServiceBreakdownData, setColorMap); - handlePayloadRequest(traceId, http, payloadData, setPayloadData); + handleTraceViewRequest(traceId, http, fields, setFields, mode); + handleServicesPieChartRequest(traceId, http, setServiceBreakdownData, setColorMap, mode); + handlePayloadRequest(traceId, http, payloadData, setPayloadData, mode); }, [traceId]); return renderContent; diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index eb39eec6d9..1cadc34f5d 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -17,7 +17,7 @@ import { JAEGER_SERVICE_INDEX_NAME, } from '../../../../../common/constants/trace_analytics'; import { uiSettingsService } from '../../../../../common/utils'; -import { TraceAnalyticsMode } from '../../home'; +import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../../home'; import { serviceMapColorPalette } from './color_palette'; import { FilterType } from './filters/filters'; import { ServiceObject } from './plots/service_map'; @@ -76,7 +76,7 @@ export function MissingConfigurationMessage() { ); } -export function processTimeStamp(time: string, mode: TraceAnalyticsMode) { +export function processTimeStamp(time: string, mode: TraceAnalyticsModeType) { if (mode === TraceAnalyticsMode.Jaeger) { const timeMoment = dateMath.parse(time)!; return timeMoment.unix() * 1000000; diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index 911bbdfbc4..ec0c2dfa94 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -129,7 +129,7 @@ export function ServicesContent(props: ServicesProps) { traceColumnAction={traceColumnAction} /> - { mode === TraceAnalyticsMode.Data_Prepper ? + { mode === "Data_Prepper" ? ('latency'); const refresh = async () => { - const DSL = filtersToDsl([], '', processTimeStamp(props.startTime, mode), processTimeStamp(props.endTime, mode), page); + const DSL = filtersToDsl([], '', processTimeStamp('now', mode), processTimeStamp('now', mode), page); handleTraceViewRequest(props.traceId, props.http, fields, setFields, mode); handlePayloadRequest(props.traceId, props.http, payloadData, setPayloadData, mode); handleServicesPieChartRequest(props.traceId, props.http, setServiceBreakdownData, setColorMap, mode); diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index 3f883d6209..1c2c08784c 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -176,7 +176,7 @@ export const Home = (props: HomeProps) => { chrome={props.chrome} http={props.http} traceId={decodeURIComponent(routerProps.match.params.id)} - {...commonProps} + mode={mode} /> )} /> diff --git a/public/components/trace_analytics/requests/dashboard_request_handler.ts b/public/components/trace_analytics/requests/dashboard_request_handler.ts index 5c66782f71..071ca9a12a 100644 --- a/public/components/trace_analytics/requests/dashboard_request_handler.ts +++ b/public/components/trace_analytics/requests/dashboard_request_handler.ts @@ -45,7 +45,7 @@ export const handleDashboardRequest = async ( .catch((error) => console.error(error)); if (setPercentileMap) setPercentileMap(latencyVariances); - const latencyTrends = await handleDslRequest(http, latencyTrendDSL, getLatencyTrendQuery()) + const latencyTrends = await handleDslRequest(http, latencyTrendDSL, getLatencyTrendQuery(), mode) .then((response) => { const map: any = {}; response.aggregations.trace_group_name.buckets.map((bucket) => { @@ -100,7 +100,7 @@ export const handleDashboardRequest = async ( }) .catch((error) => console.error(error)); - await handleDslRequest(http, DSL, getDashboardQuery()) + await handleDslRequest(http, DSL, getDashboardQuery(), mode) .then((response) => { return Promise.all( response.aggregations.trace_group_name.buckets.map((bucket) => { diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index ef4b8a620b..5a7ab46418 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -11,9 +11,9 @@ import { } from '../../../../../common/constants/trace_analytics'; import { getServiceMapTargetResources } from '../../components/common/helper_functions'; import { ServiceObject } from '../../components/common/plots/service_map'; -import { TraceAnalyticsMode } from '../../home'; +import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../../home'; -export const getServicesQuery = (mode: TraceAnalyticsMode, serviceName: string | undefined, DSL?: any) => { +export const getServicesQuery = (mode: TraceAnalyticsModeType, serviceName: string | undefined, DSL?: any) => { const query = { size: 0, query: { @@ -133,7 +133,7 @@ export const getRelatedServicesQuery = (serviceName: string) => { return query; }; -export const getServiceNodesQuery = (mode: TraceAnalyticsMode) => { +export const getServiceNodesQuery = (mode: TraceAnalyticsModeType) => { return { index: mode === TraceAnalyticsMode.Jaeger ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, size: 0, @@ -172,7 +172,7 @@ export const getServiceNodesQuery = (mode: TraceAnalyticsMode) => { }; }; -export const getServiceEdgesQuery = (source: 'destination' | 'target', mode: TraceAnalyticsMode) => { +export const getServiceEdgesQuery = (source: 'destination' | 'target', mode: TraceAnalyticsModeType) => { return { index: mode === TraceAnalyticsMode.Jaeger ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, size: 0, @@ -211,7 +211,7 @@ export const getServiceEdgesQuery = (source: 'destination' | 'target', mode: Tra }; }; -export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: ServiceObject, mode: TraceAnalyticsMode) => { +export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: ServiceObject, mode: TraceAnalyticsModeType) => { const traceGroupFilter = new Set( DSL?.query?.bool.must .filter((must: any) => must.term?.['traceGroup']) diff --git a/public/components/trace_analytics/requests/request_handler.ts b/public/components/trace_analytics/requests/request_handler.ts index f7fd145730..36af8d7ef7 100644 --- a/public/components/trace_analytics/requests/request_handler.ts +++ b/public/components/trace_analytics/requests/request_handler.ts @@ -12,9 +12,9 @@ import { JAEGER_INDEX_NAME, DATA_PREPPER_INDEX_NAME } from '../../../../common/constants/trace_analytics'; -import { TraceAnalyticsMode } from '../home'; +import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../home'; -export function handleDslRequest(http: CoreStart['http'], DSL: any, bodyQuery: any, mode: TraceAnalyticsMode) { +export function handleDslRequest(http: CoreStart['http'], DSL: any, bodyQuery: any, mode: TraceAnalyticsModeType) { if (DSL?.query) { bodyQuery.query.bool.must.push(...DSL.query.bool.must); bodyQuery.query.bool.filter.push(...DSL.query.bool.filter); diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index 77be9eaf79..273814d041 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -23,9 +23,9 @@ import { getValidTraceIdsQuery, } from './queries/traces_queries'; import { handleDslRequest } from './request_handler'; -import { TraceAnalyticsMode } from '../home'; +import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../home'; -export const handleValidTraceIds = (http: HttpSetup, DSL: any, mode: TraceAnalyticsMode,) => { +export const handleValidTraceIds = (http: HttpSetup, DSL: any, mode: TraceAnalyticsModeType) => { return handleDslRequest(http, {}, getValidTraceIdsQuery(DSL), mode) .then((response) => response.aggregations.traces.buckets.map((bucket: any) => bucket.key)) .catch((error) => console.error(error)); @@ -37,7 +37,7 @@ export const handleTracesRequest = async ( timeFilterDSL: any, items: any, setItems: (items: any) => void, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, sort?: any, ) => { const binarySearch = (arr: number[], target: number) => { @@ -109,7 +109,7 @@ export const handleTraceViewRequest = ( http: HttpSetup, fields: {}, setFields: (fields: any) => void, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, ) => { handleDslRequest(http, null, getTracesQuery(mode, traceId), mode) .then(async (response) => { @@ -138,7 +138,7 @@ export const handleServicesPieChartRequest = async ( http: HttpSetup, setServiceBreakdownData: (serviceBreakdownData: any) => void, setColorMap: (colorMap: any) => void, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, ) => { const colors = [ '#7492e7', @@ -201,7 +201,7 @@ export const handleSpansGanttRequest = ( setSpanDetailData: (spanDetailData: any) => void, colorMap: any, spanFiltersDSL: any, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, ) => { handleDslRequest(http, spanFiltersDSL, getSpanDetailQuery(mode, traceId), mode) .then((response) => hitsToSpanDetailData(response.hits.hits, colorMap, mode)) @@ -213,7 +213,7 @@ export const handleSpansFlyoutRequest = ( http: HttpSetup, spanId: string, setItems: (items: any) => void, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, ) => { handleDslRequest(http, null, getSpanFlyoutQuery(mode, spanId), mode) .then((response) => { @@ -222,7 +222,7 @@ export const handleSpansFlyoutRequest = ( .catch((error) => console.error(error)); }; -const hitsToSpanDetailData = async (hits: any, colorMap: any, mode: TraceAnalyticsMode) => { +const hitsToSpanDetailData = async (hits: any, colorMap: any, mode: TraceAnalyticsModeType) => { const data: { gantt: any[]; table: any[]; ganttMaxX: number } = { gantt: [], table: [], @@ -292,7 +292,7 @@ export const handlePayloadRequest = ( http: HttpSetup, payloadData: any, setPayloadData: (payloadData: any) => void, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, ) => { handleDslRequest(http, null, getPayloadQuery(mode, traceId), mode) .then((response) => setPayloadData(JSON.stringify(response.hits.hits, null, 2))) @@ -305,7 +305,7 @@ export const handleSpansRequest = ( setTotal: (total: number) => void, spanSearchParams: SpanSearchParams, DSL: any, - mode: TraceAnalyticsMode, + mode: TraceAnalyticsModeType, ) => { handleDslRequest(http, DSL, getSpansQuery(spanSearchParams), mode) .then((response) => { From 47286000cf04b3b908360baea25292ecb1e3000b Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 16 Dec 2022 11:11:21 -0500 Subject: [PATCH 33/67] fix a few more things Signed-off-by: Derek Ho --- .../trace_analytics/components/services/services_content.tsx | 2 +- .../trace_analytics/components/traces/traces_table.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index ec0c2dfa94..911bbdfbc4 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -129,7 +129,7 @@ export function ServicesContent(props: ServicesProps) { traceColumnAction={traceColumnAction} /> - { mode === "Data_Prepper" ? + { mode === TraceAnalyticsMode.Data_Prepper ? void; - mode: TraceAnalyticsMode; + mode: TraceAnalyticsModeType; loading: boolean; traceIdColumnAction: any; } From 3ee2db864d212d23d98ed91b8c938a9f87aaef7f Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 16 Dec 2022 13:41:48 -0500 Subject: [PATCH 34/67] replace with union Signed-off-by: Derek Ho --- .../config_components/service_config.tsx | 2 +- .../config_components/trace_config.tsx | 2 +- .../service_detail_flyout.tsx | 2 +- .../flyout_components/trace_detail_render.tsx | 6 ++-- .../components/common/helper_functions.tsx | 6 ++-- .../dashboard/dashboard_content.tsx | 4 +-- .../components/services/service_view.tsx | 8 ++--- .../components/services/services_content.tsx | 4 +-- .../components/services/services_table.tsx | 8 ++--- .../components/traces/span_detail_flyout.tsx | 30 ++++++++-------- .../components/traces/trace_view.tsx | 10 +++--- .../components/traces/traces_table.tsx | 6 ++-- public/components/trace_analytics/home.tsx | 16 +++------ .../requests/queries/dashboard_queries.ts | 2 +- .../requests/queries/services_queries.ts | 22 ++++++------ .../requests/request_handler.ts | 6 ++-- .../requests/services_request_handler.ts | 8 ++--- .../requests/traces_request_handler.ts | 34 +++++++++---------- 18 files changed, 85 insertions(+), 91 deletions(-) diff --git a/public/components/application_analytics/components/config_components/service_config.tsx b/public/components/application_analytics/components/config_components/service_config.tsx index 638349f02d..13b19e3411 100644 --- a/public/components/application_analytics/components/config_components/service_config.tsx +++ b/public/components/application_analytics/components/config_components/service_config.tsx @@ -41,7 +41,7 @@ export const ServiceConfig = (props: ServiceConfigProps) => { selectedServices, setSelectedServices, } = props; - const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper; + const mode = props.mode !== undefined ? props.mode : 'data_prepper'; const [servicesOpen, setServicesOpen] = useState(false); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< diff --git a/public/components/application_analytics/components/config_components/trace_config.tsx b/public/components/application_analytics/components/config_components/trace_config.tsx index b8f634e6b5..5123903e8d 100644 --- a/public/components/application_analytics/components/config_components/trace_config.tsx +++ b/public/components/application_analytics/components/config_components/trace_config.tsx @@ -44,7 +44,7 @@ export const TraceConfig = (props: TraceConfigProps) => { selectedTraces, setSelectedTraces, } = props; - const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper; + const mode = props.mode !== undefined ? props.mode : 'data_prepper'; const [traceOpen, setTraceOpen] = useState(false); const [loading, setLoading] = useState(false); const [traceItems, setTraceItems] = useState([]); diff --git a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx index 7bcf9426e4..ff608f08f1 100644 --- a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx @@ -45,7 +45,7 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { closeServiceFlyout, openSpanFlyout, } = props; - const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper; + const mode = props.mode !== undefined ? props.mode : 'data_prepper'; const [fields, setFields] = useState({}); const [serviceMap, setServiceMap] = useState({}); const [total, setTotal] = useState(0); diff --git a/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx b/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx index 9b4289df45..0697c23e0f 100644 --- a/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx +++ b/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx @@ -14,17 +14,17 @@ import { } from '../../../trace_analytics/requests/traces_request_handler'; import { HttpStart } from '../../../../../../../src/core/public'; import { getListItem } from '../../helpers/utils'; -import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../../../../../public/components/trace_analytics/home'; +import { TraceAnalyticsMode } from '../../../../../public/components/trace_analytics/home'; interface TraceDetailRenderProps { traceId: string; http: HttpStart; openSpanFlyout: (spanId: string) => void; - traceAnalyticsMode? : TraceAnalyticsModeType + traceAnalyticsMode? : TraceAnalyticsMode } export const TraceDetailRender = ({ traceId, http, openSpanFlyout, traceAnalyticsMode }: TraceDetailRenderProps) => { - const mode = traceAnalyticsMode !== undefined ? traceAnalyticsMode : TraceAnalyticsMode.Data_Prepper; + const mode = traceAnalyticsMode !== undefined ? traceAnalyticsMode : 'data_prepper'; const [fields, setFields] = useState({}); const [serviceBreakdownData, setServiceBreakdownData] = useState([]); const [payloadData, setPayloadData] = useState(''); diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index 1cadc34f5d..37b1bd2b26 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -17,7 +17,7 @@ import { JAEGER_SERVICE_INDEX_NAME, } from '../../../../../common/constants/trace_analytics'; import { uiSettingsService } from '../../../../../common/utils'; -import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../../home'; +import { TraceAnalyticsMode } from '../../home'; import { serviceMapColorPalette } from './color_palette'; import { FilterType } from './filters/filters'; import { ServiceObject } from './plots/service_map'; @@ -76,8 +76,8 @@ export function MissingConfigurationMessage() { ); } -export function processTimeStamp(time: string, mode: TraceAnalyticsModeType) { - if (mode === TraceAnalyticsMode.Jaeger) { +export function processTimeStamp(time: string, mode: TraceAnalyticsMode) { + if (mode === 'jaeger') { const timeMoment = dateMath.parse(time)!; return timeMoment.unix() * 1000000; } diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 322571c6bc..34274882b5 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -49,7 +49,7 @@ export function DashboardContent(props: DashboardProps) { setQuery, setFilters, } = props; - const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper + const mode = props.mode !== undefined ? props.mode : 'data_prepper' const [tableItems, setTableItems] = useState([]); const [throughputPltItems, setThroughputPltItems] = useState({ items: [], fixedInterval: '1h' }); const [errorRatePltItems, setErrorRatePltItems] = useState({ items: [], fixedInterval: '1h' }); @@ -206,7 +206,7 @@ export function DashboardContent(props: DashboardProps) { {mode !== TraceAnalyticsMode.None ? (
- { mode === TraceAnalyticsMode.Data_Prepper ? ( + { mode === 'data_prepper' ? ( <> ({}); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< @@ -111,7 +111,7 @@ export function ServiceView(props: ServiceViewProps) { {props.serviceName || '-'} - { mode === TraceAnalyticsMode.Data_Prepper ? + { mode === 'data_prepper' ? Number of connected services @@ -121,7 +121,7 @@ export function ServiceView(props: ServiceViewProps) { : } - { mode === TraceAnalyticsMode.Data_Prepper ? + { mode === 'data_prepper' ? Connected services @@ -315,7 +315,7 @@ export function ServiceView(props: ServiceViewProps) { {overview} - { mode === TraceAnalyticsMode.Data_Prepper ? + { mode === 'data_prepper' ? ({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< @@ -129,7 +129,7 @@ export function ServicesContent(props: ServicesProps) { traceColumnAction={traceColumnAction} /> - { mode === TraceAnalyticsMode.Data_Prepper ? + { mode === 'data_prepper' ? void; setRedirect: (redirect: boolean) => void; - mode?: TraceAnalyticsModeType; + mode?: TraceAnalyticsMode; } export function ServicesTable(props: ServicesTableProps) { @@ -93,7 +93,7 @@ export function ServicesTable(props: ServicesTableProps) { truncateText: true, render: (item: any) => (item === 0 || item ? : '-'), }, - ... mode === TraceAnalyticsMode.Data_Prepper ? [{ + ... mode === 'data_prepper' ? [{ field: 'number_of_connected_services', name: 'No. of connected services', align: 'right', @@ -102,7 +102,7 @@ export function ServicesTable(props: ServicesTableProps) { width: '80px', render: (item: any) => (item === 0 || item ? item : '-'), }] : [], - ... mode === TraceAnalyticsMode.Data_Prepper ? [{ + ... mode === 'data_prepper' ? [{ field: 'connected_services', name: 'Connected services', align: 'left', diff --git a/public/components/trace_analytics/components/traces/span_detail_flyout.tsx b/public/components/trace_analytics/components/traces/span_detail_flyout.tsx index 7094c61f69..0dc3216f47 100644 --- a/public/components/trace_analytics/components/traces/span_detail_flyout.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_flyout.tsx @@ -22,7 +22,7 @@ import moment from 'moment'; import React, { useEffect, useState } from 'react'; import { HttpSetup } from '../../../../../../../src/core/public'; import { TRACE_ANALYTICS_DATE_FORMAT } from '../../../../../common/constants/trace_analytics'; -import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../../home'; +import { TraceAnalyticsMode } from '../../home'; import { handleSpansFlyoutRequest } from '../../requests/traces_request_handler'; import { microToMilliSec, nanoToMilliSec } from '../common/helper_functions'; import { FlyoutListItem } from './flyout_list_item'; @@ -33,9 +33,9 @@ export function SpanDetailFlyout(props: { isFlyoutVisible: boolean; closeFlyout: () => void; addSpanFilter: (field: string, value: any) => void; - mode?: TraceAnalyticsModeType; + mode?: TraceAnalyticsMode; }) { - const mode = props.mode !== undefined ? props.mode: TraceAnalyticsMode.Data_Prepper; + const mode = props.mode !== undefined ? props.mode: 'data_prepper'; const [span, setSpan] = useState({}); useEffect(() => { @@ -67,16 +67,16 @@ export function SpanDetailFlyout(props: { getListItem( 'spanId', 'Span ID', - (mode === TraceAnalyticsMode.Data_Prepper ? span.spanId : span.spanID) ? ( + (mode === 'data_prepper' ? span.spanId : span.spanID) ? ( - + {(copy) => ( )} - {mode === TraceAnalyticsMode.Data_Prepper ? span.spanId : span.spanID} + {mode === 'data_prepper' ? span.spanId : span.spanID} ) : ( '-' @@ -85,38 +85,38 @@ export function SpanDetailFlyout(props: { getListItem( 'parentSpanId', 'Parent span ID', - (mode === TraceAnalyticsMode.Data_Prepper ? span.parentSpanId : span.references.length) ? ( + (mode === 'data_prepper' ? span.parentSpanId : span.references.length) ? ( - + {(copy) => ( )} - {mode === TraceAnalyticsMode.Data_Prepper ? span.parentSpanId : span.references[0].spanID} + {mode === 'data_prepper' ? span.parentSpanId : span.references[0].spanID} ) : ( '-' ) ), - getListItem('serviceName', 'Service', (mode === TraceAnalyticsMode.Data_Prepper ? span.serviceName : span.process['serviceName']) || '-'), - getListItem('name', 'Operation', (mode === TraceAnalyticsMode.Data_Prepper ? span.name : span.operationName) || '-'), + getListItem('serviceName', 'Service', (mode === 'data_prepper' ? span.serviceName : span.process['serviceName']) || '-'), + getListItem('name', 'Operation', (mode === 'data_prepper' ? span.name : span.operationName) || '-'), getListItem( 'durationInNanos', 'Duration', - `${(mode === TraceAnalyticsMode.Data_Prepper ? _.round(nanoToMilliSec(Math.max(0, span.durationInNanos)), 2) : _.round(microToMilliSec(Math.max(0, span.duration)), 2))} ms` + `${(mode === 'data_prepper' ? _.round(nanoToMilliSec(Math.max(0, span.durationInNanos)), 2) : _.round(microToMilliSec(Math.max(0, span.duration)), 2))} ms` ), getListItem( 'startTime', 'Start time', - mode === TraceAnalyticsMode.Data_Prepper ? moment(span.startTime).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(_.round(microToMilliSec(Math.max(0, span.startTime)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT) + mode === 'data_prepper' ? moment(span.startTime).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(_.round(microToMilliSec(Math.max(0, span.startTime)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT) ), - getListItem('endTime', 'End time', mode === TraceAnalyticsMode.Data_Prepper ? moment(span.endTime).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(_.round(microToMilliSec(Math.max(0, span.startTime + span.duration)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT)), + getListItem('endTime', 'End time', mode === 'data_prepper' ? moment(span.endTime).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(_.round(microToMilliSec(Math.max(0, span.startTime + span.duration)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT)), getListItem( 'status.code', 'Errors', - (mode === TraceAnalyticsMode.Data_Prepper ? span['status.code'] === 2 : span.tag['error']) ? ( + (mode === 'data_prepper' ? span['status.code'] === 2 : span.tag['error']) ? ( Yes diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index 4a19cb681e..3ebe538457 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -20,7 +20,7 @@ import { } from '@elastic/eui'; import _ from 'lodash'; import React, { useEffect, useState } from 'react'; -import { TraceAnalyticsCoreDeps, TraceAnalyticsMode, TraceAnalyticsModeType } from '../../home'; +import { TraceAnalyticsCoreDeps, TraceAnalyticsMode } from '../../home'; import { handleServiceMapRequest } from '../../requests/services_request_handler'; import { handlePayloadRequest, @@ -34,11 +34,11 @@ import { SpanDetailPanel } from './span_detail_panel'; interface TraceViewProps extends TraceAnalyticsCoreDeps { traceId: string; - mode?: TraceAnalyticsModeType; + mode?: TraceAnalyticsMode; } export function TraceView(props: TraceViewProps) { - const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper + const mode = props.mode !== undefined ? props.mode : 'data_prepper' const page = 'traceView'; const renderTitle = (traceId: string) => { return ( @@ -85,7 +85,7 @@ export function TraceView(props: TraceViewProps) { )} - { mode === TraceAnalyticsMode.Data_Prepper ? ( + { mode === 'data_prepper' ? ( Trace group name @@ -250,7 +250,7 @@ export function TraceView(props: TraceViewProps) { ) : null} - { mode === TraceAnalyticsMode.Data_Prepper ? + { mode === 'data_prepper' ? void; - mode: TraceAnalyticsModeType; + mode: TraceAnalyticsMode; loading: boolean; traceIdColumnAction: any; } @@ -50,7 +50,7 @@ export function TracesTable(props: TracesTableProps) { const columns = useMemo( () => { - if (mode === TraceAnalyticsMode.Data_Prepper) { + if (mode === 'data_prepper') { return( [ { diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index 1c2c08784c..050efba284 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -26,22 +26,16 @@ export interface TraceAnalyticsCoreDeps { interface HomeProps extends RouteComponentProps, TraceAnalyticsCoreDeps {} -export const TraceAnalyticsMode = { - Jaeger : 'jaeger', - Data_Prepper : 'data_prepper', - None : 'none' -} as const; - -export type TraceAnalyticsModeType = typeof TraceAnalyticsMode[keyof typeof TraceAnalyticsMode]; +export type TraceAnalyticsMode = 'jaeger' | 'data_prepper' | 'none' export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, SearchBarProps { - mode?: TraceAnalyticsModeType; + mode: TraceAnalyticsMode; } export const Home = (props: HomeProps) => { const [dataPrepperIndicesExist, setDataPrepperIndicesExist] = useState(true); const [jaegerIndicesExist, setJaegerIndicesExist] = useState(true); - const [mode, setMode] = useState(TraceAnalyticsMode.Jaeger) + const [mode, setMode] = useState('jaeger') const storedFilters = sessionStorage.getItem('TraceAnalyticsFilters'); const [query, setQuery] = useState(sessionStorage.getItem('TraceAnalyticsQuery') || ''); const [filters, setFilters] = useState( @@ -78,9 +72,9 @@ export const Home = (props: HomeProps) => { // useEffect(() => { // if (dataPrepperIndicesExist) { - // setMode(TraceAnalyticsMode.Data_Prepper); + // setMode('data_prepper'); // } else if (jaegerIndicesExist) { - // setMode(TraceAnalyticsMode.Jaeger); + // setMode('jaeger'); // } else { // setMode(TraceAnalyticsMode.None); // } diff --git a/public/components/trace_analytics/requests/queries/dashboard_queries.ts b/public/components/trace_analytics/requests/queries/dashboard_queries.ts index 576d4b43f4..29080cd1b0 100644 --- a/public/components/trace_analytics/requests/queries/dashboard_queries.ts +++ b/public/components/trace_analytics/requests/queries/dashboard_queries.ts @@ -277,7 +277,7 @@ export const getDashboardThroughputPltQuery = (mode: TraceAnalyticsMode, fixedIn aggs: { trace_count: { cardinality: { - field: mode === TraceAnalyticsMode.Jaeger ? 'traceID': 'traceId', + field: mode === 'jaeger' ? 'traceID': 'traceId', }, }, }, diff --git a/public/components/trace_analytics/requests/queries/services_queries.ts b/public/components/trace_analytics/requests/queries/services_queries.ts index 5a7ab46418..52a1eef7bd 100644 --- a/public/components/trace_analytics/requests/queries/services_queries.ts +++ b/public/components/trace_analytics/requests/queries/services_queries.ts @@ -11,9 +11,9 @@ import { } from '../../../../../common/constants/trace_analytics'; import { getServiceMapTargetResources } from '../../components/common/helper_functions'; import { ServiceObject } from '../../components/common/plots/service_map'; -import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../../home'; +import { TraceAnalyticsMode } from '../../home'; -export const getServicesQuery = (mode: TraceAnalyticsModeType, serviceName: string | undefined, DSL?: any) => { +export const getServicesQuery = (mode: TraceAnalyticsMode, serviceName: string | undefined, DSL?: any) => { const query = { size: 0, query: { @@ -27,20 +27,20 @@ export const getServicesQuery = (mode: TraceAnalyticsModeType, serviceName: stri aggs: { service: { terms: { - field: mode === TraceAnalyticsMode.Jaeger ? 'process.serviceName' : 'serviceName', + field: mode === 'jaeger' ? 'process.serviceName' : 'serviceName', size: 10000, }, aggs: { trace_count: { cardinality: { - field: mode === TraceAnalyticsMode.Jaeger? 'traceID': 'traceId', + field: mode === 'jaeger'? 'traceID': 'traceId', }, }, }, }, }, }; - if (mode === TraceAnalyticsMode.Jaeger) { + if (mode === 'jaeger') { if (serviceName) { query.query.bool.must.push({ term: { @@ -133,9 +133,9 @@ export const getRelatedServicesQuery = (serviceName: string) => { return query; }; -export const getServiceNodesQuery = (mode: TraceAnalyticsModeType) => { +export const getServiceNodesQuery = (mode: TraceAnalyticsMode) => { return { - index: mode === TraceAnalyticsMode.Jaeger ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, + index: mode === 'jaeger' ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, size: 0, query: { bool: { @@ -172,9 +172,9 @@ export const getServiceNodesQuery = (mode: TraceAnalyticsModeType) => { }; }; -export const getServiceEdgesQuery = (source: 'destination' | 'target', mode: TraceAnalyticsModeType) => { +export const getServiceEdgesQuery = (source: 'destination' | 'target', mode: TraceAnalyticsMode) => { return { - index: mode === TraceAnalyticsMode.Jaeger ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, + index: mode === 'jaeger' ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME, size: 0, query: { bool: { @@ -211,7 +211,7 @@ export const getServiceEdgesQuery = (source: 'destination' | 'target', mode: Tra }; }; -export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: ServiceObject, mode: TraceAnalyticsModeType) => { +export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: ServiceObject, mode: TraceAnalyticsMode) => { const traceGroupFilter = new Set( DSL?.query?.bool.must .filter((must: any) => must.term?.['traceGroup']) @@ -453,5 +453,5 @@ export const getServiceMetricsQuery = (DSL: any, serviceNames: string[], map: Se jaegerQuery.query.bool.must.push(...DSL.custom.timeFilter); dataPrepperQuery.query.bool.must.push(...DSL.custom.timeFilter); } - return mode === TraceAnalyticsMode.Jaeger ? jaegerQuery : dataPrepperQuery; + return mode === 'jaeger' ? jaegerQuery : dataPrepperQuery; }; diff --git a/public/components/trace_analytics/requests/request_handler.ts b/public/components/trace_analytics/requests/request_handler.ts index 36af8d7ef7..86cc5dd98e 100644 --- a/public/components/trace_analytics/requests/request_handler.ts +++ b/public/components/trace_analytics/requests/request_handler.ts @@ -12,9 +12,9 @@ import { JAEGER_INDEX_NAME, DATA_PREPPER_INDEX_NAME } from '../../../../common/constants/trace_analytics'; -import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../home'; +import { TraceAnalyticsMode } from '../home'; -export function handleDslRequest(http: CoreStart['http'], DSL: any, bodyQuery: any, mode: TraceAnalyticsModeType) { +export function handleDslRequest(http: CoreStart['http'], DSL: any, bodyQuery: any, mode: TraceAnalyticsMode) { if (DSL?.query) { bodyQuery.query.bool.must.push(...DSL.query.bool.must); bodyQuery.query.bool.filter.push(...DSL.query.bool.filter); @@ -25,7 +25,7 @@ export function handleDslRequest(http: CoreStart['http'], DSL: any, bodyQuery: a } let body = bodyQuery; if (!bodyQuery.index) { - body = {...bodyQuery, index: ((mode === TraceAnalyticsMode.Jaeger ? JAEGER_INDEX_NAME : DATA_PREPPER_INDEX_NAME)) } + body = {...bodyQuery, index: ((mode === 'jaeger' ? JAEGER_INDEX_NAME : DATA_PREPPER_INDEX_NAME)) } } return http .post(TRACE_ANALYTICS_DSL_ROUTE, { diff --git a/public/components/trace_analytics/requests/services_request_handler.ts b/public/components/trace_analytics/requests/services_request_handler.ts index 3946306bf5..1b5b6f7c6c 100644 --- a/public/components/trace_analytics/requests/services_request_handler.ts +++ b/public/components/trace_analytics/requests/services_request_handler.ts @@ -17,13 +17,13 @@ import { } from './queries/services_queries'; import { handleDslRequest } from './request_handler'; import { HttpSetup } from '../../../../../../src/core/public'; -import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../home'; +import { TraceAnalyticsMode } from '../home'; export const handleServicesRequest = async ( http: HttpSetup, DSL: any, setItems: any, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, setServiceMap?: any, serviceNameFilter?: string, ) => { @@ -59,7 +59,7 @@ export const handleServicesRequest = async ( export const handleServiceMapRequest = async ( http: HttpSetup, DSL: DSLService | any, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, setItems?: any, currService?: string, ) => { @@ -165,7 +165,7 @@ export const handleServiceViewRequest = ( http: HttpSetup, DSL: any, setFields: any, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, ) => { handleDslRequest(http, DSL, getServicesQuery(mode, serviceName), mode) .then(async (response) => { diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index 273814d041..26605fa356 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -23,9 +23,9 @@ import { getValidTraceIdsQuery, } from './queries/traces_queries'; import { handleDslRequest } from './request_handler'; -import { TraceAnalyticsMode, TraceAnalyticsModeType } from '../home'; +import { TraceAnalyticsMode } from '../home'; -export const handleValidTraceIds = (http: HttpSetup, DSL: any, mode: TraceAnalyticsModeType) => { +export const handleValidTraceIds = (http: HttpSetup, DSL: any, mode: TraceAnalyticsMode) => { return handleDslRequest(http, {}, getValidTraceIdsQuery(DSL), mode) .then((response) => response.aggregations.traces.buckets.map((bucket: any) => bucket.key)) .catch((error) => console.error(error)); @@ -37,7 +37,7 @@ export const handleTracesRequest = async ( timeFilterDSL: any, items: any, setItems: (items: any) => void, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, sort?: any, ) => { const binarySearch = (arr: number[], target: number) => { @@ -73,7 +73,7 @@ export const handleTracesRequest = async ( .then((response) => { return Promise.all( response.aggregations.traces.buckets.map((bucket: any) => { - if (mode === TraceAnalyticsMode.Data_Prepper) { + if (mode === 'data_prepper') { return { trace_id: bucket.key, trace_group: bucket.trace_group.buckets[0]?.key, @@ -109,7 +109,7 @@ export const handleTraceViewRequest = ( http: HttpSetup, fields: {}, setFields: (fields: any) => void, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, ) => { handleDslRequest(http, null, getTracesQuery(mode, traceId), mode) .then(async (response) => { @@ -138,7 +138,7 @@ export const handleServicesPieChartRequest = async ( http: HttpSetup, setServiceBreakdownData: (serviceBreakdownData: any) => void, setColorMap: (colorMap: any) => void, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, ) => { const colors = [ '#7492e7', @@ -201,7 +201,7 @@ export const handleSpansGanttRequest = ( setSpanDetailData: (spanDetailData: any) => void, colorMap: any, spanFiltersDSL: any, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, ) => { handleDslRequest(http, spanFiltersDSL, getSpanDetailQuery(mode, traceId), mode) .then((response) => hitsToSpanDetailData(response.hits.hits, colorMap, mode)) @@ -213,7 +213,7 @@ export const handleSpansFlyoutRequest = ( http: HttpSetup, spanId: string, setItems: (items: any) => void, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, ) => { handleDslRequest(http, null, getSpanFlyoutQuery(mode, spanId), mode) .then((response) => { @@ -222,7 +222,7 @@ export const handleSpansFlyoutRequest = ( .catch((error) => console.error(error)); }; -const hitsToSpanDetailData = async (hits: any, colorMap: any, mode: TraceAnalyticsModeType) => { +const hitsToSpanDetailData = async (hits: any, colorMap: any, mode: TraceAnalyticsMode) => { const data: { gantt: any[]; table: any[]; ganttMaxX: number } = { gantt: [], table: [], @@ -230,15 +230,15 @@ const hitsToSpanDetailData = async (hits: any, colorMap: any, mode: TraceAnalyti }; if (hits.length === 0) return data; - const minStartTime = mode === TraceAnalyticsMode.Jaeger ? microToMilliSec(hits[hits.length - 1].sort[0]) : nanoToMilliSec(hits[hits.length - 1].sort[0]); + const minStartTime = mode === 'jaeger' ? microToMilliSec(hits[hits.length - 1].sort[0]) : nanoToMilliSec(hits[hits.length - 1].sort[0]); let maxEndTime = 0; hits.forEach((hit: any) => { - const startTime = mode === TraceAnalyticsMode.Jaeger ? microToMilliSec(hit.sort[0]) - minStartTime : nanoToMilliSec(hit.sort[0]) - minStartTime; - const duration = mode === TraceAnalyticsMode.Jaeger ? _.round(microToMilliSec(hit._source.duration), 2) : _.round(nanoToMilliSec(hit._source.durationInNanos), 2);; - const serviceName = mode === TraceAnalyticsMode.Jaeger? _.get(hit, ['_source', 'process'])['serviceName'] : _.get(hit, ['_source', 'serviceName']); - const name = mode === TraceAnalyticsMode.Jaeger ? _.get(hit, '_source.operationName') : _.get(hit, '_source.name'); - const error = mode === TraceAnalyticsMode.Jaeger ? (hit._source['tag']['error'] === true ? ' \u26a0 Error' : '') : (hit._source['status.code'] === 2 ? ' \u26a0 Error' : ''); + const startTime = mode === 'jaeger' ? microToMilliSec(hit.sort[0]) - minStartTime : nanoToMilliSec(hit.sort[0]) - minStartTime; + const duration = mode === 'jaeger' ? _.round(microToMilliSec(hit._source.duration), 2) : _.round(nanoToMilliSec(hit._source.durationInNanos), 2);; + const serviceName = mode === 'jaeger'? _.get(hit, ['_source', 'process'])['serviceName'] : _.get(hit, ['_source', 'serviceName']); + const name = mode === 'jaeger' ? _.get(hit, '_source.operationName') : _.get(hit, '_source.name'); + const error = mode === 'jaeger' ? (hit._source['tag']['error'] === true ? ' \u26a0 Error' : '') : (hit._source['status.code'] === 2 ? ' \u26a0 Error' : ''); const uniqueLabel = `${serviceName}
${name} ` + uuid(); maxEndTime = Math.max(maxEndTime, startTime + duration); @@ -292,7 +292,7 @@ export const handlePayloadRequest = ( http: HttpSetup, payloadData: any, setPayloadData: (payloadData: any) => void, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, ) => { handleDslRequest(http, null, getPayloadQuery(mode, traceId), mode) .then((response) => setPayloadData(JSON.stringify(response.hits.hits, null, 2))) @@ -305,7 +305,7 @@ export const handleSpansRequest = ( setTotal: (total: number) => void, spanSearchParams: SpanSearchParams, DSL: any, - mode: TraceAnalyticsModeType, + mode: TraceAnalyticsMode, ) => { handleDslRequest(http, DSL, getSpansQuery(spanSearchParams), mode) .then((response) => { From 128d0b510ec426c5940f702de4c91e1865bd5c44 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 16 Dec 2022 14:12:35 -0500 Subject: [PATCH 35/67] fix a few more tests Signed-off-by: Derek Ho --- .../components/application.tsx | 1 + .../helper_functions.test.tsx.snap | 2 +- .../__snapshots__/dashboard.test.tsx.snap | 2928 +++++++++++------ .../dashboard/dashboard_content.tsx | 4 +- .../services_table.test.tsx.snap | 254 +- .../services/__tests__/service_view.test.tsx | 1 + .../services/__tests__/services.test.tsx | 2 + .../components/services/service_view.tsx | 2 +- .../components/services/services_content.tsx | 2 +- .../components/services/services_table.tsx | 4 +- .../__snapshots__/traces_table.test.tsx.snap | 417 +-- .../__tests__/span_detail_flyout.test.tsx | 2 + .../__tests__/span_detail_panel.test.tsx | 2 +- .../traces/__tests__/trace_view.test.tsx | 1 + .../traces/__tests__/traces.test.tsx | 4 +- .../components/traces/span_detail_flyout.tsx | 4 +- .../components/traces/span_detail_table.tsx | 28 +- .../components/traces/trace_view.tsx | 4 +- .../components/traces/traces_content.tsx | 5 +- .../components/traces/traces_table.tsx | 2 +- public/components/trace_analytics/home.tsx | 2 +- 21 files changed, 1998 insertions(+), 1673 deletions(-) diff --git a/public/components/application_analytics/components/application.tsx b/public/components/application_analytics/components/application.tsx index 69006f179f..d46bb306c8 100644 --- a/public/components/application_analytics/components/application.tsx +++ b/public/components/application_analytics/components/application.tsx @@ -563,6 +563,7 @@ export function Application(props: AppDetailProps) { isFlyoutVisible={!!spanFlyoutId} closeFlyout={closeSpanFlyout} addSpanFilter={addSpanFilter} + mode="data_prepper" /> )} {traceFlyoutId && ( diff --git a/public/components/trace_analytics/components/common/__tests__/__snapshots__/helper_functions.test.tsx.snap b/public/components/trace_analytics/components/common/__tests__/__snapshots__/helper_functions.test.tsx.snap index 0d6dad1ca0..407f5d67b2 100644 --- a/public/components/trace_analytics/components/common/__tests__/__snapshots__/helper_functions.test.tsx.snap +++ b/public/components/trace_analytics/components/common/__tests__/__snapshots__/helper_functions.test.tsx.snap @@ -104,7 +104,7 @@ exports[`Helper functions renders no match and missing configuration messages 2` } body={ - The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. + The indices required for trace analytics (*jaeger-span-* and *jaeger-service* or otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. } title={ diff --git a/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap index ab6226b0ff..d95c35271f 100644 --- a/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap +++ b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap @@ -49,7 +49,6 @@ exports[`Dashboard component renders dashboard 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={true} page="dashboard" parentBreadcrumbs={ Array [ @@ -142,7 +141,6 @@ exports[`Dashboard component renders dashboard 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={true} page="dashboard" parentBreadcrumbs={ Array [ @@ -1000,952 +998,812 @@ exports[`Dashboard component renders dashboard 1`] = ` className="euiSpacer euiSpacer--m" />
- - -
- + + +
-
- -
- - -
- - Latency by trace group - - - (0) - -
-
-
-
-
- -
- - - -
-
- -
- - -
+
+
+ - - - -
-
- -
- -
- - -
- - -
-
- - -
- - - No data matches the selected filter. Clear the filter and/or increase the time range to see more results. - - } - title={ -

- No matches -

- } - > -
- + □ + + < 95 percentile +
+ + + +
+ + -

- No matches -

- - +
+ - - -
- - -
- +
- No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + ■ + + >= 95 percentile
-
-
- - + + +
+
+ +
+
- +
- -
- - - -
- - -
- -
- +
+ + - + +
+ + + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + } + title={ +

+ No matches +

+ } + >
- - -
+ + + + - + + +
- Service map - -
-
- - -
- - +
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. +
+ +
+ +
+
+
+ + +
+ + +
+ + + +
+ + +
+ +
+ + +
-
+ +
+ + Service map + +
+
+ + - - -
+ + +
- + + +
- - - - - - + + + + - - - - - + + + + - - - -
-
-
- -
-
- -
+ + + +
+
+ + +
+
+ - -
- -
- Focus on -
-
-
-
- -
- + +
+ Focus on +
+
+
+
+ +
- -
- - - - -
- + + +
- - - - -
-
+ + + + + + +
+
+
+
-
- - -
- -
- - + + +
+ +
+ + +
+
- -
- - -
- - - No data matches the selected filter. Clear the filter and/or increase the time range to see more results. - - } - title={ -

- No matches -

- } - > -
- -

+
+ + + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + } + title={ +

No matches

- - - - -
- - -
- -
- No data matches the selected filter. Clear the filter and/or increase the time range to see more results. -
-
-
-
- - -
-
- -
- - -
-
- - -

- - -
- -
- -
- - -
- - -
- - Trace error rate over time - -
-
-
- -
-
- - -
- - - No data matches the selected filter. Clear the filter and/or increase the time range to see more results. - - } - title={ -

- No matches -

- } + No matches + + + -
- -

- No matches -

-
- - + + +
- -
-
- -
- No data matches the selected filter. Clear the filter and/or increase the time range to see more results. -
-
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results.
- - -
- - -
- - -
- - +
+
+
+
+
+
+ +
+ + +
- - -
- + +
+
+ +
+ +
+ +
- -
- - -
- - Traces over time - -
-
-
- -
-
- - + + Trace error rate over time + +
+ + + -
- - - No data matches the selected filter. Clear the filter and/or increase the time range to see more results. - - } - title={ -

- No matches -

- } + + -
- -

+
+ + + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + } + title={ +

No matches

- - +
- - -
- - -
+ + + + - -
- No data matches the selected filter. Clear the filter and/or increase the time range to see more results. -
-
-
-
+
+ + +
+ +
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. +
+
+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + Traces over time - -
- - +
+
+ -
- - -
- - -
- -
- -
- -
- + + + +
+ + + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + } + title={ +

+ No matches +

+ } + > +
+ +

+ No matches +

+
+ + + +
+ + +
+ +
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. +
+
+
+
+ + +
+ + +
+ + +
+ + +
+ +
+ +

+ +
+ +
`; @@ -2113,7 +2113,6 @@ exports[`Dashboard component renders empty dashboard 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={false} page="dashboard" parentBreadcrumbs={ Array [ @@ -2206,7 +2205,6 @@ exports[`Dashboard component renders empty dashboard 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={false} page="dashboard" parentBreadcrumbs={ Array [ @@ -3041,156 +3039,1064 @@ exports[`Dashboard component renders empty dashboard 1`] = ` className="euiSpacer euiSpacer--m" /> - - - Learn more - - } - body={ - - The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. - - } - title={ -

- Trace Analytics not set up -

- } +
+ -
- +
-

- Trace Analytics not set up -

- - - + +
+ + +
+ + Latency by trace group + + + (0) + +
+
+
+
+
+ +
+ + + +
+
+ +
+ + +
+ + + +
+
+ +
+ +
+ + +
+ + +
+
+
- -
+ -
- The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. -
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. -
-
- - - -
- - - - - - -
- - + +
+ + +
+ +
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. +
+
+
+
+ + +
+ + +
+ + +
+ + + +
+ + +
+ +
+ + +
+ + +
+ + Service map + +
+
+
+ +
+ + +
+ + + +
+ + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ +
+ +
+ Focus on +
+
+
+
+ +
+ + +
+
+ + + + +
+ + + + + +
+
+
+
+
+
+
+
+
+
+ +
+ +
+ + +
+ + + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + } + title={ +

+ No matches +

+ } + > +
+ +

+ No matches +

+
+ + + +
+ + +
+ +
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. +
+
+
+
+ + +
+ + +
+ + +
+
+ + +
+ + +
+ +
+ +
+ + +
+ + +
+ + Trace error rate over time + +
+
+
+ +
+
+ + +
+ + + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + } + title={ +

+ No matches +

+ } + > +
+ +

+ No matches +

+
+ + + +
+ + +
+ +
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. +
+
+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + Traces over time + +
+
+
+ +
+
+ + +
+ + + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + } + title={ +

+ No matches +

+ } + > +
+ +

+ No matches +

+
+ + + +
+ + +
+ +
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. +
+
+
+
+ + +
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ +
`; diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 34274882b5..57a08d7d17 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -83,7 +83,7 @@ export function DashboardContent(props: DashboardProps) { } } setFilteredService(newFilteredService); - if (!redirect && mode !== TraceAnalyticsMode.None) refresh(newFilteredService); + if (!redirect && mode !== 'none') refresh(newFilteredService); }, [filters, startTime, endTime, appConfigs]); const refresh = async (currService?: string) => { @@ -204,7 +204,7 @@ export function DashboardContent(props: DashboardProps) { page={page} /> - {mode !== TraceAnalyticsMode.None ? ( + {mode !== 'none' ? (
{ mode === 'data_prepper' ? ( <> diff --git a/public/components/trace_analytics/components/services/__tests__/__snapshots__/services_table.test.tsx.snap b/public/components/trace_analytics/components/services/__tests__/__snapshots__/services_table.test.tsx.snap index 735eaa0445..1cb5e0cc06 100644 --- a/public/components/trace_analytics/components/services/__tests__/__snapshots__/services_table.test.tsx.snap +++ b/public/components/trace_analytics/components/services/__tests__/__snapshots__/services_table.test.tsx.snap @@ -3,7 +3,6 @@ exports[`Services table component renders empty services table message 1`] = ` - - - - - - - - - - - -
- No. of connected services -
-
- 2 -
- -
- - -
- Connected services -
-
- -
- order, inventory -
-
-
- -
- { endTime="now" setEndTime={setEndTime} addFilter={addFilter} + mode="data_prepper" /> ); diff --git a/public/components/trace_analytics/components/services/__tests__/services.test.tsx b/public/components/trace_analytics/components/services/__tests__/services.test.tsx index d7b3482d25..6c6b25a507 100644 --- a/public/components/trace_analytics/components/services/__tests__/services.test.tsx +++ b/public/components/trace_analytics/components/services/__tests__/services.test.tsx @@ -49,6 +49,7 @@ describe('Services component', () => { endTime="now" setEndTime={setEndTime} page="services" + mode='data_prepper' /> ); @@ -92,6 +93,7 @@ describe('Services component', () => { endTime="now" setEndTime={setEndTime} page="services" + mode='data_prepper' /> ); diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index 4d7298158a..1e8b693db0 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -38,7 +38,7 @@ interface ServiceViewProps extends TraceAnalyticsComponentDeps { } export function ServiceView(props: ServiceViewProps) { - const mode = props.mode !== undefined ? props.mode : 'data_prepper' + const { mode } = props; const [fields, setFields] = useState({}); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index ac9631bd05..7e47c149d2 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -70,7 +70,7 @@ export function ServicesContent(props: ServicesProps) { } } setFilteredService(newFilteredService); - if (!redirect && mode !== TraceAnalyticsMode.None) refresh(newFilteredService); + if (!redirect && mode !== 'none') refresh(newFilteredService); }, [filters, appConfigs]); const refresh = async (currService?: string) => { diff --git a/public/components/trace_analytics/components/services/services_table.tsx b/public/components/trace_analytics/components/services/services_table.tsx index a1a2d9411e..5c431ba951 100644 --- a/public/components/trace_analytics/components/services/services_table.tsx +++ b/public/components/trace_analytics/components/services/services_table.tsx @@ -33,7 +33,7 @@ interface ServicesTableProps { traceColumnAction: any; addFilter: (filter: FilterType) => void; setRedirect: (redirect: boolean) => void; - mode?: TraceAnalyticsMode; + mode: TraceAnalyticsMode; } export function ServicesTable(props: ServicesTableProps) { @@ -170,7 +170,7 @@ export function ServicesTable(props: ServicesTableProps) { }} loading={loading} /> - ) : mode !== TraceAnalyticsMode.None ? ( + ) : mode !== 'none' ? ( ) : ( diff --git a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces_table.test.tsx.snap b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces_table.test.tsx.snap index 5e48443537..4585b5d2f4 100644 --- a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces_table.test.tsx.snap +++ b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces_table.test.tsx.snap @@ -66,26 +66,25 @@ exports[`Traces table component renders empty traces table message 1`] = ` className="euiHorizontalRule euiHorizontalRule--full" /> - + + +
+ - Learn more - - } body={ - The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. } title={

- Trace Analytics not set up + No matches

} > @@ -98,7 +97,7 @@ exports[`Traces table component renders empty traces table message 1`] = `

- Trace Analytics not set up + No matches

- The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. + No data matches the selected filter. Clear the filter and/or increase the time range to see more results.
- -
- - - - - -
- + +
+ +
@@ -453,14 +375,6 @@ exports[`Traces table component renders traces table 1`] = ` "sortable": true, "truncateText": true, }, - Object { - "align": "left", - "field": "trace_group", - "name": "Trace group", - "render": [Function], - "sortable": true, - "truncateText": true, - }, Object { "align": "right", "field": "latency", @@ -468,17 +382,6 @@ exports[`Traces table component renders traces table 1`] = ` "sortable": true, "truncateText": true, }, - Object { - "align": "right", - "field": "percentile_in_trace_group", - "name": -
- Percentile in trace group -
-
, - "render": [Function], - "sortable": true, - }, Object { "align": "right", "field": "error_count", @@ -542,14 +445,6 @@ exports[`Traces table component renders traces table 1`] = ` "sortable": true, "truncateText": true, }, - Object { - "align": "left", - "field": "trace_group", - "name": "Trace group", - "render": [Function], - "sortable": true, - "truncateText": true, - }, Object { "align": "right", "field": "latency", @@ -557,17 +452,6 @@ exports[`Traces table component renders traces table 1`] = ` "sortable": true, "truncateText": true, }, - Object { - "align": "right", - "field": "percentile_in_trace_group", - "name": -
- Percentile in trace group -
-
, - "render": [Function], - "sortable": true, - }, Object { "align": "right", "field": "error_count", @@ -667,39 +551,21 @@ exports[`Traces table component renders traces table 1`] = ` Object { "isSortAscending": undefined, "isSorted": false, - "key": "_data_s_trace_group_1", - "name": "Trace group", - "onSort": [Function], - }, - Object { - "isSortAscending": undefined, - "isSorted": false, - "key": "_data_s_latency_2", + "key": "_data_s_latency_1", "name": "Latency (ms)", "onSort": [Function], }, Object { "isSortAscending": undefined, "isSorted": false, - "key": "_data_s_percentile_in_trace_group_3", - "name": -
- Percentile in trace group -
-
, - "onSort": [Function], - }, - Object { - "isSortAscending": undefined, - "isSorted": false, - "key": "_data_s_error_count_4", + "key": "_data_s_error_count_2", "name": "Errors", "onSort": [Function], }, Object { "isSortAscending": undefined, "isSorted": false, - "key": "_data_s_last_updated_5", + "key": "_data_s_last_updated_3", "name": "Last updated", "onSort": [Function], }, @@ -923,76 +789,18 @@ exports[`Traces table component renders traces table 1`] = ` - - - - - - - - - - - - -
- Trace group -
-
- -
- HTTP GET -
-
-
- -
-
- Percentile in trace group -
- , - "render": undefined, - } - } - setScopeRow={false} - textOnly={false} - > - -
-
- Percentile in trace group -
-
-
- -
- 30th -
-
-
- -
- spec', () => { isFlyoutVisible={true} closeFlyout={closeFlyout} addSpanFilter={addSpanFilter} + mode="data_prepper" /> ); utils.update(); @@ -53,6 +54,7 @@ describe(' spec', () => { isFlyoutVisible={true} closeFlyout={closeFlyout} addSpanFilter={addSpanFilter} + mode="data_prepper" />, container ); diff --git a/public/components/trace_analytics/components/traces/__tests__/span_detail_panel.test.tsx b/public/components/trace_analytics/components/traces/__tests__/span_detail_panel.test.tsx index c652224bb7..02d3aeafe7 100644 --- a/public/components/trace_analytics/components/traces/__tests__/span_detail_panel.test.tsx +++ b/public/components/trace_analytics/components/traces/__tests__/span_detail_panel.test.tsx @@ -52,7 +52,7 @@ describe('Service breakdown panel component', () => { ], ganttMaxX: 19.91, }; - const wrapper = mount(); + const wrapper = mount(); expect(wrapper).toMatchSnapshot(); }); }); diff --git a/public/components/trace_analytics/components/traces/__tests__/trace_view.test.tsx b/public/components/trace_analytics/components/traces/__tests__/trace_view.test.tsx index 3d334e25c6..be3d1c1b93 100644 --- a/public/components/trace_analytics/components/traces/__tests__/trace_view.test.tsx +++ b/public/components/trace_analytics/components/traces/__tests__/trace_view.test.tsx @@ -20,6 +20,7 @@ describe('Trace view component', () => { chrome={core.chrome} parentBreadcrumbs={[{ text: 'test', href: 'test#/' }]} traceId="test" + mode="data_prepper" /> ); expect(wrapper).toMatchSnapshot(); diff --git a/public/components/trace_analytics/components/traces/__tests__/traces.test.tsx b/public/components/trace_analytics/components/traces/__tests__/traces.test.tsx index a48f54f0c9..644f95c8a2 100644 --- a/public/components/trace_analytics/components/traces/__tests__/traces.test.tsx +++ b/public/components/trace_analytics/components/traces/__tests__/traces.test.tsx @@ -46,8 +46,8 @@ describe('Traces component', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={false} page="traces" + mode='data_prepper' /> ); @@ -88,7 +88,7 @@ describe('Traces component', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} + mode='data_prepper' page="traces" /> ); diff --git a/public/components/trace_analytics/components/traces/span_detail_flyout.tsx b/public/components/trace_analytics/components/traces/span_detail_flyout.tsx index 0dc3216f47..fcfbe1f27c 100644 --- a/public/components/trace_analytics/components/traces/span_detail_flyout.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_flyout.tsx @@ -33,9 +33,9 @@ export function SpanDetailFlyout(props: { isFlyoutVisible: boolean; closeFlyout: () => void; addSpanFilter: (field: string, value: any) => void; - mode?: TraceAnalyticsMode; + mode: TraceAnalyticsMode; }) { - const mode = props.mode !== undefined ? props.mode: 'data_prepper'; + const { mode } = props; const [span, setSpan] = useState({}); useEffect(() => { diff --git a/public/components/trace_analytics/components/traces/span_detail_table.tsx b/public/components/trace_analytics/components/traces/span_detail_table.tsx index 904184c6b0..af2934b860 100644 --- a/public/components/trace_analytics/components/traces/span_detail_table.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_table.tsx @@ -18,7 +18,7 @@ interface SpanDetailTableProps { http: HttpSetup; hiddenColumns: string[]; openFlyout: (spanId: string) => void; - mode?: TraceAnalyticsMode + mode: TraceAnalyticsMode DSL?: any; setTotal?: (total: number) => void; } @@ -40,7 +40,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { direction: 'asc' | 'desc'; }>, }); - const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper; + const { mode } = props; const [items, setItems] = useState([]); const [total, setTotal] = useState(0); @@ -58,46 +58,46 @@ export function SpanDetailTable(props: SpanDetailTableProps) { }, [total]); const columns: EuiDataGridColumn[] = [ - ... mode === TraceAnalyticsMode.Jaeger ? [{ + ... mode === 'jaeger' ? [{ id: 'spanID', display: 'Span ID', }] : [{ id: 'spanId', display: 'Span ID', }], - ... mode === TraceAnalyticsMode.Jaeger ? [{ + ... mode === 'jaeger' ? [{ id: 'references', display: 'Parent span ID', }] : [{ id: 'parentSpanId', display: 'Parent span ID', }], - ... mode === TraceAnalyticsMode.Jaeger ? [{ + ... mode === 'jaeger' ? [{ id: 'traceID', display: 'Trace ID', }] : [{ id: 'traceId', display: 'Trace ID', }], - ... mode === TraceAnalyticsMode.Jaeger ? [] : [{ + ... mode === 'jaeger' ? [] : [{ id: 'traceGroup', display: 'Trace group', }], - ... mode === TraceAnalyticsMode.Jaeger ? [{ + ... mode === 'jaeger' ? [{ id: 'process', display: 'Service', }] : [{ id: 'serviceName', display: 'Service', }], - ... mode === TraceAnalyticsMode.Jaeger ? [{ + ... mode === 'jaeger' ? [{ id: 'operationName', display: 'Operation', }] : [{ id: 'name', display: 'Operation', }], - ... mode === TraceAnalyticsMode.Jaeger ? [{ + ... mode === 'jaeger' ? [{ id: 'duration', display: 'Duration', }] : [{ @@ -108,14 +108,14 @@ export function SpanDetailTable(props: SpanDetailTableProps) { id: 'startTime', display: 'Start time', }, - ... mode === TraceAnalyticsMode.Jaeger ? [{ + ... mode === 'jaeger' ? [{ id: 'jaegerEndTime', display: 'End time', }] : [{ id: 'endTime', display: 'End time', }], - ... mode === TraceAnalyticsMode.Jaeger ? [{ + ... mode === 'jaeger' ? [{ id: 'tag', display: 'Errors', }] : [{ @@ -158,7 +158,7 @@ export function SpanDetailTable(props: SpanDetailTableProps) { case 'duration': return `${_.round(microToMilliSec(Math.max(0, value)), 2)} ms`; case 'startTime': - return mode === TraceAnalyticsMode.Jaeger ? moment(_.round(microToMilliSec(Math.max(0, value)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(value).format(TRACE_ANALYTICS_DATE_FORMAT); + return mode === 'jaeger' ? moment(_.round(microToMilliSec(Math.max(0, value)), 2)).format(TRACE_ANALYTICS_DATE_FORMAT) : moment(value).format(TRACE_ANALYTICS_DATE_FORMAT); case 'jaegerEndTime': return moment(_.round(microToMilliSec(Math.max(0, items[adjustedRowIndex]["startTime"] + items[adjustedRowIndex]["duration"])), 2)).format(TRACE_ANALYTICS_DATE_FORMAT); case 'endTime': @@ -205,8 +205,8 @@ export function SpanDetailTable(props: SpanDetailTableProps) { columnVisibility={{ visibleColumns, setVisibleColumns }} rowCount={total} renderCellValue={renderCellValue} - sorting={mode === TraceAnalyticsMode.Jaeger ? undefined : { columns: tableParams.sortingColumns, onSort }} - toolbarVisibility={mode === TraceAnalyticsMode.Jaeger ? false : true} + sorting={mode === 'jaeger' ? undefined : { columns: tableParams.sortingColumns, onSort }} + toolbarVisibility={mode === 'jaeger' ? false : true} pagination={{ pageIndex: tableParams.page, pageSize: tableParams.size, diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index 3ebe538457..f4e38cec61 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -34,11 +34,11 @@ import { SpanDetailPanel } from './span_detail_panel'; interface TraceViewProps extends TraceAnalyticsCoreDeps { traceId: string; - mode?: TraceAnalyticsMode; + mode: TraceAnalyticsMode; } export function TraceView(props: TraceViewProps) { - const mode = props.mode !== undefined ? props.mode : 'data_prepper' + const { mode } = props; const page = 'traceView'; const renderTitle = (traceId: string) => { return ( diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index 1e1a3adf48..fe2df4eca5 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -12,7 +12,6 @@ import { filtersToDsl, processTimeStamp } from '../common/helper_functions'; import { SearchBar } from '../common/search_bar'; import { TracesProps } from './traces'; import { TracesTable } from './traces_table'; -import { TraceAnalyticsMode } from '../../home'; export function TracesContent(props: TracesProps) { const { @@ -31,8 +30,8 @@ export function TracesContent(props: TracesProps) { setFilters, setStartTime, setEndTime, + mode, } = props; - const mode = props.mode !== undefined ? props.mode : TraceAnalyticsMode.Data_Prepper const [tableItems, setTableItems] = useState([]); const [redirect, setRedirect] = useState(true); const [loading, setLoading] = useState(false); @@ -50,7 +49,7 @@ export function TracesContent(props: TracesProps) { }, []); useEffect(() => { - if (!redirect && mode !== TraceAnalyticsMode.None) refresh(); + if (!redirect && mode !== 'none') refresh(); }, [filters, appConfigs]); const refresh = async (sort?: PropertySort) => { diff --git a/public/components/trace_analytics/components/traces/traces_table.tsx b/public/components/trace_analytics/components/traces/traces_table.tsx index 0e2f5578a8..a601cf4bfa 100644 --- a/public/components/trace_analytics/components/traces/traces_table.tsx +++ b/public/components/trace_analytics/components/traces/traces_table.tsx @@ -280,7 +280,7 @@ export function TracesTable(props: TracesTableProps) { onTableChange={onTableChange} loading={loading} /> - ) : mode !== TraceAnalyticsMode.None ? ( + ) : mode !== 'none' ? ( ) : ( diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index 050efba284..ed0dabf4b8 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -76,7 +76,7 @@ export const Home = (props: HomeProps) => { // } else if (jaegerIndicesExist) { // setMode('jaeger'); // } else { - // setMode(TraceAnalyticsMode.None); + // setMode('none'); // } // }, [jaegerIndicesExist, dataPrepperIndicesExist]); From b94c9356656e16c95fcbbe8068dc67af65b6a208 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 16 Dec 2022 14:54:39 -0500 Subject: [PATCH 36/67] all test pass! Signed-off-by: Derek Ho --- .../service_config.test.tsx.snap | 4 +- .../__tests__/create.test.tsx | 9 ++ .../__tests__/service_config.test.tsx | 4 +- .../config_components/service_config.tsx | 2 +- .../config_components/trace_config.tsx | 3 +- .../service_detail_flyout.tsx | 3 +- .../flyout_components/trace_detail_flyout.tsx | 2 +- .../flyout_components/trace_detail_render.tsx | 5 +- .../events_views/trace_block/trace_block.tsx | 2 +- .../__snapshots__/dashboard.test.tsx.snap | 4 + .../dashboard/__tests__/dashboard.test.tsx | 2 + .../dashboard/dashboard_content.tsx | 2 +- .../__snapshots__/service_view.test.tsx.snap | 1 + .../__snapshots__/services.test.tsx.snap | 134 ++++-------------- .../components/services/services_content.tsx | 2 +- .../span_detail_flyout.test.tsx.snap | 1 + .../span_detail_panel.test.tsx.snap | 1 + .../span_detail_table.test.tsx.snap | 1 + .../__snapshots__/trace_view.test.tsx.snap | 1 + .../__snapshots__/traces.test.tsx.snap | 134 ++++-------------- .../components/traces/span_detail_panel.tsx | 4 +- .../requests/queries/traces_queries.ts | 10 +- .../requests/services_request_handler.ts | 3 +- 23 files changed, 98 insertions(+), 236 deletions(-) diff --git a/public/components/application_analytics/__tests__/__snapshots__/service_config.test.tsx.snap b/public/components/application_analytics/__tests__/__snapshots__/service_config.test.tsx.snap index 72c328ba59..8b128989e8 100644 --- a/public/components/application_analytics/__tests__/__snapshots__/service_config.test.tsx.snap +++ b/public/components/application_analytics/__tests__/__snapshots__/service_config.test.tsx.snap @@ -21,7 +21,7 @@ exports[`Service Config component renders empty service config 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={true} + mode="data_prepper" name="" parentBreadcrumb={ Object { @@ -1101,7 +1101,7 @@ exports[`Service Config component renders with one service selected 1`] = ` ] } http={[MockFunction]} - indicesExist={true} + mode="data_prepper" name="" parentBreadcrumb={ Object { diff --git a/public/components/application_analytics/__tests__/create.test.tsx b/public/components/application_analytics/__tests__/create.test.tsx index c75b691efa..5d88132dcf 100644 --- a/public/components/application_analytics/__tests__/create.test.tsx +++ b/public/components/application_analytics/__tests__/create.test.tsx @@ -59,6 +59,8 @@ describe('Create Page', () => { setEndTime={setEndTime} name="" description="" + mode='data_prepper' + mode='data_prepper' setNameWithStorage={setNameWithStorage} setDescriptionWithStorage={setDescriptionWithStorage} setQueryWithStorage={setQueryWithStorage} @@ -122,6 +124,7 @@ describe('Create Page', () => { setEndTime={setEndTime} name="Chic Application" description="This is my chic application." + mode='data_prepper' setNameWithStorage={setNameWithStorage} setDescriptionWithStorage={setDescriptionWithStorage} setQueryWithStorage={setQueryWithStorage} @@ -185,6 +188,7 @@ describe('Create Page', () => { setEndTime={setEndTime} name="" description="" + mode='data_prepper' setNameWithStorage={setNameWithStorage} setDescriptionWithStorage={setDescriptionWithStorage} setQueryWithStorage={setQueryWithStorage} @@ -251,6 +255,7 @@ describe('Create Page', () => { setEndTime={setEndTime} name="" description="" + mode='data_prepper' setNameWithStorage={setNameWithStorage} setDescriptionWithStorage={setDescriptionWithStorage} setQueryWithStorage={setQueryWithStorage} @@ -326,6 +331,7 @@ describe('Create Page', () => { setEndTime={setEndTime} name="" description="" + mode='data_prepper' setNameWithStorage={setNameWithStorage} setDescriptionWithStorage={setDescriptionWithStorage} setQueryWithStorage={setQueryWithStorage} @@ -401,6 +407,7 @@ describe('Create Page', () => { setEndTime={setEndTime} name="" description="" + mode='data_prepper' setNameWithStorage={setNameWithStorage} setDescriptionWithStorage={setDescriptionWithStorage} setQueryWithStorage={setQueryWithStorage} @@ -476,6 +483,7 @@ describe('Create Page', () => { setEndTime={setEndTime} name="" description="" + mode='data_prepper' setNameWithStorage={setNameWithStorage} setDescriptionWithStorage={setDescriptionWithStorage} setQueryWithStorage={setQueryWithStorage} @@ -551,6 +559,7 @@ describe('Create Page', () => { setEndTime={setEndTime} name="" description="" + mode='data_prepper' setNameWithStorage={setNameWithStorage} setDescriptionWithStorage={setDescriptionWithStorage} setQueryWithStorage={setQueryWithStorage} diff --git a/public/components/application_analytics/__tests__/service_config.test.tsx b/public/components/application_analytics/__tests__/service_config.test.tsx index d574ba9427..e12847295a 100644 --- a/public/components/application_analytics/__tests__/service_config.test.tsx +++ b/public/components/application_analytics/__tests__/service_config.test.tsx @@ -46,7 +46,7 @@ describe('Service Config component', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} + mode='data_prepper' dslService={dslService} selectedServices={[]} setSelectedServices={setSelectedServices} @@ -108,7 +108,7 @@ describe('Service Config component', () => { setStartTime={setStartTime} endTime="now" setEndTime={setEndTime} - indicesExist={true} + mode='data_prepper' dslService={dslService} selectedServices={[]} setSelectedServices={setSelectedServices} diff --git a/public/components/application_analytics/components/config_components/service_config.tsx b/public/components/application_analytics/components/config_components/service_config.tsx index 13b19e3411..7f403f3987 100644 --- a/public/components/application_analytics/components/config_components/service_config.tsx +++ b/public/components/application_analytics/components/config_components/service_config.tsx @@ -41,7 +41,7 @@ export const ServiceConfig = (props: ServiceConfigProps) => { selectedServices, setSelectedServices, } = props; - const mode = props.mode !== undefined ? props.mode : 'data_prepper'; + const { mode } = props; const [servicesOpen, setServicesOpen] = useState(false); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< diff --git a/public/components/application_analytics/components/config_components/trace_config.tsx b/public/components/application_analytics/components/config_components/trace_config.tsx index 5123903e8d..e5d65cdd2a 100644 --- a/public/components/application_analytics/components/config_components/trace_config.tsx +++ b/public/components/application_analytics/components/config_components/trace_config.tsx @@ -24,7 +24,6 @@ import { handleDashboardRequest } from '../../../trace_analytics/requests/dashbo import { AppAnalyticsComponentDeps } from '../../home'; import { DashboardTable } from '../../../trace_analytics/components/dashboard/dashboard_table'; import { getClearModal } from '../../helpers/modal_containers'; -import { TraceAnalyticsMode } from '../../../../../public/components/trace_analytics/home'; interface TraceConfigProps extends AppAnalyticsComponentDeps { dslService: DSLService; @@ -43,8 +42,8 @@ export const TraceConfig = (props: TraceConfigProps) => { endTime, selectedTraces, setSelectedTraces, + mode } = props; - const mode = props.mode !== undefined ? props.mode : 'data_prepper'; const [traceOpen, setTraceOpen] = useState(false); const [loading, setLoading] = useState(false); const [traceItems, setTraceItems] = useState([]); diff --git a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx index ff608f08f1..cbcd8d1478 100644 --- a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx @@ -44,8 +44,8 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { query, closeServiceFlyout, openSpanFlyout, + mode, } = props; - const mode = props.mode !== undefined ? props.mode : 'data_prepper'; const [fields, setFields] = useState({}); const [serviceMap, setServiceMap] = useState({}); const [total, setTotal] = useState(0); @@ -111,6 +111,7 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { DSL={DSL} openFlyout={openSpanFlyout} setTotal={setTotal} + mode={mode} /> ); diff --git a/public/components/application_analytics/components/flyout_components/trace_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/trace_detail_flyout.tsx index ce687f306c..a5ec5569a2 100644 --- a/public/components/application_analytics/components/flyout_components/trace_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/trace_detail_flyout.tsx @@ -17,7 +17,7 @@ interface TraceFlyoutProps extends TraceAnalyticsComponentDeps { export function TraceDetailFlyout(props: TraceFlyoutProps) { const { traceId, http, closeTraceFlyout, openSpanFlyout } = props; const renderContent = ( - + ); return ( diff --git a/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx b/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx index 0697c23e0f..bb55a94d96 100644 --- a/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx +++ b/public/components/application_analytics/components/flyout_components/trace_detail_render.tsx @@ -20,11 +20,10 @@ interface TraceDetailRenderProps { traceId: string; http: HttpStart; openSpanFlyout: (spanId: string) => void; - traceAnalyticsMode? : TraceAnalyticsMode + mode : TraceAnalyticsMode } -export const TraceDetailRender = ({ traceId, http, openSpanFlyout, traceAnalyticsMode }: TraceDetailRenderProps) => { - const mode = traceAnalyticsMode !== undefined ? traceAnalyticsMode : 'data_prepper'; +export const TraceDetailRender = ({ traceId, http, openSpanFlyout, mode }: TraceDetailRenderProps) => { const [fields, setFields] = useState({}); const [serviceBreakdownData, setServiceBreakdownData] = useState([]); const [payloadData, setPayloadData] = useState(''); diff --git a/public/components/event_analytics/explorer/events_views/trace_block/trace_block.tsx b/public/components/event_analytics/explorer/events_views/trace_block/trace_block.tsx index e90476c926..ca7eecc6a8 100644 --- a/public/components/event_analytics/explorer/events_views/trace_block/trace_block.tsx +++ b/public/components/event_analytics/explorer/events_views/trace_block/trace_block.tsx @@ -43,5 +43,5 @@ export const TraceBlock = ({ http, hit, logTraceId }: props) => { ); } - return ; + return ; }; diff --git a/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap index d95c35271f..fa0f034430 100644 --- a/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap +++ b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap @@ -49,6 +49,7 @@ exports[`Dashboard component renders dashboard 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} + mode="data_prepper" page="dashboard" parentBreadcrumbs={ Array [ @@ -141,6 +142,7 @@ exports[`Dashboard component renders dashboard 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} + mode="data_prepper" page="dashboard" parentBreadcrumbs={ Array [ @@ -2113,6 +2115,7 @@ exports[`Dashboard component renders empty dashboard 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} + mode="data_prepper" page="dashboard" parentBreadcrumbs={ Array [ @@ -2205,6 +2208,7 @@ exports[`Dashboard component renders empty dashboard 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} + mode="data_prepper" page="dashboard" parentBreadcrumbs={ Array [ diff --git a/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx b/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx index 9c1a7c3a50..edce2d350a 100644 --- a/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx +++ b/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx @@ -49,6 +49,7 @@ describe('Dashboard component', () => { endTime="now" setEndTime={setEndTime} page="dashboard" + mode='data_prepper' /> ); @@ -91,6 +92,7 @@ describe('Dashboard component', () => { endTime="now" setEndTime={setEndTime} page="dashboard" + mode='data_prepper' /> ); diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 57a08d7d17..79d97c8409 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -48,8 +48,8 @@ export function DashboardContent(props: DashboardProps) { setEndTime, setQuery, setFilters, + mode, } = props; - const mode = props.mode !== undefined ? props.mode : 'data_prepper' const [tableItems, setTableItems] = useState([]); const [throughputPltItems, setThroughputPltItems] = useState({ items: [], fixedInterval: '1h' }); const [errorRatePltItems, setErrorRatePltItems] = useState({ items: [], fixedInterval: '1h' }); diff --git a/public/components/trace_analytics/components/services/__tests__/__snapshots__/service_view.test.tsx.snap b/public/components/trace_analytics/components/services/__tests__/__snapshots__/service_view.test.tsx.snap index 40b856fb8f..04b93f6092 100644 --- a/public/components/trace_analytics/components/services/__tests__/__snapshots__/service_view.test.tsx.snap +++ b/public/components/trace_analytics/components/services/__tests__/__snapshots__/service_view.test.tsx.snap @@ -241,6 +241,7 @@ exports[`Service view component renders service view 1`] = ` ] } http={[MockFunction]} + mode="data_prepper" openFlyout={[Function]} setTotal={[Function]} /> diff --git a/public/components/trace_analytics/components/services/__tests__/__snapshots__/services.test.tsx.snap b/public/components/trace_analytics/components/services/__tests__/__snapshots__/services.test.tsx.snap index edb5cad8cd..829c1f131a 100644 --- a/public/components/trace_analytics/components/services/__tests__/__snapshots__/services.test.tsx.snap +++ b/public/components/trace_analytics/components/services/__tests__/__snapshots__/services.test.tsx.snap @@ -49,7 +49,7 @@ exports[`Services component renders empty services page 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={false} + mode="data_prepper" nameColumnAction={[Function]} page="services" parentBreadcrumbs={ @@ -144,7 +144,7 @@ exports[`Services component renders empty services page 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={false} + mode="data_prepper" nameColumnAction={[Function]} page="services" parentBreadcrumbs={ @@ -983,9 +983,9 @@ exports[`Services component renders empty services page 1`] = `
- + + +
+ - Learn more - - } body={ - The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. } title={

- Trace Analytics not set up + No matches

} > @@ -1080,7 +1079,7 @@ exports[`Services component renders empty services page 1`] = `

- Trace Analytics not set up + No matches

- The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. + No data matches the selected filter. Clear the filter and/or increase the time range to see more results.
- -
- - - - - -
- + +
+ +
@@ -1784,7 +1706,7 @@ exports[`Services component renders services page 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={true} + mode="data_prepper" nameColumnAction={[Function]} page="services" parentBreadcrumbs={ @@ -1879,7 +1801,7 @@ exports[`Services component renders services page 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={true} + mode="data_prepper" nameColumnAction={[Function]} page="services" parentBreadcrumbs={ @@ -2741,9 +2663,9 @@ exports[`Services component renders services page 1`] = ` ({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< diff --git a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/span_detail_flyout.test.tsx.snap b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/span_detail_flyout.test.tsx.snap index cb4564c2e1..e4eb22e85d 100644 --- a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/span_detail_flyout.test.tsx.snap +++ b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/span_detail_flyout.test.tsx.snap @@ -8,6 +8,7 @@ exports[` spec renders the empty component 1`] = ` closeFlyout={[MockFunction]} http={[MockFunction]} isFlyoutVisible={true} + mode="data_prepper" spanId="test" > diff --git a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/span_detail_table.test.tsx.snap b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/span_detail_table.test.tsx.snap index 3ebc21f9b9..a18fa3e276 100644 --- a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/span_detail_table.test.tsx.snap +++ b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/span_detail_table.test.tsx.snap @@ -117,6 +117,7 @@ exports[` spec renders the empty component 1`] = ` "onSort": [Function], } } + toolbarVisibility={true} > diff --git a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces.test.tsx.snap b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces.test.tsx.snap index cf9cb8e456..4a8c2de20a 100644 --- a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces.test.tsx.snap +++ b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces.test.tsx.snap @@ -49,7 +49,7 @@ exports[`Traces component renders empty traces page 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={false} + mode="data_prepper" page="traces" parentBreadcrumbs={ Array [ @@ -143,7 +143,7 @@ exports[`Traces component renders empty traces page 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={false} + mode="data_prepper" page="traces" parentBreadcrumbs={ Array [ @@ -980,9 +980,9 @@ exports[`Traces component renders empty traces page 1`] = ` /> @@ -1044,26 +1044,25 @@ exports[`Traces component renders empty traces page 1`] = ` className="euiHorizontalRule euiHorizontalRule--full" /> - + + +
+ - Learn more - - } body={ - The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. } title={

- Trace Analytics not set up + No matches

} > @@ -1076,7 +1075,7 @@ exports[`Traces component renders empty traces page 1`] = `

- Trace Analytics not set up + No matches

- The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. + No data matches the selected filter. Clear the filter and/or increase the time range to see more results.
- -
- - - - - -
- + +
+ +
@@ -1250,7 +1172,7 @@ exports[`Traces component renders traces page 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={true} + mode="data_prepper" page="traces" parentBreadcrumbs={ Array [ @@ -1344,7 +1266,7 @@ exports[`Traces component renders traces page 1`] = ` endTime="now" filters={Array []} http={[MockFunction]} - indicesExist={true} + mode="data_prepper" page="traces" parentBreadcrumbs={ Array [ @@ -2204,9 +2126,9 @@ exports[`Traces component renders traces page 1`] = ` />
diff --git a/public/components/trace_analytics/components/traces/span_detail_panel.tsx b/public/components/trace_analytics/components/traces/span_detail_panel.tsx index 95ff0368d4..e4fb34dba4 100644 --- a/public/components/trace_analytics/components/traces/span_detail_panel.tsx +++ b/public/components/trace_analytics/components/traces/span_detail_panel.tsx @@ -85,7 +85,7 @@ export function SpanDetailPanel(props: { }, 150); const spanFiltersToDSL = () => { - const spanDSL: any = mode === TraceAnalyticsMode.Jaeger ? { + const spanDSL: any = mode === 'jaeger' ? { query: { bool: { must: [ @@ -222,7 +222,7 @@ export function SpanDetailPanel(props: { () => ( { diff --git a/public/components/trace_analytics/requests/queries/traces_queries.ts b/public/components/trace_analytics/requests/queries/traces_queries.ts index 2ea0a5e26b..fbff7cf69d 100644 --- a/public/components/trace_analytics/requests/queries/traces_queries.ts +++ b/public/components/trace_analytics/requests/queries/traces_queries.ts @@ -182,7 +182,7 @@ export const getTracesQuery = (mode: TraceAnalyticsMode, traceId: string = '', s }, }); } - return mode === TraceAnalyticsMode.Jaeger ? jaegerQuery : dataPrepperQuery; + return mode === 'jaeger' ? jaegerQuery : dataPrepperQuery; }; export const getServiceBreakdownQuery = (traceId: string, mode: TraceAnalyticsMode) => { @@ -276,11 +276,11 @@ export const getServiceBreakdownQuery = (traceId: string, mode: TraceAnalyticsMo }, }, }; - return mode === TraceAnalyticsMode.Jaeger? jaegerQuery : dataPrepperQuery; + return mode === 'jaeger'? jaegerQuery : dataPrepperQuery; }; export const getSpanDetailQuery = (mode: TraceAnalyticsMode, traceId: string, size = 3000) => { - if (mode === TraceAnalyticsMode.Jaeger) { + if (mode === 'jaeger') { return { size, query: { @@ -366,7 +366,7 @@ export const getSpanDetailQuery = (mode: TraceAnalyticsMode, traceId: string, si }; export const getPayloadQuery = (mode: TraceAnalyticsMode, traceId: string, size = 1000) => { - if (mode === TraceAnalyticsMode.Jaeger) { + if (mode === 'jaeger') { return { size, query: { @@ -405,7 +405,7 @@ export const getPayloadQuery = (mode: TraceAnalyticsMode, traceId: string, size }; export const getSpanFlyoutQuery = (mode: TraceAnalyticsMode, spanId?: string, size = 1000) => { - if (mode === TraceAnalyticsMode.Jaeger) { + if (mode === 'jaeger') { return { size, query: { diff --git a/public/components/trace_analytics/requests/services_request_handler.ts b/public/components/trace_analytics/requests/services_request_handler.ts index 1b5b6f7c6c..0efdb46a7c 100644 --- a/public/components/trace_analytics/requests/services_request_handler.ts +++ b/public/components/trace_analytics/requests/services_request_handler.ts @@ -70,8 +70,7 @@ export const handleServiceMapRequest = async ( // const lte = dateMath.parse(startTime.lte)!; // minutesInDateRange = lte.diff(gte, 'minutes', true); // } - minutesInDateRange=100000000 - + // minutesInDateRange = 100000000000; const map: ServiceObject = {}; let id = 1; await handleDslRequest(http, null, getServiceNodesQuery(mode), mode) From ccdae0fac4a7b8043a467bf501ee45d4e882f213 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 16 Dec 2022 17:16:10 -0500 Subject: [PATCH 37/67] try to get mode picker Signed-off-by: Derek Ho --- .babelrc | 1 - package.json | 2 -- .../components/application_analytics/home.tsx | 1 + .../dashboard/dashboard_content.tsx | 2 ++ yarn.lock | 34 ------------------- 5 files changed, 3 insertions(+), 37 deletions(-) diff --git a/.babelrc b/.babelrc index 39d2796c65..e21b3f2f2b 100644 --- a/.babelrc +++ b/.babelrc @@ -10,7 +10,6 @@ "@babel/preset-typescript" ], "plugins": [ - "@babel/plugin-syntax-flow", "@babel/plugin-transform-modules-commonjs", ["@babel/plugin-transform-runtime", { "regenerator": true }], "@babel/plugin-proposal-class-properties", diff --git a/package.json b/package.json index 110ba45c46..2b9abcc485 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,6 @@ "redux-persist": "^6.0.0" }, "devDependencies": { - "@babel/plugin-syntax-flow": "^7.18.6", - "@babel/preset-flow": "^7.18.6", "@cypress/skip-test": "^2.6.1", "@types/enzyme-adapter-react-16": "^1.0.6", "@types/react-plotly.js": "^2.5.0", diff --git a/public/components/application_analytics/home.tsx b/public/components/application_analytics/home.tsx index 3d9abaebd4..1e7f478453 100644 --- a/public/components/application_analytics/home.tsx +++ b/public/components/application_analytics/home.tsx @@ -137,6 +137,7 @@ export const Home = (props: HomeProps) => { setStartTime, endTime, setEndTime, + mode: 'data_prepper', }; const setToast = (title: string, color = 'success', text?: ReactChild) => { diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 79d97c8409..997637ff4b 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -31,6 +31,7 @@ import { SearchBar } from '../common/search_bar'; import { DashboardProps } from './dashboard'; import { DashboardTable } from './dashboard_table'; import { TraceAnalyticsMode } from '../../home'; +import { DataSourcePicker } from './mode_picker'; export function DashboardContent(props: DashboardProps) { const { @@ -190,6 +191,7 @@ export function DashboardContent(props: DashboardProps) { return ( <> + Date: Mon, 19 Dec 2022 14:27:31 -0500 Subject: [PATCH 38/67] get it hooked up - still need to iron out a few things Signed-off-by: Derek Ho --- .../trace_analytics/components/dashboard/dashboard.tsx | 3 ++- .../components/dashboard/dashboard_content.tsx | 8 ++++++-- public/components/trace_analytics/home.tsx | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/dashboard.tsx b/public/components/trace_analytics/components/dashboard/dashboard.tsx index c5bf0a501f..8c248b0eb4 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard.tsx @@ -5,12 +5,13 @@ import { EuiBreadcrumb, EuiTitle } from '@elastic/eui'; import React from 'react'; -import { TraceAnalyticsComponentDeps } from '../../home'; +import { TraceAnalyticsComponentDeps, TraceAnalyticsMode } from '../../home'; import { DashboardContent } from './dashboard_content'; export interface DashboardProps extends TraceAnalyticsComponentDeps { childBreadcrumbs: EuiBreadcrumb[]; page: 'dashboard' | 'app'; + setMode?: (mode: TraceAnalyticsMode) => void; } export function Dashboard(props: DashboardProps) { diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 997637ff4b..ce59a91320 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -30,7 +30,6 @@ import { ThroughputPlt } from '../common/plots/throughput_plt'; import { SearchBar } from '../common/search_bar'; import { DashboardProps } from './dashboard'; import { DashboardTable } from './dashboard_table'; -import { TraceAnalyticsMode } from '../../home'; import { DataSourcePicker } from './mode_picker'; export function DashboardContent(props: DashboardProps) { @@ -50,7 +49,9 @@ export function DashboardContent(props: DashboardProps) { setQuery, setFilters, mode, + setMode } = props; + console.log(setMode) const [tableItems, setTableItems] = useState([]); const [throughputPltItems, setThroughputPltItems] = useState({ items: [], fixedInterval: '1h' }); const [errorRatePltItems, setErrorRatePltItems] = useState({ items: [], fixedInterval: '1h' }); @@ -188,10 +189,13 @@ export function DashboardContent(props: DashboardProps) { const newFilters = [...filters, percentileFilter, ...additionalFilters]; setFilters(newFilters); }; + const modes = [{id: 'jaeger', title: 'Jaeger'}, {id: 'data_prepper', title: 'Data Prepper'}] return ( <> - + {setMode !== undefined ? + + :
} { path={['/trace_analytics', '/trace_analytics/home']} render={(routerProps) => ( - + {setMode(mode)}} {...commonProps} /> )} /> From cf43a6a63015884b90075bc6744424cf13379722 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Mon, 19 Dec 2022 15:25:41 -0500 Subject: [PATCH 39/67] get it working Signed-off-by: Derek Ho --- .../components/dashboard/dashboard_content.tsx | 3 +-- public/components/trace_analytics/home.tsx | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index ce59a91320..2a33945267 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -51,7 +51,6 @@ export function DashboardContent(props: DashboardProps) { mode, setMode } = props; - console.log(setMode) const [tableItems, setTableItems] = useState([]); const [throughputPltItems, setThroughputPltItems] = useState({ items: [], fixedInterval: '1h' }); const [errorRatePltItems, setErrorRatePltItems] = useState({ items: [], fixedInterval: '1h' }); @@ -194,7 +193,7 @@ export function DashboardContent(props: DashboardProps) { return ( <> {setMode !== undefined ? - + :
} { const [dataPrepperIndicesExist, setDataPrepperIndicesExist] = useState(true); const [jaegerIndicesExist, setJaegerIndicesExist] = useState(true); - const [mode, setMode] = useState('jaeger') + const [mode, setMode] = useState(sessionStorage.getItem('TraceAnalyticsMode') as TraceAnalyticsMode || 'jaeger') const storedFilters = sessionStorage.getItem('TraceAnalyticsFilters'); const [query, setQuery] = useState(sessionStorage.getItem('TraceAnalyticsQuery') || ''); const [filters, setFilters] = useState( @@ -144,7 +144,7 @@ export const Home = (props: HomeProps) => { path={['/trace_analytics', '/trace_analytics/home']} render={(routerProps) => ( - {setMode(mode)}} {...commonProps} /> + {setMode(mode)}} {...commonProps} /> )} /> From 72b0a733b6719bc64ded76c51771629da4e6735e Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Mon, 19 Dec 2022 20:01:58 -0500 Subject: [PATCH 40/67] fix a few things Signed-off-by: Derek Ho --- .../application_analytics/__tests__/create.test.tsx | 1 - .../components/application.tsx | 1 + .../flyout_components/service_detail_flyout.tsx | 2 +- .../components/dashboard/dashboard_content.tsx | 10 +++++++++- .../components/dashboard/dashboard_table.tsx | 3 ++- .../components/services/services_content.tsx | 1 - .../requests/services_request_handler.ts | 13 ++++++------- 7 files changed, 19 insertions(+), 12 deletions(-) diff --git a/public/components/application_analytics/__tests__/create.test.tsx b/public/components/application_analytics/__tests__/create.test.tsx index 5d88132dcf..adc0643ac4 100644 --- a/public/components/application_analytics/__tests__/create.test.tsx +++ b/public/components/application_analytics/__tests__/create.test.tsx @@ -11,7 +11,6 @@ import { coreStartMock } from '../../../../test/__mocks__/coreMocks'; import DSLService from 'public/services/requests/dsl'; import PPLService from 'public/services/requests/ppl'; import { render } from '@testing-library/react'; -import { TraceAnalyticsMode } from 'public/components/trace_analytics/home'; describe('Create Page', () => { configure({ adapter: new Adapter() }); diff --git a/public/components/application_analytics/components/application.tsx b/public/components/application_analytics/components/application.tsx index d46bb306c8..746d0f753b 100644 --- a/public/components/application_analytics/components/application.tsx +++ b/public/components/application_analytics/components/application.tsx @@ -350,6 +350,7 @@ export function Application(props: AppDetailProps) { openFlyout={setSpanFlyoutId} DSL={spanDSL} setTotal={setTotalSpans} + mode='data_prepper' /> diff --git a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx index cbcd8d1478..2b836d2c1b 100644 --- a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx @@ -23,7 +23,7 @@ import { filtersToDsl, processTimeStamp } from '../../../../../public/components import { ServiceMap } from '../../../../../public/components/trace_analytics/components/services'; import { ServiceObject } from '../../../../../public/components/trace_analytics/components/common/plots/service_map'; import { SpanDetailTable } from '../../../../../public/components/trace_analytics/components/traces/span_detail_table'; -import { TraceAnalyticsComponentDeps, TraceAnalyticsMode } from '../../../../../public/components/trace_analytics/home'; +import { TraceAnalyticsComponentDeps } from '../../../../../public/components/trace_analytics/home'; import { getListItem } from '../../helpers/utils'; interface ServiceFlyoutProps extends TraceAnalyticsComponentDeps { diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 2a33945267..23864fb7a4 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -31,6 +31,7 @@ import { SearchBar } from '../common/search_bar'; import { DashboardProps } from './dashboard'; import { DashboardTable } from './dashboard_table'; import { DataSourcePicker } from './mode_picker'; +import { TopGroupsPage } from './top_groups_page'; export function DashboardContent(props: DashboardProps) { const { @@ -254,7 +255,14 @@ export function DashboardContent(props: DashboardProps) { ) : ( -
You are looking at raw jaeger data, so some features may not be available. Click on the traces or services subpage to start exploring your data!
+ ) }
diff --git a/public/components/trace_analytics/components/dashboard/dashboard_table.tsx b/public/components/trace_analytics/components/dashboard/dashboard_table.tsx index cba1740883..587fb67370 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_table.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_table.tsx @@ -27,6 +27,7 @@ import { BoxPlt } from '../common/plots/box_plt'; import { LatencyTrendCell } from './latency_trend_cell'; export function DashboardTable(props: { + title?: string; items: any[]; filters: FilterType[]; addFilter: (filter: FilterType) => void; @@ -349,7 +350,7 @@ export function DashboardTable(props: { return ( - + { let minutesInDateRange: number; - // const startTime = DSL.custom?.timeFilter?.[0]?.range?.startTime; - // if (startTime) { - // const gte = dateMath.parse(startTime.gte)!; - // const lte = dateMath.parse(startTime.lte)!; - // minutesInDateRange = lte.diff(gte, 'minutes', true); - // } - // minutesInDateRange = 100000000000; + const startTime = DSL.custom?.timeFilter?.[0]?.range?.startTime; + if (startTime) { + const gte = dateMath.parse(startTime.gte)!; + const lte = dateMath.parse(startTime.lte, { roundUp: true })!; + minutesInDateRange = lte.diff(gte, 'minutes', true); + } const map: ServiceObject = {}; let id = 1; await handleDslRequest(http, null, getServiceNodesQuery(mode), mode) From 46dc547e7ae90ff8ab18c677a35cbae722fe1d8f Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Tue, 20 Dec 2022 14:46:23 -0500 Subject: [PATCH 41/67] some more work to get plots in Signed-off-by: Derek Ho --- opensearch_dashboards.json | 4 +- .../__tests__/create.test.tsx | 1 - .../config_components/service_config.tsx | 1 - .../dashboard/dashboard_content.tsx | 70 ++++++++++++------- .../requests/dashboard_request_handler.ts | 37 +++++++++- .../requests/queries/dashboard_queries.ts | 55 ++++++++++++++- 6 files changed, 135 insertions(+), 33 deletions(-) diff --git a/opensearch_dashboards.json b/opensearch_dashboards.json index ff4c110221..5b932de361 100644 --- a/opensearch_dashboards.json +++ b/opensearch_dashboards.json @@ -1,7 +1,7 @@ { "id": "observabilityDashboards", - "version": "2.5.0.0", - "opensearchDashboardsVersion": "2.5.0", + "version": "2.4.0.0", + "opensearchDashboardsVersion": "2.4.2", "server": true, "ui": true, "requiredPlugins": [ diff --git a/public/components/application_analytics/__tests__/create.test.tsx b/public/components/application_analytics/__tests__/create.test.tsx index adc0643ac4..15cfb1c6c5 100644 --- a/public/components/application_analytics/__tests__/create.test.tsx +++ b/public/components/application_analytics/__tests__/create.test.tsx @@ -59,7 +59,6 @@ describe('Create Page', () => { name="" description="" mode='data_prepper' - mode='data_prepper' setNameWithStorage={setNameWithStorage} setDescriptionWithStorage={setDescriptionWithStorage} setQueryWithStorage={setQueryWithStorage} diff --git a/public/components/application_analytics/components/config_components/service_config.tsx b/public/components/application_analytics/components/config_components/service_config.tsx index 7f403f3987..bfeb5029fa 100644 --- a/public/components/application_analytics/components/config_components/service_config.tsx +++ b/public/components/application_analytics/components/config_components/service_config.tsx @@ -24,7 +24,6 @@ import { handleServiceMapRequest } from '../../../trace_analytics/requests/servi import { AppAnalyticsComponentDeps } from '../../home'; import { OptionType } from '../../../../../common/types/application_analytics'; import { getClearModal } from '../../helpers/modal_containers'; -import { TraceAnalyticsMode } from '../../../../../public/components/trace_analytics/home'; interface ServiceConfigProps extends AppAnalyticsComponentDeps { dslService: DSLService; diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 23864fb7a4..94fa17b044 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -12,6 +12,8 @@ import { handleDashboardErrorRatePltRequest, handleDashboardRequest, handleDashboardThroughputPltRequest, + handleTopErrorRatePltRequest, + handleTopThroughputPltRequest, } from '../../requests/dashboard_request_handler'; import { handleServiceMapRequest } from '../../requests/services_request_handler'; import { FilterType } from '../common/filters/filters'; @@ -54,6 +56,7 @@ export function DashboardContent(props: DashboardProps) { } = props; const [tableItems, setTableItems] = useState([]); const [throughputPltItems, setThroughputPltItems] = useState({ items: [], fixedInterval: '1h' }); + const [jaegerErrorRatePltItems, setJaegerErrorRatePltItems] = useState({ items: [], fixedInterval: '1h' }); const [errorRatePltItems, setErrorRatePltItems] = useState({ items: [], fixedInterval: '1h' }); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< @@ -102,39 +105,47 @@ export function DashboardContent(props: DashboardProps) { appConfigs ); const fixedInterval = minFixedInterval(startTime, endTime); + // handleDashboardRequest( + // http, + // DSL, + // timeFilterDSL, + // latencyTrendDSL, + // tableItems, + // setTableItems, + // mode, + // setPercentileMap, + // ).then(() => setLoading(false)); + // handleDashboardThroughputPltRequest( + // http, + // DSL, + // fixedInterval, + // throughputPltItems, + // setThroughputPltItems, + // mode + // ); - handleDashboardRequest( - http, - DSL, - timeFilterDSL, - latencyTrendDSL, - tableItems, - setTableItems, - mode, - setPercentileMap, - ).then(() => setLoading(false)); - handleDashboardThroughputPltRequest( - http, - DSL, - fixedInterval, - throughputPltItems, - setThroughputPltItems, - mode - ); - handleDashboardErrorRatePltRequest( + handleTopErrorRatePltRequest( http, DSL, fixedInterval, - errorRatePltItems, - setErrorRatePltItems, + jaegerErrorRatePltItems, + setJaegerErrorRatePltItems, mode ); - // service map should not be filtered by service name (https://github.com/opensearch-project/observability/issues/442) - const serviceMapDSL = _.cloneDeep(DSL); - serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( - (must: any) => must?.term?.serviceName == null - ); - handleServiceMapRequest(http, serviceMapDSL, mode, setServiceMap, currService || filteredService); + // handleDashboardErrorRatePltRequest( + // http, + // DSL, + // fixedInterval, + // errorRatePltItems, + // setErrorRatePltItems, + // mode + // ); + // // service map should not be filtered by service name (https://github.com/opensearch-project/observability/issues/442) + // const serviceMapDSL = _.cloneDeep(DSL); + // serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( + // (must: any) => must?.term?.serviceName == null + // ); + // handleServiceMapRequest(http, serviceMapDSL, mode, setServiceMap, currService || filteredService); }; const addFilter = (filter: FilterType) => { @@ -189,6 +200,7 @@ export function DashboardContent(props: DashboardProps) { const newFilters = [...filters, percentileFilter, ...additionalFilters]; setFilters(newFilters); }; + const modes = [{id: 'jaeger', title: 'Jaeger'}, {id: 'data_prepper', title: 'Data Prepper'}] return ( @@ -262,6 +274,10 @@ export function DashboardContent(props: DashboardProps) { setRedirect={setRedirect} loading={loading} page={page} + throughPutItems={throughputPltItems} + jaegerErrorRatePltItems={jaegerErrorRatePltItems} + setStartTime={setStartTime} + setEndTime={setEndTime} /> ) } diff --git a/public/components/trace_analytics/requests/dashboard_request_handler.ts b/public/components/trace_analytics/requests/dashboard_request_handler.ts index 071ca9a12a..30296bc7f5 100644 --- a/public/components/trace_analytics/requests/dashboard_request_handler.ts +++ b/public/components/trace_analytics/requests/dashboard_request_handler.ts @@ -6,13 +6,14 @@ import _ from 'lodash'; import moment from 'moment'; import { TRACE_ANALYTICS_PLOTS_DATE_FORMAT } from '../../../../common/constants/trace_analytics'; -import { fixedIntervalToMilli, nanoToMilliSec } from '../components/common/helper_functions'; +import { fixedIntervalToMilli, microToMilliSec, nanoToMilliSec } from '../components/common/helper_functions'; import { getDashboardQuery, getDashboardThroughputPltQuery, getDashboardTraceGroupPercentiles, getErrorRatePltQuery, getLatencyTrendQuery, + getTopErrorRatePltQuery, } from './queries/dashboard_queries'; import { handleDslRequest } from './request_handler'; @@ -187,3 +188,37 @@ export const handleDashboardErrorRatePltRequest = (http, DSL, fixedInterval, ite }) .catch((error) => console.error(error)); }; + + +export const handleTopErrorRatePltRequest = (http, DSL, fixedInterval, items, setItems, mode) => { + return handleDslRequest(http, DSL, getTopErrorRatePltQuery(fixedInterval), mode) + .then((response) => { + const buckets = response.aggregations.error_rate.buckets; + const texts = buckets.map( + (bucket) => + `${moment(bucket.key).format(TRACE_ANALYTICS_PLOTS_DATE_FORMAT)} - ${moment( + bucket.key + fixedIntervalToMilli(fixedInterval) + ).format(TRACE_ANALYTICS_PLOTS_DATE_FORMAT)}` + ); + const newItems = + buckets.length > 0 + ? [ + { + x: buckets.map((bucket) => bucket.key), + y: buckets.map((bucket) => _.round(bucket.error_rate?.value || 0, 2)), + marker: { + color: '#fad963', + }, + type: 'bar', + customdata: texts, + hoverlabel: { + align: 'left', + }, + hovertemplate: '%{customdata}
Error rate: %{y}', + }, + ] + : []; + setItems({ items: newItems, fixedInterval: fixedInterval }); + }) + .catch((error) => console.error(error)); +}; diff --git a/public/components/trace_analytics/requests/queries/dashboard_queries.ts b/public/components/trace_analytics/requests/queries/dashboard_queries.ts index 29080cd1b0..3285a6627f 100644 --- a/public/components/trace_analytics/requests/queries/dashboard_queries.ts +++ b/public/components/trace_analytics/requests/queries/dashboard_queries.ts @@ -257,6 +257,59 @@ export const getErrorRatePltQuery = (fixedInterval) => { return query; }; +export const getTopErrorRatePltQuery = (fixedInterval) => { + const query: any = { + size: 0, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + error_rate: { + date_histogram: { + field: 'startTimeMillis', + fixed_interval: fixedInterval, + }, + aggs: { + error_count: { + filter: { + term: { + 'tag.error': true, + }, + }, + aggs: { + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + }, + }, + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + error_rate: { + bucket_script: { + buckets_path: { + total: 'trace_count.value', + errors: 'error_count>trace_count.value', + }, + script: 'params.errors / params.total * 100', + }, + }, + }, + }, + }, + }; + return query; +}; + export const getDashboardThroughputPltQuery = (mode: TraceAnalyticsMode, fixedInterval) => { return { size: 0, @@ -271,7 +324,7 @@ export const getDashboardThroughputPltQuery = (mode: TraceAnalyticsMode, fixedIn aggs: { throughput: { date_histogram: { - field: 'startTime', + field: mode === 'jaeger' ? 'startTimeMillis' : 'startTime', fixed_interval: fixedInterval, }, aggs: { From 21893862cd55329d77788282ab428a4243db2ccb Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 23 Dec 2022 12:56:55 -0500 Subject: [PATCH 42/67] fix filters Signed-off-by: Derek Ho --- .../components/application.tsx | 3 +- .../config_components/trace_config.tsx | 4 +- .../service_detail_flyout.tsx | 4 +- .../__tests__/helper_functions.test.tsx | 2 + .../common/__tests__/search_bar.test.tsx | 1 + .../__tests__/filter_edit_popover.test.tsx | 2 +- .../filters/__tests__/filter_helpers.test.tsx | 6 +- .../common/filters/filter_helpers.tsx | 16 +++-- .../components/common/filters/filters.tsx | 6 +- .../components/common/helper_functions.tsx | 29 +++++++- .../components/common/search_bar.tsx | 1 + .../dashboard/dashboard_content.tsx | 72 ++++++++++--------- .../components/services/service_view.tsx | 4 +- .../components/services/services_content.tsx | 5 +- .../components/services/services_table.tsx | 2 +- .../components/traces/trace_view.tsx | 2 +- .../components/traces/traces_content.tsx | 7 +- .../requests/services_request_handler.ts | 2 +- 18 files changed, 105 insertions(+), 63 deletions(-) diff --git a/public/components/application_analytics/components/application.tsx b/public/components/application_analytics/components/application.tsx index 746d0f753b..b758942583 100644 --- a/public/components/application_analytics/components/application.tsx +++ b/public/components/application_analytics/components/application.tsx @@ -113,6 +113,7 @@ export function Application(props: AppDetailProps) { setFilters, callback, queryManager, + mode, } = props; const [application, setApplication] = useState({ id: '', @@ -230,7 +231,7 @@ export function Application(props: AppDetailProps) { }, [appId, application.name]); useEffect(() => { - const DSL = filtersToDsl(filters, query, appStartTime, appEndTime, 'app', appConfigs); + const DSL = filtersToDsl(mode, filters, query, appStartTime, appEndTime, 'app', appConfigs); setSpanDSL(DSL); }, [filters, appConfigs, query, appStartTime, appEndTime]); diff --git a/public/components/application_analytics/components/config_components/trace_config.tsx b/public/components/application_analytics/components/config_components/trace_config.tsx index e5d65cdd2a..afa329aad4 100644 --- a/public/components/application_analytics/components/config_components/trace_config.tsx +++ b/public/components/application_analytics/components/config_components/trace_config.tsx @@ -55,9 +55,9 @@ export const TraceConfig = (props: TraceConfigProps) => { useEffect(() => { setLoading(true); - const timeFilterDSL = filtersToDsl([], '', startTime, endTime); + const timeFilterDSL = filtersToDsl(mode, [], '', startTime, endTime); const latencyTrendStartTime = dateMath.parse(endTime, { roundUp: true })?.subtract(24, 'hours').toISOString()!; - const latencyTrendDSL = filtersToDsl(filters, query, latencyTrendStartTime, endTime); + const latencyTrendDSL = filtersToDsl(mode, filters, query, latencyTrendStartTime, endTime); handleDashboardRequest( http, dslService, diff --git a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx index 2b836d2c1b..ecfc017542 100644 --- a/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx +++ b/public/components/application_analytics/components/flyout_components/service_detail_flyout.tsx @@ -118,10 +118,10 @@ export function ServiceDetailFlyout(props: ServiceFlyoutProps) { }, [serviceName, fields, serviceMap, DSL, serviceMapIdSelected]); useEffect(() => { - const serviceDSL = filtersToDsl(filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), 'app', appConfigs); + const serviceDSL = filtersToDsl(mode, filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), 'app', appConfigs); handleServiceViewRequest(serviceName, http, serviceDSL, setFields, mode); handleServiceMapRequest(http, serviceDSL, mode, setServiceMap, serviceName); - const spanDSL = filtersToDsl(filters, query, startTime, endTime, 'app', appConfigs); + const spanDSL = filtersToDsl(mode, filters, query, startTime, endTime, 'app', appConfigs); spanDSL.query.bool.must.push({ term: { serviceName, diff --git a/public/components/trace_analytics/components/common/__tests__/helper_functions.test.tsx b/public/components/trace_analytics/components/common/__tests__/helper_functions.test.tsx index 730db77b5a..6b7d66fdb9 100644 --- a/public/components/trace_analytics/components/common/__tests__/helper_functions.test.tsx +++ b/public/components/trace_analytics/components/common/__tests__/helper_functions.test.tsx @@ -120,6 +120,7 @@ describe('Helper functions', () => { it('converts filters to DSL', () => { const getTestDslFromFilters = (field = 'traceGroup', operator = 'exists') => filtersToDsl( + 'data_prepper', [ { field, @@ -148,6 +149,7 @@ describe('Helper functions', () => { ); const customDSL = filtersToDsl( + 'data_prepper', [ { field: 'serviceName', diff --git a/public/components/trace_analytics/components/common/__tests__/search_bar.test.tsx b/public/components/trace_analytics/components/common/__tests__/search_bar.test.tsx index 9e0c8ed124..3a44d6535e 100644 --- a/public/components/trace_analytics/components/common/__tests__/search_bar.test.tsx +++ b/public/components/trace_analytics/components/common/__tests__/search_bar.test.tsx @@ -40,6 +40,7 @@ describe('Search bar components', () => { filters={[]} setFilters={setFilters} appConfigs={[]} + mode={'data_prepper'} /> ); expect(wrapper).toMatchSnapshot(); diff --git a/public/components/trace_analytics/components/common/filters/__tests__/filter_edit_popover.test.tsx b/public/components/trace_analytics/components/common/filters/__tests__/filter_edit_popover.test.tsx index 4d2b0f401c..c179423840 100644 --- a/public/components/trace_analytics/components/common/filters/__tests__/filter_edit_popover.test.tsx +++ b/public/components/trace_analytics/components/common/filters/__tests__/filter_edit_popover.test.tsx @@ -16,7 +16,7 @@ describe('Filter popover component', () => { it('renders filter popover', () => { const setFilter = jest.fn(); const closePopover = jest.fn(); - const filterFieldOptions = getFilterFields('dashboard').map((field) => ({ label: field })); + const filterFieldOptions = getFilterFields('data_prepper', 'dashboard').map((field) => ({ label: field })); const wrapper = mount( { configure({ adapter: new Adapter() }); it('returns fields by page', () => { - const fields = getFilterFields('dashboard'); + const fields = getFilterFields('data_prepper', 'dashboard'); expect(fields).toEqual([ 'traceGroup', 'serviceName', @@ -28,8 +28,8 @@ describe('Filter helper functions', () => { }); it('returns valid fields by page', () => { - const dashboardFields = getValidFilterFields('dashboard'); - const servicesFields = getValidFilterFields('services'); + const dashboardFields = getValidFilterFields('data_prepper', 'dashboard'); + const servicesFields = getValidFilterFields('data_prepper', 'services'); expect(dashboardFields).toEqual([ 'traceGroup', 'serviceName', diff --git a/public/components/trace_analytics/components/common/filters/filter_helpers.tsx b/public/components/trace_analytics/components/common/filters/filter_helpers.tsx index 1410bfea00..b70341198c 100644 --- a/public/components/trace_analytics/components/common/filters/filter_helpers.tsx +++ b/public/components/trace_analytics/components/common/filters/filter_helpers.tsx @@ -11,20 +11,26 @@ import { EuiSpacer, } from '@elastic/eui'; import _ from 'lodash'; +import { TraceAnalyticsMode } from 'public/components/trace_analytics/home'; import React from 'react'; -const getFields = (page: 'dashboard' | 'traces' | 'services' | 'app') => - ({ +const getFields = (mode: TraceAnalyticsMode, page: 'dashboard' | 'traces' | 'services' | 'app') => + (mode === 'data_prepper' ? { dashboard: ['traceGroup', 'serviceName', 'error', 'status.message', 'latency'], traces: ['traceId', 'traceGroup', 'serviceName', 'error', 'status.message', 'latency'], services: ['traceGroup', 'serviceName', 'error', 'status.message', 'latency'], app: ['traceId', 'traceGroup', 'serviceName'], + }[page] : { + dashboard: ['process.serviceName', 'error', 'latency'], + traces: ['traceID', 'process.serviceName', 'error', 'latency'], + services: ['process.serviceName', 'error', 'latency'], + app: ['traceID', 'process.serviceName'], }[page]); // filters will take effect and can be manually added -export const getFilterFields = (page: 'dashboard' | 'traces' | 'services' | 'app') => getFields(page); +export const getFilterFields = (mode: TraceAnalyticsMode, page: 'dashboard' | 'traces' | 'services' | 'app') => getFields(mode, page); // filters will take effect -export const getValidFilterFields = (page: 'dashboard' | 'traces' | 'services' | 'app') => { - const fields = getFields(page); +export const getValidFilterFields = (mode: TraceAnalyticsMode, page: 'dashboard' | 'traces' | 'services' | 'app') => { + const fields = getFields(mode, page); if (page !== 'services') return [...fields, 'Latency percentile within trace group']; return fields; }; diff --git a/public/components/trace_analytics/components/common/filters/filters.tsx b/public/components/trace_analytics/components/common/filters/filters.tsx index d5a296b151..ea06985eba 100644 --- a/public/components/trace_analytics/components/common/filters/filters.tsx +++ b/public/components/trace_analytics/components/common/filters/filters.tsx @@ -16,6 +16,7 @@ import { EuiPopoverTitle, EuiTextColor, } from '@elastic/eui'; +import { TraceAnalyticsMode } from 'public/components/trace_analytics/home'; import React, { useMemo, useState } from 'react'; import { FilterEditPopover } from './filter_edit_popover'; import { getFilterFields, getValidFilterFields } from './filter_helpers'; @@ -34,6 +35,7 @@ export interface FiltersProps { filters: FilterType[]; appConfigs?: FilterType[]; setFilters: (filters: FilterType[]) => void; + mode: TraceAnalyticsMode; } interface FiltersOwnProps extends FiltersProps { @@ -50,9 +52,9 @@ export function Filters(props: FiltersOwnProps) { props.setFilters(newFilters); }; - const validFilterFields = useMemo(() => getValidFilterFields(props.page), [props.page]); + const validFilterFields = useMemo(() => getValidFilterFields(props.mode, props.page), [props.page]); const filterFieldOptions = useMemo( - () => getFilterFields(props.page).map((field) => ({ label: field })), + () => getFilterFields(props.mode, props.page).map((field) => ({ label: field })), [props.page] ); diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index 37b1bd2b26..7ceda68432 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -105,6 +105,11 @@ export function microToMilliSec(nano: number) { return nano / 1000; } +export function milliToMicroSec(ms: number) { + if (typeof ms !== 'number') return 0; + return ms * 1000; +} + export function milliToNanoSec(ms: number) { if (typeof ms !== 'number') return 0; return ms * 1000000; @@ -310,6 +315,7 @@ export const getPercentileFilter = ( }; export const filtersToDsl = ( + mode: TraceAnalyticsMode, filters: FilterType[], query: string, startTime: any, @@ -374,8 +380,19 @@ export const filtersToDsl = ( let filterQuery = {}; let field = filter.field; - if (field === 'latency') field = 'traceGroupFields.durationInNanos'; - else if (field === 'error') field = 'traceGroupFields.statusCode'; + if (field === 'latency'){ + if (mode === 'data_prepper') { + field = 'traceGroupFields.durationInNanos'; + } else if (mode === 'jaeger') { + field = 'duration'; + } + } else if (field === 'error') { + if (mode === 'data_prepper') { + field = 'traceGroupFields.statusCode'; + } else if (mode === 'jaeger') { + field = 'tag.error' + } + } let value; switch (filter.operator) { @@ -396,6 +413,10 @@ export const filtersToDsl = ( value = milliToNanoSec(value); } else if (field === 'traceGroupFields.statusCode') { value = value[0].label === 'true' ? '2' : '0'; + } else if (field === 'duration') { + value = milliToMicroSec(parseFloat(value)); + } else if (field === 'tag.error') { + value = value[0].label === 'true' ? true : false; } filterQuery = { @@ -414,6 +435,10 @@ export const filtersToDsl = ( if (range.lte) range.lte = milliToNanoSec(parseInt(range.lte || '')).toString(); if (range.gte) range.gte = milliToNanoSec(parseInt(range.gte || '')).toString(); } + if (field === 'duration') { + if (range.lte) range.lte = milliToMicroSec(parseInt(range.lte || '')).toString(); + if (range.gte) range.gte = milliToMicroSec(parseInt(range.gte || '')).toString(); + } filterQuery = { range: { [field]: range, diff --git a/public/components/trace_analytics/components/common/search_bar.tsx b/public/components/trace_analytics/components/common/search_bar.tsx index 0b0721981f..fa1bbc563a 100644 --- a/public/components/trace_analytics/components/common/search_bar.tsx +++ b/public/components/trace_analytics/components/common/search_bar.tsx @@ -98,6 +98,7 @@ export function SearchBar(props: SearchBarOwnProps) { filters={props.filters} setFilters={props.setFilters} appConfigs={props.appConfigs} + mode={props.mode} /> )} diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 94fa17b044..eca900f469 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -69,7 +69,7 @@ export function DashboardContent(props: DashboardProps) { useEffect(() => { chrome.setBreadcrumbs([...parentBreadcrumbs, ...childBreadcrumbs]); - const validFilters = getValidFilterFields(page); + const validFilters = getValidFilterFields(mode, page); setFilters([ ...filters.map((filter) => ({ ...filter, @@ -93,10 +93,11 @@ export function DashboardContent(props: DashboardProps) { const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); - const timeFilterDSL = filtersToDsl([], '',processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); + const DSL = filtersToDsl(mode, filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); + const timeFilterDSL = filtersToDsl(mode, [], '',processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); const latencyTrendStartTime = dateMath.parse(endTime, { roundUp: true })?.subtract(24, 'hours').toISOString()!; const latencyTrendDSL = filtersToDsl( + mode, filters, query, processTimeStamp(latencyTrendStartTime, mode), @@ -105,24 +106,24 @@ export function DashboardContent(props: DashboardProps) { appConfigs ); const fixedInterval = minFixedInterval(startTime, endTime); - // handleDashboardRequest( - // http, - // DSL, - // timeFilterDSL, - // latencyTrendDSL, - // tableItems, - // setTableItems, - // mode, - // setPercentileMap, - // ).then(() => setLoading(false)); - // handleDashboardThroughputPltRequest( - // http, - // DSL, - // fixedInterval, - // throughputPltItems, - // setThroughputPltItems, - // mode - // ); + handleDashboardRequest( + http, + DSL, + timeFilterDSL, + latencyTrendDSL, + tableItems, + setTableItems, + mode, + setPercentileMap, + ).then(() => setLoading(false)); + handleDashboardThroughputPltRequest( + http, + DSL, + fixedInterval, + throughputPltItems, + setThroughputPltItems, + mode + ); handleTopErrorRatePltRequest( http, @@ -132,20 +133,20 @@ export function DashboardContent(props: DashboardProps) { setJaegerErrorRatePltItems, mode ); - // handleDashboardErrorRatePltRequest( - // http, - // DSL, - // fixedInterval, - // errorRatePltItems, - // setErrorRatePltItems, - // mode - // ); - // // service map should not be filtered by service name (https://github.com/opensearch-project/observability/issues/442) - // const serviceMapDSL = _.cloneDeep(DSL); - // serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( - // (must: any) => must?.term?.serviceName == null - // ); - // handleServiceMapRequest(http, serviceMapDSL, mode, setServiceMap, currService || filteredService); + handleDashboardErrorRatePltRequest( + http, + DSL, + fixedInterval, + errorRatePltItems, + setErrorRatePltItems, + mode + ); + // service map should not be filtered by service name (https://github.com/opensearch-project/observability/issues/442) + const serviceMapDSL = _.cloneDeep(DSL); + serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( + (must: any) => must?.term?.serviceName == null + ); + handleServiceMapRequest(http, serviceMapDSL, mode, setServiceMap, currService || filteredService); }; const addFilter = (filter: FilterType) => { @@ -220,6 +221,7 @@ export function DashboardContent(props: DashboardProps) { setEndTime={setEndTime} refresh={refresh} page={page} + mode={mode} /> {mode !== 'none' ? ( diff --git a/public/components/trace_analytics/components/services/service_view.tsx b/public/components/trace_analytics/components/services/service_view.tsx index 1e8b693db0..a1ce847cb2 100644 --- a/public/components/trace_analytics/components/services/service_view.tsx +++ b/public/components/trace_analytics/components/services/service_view.tsx @@ -47,7 +47,7 @@ export function ServiceView(props: ServiceViewProps) { const [redirect, setRedirect] = useState(false); const refresh = () => { - const DSL = filtersToDsl(props.filters, props.query, processTimeStamp(props.startTime, mode), processTimeStamp(props.endTime, mode)); + const DSL = filtersToDsl(mode, props.filters, props.query, processTimeStamp(props.startTime, mode), processTimeStamp(props.endTime, mode)); handleServiceViewRequest(props.serviceName, props.http, DSL, setFields, mode); handleServiceMapRequest(props.http, DSL, mode, setServiceMap, props.serviceName); }; @@ -232,7 +232,7 @@ export function ServiceView(props: ServiceViewProps) { }; useEffect(() => { - const spanDSL = filtersToDsl(props.filters, props.query, processTimeStamp(props.startTime, mode), processTimeStamp(props.endTime, mode)); + const spanDSL = filtersToDsl(mode, props.filters, props.query, processTimeStamp(props.startTime, mode), processTimeStamp(props.endTime, mode)); spanDSL.query.bool.must.push({ term: { "process.serviceName": props.serviceName, diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index 953ce30f39..b3ea96d8e6 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -50,7 +50,7 @@ export function ServicesContent(props: ServicesProps) { useEffect(() => { chrome.setBreadcrumbs([...parentBreadcrumbs, ...childBreadcrumbs]); - const validFilters = getValidFilterFields('services'); + const validFilters = getValidFilterFields(mode, 'services'); setFilters([ ...filters.map((filter) => ({ ...filter, @@ -74,7 +74,7 @@ export function ServicesContent(props: ServicesProps) { const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(filters, query,processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); + const DSL = filtersToDsl(mode, filters, query,processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); // service map should not be filtered by service name const serviceMapDSL = _.cloneDeep(DSL); serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( @@ -116,6 +116,7 @@ export function ServicesContent(props: ServicesProps) { setEndTime={setEndTime} refresh={refresh} page={page} + mode={mode} /> { setRedirect(true); addFilter({ - field: 'process.serviceName', + field: mode === 'jaeger' ? 'process.serviceName': 'serviceName', operator: 'is', value: row.name, inverted: false, diff --git a/public/components/trace_analytics/components/traces/trace_view.tsx b/public/components/trace_analytics/components/traces/trace_view.tsx index f4e38cec61..fe0877e0d7 100644 --- a/public/components/trace_analytics/components/traces/trace_view.tsx +++ b/public/components/trace_analytics/components/traces/trace_view.tsx @@ -150,7 +150,7 @@ export function TraceView(props: TraceViewProps) { >('latency'); const refresh = async () => { - const DSL = filtersToDsl([], '', processTimeStamp('now', mode), processTimeStamp('now', mode), page); + const DSL = filtersToDsl(mode, [], '', processTimeStamp('now', mode), processTimeStamp('now', mode), page); handleTraceViewRequest(props.traceId, props.http, fields, setFields, mode); handlePayloadRequest(props.traceId, props.http, payloadData, setPayloadData, mode); handleServicesPieChartRequest(props.traceId, props.http, setServiceBreakdownData, setColorMap, mode); diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index fe2df4eca5..afa4891e9e 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -38,7 +38,7 @@ export function TracesContent(props: TracesProps) { useEffect(() => { chrome.setBreadcrumbs([...parentBreadcrumbs, ...childBreadcrumbs]); - const validFilters = getValidFilterFields('traces'); + const validFilters = getValidFilterFields(mode, 'traces'); setFilters([ ...filters.map((filter) => ({ ...filter, @@ -54,8 +54,8 @@ export function TracesContent(props: TracesProps) { const refresh = async (sort?: PropertySort) => { setLoading(true); - const DSL = filtersToDsl(filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); - const timeFilterDSL = filtersToDsl([], '', processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page); + const DSL = filtersToDsl(mode, filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); + const timeFilterDSL = filtersToDsl(mode, [], '', processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page); await handleTracesRequest(http, DSL, timeFilterDSL, tableItems, setTableItems, mode, sort); setLoading(false); }; @@ -74,6 +74,7 @@ export function TracesContent(props: TracesProps) { setEndTime={setEndTime} refresh={refresh} page={page} + mode={mode} /> { let minutesInDateRange: number; const startTime = DSL.custom?.timeFilter?.[0]?.range?.startTime; - if (startTime) { + if (startTime && mode !== 'jaeger') { const gte = dateMath.parse(startTime.gte)!; const lte = dateMath.parse(startTime.lte, { roundUp: true })!; minutesInDateRange = lte.diff(gte, 'minutes', true); From 8aa676b7985b3c84ea96cc91979a7857b2138e9a Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Wed, 28 Dec 2022 09:08:50 -0500 Subject: [PATCH 43/67] add code to get to demo point Signed-off-by: Derek Ho --- .../common/filters/filter_helpers.tsx | 2 +- .../dashboard/dashboard_content.tsx | 70 +- .../requests/dashboard_request_handler.ts | 237 +++++- .../requests/queries/dashboard_queries.ts | 674 +++++++++++++++++- 4 files changed, 890 insertions(+), 93 deletions(-) diff --git a/public/components/trace_analytics/components/common/filters/filter_helpers.tsx b/public/components/trace_analytics/components/common/filters/filter_helpers.tsx index b70341198c..d2e52fee10 100644 --- a/public/components/trace_analytics/components/common/filters/filter_helpers.tsx +++ b/public/components/trace_analytics/components/common/filters/filter_helpers.tsx @@ -22,7 +22,7 @@ const getFields = (mode: TraceAnalyticsMode, page: 'dashboard' | 'traces' | 'ser app: ['traceId', 'traceGroup', 'serviceName'], }[page] : { dashboard: ['process.serviceName', 'error', 'latency'], - traces: ['traceID', 'process.serviceName', 'error', 'latency'], + traces: ['traceID', 'operationName', 'process.serviceName', 'error', 'latency'], services: ['process.serviceName', 'error', 'latency'], app: ['traceID', 'process.serviceName'], }[page]); diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index eca900f469..51da0d73fe 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -12,8 +12,8 @@ import { handleDashboardErrorRatePltRequest, handleDashboardRequest, handleDashboardThroughputPltRequest, - handleTopErrorRatePltRequest, - handleTopThroughputPltRequest, + handleJaegerDashboardRequest, + handleJaegerErrorDashboardRequest, } from '../../requests/dashboard_request_handler'; import { handleServiceMapRequest } from '../../requests/services_request_handler'; import { FilterType } from '../common/filters/filters'; @@ -55,8 +55,9 @@ export function DashboardContent(props: DashboardProps) { setMode } = props; const [tableItems, setTableItems] = useState([]); + const [jaegerTableItems, setJaegerTableItems] = useState([]); + const [jaegerErrorTableItems, setJaegerErrorTableItems] = useState([]); const [throughputPltItems, setThroughputPltItems] = useState({ items: [], fixedInterval: '1h' }); - const [jaegerErrorRatePltItems, setJaegerErrorRatePltItems] = useState({ items: [], fixedInterval: '1h' }); const [errorRatePltItems, setErrorRatePltItems] = useState({ items: [], fixedInterval: '1h' }); const [serviceMap, setServiceMap] = useState({}); const [serviceMapIdSelected, setServiceMapIdSelected] = useState< @@ -106,16 +107,41 @@ export function DashboardContent(props: DashboardProps) { appConfigs ); const fixedInterval = minFixedInterval(startTime, endTime); - handleDashboardRequest( - http, - DSL, - timeFilterDSL, - latencyTrendDSL, - tableItems, - setTableItems, - mode, - setPercentileMap, - ).then(() => setLoading(false)); + if (mode === 'jaeger') { + handleJaegerDashboardRequest( + http, + DSL, + timeFilterDSL, + latencyTrendDSL, + tableItems, + setJaegerTableItems, + mode, + setPercentileMap, + ).then(() => setLoading(false)); + handleJaegerErrorDashboardRequest( + http, + DSL, + timeFilterDSL, + latencyTrendDSL, + tableItems, + setJaegerErrorTableItems, + mode, + setPercentileMap, + ).then(() => setLoading(false)); + } else if (mode === 'data_prepper') { + handleDashboardRequest( + http, + DSL, + timeFilterDSL, + latencyTrendDSL, + tableItems, + setTableItems, + mode, + setPercentileMap, + ).then(() => setLoading(false)); + } + + handleDashboardThroughputPltRequest( http, DSL, @@ -125,14 +151,6 @@ export function DashboardContent(props: DashboardProps) { mode ); - handleTopErrorRatePltRequest( - http, - DSL, - fixedInterval, - jaegerErrorRatePltItems, - setJaegerErrorRatePltItems, - mode - ); handleDashboardErrorRatePltRequest( http, DSL, @@ -164,6 +182,11 @@ export function DashboardContent(props: DashboardProps) { setFilters(newFilters); }; + const addFilters = (filterArr: FilterType[]) => { + const newFilters = [...filters, ...filterArr]; + setFilters(newFilters); + }; + const addPercentileFilter = (condition = 'gte', additionalFilters = [] as FilterType[]) => { if (tableItems.length === 0 || Object.keys(percentileMap).length === 0) return; for (let i = 0; i < filters.length; i++) { @@ -272,12 +295,15 @@ export function DashboardContent(props: DashboardProps) { diff --git a/public/components/trace_analytics/requests/dashboard_request_handler.ts b/public/components/trace_analytics/requests/dashboard_request_handler.ts index 30296bc7f5..21c0c01049 100644 --- a/public/components/trace_analytics/requests/dashboard_request_handler.ts +++ b/public/components/trace_analytics/requests/dashboard_request_handler.ts @@ -12,8 +12,11 @@ import { getDashboardThroughputPltQuery, getDashboardTraceGroupPercentiles, getErrorRatePltQuery, + getJaegerDashboardQuery, + getJaegerErrorDashboardQuery, + getJaegerErrorTrendQuery, + getJaegerLatencyTrendQuery, getLatencyTrendQuery, - getTopErrorRatePltQuery, } from './queries/dashboard_queries'; import { handleDslRequest } from './request_handler'; @@ -31,7 +34,7 @@ export const handleDashboardRequest = async ( const latencyVariances = await handleDslRequest( http, timeFilterDSL, - getDashboardTraceGroupPercentiles(), + getDashboardTraceGroupPercentiles(mode), mode ) .then((response) => { @@ -123,43 +126,202 @@ export const handleDashboardRequest = async ( .catch((error) => console.error(error)); }; -export const handleDashboardThroughputPltRequest = (http, DSL, fixedInterval, items, setItems, mode) => { - return handleDslRequest(http, DSL, getDashboardThroughputPltQuery(mode, fixedInterval), mode) +export const handleJaegerDashboardRequest = async ( + http, + DSL, + timeFilterDSL, + latencyTrendDSL, + items, + setItems, + mode, + setPercentileMap? +) => { + // latency_variance should only be affected by timefilter + const latencyVariances = await handleDslRequest( + http, + timeFilterDSL, + getDashboardTraceGroupPercentiles(mode), + mode + ) .then((response) => { - const buckets = response.aggregations.throughput.buckets; - const texts = buckets.map( - (bucket) => - `${moment(bucket.key).format(TRACE_ANALYTICS_PLOTS_DATE_FORMAT)} - ${moment( - bucket.key + fixedIntervalToMilli(fixedInterval) - ).format(TRACE_ANALYTICS_PLOTS_DATE_FORMAT)}` - ); - const newItems = - buckets.length > 0 - ? [ - { - x: buckets.map((bucket) => bucket.key), - y: buckets.map((bucket) => bucket.trace_count.value), - marker: { - color: 'rgb(171, 211, 240)', + const map: any = {}; + response.aggregations.trace_group.buckets.forEach((traceGroup) => { + map[traceGroup.key_as_string] = Object.values( + traceGroup.latency_variance_micros.values + ).map((nano: number) => _.round(microToMilliSec(Math.max(0, nano)), 2)); + }); + return map; + }) + .catch((error) => console.error(error)); + if (setPercentileMap) setPercentileMap(latencyVariances); + + const latencyTrends = await handleDslRequest(http, latencyTrendDSL, getJaegerLatencyTrendQuery(), mode) + .then((response) => { + const map: any = {}; + response.aggregations.trace_group_name.buckets.map((bucket) => { + const latencyTrend = bucket.group_by_hour.buckets + .slice(-24) + .filter((bucket) => bucket.average_latency?.value || bucket.average_latency?.value === 0); + const values = { + x: latencyTrend.map((bucket) => bucket.key), + y: latencyTrend.map((bucket) => bucket.average_latency?.value || 0), + }; + const latencyTrendData = + values.x?.length > 0 + ? { + '24_hour_latency_trend': { + trendData: [ + { + ...values, + type: 'scatter', + mode: 'lines', + hoverinfo: 'none', + line: { + color: '#000000', + width: 1, + }, + }, + ], + popoverData: [ + { + ...values, + type: 'scatter', + mode: 'lines+markers', + hovertemplate: '%{x}
Average latency: %{y}', + hoverlabel: { + bgcolor: '#d7c2ff', + }, + marker: { + color: '#987dcb', + size: 8, + }, + line: { + color: '#987dcb', + size: 2, + }, + }, + ], }, - type: 'bar', - customdata: texts, - hoverlabel: { - align: 'left', + } + : {}; + map[bucket.key] = latencyTrendData; + }); + return map; + }) + .catch((error) => console.error(error)); + + await handleDslRequest(http, DSL, getJaegerDashboardQuery(), mode) + .then((response) => { + return Promise.all( + response.aggregations.trace_group_name.buckets.map((bucket) => { + const latencyTrend = latencyTrends?.[bucket.key] || {}; + return { + dashboard_trace_group_name: bucket.key, + dashboard_average_latency: bucket.average_latency?.value, + dashboard_traces: bucket.trace_count.value, + dashboard_latency_variance: latencyVariances[bucket.key_as_string], + dashboard_error_rate: bucket.error_rate.value, + ...latencyTrend, + }; + }) + ); + }) + .then((newItems) => { + setItems(newItems); + }) + .catch((error) => console.error(error)); +}; + +export const handleJaegerErrorDashboardRequest = async ( + http, + DSL, + timeFilterDSL, + latencyTrendDSL, + items, + setItems, + mode, + setPercentileMap? +) => { + const errorTrends = await handleDslRequest(http, latencyTrendDSL, getJaegerErrorTrendQuery(), mode) + .then((response) => { + const map: any = {}; + response.aggregations.trace_group_name.buckets.map((bucket) => { + const errorTrend = bucket.group_by_hour.buckets + .slice(-24) + .filter((bucket) => bucket.error_rate?.value || bucket.error_rate?.value === 0); + const values = { + x: errorTrend.map((bucket) => bucket.key), + y: errorTrend.map((bucket) => bucket.error_rate?.value || 0), + }; + const errorTrendData = + values.x?.length > 0 + ? { + '24_hour_error_trend': { + trendData: [ + { + ...values, + type: 'scatter', + mode: 'lines', + hoverinfo: 'none', + line: { + color: '#000000', + width: 1, + }, + }, + ], + popoverData: [ + { + ...values, + type: 'scatter', + mode: 'lines+markers', + hovertemplate: '%{x}
Average error rate: %{y}', + hoverlabel: { + bgcolor: '#d7c2ff', + }, + marker: { + color: '#987dcb', + size: 8, + }, + line: { + color: '#987dcb', + size: 2, + }, + }, + ], }, - hovertemplate: '%{customdata}
Throughput: %{y:,}', - }, - ] - : []; - setItems({ items: newItems, fixedInterval: fixedInterval }); + } + : {}; + map[bucket.key] = errorTrendData; + }); + return map; + }) + .catch((error) => console.error(error)); + + await handleDslRequest(http, DSL, getJaegerErrorDashboardQuery(), mode) + .then((response) => { + return Promise.all( + response.aggregations.trace_group_name.buckets.map((bucket) => { + const latencyTrend = errorTrends?.[bucket.key] || {}; + return { + dashboard_trace_group_name: bucket.key, + dashboard_average_latency: bucket.average_latency?.value, + dashboard_traces: bucket.trace_count.value, + dashboard_error_rate: bucket.error_rate.value, + ...latencyTrend, + }; + }) + ); + }) + .then((newItems) => { + setItems(newItems); }) .catch((error) => console.error(error)); }; -export const handleDashboardErrorRatePltRequest = (http, DSL, fixedInterval, items, setItems, mode) => { - return handleDslRequest(http, DSL, getErrorRatePltQuery(fixedInterval), mode) +export const handleDashboardThroughputPltRequest = (http, DSL, fixedInterval, items, setItems, mode) => { + return handleDslRequest(http, DSL, getDashboardThroughputPltQuery(mode, fixedInterval), mode) .then((response) => { - const buckets = response.aggregations.error_rate.buckets; + const buckets = response.aggregations.throughput.buckets; const texts = buckets.map( (bucket) => `${moment(bucket.key).format(TRACE_ANALYTICS_PLOTS_DATE_FORMAT)} - ${moment( @@ -171,16 +333,16 @@ export const handleDashboardErrorRatePltRequest = (http, DSL, fixedInterval, ite ? [ { x: buckets.map((bucket) => bucket.key), - y: buckets.map((bucket) => _.round(bucket.error_rate?.value || 0, 2)), + y: buckets.map((bucket) => bucket.trace_count.value), marker: { - color: '#fad963', + color: 'rgb(171, 211, 240)', }, type: 'bar', customdata: texts, hoverlabel: { align: 'left', }, - hovertemplate: '%{customdata}
Error rate: %{y}', + hovertemplate: '%{customdata}
Throughput: %{y:,}', }, ] : []; @@ -189,9 +351,8 @@ export const handleDashboardErrorRatePltRequest = (http, DSL, fixedInterval, ite .catch((error) => console.error(error)); }; - -export const handleTopErrorRatePltRequest = (http, DSL, fixedInterval, items, setItems, mode) => { - return handleDslRequest(http, DSL, getTopErrorRatePltQuery(fixedInterval), mode) +export const handleDashboardErrorRatePltRequest = (http, DSL, fixedInterval, items, setItems, mode) => { + return handleDslRequest(http, DSL, getErrorRatePltQuery(mode, fixedInterval), mode) .then((response) => { const buckets = response.aggregations.error_rate.buckets; const texts = buckets.map( @@ -221,4 +382,4 @@ export const handleTopErrorRatePltRequest = (http, DSL, fixedInterval, items, se setItems({ items: newItems, fixedInterval: fixedInterval }); }) .catch((error) => console.error(error)); -}; +}; \ No newline at end of file diff --git a/public/components/trace_analytics/requests/queries/dashboard_queries.ts b/public/components/trace_analytics/requests/queries/dashboard_queries.ts index 3285a6627f..48811a2f1c 100644 --- a/public/components/trace_analytics/requests/queries/dashboard_queries.ts +++ b/public/components/trace_analytics/requests/queries/dashboard_queries.ts @@ -6,7 +6,7 @@ import { TraceAnalyticsMode } from "../../home"; export const getDashboardQuery = () => { - const query = { + return { size: 0, query: { bool: { @@ -93,11 +93,228 @@ export const getDashboardQuery = () => { }, }, }; - return query; +}; + +export const getJaegerDashboardQuery = () => { + return { + size: 0, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + trace_group_name: { + multi_terms: { + terms: [ + { + field: "process.serviceName" + }, + { + field: "operationName" + }, + ], + }, + aggs: { + average_latency: { + scripted_metric: { + init_script: 'state.traceIDToLatencyMap = [:];', + map_script: ` + if (doc.containsKey('duration') && !doc['duration'].empty) { + def traceID = doc['traceID'].value; + if (!state.traceIDToLatencyMap.containsKey(traceID)) { + state.traceIDToLatencyMap[traceID] = doc['duration'].value; + } + } + `, + combine_script: 'return state.traceIDToLatencyMap', + reduce_script: ` + def seenTraceIdsMap = [:]; + def totalLatency = 0.0; + def traceCount = 0.0; + + for (s in states) { + if (s == null) { + continue; + } + + for (entry in s.entrySet()) { + def traceID = entry.getKey(); + def traceLatency = entry.getValue(); + if (!seenTraceIdsMap.containsKey(traceID)) { + seenTraceIdsMap[traceID] = true; + totalLatency += traceLatency; + traceCount++; + } + } + } + + def average_latency_nanos = totalLatency / traceCount; + return Math.round(average_latency_nanos / 10) / 100.0; + `, + }, + }, + + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + error_count: { + filter: { + term: { + 'tag.error': true, + }, + }, + aggs: { + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + }, + }, + error_rate: { + bucket_script: { + buckets_path: { + total: 'trace_count.value', + errors: 'error_count>trace_count.value', + }, + script: 'params.errors / params.total * 100', + }, + }, + sort_by_latency: { + bucket_sort: { + sort: [ + { + "average_latency.value": { + "order": "desc" + } + } + ], + size: 5 + } + }, + }, + }, + }, +} +}; + +export const getJaegerErrorDashboardQuery = () => { + return { + size: 0, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + trace_group_name: { + multi_terms: { + terms: [ + { + field: "process.serviceName" + }, + { + field: "operationName" + }, + ], + }, + aggs: { + average_latency: { + scripted_metric: { + init_script: 'state.traceIDToLatencyMap = [:];', + map_script: ` + if (doc.containsKey('duration') && !doc['duration'].empty) { + def traceID = doc['traceID'].value; + if (!state.traceIDToLatencyMap.containsKey(traceID)) { + state.traceIDToLatencyMap[traceID] = doc['duration'].value; + } + } + `, + combine_script: 'return state.traceIDToLatencyMap', + reduce_script: ` + def seenTraceIdsMap = [:]; + def totalLatency = 0.0; + def traceCount = 0.0; + + for (s in states) { + if (s == null) { + continue; + } + + for (entry in s.entrySet()) { + def traceID = entry.getKey(); + def traceLatency = entry.getValue(); + if (!seenTraceIdsMap.containsKey(traceID)) { + seenTraceIdsMap[traceID] = true; + totalLatency += traceLatency; + traceCount++; + } + } + } + + def average_latency_nanos = totalLatency / traceCount; + return Math.round(average_latency_nanos / 10) / 100.0; + `, + }, + }, + + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + error_count: { + filter: { + term: { + 'tag.error': true, + }, + }, + aggs: { + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + }, + }, + error_rate: { + bucket_script: { + buckets_path: { + total: 'trace_count.value', + errors: 'error_count>trace_count.value', + }, + script: 'params.errors / params.total * 100', + }, + }, + sort_by_latency: { + bucket_sort: { + sort: [ + { + "error_rate.value": { + "order": "desc" + } + } + ], + size: 5 + } + }, + }, + }, + }, +} }; export const getLatencyTrendQuery = () => { - const query = { + return { size: 0, query: { bool: { @@ -164,39 +381,144 @@ export const getLatencyTrendQuery = () => { }, }, }; - return query; }; -export const getDashboardTraceGroupPercentiles = () => { +export const getJaegerLatencyTrendQuery = () => { return { size: 0, query: { bool: { - must: [ - { - term: { - parentSpanId: { - value: '', + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + trace_group_name: { + multi_terms: { + terms: [ + { + field: "process.serviceName" + }, + { + field: "operationName" + }, + ], + }, + aggs: { + group_by_hour: { + date_histogram: { + field: 'endTime', + calendar_interval: 'hour', + }, + aggs: { + average_latency: { + scripted_metric: { + init_script: 'state.traceIdToLatencyMap = [:];', + map_script: ` + if (doc.containsKey('traceGroupFields.durationInNanos') && !doc['traceGroupFields.durationInNanos'].empty) { + def traceId = doc['traceId'].value; + if (!state.traceIdToLatencyMap.containsKey(traceId)) { + state.traceIdToLatencyMap[traceId] = doc['traceGroupFields.durationInNanos'].value; + } + } + `, + combine_script: 'return state.traceIdToLatencyMap', + reduce_script: ` + def seenTraceIdsMap = [:]; + def totalLatency = 0.0; + def traceCount = 0.0; + + for (s in states) { + if (s == null) { + continue; + } + + for (entry in s.entrySet()) { + def traceId = entry.getKey(); + def traceLatency = entry.getValue(); + if (!seenTraceIdsMap.containsKey(traceId)) { + seenTraceIdsMap[traceId] = true; + totalLatency += traceLatency; + traceCount++; + } + } + } + + def average_latency_nanos = totalLatency / traceCount; + return Math.round(average_latency_nanos / 10000) / 100.0; + `, + }, }, }, }, - ], + }, + }, + }, + }; +}; + +export const getJaegerErrorTrendQuery = () => { + return { + size: 0, + query: { + bool: { + must: [], filter: [], should: [], must_not: [], }, }, aggs: { - trace_group: { - terms: { - field: 'traceGroup', + trace_group_name: { + multi_terms: { + terms: [ + { + field: "process.serviceName" + }, + { + field: "operationName" + }, + ], }, aggs: { - latency_variance_nanos: { - percentiles: { - field: 'traceGroupFields.durationInNanos', - percents: [0, 95, 100], + group_by_hour: { + date_histogram: { + field: 'endTime', + calendar_interval: 'hour', }, + aggs: { + error_count: { + filter: { + term: { + 'tag.error': true, + }, + }, + aggs: { + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + }, + }, + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + error_rate: { + bucket_script: { + buckets_path: { + total: 'trace_count.value', + errors: 'error_count>trace_count.value', + }, + script: 'params.errors / params.total * 100', + }, + }, + }, + }, }, }, @@ -204,7 +526,193 @@ export const getDashboardTraceGroupPercentiles = () => { }; }; -export const getErrorRatePltQuery = (fixedInterval) => { + +export const getDashboardTraceGroupPercentiles = (mode: TraceAnalyticsMode) => { + if (mode === 'data_prepper') { + return { + size: 0, + query: { + bool: { + must: [ + { + term: { + parentSpanId: { + value: '', + }, + }, + }, + ], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + trace_group: { + terms: { + field: 'traceGroup', + }, + aggs: { + latency_variance_nanos: { + percentiles: { + field: 'traceGroupFields.durationInNanos', + percents: [0, 95, 100], + }, + }, + }, + }, + }, + }; + } else if (mode === 'jaeger') { + return { + size: 0, + query: { + bool: { + must: [], + filter: [{ + bool: { + must_not: { + exists: { + field: "references" + } + }, + }, + }], + should: [], + must_not: [], + }, + }, + aggs: { + trace_group: { + multi_terms: { + terms: [ + { + field: "process.serviceName" + }, + { + field: "operationName" + }, + ], + }, + aggs: { + latency_variance_micros: { + percentiles: { + field: 'duration', + percents: [0, 95, 100], + }, + }, + }, + } + }, + } +}; +}; + +export const getErrorRatePltQuery = (mode: TraceAnalyticsMode, fixedInterval) => { + if (mode === 'data_prepper') { + return { + size: 0, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + error_rate: { + date_histogram: { + field: 'startTime', + fixed_interval: fixedInterval, + }, + aggs: { + error_count: { + filter: { + term: { + 'traceGroupFields.statusCode': '2', + }, + }, + aggs: { + trace_count: { + cardinality: { + field: 'traceId', + }, + }, + }, + }, + trace_count: { + cardinality: { + field: 'traceId', + }, + }, + error_rate: { + bucket_script: { + buckets_path: { + total: 'trace_count.value', + errors: 'error_count>trace_count.value', + }, + script: 'params.errors / params.total * 100', + }, + }, + }, + }, + }, + }; + } else if (mode === 'jaeger') { + return { + size: 0, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + error_rate: { + date_histogram: { + field: 'startTimeMillis', + fixed_interval: fixedInterval, + }, + aggs: { + error_count: { + filter: { + term: { + 'tag.error': true, + }, + }, + aggs: { + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + }, + }, + trace_count: { + cardinality: { + field: 'traceID', + }, + }, + error_rate: { + bucket_script: { + buckets_path: { + total: 'trace_count.value', + errors: 'error_count>trace_count.value', + }, + script: 'params.errors / params.total * 100', + }, + }, + }, + }, + }, + }; + } +}; + +export const getTopErrorRatePltQuery = (fixedInterval) => { const query: any = { size: 0, query: { @@ -218,27 +726,27 @@ export const getErrorRatePltQuery = (fixedInterval) => { aggs: { error_rate: { date_histogram: { - field: 'startTime', + field: 'startTimeMillis', fixed_interval: fixedInterval, }, aggs: { error_count: { filter: { term: { - 'traceGroupFields.statusCode': '2', + 'tag.error': true, }, }, aggs: { trace_count: { cardinality: { - field: 'traceId', + field: 'traceID', }, }, }, }, trace_count: { cardinality: { - field: 'traceId', + field: 'traceID', }, }, error_rate: { @@ -257,8 +765,8 @@ export const getErrorRatePltQuery = (fixedInterval) => { return query; }; -export const getTopErrorRatePltQuery = (fixedInterval) => { - const query: any = { +export const getDashboardThroughputPltQuery = (mode: TraceAnalyticsMode, fixedInterval) => { + return { size: 0, query: { bool: { @@ -269,11 +777,46 @@ export const getTopErrorRatePltQuery = (fixedInterval) => { }, }, aggs: { - error_rate: { + throughput: { date_histogram: { - field: 'startTimeMillis', + field: mode === 'jaeger' ? 'startTimeMillis' : 'startTime', fixed_interval: fixedInterval, }, + aggs: { + trace_count: { + cardinality: { + field: mode === 'jaeger' ? 'traceID': 'traceId', + }, + }, + }, + }, + }, + }; +}; + +export const getDashboardErrorTopGroupsQuery = (mode: TraceAnalyticsMode) => { + return { + size: 0, + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + aggs: { + error_rate: { + multi_terms: { + terms: [ + { + "field": "process.serviceName" + }, + { + "field": "operationName" + } + ], + }, aggs: { error_count: { filter: { @@ -303,14 +846,25 @@ export const getTopErrorRatePltQuery = (fixedInterval) => { script: 'params.errors / params.total * 100', }, }, + sort_by_errors: { + bucket_sort: { + sort: [ + { + "error_rate.value": { + "order": "desc" + } + } + ], + size: 5 + } + }, }, }, }, }; - return query; }; -export const getDashboardThroughputPltQuery = (mode: TraceAnalyticsMode, fixedInterval) => { +export const getDashboardThroughputTopGroupsQuery = (mode: TraceAnalyticsMode) => { return { size: 0, query: { @@ -323,9 +877,15 @@ export const getDashboardThroughputPltQuery = (mode: TraceAnalyticsMode, fixedIn }, aggs: { throughput: { - date_histogram: { - field: mode === 'jaeger' ? 'startTimeMillis' : 'startTime', - fixed_interval: fixedInterval, + multi_terms: { + terms: [ + { + "field": "process.serviceName" + }, + { + "field": "operationName" + } + ], }, aggs: { trace_count: { @@ -333,6 +893,56 @@ export const getDashboardThroughputPltQuery = (mode: TraceAnalyticsMode, fixedIn field: mode === 'jaeger' ? 'traceID': 'traceId', }, }, + average_latency: { + scripted_metric: { + init_script: 'state.traceIDToLatencyMap = [:];', + map_script: ` + if (doc.containsKey('duration') && !doc['duration'].empty) { + def traceID = doc['traceID'].value; + if (!state.traceIDToLatencyMap.containsKey(traceID)) { + state.traceIDToLatencyMap[traceID] = doc['duration'].value; + } + } + `, + combine_script: 'return state.traceIDToLatencyMap', + reduce_script: ` + def seenTraceIdsMap = [:]; + def totalLatency = 0.0; + def traceCount = 0.0; + + for (s in states) { + if (s == null) { + continue; + } + + for (entry in s.entrySet()) { + def traceID = entry.getKey(); + def traceLatency = entry.getValue(); + if (!seenTraceIdsMap.containsKey(traceID)) { + seenTraceIdsMap[traceID] = true; + totalLatency += traceLatency; + traceCount++; + } + } + } + + def average_latency_nanos = totalLatency / traceCount; + return Math.round(average_latency_nanos / 10) / 100.0; + `, + }, + }, + sort_by_latency: { + bucket_sort: { + sort: [ + { + "average_latency.value": { + "order": "desc" + } + } + ], + size: 5 + } + }, }, }, }, From 5e4fbe86bce0af7c258982209d5aa92d37e5cf58 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Wed, 28 Dec 2022 14:37:37 -0500 Subject: [PATCH 44/67] implement toggle on dashboard Signed-off-by: Derek Ho --- package-lock.json | 4752 +++++++++++++++++ .../components/dashboard/mode_picker.tsx | 97 + .../dashboard/top_error_rates_table.tsx | 325 ++ .../components/dashboard/top_groups_page.tsx | 68 + .../dashboard/top_latency_table.tsx | 438 ++ 5 files changed, 5680 insertions(+) create mode 100644 package-lock.json create mode 100644 public/components/trace_analytics/components/dashboard/mode_picker.tsx create mode 100644 public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx create mode 100644 public/components/trace_analytics/components/dashboard/top_groups_page.tsx create mode 100644 public/components/trace_analytics/components/dashboard/top_latency_table.tsx diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..6fbe6573b1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4752 @@ +{ + "name": "observability-dashboards", + "version": "2.4.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.4.1.tgz", + "integrity": "sha512-LPX4nFA5HzS07UfEAzdXHi6vSUfwqJe8mikcg81ZnMTv+khRAMh3VxHAMUISAnHqI5NzEImbyPdSDpjgh9IPGQ==", + "requires": { + "@algolia/autocomplete-shared": "1.4.1" + }, + "dependencies": { + "@algolia/autocomplete-shared": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.4.1.tgz", + "integrity": "sha512-MGLj6on/809+xQi5dfOPv4EB6KruTfbkg1rZWQzDX5KrJuiu6CPHp/kk2JNyrEr2luiT0v7rxXWOz9XfxVReiQ==" + } + } + }, + "@algolia/autocomplete-theme-classic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.3.0.tgz", + "integrity": "sha512-npQlljLXAAdXL9chj98xvhNOIgInaX27SUfBfFeCds3YtnwI+ZOATiYUOl7/WkyzxXvwEMUIO1sUenlZuH8o0A==" + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + }, + "@babel/plugin-syntax-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", + "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz", + "integrity": "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-flow": "^7.18.6" + } + }, + "@babel/preset-flow": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", + "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-flow-strip-types": "^7.18.6" + } + }, + "@cypress/skip-test": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@cypress/skip-test/-/skip-test-2.6.1.tgz", + "integrity": "sha512-X+ibefBiuOmC5gKG91wRIT0/OqXeETYvu7zXktjZ3yLeO186Y8ia0K7/gQUpAwuUi28DuqMd1+7tBQVtPkzbPA==", + "dev": true + }, + "@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + }, + "@nteract/outputs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@nteract/outputs/-/outputs-3.0.11.tgz", + "integrity": "sha512-LeT9ViBf+fTPSubZ9dMe7128kg0rl1jIG54V0n2GiU5RuYnUz21FU0IOaLMPUfFMO1VyVEOW5jDc3PAQx5/Kwg==", + "requires": { + "@nteract/markdown": "^4.5.2", + "@nteract/mathjax": "^4.0.11", + "ansi-to-react": "^6.0.5", + "react-json-tree": "^0.12.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@blueprintjs/colors": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@blueprintjs/colors/-/colors-4.1.10.tgz", + "integrity": "sha512-p1rgfijpZi+r2xskyRi3uF8DRq08rb26u9Gymi0p4ZNZq/iLJQ1Fj1jfT8yh2yc6eCfs8GlH6iDNdU387wEK3w==" + }, + "@blueprintjs/core": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@blueprintjs/core/-/core-3.54.0.tgz", + "integrity": "sha512-u2c1s6MNn0ocxhnC6CuiG5g3KV6b4cKUvSobznepA9SC3/AL1s3XOvT7DLWoHRv2B/vBOHFYEDzLw2/vlcGGZg==", + "requires": { + "@blueprintjs/colors": "^4.0.0-alpha.3", + "@blueprintjs/icons": "^3.33.0", + "@juggle/resize-observer": "^3.3.1", + "@types/dom4": "^2.0.1", + "classnames": "^2.2", + "dom4": "^2.1.5", + "normalize.css": "^8.0.1", + "popper.js": "^1.16.1", + "react-lifecycles-compat": "^3.0.4", + "react-popper": "^1.3.7", + "react-transition-group": "^2.9.0", + "tslib": "~2.3.1" + } + }, + "@blueprintjs/icons": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.33.0.tgz", + "integrity": "sha512-Q6qoSDIm0kRYQZISm59UUcDCpV3oeHulkLuh3bSlw0HhcSjvEQh2PSYbtaifM60Q4aK4PCd6bwJHg7lvF1x5fQ==", + "requires": { + "classnames": "^2.2", + "tslib": "~2.3.1" + } + }, + "@blueprintjs/select": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/@blueprintjs/select/-/select-3.19.1.tgz", + "integrity": "sha512-8UJIZMaWXRMQHr14wbmzJc/CklcSKxOU5JUux0xXKQz/hDW/g1a650tlwJmnxufvRdShbGinlVfHupCs0EL6sw==", + "requires": { + "@blueprintjs/core": "^3.54.0", + "classnames": "^2.2", + "tslib": "~2.3.1" + } + }, + "@hypnosphi/create-react-context": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", + "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, + "@nteract/markdown": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@nteract/markdown/-/markdown-4.6.2.tgz", + "integrity": "sha512-WI+VvaiL9ihIkmPHCYSwziuMJcSUTKBi+hrf5V74jYYq1b5LWJyDa9O5B137KVEdgYwr0w4JiZHFm7wvEWXlZw==", + "requires": { + "@nteract/mathjax": "^4.0.11", + "@nteract/presentational-components": "^3.3.11", + "react-markdown": "^4.0.0" + } + }, + "@nteract/mathjax": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@nteract/mathjax/-/mathjax-4.0.16.tgz", + "integrity": "sha512-eth384tJmOF2oNnHc3iqNwqZdFdNPZmnboY66aE7QRJvxZsYSUj0oHvERn3nXxFuVjv866xWGRc5zU+T4tPIDQ==", + "requires": { + "load-script": "^1.0.0" + } + }, + "@nteract/presentational-components": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/@nteract/presentational-components/-/presentational-components-3.4.12.tgz", + "integrity": "sha512-gIZlHj2ZJ3glmRslyJh2HWmJftgk18w1CyOJVrxh9ovyso0Nw6CwPNEEKVdjouJvU4OCB7dpINIBLy/w4SxtRA==", + "requires": { + "@blueprintjs/core": "^3.7.0", + "@blueprintjs/select": "^3.2.0", + "classnames": "^2.2.6", + "re-resizable": "^6.5.0", + "react-syntax-highlighter": "^13.0.0", + "react-toggle": "^4.1.1" + } + }, + "@types/dom4": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/dom4/-/dom4-2.0.2.tgz", + "integrity": "sha512-Rt4IC1T7xkCWa0OG1oSsPa0iqnxlDeQqKXZAHrQGLb7wFGncWm85MaxKUjAGejOrUynOgWlFi4c6S6IyJwoK4g==" + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" + }, + "ansi-to-react": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-6.1.6.tgz", + "integrity": "sha512-+HWn72GKydtupxX9TORBedqOMsJRiKTqaLUKW8txSBZw9iBpzPKLI8KOu4WzwD4R7hSv1zEspobY6LwlWvwZ6Q==", + "requires": { + "anser": "^1.4.1", + "escape-carriage": "^1.3.0" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "dom4": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/dom4/-/dom4-2.1.6.tgz", + "integrity": "sha512-JkCVGnN4ofKGbjf5Uvc8mmxaATIErKQKSgACdBXpsQ3fY6DlIpAyWfiBSrGkttATssbDCp3psiAKWXk5gmjycA==" + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + }, + "escape-carriage": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.0.tgz", + "integrity": "sha512-ATWi5MD8QlAGQOeMgI8zTp671BG8aKvAC0M7yenlxU4CRLGO/sKthxVUyjiOFKjHdIo+6dZZUNFgHFeVEaKfGQ==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "requires": { + "format": "^0.2.0" + } + }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + }, + "html-to-react": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.5.0.tgz", + "integrity": "sha512-tjihXBgaJZRRYzmkrJZ/Qf9jFayilFYcb+sJxXXE2BVLk2XsNrGeuNCVvhXmvREULZb9dz6NFTBC96DTR/lQCQ==", + "requires": { + "domhandler": "^5.0", + "htmlparser2": "^8.0", + "lodash.camelcase": "^4.3.0" + } + }, + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "requires": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + }, + "mdast-add-list-metadata": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz", + "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==", + "requires": { + "unist-util-visit-parents": "1.1.2" + } + }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "re-resizable": { + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.9.tgz", + "integrity": "sha512-l+MBlKZffv/SicxDySKEEh42hR6m5bAHfNu3Tvxks2c4Ah+ldnWjfnVRwxo/nxF27SsUsxDS0raAzFuJNKABXA==" + }, + "react-base16-styling": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.7.0.tgz", + "integrity": "sha512-lTa/VSFdU6BOAj+FryOe7OTZ0OBP8GXPOnCS0QnZi7G3zhssWgIgwl0eUL77onXx/WqKPFndB3ZeC77QC/l4Dw==", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.1.1", + "lodash.flow": "^3.5.0", + "pure-color": "^1.3.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-json-tree": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.12.1.tgz", + "integrity": "sha512-j6fkRY7ha9XMv1HPVakRCsvyFwHGR5AZuwO8naBBeZXnZbbLor5tpcUxS/8XD01+D1v7ZN5p+7LU+9V1uyASiQ==", + "requires": { + "prop-types": "^15.7.2", + "react-base16-styling": "^0.7.0" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-markdown": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-4.3.1.tgz", + "integrity": "sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw==", + "requires": { + "html-to-react": "^1.3.4", + "mdast-add-list-metadata": "1.0.1", + "prop-types": "^15.7.2", + "react-is": "^16.8.6", + "remark-parse": "^5.0.0", + "unified": "^6.1.5", + "unist-util-visit": "^1.3.0", + "xtend": "^4.0.1" + } + }, + "react-popper": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", + "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", + "requires": { + "@babel/runtime": "^7.1.2", + "@hypnosphi/create-react-context": "^0.3.1", + "deep-equal": "^1.1.1", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + } + }, + "react-syntax-highlighter": { + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz", + "integrity": "sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==", + "requires": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.1.1", + "lowlight": "^1.14.0", + "prismjs": "^1.21.0", + "refractor": "^3.1.0" + } + }, + "react-toggle": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/react-toggle/-/react-toggle-4.1.3.tgz", + "integrity": "sha512-WoPrvbwfQSvoagbrDnXPrlsxwzuhQIrs+V0I162j/s+4XPgY/YDAUmHSeWiroznfI73wj+MBydvW95zX8ABbSg==", + "requires": { + "classnames": "^2.2.5" + } + }, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + }, + "refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "requires": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "dependencies": { + "prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" + } + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "remark-parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", + "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + } + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==" + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unified": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^2.0.0", + "x-is-string": "^0.1.0" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + }, + "dependencies": { + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } + } + } + }, + "unist-util-visit-parents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz", + "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==" + }, + "vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "requires": { + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + } + }, + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "requires": { + "unist-util-stringify-position": "^1.1.1" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } + }, + "@reduxjs/toolkit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.6.1.tgz", + "integrity": "sha512-pa3nqclCJaZPAyBhruQtiRwtTjottRrVJqziVZcWzI73i6L3miLTtUyWfauwv08HWtiXLx1xGyGt+yLFfW/d0A==", + "requires": { + "immer": "^9.0.1", + "redux": "^4.1.0", + "redux-thunk": "^2.3.0", + "reselect": "^4.0.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "immer": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz", + "integrity": "sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ==" + }, + "redux": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", + "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-thunk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", + "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + } + } + }, + "@types/enzyme-adapter-react-16": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.6.tgz", + "integrity": "sha512-VonDkZ15jzqDWL8mPFIQnnLtjwebuL9YnDkqeCDYnB4IVgwUm0mwKkqhrxLL6mb05xm7qqa3IE95m8CZE9imCg==", + "dev": true, + "requires": { + "@types/enzyme": "*" + }, + "dependencies": { + "@types/cheerio": { + "version": "0.22.31", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.31.tgz", + "integrity": "sha512-Kt7Cdjjdi2XWSfrZ53v4Of0wG3ZcmaegFXjMmz9tfNrZSkzzo36G0AL1YqSdcIA78Etjt6E609pt5h1xnQkPUw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/enzyme": { + "version": "3.10.9", + "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.9.tgz", + "integrity": "sha512-dx5UvcWe2Vtye6S9Hw2rFB7Ul9uMXOAje2FAbXvVYieQDNle9qPAo7DfvFMSztZ9NFiD3dVZ4JsRYGTrSLynJg==", + "dev": true, + "requires": { + "@types/cheerio": "*", + "@types/react": "*" + } + }, + "@types/node": { + "version": "18.11.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", + "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "dev": true + } + } + }, + "@types/react-plotly.js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/react-plotly.js/-/react-plotly.js-2.5.0.tgz", + "integrity": "sha512-bda7N/Y65d1x0FfwhgUXAugGeG9CRIxmkW/yBL8PVFUMvZGpfEnw4bXKjDozBYlOskVfxj6UQ9IKmZI6CZ7/QQ==", + "dev": true, + "requires": { + "@types/plotly.js": "*", + "@types/react": "*" + }, + "dependencies": { + "@types/d3": { + "version": "3.5.47", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.47.tgz", + "integrity": "sha512-VkWIQoZXLFdcBGe5pdBKJmTU3fmpXvo/KV6ixvTzOMl1yJ2hbTXpfvsziag0kcaerPDwas2T0vxojwQG3YwivQ==", + "dev": true + }, + "@types/plotly.js": { + "version": "1.54.14", + "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-1.54.14.tgz", + "integrity": "sha512-vYevenBloZ3B4i831i+ccS9u782JSnkJpBG/c/qPRJNDW6s25udnrmoHkFhbBl7jkzBy8pO2lPNhpMrQJV7ETA==", + "dev": true, + "requires": { + "@types/d3": "^3" + } + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "dev": true + } + } + }, + "@types/react-test-renderer": { + "version": "16.9.5", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.5.tgz", + "integrity": "sha512-C4cN7C2uSSGOYelp2XfdtJb5TsCP+QiZ+0Bm4U3ZfUswN8oN9O/l86XO/OvBSFCmWY7w75fzsQvZ50eGkFN34A==", + "dev": true, + "requires": { + "@types/react": "^16" + }, + "dependencies": { + "@types/react": { + "version": "16.14.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.14.tgz", + "integrity": "sha512-uwIWDYW8LznHzEMJl7ag9St1RsK0gw/xaFZ5+uI1ZM1HndwUgmPH3/wQkSb87GkOVg7shUxnpNW8DcN0AzvG5Q==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + }, + "dependencies": { + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "dev": true + } + } + } + } + }, + "ag-grid-community": { + "version": "27.3.0", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-27.3.0.tgz", + "integrity": "sha512-R5oZMXEHXnOLrmhn91J8lR0bv6IAnRcU6maO+wKLMJxffRWaAYFAuw1jt7bdmcKCv8c65F6LEBx4ykSOALa9vA==" + }, + "ag-grid-react": { + "version": "27.3.0", + "resolved": "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-27.3.0.tgz", + "integrity": "sha512-2bs9YfJ/shvBZQLLjny4NFvht+ic6VtpTPO0r3bHHOhlL3Fjx2rGvS6AHSwfvu+kJacHCta30PjaEbX8T3UDyw==", + "requires": { + "prop-types": "^15.8.1" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + } + } + }, + "antlr4": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.8.0.tgz", + "integrity": "sha512-en/MxQ4OkPgGJQ3wD/muzj1uDnFSzdFIhc2+c6bHZokWkuBb6RRvFjpWhPxWLbgQvaEzldJZ0GSQpfSAaE3hqg==" + }, + "antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==" + }, + "antlr4ts-cli": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts-cli/-/antlr4ts-cli-0.5.0-alpha.4.tgz", + "integrity": "sha512-lVPVBTA2CVHRYILSKilL6Jd4hAumhSZZWA7UbQNQrmaSSj7dPmmYaN4bOmZG79cOy0lS00i4LY68JZZjZMWVrw==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "requires": { + "restore-cursor": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + } + } + }, + "cypress": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-5.6.0.tgz", + "integrity": "sha512-cs5vG3E2JLldAc16+5yQxaVRLLqMVya5RlrfPWkC72S5xrlHFdw7ovxPb61s4wYweROKTyH01WQc2PFzwwVvyQ==", + "dev": true, + "requires": { + "@cypress/listr-verbose-renderer": "^0.4.1", + "@cypress/request": "^2.88.5", + "@cypress/xvfb": "^1.2.4", + "@types/sinonjs__fake-timers": "^6.0.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.1.2", + "blob-util": "2.0.2", + "bluebird": "^3.7.2", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-table3": "~0.6.0", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "debug": "^4.1.1", + "eventemitter2": "^6.4.2", + "execa": "^4.0.2", + "executable": "^4.1.1", + "extract-zip": "^1.7.0", + "fs-extra": "^9.0.1", + "getos": "^3.2.1", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.2", + "lazy-ass": "^1.6.0", + "listr": "^0.14.3", + "lodash": "^4.17.19", + "log-symbols": "^4.0.0", + "minimist": "^1.2.5", + "moment": "^2.27.0", + "ospath": "^1.2.2", + "pretty-bytes": "^5.4.1", + "ramda": "~0.26.1", + "request-progress": "^3.0.0", + "supports-color": "^7.2.0", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "url": "^0.11.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "@cypress/listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha512-EDiBsVPWC27DDLEJCo+dpl9ODHhdrwU57ccr9tspwCdG2ni0QVkf6LF0FGbhfujcjPxnXLIwsaks4sOrwrA4Qw==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "@cypress/request": { + "version": "2.88.5", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz", + "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@types/sinonjs__fake-timers": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.3.tgz", + "integrity": "sha512-E1dU4fzC9wN2QK2Cr1MLCfyHM8BoNnRFvuf45LYMPNDA+WqbNzC45S4UzPxvp1fFJ1rvSGU0bPvdd35VLmXG8g==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + } + } + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "optional": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "eventemitter2": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz", + "integrity": "sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "requires": { + "async": "^3.2.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "requires": { + "ini": "1.3.7" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", + "dev": true + }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "dev": true + }, + "ramda": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", + "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + } + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + } + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + }, + "dependencies": { + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + } + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + }, + "jest-dom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-4.0.0.tgz", + "integrity": "sha512-gBxYZlZB1Jgvf2gP2pRfjjUWF8woGBHj/g5rAQgFPB/0K2atGuhVcPO+BItyjWeKg9zM+dokgcMOH01vrWVMFA==", + "dev": true + }, + "plotly.js-dist": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/plotly.js-dist/-/plotly.js-dist-2.4.1.tgz", + "integrity": "sha512-OsZgXlUJaxib+6HjrEaux61FaqNVLDiotNKF5JdoacigvAWoiTRUAD/K1x560jFR3fDzXaZ4mpXBbJukc5i3HQ==" + }, + "postinstall": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/postinstall/-/postinstall-0.7.4.tgz", + "integrity": "sha512-jrItKnoJJCY6wuhP/LpTy5KyWJYUOOs+2477PUAXDCrJOZX2vgzCD3jgXawhJG4qdFxvAepaJLum1trieFbEuw==", + "requires": { + "@danieldietrich/copy": "^0.4.2", + "glob": "^7.1.7", + "minimist": "^1.2.5", + "resolve-from": "^5.0.0", + "resolve-pkg": "^2.0.0" + }, + "dependencies": { + "@danieldietrich/copy": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@danieldietrich/copy/-/copy-0.4.2.tgz", + "integrity": "sha512-ZVNZIrgb2KeomfNahP77rL445ho6aQj0HHqU6hNlQ61o4rhvca+NS+ePj0d82zQDq2UPk1mjVZBTXgP+ErsDgw==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + } + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } + }, + "react-graph-vis": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/react-graph-vis/-/react-graph-vis-1.0.7.tgz", + "integrity": "sha512-FI35zlBMKU22JEvG1ukd1DDwW185y4YrDvHm6Bom9EGdA+UNMrZrIV/lyPIRWPcRkzbKaA1w1NvOYcRApD4KdQ==", + "requires": { + "lodash": "^4.17.15", + "prop-types": "^15.5.10", + "uuid": "^2.0.1", + "vis-data": "^7.1.2", + "vis-network": "^9.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==" + }, + "vis-data": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.2.tgz", + "integrity": "sha512-RPSegFxEcnp3HUEJSzhS2vBdbJ2PSsrYYuhRlpHp2frO/MfRtTYbIkkLZmPkA/Sg3pPfBlR235gcoKbtdm4mbw==" + }, + "vis-network": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.0.tgz", + "integrity": "sha512-rx96L144RJWcqOa6afjiFyxZKUerRRbT/YaNMpsusHdwzxrVTO2LlduR45PeJDEztrAf3AU5l2zmiG+1ydUZCw==" + } + } + }, + "react-paginate": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/react-paginate/-/react-paginate-8.1.3.tgz", + "integrity": "sha512-zBp80DBRcaeBnAeHUfbGKD0XHfbGNUolQ+S60Ymfs8o7rusYaJYZMAt1j93ADDNLlzRmJ0tMF/NeTlcdKf7dlQ==", + "requires": { + "prop-types": "^15.6.1" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "react-plotly.js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.5.1.tgz", + "integrity": "sha512-Oya14whSHvPsYXdI0nHOGs1pZhMzV2edV7HAW1xFHD58Y73m/LbG2Encvyz1tztL0vfjph0JNhiwO8cGBJnlhg==", + "requires": { + "prop-types": "^15.7.2" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "react-syntax-highlighter": { + "version": "15.4.4", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.4.4.tgz", + "integrity": "sha512-PsOFHNTzkb3OroXdoR897eKN5EZ6grht1iM+f1lJSq7/L0YVnkJaNVwC3wEUYPOAmeyl5xyer1DjL6MrumO6Zw==", + "requires": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.22.0", + "refractor": "^3.2.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "requires": { + "format": "^0.2.0" + } + }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "requires": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "requires": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "dependencies": { + "prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" + } + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } + }, + "redux-persist": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", + "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "trim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-1.0.1.tgz", + "integrity": "sha512-3JVP2YVqITUisXblCDq/Bi4P9457G/sdEamInkyvCsjbTcXLXIiG7XCb4kGMFWh6JGXesS3TKxOPtrncN/xe8w==" + } + } +} diff --git a/public/components/trace_analytics/components/dashboard/mode_picker.tsx b/public/components/trace_analytics/components/dashboard/mode_picker.tsx new file mode 100644 index 0000000000..14340bf5ad --- /dev/null +++ b/public/components/trace_analytics/components/dashboard/mode_picker.tsx @@ -0,0 +1,97 @@ +import { EuiButtonEmpty, EuiPopover, EuiPopoverTitle, EuiSelectable } from "@elastic/eui"; +import React, { useEffect, useState } from "react"; +import { TraceAnalyticsMode } from "../../home"; + +export type mode = { + id: string; + title: string; +} + +const labels = new Map([['jaeger', 'Jaeger'], ['data_prepper', 'Data Prepper']]); + + +export function DataSourcePicker(props: {modes: { + id: string; + title: string; +}[], selectedMode: TraceAnalyticsMode, setMode : (mode: TraceAnalyticsMode) => void}) { + const { modes, selectedMode, setMode } = props; + const [isPopoverOpen, setPopoverIsOpen] = useState(false); + const [selected, setSelected] = useState(selectedMode); + + const trigger = { + label: labels.get(selected), + title: selected, + 'data-test-subj': 'indexPattern-switch-link', + className: 'dscIndexPattern__triggerButton', + } + + const createTrigger = () => { + const { label, title, ...rest } = trigger; + return ( + setPopoverIsOpen(!isPopoverOpen)} + {...rest} + > + {label} + + ); + }; + + return ( + <> + setPopoverIsOpen(false)} + className="eui-textTruncate" + anchorClassName="eui-textTruncate" + display="block" + panelPaddingSize="s" + ownFocus + > +
+ + {"Choose data type"} + + ({ + label: x.title, + key: x.id, + value: x.id, + checked: x.id === selected ? 'on' : undefined, + }))} + onChange={(choices) => { + const choice = (choices.find(({ checked }) => checked) as unknown) as { + value: string; + label: string; + key: TraceAnalyticsMode; + }; + setMode(choice.key); + setSelected(choice.key); + setPopoverIsOpen(false); + sessionStorage.setItem('TraceAnalyticsMode', choice.key); + }} + searchProps={{ + compressed: true, + }} + > + {(list, search) => ( + <> + {search} + {list} + + )} + +
+
+ + ); +} \ No newline at end of file diff --git a/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx b/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx new file mode 100644 index 0000000000..d0a80f4ac5 --- /dev/null +++ b/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx @@ -0,0 +1,325 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + EuiFlexGroup, + EuiFlexItem, + EuiHorizontalRule, + EuiI18nNumber, + EuiIcon, + EuiInMemoryTable, + EuiLink, + EuiPanel, + EuiSpacer, + EuiTableFieldDataColumnType, + EuiText, + EuiToolTip, + PropertySort, + } from '@elastic/eui'; + import { CriteriaWithPagination } from '@elastic/eui/src/components/basic_table/basic_table'; + import _ from 'lodash'; + import React, { useMemo, useState } from 'react'; + import { FilterType } from '../common/filters/filters'; + import { calculateTicks, NoMatchMessage, PanelTitle } from '../common/helper_functions'; + import { BoxPlt } from '../common/plots/box_plt'; + import { LatencyTrendCell } from './latency_trend_cell'; + + export function ErrorRatesTable(props: { + title?: string; + items: any[]; + filters: FilterType[]; + addFilter: (filter: FilterType) => void; + addFilters: (filter: FilterType[]) => void; + addPercentileFilter: (condition?: 'gte' | 'lte', additionalFilters?: FilterType[]) => void; + setRedirect: (redirect: boolean) => void; + loading: boolean; + page: 'dashboard' | 'traces' | 'services' | 'app'; + }) { + console.log(props.items); + const getColumns = () => + [ + { + field: 'dashboard_trace_group_name', + name: ( + + Traces of all requests that share a common API and operation at the start of + distributed tracing instrumentation. + + } + > + <> +
+ Service and Operation Name{' '} + +
+
 
+ +
+ ), + align: 'left', + sortable: true, + render: (item) => + item ? ( + { + props.addFilters([{ + field: 'process.serviceName', + operator: 'is', + value: item[0], + inverted: false, + disabled: false, + },{ + field: 'operationName', + operator: 'is', + value: item[1], + inverted: false, + disabled: false, + }]); + } + } + > + {item.length < 48 ? ( + decodeURI(item) + ) : ( +
{_.truncate(decodeURI(item), { length: 48 })}
+ )} +
+ ) : ( + '-' + ), + }, + { + field: 'dashboard_average_latency', + name: ( + + Average latency of traces within a trace group in the selected time range. + + } + > + <> + {/*
Average
*/} +
+ Average latency (ms){' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + dataType: 'number', + render: (item) => (item === 0 || item ? _.round(item, 2) : '-'), + }, + { + field: '24_hour_error_trend', + name: ( + + 24 hour time series view of hourly average, hourly percentile, and hourly range of + error rates for traces within a trace group. + + } + > + <> + {/*
24-hour
*/} +
+ 24-hour error rate trend{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: false, + render: (item, row) => + item ? ( + + ) : ( + '-' + ), + }, + { + field: 'dashboard_error_rate', + name: ( + + Error rate based on count of trace errors within a trace group in the selected time + range. + + } + > + <> +
+ Error rate{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + render: (item) => + item === 0 || item ? {`${_.round(item, 2)}%`} : '-', + }, + { + field: 'dashboard_traces', + name: ( + + Count of traces with unique trace identifiers in the selected time range. + + } + > + <> +
+ Traces{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + render: (item, row) => ( + { + props.addFilters([{ + field: 'process.serviceName', + operator: 'is', + value: row.dashboard_trace_group_name[0], + inverted: false, + disabled: false, + },{ + field: 'operationName', + operator: 'is', + value: row.dashboard_trace_group_name[1], + inverted: false, + disabled: false, + }]); + if (props.page !== 'app') { + props.setRedirect(true); + location.assign('#/trace_analytics/traces'); + } + }} + > + + + ), + }, + ] as Array>; + + const renderTitleBar = (totalItems: number) => { + return ( + + + + + + props.addPercentileFilter('lte')} + > + + < 95 percentile + + + + + + props.addPercentileFilter('gte')} + > + + >= 95 percentile + + + + + + ); + }; + + const columns = useMemo(() => getColumns(), [props.items, props.filters]); + const titleBar = useMemo(() => renderTitleBar(props.items?.filter((item) => item.dashboard_error_rate > 0).length), [props.items]); + + const [sorting, setSorting] = useState<{ sort: PropertySort }>({ + sort: { + field: 'dashboard_latency_variance', + direction: 'desc', + }, + }); + + const onTableChange = async ({ page, sort }: CriteriaWithPagination) => { + if (typeof sort?.field !== 'string') return; + setSorting({ sort } as { sort: PropertySort }); + }; + + return ( + <> + + {titleBar} + + + {props.items?.length > 0 ? ( + item.dashboard_error_rate > 0)} + columns={columns} + pagination={{ + initialPageSize: 10, + pageSizeOptions: [5, 10, 15], + }} + sorting={sorting} + onTableChange={onTableChange} + loading={props.loading} + /> + ) : ( + + )} + + + ); + } + \ No newline at end of file diff --git a/public/components/trace_analytics/components/dashboard/top_groups_page.tsx b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx new file mode 100644 index 0000000000..d3544c5831 --- /dev/null +++ b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx @@ -0,0 +1,68 @@ +import { EuiAccordion, EuiButtonGroup, EuiHorizontalRule, EuiPanel, EuiSpacer, EuiTableRow } from '@elastic/eui'; +import React, { useState } from 'react'; +import { FilterType } from '../common/filters/filters'; +import { ErrorRatePlt } from '../common/plots/error_rate_plt'; +import { ThroughputPlt } from '../common/plots/throughput_plt'; +import { ErrorRatesTable } from './top_error_rates_table'; +import { LatencyTable } from './top_latency_table'; + +export function TopGroupsPage( props: { + filters: FilterType[], + addFilter: (filter: FilterType) => void, + addFilters: (filter: FilterType[]) => void, + addPercentileFilter: (condition?: 'gte' | 'lte', additionalFilters?: FilterType[]) => void, + setRedirect: (redirect: boolean) => void, + loading: boolean, + page: 'dashboard' | 'traces' | 'services' | 'app', + throughPutItems: { items: any[]; fixedInterval: string }, + jaegerErrorRatePltItems: {items: any[]; fixedInterval: string}, + jaegerErrorTableItems: any[], + jaegerTableItems: any[], + setStartTime: (time: string) => void, + setEndTime: (time: string) => void, +} ) { + const toggleButtons = [ + { + id: 'error_rate', + label: 'Error rate', + }, + { + id: 'throughput', + label: 'Throughput', + }, + ]; + const [idSelected, setIdSelected] = useState('error_rate') + return ( + <> + { idSelected === 'error_rate' ? ( + + + setIdSelected(id as 'error_rate' | 'throughput')} + buttonSize="s" + color="text" + /> + + + + + ) : ( + + + setIdSelected(id as 'error_rate' | 'throughput')} + buttonSize="s" + color="text" + /> + + + + + )} + + ) + } \ No newline at end of file diff --git a/public/components/trace_analytics/components/dashboard/top_latency_table.tsx b/public/components/trace_analytics/components/dashboard/top_latency_table.tsx new file mode 100644 index 0000000000..9f594ac923 --- /dev/null +++ b/public/components/trace_analytics/components/dashboard/top_latency_table.tsx @@ -0,0 +1,438 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + EuiFlexGroup, + EuiFlexItem, + EuiHorizontalRule, + EuiI18nNumber, + EuiIcon, + EuiInMemoryTable, + EuiLink, + EuiPanel, + EuiSpacer, + EuiTableFieldDataColumnType, + EuiText, + EuiToolTip, + PropertySort, + } from '@elastic/eui'; + import { CriteriaWithPagination } from '@elastic/eui/src/components/basic_table/basic_table'; + import _ from 'lodash'; + import React, { useMemo, useState } from 'react'; + import { FilterType } from '../common/filters/filters'; + import { calculateTicks, NoMatchMessage, PanelTitle } from '../common/helper_functions'; + import { BoxPlt } from '../common/plots/box_plt'; + import { LatencyTrendCell } from './latency_trend_cell'; + + export function LatencyTable(props: { + title?: string; + items: any[]; + filters: FilterType[]; + addFilter: (filter: FilterType) => void; + addFilters: (filter: FilterType[]) => void; + addPercentileFilter: (condition?: 'gte' | 'lte', additionalFilters?: FilterType[]) => void; + setRedirect: (redirect: boolean) => void; + loading: boolean; + page: 'dashboard' | 'traces' | 'services' | 'app'; + }) { + const getVarianceProps = (items: any[]) => { + if (items.length === 0) { + return { minRange: 0, maxRange: 0, ticks: [0, 0], scale: '' }; + } + const variances = [].concat( + ...items + .filter((item) => item.dashboard_latency_variance) + .map((item) => item.dashboard_latency_variance) + ); + const minRange = Math.min(...variances); + const maxRange = Math.max(...variances); + const ticks = calculateTicks(minRange, maxRange); + + const maxDigits = ticks[ticks.length - 1].toString().length; + + // pads spaces (\u00A0) in between ticks to construct a scale + // width of a character equals the width of two spaces, maximum 39 characters in a scale + const scale = ticks + .map((tick) => { + const tickStr = tick.toString(); + return tickStr.padEnd(tickStr.length + 2 * (maxDigits - tickStr.length), '\u00A0'); + }) + .join( + '\u00A0'.repeat( + Math.max( + 1, + Math.floor((2 * (39 - ticks.length * maxDigits)) / Math.max(1, ticks.length - 1)) + ) + ) + ); + + return { minRange, maxRange, ticks, scale }; + }; + + const getColumns = () => + [ + { + field: 'dashboard_trace_group_name', + name: ( + + Traces of all requests that share a common API and operation at the start of + distributed tracing instrumentation. + + } + > + <> +
+ Service and Operation Name{' '} + +
+
 
+ +
+ ), + align: 'left', + sortable: true, + render: (item) => + item ? ( + { + props.addFilters([{ + field: 'process.serviceName', + operator: 'is', + value: item[0], + inverted: false, + disabled: false, + },{ + field: 'operationName', + operator: 'is', + value: item[1], + inverted: false, + disabled: false, + }]); + } + } + > + {item.length < 48 ? ( + decodeURI(item) + ) : ( +
{_.truncate(decodeURI(item), { length: 48 })}
+ )} +
+ ) : ( + '-' + ), + }, + { + field: 'dashboard_latency_variance', + name: ( + <> + + Range of latencies for traces within a trace group in the selected time range. + + } + > + + Latency variance (ms){' '} + + + + {varianceProps && ( + + {varianceProps.scale} + + )} + + ), + align: 'center', + sortable: ({ dashboard_latency_variance }) => + dashboard_latency_variance?.length > 0 + ? dashboard_latency_variance[2] - dashboard_latency_variance[0] + : 0, + width: '300px', + render: (item, row) => { + const filter = props.filters.find( + (f) => f.field === 'Latency percentile within trace group' + ); + const currPercentileFilter = filter ? filter.value : ''; + return item ? ( + // expand plot ranges to accommodate scale + 1 + ? varianceProps.ticks[0] + : varianceProps.ticks[0] / 1.03, + max: varianceProps.ticks[varianceProps.ticks.length - 1] * 1.03, + left: item[0], + mid: item[1], + right: item[2], + currPercentileFilter, + addFilter: (condition?: 'lte' | 'gte') => { + const traceGroupFilter = { + field: 'traceGroup', + operator: 'is', + value: row.dashboard_trace_group_name, + inverted: false, + disabled: false, + }; + const additionalFilters = [traceGroupFilter]; + for (const addedFilter of props.filters) { + if ( + addedFilter.field === traceGroupFilter.field && + addedFilter.operator === traceGroupFilter.operator && + addedFilter.value === traceGroupFilter.value + ) { + additionalFilters.pop(); + } + } + props.addPercentileFilter(condition, additionalFilters); + }, + }} + /> + ) : ( + '-' + ); + }, + }, + { + field: 'dashboard_average_latency', + name: ( + + Average latency of traces within a trace group in the selected time range. + + } + > + <> + {/*
Average
*/} +
+ Average latency (ms){' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + dataType: 'number', + render: (item) => (item === 0 || item ? _.round(item, 2) : '-'), + }, + { + field: '24_hour_latency_trend', + name: ( + + 24 hour time series view of hourly average, hourly percentile, and hourly range of + latency for traces within a trace group. + + } + > + <> + {/*
24-hour
*/} +
+ 24-hour latency trend{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: false, + render: (item, row) => + item ? ( + + ) : ( + '-' + ), + }, + { + field: 'dashboard_error_rate', + name: ( + + Error rate based on count of trace errors within a trace group in the selected time + range. + + } + > + <> +
+ Error rate{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + render: (item) => + item === 0 || item ? {`${_.round(item, 2)}%`} : '-', + }, + { + field: 'dashboard_traces', + name: ( + + Count of traces with unique trace identifiers in the selected time range. + + } + > + <> +
+ Traces{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + render: (item, row) => ( + { + props.addFilters([{ + field: 'process.serviceName', + operator: 'is', + value: row.dashboard_trace_group_name[0], + inverted: false, + disabled: false, + },{ + field: 'operationName', + operator: 'is', + value: row.dashboard_trace_group_name[1], + inverted: false, + disabled: false, + }]); + if (props.page !== 'app') { + props.setRedirect(true); + location.assign('#/trace_analytics/traces'); + } + }} + > + + + ), + }, + ] as Array>; + + const renderTitleBar = (totalItems: number) => { + return ( + + + + + + props.addPercentileFilter('lte')} + > + + < 95 percentile + + + + + + props.addPercentileFilter('gte')} + > + + >= 95 percentile + + + + + + ); + }; + + const varianceProps = useMemo(() => getVarianceProps(props.items), [props.items]); + const columns = useMemo(() => getColumns(), [props.items, props.filters]); + const titleBar = useMemo(() => renderTitleBar(props.items?.length), [props.items]); + + const [sorting, setSorting] = useState<{ sort: PropertySort }>({ + sort: { + field: 'dashboard_latency_variance', + direction: 'desc', + }, + }); + + const onTableChange = async ({ page, sort }: CriteriaWithPagination) => { + if (typeof sort?.field !== 'string') return; + setSorting({ sort } as { sort: PropertySort }); + }; + + return ( + <> + + {titleBar} + + + {props.items?.length > 0 ? ( + + ) : ( + + )} + + + ); + } + \ No newline at end of file From 440ea142446ef518b094dc3a5c3bab50cd6301f2 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Wed, 28 Dec 2022 14:39:00 -0500 Subject: [PATCH 45/67] remove package lock Signed-off-by: Derek Ho --- package-lock.json | 4752 --------------------------------------------- 1 file changed, 4752 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 6fbe6573b1..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,4752 +0,0 @@ -{ - "name": "observability-dashboards", - "version": "2.4.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@algolia/autocomplete-core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.4.1.tgz", - "integrity": "sha512-LPX4nFA5HzS07UfEAzdXHi6vSUfwqJe8mikcg81ZnMTv+khRAMh3VxHAMUISAnHqI5NzEImbyPdSDpjgh9IPGQ==", - "requires": { - "@algolia/autocomplete-shared": "1.4.1" - }, - "dependencies": { - "@algolia/autocomplete-shared": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.4.1.tgz", - "integrity": "sha512-MGLj6on/809+xQi5dfOPv4EB6KruTfbkg1rZWQzDX5KrJuiu6CPHp/kk2JNyrEr2luiT0v7rxXWOz9XfxVReiQ==" - } - } - }, - "@algolia/autocomplete-theme-classic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.3.0.tgz", - "integrity": "sha512-npQlljLXAAdXL9chj98xvhNOIgInaX27SUfBfFeCds3YtnwI+ZOATiYUOl7/WkyzxXvwEMUIO1sUenlZuH8o0A==" - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" - }, - "@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz", - "integrity": "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==", - "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-flow": "^7.18.6" - } - }, - "@babel/preset-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", - "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-flow-strip-types": "^7.18.6" - } - }, - "@cypress/skip-test": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@cypress/skip-test/-/skip-test-2.6.1.tgz", - "integrity": "sha512-X+ibefBiuOmC5gKG91wRIT0/OqXeETYvu7zXktjZ3yLeO186Y8ia0K7/gQUpAwuUi28DuqMd1+7tBQVtPkzbPA==", - "dev": true - }, - "@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" - }, - "@nteract/outputs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@nteract/outputs/-/outputs-3.0.11.tgz", - "integrity": "sha512-LeT9ViBf+fTPSubZ9dMe7128kg0rl1jIG54V0n2GiU5RuYnUz21FU0IOaLMPUfFMO1VyVEOW5jDc3PAQx5/Kwg==", - "requires": { - "@nteract/markdown": "^4.5.2", - "@nteract/mathjax": "^4.0.11", - "ansi-to-react": "^6.0.5", - "react-json-tree": "^0.12.1" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@blueprintjs/colors": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@blueprintjs/colors/-/colors-4.1.10.tgz", - "integrity": "sha512-p1rgfijpZi+r2xskyRi3uF8DRq08rb26u9Gymi0p4ZNZq/iLJQ1Fj1jfT8yh2yc6eCfs8GlH6iDNdU387wEK3w==" - }, - "@blueprintjs/core": { - "version": "3.54.0", - "resolved": "https://registry.npmjs.org/@blueprintjs/core/-/core-3.54.0.tgz", - "integrity": "sha512-u2c1s6MNn0ocxhnC6CuiG5g3KV6b4cKUvSobznepA9SC3/AL1s3XOvT7DLWoHRv2B/vBOHFYEDzLw2/vlcGGZg==", - "requires": { - "@blueprintjs/colors": "^4.0.0-alpha.3", - "@blueprintjs/icons": "^3.33.0", - "@juggle/resize-observer": "^3.3.1", - "@types/dom4": "^2.0.1", - "classnames": "^2.2", - "dom4": "^2.1.5", - "normalize.css": "^8.0.1", - "popper.js": "^1.16.1", - "react-lifecycles-compat": "^3.0.4", - "react-popper": "^1.3.7", - "react-transition-group": "^2.9.0", - "tslib": "~2.3.1" - } - }, - "@blueprintjs/icons": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.33.0.tgz", - "integrity": "sha512-Q6qoSDIm0kRYQZISm59UUcDCpV3oeHulkLuh3bSlw0HhcSjvEQh2PSYbtaifM60Q4aK4PCd6bwJHg7lvF1x5fQ==", - "requires": { - "classnames": "^2.2", - "tslib": "~2.3.1" - } - }, - "@blueprintjs/select": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/@blueprintjs/select/-/select-3.19.1.tgz", - "integrity": "sha512-8UJIZMaWXRMQHr14wbmzJc/CklcSKxOU5JUux0xXKQz/hDW/g1a650tlwJmnxufvRdShbGinlVfHupCs0EL6sw==", - "requires": { - "@blueprintjs/core": "^3.54.0", - "classnames": "^2.2", - "tslib": "~2.3.1" - } - }, - "@hypnosphi/create-react-context": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz", - "integrity": "sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==", - "requires": { - "gud": "^1.0.0", - "warning": "^4.0.3" - } - }, - "@nteract/markdown": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@nteract/markdown/-/markdown-4.6.2.tgz", - "integrity": "sha512-WI+VvaiL9ihIkmPHCYSwziuMJcSUTKBi+hrf5V74jYYq1b5LWJyDa9O5B137KVEdgYwr0w4JiZHFm7wvEWXlZw==", - "requires": { - "@nteract/mathjax": "^4.0.11", - "@nteract/presentational-components": "^3.3.11", - "react-markdown": "^4.0.0" - } - }, - "@nteract/mathjax": { - "version": "4.0.16", - "resolved": "https://registry.npmjs.org/@nteract/mathjax/-/mathjax-4.0.16.tgz", - "integrity": "sha512-eth384tJmOF2oNnHc3iqNwqZdFdNPZmnboY66aE7QRJvxZsYSUj0oHvERn3nXxFuVjv866xWGRc5zU+T4tPIDQ==", - "requires": { - "load-script": "^1.0.0" - } - }, - "@nteract/presentational-components": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/@nteract/presentational-components/-/presentational-components-3.4.12.tgz", - "integrity": "sha512-gIZlHj2ZJ3glmRslyJh2HWmJftgk18w1CyOJVrxh9ovyso0Nw6CwPNEEKVdjouJvU4OCB7dpINIBLy/w4SxtRA==", - "requires": { - "@blueprintjs/core": "^3.7.0", - "@blueprintjs/select": "^3.2.0", - "classnames": "^2.2.6", - "re-resizable": "^6.5.0", - "react-syntax-highlighter": "^13.0.0", - "react-toggle": "^4.1.1" - } - }, - "@types/dom4": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/dom4/-/dom4-2.0.2.tgz", - "integrity": "sha512-Rt4IC1T7xkCWa0OG1oSsPa0iqnxlDeQqKXZAHrQGLb7wFGncWm85MaxKUjAGejOrUynOgWlFi4c6S6IyJwoK4g==" - }, - "@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "requires": { - "@types/unist": "*" - } - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" - }, - "ansi-to-react": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-6.1.6.tgz", - "integrity": "sha512-+HWn72GKydtupxX9TORBedqOMsJRiKTqaLUKW8txSBZw9iBpzPKLI8KOu4WzwD4R7hSv1zEspobY6LwlWvwZ6Q==", - "requires": { - "anser": "^1.4.1", - "escape-carriage": "^1.3.0" - } - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "dom4": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/dom4/-/dom4-2.1.6.tgz", - "integrity": "sha512-JkCVGnN4ofKGbjf5Uvc8mmxaATIErKQKSgACdBXpsQ3fY6DlIpAyWfiBSrGkttATssbDCp3psiAKWXk5gmjycA==" - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" - }, - "escape-carriage": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.0.tgz", - "integrity": "sha512-ATWi5MD8QlAGQOeMgI8zTp671BG8aKvAC0M7yenlxU4CRLGO/sKthxVUyjiOFKjHdIo+6dZZUNFgHFeVEaKfGQ==" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "requires": { - "format": "^0.2.0" - } - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" - }, - "hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" - }, - "html-to-react": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.5.0.tgz", - "integrity": "sha512-tjihXBgaJZRRYzmkrJZ/Qf9jFayilFYcb+sJxXXE2BVLk2XsNrGeuNCVvhXmvREULZb9dz6NFTBC96DTR/lQCQ==", - "requires": { - "domhandler": "^5.0", - "htmlparser2": "^8.0", - "lodash.camelcase": "^4.3.0" - } - }, - "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" - }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "load-script": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", - "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" - }, - "lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", - "requires": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - } - }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" - }, - "mdast-add-list-metadata": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz", - "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==", - "requires": { - "unist-util-visit-parents": "1.1.2" - } - }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" - }, - "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { - "xtend": "^4.0.0" - } - }, - "pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" - }, - "re-resizable": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.9.tgz", - "integrity": "sha512-l+MBlKZffv/SicxDySKEEh42hR6m5bAHfNu3Tvxks2c4Ah+ldnWjfnVRwxo/nxF27SsUsxDS0raAzFuJNKABXA==" - }, - "react-base16-styling": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.7.0.tgz", - "integrity": "sha512-lTa/VSFdU6BOAj+FryOe7OTZ0OBP8GXPOnCS0QnZi7G3zhssWgIgwl0eUL77onXx/WqKPFndB3ZeC77QC/l4Dw==", - "requires": { - "base16": "^1.0.0", - "lodash.curry": "^4.1.1", - "lodash.flow": "^3.5.0", - "pure-color": "^1.3.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-json-tree": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.12.1.tgz", - "integrity": "sha512-j6fkRY7ha9XMv1HPVakRCsvyFwHGR5AZuwO8naBBeZXnZbbLor5tpcUxS/8XD01+D1v7ZN5p+7LU+9V1uyASiQ==", - "requires": { - "prop-types": "^15.7.2", - "react-base16-styling": "^0.7.0" - } - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-markdown": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-4.3.1.tgz", - "integrity": "sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw==", - "requires": { - "html-to-react": "^1.3.4", - "mdast-add-list-metadata": "1.0.1", - "prop-types": "^15.7.2", - "react-is": "^16.8.6", - "remark-parse": "^5.0.0", - "unified": "^6.1.5", - "unist-util-visit": "^1.3.0", - "xtend": "^4.0.1" - } - }, - "react-popper": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz", - "integrity": "sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==", - "requires": { - "@babel/runtime": "^7.1.2", - "@hypnosphi/create-react-context": "^0.3.1", - "deep-equal": "^1.1.1", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", - "warning": "^4.0.2" - } - }, - "react-syntax-highlighter": { - "version": "13.5.3", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz", - "integrity": "sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==", - "requires": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.1.1", - "lowlight": "^1.14.0", - "prismjs": "^1.21.0", - "refractor": "^3.1.0" - } - }, - "react-toggle": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/react-toggle/-/react-toggle-4.1.3.tgz", - "integrity": "sha512-WoPrvbwfQSvoagbrDnXPrlsxwzuhQIrs+V0I162j/s+4XPgY/YDAUmHSeWiroznfI73wj+MBydvW95zX8ABbSg==", - "requires": { - "classnames": "^2.2.5" - } - }, - "react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "requires": { - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - } - }, - "refractor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", - "requires": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" - }, - "dependencies": { - "prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" - } - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "remark-parse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", - "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - } - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==" - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" - }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" - }, - "trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==" - }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "unified": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", - "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^2.0.0", - "x-is-string": "^0.1.0" - } - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - }, - "dependencies": { - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "unist-util-visit-parents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz", - "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==" - }, - "vfile": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", - "requires": { - "is-buffer": "^1.1.4", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - }, - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - } - } - }, - "@reduxjs/toolkit": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.6.1.tgz", - "integrity": "sha512-pa3nqclCJaZPAyBhruQtiRwtTjottRrVJqziVZcWzI73i6L3miLTtUyWfauwv08HWtiXLx1xGyGt+yLFfW/d0A==", - "requires": { - "immer": "^9.0.1", - "redux": "^4.1.0", - "redux-thunk": "^2.3.0", - "reselect": "^4.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "immer": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz", - "integrity": "sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ==" - }, - "redux": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", - "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", - "requires": { - "@babel/runtime": "^7.9.2" - } - }, - "redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "reselect": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", - "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" - } - } - }, - "@types/enzyme-adapter-react-16": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.6.tgz", - "integrity": "sha512-VonDkZ15jzqDWL8mPFIQnnLtjwebuL9YnDkqeCDYnB4IVgwUm0mwKkqhrxLL6mb05xm7qqa3IE95m8CZE9imCg==", - "dev": true, - "requires": { - "@types/enzyme": "*" - }, - "dependencies": { - "@types/cheerio": { - "version": "0.22.31", - "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.31.tgz", - "integrity": "sha512-Kt7Cdjjdi2XWSfrZ53v4Of0wG3ZcmaegFXjMmz9tfNrZSkzzo36G0AL1YqSdcIA78Etjt6E609pt5h1xnQkPUw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/enzyme": { - "version": "3.10.9", - "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.9.tgz", - "integrity": "sha512-dx5UvcWe2Vtye6S9Hw2rFB7Ul9uMXOAje2FAbXvVYieQDNle9qPAo7DfvFMSztZ9NFiD3dVZ4JsRYGTrSLynJg==", - "dev": true, - "requires": { - "@types/cheerio": "*", - "@types/react": "*" - } - }, - "@types/node": { - "version": "18.11.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", - "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "@types/react": { - "version": "18.0.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", - "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true - } - } - }, - "@types/react-plotly.js": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@types/react-plotly.js/-/react-plotly.js-2.5.0.tgz", - "integrity": "sha512-bda7N/Y65d1x0FfwhgUXAugGeG9CRIxmkW/yBL8PVFUMvZGpfEnw4bXKjDozBYlOskVfxj6UQ9IKmZI6CZ7/QQ==", - "dev": true, - "requires": { - "@types/plotly.js": "*", - "@types/react": "*" - }, - "dependencies": { - "@types/d3": { - "version": "3.5.47", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.47.tgz", - "integrity": "sha512-VkWIQoZXLFdcBGe5pdBKJmTU3fmpXvo/KV6ixvTzOMl1yJ2hbTXpfvsziag0kcaerPDwas2T0vxojwQG3YwivQ==", - "dev": true - }, - "@types/plotly.js": { - "version": "1.54.14", - "resolved": "https://registry.npmjs.org/@types/plotly.js/-/plotly.js-1.54.14.tgz", - "integrity": "sha512-vYevenBloZ3B4i831i+ccS9u782JSnkJpBG/c/qPRJNDW6s25udnrmoHkFhbBl7jkzBy8pO2lPNhpMrQJV7ETA==", - "dev": true, - "requires": { - "@types/d3": "^3" - } - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "@types/react": { - "version": "18.0.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", - "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true - } - } - }, - "@types/react-test-renderer": { - "version": "16.9.5", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.5.tgz", - "integrity": "sha512-C4cN7C2uSSGOYelp2XfdtJb5TsCP+QiZ+0Bm4U3ZfUswN8oN9O/l86XO/OvBSFCmWY7w75fzsQvZ50eGkFN34A==", - "dev": true, - "requires": { - "@types/react": "^16" - }, - "dependencies": { - "@types/react": { - "version": "16.14.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.14.tgz", - "integrity": "sha512-uwIWDYW8LznHzEMJl7ag9St1RsK0gw/xaFZ5+uI1ZM1HndwUgmPH3/wQkSb87GkOVg7shUxnpNW8DcN0AzvG5Q==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - }, - "dependencies": { - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true - } - } - } - } - }, - "ag-grid-community": { - "version": "27.3.0", - "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-27.3.0.tgz", - "integrity": "sha512-R5oZMXEHXnOLrmhn91J8lR0bv6IAnRcU6maO+wKLMJxffRWaAYFAuw1jt7bdmcKCv8c65F6LEBx4ykSOALa9vA==" - }, - "ag-grid-react": { - "version": "27.3.0", - "resolved": "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-27.3.0.tgz", - "integrity": "sha512-2bs9YfJ/shvBZQLLjny4NFvht+ic6VtpTPO0r3bHHOhlL3Fjx2rGvS6AHSwfvu+kJacHCta30PjaEbX8T3UDyw==", - "requires": { - "prop-types": "^15.8.1" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - } - } - }, - "antlr4": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.8.0.tgz", - "integrity": "sha512-en/MxQ4OkPgGJQ3wD/muzj1uDnFSzdFIhc2+c6bHZokWkuBb6RRvFjpWhPxWLbgQvaEzldJZ0GSQpfSAaE3hqg==" - }, - "antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==" - }, - "antlr4ts-cli": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts-cli/-/antlr4ts-cli-0.5.0-alpha.4.tgz", - "integrity": "sha512-lVPVBTA2CVHRYILSKilL6Jd4hAumhSZZWA7UbQNQrmaSSj7dPmmYaN4bOmZG79cOy0lS00i4LY68JZZjZMWVrw==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "requires": { - "restore-cursor": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - } - } - }, - "cypress": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-5.6.0.tgz", - "integrity": "sha512-cs5vG3E2JLldAc16+5yQxaVRLLqMVya5RlrfPWkC72S5xrlHFdw7ovxPb61s4wYweROKTyH01WQc2PFzwwVvyQ==", - "dev": true, - "requires": { - "@cypress/listr-verbose-renderer": "^0.4.1", - "@cypress/request": "^2.88.5", - "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "^6.0.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.1.2", - "blob-util": "2.0.2", - "bluebird": "^3.7.2", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "cli-table3": "~0.6.0", - "commander": "^5.1.0", - "common-tags": "^1.8.0", - "debug": "^4.1.1", - "eventemitter2": "^6.4.2", - "execa": "^4.0.2", - "executable": "^4.1.1", - "extract-zip": "^1.7.0", - "fs-extra": "^9.0.1", - "getos": "^3.2.1", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.2", - "lazy-ass": "^1.6.0", - "listr": "^0.14.3", - "lodash": "^4.17.19", - "log-symbols": "^4.0.0", - "minimist": "^1.2.5", - "moment": "^2.27.0", - "ospath": "^1.2.2", - "pretty-bytes": "^5.4.1", - "ramda": "~0.26.1", - "request-progress": "^3.0.0", - "supports-color": "^7.2.0", - "tmp": "~0.2.1", - "untildify": "^4.0.0", - "url": "^0.11.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "@cypress/listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha512-EDiBsVPWC27DDLEJCo+dpl9ODHhdrwU57ccr9tspwCdG2ni0QVkf6LF0FGbhfujcjPxnXLIwsaks4sOrwrA4Qw==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - } - } - }, - "@cypress/request": { - "version": "2.88.5", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz", - "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", - "dev": true, - "requires": { - "any-observable": "^0.3.0" - } - }, - "@types/sinonjs__fake-timers": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.3.tgz", - "integrity": "sha512-E1dU4fzC9wN2QK2Cr1MLCfyHM8BoNnRFvuf45LYMPNDA+WqbNzC45S4UzPxvp1fFJ1rvSGU0bPvdd35VLmXG8g==", - "dev": true - }, - "@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true - }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true - }, - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - } - } - }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "cli-table3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", - "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^4.2.0" - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eventemitter2": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz", - "integrity": "sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==", - "dev": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - } - } - }, - "executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "requires": { - "pify": "^2.2.0" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "requires": { - "async": "^3.2.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "dev": true, - "requires": { - "symbol-observable": "^1.1.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true - }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "dev": true, - "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", - "dev": true - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - }, - "dependencies": { - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", - "dev": true - }, - "ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "dev": true - }, - "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", - "dev": true - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - } - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - } - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - }, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - } - } - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - }, - "dependencies": { - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" - }, - "jest-dom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-4.0.0.tgz", - "integrity": "sha512-gBxYZlZB1Jgvf2gP2pRfjjUWF8woGBHj/g5rAQgFPB/0K2atGuhVcPO+BItyjWeKg9zM+dokgcMOH01vrWVMFA==", - "dev": true - }, - "plotly.js-dist": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/plotly.js-dist/-/plotly.js-dist-2.4.1.tgz", - "integrity": "sha512-OsZgXlUJaxib+6HjrEaux61FaqNVLDiotNKF5JdoacigvAWoiTRUAD/K1x560jFR3fDzXaZ4mpXBbJukc5i3HQ==" - }, - "postinstall": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/postinstall/-/postinstall-0.7.4.tgz", - "integrity": "sha512-jrItKnoJJCY6wuhP/LpTy5KyWJYUOOs+2477PUAXDCrJOZX2vgzCD3jgXawhJG4qdFxvAepaJLum1trieFbEuw==", - "requires": { - "@danieldietrich/copy": "^0.4.2", - "glob": "^7.1.7", - "minimist": "^1.2.5", - "resolve-from": "^5.0.0", - "resolve-pkg": "^2.0.0" - }, - "dependencies": { - "@danieldietrich/copy": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@danieldietrich/copy/-/copy-0.4.2.tgz", - "integrity": "sha512-ZVNZIrgb2KeomfNahP77rL445ho6aQj0HHqU6hNlQ61o4rhvca+NS+ePj0d82zQDq2UPk1mjVZBTXgP+ErsDgw==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - } - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "resolve-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", - "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", - "requires": { - "resolve-from": "^5.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - } - } - }, - "react-graph-vis": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/react-graph-vis/-/react-graph-vis-1.0.7.tgz", - "integrity": "sha512-FI35zlBMKU22JEvG1ukd1DDwW185y4YrDvHm6Bom9EGdA+UNMrZrIV/lyPIRWPcRkzbKaA1w1NvOYcRApD4KdQ==", - "requires": { - "lodash": "^4.17.15", - "prop-types": "^15.5.10", - "uuid": "^2.0.1", - "vis-data": "^7.1.2", - "vis-network": "^9.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==" - }, - "vis-data": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.2.tgz", - "integrity": "sha512-RPSegFxEcnp3HUEJSzhS2vBdbJ2PSsrYYuhRlpHp2frO/MfRtTYbIkkLZmPkA/Sg3pPfBlR235gcoKbtdm4mbw==" - }, - "vis-network": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.0.tgz", - "integrity": "sha512-rx96L144RJWcqOa6afjiFyxZKUerRRbT/YaNMpsusHdwzxrVTO2LlduR45PeJDEztrAf3AU5l2zmiG+1ydUZCw==" - } - } - }, - "react-paginate": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-paginate/-/react-paginate-8.1.3.tgz", - "integrity": "sha512-zBp80DBRcaeBnAeHUfbGKD0XHfbGNUolQ+S60Ymfs8o7rusYaJYZMAt1j93ADDNLlzRmJ0tMF/NeTlcdKf7dlQ==", - "requires": { - "prop-types": "^15.6.1" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "react-plotly.js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.5.1.tgz", - "integrity": "sha512-Oya14whSHvPsYXdI0nHOGs1pZhMzV2edV7HAW1xFHD58Y73m/LbG2Encvyz1tztL0vfjph0JNhiwO8cGBJnlhg==", - "requires": { - "prop-types": "^15.7.2" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "react-syntax-highlighter": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.4.4.tgz", - "integrity": "sha512-PsOFHNTzkb3OroXdoR897eKN5EZ6grht1iM+f1lJSq7/L0YVnkJaNVwC3wEUYPOAmeyl5xyer1DjL6MrumO6Zw==", - "requires": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.4.1", - "lowlight": "^1.17.0", - "prismjs": "^1.22.0", - "refractor": "^3.2.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "requires": { - "@types/unist": "*" - } - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - }, - "fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "requires": { - "format": "^0.2.0" - } - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" - }, - "hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" - }, - "hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", - "requires": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" - }, - "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { - "xtend": "^4.0.0" - } - }, - "refractor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", - "requires": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" - }, - "dependencies": { - "prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" - } - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - } - } - }, - "redux-persist": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", - "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "trim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-1.0.1.tgz", - "integrity": "sha512-3JVP2YVqITUisXblCDq/Bi4P9457G/sdEamInkyvCsjbTcXLXIiG7XCb4kGMFWh6JGXesS3TKxOPtrncN/xe8w==" - } - } -} From 03e25a1a00b3fc9a1977f0694934c49e8c6d4d77 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 29 Dec 2022 15:31:57 -0500 Subject: [PATCH 46/67] fix everything and get ui working well Signed-off-by: Derek Ho --- .../common/plots/error_rate_plt.tsx | 20 ++++++++++--- .../common/plots/throughput_plt.tsx | 14 ++++++++- .../components/dashboard/mode_picker.tsx | 4 +-- .../dashboard/top_error_rates_table.tsx | 4 +-- .../components/dashboard/top_groups_page.tsx | 30 ++++++++----------- 5 files changed, 45 insertions(+), 27 deletions(-) diff --git a/public/components/trace_analytics/components/common/plots/error_rate_plt.tsx b/public/components/trace_analytics/components/common/plots/error_rate_plt.tsx index 7486245361..247ba2efa3 100644 --- a/public/components/trace_analytics/components/common/plots/error_rate_plt.tsx +++ b/public/components/trace_analytics/components/common/plots/error_rate_plt.tsx @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { EuiHorizontalRule, EuiPanel } from '@elastic/eui'; +import { EuiButtonGroup, EuiHorizontalRule, EuiPanel, EuiFlexGroup, EuiSpacer } from '@elastic/eui'; import moment from 'moment'; -import React, { useMemo } from 'react'; +import React, { useMemo, useState } from 'react'; import { Plt } from '../../../../visualizations/plotly/plot'; import { fixedIntervalToMilli, @@ -18,6 +18,9 @@ export function ErrorRatePlt(props: { items: { items: Plotly.Data[]; fixedInterval: string }; setStartTime: (startTime: string) => void; setEndTime: (endTime: string) => void; + setIdSelected: (mode: string) => void; + idSelected: string; + toggleButtons: any[]; }) { const getLayout = () => ({ @@ -89,8 +92,17 @@ export function ErrorRatePlt(props: { return ( <> - - + + + props.setIdSelected(id as 'error_rate' | 'throughput')} + buttonSize="s" + color="text" + /> + + {props.items?.items?.length > 0 ? ( ) : ( diff --git a/public/components/trace_analytics/components/common/plots/throughput_plt.tsx b/public/components/trace_analytics/components/common/plots/throughput_plt.tsx index aba6bb2833..a7370bf0cc 100644 --- a/public/components/trace_analytics/components/common/plots/throughput_plt.tsx +++ b/public/components/trace_analytics/components/common/plots/throughput_plt.tsx @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { EuiHorizontalRule, EuiPanel } from '@elastic/eui'; +import { EuiButtonGroup, EuiFlexGroup, EuiHorizontalRule, EuiPanel } from '@elastic/eui'; import moment from 'moment'; import React, { useMemo } from 'react'; import { Plt } from '../../../../visualizations/plotly/plot'; @@ -18,6 +18,9 @@ export function ThroughputPlt(props: { items: { items: Plotly.Data[]; fixedInterval: string }; setStartTime: (startTime: string) => void; setEndTime: (endTime: string) => void; + setIdSelected: (mode: string) => void; + idSelected: string; + toggleButtons: any[]; }) { const layout = useMemo( () => @@ -85,7 +88,16 @@ export function ThroughputPlt(props: { return ( <> + + props.setIdSelected(id as 'error_rate' | 'throughput')} + buttonSize="s" + color="text" + /> + {props.items?.items?.length > 0 ? ( diff --git a/public/components/trace_analytics/components/dashboard/mode_picker.tsx b/public/components/trace_analytics/components/dashboard/mode_picker.tsx index 14340bf5ad..17eb2a68d1 100644 --- a/public/components/trace_analytics/components/dashboard/mode_picker.tsx +++ b/public/components/trace_analytics/components/dashboard/mode_picker.tsx @@ -50,11 +50,11 @@ export function DataSourcePicker(props: {modes: { closePopover={() => setPopoverIsOpen(false)} className="eui-textTruncate" anchorClassName="eui-textTruncate" - display="block" + display="inlineBlock" panelPaddingSize="s" ownFocus > -
+
{"Choose data type"} diff --git a/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx b/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx index d0a80f4ac5..8ea821f9d0 100644 --- a/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx +++ b/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx @@ -22,8 +22,7 @@ import { import _ from 'lodash'; import React, { useMemo, useState } from 'react'; import { FilterType } from '../common/filters/filters'; - import { calculateTicks, NoMatchMessage, PanelTitle } from '../common/helper_functions'; - import { BoxPlt } from '../common/plots/box_plt'; + import { NoMatchMessage, PanelTitle } from '../common/helper_functions'; import { LatencyTrendCell } from './latency_trend_cell'; export function ErrorRatesTable(props: { @@ -37,7 +36,6 @@ import { loading: boolean; page: 'dashboard' | 'traces' | 'services' | 'app'; }) { - console.log(props.items); const getColumns = () => [ { diff --git a/public/components/trace_analytics/components/dashboard/top_groups_page.tsx b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx index d3544c5831..85f8158396 100644 --- a/public/components/trace_analytics/components/dashboard/top_groups_page.tsx +++ b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx @@ -37,30 +37,26 @@ export function TopGroupsPage( props: { { idSelected === 'error_rate' ? ( - setIdSelected(mode)} idSelected={idSelected} - onChange={(id) => setIdSelected(id as 'error_rate' | 'throughput')} - buttonSize="s" - color="text" + toggleButtons={toggleButtons} /> - - - ) : ( - + - setIdSelected(mode)} idSelected={idSelected} - onChange={(id) => setIdSelected(id as 'error_rate' | 'throughput')} - buttonSize="s" - color="text" + toggleButtons={toggleButtons} /> - - - )} From 90bde2f2ba7fb5ef0c42bad87ecb5d65ad27ad2d Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Wed, 4 Jan 2023 14:29:42 -0500 Subject: [PATCH 47/67] add lisence headers and remove imports and unecessary mode type Signed-off-by: Derek Ho --- .../components/dashboard/mode_picker.tsx | 13 ++++++------- .../components/dashboard/top_groups_page.tsx | 7 ++++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/mode_picker.tsx b/public/components/trace_analytics/components/dashboard/mode_picker.tsx index 17eb2a68d1..930d7a1e66 100644 --- a/public/components/trace_analytics/components/dashboard/mode_picker.tsx +++ b/public/components/trace_analytics/components/dashboard/mode_picker.tsx @@ -1,15 +1,14 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + import { EuiButtonEmpty, EuiPopover, EuiPopoverTitle, EuiSelectable } from "@elastic/eui"; -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import { TraceAnalyticsMode } from "../../home"; -export type mode = { - id: string; - title: string; -} - const labels = new Map([['jaeger', 'Jaeger'], ['data_prepper', 'Data Prepper']]); - export function DataSourcePicker(props: {modes: { id: string; title: string; diff --git a/public/components/trace_analytics/components/dashboard/top_groups_page.tsx b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx index 85f8158396..886da9d1ee 100644 --- a/public/components/trace_analytics/components/dashboard/top_groups_page.tsx +++ b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx @@ -1,4 +1,9 @@ -import { EuiAccordion, EuiButtonGroup, EuiHorizontalRule, EuiPanel, EuiSpacer, EuiTableRow } from '@elastic/eui'; +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { EuiPanel, EuiSpacer } from '@elastic/eui'; import React, { useState } from 'react'; import { FilterType } from '../common/filters/filters'; import { ErrorRatePlt } from '../common/plots/error_rate_plt'; From 324e000085606784d52ff90aefa087ff4535e087 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Wed, 4 Jan 2023 14:53:12 -0500 Subject: [PATCH 48/67] run prettier Signed-off-by: Derek Ho --- .../dashboard/__tests__/dashboard.test.tsx | 4 +- .../dashboard/dashboard_content.tsx | 151 ++-- .../components/dashboard/dashboard_table.tsx | 2 +- .../components/dashboard/mode_picker.tsx | 171 ++-- .../dashboard/top_error_rates_table.tsx | 607 ++++++------- .../components/dashboard/top_groups_page.tsx | 74 +- .../dashboard/top_latency_table.tsx | 818 +++++++++--------- 7 files changed, 941 insertions(+), 886 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx b/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx index edce2d350a..176cb7e2b0 100644 --- a/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx +++ b/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx @@ -49,7 +49,7 @@ describe('Dashboard component', () => { endTime="now" setEndTime={setEndTime} page="dashboard" - mode='data_prepper' + mode="data_prepper" /> ); @@ -92,7 +92,7 @@ describe('Dashboard component', () => { endTime="now" setEndTime={setEndTime} page="dashboard" - mode='data_prepper' + mode="data_prepper" /> ); diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 51da0d73fe..21e2c8904d 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -52,7 +52,7 @@ export function DashboardContent(props: DashboardProps) { setQuery, setFilters, mode, - setMode + setMode, } = props; const [tableItems, setTableItems] = useState([]); const [jaegerTableItems, setJaegerTableItems] = useState([]); @@ -94,9 +94,28 @@ export function DashboardContent(props: DashboardProps) { const refresh = async (currService?: string) => { setLoading(true); - const DSL = filtersToDsl(mode, filters, query, processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); - const timeFilterDSL = filtersToDsl(mode, [], '',processTimeStamp(startTime, mode), processTimeStamp(endTime, mode), page, appConfigs); - const latencyTrendStartTime = dateMath.parse(endTime, { roundUp: true })?.subtract(24, 'hours').toISOString()!; + const DSL = filtersToDsl( + mode, + filters, + query, + processTimeStamp(startTime, mode), + processTimeStamp(endTime, mode), + page, + appConfigs + ); + const timeFilterDSL = filtersToDsl( + mode, + [], + '', + processTimeStamp(startTime, mode), + processTimeStamp(endTime, mode), + page, + appConfigs + ); + const latencyTrendStartTime = dateMath + .parse(endTime, { roundUp: true }) + ?.subtract(24, 'hours') + .toISOString()!; const latencyTrendDSL = filtersToDsl( mode, filters, @@ -107,7 +126,7 @@ export function DashboardContent(props: DashboardProps) { appConfigs ); const fixedInterval = minFixedInterval(startTime, endTime); - if (mode === 'jaeger') { + if (mode === 'jaeger') { handleJaegerDashboardRequest( http, DSL, @@ -116,7 +135,7 @@ export function DashboardContent(props: DashboardProps) { tableItems, setJaegerTableItems, mode, - setPercentileMap, + setPercentileMap ).then(() => setLoading(false)); handleJaegerErrorDashboardRequest( http, @@ -126,7 +145,7 @@ export function DashboardContent(props: DashboardProps) { tableItems, setJaegerErrorTableItems, mode, - setPercentileMap, + setPercentileMap ).then(() => setLoading(false)); } else if (mode === 'data_prepper') { handleDashboardRequest( @@ -137,11 +156,10 @@ export function DashboardContent(props: DashboardProps) { tableItems, setTableItems, mode, - setPercentileMap, + setPercentileMap ).then(() => setLoading(false)); } - handleDashboardThroughputPltRequest( http, DSL, @@ -164,7 +182,13 @@ export function DashboardContent(props: DashboardProps) { serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( (must: any) => must?.term?.serviceName == null ); - handleServiceMapRequest(http, serviceMapDSL, mode, setServiceMap, currService || filteredService); + handleServiceMapRequest( + http, + serviceMapDSL, + mode, + setServiceMap, + currService || filteredService + ); }; const addFilter = (filter: FilterType) => { @@ -224,14 +248,19 @@ export function DashboardContent(props: DashboardProps) { const newFilters = [...filters, percentileFilter, ...additionalFilters]; setFilters(newFilters); }; - - const modes = [{id: 'jaeger', title: 'Jaeger'}, {id: 'data_prepper', title: 'Data Prepper'}] + + const modes = [ + { id: 'jaeger', title: 'Jaeger' }, + { id: 'data_prepper', title: 'Data Prepper' }, + ]; return ( <> - {setMode !== undefined ? - - :
} + {setMode !== undefined ? ( + + ) : ( +
+ )} {mode !== 'none' ? (
- { mode === 'data_prepper' ? ( - <> - - - - - - - - - - - - - - - - - - ) : ( + {mode === 'data_prepper' ? ( + <> + + + + + + + + + + + + + + + + + + + ) : ( - ) - } + )}
- ) : ( + ) : ( )} diff --git a/public/components/trace_analytics/components/dashboard/dashboard_table.tsx b/public/components/trace_analytics/components/dashboard/dashboard_table.tsx index 587fb67370..47063a0387 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_table.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_table.tsx @@ -350,7 +350,7 @@ export function DashboardTable(props: { return ( - + void}) { - const { modes, selectedMode, setMode } = props; - const [isPopoverOpen, setPopoverIsOpen] = useState(false); - const [selected, setSelected] = useState(selectedMode); + }[]; + selectedMode: TraceAnalyticsMode; + setMode: (mode: TraceAnalyticsMode) => void; +}) { + const { modes, selectedMode, setMode } = props; + const [isPopoverOpen, setPopoverIsOpen] = useState(false); + const [selected, setSelected] = useState(selectedMode); - const trigger = { - label: labels.get(selected), - title: selected, - 'data-test-subj': 'indexPattern-switch-link', - className: 'dscIndexPattern__triggerButton', - } - - const createTrigger = () => { - const { label, title, ...rest } = trigger; - return ( - setPopoverIsOpen(!isPopoverOpen)} - {...rest} - > - {label} - - ); - }; + const trigger = { + label: labels.get(selected), + title: selected, + 'data-test-subj': 'indexPattern-switch-link', + className: 'dscIndexPattern__triggerButton', + }; + const createTrigger = () => { + const { label, title, ...rest } = trigger; return ( - <> - setPopoverIsOpen(false)} - className="eui-textTruncate" - anchorClassName="eui-textTruncate" - display="inlineBlock" - panelPaddingSize="s" - ownFocus - > -
- - {"Choose data type"} - - ({ - label: x.title, - key: x.id, - value: x.id, - checked: x.id === selected ? 'on' : undefined, - }))} - onChange={(choices) => { - const choice = (choices.find(({ checked }) => checked) as unknown) as { - value: string; - label: string; - key: TraceAnalyticsMode; - }; - setMode(choice.key); - setSelected(choice.key); - setPopoverIsOpen(false); - sessionStorage.setItem('TraceAnalyticsMode', choice.key); - }} - searchProps={{ - compressed: true, - }} - > - {(list, search) => ( - <> - {search} - {list} - - )} - + setPopoverIsOpen(!isPopoverOpen)} + {...rest} + > + {label} + + ); + }; + + return ( + <> + setPopoverIsOpen(false)} + className="eui-textTruncate" + anchorClassName="eui-textTruncate" + display="inlineBlock" + panelPaddingSize="s" + ownFocus + > +
+ {'Choose data type'} + ({ + label: x.title, + key: x.id, + value: x.id, + checked: x.id === selected ? 'on' : undefined, + }))} + onChange={(choices) => { + const choice = choices.find(({ checked }) => checked) as unknown as { + value: string; + label: string; + key: TraceAnalyticsMode; + }; + setMode(choice.key); + setSelected(choice.key); + setPopoverIsOpen(false); + sessionStorage.setItem('TraceAnalyticsMode', choice.key); + }} + searchProps={{ + compressed: true, + }} + > + {(list, search) => ( + <> + {search} + {list} + + )} +
-
- - ); -} \ No newline at end of file + + + ); +} diff --git a/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx b/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx index 8ea821f9d0..04977cc313 100644 --- a/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx +++ b/public/components/trace_analytics/components/dashboard/top_error_rates_table.tsx @@ -4,320 +4,327 @@ */ import { - EuiFlexGroup, - EuiFlexItem, - EuiHorizontalRule, - EuiI18nNumber, - EuiIcon, - EuiInMemoryTable, - EuiLink, - EuiPanel, - EuiSpacer, - EuiTableFieldDataColumnType, - EuiText, - EuiToolTip, - PropertySort, - } from '@elastic/eui'; - import { CriteriaWithPagination } from '@elastic/eui/src/components/basic_table/basic_table'; - import _ from 'lodash'; - import React, { useMemo, useState } from 'react'; - import { FilterType } from '../common/filters/filters'; - import { NoMatchMessage, PanelTitle } from '../common/helper_functions'; - import { LatencyTrendCell } from './latency_trend_cell'; - - export function ErrorRatesTable(props: { - title?: string; - items: any[]; - filters: FilterType[]; - addFilter: (filter: FilterType) => void; - addFilters: (filter: FilterType[]) => void; - addPercentileFilter: (condition?: 'gte' | 'lte', additionalFilters?: FilterType[]) => void; - setRedirect: (redirect: boolean) => void; - loading: boolean; - page: 'dashboard' | 'traces' | 'services' | 'app'; - }) { - const getColumns = () => - [ - { - field: 'dashboard_trace_group_name', - name: ( - - Traces of all requests that share a common API and operation at the start of - distributed tracing instrumentation. - - } - > - <> -
- Service and Operation Name{' '} - -
-
 
- -
- ), - align: 'left', - sortable: true, - render: (item) => - item ? ( - { - props.addFilters([{ - field: 'process.serviceName', - operator: 'is', - value: item[0], - inverted: false, - disabled: false, - },{ - field: 'operationName', - operator: 'is', - value: item[1], - inverted: false, - disabled: false, - }]); - } - } - > - {item.length < 48 ? ( - decodeURI(item) - ) : ( -
{_.truncate(decodeURI(item), { length: 48 })}
- )} -
- ) : ( - '-' - ), - }, - { - field: 'dashboard_average_latency', - name: ( - - Average latency of traces within a trace group in the selected time range. - - } - > - <> - {/*
Average
*/} -
- Average latency (ms){' '} - -
-
 
- -
- ), - align: 'right', - sortable: true, - dataType: 'number', - render: (item) => (item === 0 || item ? _.round(item, 2) : '-'), - }, - { - field: '24_hour_error_trend', - name: ( - - 24 hour time series view of hourly average, hourly percentile, and hourly range of - error rates for traces within a trace group. - - } - > - <> - {/*
24-hour
*/} -
- 24-hour error rate trend{' '} - -
-
 
- -
- ), - align: 'right', - sortable: false, - render: (item, row) => - item ? ( - - ) : ( - '-' - ), - }, - { - field: 'dashboard_error_rate', - name: ( - - Error rate based on count of trace errors within a trace group in the selected time - range. - - } - > - <> -
- Error rate{' '} - -
-
 
- -
- ), - align: 'right', - sortable: true, - render: (item) => - item === 0 || item ? {`${_.round(item, 2)}%`} : '-', - }, - { - field: 'dashboard_traces', - name: ( - - Count of traces with unique trace identifiers in the selected time range. - - } - > - <> -
- Traces{' '} - -
-
 
- -
- ), - align: 'right', - sortable: true, - render: (item, row) => ( + EuiFlexGroup, + EuiFlexItem, + EuiHorizontalRule, + EuiI18nNumber, + EuiIcon, + EuiInMemoryTable, + EuiLink, + EuiPanel, + EuiSpacer, + EuiTableFieldDataColumnType, + EuiText, + EuiToolTip, + PropertySort, +} from '@elastic/eui'; +import { CriteriaWithPagination } from '@elastic/eui/src/components/basic_table/basic_table'; +import _ from 'lodash'; +import React, { useMemo, useState } from 'react'; +import { FilterType } from '../common/filters/filters'; +import { NoMatchMessage, PanelTitle } from '../common/helper_functions'; +import { LatencyTrendCell } from './latency_trend_cell'; + +export function ErrorRatesTable(props: { + title?: string; + items: any[]; + filters: FilterType[]; + addFilter: (filter: FilterType) => void; + addFilters: (filter: FilterType[]) => void; + addPercentileFilter: (condition?: 'gte' | 'lte', additionalFilters?: FilterType[]) => void; + setRedirect: (redirect: boolean) => void; + loading: boolean; + page: 'dashboard' | 'traces' | 'services' | 'app'; +}) { + const getColumns = () => + [ + { + field: 'dashboard_trace_group_name', + name: ( + + Traces of all requests that share a common API and operation at the start of + distributed tracing instrumentation. + + } + > + <> +
+ Service and Operation Name{' '} + +
+
 
+ +
+ ), + align: 'left', + sortable: true, + render: (item) => + item ? ( { - props.addFilters([{ - field: 'process.serviceName', - operator: 'is', - value: row.dashboard_trace_group_name[0], - inverted: false, - disabled: false, - },{ + props.addFilters([ + { + field: 'process.serviceName', + operator: 'is', + value: item[0], + inverted: false, + disabled: false, + }, + { field: 'operationName', operator: 'is', - value: row.dashboard_trace_group_name[1], + value: item[1], inverted: false, disabled: false, - }]); - if (props.page !== 'app') { - props.setRedirect(true); - location.assign('#/trace_analytics/traces'); - } + }, + ]); }} > - + {item.length < 48 ? ( + decodeURI(item) + ) : ( +
{_.truncate(decodeURI(item), { length: 48 })}
+ )}
+ ) : ( + '-' ), - }, - ] as Array>; - - const renderTitleBar = (totalItems: number) => { - return ( - - - - - - props.addPercentileFilter('lte')} - > + }, + { + field: 'dashboard_average_latency', + name: ( + - < 95 percentile + Average latency of traces within a trace group in the selected time range. - - - - - props.addPercentileFilter('gte')} - > + } + > + <> + {/*
Average
*/} +
+ Average latency (ms){' '} + +
+
 
+ + + ), + align: 'right', + sortable: true, + dataType: 'number', + render: (item) => (item === 0 || item ? _.round(item, 2) : '-'), + }, + { + field: '24_hour_error_trend', + name: ( + - >= 95 percentile + 24 hour time series view of hourly average, hourly percentile, and hourly range of + error rates for traces within a trace group. -
-
- -
- ); - }; - - const columns = useMemo(() => getColumns(), [props.items, props.filters]); - const titleBar = useMemo(() => renderTitleBar(props.items?.filter((item) => item.dashboard_error_rate > 0).length), [props.items]); - - const [sorting, setSorting] = useState<{ sort: PropertySort }>({ - sort: { - field: 'dashboard_latency_variance', - direction: 'desc', + } + > + <> + {/*
24-hour
*/} +
+ 24-hour error rate trend{' '} + +
+
 
+ + + ), + align: 'right', + sortable: false, + render: (item, row) => + item ? ( + + ) : ( + '-' + ), }, - }); - - const onTableChange = async ({ page, sort }: CriteriaWithPagination) => { - if (typeof sort?.field !== 'string') return; - setSorting({ sort } as { sort: PropertySort }); - }; - + { + field: 'dashboard_error_rate', + name: ( + + Error rate based on count of trace errors within a trace group in the selected time + range. + + } + > + <> +
+ Error rate{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + render: (item) => + item === 0 || item ? {`${_.round(item, 2)}%`} : '-', + }, + { + field: 'dashboard_traces', + name: ( + + Count of traces with unique trace identifiers in the selected time range. + + } + > + <> +
+ Traces{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + render: (item, row) => ( + { + props.addFilters([ + { + field: 'process.serviceName', + operator: 'is', + value: row.dashboard_trace_group_name[0], + inverted: false, + disabled: false, + }, + { + field: 'operationName', + operator: 'is', + value: row.dashboard_trace_group_name[1], + inverted: false, + disabled: false, + }, + ]); + if (props.page !== 'app') { + props.setRedirect(true); + location.assign('#/trace_analytics/traces'); + } + }} + > + + + ), + }, + ] as Array>; + + const renderTitleBar = (totalItems: number) => { return ( - <> - - {titleBar} - - - {props.items?.length > 0 ? ( - item.dashboard_error_rate > 0)} - columns={columns} - pagination={{ - initialPageSize: 10, - pageSizeOptions: [5, 10, 15], - }} - sorting={sorting} - onTableChange={onTableChange} - loading={props.loading} - /> - ) : ( - - )} - - + + + + + + props.addPercentileFilter('lte')} + > + + < 95 percentile + + + + + + props.addPercentileFilter('gte')} + > + + >= 95 percentile + + + + + ); - } - \ No newline at end of file + }; + + const columns = useMemo(() => getColumns(), [props.items, props.filters]); + const titleBar = useMemo( + () => renderTitleBar(props.items?.filter((item) => item.dashboard_error_rate > 0).length), + [props.items] + ); + + const [sorting, setSorting] = useState<{ sort: PropertySort }>({ + sort: { + field: 'dashboard_latency_variance', + direction: 'desc', + }, + }); + + const onTableChange = async ({ page, sort }: CriteriaWithPagination) => { + if (typeof sort?.field !== 'string') return; + setSorting({ sort } as { sort: PropertySort }); + }; + + return ( + <> + + {titleBar} + + + {props.items?.length > 0 ? ( + item.dashboard_error_rate > 0)} + columns={columns} + pagination={{ + initialPageSize: 10, + pageSizeOptions: [5, 10, 15], + }} + sorting={sorting} + onTableChange={onTableChange} + loading={props.loading} + /> + ) : ( + + )} + + + ); +} diff --git a/public/components/trace_analytics/components/dashboard/top_groups_page.tsx b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx index 886da9d1ee..4bb1eda0ec 100644 --- a/public/components/trace_analytics/components/dashboard/top_groups_page.tsx +++ b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx @@ -11,21 +11,21 @@ import { ThroughputPlt } from '../common/plots/throughput_plt'; import { ErrorRatesTable } from './top_error_rates_table'; import { LatencyTable } from './top_latency_table'; -export function TopGroupsPage( props: { - filters: FilterType[], - addFilter: (filter: FilterType) => void, - addFilters: (filter: FilterType[]) => void, - addPercentileFilter: (condition?: 'gte' | 'lte', additionalFilters?: FilterType[]) => void, - setRedirect: (redirect: boolean) => void, - loading: boolean, - page: 'dashboard' | 'traces' | 'services' | 'app', - throughPutItems: { items: any[]; fixedInterval: string }, - jaegerErrorRatePltItems: {items: any[]; fixedInterval: string}, - jaegerErrorTableItems: any[], - jaegerTableItems: any[], - setStartTime: (time: string) => void, - setEndTime: (time: string) => void, -} ) { +export function TopGroupsPage(props: { + filters: FilterType[]; + addFilter: (filter: FilterType) => void; + addFilters: (filter: FilterType[]) => void; + addPercentileFilter: (condition?: 'gte' | 'lte', additionalFilters?: FilterType[]) => void; + setRedirect: (redirect: boolean) => void; + loading: boolean; + page: 'dashboard' | 'traces' | 'services' | 'app'; + throughPutItems: { items: any[]; fixedInterval: string }; + jaegerErrorRatePltItems: { items: any[]; fixedInterval: string }; + jaegerErrorTableItems: any[]; + jaegerTableItems: any[]; + setStartTime: (time: string) => void; + setEndTime: (time: string) => void; +}) { const toggleButtons = [ { id: 'error_rate', @@ -36,34 +36,44 @@ export function TopGroupsPage( props: { label: 'Throughput', }, ]; - const [idSelected, setIdSelected] = useState('error_rate') - return ( - <> - { idSelected === 'error_rate' ? ( + const [idSelected, setIdSelected] = useState('error_rate'); + return ( + <> + {idSelected === 'error_rate' ? ( - setIdSelected(mode)} idSelected={idSelected} toggleButtons={toggleButtons} /> - - ) : ( + + + ) : ( - setIdSelected(mode)} idSelected={idSelected} toggleButtons={toggleButtons} /> - - )} - - ) - } \ No newline at end of file + + + )} + + ); +} diff --git a/public/components/trace_analytics/components/dashboard/top_latency_table.tsx b/public/components/trace_analytics/components/dashboard/top_latency_table.tsx index 9f594ac923..2919763c21 100644 --- a/public/components/trace_analytics/components/dashboard/top_latency_table.tsx +++ b/public/components/trace_analytics/components/dashboard/top_latency_table.tsx @@ -4,435 +4,439 @@ */ import { - EuiFlexGroup, - EuiFlexItem, - EuiHorizontalRule, - EuiI18nNumber, - EuiIcon, - EuiInMemoryTable, - EuiLink, - EuiPanel, - EuiSpacer, - EuiTableFieldDataColumnType, - EuiText, - EuiToolTip, - PropertySort, - } from '@elastic/eui'; - import { CriteriaWithPagination } from '@elastic/eui/src/components/basic_table/basic_table'; - import _ from 'lodash'; - import React, { useMemo, useState } from 'react'; - import { FilterType } from '../common/filters/filters'; - import { calculateTicks, NoMatchMessage, PanelTitle } from '../common/helper_functions'; - import { BoxPlt } from '../common/plots/box_plt'; - import { LatencyTrendCell } from './latency_trend_cell'; - - export function LatencyTable(props: { - title?: string; - items: any[]; - filters: FilterType[]; - addFilter: (filter: FilterType) => void; - addFilters: (filter: FilterType[]) => void; - addPercentileFilter: (condition?: 'gte' | 'lte', additionalFilters?: FilterType[]) => void; - setRedirect: (redirect: boolean) => void; - loading: boolean; - page: 'dashboard' | 'traces' | 'services' | 'app'; - }) { - const getVarianceProps = (items: any[]) => { - if (items.length === 0) { - return { minRange: 0, maxRange: 0, ticks: [0, 0], scale: '' }; - } - const variances = [].concat( - ...items - .filter((item) => item.dashboard_latency_variance) - .map((item) => item.dashboard_latency_variance) - ); - const minRange = Math.min(...variances); - const maxRange = Math.max(...variances); - const ticks = calculateTicks(minRange, maxRange); - - const maxDigits = ticks[ticks.length - 1].toString().length; - - // pads spaces (\u00A0) in between ticks to construct a scale - // width of a character equals the width of two spaces, maximum 39 characters in a scale - const scale = ticks - .map((tick) => { - const tickStr = tick.toString(); - return tickStr.padEnd(tickStr.length + 2 * (maxDigits - tickStr.length), '\u00A0'); - }) - .join( - '\u00A0'.repeat( - Math.max( - 1, - Math.floor((2 * (39 - ticks.length * maxDigits)) / Math.max(1, ticks.length - 1)) - ) + EuiFlexGroup, + EuiFlexItem, + EuiHorizontalRule, + EuiI18nNumber, + EuiIcon, + EuiInMemoryTable, + EuiLink, + EuiPanel, + EuiSpacer, + EuiTableFieldDataColumnType, + EuiText, + EuiToolTip, + PropertySort, +} from '@elastic/eui'; +import { CriteriaWithPagination } from '@elastic/eui/src/components/basic_table/basic_table'; +import _ from 'lodash'; +import React, { useMemo, useState } from 'react'; +import { FilterType } from '../common/filters/filters'; +import { calculateTicks, NoMatchMessage, PanelTitle } from '../common/helper_functions'; +import { BoxPlt } from '../common/plots/box_plt'; +import { LatencyTrendCell } from './latency_trend_cell'; + +export function LatencyTable(props: { + title?: string; + items: any[]; + filters: FilterType[]; + addFilter: (filter: FilterType) => void; + addFilters: (filter: FilterType[]) => void; + addPercentileFilter: (condition?: 'gte' | 'lte', additionalFilters?: FilterType[]) => void; + setRedirect: (redirect: boolean) => void; + loading: boolean; + page: 'dashboard' | 'traces' | 'services' | 'app'; +}) { + const getVarianceProps = (items: any[]) => { + if (items.length === 0) { + return { minRange: 0, maxRange: 0, ticks: [0, 0], scale: '' }; + } + const variances = [].concat( + ...items + .filter((item) => item.dashboard_latency_variance) + .map((item) => item.dashboard_latency_variance) + ); + const minRange = Math.min(...variances); + const maxRange = Math.max(...variances); + const ticks = calculateTicks(minRange, maxRange); + + const maxDigits = ticks[ticks.length - 1].toString().length; + + // pads spaces (\u00A0) in between ticks to construct a scale + // width of a character equals the width of two spaces, maximum 39 characters in a scale + const scale = ticks + .map((tick) => { + const tickStr = tick.toString(); + return tickStr.padEnd(tickStr.length + 2 * (maxDigits - tickStr.length), '\u00A0'); + }) + .join( + '\u00A0'.repeat( + Math.max( + 1, + Math.floor((2 * (39 - ticks.length * maxDigits)) / Math.max(1, ticks.length - 1)) ) - ); - - return { minRange, maxRange, ticks, scale }; - }; - - const getColumns = () => - [ - { - field: 'dashboard_trace_group_name', - name: ( - - Traces of all requests that share a common API and operation at the start of - distributed tracing instrumentation. - - } - > - <> -
- Service and Operation Name{' '} - -
-
 
- -
- ), - align: 'left', - sortable: true, - render: (item) => - item ? ( - { - props.addFilters([{ - field: 'process.serviceName', - operator: 'is', - value: item[0], - inverted: false, - disabled: false, - },{ - field: 'operationName', - operator: 'is', - value: item[1], - inverted: false, - disabled: false, - }]); - } - } - > - {item.length < 48 ? ( - decodeURI(item) - ) : ( -
{_.truncate(decodeURI(item), { length: 48 })}
- )} -
- ) : ( - '-' - ), - }, - { - field: 'dashboard_latency_variance', - name: ( + ) + ); + + return { minRange, maxRange, ticks, scale }; + }; + + const getColumns = () => + [ + { + field: 'dashboard_trace_group_name', + name: ( + + Traces of all requests that share a common API and operation at the start of + distributed tracing instrumentation. + + } + > <> - - Range of latencies for traces within a trace group in the selected time range. - - } - > - - Latency variance (ms){' '} - - - - {varianceProps && ( - - {varianceProps.scale} - - )} +
+ Service and Operation Name{' '} + +
+
 
- ), - align: 'center', - sortable: ({ dashboard_latency_variance }) => - dashboard_latency_variance?.length > 0 - ? dashboard_latency_variance[2] - dashboard_latency_variance[0] - : 0, - width: '300px', - render: (item, row) => { - const filter = props.filters.find( - (f) => f.field === 'Latency percentile within trace group' - ); - const currPercentileFilter = filter ? filter.value : ''; - return item ? ( - // expand plot ranges to accommodate scale - 1 - ? varianceProps.ticks[0] - : varianceProps.ticks[0] / 1.03, - max: varianceProps.ticks[varianceProps.ticks.length - 1] * 1.03, - left: item[0], - mid: item[1], - right: item[2], - currPercentileFilter, - addFilter: (condition?: 'lte' | 'gte') => { - const traceGroupFilter = { - field: 'traceGroup', - operator: 'is', - value: row.dashboard_trace_group_name, - inverted: false, - disabled: false, - }; - const additionalFilters = [traceGroupFilter]; - for (const addedFilter of props.filters) { - if ( - addedFilter.field === traceGroupFilter.field && - addedFilter.operator === traceGroupFilter.operator && - addedFilter.value === traceGroupFilter.value - ) { - additionalFilters.pop(); - } - } - props.addPercentileFilter(condition, additionalFilters); +
+ ), + align: 'left', + sortable: true, + render: (item) => + item ? ( + { + props.addFilters([ + { + field: 'process.serviceName', + operator: 'is', + value: item[0], + inverted: false, + disabled: false, }, - }} - /> - ) : ( - '-' - ); - }, - }, - { - field: 'dashboard_average_latency', - name: ( - - Average latency of traces within a trace group in the selected time range. - - } - > - <> - {/*
Average
*/} -
- Average latency (ms){' '} - -
-
 
- -
- ), - align: 'right', - sortable: true, - dataType: 'number', - render: (item) => (item === 0 || item ? _.round(item, 2) : '-'), - }, - { - field: '24_hour_latency_trend', - name: ( - - 24 hour time series view of hourly average, hourly percentile, and hourly range of - latency for traces within a trace group. - - } - > - <> - {/*
24-hour
*/} -
- 24-hour latency trend{' '} - -
-
 
- -
- ), - align: 'right', - sortable: false, - render: (item, row) => - item ? ( - - ) : ( - '-' - ), - }, - { - field: 'dashboard_error_rate', - name: ( - - Error rate based on count of trace errors within a trace group in the selected time - range. - - } + { + field: 'operationName', + operator: 'is', + value: item[1], + inverted: false, + disabled: false, + }, + ]); + }} > - <> -
- Error rate{' '} - -
-
 
- -
+ {item.length < 48 ? ( + decodeURI(item) + ) : ( +
{_.truncate(decodeURI(item), { length: 48 })}
+ )} +
+ ) : ( + '-' ), - align: 'right', - sortable: true, - render: (item) => - item === 0 || item ? {`${_.round(item, 2)}%`} : '-', - }, - { - field: 'dashboard_traces', - name: ( + }, + { + field: 'dashboard_latency_variance', + name: ( + <> - Count of traces with unique trace identifiers in the selected time range. + Range of latencies for traces within a trace group in the selected time range. } > - <> -
- Traces{' '} - -
-
 
- + + Latency variance (ms){' '} + +
- ), - align: 'right', - sortable: true, - render: (item, row) => ( - { - props.addFilters([{ - field: 'process.serviceName', - operator: 'is', - value: row.dashboard_trace_group_name[0], - inverted: false, - disabled: false, - },{ - field: 'operationName', + {varianceProps && ( + + {varianceProps.scale} + + )} + + ), + align: 'center', + sortable: ({ dashboard_latency_variance }) => + dashboard_latency_variance?.length > 0 + ? dashboard_latency_variance[2] - dashboard_latency_variance[0] + : 0, + width: '300px', + render: (item, row) => { + const filter = props.filters.find( + (f) => f.field === 'Latency percentile within trace group' + ); + const currPercentileFilter = filter ? filter.value : ''; + return item ? ( + // expand plot ranges to accommodate scale + 1 + ? varianceProps.ticks[0] + : varianceProps.ticks[0] / 1.03, + max: varianceProps.ticks[varianceProps.ticks.length - 1] * 1.03, + left: item[0], + mid: item[1], + right: item[2], + currPercentileFilter, + addFilter: (condition?: 'lte' | 'gte') => { + const traceGroupFilter = { + field: 'traceGroup', operator: 'is', - value: row.dashboard_trace_group_name[1], + value: row.dashboard_trace_group_name, inverted: false, disabled: false, - }]); - if (props.page !== 'app') { - props.setRedirect(true); - location.assign('#/trace_analytics/traces'); - } + }; + const additionalFilters = [traceGroupFilter]; + for (const addedFilter of props.filters) { + if ( + addedFilter.field === traceGroupFilter.field && + addedFilter.operator === traceGroupFilter.operator && + addedFilter.value === traceGroupFilter.value + ) { + additionalFilters.pop(); + } + } + props.addPercentileFilter(condition, additionalFilters); + }, }} - > - - - ), + /> + ) : ( + '-' + ); }, - ] as Array>; - - const renderTitleBar = (totalItems: number) => { - return ( - - - - - - props.addPercentileFilter('lte')} - > + }, + { + field: 'dashboard_average_latency', + name: ( + - < 95 percentile + Average latency of traces within a trace group in the selected time range. - - - - - props.addPercentileFilter('gte')} - > + } + > + <> + {/*
Average
*/} +
+ Average latency (ms){' '} + +
+
 
+ + + ), + align: 'right', + sortable: true, + dataType: 'number', + render: (item) => (item === 0 || item ? _.round(item, 2) : '-'), + }, + { + field: '24_hour_latency_trend', + name: ( + - >= 95 percentile + 24 hour time series view of hourly average, hourly percentile, and hourly range of + latency for traces within a trace group. -
-
- -
- ); - }; - - const varianceProps = useMemo(() => getVarianceProps(props.items), [props.items]); - const columns = useMemo(() => getColumns(), [props.items, props.filters]); - const titleBar = useMemo(() => renderTitleBar(props.items?.length), [props.items]); - - const [sorting, setSorting] = useState<{ sort: PropertySort }>({ - sort: { - field: 'dashboard_latency_variance', - direction: 'desc', + } + > + <> + {/*
24-hour
*/} +
+ 24-hour latency trend{' '} + +
+
 
+ + + ), + align: 'right', + sortable: false, + render: (item, row) => + item ? ( + + ) : ( + '-' + ), + }, + { + field: 'dashboard_error_rate', + name: ( + + Error rate based on count of trace errors within a trace group in the selected time + range. + + } + > + <> +
+ Error rate{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + render: (item) => + item === 0 || item ? {`${_.round(item, 2)}%`} : '-', }, - }); - - const onTableChange = async ({ page, sort }: CriteriaWithPagination) => { - if (typeof sort?.field !== 'string') return; - setSorting({ sort } as { sort: PropertySort }); - }; - + { + field: 'dashboard_traces', + name: ( + + Count of traces with unique trace identifiers in the selected time range. + + } + > + <> +
+ Traces{' '} + +
+
 
+ +
+ ), + align: 'right', + sortable: true, + render: (item, row) => ( + { + props.addFilters([ + { + field: 'process.serviceName', + operator: 'is', + value: row.dashboard_trace_group_name[0], + inverted: false, + disabled: false, + }, + { + field: 'operationName', + operator: 'is', + value: row.dashboard_trace_group_name[1], + inverted: false, + disabled: false, + }, + ]); + if (props.page !== 'app') { + props.setRedirect(true); + location.assign('#/trace_analytics/traces'); + } + }} + > + + + ), + }, + ] as Array>; + + const renderTitleBar = (totalItems: number) => { return ( - <> - - {titleBar} - - - {props.items?.length > 0 ? ( - - ) : ( - - )} - - + + + + + + props.addPercentileFilter('lte')} + > + + < 95 percentile + + + + + + props.addPercentileFilter('gte')} + > + + >= 95 percentile + + + + + ); - } - \ No newline at end of file + }; + + const varianceProps = useMemo(() => getVarianceProps(props.items), [props.items]); + const columns = useMemo(() => getColumns(), [props.items, props.filters]); + const titleBar = useMemo(() => renderTitleBar(props.items?.length), [props.items]); + + const [sorting, setSorting] = useState<{ sort: PropertySort }>({ + sort: { + field: 'dashboard_latency_variance', + direction: 'desc', + }, + }); + + const onTableChange = async ({ page, sort }: CriteriaWithPagination) => { + if (typeof sort?.field !== 'string') return; + setSorting({ sort } as { sort: PropertySort }); + }; + + return ( + <> + + {titleBar} + + + {props.items?.length > 0 ? ( + + ) : ( + + )} + + + ); +} From 2321b2459e60e61d5ae298fddcdd0e38b5d9413f Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 5 Jan 2023 15:45:24 -0500 Subject: [PATCH 49/67] add it to all pages Signed-off-by: Derek Ho --- .../components/dashboard/dashboard.tsx | 3 ++- .../dashboard/dashboard_content.tsx | 11 -------- .../dashboard/top_error_rates_table.tsx | 26 ++----------------- .../components/dashboard/top_groups_page.tsx | 15 +++++------ .../dashboard/top_latency_table.tsx | 4 +-- .../components/services/services.tsx | 2 ++ .../components/traces/traces.tsx | 2 ++ public/components/trace_analytics/home.tsx | 14 +++++++++- 8 files changed, 30 insertions(+), 47 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/dashboard.tsx b/public/components/trace_analytics/components/dashboard/dashboard.tsx index 8c248b0eb4..e8fcbbe0c0 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard.tsx @@ -7,11 +7,11 @@ import { EuiBreadcrumb, EuiTitle } from '@elastic/eui'; import React from 'react'; import { TraceAnalyticsComponentDeps, TraceAnalyticsMode } from '../../home'; import { DashboardContent } from './dashboard_content'; +import { DataSourcePicker } from './mode_picker'; export interface DashboardProps extends TraceAnalyticsComponentDeps { childBreadcrumbs: EuiBreadcrumb[]; page: 'dashboard' | 'app'; - setMode?: (mode: TraceAnalyticsMode) => void; } export function Dashboard(props: DashboardProps) { @@ -20,6 +20,7 @@ export function Dashboard(props: DashboardProps) {

Dashboard

+ ); diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 21e2c8904d..1bd7302f7c 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -52,7 +52,6 @@ export function DashboardContent(props: DashboardProps) { setQuery, setFilters, mode, - setMode, } = props; const [tableItems, setTableItems] = useState([]); const [jaegerTableItems, setJaegerTableItems] = useState([]); @@ -249,18 +248,8 @@ export function DashboardContent(props: DashboardProps) { setFilters(newFilters); }; - const modes = [ - { id: 'jaeger', title: 'Jaeger' }, - { id: 'data_prepper', title: 'Data Prepper' }, - ]; - return ( <> - {setMode !== undefined ? ( - - ) : ( -
- )} - - props.addPercentileFilter('lte')} - > - - < 95 percentile - - - - - - props.addPercentileFilter('gte')} - > - - >= 95 percentile - - - - ); }; @@ -314,8 +292,8 @@ export function ErrorRatesTable(props: { items={props.items.filter((item) => item.dashboard_error_rate > 0)} columns={columns} pagination={{ - initialPageSize: 10, - pageSizeOptions: [5, 10, 15], + initialPageSize: 5, + pageSizeOptions: [5], }} sorting={sorting} onTableChange={onTableChange} diff --git a/public/components/trace_analytics/components/dashboard/top_groups_page.tsx b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx index 4bb1eda0ec..94e815c131 100644 --- a/public/components/trace_analytics/components/dashboard/top_groups_page.tsx +++ b/public/components/trace_analytics/components/dashboard/top_groups_page.tsx @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { EuiPanel, EuiSpacer } from '@elastic/eui'; +import { EuiSpacer } from '@elastic/eui'; import React, { useState } from 'react'; import { FilterType } from '../common/filters/filters'; import { ErrorRatePlt } from '../common/plots/error_rate_plt'; @@ -40,7 +40,7 @@ export function TopGroupsPage(props: { return ( <> {idSelected === 'error_rate' ? ( - + <> - + ) : ( - - + <> - + )} ); diff --git a/public/components/trace_analytics/components/dashboard/top_latency_table.tsx b/public/components/trace_analytics/components/dashboard/top_latency_table.tsx index 2919763c21..6bbe97546c 100644 --- a/public/components/trace_analytics/components/dashboard/top_latency_table.tsx +++ b/public/components/trace_analytics/components/dashboard/top_latency_table.tsx @@ -426,8 +426,8 @@ export function LatencyTable(props: { items={props.items} columns={columns} pagination={{ - initialPageSize: 10, - pageSizeOptions: [5, 10, 15], + initialPageSize: 5, + pageSizeOptions: [5], }} sorting={sorting} onTableChange={onTableChange} diff --git a/public/components/trace_analytics/components/services/services.tsx b/public/components/trace_analytics/components/services/services.tsx index 04c6bad2f9..d1a6cbe2a3 100644 --- a/public/components/trace_analytics/components/services/services.tsx +++ b/public/components/trace_analytics/components/services/services.tsx @@ -7,6 +7,7 @@ import { EuiBreadcrumb, EuiTitle } from '@elastic/eui'; import _ from 'lodash'; import React from 'react'; import { TraceAnalyticsComponentDeps } from '../../home'; +import { DataSourcePicker } from '../dashboard/mode_picker'; import { ServicesContent } from './services_content'; export interface ServicesProps extends TraceAnalyticsComponentDeps { @@ -22,6 +23,7 @@ export function Services(props: ServicesProps) {

Services

+ ); diff --git a/public/components/trace_analytics/components/traces/traces.tsx b/public/components/trace_analytics/components/traces/traces.tsx index 9fc2b262d6..566955f160 100644 --- a/public/components/trace_analytics/components/traces/traces.tsx +++ b/public/components/trace_analytics/components/traces/traces.tsx @@ -6,6 +6,7 @@ import { EuiBreadcrumb, EuiTitle } from '@elastic/eui'; import React from 'react'; import { TraceAnalyticsComponentDeps } from '../../home'; +import { DataSourcePicker } from '../dashboard/mode_picker'; import { TracesContent } from './traces_content'; export interface TracesProps extends TraceAnalyticsComponentDeps { @@ -20,6 +21,7 @@ export function Traces(props: TracesProps) {

Traces

+ ); diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index 912cd6b523..daed7cc376 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -30,6 +30,11 @@ export type TraceAnalyticsMode = 'jaeger' | 'data_prepper' | 'none' export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, SearchBarProps { mode: TraceAnalyticsMode; + modes: { + id: string; + title: string; + }[]; + setMode: (mode: TraceAnalyticsMode) => void } export const Home = (props: HomeProps) => { @@ -70,6 +75,11 @@ export const Home = (props: HomeProps) => { handleJaegerIndicesExistRequest(props.http, setJaegerIndicesExist); }, []); + const modes = [ + { id: 'jaeger', title: 'Jaeger' }, + { id: 'data_prepper', title: 'Data Prepper' }, + ]; + // useEffect(() => { // if (dataPrepperIndicesExist) { // setMode('data_prepper'); @@ -135,6 +145,8 @@ export const Home = (props: HomeProps) => { endTime, setEndTime: setEndTimeWithStorage, mode, + modes, + setMode: (mode: TraceAnalyticsMode) => {setMode(mode)} }; return ( @@ -144,7 +156,7 @@ export const Home = (props: HomeProps) => { path={['/trace_analytics', '/trace_analytics/home']} render={(routerProps) => ( - {setMode(mode)}} {...commonProps} /> + )} /> From cce65048d79d291b462c6eeb703ed739a0b0712a Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Thu, 5 Jan 2023 15:58:42 -0500 Subject: [PATCH 50/67] some pr fixes Signed-off-by: Derek Ho --- common/constants/trace_analytics.ts | 2 +- .../trace_analytics/components/common/helper_functions.tsx | 7 ++++--- .../components/common/plots/error_rate_plt.tsx | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/common/constants/trace_analytics.ts b/common/constants/trace_analytics.ts index cce82380bb..e1ea188715 100644 --- a/common/constants/trace_analytics.ts +++ b/common/constants/trace_analytics.ts @@ -15,6 +15,6 @@ export const SERVICE_MAP_MAX_EDGES = 1000; export const TRACES_MAX_NUM = 3000; export const TRACE_ANALYTICS_DOCUMENTATION_LINK = 'https://opensearch.org/docs/latest/observability-plugin/trace/index/'; -export const TRACE_ANALYTICS_JAEGER_INDICES_ROUTE = '/api/observability/trace_analytics/jaegerindices'; +export const TRACE_ANALYTICS_JAEGER_INDICES_ROUTE = '/api/observability/trace_analytics/jaeger_indices'; export const TRACE_ANALYTICS_DATA_PREPPER_INDICES_ROUTE = '/api/observability/trace_analytics/data_prepper_indices'; export const TRACE_ANALYTICS_DSL_ROUTE = '/api/observability/trace_analytics/query'; diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index 7ceda68432..25b6de60c5 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -76,6 +76,7 @@ export function MissingConfigurationMessage() { ); } +// Processes time (like 'now-5y') to microseconds for jaeger since this is how they store the start time. Otherwise leave it the same. export function processTimeStamp(time: string, mode: TraceAnalyticsMode) { if (mode === 'jaeger') { const timeMoment = dateMath.parse(time)!; @@ -100,9 +101,9 @@ export function nanoToMilliSec(nano: number) { return nano / 1000000; } -export function microToMilliSec(nano: number) { - if (typeof nano !== 'number') return 0; - return nano / 1000; +export function microToMilliSec(micro: number) { + if (typeof micro !== 'number') return 0; + return micro / 1000; } export function milliToMicroSec(ms: number) { diff --git a/public/components/trace_analytics/components/common/plots/error_rate_plt.tsx b/public/components/trace_analytics/components/common/plots/error_rate_plt.tsx index 247ba2efa3..0ef040529e 100644 --- a/public/components/trace_analytics/components/common/plots/error_rate_plt.tsx +++ b/public/components/trace_analytics/components/common/plots/error_rate_plt.tsx @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { EuiButtonGroup, EuiHorizontalRule, EuiPanel, EuiFlexGroup, EuiSpacer } from '@elastic/eui'; +import { EuiButtonGroup, EuiHorizontalRule, EuiPanel, EuiFlexGroup, EuiSpacer, EuiButtonGroupOptionProps } from '@elastic/eui'; import moment from 'moment'; import React, { useMemo, useState } from 'react'; import { Plt } from '../../../../visualizations/plotly/plot'; @@ -20,7 +20,7 @@ export function ErrorRatePlt(props: { setEndTime: (endTime: string) => void; setIdSelected: (mode: string) => void; idSelected: string; - toggleButtons: any[]; + toggleButtons: EuiButtonGroupOptionProps[]; }) { const getLayout = () => ({ From 390e77fb4e042b756551c48c3fbd1ebec1241566 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 6 Jan 2023 12:11:47 -0500 Subject: [PATCH 51/67] pushing work Signed-off-by: Derek Ho --- .../__tests__/helper_functions.test.tsx | 3 ++- .../components/common/helper_functions.tsx | 4 +-- .../dashboard/dashboard_content.tsx | 9 ++++--- .../components/dashboard/mode_picker.tsx | 8 +++--- .../__tests__/services_table.test.tsx | 6 +++++ .../components/services/services_content.tsx | 6 ++++- .../components/services/services_table.tsx | 8 ++++-- .../traces/__tests__/traces_table.test.tsx | 12 ++++++--- .../components/traces/traces_content.tsx | 6 ++++- .../components/traces/traces_table.tsx | 6 +++-- public/components/trace_analytics/home.tsx | 26 ++++++++++--------- 11 files changed, 61 insertions(+), 33 deletions(-) diff --git a/public/components/trace_analytics/components/common/__tests__/helper_functions.test.tsx b/public/components/trace_analytics/components/common/__tests__/helper_functions.test.tsx index 6b7d66fdb9..335bd6c8bf 100644 --- a/public/components/trace_analytics/components/common/__tests__/helper_functions.test.tsx +++ b/public/components/trace_analytics/components/common/__tests__/helper_functions.test.tsx @@ -5,6 +5,7 @@ import { configure, mount, shallow } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; +import { TraceAnalyticsMode } from 'public/components/trace_analytics/home'; import React from 'react'; import { TEST_SERVICE_MAP, TEST_SERVICE_MAP_GRAPH } from '../../../../../../test/constants'; import { @@ -37,7 +38,7 @@ describe('Helper functions', () => { it('renders no match and missing configuration messages', () => { const noMatchMessage = shallow(); - const missingConfigurationMessage = shallow(); + const missingConfigurationMessage = shallow() expect(noMatchMessage).toMatchSnapshot(); expect(missingConfigurationMessage).toMatchSnapshot(); }); diff --git a/public/components/trace_analytics/components/common/helper_functions.tsx b/public/components/trace_analytics/components/common/helper_functions.tsx index 25b6de60c5..f93222fb2e 100644 --- a/public/components/trace_analytics/components/common/helper_functions.tsx +++ b/public/components/trace_analytics/components/common/helper_functions.tsx @@ -51,14 +51,14 @@ export function NoMatchMessage(props: { size: SpacerSize }) { ); } -export function MissingConfigurationMessage() { +export function MissingConfigurationMessage(props: {mode: TraceAnalyticsMode}) { return ( <> Trace Analytics not set up} body={ - {`The indices required for trace analytics (${JAEGER_INDEX_NAME} and ${JAEGER_SERVICE_INDEX_NAME} or ${DATA_PREPPER_INDEX_NAME} and ${DATA_PREPPER_SERVICE_INDEX_NAME}) do not exist or you do not have permission to access them.`} + {`The indices required for trace analytics (${props.mode === 'jaeger' ? JAEGER_INDEX_NAME : DATA_PREPPER_INDEX_NAME} and ${props.mode === 'jaeger' ? JAEGER_SERVICE_INDEX_NAME : DATA_PREPPER_SERVICE_INDEX_NAME}) do not exist or you do not have permission to access them.`} } actions={ diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 1bd7302f7c..73575a0afe 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -32,7 +32,6 @@ import { ThroughputPlt } from '../common/plots/throughput_plt'; import { SearchBar } from '../common/search_bar'; import { DashboardProps } from './dashboard'; import { DashboardTable } from './dashboard_table'; -import { DataSourcePicker } from './mode_picker'; import { TopGroupsPage } from './top_groups_page'; export function DashboardContent(props: DashboardProps) { @@ -52,6 +51,8 @@ export function DashboardContent(props: DashboardProps) { setQuery, setFilters, mode, + dataPrepperIndicesExist, + jaegerIndicesExist, } = props; const [tableItems, setTableItems] = useState([]); const [jaegerTableItems, setJaegerTableItems] = useState([]); @@ -88,7 +89,7 @@ export function DashboardContent(props: DashboardProps) { } } setFilteredService(newFilteredService); - if (!redirect && mode !== 'none') refresh(newFilteredService); + if (!redirect && ((mode === 'data_prepper' && dataPrepperIndicesExist) || (mode === 'jaeger' && jaegerIndicesExist))) refresh(newFilteredService); }, [filters, startTime, endTime, appConfigs]); const refresh = async (currService?: string) => { @@ -265,7 +266,7 @@ export function DashboardContent(props: DashboardProps) { mode={mode} /> - {mode !== 'none' ? ( + {((mode === 'data_prepper' && dataPrepperIndicesExist) || mode === 'jaeger' && jaegerIndicesExist) ? (
{mode === 'data_prepper' ? ( <> @@ -329,7 +330,7 @@ export function DashboardContent(props: DashboardProps) { )}
) : ( - + )} ); diff --git a/public/components/trace_analytics/components/dashboard/mode_picker.tsx b/public/components/trace_analytics/components/dashboard/mode_picker.tsx index 78d4aab671..15c685a5ed 100644 --- a/public/components/trace_analytics/components/dashboard/mode_picker.tsx +++ b/public/components/trace_analytics/components/dashboard/mode_picker.tsx @@ -22,11 +22,10 @@ export function DataSourcePicker(props: { }) { const { modes, selectedMode, setMode } = props; const [isPopoverOpen, setPopoverIsOpen] = useState(false); - const [selected, setSelected] = useState(selectedMode); const trigger = { - label: labels.get(selected), - title: selected, + label: labels.get(selectedMode), + title: selectedMode, 'data-test-subj': 'indexPattern-switch-link', className: 'dscIndexPattern__triggerButton', }; @@ -70,7 +69,7 @@ export function DataSourcePicker(props: { label: x.title, key: x.id, value: x.id, - checked: x.id === selected ? 'on' : undefined, + checked: x.id === selectedMode ? 'on' : undefined, }))} onChange={(choices) => { const choice = choices.find(({ checked }) => checked) as unknown as { @@ -79,7 +78,6 @@ export function DataSourcePicker(props: { key: TraceAnalyticsMode; }; setMode(choice.key); - setSelected(choice.key); setPopoverIsOpen(false); sessionStorage.setItem('TraceAnalyticsMode', choice.key); }} diff --git a/public/components/trace_analytics/components/services/__tests__/services_table.test.tsx b/public/components/trace_analytics/components/services/__tests__/services_table.test.tsx index 5a00bdd205..18ab79d5f0 100644 --- a/public/components/trace_analytics/components/services/__tests__/services_table.test.tsx +++ b/public/components/trace_analytics/components/services/__tests__/services_table.test.tsx @@ -23,6 +23,9 @@ describe('Services table component', () => { nameColumnAction={nameColumnAction} traceColumnAction={traceColumnAction} addFilter={addFilter} + jaegerIndicesExist={false} + dataPrepperIndicesExist={true} + mode='data_prepper' setRedirect={setRedirect} loading={false} /> @@ -53,6 +56,9 @@ describe('Services table component', () => { items={tableItems} nameColumnAction={nameColumnAction} traceColumnAction={traceColumnAction} + mode='data_prepper' + dataPrepperIndicesExist={true} + jaegerIndicesExist={false} addFilter={addFilter} setRedirect={setRedirect} loading={false} diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index b3ea96d8e6..6558cabff1 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -38,6 +38,8 @@ export function ServicesContent(props: ServicesProps) { setStartTime, setEndTime, mode, + dataPrepperIndicesExist, + jaegerIndicesExist, } = props; const [tableItems, setTableItems] = useState([]); const [serviceMap, setServiceMap] = useState({}); @@ -69,7 +71,7 @@ export function ServicesContent(props: ServicesProps) { } } setFilteredService(newFilteredService); - if (!redirect && mode !== 'none') refresh(newFilteredService); + if (!redirect && ((mode === 'data_prepper' && dataPrepperIndicesExist) || (mode === 'jaeger' && jaegerIndicesExist))) refresh(newFilteredService); }, [filters, appConfigs]); const refresh = async (currService?: string) => { @@ -127,6 +129,8 @@ export function ServicesContent(props: ServicesProps) { loading={loading} nameColumnAction={nameColumnAction} traceColumnAction={traceColumnAction} + jaegerIndicesExist + dataPrepperIndicesExist /> { mode === 'data_prepper' ? diff --git a/public/components/trace_analytics/components/services/services_table.tsx b/public/components/trace_analytics/components/services/services_table.tsx index 0e78ece9ad..514bdafbc1 100644 --- a/public/components/trace_analytics/components/services/services_table.tsx +++ b/public/components/trace_analytics/components/services/services_table.tsx @@ -34,6 +34,8 @@ interface ServicesTableProps { addFilter: (filter: FilterType) => void; setRedirect: (redirect: boolean) => void; mode: TraceAnalyticsMode; + jaegerIndicesExist: boolean; + dataPrepperIndicesExist: boolean; } export function ServicesTable(props: ServicesTableProps) { @@ -45,6 +47,8 @@ export function ServicesTable(props: ServicesTableProps) { traceColumnAction, addFilter, setRedirect, + jaegerIndicesExist, + dataPrepperIndicesExist, } = props; const renderTitleBar = (totalItems?: number) => { return ( @@ -170,10 +174,10 @@ export function ServicesTable(props: ServicesTableProps) { }} loading={loading} /> - ) : mode !== 'none' ? ( + ) : ((mode === 'data_prepper' && dataPrepperIndicesExist) || mode === 'jaeger' && jaegerIndicesExist) ? ( ) : ( - + )} diff --git a/public/components/trace_analytics/components/traces/__tests__/traces_table.test.tsx b/public/components/trace_analytics/components/traces/__tests__/traces_table.test.tsx index c57fd4f78f..e009fa887b 100644 --- a/public/components/trace_analytics/components/traces/__tests__/traces_table.test.tsx +++ b/public/components/trace_analytics/components/traces/__tests__/traces_table.test.tsx @@ -19,7 +19,9 @@ describe('Traces table component', () => { @@ -30,7 +32,9 @@ describe('Traces table component', () => { @@ -58,7 +62,9 @@ describe('Traces table component', () => { diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index afa4891e9e..2faec63a04 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -31,6 +31,8 @@ export function TracesContent(props: TracesProps) { setStartTime, setEndTime, mode, + dataPrepperIndicesExist, + jaegerIndicesExist, } = props; const [tableItems, setTableItems] = useState([]); const [redirect, setRedirect] = useState(true); @@ -49,7 +51,7 @@ export function TracesContent(props: TracesProps) { }, []); useEffect(() => { - if (!redirect && mode !== 'none') refresh(); + if (!redirect && ((mode === 'data_prepper' && dataPrepperIndicesExist) || (mode === 'jaeger' && jaegerIndicesExist))) refresh(); }, [filters, appConfigs]); const refresh = async (sort?: PropertySort) => { @@ -83,6 +85,8 @@ export function TracesContent(props: TracesProps) { mode={mode} loading={loading} traceIdColumnAction={traceIdColumnAction} + jaegerIndicesExist + dataPrepperIndicesExist /> ); diff --git a/public/components/trace_analytics/components/traces/traces_table.tsx b/public/components/trace_analytics/components/traces/traces_table.tsx index a601cf4bfa..31c42f5dde 100644 --- a/public/components/trace_analytics/components/traces/traces_table.tsx +++ b/public/components/trace_analytics/components/traces/traces_table.tsx @@ -34,6 +34,8 @@ interface TracesTableProps { mode: TraceAnalyticsMode; loading: boolean; traceIdColumnAction: any; + jaegerIndicesExist: boolean; + dataPrepperIndicesExist: boolean; } export function TracesTable(props: TracesTableProps) { @@ -280,10 +282,10 @@ export function TracesTable(props: TracesTableProps) { onTableChange={onTableChange} loading={loading} /> - ) : mode !== 'none' ? ( + ) : ((mode === 'data_prepper' && props.dataPrepperIndicesExist) || (mode === 'jaeger' && props.jaegerIndicesExist)) ? ( ) : ( - + )} diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index daed7cc376..aba45a0f96 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -26,7 +26,7 @@ export interface TraceAnalyticsCoreDeps { interface HomeProps extends RouteComponentProps, TraceAnalyticsCoreDeps {} -export type TraceAnalyticsMode = 'jaeger' | 'data_prepper' | 'none' +export type TraceAnalyticsMode = 'jaeger' | 'data_prepper' export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, SearchBarProps { mode: TraceAnalyticsMode; @@ -34,7 +34,9 @@ export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, Sea id: string; title: string; }[]; - setMode: (mode: TraceAnalyticsMode) => void + setMode: (mode: TraceAnalyticsMode) => void; + jaegerIndicesExist: boolean; + dataPrepperIndicesExist: boolean; } export const Home = (props: HomeProps) => { @@ -80,15 +82,13 @@ export const Home = (props: HomeProps) => { { id: 'data_prepper', title: 'Data Prepper' }, ]; - // useEffect(() => { - // if (dataPrepperIndicesExist) { - // setMode('data_prepper'); - // } else if (jaegerIndicesExist) { - // setMode('jaeger'); - // } else { - // setMode('none'); - // } - // }, [jaegerIndicesExist, dataPrepperIndicesExist]); + useEffect(() => { + if (dataPrepperIndicesExist) { + setMode('data_prepper'); + } else if (jaegerIndicesExist) { + setMode('jaeger'); + } + }, [jaegerIndicesExist, dataPrepperIndicesExist]); const dashboardBreadcrumbs = [ { @@ -146,7 +146,9 @@ export const Home = (props: HomeProps) => { setEndTime: setEndTimeWithStorage, mode, modes, - setMode: (mode: TraceAnalyticsMode) => {setMode(mode)} + setMode: (mode: TraceAnalyticsMode) => {setMode(mode)}, + jaegerIndicesExist, + dataPrepperIndicesExist, }; return ( From 2e15987a6e8d7a0ddb8a980f6f58e1bd226b2f7e Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Fri, 6 Jan 2023 12:55:30 -0500 Subject: [PATCH 52/67] fix UX navigation final Signed-off-by: Derek Ho --- .../components/services/services_content.tsx | 6 +++--- .../components/services/services_table.tsx | 10 +++++----- .../components/traces/traces_content.tsx | 4 ++-- .../trace_analytics/components/traces/traces_table.tsx | 8 ++++---- public/components/trace_analytics/home.tsx | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/public/components/trace_analytics/components/services/services_content.tsx b/public/components/trace_analytics/components/services/services_content.tsx index 6558cabff1..9a977bea18 100644 --- a/public/components/trace_analytics/components/services/services_content.tsx +++ b/public/components/trace_analytics/components/services/services_content.tsx @@ -129,11 +129,11 @@ export function ServicesContent(props: ServicesProps) { loading={loading} nameColumnAction={nameColumnAction} traceColumnAction={traceColumnAction} - jaegerIndicesExist - dataPrepperIndicesExist + jaegerIndicesExist={jaegerIndicesExist} + dataPrepperIndicesExist={dataPrepperIndicesExist} /> - { mode === 'data_prepper' ? + { (mode === 'data_prepper' && dataPrepperIndicesExist) ? - {items?.length > 0 ? ( + {!((mode === 'data_prepper' && dataPrepperIndicesExist) || mode === 'jaeger' && jaegerIndicesExist) ? ( + + ) : ( items?.length > 0 ? ( - ) : ((mode === 'data_prepper' && dataPrepperIndicesExist) || mode === 'jaeger' && jaegerIndicesExist) ? ( - ) : ( - - )} + + ))} ); diff --git a/public/components/trace_analytics/components/traces/traces_content.tsx b/public/components/trace_analytics/components/traces/traces_content.tsx index 2faec63a04..b436a9394f 100644 --- a/public/components/trace_analytics/components/traces/traces_content.tsx +++ b/public/components/trace_analytics/components/traces/traces_content.tsx @@ -85,8 +85,8 @@ export function TracesContent(props: TracesProps) { mode={mode} loading={loading} traceIdColumnAction={traceIdColumnAction} - jaegerIndicesExist - dataPrepperIndicesExist + jaegerIndicesExist={jaegerIndicesExist} + dataPrepperIndicesExist={dataPrepperIndicesExist} /> ); diff --git a/public/components/trace_analytics/components/traces/traces_table.tsx b/public/components/trace_analytics/components/traces/traces_table.tsx index 31c42f5dde..085da31c25 100644 --- a/public/components/trace_analytics/components/traces/traces_table.tsx +++ b/public/components/trace_analytics/components/traces/traces_table.tsx @@ -269,7 +269,9 @@ export function TracesTable(props: TracesTableProps) { {titleBar} - {items?.length > 0 ? ( + {!((mode === 'data_prepper' && props.dataPrepperIndicesExist) || (mode === 'jaeger' && props.jaegerIndicesExist)) ? ( + + ) : items?.length > 0 ? ( - ) : ((mode === 'data_prepper' && props.dataPrepperIndicesExist) || (mode === 'jaeger' && props.jaegerIndicesExist)) ? ( - ) : ( - + )} diff --git a/public/components/trace_analytics/home.tsx b/public/components/trace_analytics/home.tsx index aba45a0f96..65794edaf9 100644 --- a/public/components/trace_analytics/home.tsx +++ b/public/components/trace_analytics/home.tsx @@ -40,8 +40,8 @@ export interface TraceAnalyticsComponentDeps extends TraceAnalyticsCoreDeps, Sea } export const Home = (props: HomeProps) => { - const [dataPrepperIndicesExist, setDataPrepperIndicesExist] = useState(true); - const [jaegerIndicesExist, setJaegerIndicesExist] = useState(true); + const [dataPrepperIndicesExist, setDataPrepperIndicesExist] = useState(false); + const [jaegerIndicesExist, setJaegerIndicesExist] = useState(false); const [mode, setMode] = useState(sessionStorage.getItem('TraceAnalyticsMode') as TraceAnalyticsMode || 'jaeger') const storedFilters = sessionStorage.getItem('TraceAnalyticsFilters'); const [query, setQuery] = useState(sessionStorage.getItem('TraceAnalyticsQuery') || ''); From f8711bbc966c8daa4b8416c7d8bd828816dce94d Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Sun, 8 Jan 2023 16:21:26 -0500 Subject: [PATCH 53/67] move service map call into data prepper mode only Signed-off-by: Derek Ho --- .../dashboard/dashboard_content.tsx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx index 73575a0afe..d9671b6f58 100644 --- a/public/components/trace_analytics/components/dashboard/dashboard_content.tsx +++ b/public/components/trace_analytics/components/dashboard/dashboard_content.tsx @@ -158,6 +158,18 @@ export function DashboardContent(props: DashboardProps) { mode, setPercentileMap ).then(() => setLoading(false)); + // service map should not be filtered by service name (https://github.com/opensearch-project/observability/issues/442) + const serviceMapDSL = _.cloneDeep(DSL); + serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( + (must: any) => must?.term?.serviceName == null + ); + handleServiceMapRequest( + http, + serviceMapDSL, + mode, + setServiceMap, + currService || filteredService + ); } handleDashboardThroughputPltRequest( @@ -177,18 +189,6 @@ export function DashboardContent(props: DashboardProps) { setErrorRatePltItems, mode ); - // service map should not be filtered by service name (https://github.com/opensearch-project/observability/issues/442) - const serviceMapDSL = _.cloneDeep(DSL); - serviceMapDSL.query.bool.must = serviceMapDSL.query.bool.must.filter( - (must: any) => must?.term?.serviceName == null - ); - handleServiceMapRequest( - http, - serviceMapDSL, - mode, - setServiceMap, - currService || filteredService - ); }; const addFilter = (filter: FilterType) => { From ba9c898fcf831050fb8d7cd50a4e73f7b3a3d97e Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Sun, 8 Jan 2023 23:01:11 -0500 Subject: [PATCH 54/67] fix tests Signed-off-by: Derek Ho --- .../helper_functions.test.tsx.snap | 2 +- .../__snapshots__/search_bar.test.tsx.snap | 2 + .../error_rate_plt_.test.tsx.snap | 20 +- .../throughput_plt.test.tsx.snap | 16 +- .../__snapshots__/dashboard.test.tsx.snap | 531 ++++++++++++++++-- .../dashboard/__tests__/dashboard.test.tsx | 8 + .../__snapshots__/services.test.tsx.snap | 297 ++++++++++ .../services_table.test.tsx.snap | 258 ++++++++- .../services/__tests__/services.test.tsx | 8 + .../__snapshots__/traces.test.tsx.snap | 297 ++++++++++ .../__snapshots__/traces_table.test.tsx.snap | 429 ++++++++++++-- .../traces/__tests__/traces.test.tsx | 8 + 12 files changed, 1761 insertions(+), 115 deletions(-) diff --git a/public/components/trace_analytics/components/common/__tests__/__snapshots__/helper_functions.test.tsx.snap b/public/components/trace_analytics/components/common/__tests__/__snapshots__/helper_functions.test.tsx.snap index 407f5d67b2..0d6dad1ca0 100644 --- a/public/components/trace_analytics/components/common/__tests__/__snapshots__/helper_functions.test.tsx.snap +++ b/public/components/trace_analytics/components/common/__tests__/__snapshots__/helper_functions.test.tsx.snap @@ -104,7 +104,7 @@ exports[`Helper functions renders no match and missing configuration messages 2` } body={ - The indices required for trace analytics (*jaeger-span-* and *jaeger-service* or otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. + The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. } title={ diff --git a/public/components/trace_analytics/components/common/__tests__/__snapshots__/search_bar.test.tsx.snap b/public/components/trace_analytics/components/common/__tests__/__snapshots__/search_bar.test.tsx.snap index 9c3997a729..ae5d60c25d 100644 --- a/public/components/trace_analytics/components/common/__tests__/__snapshots__/search_bar.test.tsx.snap +++ b/public/components/trace_analytics/components/common/__tests__/__snapshots__/search_bar.test.tsx.snap @@ -375,6 +375,7 @@ exports[`Search bar components renders search bar 1`] = ` appConfigs={Array []} endTime="now" filters={Array []} + mode="data_prepper" page="dashboard" query="test" refresh={[MockFunction]} @@ -974,6 +975,7 @@ exports[`Search bar components renders search bar 1`] = ` diff --git a/public/components/trace_analytics/components/common/plots/__tests__/__snapshots__/error_rate_plt_.test.tsx.snap b/public/components/trace_analytics/components/common/plots/__tests__/__snapshots__/error_rate_plt_.test.tsx.snap index a996b25431..f08a4f459f 100644 --- a/public/components/trace_analytics/components/common/plots/__tests__/__snapshots__/error_rate_plt_.test.tsx.snap +++ b/public/components/trace_analytics/components/common/plots/__tests__/__snapshots__/error_rate_plt_.test.tsx.snap @@ -10,11 +10,21 @@ exports[`Error rate plot component renders error rate plot 1`] = ` } } > - - + + + + - + + + + diff --git a/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap index fa0f034430..09caf4e788 100644 --- a/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap +++ b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap @@ -46,10 +46,23 @@ exports[`Dashboard component renders dashboard 1`] = ` }, } } + dataPrepperIndicesExist={true} endTime="now" filters={Array []} http={[MockFunction]} mode="data_prepper" + modes={ + Array [ + Object { + "id": "jaeger", + "title": "Jaeger", + }, + Object { + "id": "data_prepper", + "title": "Data Prepper", + }, + ] + } page="dashboard" parentBreadcrumbs={ Array [ @@ -94,6 +107,128 @@ exports[`Dashboard component renders dashboard 1`] = ` Dashboard + + + Data Prepper + + } + className="eui-textTruncate" + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="s" + > +
+
+ + + +
+
+
+
- - -
- - Trace error rate over time - -
-
-
- + + Trace error rate over time + +
+ + + +
+ + + +
+
+
+
+
+ -
- +
@@ -1954,23 +2132,51 @@ exports[`Dashboard component renders dashboard 1`] = ` } } > - - -
- - Traces over time - -
-
-
+
+ + Traces over time + +
+ + + +
+ + + +
+
+
+
+ @@ -2112,10 +2318,23 @@ exports[`Dashboard component renders empty dashboard 1`] = ` }, } } + dataPrepperIndicesExist={true} endTime="now" filters={Array []} http={[MockFunction]} mode="data_prepper" + modes={ + Array [ + Object { + "id": "jaeger", + "title": "Jaeger", + }, + Object { + "id": "data_prepper", + "title": "Data Prepper", + }, + ] + } page="dashboard" parentBreadcrumbs={ Array [ @@ -2160,6 +2379,123 @@ exports[`Dashboard component renders empty dashboard 1`] = ` Dashboard + + + Data Prepper + + } + className="eui-textTruncate" + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="s" + > +
+
+ + + +
+
+
+
- - -
- - Trace error rate over time - -
-
-
- + + Trace error rate over time + +
+ + + +
+ + + +
+
+
+
+ + -
- +
@@ -3993,23 +4372,51 @@ exports[`Dashboard component renders empty dashboard 1`] = ` } } > - - -
- - Traces over time - -
-
-
+
+ + Traces over time + +
+ + + +
+ + + +
+
+
+
+
diff --git a/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx b/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx index 176cb7e2b0..f57ec37887 100644 --- a/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx +++ b/public/components/trace_analytics/components/dashboard/__tests__/dashboard.test.tsx @@ -12,6 +12,10 @@ import { coreStartMock } from '../../../../../../test/__mocks__/coreMocks'; describe('Dashboard component', () => { configure({ adapter: new Adapter() }); + const modes = [ + { id: 'jaeger', title: 'Jaeger' }, + { id: 'data_prepper', title: 'Data Prepper' }, + ]; it('renders empty dashboard', () => { const core = coreStartMock; @@ -50,6 +54,8 @@ describe('Dashboard component', () => { setEndTime={setEndTime} page="dashboard" mode="data_prepper" + dataPrepperIndicesExist={true} + modes={modes} /> ); @@ -93,6 +99,8 @@ describe('Dashboard component', () => { setEndTime={setEndTime} page="dashboard" mode="data_prepper" + dataPrepperIndicesExist={true} + modes={modes} /> ); diff --git a/public/components/trace_analytics/components/services/__tests__/__snapshots__/services.test.tsx.snap b/public/components/trace_analytics/components/services/__tests__/__snapshots__/services.test.tsx.snap index 829c1f131a..589a443640 100644 --- a/public/components/trace_analytics/components/services/__tests__/__snapshots__/services.test.tsx.snap +++ b/public/components/trace_analytics/components/services/__tests__/__snapshots__/services.test.tsx.snap @@ -46,10 +46,23 @@ exports[`Services component renders empty services page 1`] = ` }, } } + dataPrepperIndicesExist={true} endTime="now" filters={Array []} http={[MockFunction]} mode="data_prepper" + modes={ + Array [ + Object { + "id": "jaeger", + "title": "Jaeger", + }, + Object { + "id": "data_prepper", + "title": "Data Prepper", + }, + ] + } nameColumnAction={[Function]} page="services" parentBreadcrumbs={ @@ -96,6 +109,123 @@ exports[`Services component renders empty services page 1`] = ` Services + + + Data Prepper + + } + className="eui-textTruncate" + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="s" + > +
+
+ + + +
+
+
+
+ + + Data Prepper + + } + className="eui-textTruncate" + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="s" + > +
+
+ + + +
+
+
+
+ + + + + + + + + + + +
+ No. of connected services +
+
+ 2 +
+ +
+ + +
+ Connected services +
+
+ +
+ order, inventory +
+
+
+ +
+ { configure({ adapter: new Adapter() }); + const modes = [ + { id: 'jaeger', title: 'Jaeger' }, + { id: 'data_prepper', title: 'Data Prepper' }, + ]; it('renders empty services page', () => { const core = coreStartMock; @@ -50,6 +54,8 @@ describe('Services component', () => { setEndTime={setEndTime} page="services" mode='data_prepper' + dataPrepperIndicesExist={true} + modes={modes} /> ); @@ -94,6 +100,8 @@ describe('Services component', () => { setEndTime={setEndTime} page="services" mode='data_prepper' + dataPrepperIndicesExist={true} + modes={modes} /> ); diff --git a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces.test.tsx.snap b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces.test.tsx.snap index 4a8c2de20a..28d9ae49e5 100644 --- a/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces.test.tsx.snap +++ b/public/components/trace_analytics/components/traces/__tests__/__snapshots__/traces.test.tsx.snap @@ -46,10 +46,23 @@ exports[`Traces component renders empty traces page 1`] = ` }, } } + dataPrepperIndicesExist={true} endTime="now" filters={Array []} http={[MockFunction]} mode="data_prepper" + modes={ + Array [ + Object { + "id": "jaeger", + "title": "Jaeger", + }, + Object { + "id": "data_prepper", + "title": "Data Prepper", + }, + ] + } page="traces" parentBreadcrumbs={ Array [ @@ -95,6 +108,123 @@ exports[`Traces component renders empty traces page 1`] = ` Traces + + + Data Prepper + + } + className="eui-textTruncate" + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="s" + > +
+
+ + + +
+
+
+
+ + + Data Prepper + + } + className="eui-textTruncate" + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="s" + > +
+
+ + + +
+
+
+
@@ -66,25 +68,28 @@ exports[`Traces table component renders empty traces table message 1`] = ` className="euiHorizontalRule euiHorizontalRule--full" />
- - -
- + Learn more + + } body={ - No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them. } title={

- No matches + Trace Analytics not set up

} > @@ -97,7 +102,7 @@ exports[`Traces table component renders empty traces table message 1`] = `

- No matches + Trace Analytics not set up

- No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + The indices required for trace analytics (otel-v1-apm-span-* and otel-v1-apm-service-map*) do not exist or you do not have permission to access them.
+ +
+ + + + + +
- -
- - +
@@ -145,9 +227,11 @@ exports[`Traces table component renders empty traces table message 1`] = ` exports[`Traces table component renders empty traces table message 2`] = ` @@ -288,7 +372,7 @@ exports[`Traces table component renders empty traces table message 2`] = ` exports[`Traces table component renders traces table 1`] = ` @@ -375,6 +461,14 @@ exports[`Traces table component renders traces table 1`] = ` "sortable": true, "truncateText": true, }, + Object { + "align": "left", + "field": "trace_group", + "name": "Trace group", + "render": [Function], + "sortable": true, + "truncateText": true, + }, Object { "align": "right", "field": "latency", @@ -382,6 +476,17 @@ exports[`Traces table component renders traces table 1`] = ` "sortable": true, "truncateText": true, }, + Object { + "align": "right", + "field": "percentile_in_trace_group", + "name": +
+ Percentile in trace group +
+
, + "render": [Function], + "sortable": true, + }, Object { "align": "right", "field": "error_count", @@ -445,6 +550,14 @@ exports[`Traces table component renders traces table 1`] = ` "sortable": true, "truncateText": true, }, + Object { + "align": "left", + "field": "trace_group", + "name": "Trace group", + "render": [Function], + "sortable": true, + "truncateText": true, + }, Object { "align": "right", "field": "latency", @@ -452,6 +565,17 @@ exports[`Traces table component renders traces table 1`] = ` "sortable": true, "truncateText": true, }, + Object { + "align": "right", + "field": "percentile_in_trace_group", + "name": +
+ Percentile in trace group +
+
, + "render": [Function], + "sortable": true, + }, Object { "align": "right", "field": "error_count", @@ -551,21 +675,39 @@ exports[`Traces table component renders traces table 1`] = ` Object { "isSortAscending": undefined, "isSorted": false, - "key": "_data_s_latency_1", + "key": "_data_s_trace_group_1", + "name": "Trace group", + "onSort": [Function], + }, + Object { + "isSortAscending": undefined, + "isSorted": false, + "key": "_data_s_latency_2", "name": "Latency (ms)", "onSort": [Function], }, Object { "isSortAscending": undefined, "isSorted": false, - "key": "_data_s_error_count_2", + "key": "_data_s_percentile_in_trace_group_3", + "name": +
+ Percentile in trace group +
+
, + "onSort": [Function], + }, + Object { + "isSortAscending": undefined, + "isSorted": false, + "key": "_data_s_error_count_4", "name": "Errors", "onSort": [Function], }, Object { "isSortAscending": undefined, "isSorted": false, - "key": "_data_s_last_updated_3", + "key": "_data_s_last_updated_5", "name": "Last updated", "onSort": [Function], }, @@ -789,18 +931,76 @@ exports[`Traces table component renders traces table 1`] = ` + + + + + + + + + + + + +
+ Trace group +
+
+ +
+ HTTP GET +
+
+
+ +
+
+ Percentile in trace group +
+ , + "render": undefined, + } + } + setScopeRow={false} + textOnly={false} + > + +
+
+ Percentile in trace group +
+
+
+ +
+ 30th +
+
+
+ +
+ { configure({ adapter: new Adapter() }); + const modes = [ + { id: 'jaeger', title: 'Jaeger' }, + { id: 'data_prepper', title: 'Data Prepper' }, + ]; it('renders empty traces page', () => { const core = coreStartMock; @@ -48,6 +52,8 @@ describe('Traces component', () => { setEndTime={setEndTime} page="traces" mode='data_prepper' + dataPrepperIndicesExist={true} + modes={modes} /> ); @@ -90,6 +96,8 @@ describe('Traces component', () => { setEndTime={setEndTime} mode='data_prepper' page="traces" + modes={modes} + dataPrepperIndicesExist={true} /> ); From 5c6091c333f29e9b4a41ab725c4d25c1d4bda917 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Sun, 8 Jan 2023 23:20:02 -0500 Subject: [PATCH 55/67] fix gantt chart Signed-off-by: Derek Ho --- .../trace_analytics/requests/traces_request_handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/components/trace_analytics/requests/traces_request_handler.ts b/public/components/trace_analytics/requests/traces_request_handler.ts index 26605fa356..0ed7a02058 100644 --- a/public/components/trace_analytics/requests/traces_request_handler.ts +++ b/public/components/trace_analytics/requests/traces_request_handler.ts @@ -263,7 +263,7 @@ const hitsToSpanDetailData = async (hits: any, colorMap: any, mode: TraceAnalyti orientation: BarOrientation.horizontal, hoverinfo: 'none', showlegend: false, - spanId: hit._source.spanId, + spanId: mode === 'jaeger' ? hit._source.spanID : hit._source.spanId, }, { x: [duration], @@ -278,7 +278,7 @@ const hitsToSpanDetailData = async (hits: any, colorMap: any, mode: TraceAnalyti type: 'bar', orientation: BarOrientation.horizontal, hovertemplate: '%{x}', - spanId: hit._source.spanId, + spanId: mode === 'jaeger' ? hit._source.spanID : hit._source.spanId, } ); }); From c5504cacd3bdb7b3f7679d23f8b489073be4c8aa Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Mon, 9 Jan 2023 14:13:46 -0500 Subject: [PATCH 56/67] add tests Signed-off-by: Derek Ho --- .../__snapshots__/dashboard.test.tsx.snap | 1693 ++++++++ .../__snapshots__/mode_picker.test.tsx.snap | 805 ++++ .../top_error_rates_table.test.tsx.snap | 2512 ++++++++++++ .../top_latency_table.test.tsx.snap | 3439 +++++++++++++++++ .../dashboard/__tests__/dashboard.test.tsx | 46 + .../dashboard/__tests__/mode_picker.test.tsx | 30 + .../__tests__/top_error_rates_table.test.tsx | 76 + .../__tests__/top_latency_table.test.tsx | 76 + .../__snapshots__/services.test.tsx.snap | 1312 +++++++ .../services_table.test.tsx.snap | 1554 ++++++++ .../services/__tests__/services.test.tsx | 47 + .../__tests__/services_table.test.tsx | 55 + .../span_detail_table.test.tsx.snap | 24 + .../__snapshots__/traces.test.tsx.snap | 1300 +++++++ .../__snapshots__/traces_table.test.tsx.snap | 1375 +++++++ .../__tests__/span_detail_table.test.tsx | 25 +- .../traces/__tests__/traces.test.tsx | 45 + .../traces/__tests__/traces_table.test.tsx | 31 + test/constants.ts | 57 + 19 files changed, 14501 insertions(+), 1 deletion(-) create mode 100644 public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/mode_picker.test.tsx.snap create mode 100644 public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/top_error_rates_table.test.tsx.snap create mode 100644 public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/top_latency_table.test.tsx.snap create mode 100644 public/components/trace_analytics/components/dashboard/__tests__/mode_picker.test.tsx create mode 100644 public/components/trace_analytics/components/dashboard/__tests__/top_error_rates_table.test.tsx create mode 100644 public/components/trace_analytics/components/dashboard/__tests__/top_latency_table.test.tsx diff --git a/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap index 09caf4e788..5269debf0c 100644 --- a/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap +++ b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/dashboard.test.tsx.snap @@ -4511,3 +4511,1696 @@ exports[`Dashboard component renders empty dashboard 1`] = ` `; + +exports[`Dashboard component renders empty jaeger dashboard 1`] = ` + + +

+ Dashboard +

+
+ + + Jaeger + + } + className="eui-textTruncate" + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="s" + > +
+
+ + + +
+
+
+
+ + + +
+ +
+ + +
+
+ + + + +
+ + + + + +
+
+
+
+
+
+
+
+ +
+ + +
+ +
+ + } + > +
+ + + + + } + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="m" + > +
+
+ + + +
+
+
+
+
+ } + iconType={false} + isCustom={true} + startDateControl={
} + > +
+ +
+ + +
+
+ +
+ +
+ + +
+ + +
+ + + + + +
+
+
+ + +
+ + + +
+ +
+ + + } + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="none" + withTitle={true} + > +
+
+ + + +
+
+
+
+
+
+ +
+ + + + Add filter + + } + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="m" + withTitle={true} + > +
+
+ + + +
+
+
+
+
+
+
+
+
+ + +
+ +
+ + +
+ + + +
+ +
+ + +
+ + Trace error rate over time + +
+
+
+ +
+ + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ + + +
+ + + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + } + title={ +

+ No matches +

+ } + > +
+ +

+ No matches +

+
+ + + +
+ + +
+ +
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. +
+
+
+
+ + +
+ + +
+ + +
+ + + + +
+ +
+ +
+ + +
+ + Top 5 Service and Operation Error Rates + + + (0) + +
+
+
+
+
+
+
+ +
+ + +
+
+ + +
+ + + No data matches the selected filter. Clear the filter and/or increase the time range to see more results. + + } + title={ +

+ No matches +

+ } + > +
+ +

+ No matches +

+
+ + + +
+ + +
+ +
+ No data matches the selected filter. Clear the filter and/or increase the time range to see more results. +
+
+
+
+ + +
+ + +
+ + +
+ + + +
+ + +`; diff --git a/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/mode_picker.test.tsx.snap b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/mode_picker.test.tsx.snap new file mode 100644 index 0000000000..88d8ab540e --- /dev/null +++ b/public/components/trace_analytics/components/dashboard/__tests__/__snapshots__/mode_picker.test.tsx.snap @@ -0,0 +1,805 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Mode picker component renders mode picker 1`] = ` + + + Jaeger + + } + className="eui-textTruncate" + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={false} + ownFocus={true} + panelPaddingSize="s" + > +
+
+ + + +
+
+
+
+`; + +exports[`Mode picker component renders mode picker 2`] = ` + + + Jaeger + + } + className="eui-textTruncate" + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + isOpen={true} + ownFocus={true} + panelPaddingSize="s" + > +
+
+ + + +
+ + +
+
+