- {i18n.translate('xpack.observability.ingestManafer.button', {
+
+ {i18n.translate('xpack.observability.ingestManager.button', {
defaultMessage: 'Try Ingest Manager Beta',
})}
diff --git a/x-pack/plugins/reporting/server/routes/jobs.ts b/x-pack/plugins/reporting/server/routes/jobs.ts
index e8eac9e577beb5..db62c0cc403fc0 100644
--- a/x-pack/plugins/reporting/server/routes/jobs.ts
+++ b/x-pack/plugins/reporting/server/routes/jobs.ts
@@ -15,11 +15,6 @@ import {
downloadJobResponseHandlerFactory,
} from './lib/job_response_handler';
-interface ListQuery {
- page: string;
- size: string;
- ids?: string; // optional field forbids us from extending RequestQuery
-}
const MAIN_ENTRY = `${API_BASE_URL}/jobs`;
const handleUnavailable = (res: any) => {
@@ -52,11 +47,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) {
const {
management: { jobTypes = [] },
} = await reporting.getLicenseInfo();
- const {
- page: queryPage = '0',
- size: querySize = '10',
- ids: queryIds = null,
- } = req.query as ListQuery; // NOTE: type inference is not working here. userHandler breaks it?
+ const { page: queryPage = '0', size: querySize = '10', ids: queryIds = null } = req.query;
const page = parseInt(queryPage, 10) || 0;
const size = Math.min(100, parseInt(querySize, 10) || 10);
const jobIds = queryIds ? queryIds.split(',') : null;
@@ -116,7 +107,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) {
return handleUnavailable(res);
}
- const { docId } = req.params as { docId: string };
+ const { docId } = req.params;
const {
management: { jobTypes = [] },
} = await reporting.getLicenseInfo();
@@ -161,7 +152,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) {
return res.custom({ statusCode: 503 });
}
- const { docId } = req.params as { docId: string };
+ const { docId } = req.params;
const {
management: { jobTypes = [] },
} = await reporting.getLicenseInfo();
@@ -213,7 +204,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) {
return handleUnavailable(res);
}
- const { docId } = req.params as { docId: string };
+ const { docId } = req.params;
const {
management: { jobTypes = [] },
} = await reporting.getLicenseInfo();
@@ -239,7 +230,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) {
return handleUnavailable(res);
}
- const { docId } = req.params as { docId: string };
+ const { docId } = req.params;
const {
management: { jobTypes = [] },
} = await reporting.getLicenseInfo();
diff --git a/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts b/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts
index 3758eafc6d718c..e2f393aad57d23 100644
--- a/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts
+++ b/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts
@@ -12,7 +12,7 @@ import { getUserFactory } from './get_user';
type ReportingUser = AuthenticatedUser | null;
const superuserRole = 'superuser';
-export type RequestHandlerUser = RequestHandler extends (...a: infer U) => infer R
+export type RequestHandlerUser = RequestHandler
extends (...a: infer U) => infer R
? (user: ReportingUser, ...a: U) => R
: never;
@@ -21,7 +21,7 @@ export const authorizedUserPreRoutingFactory = function authorizedUserPreRouting
) {
const setupDeps = reporting.getPluginSetupDeps();
const getUser = getUserFactory(setupDeps.security);
- return
(handler: RequestHandlerUser): RequestHandler
=> {
+ return
(handler: RequestHandlerUser
): RequestHandler
=> {
return (context, req, res) => {
let user: ReportingUser = null;
if (setupDeps.security && setupDeps.security.license.isEnabled()) {
diff --git a/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.test.ts b/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.test.ts
new file mode 100644
index 00000000000000..1ffc2e16b78f75
--- /dev/null
+++ b/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.test.ts
@@ -0,0 +1,20 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { emptyMlCapabilities } from './empty_ml_capabilities';
+import { hasMlLicense } from './has_ml_license';
+
+describe('hasMlLicense', () => {
+ test('it returns false when license is not platinum or trial', () => {
+ const capabilities = { ...emptyMlCapabilities, isPlatinumOrTrialLicense: false };
+ expect(hasMlLicense(capabilities)).toEqual(false);
+ });
+
+ test('it returns true when license is platinum or trial', () => {
+ const capabilities = { ...emptyMlCapabilities, isPlatinumOrTrialLicense: true };
+ expect(hasMlLicense(capabilities)).toEqual(true);
+ });
+});
diff --git a/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.ts b/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.ts
new file mode 100644
index 00000000000000..c0b6862ac30fe5
--- /dev/null
+++ b/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.ts
@@ -0,0 +1,10 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { MlCapabilitiesResponse } from '../../../ml/common/types/capabilities';
+
+export const hasMlLicense = (capabilities: MlCapabilitiesResponse): boolean =>
+ capabilities.isPlatinumOrTrialLicense;
diff --git a/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts b/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts
index 43cfa4ad599640..f5783fc9b3973a 100644
--- a/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts
+++ b/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts
@@ -4,8 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { MlSummaryJob } from '../../../ml/common/types/anomaly_detection_jobs';
import { ML_GROUP_IDS } from '../constants';
-export const isSecurityJob = (job: MlSummaryJob): boolean =>
+export const isSecurityJob = (job: { groups: string[] }): boolean =>
job.groups.some((group) => ML_GROUP_IDS.includes(group));
diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx
index 6fb693e47560d6..56daa9a8364f6b 100644
--- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx
+++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx
@@ -80,6 +80,9 @@ describe('Configuration button', () => {
});
test('it shows the tooltip when hovering the button', () => {
+ // Use fake timers so we don't have to wait for the EuiToolTip timeout
+ jest.useFakeTimers();
+
const msgTooltip = 'My message tooltip';
const titleTooltip = 'My title';
@@ -96,11 +99,14 @@ describe('Configuration button', () => {
);
newWrapper.find('[data-test-subj="configure-case-button"]').first().simulate('mouseOver');
- // EuiToolTip mounts children after a 250ms delay
- setTimeout(
- () =>
- expect(newWrapper.find('.euiToolTipPopover').text()).toBe(`${titleTooltip}${msgTooltip}`),
- 250
- );
+
+ // Run the timers so the EuiTooltip will be visible
+ jest.runAllTimers();
+
+ newWrapper.update();
+ expect(newWrapper.find('.euiToolTipPopover').text()).toBe(`${titleTooltip}${msgTooltip}`);
+
+ // Clearing all mocks will also reset fake timers.
+ jest.clearAllMocks();
});
});
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts
index 6fbb308672e5d7..e6597de892bff3 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts
+++ b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts
@@ -9,13 +9,11 @@ import { useState, useEffect, useMemo } from 'react';
import { DEFAULT_ANOMALY_SCORE } from '../../../../../common/constants';
import { anomaliesTableData } from '../api/anomalies_table_data';
import { InfluencerInput, Anomalies, CriteriaFields } from '../types';
-import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions';
-import { useSiemJobs } from '../../ml_popover/hooks/use_siem_jobs';
-import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities';
-import { useStateToaster, errorToToaster } from '../../toasters';
import * as i18n from './translations';
import { useTimeZone, useUiSetting$ } from '../../../lib/kibana';
+import { useAppToasts } from '../../../hooks/use_app_toasts';
+import { useInstalledSecurityJobs } from '../hooks/use_installed_security_jobs';
interface Args {
influencers?: InfluencerInput[];
@@ -58,15 +56,13 @@ export const useAnomaliesTableData = ({
skip = false,
}: Args): Return => {
const [tableData, setTableData] = useState(null);
- const [, siemJobs] = useSiemJobs(true);
+ const { isMlUser, jobs } = useInstalledSecurityJobs();
const [loading, setLoading] = useState(true);
- const capabilities = useMlCapabilities();
- const userPermissions = hasMlUserPermissions(capabilities);
- const [, dispatchToaster] = useStateToaster();
+ const { addError } = useAppToasts();
const timeZone = useTimeZone();
const [anomalyScore] = useUiSetting$(DEFAULT_ANOMALY_SCORE);
- const siemJobIds = siemJobs.filter((job) => job.isInstalled).map((job) => job.id);
+ const jobIds = jobs.map((job) => job.id);
const startDateMs = useMemo(() => new Date(startDate).getTime(), [startDate]);
const endDateMs = useMemo(() => new Date(endDate).getTime(), [endDate]);
@@ -81,11 +77,11 @@ export const useAnomaliesTableData = ({
earliestMs: number,
latestMs: number
) {
- if (userPermissions && !skip && siemJobIds.length > 0) {
+ if (isMlUser && !skip && jobIds.length > 0) {
try {
const data = await anomaliesTableData(
{
- jobIds: siemJobIds,
+ jobIds,
criteriaFields: criteriaFieldsInput,
aggregationInterval: 'auto',
threshold: getThreshold(anomalyScore, threshold),
@@ -104,13 +100,13 @@ export const useAnomaliesTableData = ({
}
} catch (error) {
if (isSubscribed) {
- errorToToaster({ title: i18n.SIEM_TABLE_FETCH_FAILURE, error, dispatchToaster });
+ addError(error, { title: i18n.SIEM_TABLE_FETCH_FAILURE });
setLoading(false);
}
}
- } else if (!userPermissions && isSubscribed) {
+ } else if (!isMlUser && isSubscribed) {
setLoading(false);
- } else if (siemJobIds.length === 0 && isSubscribed) {
+ } else if (jobIds.length === 0 && isSubscribed) {
setLoading(false);
} else if (isSubscribed) {
setTableData(null);
@@ -132,9 +128,9 @@ export const useAnomaliesTableData = ({
startDateMs,
endDateMs,
skip,
- userPermissions,
+ isMlUser,
// eslint-disable-next-line react-hooks/exhaustive-deps
- siemJobIds.sort().join(),
+ jobIds.sort().join(),
]);
return [loading, tableData];
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/api/get_jobs_summary.ts b/x-pack/plugins/security_solution/public/common/components/ml/api/get_jobs_summary.ts
new file mode 100644
index 00000000000000..15f823814d7fc8
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/common/components/ml/api/get_jobs_summary.ts
@@ -0,0 +1,35 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { HttpSetup } from '../../../../../../../../src/core/public';
+import { MlSummaryJob } from '../../../../../../ml/public';
+
+export interface GetJobsSummaryArgs {
+ http: HttpSetup;
+ jobIds?: string[];
+ signal: AbortSignal;
+}
+
+/**
+ * Fetches a summary of all ML jobs currently installed
+ *
+ * @param http HTTP Service
+ * @param jobIds Array of job IDs to filter against
+ * @param signal to cancel request
+ *
+ * @throws An error if response is not OK
+ */
+export const getJobsSummary = async ({
+ http,
+ jobIds,
+ signal,
+}: GetJobsSummaryArgs): Promise =>
+ http.fetch('/api/ml/jobs/jobs_summary', {
+ method: 'POST',
+ body: JSON.stringify({ jobIds: jobIds ?? [] }),
+ asSystemRequest: true,
+ signal,
+ });
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/api/get_ml_capabilities.ts b/x-pack/plugins/security_solution/public/common/components/ml/api/get_ml_capabilities.ts
index 32f6f888ab8d71..8ee765c1dea476 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml/api/get_ml_capabilities.ts
+++ b/x-pack/plugins/security_solution/public/common/components/ml/api/get_ml_capabilities.ts
@@ -4,8 +4,8 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import { HttpSetup } from '../../../../../../../../src/core/public';
import { MlCapabilitiesResponse } from '../../../../../../ml/public';
-import { KibanaServices } from '../../../lib/kibana';
import { InfluencerInput } from '../types';
export interface Body {
@@ -21,10 +21,15 @@ export interface Body {
maxExamples: number;
}
-export const getMlCapabilities = async (signal: AbortSignal): Promise => {
- return KibanaServices.get().http.fetch('/api/ml/ml_capabilities', {
+export const getMlCapabilities = async ({
+ http,
+ signal,
+}: {
+ http: HttpSetup;
+ signal: AbortSignal;
+}): Promise =>
+ http.fetch('/api/ml/ml_capabilities', {
method: 'GET',
asSystemRequest: true,
signal,
});
-};
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_jobs_summary.ts b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_jobs_summary.ts
new file mode 100644
index 00000000000000..a80bfb59649cb4
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_jobs_summary.ts
@@ -0,0 +1,12 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { useAsync, withOptionalSignal } from '../../../../shared_imports';
+import { getJobsSummary } from '../api/get_jobs_summary';
+
+const _getJobsSummary = withOptionalSignal(getJobsSummary);
+
+export const useGetJobsSummary = () => useAsync(_getJobsSummary);
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_ml_capabilities.ts b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_ml_capabilities.ts
new file mode 100644
index 00000000000000..aabd8c7b62e85f
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_ml_capabilities.ts
@@ -0,0 +1,12 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { getMlCapabilities } from '../api/get_ml_capabilities';
+import { useAsync, withOptionalSignal } from '../../../../shared_imports';
+
+const _getMlCapabilities = withOptionalSignal(getMlCapabilities);
+
+export const useGetMlCapabilities = () => useAsync(_getMlCapabilities);
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.test.ts
new file mode 100644
index 00000000000000..72690a17739266
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.test.ts
@@ -0,0 +1,99 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { renderHook } from '@testing-library/react-hooks';
+
+import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions';
+import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license';
+import { isSecurityJob } from '../../../../../common/machine_learning/is_security_job';
+import { useAppToasts } from '../../../hooks/use_app_toasts';
+import { useAppToastsMock } from '../../../hooks/use_app_toasts.mock';
+import { mockJobsSummaryResponse } from '../../ml_popover/api.mock';
+import { getJobsSummary } from '../api/get_jobs_summary';
+import { useInstalledSecurityJobs } from './use_installed_security_jobs';
+
+jest.mock('../../../../../common/machine_learning/has_ml_user_permissions');
+jest.mock('../../../../../common/machine_learning/has_ml_license');
+jest.mock('../../../hooks/use_app_toasts');
+jest.mock('../api/get_jobs_summary');
+
+describe('useInstalledSecurityJobs', () => {
+ let appToastsMock: jest.Mocked>;
+
+ beforeEach(() => {
+ appToastsMock = useAppToastsMock.create();
+ (useAppToasts as jest.Mock).mockReturnValue(appToastsMock);
+ (getJobsSummary as jest.Mock).mockResolvedValue(mockJobsSummaryResponse);
+ });
+
+ describe('when the user has permissions', () => {
+ beforeEach(() => {
+ (hasMlUserPermissions as jest.Mock).mockReturnValue(true);
+ (hasMlLicense as jest.Mock).mockReturnValue(true);
+ });
+
+ it('returns jobs and permissions', async () => {
+ const { result, waitForNextUpdate } = renderHook(() => useInstalledSecurityJobs());
+ await waitForNextUpdate();
+
+ expect(result.current.jobs).toHaveLength(3);
+ expect(result.current.jobs).toEqual(
+ expect.arrayContaining([
+ {
+ datafeedId: 'datafeed-siem-api-rare_process_linux_ecs',
+ datafeedIndices: ['auditbeat-*'],
+ datafeedState: 'stopped',
+ description: 'SIEM Auditbeat: Detect unusually rare processes on Linux (beta)',
+ earliestTimestampMs: 1557353420495,
+ groups: ['siem'],
+ hasDatafeed: true,
+ id: 'siem-api-rare_process_linux_ecs',
+ isSingleMetricViewerJob: true,
+ jobState: 'closed',
+ latestTimestampMs: 1557434782207,
+ memory_status: 'hard_limit',
+ processed_record_count: 582251,
+ },
+ ])
+ );
+ expect(result.current.isMlUser).toEqual(true);
+ expect(result.current.isLicensed).toEqual(true);
+ });
+
+ it('filters out non-security jobs', async () => {
+ const { result, waitForNextUpdate } = renderHook(() => useInstalledSecurityJobs());
+ await waitForNextUpdate();
+
+ expect(result.current.jobs.length).toBeGreaterThan(0);
+ expect(result.current.jobs.every(isSecurityJob)).toEqual(true);
+ });
+
+ it('renders a toast error if the ML call fails', async () => {
+ (getJobsSummary as jest.Mock).mockRejectedValue('whoops');
+ const { waitForNextUpdate } = renderHook(() => useInstalledSecurityJobs());
+ await waitForNextUpdate();
+
+ expect(appToastsMock.addError).toHaveBeenCalledWith('whoops', {
+ title: 'Security job fetch failure',
+ });
+ });
+ });
+
+ describe('when the user does not have valid permissions', () => {
+ beforeEach(() => {
+ (hasMlUserPermissions as jest.Mock).mockReturnValue(false);
+ (hasMlLicense as jest.Mock).mockReturnValue(false);
+ });
+
+ it('returns empty jobs and false predicates', () => {
+ const { result } = renderHook(() => useInstalledSecurityJobs());
+
+ expect(result.current.jobs).toEqual([]);
+ expect(result.current.isMlUser).toEqual(false);
+ expect(result.current.isLicensed).toEqual(false);
+ });
+ });
+});
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.ts b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.ts
new file mode 100644
index 00000000000000..a9a728f81cc6cd
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.ts
@@ -0,0 +1,63 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { useEffect, useState } from 'react';
+
+import { MlSummaryJob } from '../../../../../../ml/public';
+import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions';
+import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license';
+import { isSecurityJob } from '../../../../../common/machine_learning/is_security_job';
+import { useAppToasts } from '../../../hooks/use_app_toasts';
+import { useHttp } from '../../../lib/kibana';
+import { useMlCapabilities } from './use_ml_capabilities';
+import * as i18n from '../translations';
+import { useGetJobsSummary } from './use_get_jobs_summary';
+
+export interface UseInstalledSecurityJobsReturn {
+ loading: boolean;
+ jobs: MlSummaryJob[];
+ isMlUser: boolean;
+ isLicensed: boolean;
+}
+
+/**
+ * Returns a collection of installed ML jobs (MlSummaryJob) relevant to
+ * Security Solution, i.e. all installed jobs in the `security` ML group.
+ * Use the corresponding helper functions to filter the job list as
+ * necessary (running jobs, etc).
+ *
+ */
+export const useInstalledSecurityJobs = (): UseInstalledSecurityJobsReturn => {
+ const [jobs, setJobs] = useState([]);
+ const { addError } = useAppToasts();
+ const mlCapabilities = useMlCapabilities();
+ const http = useHttp();
+ const { error, loading, result, start } = useGetJobsSummary();
+
+ const isMlUser = hasMlUserPermissions(mlCapabilities);
+ const isLicensed = hasMlLicense(mlCapabilities);
+
+ useEffect(() => {
+ if (isMlUser && isLicensed) {
+ start({ http });
+ }
+ }, [http, isMlUser, isLicensed, start]);
+
+ useEffect(() => {
+ if (result) {
+ const securityJobs = result.filter(isSecurityJob);
+ setJobs(securityJobs);
+ }
+ }, [result]);
+
+ useEffect(() => {
+ if (error) {
+ addError(error, { title: i18n.SIEM_JOB_FETCH_FAILURE });
+ }
+ }, [addError, error]);
+
+ return { isLicensed, isMlUser, jobs, loading };
+};
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_ml_capabilities.tsx b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_ml_capabilities.ts
similarity index 80%
rename from x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_ml_capabilities.tsx
rename to x-pack/plugins/security_solution/public/common/components/ml/hooks/use_ml_capabilities.ts
index d897b2554b4fdd..4f804a355e4b55 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_ml_capabilities.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_ml_capabilities.ts
@@ -6,6 +6,6 @@
import { useContext } from 'react';
-import { MlCapabilitiesContext } from '../../ml/permissions/ml_capabilities_provider';
+import { MlCapabilitiesContext } from '../permissions/ml_capabilities_provider';
export const useMlCapabilities = () => useContext(MlCapabilitiesContext);
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx b/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx
index c83271a56be5a8..c12c8d78da714e 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx
@@ -8,9 +8,9 @@ import React, { useState, useEffect } from 'react';
import { MlCapabilitiesResponse } from '../../../../../../ml/public';
import { emptyMlCapabilities } from '../../../../../common/machine_learning/empty_ml_capabilities';
-import { getMlCapabilities } from '../api/get_ml_capabilities';
-import { errorToToaster, useStateToaster } from '../../toasters';
-
+import { useAppToasts } from '../../../hooks/use_app_toasts';
+import { useHttp } from '../../../lib/kibana';
+import { useGetMlCapabilities } from '../hooks/use_get_ml_capabilities';
import * as i18n from './translations';
interface MlCapabilitiesProvider extends MlCapabilitiesResponse {
@@ -32,36 +32,27 @@ export const MlCapabilitiesProvider = React.memo<{ children: JSX.Element }>(({ c
const [capabilities, setCapabilities] = useState(
emptyMlCapabilitiesProvider
);
- const [, dispatchToaster] = useStateToaster();
+ const http = useHttp();
+ const { addError } = useAppToasts();
+ const { start, result, error } = useGetMlCapabilities();
useEffect(() => {
- let isSubscribed = true;
- const abortCtrl = new AbortController();
+ start({ http });
+ }, [http, start]);
- async function fetchMlCapabilities() {
- try {
- const mlCapabilities = await getMlCapabilities(abortCtrl.signal);
- if (isSubscribed) {
- setCapabilities({ ...mlCapabilities, capabilitiesFetched: true });
- }
- } catch (error) {
- if (isSubscribed) {
- errorToToaster({
- title: i18n.MACHINE_LEARNING_PERMISSIONS_FAILURE,
- error,
- dispatchToaster,
- });
- }
- }
+ useEffect(() => {
+ if (result) {
+ setCapabilities({ ...result, capabilitiesFetched: true });
}
+ }, [result]);
- fetchMlCapabilities();
- return () => {
- isSubscribed = false;
- abortCtrl.abort();
- };
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
+ useEffect(() => {
+ if (error) {
+ addError(error, {
+ title: i18n.MACHINE_LEARNING_PERMISSIONS_FAILURE,
+ });
+ }
+ }, [addError, error]);
return (
{children}
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx
index 9bfae686b1a594..7fdf41e6b6500d 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx
@@ -16,7 +16,7 @@ import { convertAnomaliesToHosts } from './convert_anomalies_to_hosts';
import { Loader } from '../../loader';
import { getIntervalFromAnomalies } from '../anomaly/get_interval_from_anomalies';
import { AnomaliesHostTableProps } from '../types';
-import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities';
+import { useMlCapabilities } from '../hooks/use_ml_capabilities';
import { BasicTable } from './basic_table';
import { hostEquality } from './host_equality';
import { getCriteriaFromHostType } from '../criteria/get_criteria_from_host_type';
diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_network_table.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_network_table.tsx
index af27d411b990d9..124d8d9a794c1a 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_network_table.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_network_table.tsx
@@ -14,7 +14,7 @@ import { convertAnomaliesToNetwork } from './convert_anomalies_to_network';
import { Loader } from '../../loader';
import { AnomaliesNetworkTableProps } from '../types';
import { getAnomaliesNetworkTableColumnsCurated } from './get_anomalies_network_table_columns';
-import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities';
+import { useMlCapabilities } from '../hooks/use_ml_capabilities';
import { BasicTable } from './basic_table';
import { networkEquality } from './network_equality';
import { getCriteriaFromNetworkType } from '../criteria/get_criteria_from_network_type';
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/translations.ts b/x-pack/plugins/security_solution/public/common/components/ml/translations.ts
similarity index 100%
rename from x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/translations.ts
rename to x-pack/plugins/security_solution/public/common/components/ml/translations.ts
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/__mocks__/api.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.mock.ts
similarity index 99%
rename from x-pack/plugins/security_solution/public/common/components/ml_popover/__mocks__/api.tsx
rename to x-pack/plugins/security_solution/public/common/components/ml_popover/api.mock.ts
index 54bb0a96207e14..0e8f033ff0cf35 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/__mocks__/api.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.mock.ts
@@ -4,16 +4,16 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import { MlSummaryJob } from '../../../../../ml/public';
import {
Group,
- JobSummary,
Module,
RecognizerModule,
SetupMlResponse,
- SiemJob,
+ SecurityJob,
StartDatafeedResponse,
StopDatafeedResponse,
-} from '../types';
+} from './types';
export const mockGroupsResponse: Group[] = [
{
@@ -31,7 +31,7 @@ export const mockGroupsResponse: Group[] = [
{ id: 'suricata', jobIds: ['suricata_alert_rate'], calendarIds: [] },
];
-export const mockOpenedJob: JobSummary = {
+export const mockOpenedJob: MlSummaryJob = {
datafeedId: 'datafeed-siem-api-rare_process_linux_ecs',
datafeedIndices: ['auditbeat-*'],
datafeedState: 'started',
@@ -48,7 +48,7 @@ export const mockOpenedJob: JobSummary = {
processed_record_count: 3425264,
};
-export const mockJobsSummaryResponse: JobSummary[] = [
+export const mockJobsSummaryResponse: MlSummaryJob[] = [
{
id: 'rc-rare-process-windows-5',
description:
@@ -491,7 +491,7 @@ export const mockStopDatafeedsSuccess: StopDatafeedResponse = {
'datafeed-linux_anomalous_network_service': { stopped: true },
};
-export const mockSiemJobs: SiemJob[] = [
+export const mockSecurityJobs: SecurityJob[] = [
{
id: 'linux_anomalous_network_activity_ecs',
description:
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts
similarity index 89%
rename from x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx
rename to x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts
index 7c72098209a066..dd0fb33fd2bc67 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts
@@ -9,7 +9,6 @@ import {
CloseJobsResponse,
ErrorResponse,
GetModulesProps,
- JobSummary,
MlSetupArgs,
Module,
RecognizerModule,
@@ -165,21 +164,3 @@ export const stopDatafeeds = async ({
return [stopDatafeedsResponse, closeJobsResponse];
};
-
-/**
- * Fetches a summary of all ML jobs currently installed
- *
- * NOTE: If not sending jobIds in the body, you must at least send an empty body or the server will
- * return a 500
- *
- * @param signal to cancel request
- *
- * @throws An error if response is not OK
- */
-export const getJobsSummary = async (signal: AbortSignal): Promise =>
- KibanaServices.get().http.fetch('/api/ml/jobs/jobs_summary', {
- method: 'POST',
- body: JSON.stringify({}),
- asSystemRequest: true,
- signal,
- });
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.test.tsx
index 0b8da6be57e1b5..2a2db46d423077 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.test.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.test.tsx
@@ -4,14 +4,14 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { mockSiemJobs } from './__mocks__/api';
+import { mockSecurityJobs } from './api.mock';
import { filterJobs, getStablePatternTitles, searchFilter } from './helpers';
describe('helpers', () => {
describe('filterJobs', () => {
test('returns all jobs when no filter is suplied', () => {
const filteredJobs = filterJobs({
- jobs: mockSiemJobs,
+ jobs: mockSecurityJobs,
selectedGroups: [],
showCustomJobs: false,
showElasticJobs: false,
@@ -23,17 +23,17 @@ describe('helpers', () => {
describe('searchFilter', () => {
test('returns all jobs when nullfilterQuery is provided', () => {
- const jobsToDisplay = searchFilter(mockSiemJobs);
- expect(jobsToDisplay.length).toEqual(mockSiemJobs.length);
+ const jobsToDisplay = searchFilter(mockSecurityJobs);
+ expect(jobsToDisplay.length).toEqual(mockSecurityJobs.length);
});
test('returns correct DisplayJobs when filterQuery matches job.id', () => {
- const jobsToDisplay = searchFilter(mockSiemJobs, 'rare_process');
+ const jobsToDisplay = searchFilter(mockSecurityJobs, 'rare_process');
expect(jobsToDisplay.length).toEqual(2);
});
test('returns correct DisplayJobs when filterQuery matches job.description', () => {
- const jobsToDisplay = searchFilter(mockSiemJobs, 'Detect unusually');
+ const jobsToDisplay = searchFilter(mockSecurityJobs, 'Detect unusually');
expect(jobsToDisplay.length).toEqual(2);
});
});
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.tsx
index 5989d052f7cd25..daf9da855c0f94 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.tsx
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { SiemJob } from './types';
+import { SecurityJob } from './types';
/**
* Returns a filtered array of Jobs according to JobsTableFilters selections
@@ -22,12 +22,12 @@ export const filterJobs = ({
showElasticJobs,
filterQuery,
}: {
- jobs: SiemJob[];
+ jobs: SecurityJob[];
selectedGroups: string[];
showCustomJobs: boolean;
showElasticJobs: boolean;
filterQuery: string;
-}): SiemJob[] =>
+}): SecurityJob[] =>
searchFilter(
jobs
.filter((job) => !showCustomJobs || (showCustomJobs && !job.isElasticJob))
@@ -44,7 +44,7 @@ export const filterJobs = ({
* @param jobs to filter
* @param filterQuery user-provided search string to filter for occurrence in job names/description
*/
-export const searchFilter = (jobs: SiemJob[], filterQuery?: string): SiemJob[] =>
+export const searchFilter = (jobs: SecurityJob[], filterQuery?: string): SecurityJob[] =>
jobs.filter((job) =>
filterQuery == null
? true
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.test.ts b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.test.ts
new file mode 100644
index 00000000000000..80f50912a84f28
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.test.ts
@@ -0,0 +1,110 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { renderHook } from '@testing-library/react-hooks';
+
+import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions';
+import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license';
+import { useAppToasts } from '../../../hooks/use_app_toasts';
+import { useAppToastsMock } from '../../../hooks/use_app_toasts.mock';
+import { getJobsSummary } from '../../ml/api/get_jobs_summary';
+import { checkRecognizer, getModules } from '../api';
+import { SecurityJob } from '../types';
+import {
+ mockJobsSummaryResponse,
+ mockGetModuleResponse,
+ checkRecognizerSuccess,
+} from '../api.mock';
+import { useSecurityJobs } from './use_security_jobs';
+
+jest.mock('../../../../../common/machine_learning/has_ml_admin_permissions');
+jest.mock('../../../../../common/machine_learning/has_ml_license');
+jest.mock('../../../lib/kibana');
+jest.mock('../../../hooks/use_app_toasts');
+jest.mock('../../ml/hooks/use_ml_capabilities');
+jest.mock('../../ml/api/get_jobs_summary');
+jest.mock('../api');
+
+describe('useSecurityJobs', () => {
+ let appToastsMock: jest.Mocked>;
+
+ beforeEach(() => {
+ appToastsMock = useAppToastsMock.create();
+ (useAppToasts as jest.Mock).mockReturnValue(appToastsMock);
+ });
+
+ describe('when user has valid permissions', () => {
+ beforeEach(() => {
+ (hasMlAdminPermissions as jest.Mock).mockReturnValue(true);
+ (hasMlLicense as jest.Mock).mockReturnValue(true);
+ (getJobsSummary as jest.Mock).mockResolvedValue(mockJobsSummaryResponse);
+ (getModules as jest.Mock).mockResolvedValue(mockGetModuleResponse);
+ (checkRecognizer as jest.Mock).mockResolvedValue(checkRecognizerSuccess);
+ });
+
+ it('combines multiple ML calls into an array of SecurityJobs', async () => {
+ const expectedSecurityJob: SecurityJob = {
+ datafeedId: 'datafeed-siem-api-rare_process_linux_ecs',
+ datafeedIndices: ['auditbeat-*'],
+ datafeedState: 'stopped',
+ defaultIndexPattern: '',
+ description: 'SIEM Auditbeat: Detect unusually rare processes on Linux (beta)',
+ earliestTimestampMs: 1557353420495,
+ groups: ['siem'],
+ hasDatafeed: true,
+ id: 'siem-api-rare_process_linux_ecs',
+ isCompatible: true,
+ isElasticJob: false,
+ isInstalled: true,
+ isSingleMetricViewerJob: true,
+ jobState: 'closed',
+ latestTimestampMs: 1557434782207,
+ memory_status: 'hard_limit',
+ moduleId: '',
+ processed_record_count: 582251,
+ };
+
+ const { result, waitForNextUpdate } = renderHook(() => useSecurityJobs(false));
+ await waitForNextUpdate();
+
+ expect(result.current.jobs).toHaveLength(6);
+ expect(result.current.jobs).toEqual(expect.arrayContaining([expectedSecurityJob]));
+ });
+
+ it('returns those permissions', async () => {
+ const { result, waitForNextUpdate } = renderHook(() => useSecurityJobs(false));
+ await waitForNextUpdate();
+
+ expect(result.current.isMlAdmin).toEqual(true);
+ expect(result.current.isLicensed).toEqual(true);
+ });
+
+ it('renders a toast error if an ML call fails', async () => {
+ (getModules as jest.Mock).mockRejectedValue('whoops');
+ const { waitForNextUpdate } = renderHook(() => useSecurityJobs(false));
+ await waitForNextUpdate();
+
+ expect(appToastsMock.addError).toHaveBeenCalledWith('whoops', {
+ title: 'Security job fetch failure',
+ });
+ });
+ });
+
+ describe('when the user does not have valid permissions', () => {
+ beforeEach(() => {
+ (hasMlAdminPermissions as jest.Mock).mockReturnValue(false);
+ (hasMlLicense as jest.Mock).mockReturnValue(false);
+ });
+
+ it('returns empty jobs and false predicates', () => {
+ const { result } = renderHook(() => useSecurityJobs(false));
+
+ expect(result.current.jobs).toEqual([]);
+ expect(result.current.isMlAdmin).toEqual(false);
+ expect(result.current.isLicensed).toEqual(false);
+ });
+ });
+});
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.ts b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.ts
new file mode 100644
index 00000000000000..e8809e8366eed4
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.ts
@@ -0,0 +1,95 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { useEffect, useState } from 'react';
+
+import { DEFAULT_INDEX_KEY } from '../../../../../common/constants';
+import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions';
+import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license';
+import { useAppToasts } from '../../../hooks/use_app_toasts';
+import { useUiSetting$, useHttp } from '../../../lib/kibana';
+import { checkRecognizer, getModules } from '../api';
+import { SecurityJob } from '../types';
+import { createSecurityJobs } from './use_security_jobs_helpers';
+import { useMlCapabilities } from '../../ml/hooks/use_ml_capabilities';
+import * as i18n from '../../ml/translations';
+import { getJobsSummary } from '../../ml/api/get_jobs_summary';
+
+export interface UseSecurityJobsReturn {
+ loading: boolean;
+ jobs: SecurityJob[];
+ isMlAdmin: boolean;
+ isLicensed: boolean;
+}
+
+/**
+ * Compiles a collection of SecurityJobs, which are a list of all jobs relevant to the Security Solution App. This
+ * includes all installed jobs in the `Security` ML group, and all jobs within ML Modules defined in
+ * ml_module (whether installed or not). Use the corresponding helper functions to filter the job
+ * list as necessary. E.g. installed jobs, running jobs, etc.
+ *
+ * NOTE: If the user is not an ml admin, jobs will be empty and isMlAdmin will be false.
+ *
+ * @param refetchData
+ */
+export const useSecurityJobs = (refetchData: boolean): UseSecurityJobsReturn => {
+ const [jobs, setJobs] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const mlCapabilities = useMlCapabilities();
+ const [siemDefaultIndex] = useUiSetting$(DEFAULT_INDEX_KEY);
+ const http = useHttp();
+ const { addError } = useAppToasts();
+
+ const isMlAdmin = hasMlAdminPermissions(mlCapabilities);
+ const isLicensed = hasMlLicense(mlCapabilities);
+
+ useEffect(() => {
+ let isSubscribed = true;
+ const abortCtrl = new AbortController();
+ setLoading(true);
+
+ async function fetchSecurityJobIdsFromGroupsData() {
+ if (isMlAdmin && isLicensed) {
+ try {
+ // Batch fetch all installed jobs, ML modules, and check which modules are compatible with siemDefaultIndex
+ const [jobSummaryData, modulesData, compatibleModules] = await Promise.all([
+ getJobsSummary({ http, signal: abortCtrl.signal }),
+ getModules({ signal: abortCtrl.signal }),
+ checkRecognizer({
+ indexPatternName: siemDefaultIndex,
+ signal: abortCtrl.signal,
+ }),
+ ]);
+
+ const compositeSecurityJobs = createSecurityJobs(
+ jobSummaryData,
+ modulesData,
+ compatibleModules
+ );
+
+ if (isSubscribed) {
+ setJobs(compositeSecurityJobs);
+ }
+ } catch (error) {
+ if (isSubscribed) {
+ addError(error, { title: i18n.SIEM_JOB_FETCH_FAILURE });
+ }
+ }
+ }
+ if (isSubscribed) {
+ setLoading(false);
+ }
+ }
+
+ fetchSecurityJobIdsFromGroupsData();
+ return () => {
+ isSubscribed = false;
+ abortCtrl.abort();
+ };
+ }, [refetchData, isMlAdmin, isLicensed, siemDefaultIndex, addError, http]);
+
+ return { isLicensed, isMlAdmin, jobs, loading };
+};
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.test.tsx
similarity index 83%
rename from x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx
rename to x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.test.tsx
index fc9f369a305aa7..7fb4e6f59d9f7f 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.test.tsx
@@ -6,29 +6,29 @@
import {
composeModuleAndInstalledJobs,
- createSiemJobs,
+ createSecurityJobs,
getAugmentedFields,
getInstalledJobs,
getModuleJobs,
- moduleToSiemJob,
-} from './use_siem_jobs_helpers';
+ moduleToSecurityJob,
+} from './use_security_jobs_helpers';
import {
checkRecognizerSuccess,
mockGetModuleResponse,
mockJobsSummaryResponse,
-} from '../__mocks__/api';
+} from '../api.mock';
// TODO: Expand test coverage
-describe('useSiemJobsHelpers', () => {
- describe('moduleToSiemJob', () => {
- test('correctly converts module to SiemJob', () => {
- const siemJob = moduleToSiemJob(
+describe('useSecurityJobsHelpers', () => {
+ describe('moduleToSecurityJob', () => {
+ test('correctly converts module to SecurityJob', () => {
+ const securityJob = moduleToSecurityJob(
mockGetModuleResponse[0],
mockGetModuleResponse[0].jobs[0],
false
);
- expect(siemJob).toEqual({
+ expect(securityJob).toEqual({
datafeedId: '',
datafeedIndices: [],
datafeedState: '',
@@ -86,19 +86,19 @@ describe('useSiemJobsHelpers', () => {
const installedJobs = getInstalledJobs(mockJobsSummaryResponse, moduleJobs, [
'siem_auditbeat',
]);
- const siemJobs = composeModuleAndInstalledJobs(installedJobs, moduleJobs);
- expect(siemJobs.length).toEqual(6);
+ const securityJobs = composeModuleAndInstalledJobs(installedJobs, moduleJobs);
+ expect(securityJobs.length).toEqual(6);
});
});
- describe('createSiemJobs', () => {
+ describe('createSecurityJobs', () => {
test('returns correct number of jobs when creating jobs with successful responses', () => {
- const siemJobs = createSiemJobs(
+ const securityJobs = createSecurityJobs(
mockJobsSummaryResponse,
mockGetModuleResponse,
checkRecognizerSuccess
);
- expect(siemJobs.length).toEqual(6);
+ expect(securityJobs.length).toEqual(6);
});
});
});
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.tsx
similarity index 59%
rename from x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx
rename to x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.tsx
index adbd712ffeb3e0..d0109fd29b5fb8 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.tsx
@@ -5,26 +5,26 @@
*/
import {
- AugmentedSiemJobFields,
- JobSummary,
+ AugmentedSecurityJobFields,
Module,
ModuleJob,
RecognizerModule,
- SiemJob,
+ SecurityJob,
} from '../types';
import { mlModules } from '../ml_modules';
+import { MlSummaryJob } from '../../../../../../ml/public';
/**
- * Helper function for converting from ModuleJob -> SiemJob
+ * Helper function for converting from ModuleJob -> SecurityJob
* @param module
* @param moduleJob
* @param isCompatible
*/
-export const moduleToSiemJob = (
+export const moduleToSecurityJob = (
module: Module,
moduleJob: ModuleJob,
isCompatible: boolean
-): SiemJob => {
+): SecurityJob => {
return {
datafeedId: '',
datafeedIndices: [],
@@ -46,7 +46,7 @@ export const moduleToSiemJob = (
};
/**
- * Returns fields necessary to augment a ModuleJob to a SiemJob
+ * Returns fields necessary to augment a ModuleJob to a SecurityJob
*
* @param jobId
* @param moduleJobs
@@ -54,9 +54,9 @@ export const moduleToSiemJob = (
*/
export const getAugmentedFields = (
jobId: string,
- moduleJobs: SiemJob[],
+ moduleJobs: SecurityJob[],
compatibleModuleIds: string[]
-): AugmentedSiemJobFields => {
+): AugmentedSecurityJobFields => {
const moduleJob = moduleJobs.find((mj) => mj.id === jobId);
return moduleJob !== undefined
? {
@@ -74,24 +74,27 @@ export const getAugmentedFields = (
};
/**
- * Process Modules[] from the `get_module` ML API into SiemJobs[] by filtering to SIEM specific
+ * Process Modules[] from the `get_module` ML API into SecurityJobs[] by filtering to Security specific
* modules and unpacking jobs from each module
*
* @param modulesData
* @param compatibleModuleIds
*/
-export const getModuleJobs = (modulesData: Module[], compatibleModuleIds: string[]): SiemJob[] =>
+export const getModuleJobs = (
+ modulesData: Module[],
+ compatibleModuleIds: string[]
+): SecurityJob[] =>
modulesData
.filter((module) => mlModules.includes(module.id))
.map((module) => [
...module.jobs.map((moduleJob) =>
- moduleToSiemJob(module, moduleJob, compatibleModuleIds.includes(module.id))
+ moduleToSecurityJob(module, moduleJob, compatibleModuleIds.includes(module.id))
),
])
.flat();
/**
- * Process JobSummary[] from the `jobs_summary` ML API into SiemJobs[] by filtering to to SIEM jobs
+ * Process data from the `jobs_summary` ML API into SecurityJobs[] by filtering to Security jobs
* and augmenting with moduleId/defaultIndexPattern/isCompatible
*
* @param jobSummaryData
@@ -99,57 +102,57 @@ export const getModuleJobs = (modulesData: Module[], compatibleModuleIds: string
* @param compatibleModuleIds
*/
export const getInstalledJobs = (
- jobSummaryData: JobSummary[],
- moduleJobs: SiemJob[],
+ jobSummaryData: MlSummaryJob[],
+ moduleJobs: SecurityJob[],
compatibleModuleIds: string[]
-): SiemJob[] =>
+): SecurityJob[] =>
jobSummaryData
.filter(({ groups }) => groups.includes('siem') || groups.includes('security'))
- .map((jobSummary) => ({
+ .map((jobSummary) => ({
...jobSummary,
...getAugmentedFields(jobSummary.id, moduleJobs, compatibleModuleIds),
isInstalled: true,
}));
/**
- * Combines installed jobs + moduleSiemJobs that don't overlap and sorts by name asc
+ * Combines installed jobs + moduleSecurityJobs that don't overlap and sorts by name asc
*
* @param installedJobs
- * @param moduleSiemJobs
+ * @param moduleSecurityJobs
*/
export const composeModuleAndInstalledJobs = (
- installedJobs: SiemJob[],
- moduleSiemJobs: SiemJob[]
-): SiemJob[] => {
+ installedJobs: SecurityJob[],
+ moduleSecurityJobs: SecurityJob[]
+): SecurityJob[] => {
const installedJobsIds = installedJobs.map((installedJob) => installedJob.id);
return [
...installedJobs,
- ...moduleSiemJobs.filter((mj) => !installedJobsIds.includes(mj.id)),
+ ...moduleSecurityJobs.filter((mj) => !installedJobsIds.includes(mj.id)),
].sort((a, b) => a.id.localeCompare(b.id));
};
/**
- * Creates a list of SiemJobs by composing JobSummary jobs (installed jobs) and Module
- * jobs (pre-packaged SIEM jobs) into a single job object that can be used throughout the SIEM app
+ * Creates a list of SecurityJobs by composing jobs summaries (installed jobs) and Module
+ * jobs (pre-packaged Security jobs) into a single job object that can be used throughout the Security app
*
* @param jobSummaryData
* @param modulesData
* @param compatibleModules
*/
-export const createSiemJobs = (
- jobSummaryData: JobSummary[],
+export const createSecurityJobs = (
+ jobSummaryData: MlSummaryJob[],
modulesData: Module[],
compatibleModules: RecognizerModule[]
-): SiemJob[] => {
+): SecurityJob[] => {
// Create lookup of compatible modules
const compatibleModuleIds = compatibleModules.map((module) => module.id);
- // Process modulesData: Filter to SIEM specific modules, and unpack jobs from modules
- const moduleSiemJobs = getModuleJobs(modulesData, compatibleModuleIds);
+ // Process modulesData: Filter to Security specific modules, and unpack jobs from modules
+ const moduleSecurityJobs = getModuleJobs(modulesData, compatibleModuleIds);
- // Process jobSummaryData: Filter to SIEM jobs, and augment with moduleId/defaultIndexPattern/isCompatible
- const installedJobs = getInstalledJobs(jobSummaryData, moduleSiemJobs, compatibleModuleIds);
+ // Process jobSummaryData: Filter to Security jobs, and augment with moduleId/defaultIndexPattern/isCompatible
+ const installedJobs = getInstalledJobs(jobSummaryData, moduleSecurityJobs, compatibleModuleIds);
- // Combine installed jobs + moduleSiemJobs that don't overlap, and sort by name asc
- return composeModuleAndInstalledJobs(installedJobs, moduleSiemJobs);
+ // Combine installed jobs + moduleSecurityJobs that don't overlap, and sort by name asc
+ return composeModuleAndInstalledJobs(installedJobs, moduleSecurityJobs);
};
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx
deleted file mode 100644
index 7f0a8dea1913e4..00000000000000
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import { useEffect, useState } from 'react';
-
-import { DEFAULT_INDEX_KEY } from '../../../../../common/constants';
-import { checkRecognizer, getJobsSummary, getModules } from '../api';
-import { SiemJob } from '../types';
-import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions';
-import { errorToToaster, useStateToaster } from '../../toasters';
-import { useUiSetting$ } from '../../../lib/kibana';
-
-import * as i18n from './translations';
-import { createSiemJobs } from './use_siem_jobs_helpers';
-import { useMlCapabilities } from './use_ml_capabilities';
-
-type Return = [boolean, SiemJob[]];
-
-/**
- * Compiles a collection of SiemJobs, which are a list of all jobs relevant to the SIEM App. This
- * includes all installed jobs in the `SIEM` ML group, and all jobs within ML Modules defined in
- * ml_module (whether installed or not). Use the corresponding helper functions to filter the job
- * list as necessary. E.g. installed jobs, running jobs, etc.
- *
- * @param refetchData
- */
-export const useSiemJobs = (refetchData: boolean): Return => {
- const [siemJobs, setSiemJobs] = useState([]);
- const [loading, setLoading] = useState(true);
- const mlCapabilities = useMlCapabilities();
- const userPermissions = hasMlUserPermissions(mlCapabilities);
- const [siemDefaultIndex] = useUiSetting$(DEFAULT_INDEX_KEY);
- const [, dispatchToaster] = useStateToaster();
-
- useEffect(() => {
- let isSubscribed = true;
- const abortCtrl = new AbortController();
- setLoading(true);
-
- async function fetchSiemJobIdsFromGroupsData() {
- if (userPermissions) {
- try {
- // Batch fetch all installed jobs, ML modules, and check which modules are compatible with siemDefaultIndex
- const [jobSummaryData, modulesData, compatibleModules] = await Promise.all([
- getJobsSummary(abortCtrl.signal),
- getModules({ signal: abortCtrl.signal }),
- checkRecognizer({
- indexPatternName: siemDefaultIndex,
- signal: abortCtrl.signal,
- }),
- ]);
-
- const compositeSiemJobs = createSiemJobs(jobSummaryData, modulesData, compatibleModules);
-
- if (isSubscribed) {
- setSiemJobs(compositeSiemJobs);
- }
- } catch (error) {
- if (isSubscribed) {
- errorToToaster({ title: i18n.SIEM_JOB_FETCH_FAILURE, error, dispatchToaster });
- }
- }
- }
- if (isSubscribed) {
- setLoading(false);
- }
- }
-
- fetchSiemJobIdsFromGroupsData();
- return () => {
- isSubscribed = false;
- abortCtrl.abort();
- };
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [refetchData, userPermissions]);
-
- return [loading, siemJobs];
-};
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap
index 747ac63551b55b..9bee321e9fbde4 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap
@@ -25,7 +25,7 @@ exports[`JobsTableFilters renders correctly against snapshot 1`] = `
{
- let siemJobs: SiemJob[];
+ let securityJobs: SecurityJob[];
beforeEach(() => {
- siemJobs = cloneDeep(mockSiemJobs);
+ securityJobs = cloneDeep(mockSecurityJobs);
});
test('renders correctly against snapshot', () => {
const wrapper = shallow(
-
+
);
expect(wrapper).toMatchSnapshot();
});
@@ -29,7 +32,7 @@ describe('GroupsFilterPopover', () => {
const mockOnSelectedGroupsChanged = jest.fn();
const wrapper = mount(
);
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx
index d879942b8b1014..362fb94dc1ec4f 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx
@@ -15,30 +15,30 @@ import {
EuiSpacer,
} from '@elastic/eui';
import * as i18n from './translations';
-import { SiemJob } from '../../types';
+import { SecurityJob } from '../../types';
import { toggleSelectedGroup } from './toggle_selected_group';
interface GroupsFilterPopoverProps {
- siemJobs: SiemJob[];
+ securityJobs: SecurityJob[];
onSelectedGroupsChanged: Dispatch>;
}
/**
- * Popover for selecting which SiemJob groups to filter on. Component extracts unique groups and
- * their counts from the provided SiemJobs. The 'siem' & 'security' groups are filtered out as all jobs will be
+ * Popover for selecting which SecurityJob groups to filter on. Component extracts unique groups and
+ * their counts from the provided SecurityJobs. The 'siem' & 'security' groups are filtered out as all jobs will be
* siem/security jobs
*
- * @param siemJobs jobs to fetch groups from to display for filtering
+ * @param securityJobs jobs to fetch groups from to display for filtering
* @param onSelectedGroupsChanged change listener to be notified when group selection changes
*/
export const GroupsFilterPopoverComponent = ({
- siemJobs,
+ securityJobs,
onSelectedGroupsChanged,
}: GroupsFilterPopoverProps) => {
const [isGroupPopoverOpen, setIsGroupPopoverOpen] = useState(false);
const [selectedGroups, setSelectedGroups] = useState([]);
- const groups = siemJobs
+ const groups = securityJobs
.map((j) => j.groups)
.flat()
.filter((g) => g !== 'siem' && g !== 'security');
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx
index 5b656adc3e5817..6b7699d57aedf9 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx
@@ -7,20 +7,20 @@
import { mount, shallow } from 'enzyme';
import React from 'react';
import { JobsTableFiltersComponent } from './jobs_table_filters';
-import { SiemJob } from '../../types';
+import { SecurityJob } from '../../types';
import { cloneDeep } from 'lodash/fp';
-import { mockSiemJobs } from '../../__mocks__/api';
+import { mockSecurityJobs } from '../../api.mock';
describe('JobsTableFilters', () => {
- let siemJobs: SiemJob[];
+ let securityJobs: SecurityJob[];
beforeEach(() => {
- siemJobs = cloneDeep(mockSiemJobs);
+ securityJobs = cloneDeep(mockSecurityJobs);
});
test('renders correctly against snapshot', () => {
const wrapper = shallow(
-
+
);
expect(wrapper).toMatchSnapshot();
});
@@ -28,7 +28,7 @@ describe('JobsTableFilters', () => {
test('when you click Elastic Jobs filter, state is updated and it is selected', () => {
const onFilterChanged = jest.fn();
const wrapper = mount(
-
+
);
wrapper.find('[data-test-subj="show-elastic-jobs-filter-button"]').first().simulate('click');
@@ -45,7 +45,7 @@ describe('JobsTableFilters', () => {
test('when you click Custom Jobs filter, state is updated and it is selected', () => {
const onFilterChanged = jest.fn();
const wrapper = mount(
-
+
);
wrapper.find('[data-test-subj="show-custom-jobs-filter-button"]').first().simulate('click');
@@ -62,7 +62,7 @@ describe('JobsTableFilters', () => {
test('when you click Custom Jobs filter once, then Elastic Jobs filter, state is updated and selected changed', () => {
const onFilterChanged = jest.fn();
const wrapper = mount(
-
+
);
wrapper.find('[data-test-subj="show-custom-jobs-filter-button"]').first().simulate('click');
@@ -88,7 +88,7 @@ describe('JobsTableFilters', () => {
test('when you click Custom Jobs filter twice, state is updated and it is revert', () => {
const onFilterChanged = jest.fn();
const wrapper = mount(
-
+
);
wrapper.find('[data-test-subj="show-custom-jobs-filter-button"]').first().simulate('click');
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx
index 4cfb7f8ad2b5bb..f25ea667b34118 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx
@@ -15,11 +15,11 @@ import {
} from '@elastic/eui';
import { EuiSearchBarQuery } from '../../../../../timelines/components/open_timeline/types';
import * as i18n from './translations';
-import { JobsFilters, SiemJob } from '../../types';
+import { JobsFilters, SecurityJob } from '../../types';
import { GroupsFilterPopover } from './groups_filter_popover';
interface JobsTableFiltersProps {
- siemJobs: SiemJob[];
+ securityJobs: SecurityJob[];
onFilterChanged: Dispatch>;
}
@@ -27,10 +27,13 @@ interface JobsTableFiltersProps {
* Collection of filters for filtering data within the JobsTable. Contains search bar, Elastic/Custom
* Jobs filter button toggle, and groups selection
*
- * @param siemJobs jobs to fetch groups from to display for filtering
+ * @param securityJobs jobs to fetch groups from to display for filtering
* @param onFilterChanged change listener to be notified on filter changes
*/
-export const JobsTableFiltersComponent = ({ siemJobs, onFilterChanged }: JobsTableFiltersProps) => {
+export const JobsTableFiltersComponent = ({
+ securityJobs,
+ onFilterChanged,
+}: JobsTableFiltersProps) => {
const [filterQuery, setFilterQuery] = useState('');
const [selectedGroups, setSelectedGroups] = useState([]);
const [showCustomJobs, setShowCustomJobs] = useState(false);
@@ -71,7 +74,10 @@ export const JobsTableFiltersComponent = ({ siemJobs, onFilterChanged }: JobsTab
-
+
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.test.tsx
index ade8c6fe805257..e58d76bd1dde00 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.test.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.test.tsx
@@ -9,22 +9,22 @@ import React from 'react';
import { JobSwitchComponent } from './job_switch';
import { cloneDeep } from 'lodash/fp';
-import { mockSiemJobs } from '../__mocks__/api';
-import { SiemJob } from '../types';
+import { mockSecurityJobs } from '../api.mock';
+import { SecurityJob } from '../types';
describe('JobSwitch', () => {
- let siemJobs: SiemJob[];
+ let securityJobs: SecurityJob[];
let onJobStateChangeMock = jest.fn();
beforeEach(() => {
- siemJobs = cloneDeep(mockSiemJobs);
+ securityJobs = cloneDeep(mockSecurityJobs);
onJobStateChangeMock = jest.fn();
});
test('renders correctly against snapshot', () => {
const wrapper = shallow(
);
@@ -34,8 +34,8 @@ describe('JobSwitch', () => {
test('should call onJobStateChange when the switch is clicked to be true/open', () => {
const wrapper = mount(
);
@@ -57,8 +57,8 @@ describe('JobSwitch', () => {
test('should have a switch when it is not in the loading state', () => {
const wrapper = mount(
);
@@ -68,8 +68,8 @@ describe('JobSwitch', () => {
test('should not have a switch when it is in the loading state', () => {
const wrapper = mount(
);
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.tsx
index d370d475bd6e57..3ad71ee6b6919c 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.tsx
@@ -12,7 +12,7 @@ import {
isJobFailed,
isJobStarted,
} from '../../../../../common/machine_learning/helpers';
-import { SiemJob } from '../types';
+import { SecurityJob } from '../types';
const StaticSwitch = styled(EuiSwitch)`
.euiSwitch__thumb,
@@ -24,14 +24,14 @@ const StaticSwitch = styled(EuiSwitch)`
StaticSwitch.displayName = 'StaticSwitch';
export interface JobSwitchProps {
- job: SiemJob;
- isSiemJobsLoading: boolean;
- onJobStateChange: (job: SiemJob, latestTimestampMs: number, enable: boolean) => Promise;
+ job: SecurityJob;
+ isSecurityJobsLoading: boolean;
+ onJobStateChange: (job: SecurityJob, latestTimestampMs: number, enable: boolean) => Promise;
}
export const JobSwitchComponent = ({
job,
- isSiemJobsLoading,
+ isSecurityJobsLoading,
onJobStateChange,
}: JobSwitchProps) => {
const [isLoading, setIsLoading] = useState(false);
@@ -47,7 +47,7 @@ export const JobSwitchComponent = ({
return (
- {isSiemJobsLoading || isLoading || isJobLoading(job.jobState, job.datafeedState) ? (
+ {isSecurityJobsLoading || isLoading || isJobLoading(job.jobState, job.datafeedState) ? (
) : (
{
- let siemJobs: SiemJob[];
+ let securityJobs: SecurityJob[];
let onJobStateChangeMock = jest.fn();
beforeEach(() => {
- siemJobs = cloneDeep(mockSiemJobs);
+ securityJobs = cloneDeep(mockSecurityJobs);
onJobStateChangeMock = jest.fn();
});
@@ -25,7 +25,7 @@ describe('JobsTableComponent', () => {
const wrapper = shallow(
);
@@ -36,7 +36,7 @@ describe('JobsTableComponent', () => {
const wrapper = mount(
);
@@ -46,11 +46,11 @@ describe('JobsTableComponent', () => {
});
test('should render the hyperlink with URI encodings which points specifically to the job id', () => {
- siemJobs[0].id = 'job id with spaces';
+ securityJobs[0].id = 'job id with spaces';
const wrapper = mount(
);
@@ -63,7 +63,7 @@ describe('JobsTableComponent', () => {
const wrapper = mount(
);
@@ -73,14 +73,14 @@ describe('JobsTableComponent', () => {
.simulate('click', {
target: { checked: true },
});
- expect(onJobStateChangeMock.mock.calls[0]).toEqual([siemJobs[0], 1571022859393, true]);
+ expect(onJobStateChangeMock.mock.calls[0]).toEqual([securityJobs[0], 1571022859393, true]);
});
test('should have a switch when it is not in the loading state', () => {
const wrapper = mount(
);
@@ -91,7 +91,7 @@ describe('JobsTableComponent', () => {
const wrapper = mount(
);
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/jobs_table.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/jobs_table.tsx
index f28a99c9947d54..be911a1cd85378 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/jobs_table.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/jobs_table.tsx
@@ -25,7 +25,7 @@ import styled from 'styled-components';
import { useBasePath } from '../../../lib/kibana';
import * as i18n from './translations';
import { JobSwitch } from './job_switch';
-import { SiemJob } from '../types';
+import { SecurityJob } from '../types';
const JobNameWrapper = styled.div`
margin: 5px 0;
@@ -38,12 +38,12 @@ const truncateThreshold = 200;
const getJobsTableColumns = (
isLoading: boolean,
- onJobStateChange: (job: SiemJob, latestTimestampMs: number, enable: boolean) => Promise,
+ onJobStateChange: (job: SecurityJob, latestTimestampMs: number, enable: boolean) => Promise,
basePath: string
) => [
{
name: i18n.COLUMN_JOB_NAME,
- render: ({ id, description }: SiemJob) => (
+ render: ({ id, description }: SecurityJob) => (
(
+ render: ({ groups }: SecurityJob) => (
{groups.map((group) => (
@@ -76,9 +76,13 @@ const getJobsTableColumns = (
{
name: i18n.COLUMN_RUN_JOB,
- render: (job: SiemJob) =>
+ render: (job: SecurityJob) =>
job.isCompatible ? (
-
+
) : (
),
@@ -87,13 +91,16 @@ const getJobsTableColumns = (
} as const,
];
-const getPaginatedItems = (items: SiemJob[], pageIndex: number, pageSize: number): SiemJob[] =>
- items.slice(pageIndex * pageSize, pageIndex * pageSize + pageSize);
+const getPaginatedItems = (
+ items: SecurityJob[],
+ pageIndex: number,
+ pageSize: number
+): SecurityJob[] => items.slice(pageIndex * pageSize, pageIndex * pageSize + pageSize);
export interface JobTableProps {
isLoading: boolean;
- jobs: SiemJob[];
- onJobStateChange: (job: SiemJob, latestTimestampMs: number, enable: boolean) => Promise;
+ jobs: SecurityJob[];
+ onJobStateChange: (job: SecurityJob, latestTimestampMs: number, enable: boolean) => Promise;
}
export const JobsTableComponent = ({ isLoading, jobs, onJobStateChange }: JobTableProps) => {
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_popover.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_popover.tsx
index 0ebf3674718482..f2bf2273c4b3fb 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_popover.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_popover.tsx
@@ -12,19 +12,17 @@ import styled from 'styled-components';
import { useKibana } from '../../lib/kibana';
import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../lib/telemetry';
-import { hasMlAdminPermissions } from '../../../../common/machine_learning/has_ml_admin_permissions';
import { errorToToaster, useStateToaster, ActionToaster } from '../toasters';
import { setupMlJob, startDatafeeds, stopDatafeeds } from './api';
import { filterJobs } from './helpers';
-import { useSiemJobs } from './hooks/use_siem_jobs';
import { JobsTableFilters } from './jobs_table/filters/jobs_table_filters';
import { JobsTable } from './jobs_table/jobs_table';
import { ShowingCount } from './jobs_table/showing_count';
import { PopoverDescription } from './popover_description';
import * as i18n from './translations';
-import { JobsFilters, SiemJob } from './types';
+import { JobsFilters, SecurityJob } from './types';
import { UpgradeContents } from './upgrade_contents';
-import { useMlCapabilities } from './hooks/use_ml_capabilities';
+import { useSecurityJobs } from './hooks/use_security_jobs';
const PopoverContentsDiv = styled.div`
max-width: 684px;
@@ -87,24 +85,25 @@ export const MlPopover = React.memo(() => {
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
const [filterProperties, setFilterProperties] = useState(defaultFilterProps);
- const [isLoadingSiemJobs, siemJobs] = useSiemJobs(refreshToggle);
+ const { isMlAdmin, isLicensed, loading: isLoadingSecurityJobs, jobs } = useSecurityJobs(
+ refreshToggle
+ );
const [, dispatchToaster] = useStateToaster();
- const capabilities = useMlCapabilities();
const docLinks = useKibana().services.docLinks;
const handleJobStateChange = useCallback(
- (job: SiemJob, latestTimestampMs: number, enable: boolean) =>
+ (job: SecurityJob, latestTimestampMs: number, enable: boolean) =>
enableDatafeed(job, latestTimestampMs, enable, dispatch, dispatchToaster),
[dispatch, dispatchToaster]
);
const filteredJobs = filterJobs({
- jobs: siemJobs,
+ jobs,
...filterProperties,
});
- const incompatibleJobCount = siemJobs.filter((j) => !j.isCompatible).length;
+ const incompatibleJobCount = jobs.filter((j) => !j.isCompatible).length;
- if (!capabilities.isPlatinumOrTrialLicense) {
+ if (!isLicensed) {
// If the user does not have platinum show upgrade UI
return (
{
);
- } else if (hasMlAdminPermissions(capabilities)) {
+ } else if (isMlAdmin) {
// If the user has Platinum License & ML Admin Permissions, show Anomaly Detection button & full config UI
return (
{
-
+
@@ -194,7 +193,7 @@ export const MlPopover = React.memo(() => {
)}
@@ -209,7 +208,7 @@ export const MlPopover = React.memo(() => {
// Enable/Disable Job & Datafeed -- passed to JobsTable for use as callback on JobSwitch
const enableDatafeed = async (
- job: SiemJob,
+ job: SecurityJob,
latestTimestampMs: number,
enable: boolean,
dispatch: Dispatch,
@@ -257,7 +256,7 @@ const enableDatafeed = async (
dispatch({ type: 'refresh' });
};
-const submitTelemetry = (job: SiemJob, enabled: boolean) => {
+const submitTelemetry = (job: SecurityJob, enabled: boolean) => {
// Report type of job enabled/disabled
track(
METRIC_TYPE.COUNT,
diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/types.ts b/x-pack/plugins/security_solution/public/common/components/ml_popover/types.ts
index f39daa0b9a7fbe..c839f5110fe7fd 100644
--- a/x-pack/plugins/security_solution/public/common/components/ml_popover/types.ts
+++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/types.ts
@@ -4,8 +4,8 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { AuditMessageBase } from '../../../../../ml/public';
import { MlError } from '../ml/types';
+import { MlSummaryJob } from '../../../../../ml/public';
export interface Group {
id: string;
@@ -98,28 +98,6 @@ export interface MlSetupArgs {
prefix?: string;
}
-/**
- * Representation of an ML Job as returned from the `ml/jobs/jobs_summary` API
- */
-export interface JobSummary {
- auditMessage?: AuditMessageBase;
- datafeedId: string;
- datafeedIndices: string[];
- datafeedState: string;
- description: string;
- earliestTimestampMs?: number;
- latestResultsTimestampMs?: number;
- groups: string[];
- hasDatafeed: boolean;
- id: string;
- isSingleMetricViewerJob: boolean;
- jobState: string;
- latestTimestampMs?: number;
- memory_status: string;
- nodeName?: string;
- processed_record_count: number;
-}
-
export interface Detector {
detector_description: string;
function: string;
@@ -133,10 +111,10 @@ export interface CustomURL {
}
/**
- * Representation of an ML Job as used by the SIEM App -- a composition of ModuleJob and JobSummary
+ * Representation of an ML Job as used by the SIEM App -- a composition of ModuleJob and MlSummaryJob
* that includes necessary metadata like moduleName, defaultIndexPattern, etc.
*/
-export interface SiemJob extends JobSummary {
+export interface SecurityJob extends MlSummaryJob {
moduleId: string;
defaultIndexPattern: string;
isCompatible: boolean;
@@ -144,7 +122,7 @@ export interface SiemJob extends JobSummary {
isElasticJob: boolean;
}
-export interface AugmentedSiemJobFields {
+export interface AugmentedSecurityJobFields {
moduleId: string;
defaultIndexPattern: string;
isCompatible: boolean;
diff --git a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx
index 76270a7c08cd63..94019b26c180b0 100644
--- a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx
+++ b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx
@@ -9,7 +9,7 @@ import React, { useEffect } from 'react';
import { DEFAULT_ANOMALY_SCORE } from '../../../../../common/constants';
import { AnomaliesQueryTabBodyProps } from './types';
import { getAnomaliesFilterQuery } from './utils';
-import { useSiemJobs } from '../../../components/ml_popover/hooks/use_siem_jobs';
+import { useInstalledSecurityJobs } from '../../../components/ml/hooks/use_installed_security_jobs';
import { useUiSetting$ } from '../../../lib/kibana';
import { MatrixHistogramContainer } from '../../../components/matrix_histogram';
import { histogramConfigs } from './histogram_configs';
@@ -38,13 +38,13 @@ export const AnomaliesQueryTabBody = ({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
- const [, siemJobs] = useSiemJobs(true);
+ const { jobs } = useInstalledSecurityJobs();
const [anomalyScore] = useUiSetting$(DEFAULT_ANOMALY_SCORE);
const mergedFilterQuery = getAnomaliesFilterQuery(
filterQuery,
anomaliesFilterQuery,
- siemJobs,
+ jobs,
anomalyScore,
flowTarget,
ip
diff --git a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts
index 10d5d1c60a6c2b..5248801d723b60 100644
--- a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts
+++ b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts
@@ -6,21 +6,20 @@
import deepmerge from 'deepmerge';
+import { MlSummaryJob } from '../../../../../../ml/public';
import { ESTermQuery } from '../../../../../common/typed_json';
import { createFilter } from '../../helpers';
-import { SiemJob } from '../../../components/ml_popover/types';
import { FlowTarget } from '../../../../graphql/types';
export const getAnomaliesFilterQuery = (
filterQuery: string | ESTermQuery | undefined,
anomaliesFilterQuery: object = {},
- siemJobs: SiemJob[] = [],
+ securityJobs: MlSummaryJob[] = [],
anomalyScore: number,
flowTarget?: FlowTarget,
ip?: string
): string => {
- const siemJobIds = siemJobs
- .filter((job) => job.isInstalled)
+ const securityJobIds = securityJobs
.map((job) => job.id)
.map((jobId) => ({
match_phrase: {
@@ -38,7 +37,7 @@ export const getAnomaliesFilterQuery = (
filter: [
{
bool: {
- should: siemJobIds,
+ should: securityJobIds,
minimum_should_match: 1,
},
},
diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.mock.ts b/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.mock.ts
new file mode 100644
index 00000000000000..1af4ba3ba9233c
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.mock.ts
@@ -0,0 +1,14 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+const createAppToastsMock = () => ({
+ addError: jest.fn(),
+ addSuccess: jest.fn(),
+});
+
+export const useAppToastsMock = {
+ create: createAppToastsMock,
+};
diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts
index 2c52acd3ec747c..5f4285f2747ae1 100644
--- a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts
+++ b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts
@@ -17,6 +17,7 @@ export const KibanaServices = { get: jest.fn(), getKibanaVersion: jest.fn(() =>
export const useKibana = jest.fn(createUseKibanaMock());
export const useUiSetting = jest.fn(createUseUiSettingMock());
export const useUiSetting$ = jest.fn(createUseUiSetting$Mock());
+export const useHttp = jest.fn(() => useKibana().services.http);
export const useTimeZone = jest.fn();
export const useDateFormat = jest.fn();
export const useBasePath = jest.fn(() => '/test/base/path');
diff --git a/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts b/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts
index 13b3c4b249bfef..f8eed75cf9bf1a 100644
--- a/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts
+++ b/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts
@@ -6,8 +6,10 @@
import { coreMock } from '../../../../../../src/core/public/mocks';
import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks';
+import { securityMock } from '../../../../../plugins/security/public/mocks';
export const createKibanaCoreStartMock = () => coreMock.createStart();
export const createKibanaPluginsStartMock = () => ({
data: dataPluginMock.createStartContract(),
+ security: securityMock.createSetup(),
});
diff --git a/x-pack/plugins/security_solution/public/common/mock/kibana_react.ts b/x-pack/plugins/security_solution/public/common/mock/kibana_react.ts
index c5d50e1379482b..bdb8ca85b0d777 100644
--- a/x-pack/plugins/security_solution/public/common/mock/kibana_react.ts
+++ b/x-pack/plugins/security_solution/public/common/mock/kibana_react.ts
@@ -96,28 +96,10 @@ export const createUseKibanaMock = () => {
export const createStartServices = () => {
const core = createKibanaCoreStartMock();
const plugins = createKibanaPluginsStartMock();
- const security = {
- authc: {
- getCurrentUser: jest.fn(),
- areAPIKeysEnabled: jest.fn(),
- },
- sessionTimeout: {
- start: jest.fn(),
- stop: jest.fn(),
- extend: jest.fn(),
- },
- license: {
- isEnabled: jest.fn(),
- getFeatures: jest.fn(),
- features$: jest.fn(),
- },
- __legacyCompat: { logoutUrl: 'logoutUrl', tenant: 'tenant' },
- };
const services = ({
...core,
...plugins,
- security,
} as unknown) as StartServices;
return services;
diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx
index 47c12d19341740..00141c9a453d82 100644
--- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx
+++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx
@@ -38,7 +38,7 @@ import {
buildRuleTypeDescription,
buildThresholdDescription,
} from './helpers';
-import { useSiemJobs } from '../../../../common/components/ml_popover/hooks/use_siem_jobs';
+import { useSecurityJobs } from '../../../../common/components/ml_popover/hooks/use_security_jobs';
import { buildMlJobDescription } from './ml_job_description';
import { buildActionsDescription } from './actions_description';
import { buildThrottleDescription } from './throttle_description';
@@ -67,7 +67,7 @@ export const StepRuleDescriptionComponent: React.FC =
}) => {
const kibana = useKibana();
const [filterManager] = useState(new FilterManager(kibana.services.uiSettings));
- const [, siemJobs] = useSiemJobs(true);
+ const { jobs } = useSecurityJobs(false);
const keys = Object.keys(schema);
const listItems = keys.reduce((acc: ListItems[], key: string) => {
@@ -77,7 +77,7 @@ export const StepRuleDescriptionComponent: React.FC =
buildMlJobDescription(
get(key, data) as string,
(get(key, schema) as { label: string }).label,
- siemJobs
+ jobs
),
];
}
diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx
index c82a465f08c3a7..3152fef12c6523 100644
--- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx
+++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx
@@ -7,31 +7,14 @@
import React from 'react';
import { shallow } from 'enzyme';
+import { mockOpenedJob } from '../../../../common/components/ml_popover/api.mock';
import { MlJobDescription, AuditIcon, JobStatusBadge } from './ml_job_description';
-jest.mock('../../../../common/lib/kibana');
-const job = {
- moduleId: 'moduleId',
- defaultIndexPattern: 'defaultIndexPattern',
- isCompatible: true,
- isInstalled: true,
- isElasticJob: true,
- datafeedId: 'datafeedId',
- datafeedIndices: [],
- datafeedState: 'datafeedState',
- description: 'description',
- groups: [],
- hasDatafeed: true,
- id: 'id',
- isSingleMetricViewerJob: false,
- jobState: 'jobState',
- memory_status: 'memory_status',
- processed_record_count: 0,
-};
+jest.mock('../../../../common/lib/kibana');
describe('MlJobDescription', () => {
it('renders correctly', () => {
- const wrapper = shallow();
+ const wrapper = shallow();
expect(wrapper.find('[data-test-subj="machineLearningJobId"]')).toHaveLength(1);
});
@@ -47,7 +30,7 @@ describe('AuditIcon', () => {
describe('JobStatusBadge', () => {
it('renders correctly', () => {
- const wrapper = shallow();
+ const wrapper = shallow();
expect(wrapper.find('EuiBadge')).toHaveLength(1);
});
diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx
index d7e06511e79373..6baa2abab33d1a 100644
--- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx
+++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx
@@ -8,9 +8,9 @@ import React from 'react';
import styled from 'styled-components';
import { EuiBadge, EuiIcon, EuiLink, EuiToolTip } from '@elastic/eui';
+import { MlSummaryJob } from '../../../../../../ml/public';
import { isJobStarted } from '../../../../../common/machine_learning/helpers';
import { useKibana } from '../../../../common/lib/kibana';
-import { SiemJob } from '../../../../common/components/ml_popover/types';
import { ListItems } from './types';
import { ML_JOB_STARTED, ML_JOB_STOPPED } from './translations';
@@ -21,7 +21,7 @@ enum MessageLevels {
}
const AuditIconComponent: React.FC<{
- message: SiemJob['auditMessage'];
+ message: MlSummaryJob['auditMessage'];
}> = ({ message }) => {
if (!message) {
return null;
@@ -47,7 +47,7 @@ const AuditIconComponent: React.FC<{
export const AuditIcon = React.memo(AuditIconComponent);
-const JobStatusBadgeComponent: React.FC<{ job: SiemJob }> = ({ job }) => {
+const JobStatusBadgeComponent: React.FC<{ job: MlSummaryJob }> = ({ job }) => {
const isStarted = isJobStarted(job.jobState, job.datafeedState);
const color = isStarted ? 'secondary' : 'danger';
const text = isStarted ? ML_JOB_STARTED : ML_JOB_STOPPED;
@@ -69,7 +69,7 @@ const Wrapper = styled.div`
overflow: hidden;
`;
-const MlJobDescriptionComponent: React.FC<{ job: SiemJob }> = ({ job }) => {
+const MlJobDescriptionComponent: React.FC<{ job: MlSummaryJob }> = ({ job }) => {
const jobUrl = useKibana().services.application.getUrlForApp(
`ml#/jobs?mlManagement=(jobId:${encodeURI(job.id)})`
);
@@ -92,12 +92,12 @@ export const MlJobDescription = React.memo(MlJobDescriptionComponent);
export const buildMlJobDescription = (
jobId: string,
label: string,
- siemJobs: SiemJob[]
+ jobs: MlSummaryJob[]
): ListItems => {
- const siemJob = siemJobs.find((job) => job.id === jobId);
+ const job = jobs.find(({ id }) => id === jobId);
return {
title: label,
- description: siemJob ? : jobId,
+ description: job ? : jobId,
};
};
diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.test.tsx
index 6f6581e4de1c37..4a08adbedab3f6 100644
--- a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.test.tsx
+++ b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.test.tsx
@@ -8,14 +8,14 @@ import React from 'react';
import { shallow } from 'enzyme';
import { MlJobSelect } from './index';
-import { useSiemJobs } from '../../../../common/components/ml_popover/hooks/use_siem_jobs';
+import { useSecurityJobs } from '../../../../common/components/ml_popover/hooks/use_security_jobs';
import { useFormFieldMock } from '../../../../common/mock';
-jest.mock('../../../../common/components/ml_popover/hooks/use_siem_jobs');
+jest.mock('../../../../common/components/ml_popover/hooks/use_security_jobs');
jest.mock('../../../../common/lib/kibana');
describe('MlJobSelect', () => {
beforeAll(() => {
- (useSiemJobs as jest.Mock).mockReturnValue([false, []]);
+ (useSecurityJobs as jest.Mock).mockReturnValue({ loading: false, jobs: [] });
});
it('renders correctly', () => {
diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx
index cdfdf4ca6b66bf..b0aa0329fe8f40 100644
--- a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx
+++ b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx
@@ -19,7 +19,7 @@ import {
import styled from 'styled-components';
import { isJobStarted } from '../../../../../common/machine_learning/helpers';
import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../shared_imports';
-import { useSiemJobs } from '../../../../common/components/ml_popover/hooks/use_siem_jobs';
+import { useSecurityJobs } from '../../../../common/components/ml_popover/hooks/use_security_jobs';
import { useKibana } from '../../../../common/lib/kibana';
import {
ML_JOB_SELECT_PLACEHOLDER_TEXT,
@@ -81,7 +81,7 @@ interface MlJobSelectProps {
export const MlJobSelect: React.FC = ({ describedByIds = [], field }) => {
const jobId = field.value as string;
const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage(field);
- const [isLoading, siemJobs] = useSiemJobs(false);
+ const { loading, jobs } = useSecurityJobs(false);
const mlUrl = useKibana().services.application.getUrlForApp('ml');
const handleJobChange = useCallback(
(machineLearningJobId: string) => {
@@ -96,7 +96,7 @@ export const MlJobSelect: React.FC = ({ describedByIds = [], f
disabled: true,
};
- const jobOptions = siemJobs.map((job) => ({
+ const jobOptions = jobs.map((job) => ({
value: job.id,
inputDisplay: job.id,
dropdownDisplay: ,
@@ -107,9 +107,9 @@ export const MlJobSelect: React.FC = ({ describedByIds = [], f
const isJobRunning = useMemo(() => {
// If the selected job is not found in the list, it means the placeholder is selected
// and so we don't want to show the warning, thus isJobRunning will be true when 'job == null'
- const job = siemJobs.find((j) => j.id === jobId);
+ const job = jobs.find(({ id }) => id === jobId);
return job == null || isJobStarted(job.jobState, job.datafeedState);
- }, [siemJobs, jobId]);
+ }, [jobs, jobId]);
return (
@@ -126,7 +126,7 @@ export const MlJobSelect: React.FC = ({ describedByIds = [], f
= ({
componentProps={{
describedByIds: ['detectionEngineStepDefineRuleType'],
isReadOnly: isUpdateView,
- hasValidLicense: mlCapabilities.isPlatinumOrTrialLicense,
+ hasValidLicense: hasMlLicense(mlCapabilities),
isMlAdmin: hasMlAdminPermissions(mlCapabilities),
}}
/>
diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx
index 85dce907084e8a..110691328b13b5 100644
--- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx
+++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx
@@ -47,8 +47,9 @@ import { getColumns, getMonitoringColumns } from './columns';
import { showRulesTable } from './helpers';
import { allRulesReducer, State } from './reducer';
import { RulesTableFilters } from './rules_table_filters/rules_table_filters';
-import { useMlCapabilities } from '../../../../../common/components/ml_popover/hooks/use_ml_capabilities';
+import { useMlCapabilities } from '../../../../../common/components/ml/hooks/use_ml_capabilities';
import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions';
+import { hasMlLicense } from '../../../../../../common/machine_learning/has_ml_license';
import { SecurityPageName } from '../../../../../app/types';
import { useFormatUrl } from '../../../../../common/components/link_to';
@@ -145,8 +146,7 @@ export const AllRules = React.memo(
const { formatUrl } = useFormatUrl(SecurityPageName.detections);
// TODO: Refactor license check + hasMlAdminPermissions to common check
- const hasMlPermissions =
- mlCapabilities.isPlatinumOrTrialLicense && hasMlAdminPermissions(mlCapabilities);
+ const hasMlPermissions = hasMlLicense(mlCapabilities) && hasMlAdminPermissions(mlCapabilities);
const setRules = useCallback((newRules: Rule[], newPagination: Partial) => {
dispatch({
diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx
index 016d0c7c67a9e8..8a969a4cf098cb 100644
--- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx
+++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx
@@ -71,8 +71,9 @@ import { RuleActionsOverflow } from '../../../../components/rules/rule_actions_o
import { RuleStatusFailedCallOut } from './status_failed_callout';
import { FailureHistory } from './failure_history';
import { RuleStatus } from '../../../../components/rules//rule_status';
-import { useMlCapabilities } from '../../../../../common/components/ml_popover/hooks/use_ml_capabilities';
+import { useMlCapabilities } from '../../../../../common/components/ml/hooks/use_ml_capabilities';
import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions';
+import { hasMlLicense } from '../../../../../../common/machine_learning/has_ml_license';
import { SecurityPageName } from '../../../../../app/types';
import { LinkButton } from '../../../../../common/components/links';
import { useFormatUrl } from '../../../../../common/components/link_to';
@@ -161,8 +162,7 @@ export const RuleDetailsPageComponent: FC = ({
const { globalFullScreen } = useFullScreen();
// TODO: Refactor license check + hasMlAdminPermissions to common check
- const hasMlPermissions =
- mlCapabilities.isPlatinumOrTrialLicense && hasMlAdminPermissions(mlCapabilities);
+ const hasMlPermissions = hasMlLicense(mlCapabilities) && hasMlAdminPermissions(mlCapabilities);
const ruleDetailTabs = getRuleDetailsTabs(rule);
// persist rule until refresh is complete
diff --git a/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx b/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx
index 34840b28266268..67f563e944f42f 100644
--- a/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx
+++ b/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx
@@ -17,7 +17,7 @@ import { LastEventTime } from '../../../common/components/last_event_time';
import { AnomalyTableProvider } from '../../../common/components/ml/anomaly/anomaly_table_provider';
import { hostToCriteria } from '../../../common/components/ml/criteria/host_to_criteria';
import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions';
-import { useMlCapabilities } from '../../../common/components/ml_popover/hooks/use_ml_capabilities';
+import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities';
import { scoreIntervalToDateTime } from '../../../common/components/ml/score/score_interval_to_datetime';
import { SiemNavigation } from '../../../common/components/navigation';
import { KpiHostsComponent } from '../../components/kpi_hosts';
diff --git a/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx b/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx
index e4e69443c510d2..2b19249dc426fd 100644
--- a/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx
+++ b/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx
@@ -34,7 +34,7 @@ import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from
import { SpyRoute } from '../../common/utils/route/spy_routes';
import { esQuery } from '../../../../../../src/plugins/data/public';
-import { useMlCapabilities } from '../../common/components/ml_popover/hooks/use_ml_capabilities';
+import { useMlCapabilities } from '../../common/components/ml/hooks/use_ml_capabilities';
import { OverviewEmpty } from '../../overview/components/overview_empty';
import { Display } from './display';
import { HostsTabs } from './hosts_tabs';
diff --git a/x-pack/plugins/security_solution/public/network/components/ip_overview/index.tsx b/x-pack/plugins/security_solution/public/network/components/ip_overview/index.tsx
index cf08b084d21979..d6dfe1769308e9 100644
--- a/x-pack/plugins/security_solution/public/network/components/ip_overview/index.tsx
+++ b/x-pack/plugins/security_solution/public/network/components/ip_overview/index.tsx
@@ -30,7 +30,7 @@ import { DescriptionListStyled, OverviewWrapper } from '../../../common/componen
import { Loader } from '../../../common/components/loader';
import { Anomalies, NarrowDateRange } from '../../../common/components/ml/types';
import { AnomalyScores } from '../../../common/components/ml/score/anomaly_scores';
-import { useMlCapabilities } from '../../../common/components/ml_popover/hooks/use_ml_capabilities';
+import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities';
import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions';
import { InspectButton, InspectButtonContainer } from '../../../common/components/inspect';
diff --git a/x-pack/plugins/security_solution/public/network/pages/index.tsx b/x-pack/plugins/security_solution/public/network/pages/index.tsx
index 9ac05cc98bb454..07abe7bc8c209f 100644
--- a/x-pack/plugins/security_solution/public/network/pages/index.tsx
+++ b/x-pack/plugins/security_solution/public/network/pages/index.tsx
@@ -7,7 +7,7 @@
import React, { useMemo } from 'react';
import { Route, Switch, RouteComponentProps, useHistory } from 'react-router-dom';
-import { useMlCapabilities } from '../../common/components/ml_popover/hooks/use_ml_capabilities';
+import { useMlCapabilities } from '../../common/components/ml/hooks/use_ml_capabilities';
import { hasMlUserPermissions } from '../../../common/machine_learning/has_ml_user_permissions';
import { FlowTarget } from '../../graphql/types';
diff --git a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx
index 0a15b039b96af2..c7aba6fcc8a5b3 100644
--- a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx
+++ b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx
@@ -23,7 +23,7 @@ import { HostItem } from '../../../graphql/types';
import { Loader } from '../../../common/components/loader';
import { IPDetailsLink } from '../../../common/components/links';
import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions';
-import { useMlCapabilities } from '../../../common/components/ml_popover/hooks/use_ml_capabilities';
+import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities';
import { AnomalyScores } from '../../../common/components/ml/score/anomaly_scores';
import { Anomalies, NarrowDateRange } from '../../../common/components/ml/types';
import { DescriptionListStyled, OverviewWrapper } from '../../../common/components/page';
diff --git a/x-pack/plugins/security_solution/public/resolver/view/edge_line.tsx b/x-pack/plugins/security_solution/public/resolver/view/edge_line.tsx
index 9f310bb1cc0d65..061dfce64b4e44 100644
--- a/x-pack/plugins/security_solution/public/resolver/view/edge_line.tsx
+++ b/x-pack/plugins/security_solution/public/resolver/view/edge_line.tsx
@@ -127,7 +127,6 @@ const EdgeLineComponent = React.memo(
return (
void) => {
- const disabled = selectedItems?.some((item) => item.status === TimelineStatus.immutable);
+ const disabled = selectedItems == null || selectedItems.length === 0;
return (
<>
,
);
},
- // eslint-disable-next-line react-hooks/exhaustive-deps
[
selectedItems,
deleteTimelines,
diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx
index 9de3242c5e3038..3d5c5f60d1d9b0 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx
@@ -9,6 +9,7 @@ import { cloneDeep } from 'lodash/fp';
import { mountWithIntl } from 'test_utils/enzyme_helpers';
import React from 'react';
import { ThemeProvider } from 'styled-components';
+import { act } from '@testing-library/react';
import '../../../common/mock/match_media';
import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../pages/timelines_page';
@@ -51,7 +52,7 @@ describe('OpenTimeline', () => {
title,
timelineType: TimelineType.default,
timelineStatus: TimelineStatus.active,
- templateTimelineFilter: [],
+ templateTimelineFilter: [, ],
totalSearchResultsCount: mockSearchResults.length,
});
@@ -279,6 +280,86 @@ describe('OpenTimeline', () => {
expect(wrapper.find('[data-test-subj="utility-bar-action"]').exists()).toEqual(true);
});
+ test('it should disable export-timeline if no timeline is selected', async () => {
+ const defaultProps = {
+ ...getDefaultTestProps(mockResults),
+ timelineStatus: null,
+ selectedItems: [],
+ };
+ const wrapper = mountWithIntl(
+
+
+
+ );
+
+ wrapper.find('[data-test-subj="utility-bar-action"]').find('EuiLink').simulate('click');
+ await act(async () => {
+ expect(
+ wrapper.find('[data-test-subj="export-timeline-action"]').first().prop('disabled')
+ ).toEqual(true);
+ });
+ });
+
+ test('it should disable delete timeline if no timeline is selected', async () => {
+ const defaultProps = {
+ ...getDefaultTestProps(mockResults),
+ timelineStatus: null,
+ selectedItems: [],
+ };
+ const wrapper = mountWithIntl(
+
+
+
+ );
+
+ wrapper.find('[data-test-subj="utility-bar-action"]').find('EuiLink').simulate('click');
+ await act(async () => {
+ expect(
+ wrapper.find('[data-test-subj="delete-timeline-action"]').first().prop('disabled')
+ ).toEqual(true);
+ });
+ });
+
+ test('it should enable export-timeline if a timeline is selected', async () => {
+ const defaultProps = {
+ ...getDefaultTestProps(mockResults),
+ timelineStatus: null,
+ selectedItems: [{}],
+ };
+ const wrapper = mountWithIntl(
+
+
+
+ );
+
+ wrapper.find('[data-test-subj="utility-bar-action"]').find('EuiLink').simulate('click');
+ await act(async () => {
+ expect(
+ wrapper.find('[data-test-subj="export-timeline-action"]').first().prop('disabled')
+ ).toEqual(false);
+ });
+ });
+
+ test('it should enable delete timeline if a timeline is selected', async () => {
+ const defaultProps = {
+ ...getDefaultTestProps(mockResults),
+ timelineStatus: null,
+ selectedItems: [{}],
+ };
+ const wrapper = mountWithIntl(
+
+
+
+ );
+
+ wrapper.find('[data-test-subj="utility-bar-action"]').find('EuiLink').simulate('click');
+ await act(async () => {
+ expect(
+ wrapper.find('[data-test-subj="delete-timeline-action"]').first().prop('disabled')
+ ).toEqual(false);
+ });
+ });
+
test("it should render a selectable timeline table if timelineStatus is active (selecting custom templates' tab)", () => {
const defaultProps = {
...getDefaultTestProps(mockResults),
diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx
index c9495c46d4acf3..1f5f0ccca3b708 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx
@@ -160,7 +160,6 @@ export const OpenTimeline = React.memo(
}, [onDeleteSelected, deleteTimelines, timelineStatus]);
const SearchRowContent = useMemo(() => <>{templateTimelineFilter}>, [templateTimelineFilter]);
-
return (
<>
{
+ test('it filters out running tasks', async () => {
const taskManagerId = uuid.v1();
const claimOwnershipUntil = new Date(Date.now());
const runAt = new Date();
@@ -641,7 +641,7 @@ if (doc['task.runAt'].size()!=0) {
taskType: 'foo',
schedule: undefined,
attempts: 0,
- status: 'idle',
+ status: 'claiming',
params: '{ "hello": "world" }',
state: '{ "baby": "Henhen" }',
user: 'jimbo',
@@ -715,7 +715,103 @@ if (doc['task.runAt'].size()!=0) {
runAt,
scope: ['reporting'],
state: { baby: 'Henhen' },
- status: 'idle',
+ status: 'claiming',
+ taskType: 'foo',
+ user: 'jimbo',
+ ownerId: taskManagerId,
+ },
+ ]);
+ });
+
+ test('it returns task objects', async () => {
+ const taskManagerId = uuid.v1();
+ const claimOwnershipUntil = new Date(Date.now());
+ const runAt = new Date();
+ const tasks = [
+ {
+ _id: 'aaa',
+ _source: {
+ type: 'task',
+ task: {
+ runAt,
+ taskType: 'foo',
+ schedule: undefined,
+ attempts: 0,
+ status: 'claiming',
+ params: '{ "hello": "world" }',
+ state: '{ "baby": "Henhen" }',
+ user: 'jimbo',
+ scope: ['reporting'],
+ ownerId: taskManagerId,
+ },
+ },
+ _seq_no: 1,
+ _primary_term: 2,
+ sort: ['a', 1],
+ },
+ {
+ _id: 'bbb',
+ _source: {
+ type: 'task',
+ task: {
+ runAt,
+ taskType: 'bar',
+ schedule: { interval: '5m' },
+ attempts: 2,
+ status: 'claiming',
+ params: '{ "shazm": 1 }',
+ state: '{ "henry": "The 8th" }',
+ user: 'dabo',
+ scope: ['reporting', 'ceo'],
+ ownerId: taskManagerId,
+ },
+ },
+ _seq_no: 3,
+ _primary_term: 4,
+ sort: ['b', 2],
+ },
+ ];
+ const {
+ result: { docs },
+ args: {
+ search: {
+ body: { query },
+ },
+ },
+ } = await testClaimAvailableTasks({
+ opts: {
+ taskManagerId,
+ },
+ claimingOpts: {
+ claimOwnershipUntil,
+ size: 10,
+ },
+ hits: tasks,
+ });
+
+ expect(query.bool.must).toContainEqual({
+ bool: {
+ must: [
+ {
+ term: {
+ 'task.ownerId': taskManagerId,
+ },
+ },
+ { term: { 'task.status': 'claiming' } },
+ ],
+ },
+ });
+
+ expect(docs).toMatchObject([
+ {
+ attempts: 0,
+ id: 'aaa',
+ schedule: undefined,
+ params: { hello: 'world' },
+ runAt,
+ scope: ['reporting'],
+ state: { baby: 'Henhen' },
+ status: 'claiming',
taskType: 'foo',
user: 'jimbo',
ownerId: taskManagerId,
@@ -728,7 +824,7 @@ if (doc['task.runAt'].size()!=0) {
runAt,
scope: ['reporting', 'ceo'],
state: { henry: 'The 8th' },
- status: 'running',
+ status: 'claiming',
taskType: 'bar',
user: 'dabo',
ownerId: taskManagerId,
diff --git a/x-pack/plugins/task_manager/server/task_store.ts b/x-pack/plugins/task_manager/server/task_store.ts
index a18fb57b35b3d7..f2da41053e6ab6 100644
--- a/x-pack/plugins/task_manager/server/task_store.ts
+++ b/x-pack/plugins/task_manager/server/task_store.ts
@@ -217,48 +217,39 @@ export class TaskStore {
claimTasksByIdWithRawIds,
size
);
+
const docs =
numberOfTasksClaimed > 0
? await this.sweepForClaimedTasks(claimTasksByIdWithRawIds, size)
: [];
- // emit success/fail events for claimed tasks by id
- if (claimTasksById && claimTasksById.length) {
- const [documentsReturnedById, documentsClaimedBySchedule] = partition(docs, (doc) =>
- claimTasksById.includes(doc.id)
- );
-
- const [documentsClaimedById, documentsRequestedButNotClaimed] = partition(
- documentsReturnedById,
- // we filter the schduled tasks down by status is 'claiming' in the esearch,
- // but we do not apply this limitation on tasks claimed by ID so that we can
- // provide more detailed error messages when we fail to claim them
- (doc) => doc.status === TaskStatus.Claiming
- );
-
- const documentsRequestedButNotReturned = difference(
- claimTasksById,
- map(documentsReturnedById, 'id')
- );
+ const [documentsReturnedById, documentsClaimedBySchedule] = partition(docs, (doc) =>
+ claimTasksById.includes(doc.id)
+ );
- this.emitEvents(
- [...documentsClaimedById, ...documentsClaimedBySchedule].map((doc) =>
- asTaskClaimEvent(doc.id, asOk(doc))
- )
- );
+ const [documentsClaimedById, documentsRequestedButNotClaimed] = partition(
+ documentsReturnedById,
+ // we filter the schduled tasks down by status is 'claiming' in the esearch,
+ // but we do not apply this limitation on tasks claimed by ID so that we can
+ // provide more detailed error messages when we fail to claim them
+ (doc) => doc.status === TaskStatus.Claiming
+ );
- this.emitEvents(
- documentsRequestedButNotClaimed.map((doc) => asTaskClaimEvent(doc.id, asErr(some(doc))))
- );
+ const documentsRequestedButNotReturned = difference(
+ claimTasksById,
+ map(documentsReturnedById, 'id')
+ );
- this.emitEvents(
- documentsRequestedButNotReturned.map((id) => asTaskClaimEvent(id, asErr(none)))
- );
- }
+ this.emitEvents([
+ ...documentsClaimedById.map((doc) => asTaskClaimEvent(doc.id, asOk(doc))),
+ ...documentsClaimedBySchedule.map((doc) => asTaskClaimEvent(doc.id, asOk(doc))),
+ ...documentsRequestedButNotClaimed.map((doc) => asTaskClaimEvent(doc.id, asErr(some(doc)))),
+ ...documentsRequestedButNotReturned.map((id) => asTaskClaimEvent(id, asErr(none))),
+ ]);
return {
- claimedTasks: numberOfTasksClaimed,
- docs,
+ claimedTasks: documentsClaimedById.length + documentsClaimedBySchedule.length,
+ docs: docs.filter((doc) => doc.status === TaskStatus.Claiming),
};
};
diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json
index e5cd46b330ca8b..81c06cf5c381f6 100644
--- a/x-pack/plugins/translations/translations/ja-JP.json
+++ b/x-pack/plugins/translations/translations/ja-JP.json
@@ -2388,11 +2388,6 @@
"indexPatternManagement.createIndexPattern.description": "インデックスパターンは、{single}または{multiple}データソース、{star}と一致します。",
"indexPatternManagement.createIndexPattern.documentation": "ドキュメンテーションを表示",
"indexPatternManagement.createIndexPattern.emptyState.checkDataButton": "新規データを確認",
- "indexPatternManagement.createIndexPattern.emptyStateHeader": "Elasticsearchデータが見つかりませんでした",
- "indexPatternManagement.createIndexPattern.emptyStateLabel.emptyStateDetail": "{needToIndex} {learnHowLink}または{getStartedLink}",
- "indexPatternManagement.createIndexPattern.emptyStateLabel.getStartedLink": "サンプルデータで始めましょう。",
- "indexPatternManagement.createIndexPattern.emptyStateLabel.learnHowLink": "方法を学習",
- "indexPatternManagement.createIndexPattern.emptyStateLabel.needToIndexLabel": "インデックスパターンを作成する前に、Elasticsearchへのデータのインデックスが必要です。",
"indexPatternManagement.createIndexPattern.includeSystemIndicesToggleSwitchLabel": "システムと非表示のインデックスを含める",
"indexPatternManagement.createIndexPattern.loadClustersFailMsg": "リモートクラスターの読み込みに失敗",
"indexPatternManagement.createIndexPattern.loadIndicesFailMsg": "インデックスの読み込みに失敗",
@@ -2403,7 +2398,6 @@
"indexPatternManagement.createIndexPattern.step.indexPatternPlaceholder": "index-name-*",
"indexPatternManagement.createIndexPattern.step.invalidCharactersErrorMessage": "{indexPatternName}にはスペースや{characterList}は使えません。",
"indexPatternManagement.createIndexPattern.step.loadingHeader": "一致するインデックスを検索中…",
- "indexPatternManagement.createIndexPattern.step.loadingLabel": "お待ちください…",
"indexPatternManagement.createIndexPattern.step.nextStepButton": "次のステップ",
"indexPatternManagement.createIndexPattern.step.pagingLabel": "ページごとの行数: {perPage}",
"indexPatternManagement.createIndexPattern.step.status.matchAnyLabel.matchAnyDetail": "インデックスパターンは、{sourceCount, plural, one {個のソース} other {個のソース} }と一致します。",
@@ -2553,15 +2547,6 @@
"indexPatternManagement.indexPattern.sectionsHeader": "インデックスパターン",
"indexPatternManagement.indexPattern.titleExistsLabel": "「{title}」というタイトルのインデックスパターンがすでに存在します。",
"indexPatternManagement.indexPatternList.createButton.betaLabel": "ベータ",
- "indexPatternManagement.indexPatternPrompt.exampleOne": "チャートを作成したりコンテンツを素早くクエリできるように log-west-001 という名前の単一のデータソースをインデックスします。",
- "indexPatternManagement.indexPatternPrompt.exampleOneTitle": "単一のデータソース",
- "indexPatternManagement.indexPatternPrompt.examplesTitle": "インデックスパターンの例",
- "indexPatternManagement.indexPatternPrompt.exampleThree": "比較目的に履歴の動向を集約できるよう、これらのログのアーカイブされた月々のロールアップメトリックスを指定どおりに別々のインデックスパターンにグループ分けします。",
- "indexPatternManagement.indexPatternPrompt.exampleThreeTitle": "カスタムグルーピング",
- "indexPatternManagement.indexPatternPrompt.exampleTwo": "すべての西海岸のサーバーログに対してクエリを実行できるように、頭に「log-west」の付いたすべての受信データソースをグループ化します。",
- "indexPatternManagement.indexPatternPrompt.exampleTwoTitle": "複数データソース",
- "indexPatternManagement.indexPatternPrompt.subtitle": "インデックスパターンは、Kibanaで共有フィールドにクエリを実行できるよう、種類の異なるデータソースをバケットにまとめることができます。",
- "indexPatternManagement.indexPatternPrompt.title": "インデックスパターンについて",
"indexPatternManagement.indexPatterns.badge.readOnly.text": "読み取り専用",
"indexPatternManagement.indexPatterns.badge.readOnly.tooltip": "インデックスパターンを保存できません",
"indexPatternManagement.indexPatterns.createBreadcrumb": "インデックスパターンを作成",
@@ -14062,10 +14047,6 @@
"xpack.observability.home.sectionsubtitle": "ログ、メトリック、トレースを大規模に、1つのスタックにまとめて、環境内のあらゆる場所で生じるイベントの監視、分析、対応を行います。",
"xpack.observability.home.sectionTitle": "エコシステム全体の一元的な可視性",
"xpack.observability.home.title": "オブザーバビリティ",
- "xpack.observability.ingestManafer.beta": "ベータ",
- "xpack.observability.ingestManafer.button": "Ingest Managerベータを試す",
- "xpack.observability.ingestManafer.text": "Elasticエージェントでは、シンプルかつ統合された方法で、ログ、メトリック、他の種類のデータの監視をホストに追加することができます。複数のBeatsと他のエージェントをインストールする必要はありません。このため、インフラストラクチャ全体での構成のデプロイが簡単で高速になりました。",
- "xpack.observability.ingestManafer.title": "新しいIngest Managerをご覧になりましたか?",
"xpack.observability.landing.breadcrumb": "はじめて使う",
"xpack.observability.news.readFullStory": "詳細なストーリーを読む",
"xpack.observability.news.title": "新機能",
diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json
index b273f6cc81baf6..af5e68b7e44d71 100644
--- a/x-pack/plugins/translations/translations/zh-CN.json
+++ b/x-pack/plugins/translations/translations/zh-CN.json
@@ -2389,11 +2389,6 @@
"indexPatternManagement.createIndexPattern.description": "索引模式可以匹配单个源,例如 {single} 或 {multiple} 个数据源、{star}。",
"indexPatternManagement.createIndexPattern.documentation": "阅读文档",
"indexPatternManagement.createIndexPattern.emptyState.checkDataButton": "检查新数据",
- "indexPatternManagement.createIndexPattern.emptyStateHeader": "找不到任何 Elasticsearch 数据",
- "indexPatternManagement.createIndexPattern.emptyStateLabel.emptyStateDetail": "{needToIndex}{learnHowLink}或{getStartedLink}",
- "indexPatternManagement.createIndexPattern.emptyStateLabel.getStartedLink": "开始使用一些样例数据集。",
- "indexPatternManagement.createIndexPattern.emptyStateLabel.learnHowLink": "了解操作方法",
- "indexPatternManagement.createIndexPattern.emptyStateLabel.needToIndexLabel": "您需要在 Elasticsearch 中索引一些数据后,才能创建索引模式。",
"indexPatternManagement.createIndexPattern.includeSystemIndicesToggleSwitchLabel": "包括系统和隐藏索引",
"indexPatternManagement.createIndexPattern.loadClustersFailMsg": "无法加载远程集群",
"indexPatternManagement.createIndexPattern.loadIndicesFailMsg": "无法加载索引",
@@ -2404,7 +2399,6 @@
"indexPatternManagement.createIndexPattern.step.indexPatternPlaceholder": "index-name-*",
"indexPatternManagement.createIndexPattern.step.invalidCharactersErrorMessage": "{indexPatternName} 不能包含空格或字符:{characterList}",
"indexPatternManagement.createIndexPattern.step.loadingHeader": "正在寻找匹配的索引......",
- "indexPatternManagement.createIndexPattern.step.loadingLabel": "请稍候......",
"indexPatternManagement.createIndexPattern.step.nextStepButton": "下一步",
"indexPatternManagement.createIndexPattern.step.pagingLabel": "每页行数:{perPage}",
"indexPatternManagement.createIndexPattern.step.status.matchAnyLabel.matchAnyDetail": "您的索引模式可以匹配{sourceCount, plural, one {您的 # 个源} other {您的 # 个源中的任何一个} }。",
@@ -2554,15 +2548,6 @@
"indexPatternManagement.indexPattern.sectionsHeader": "索引模式",
"indexPatternManagement.indexPattern.titleExistsLabel": "具有标题“{title}”的索引模式已存在。",
"indexPatternManagement.indexPatternList.createButton.betaLabel": "公测版",
- "indexPatternManagement.indexPatternPrompt.exampleOne": "索引单个称作 log-west-001 的数据源,以便可以快速地构建图表或查询其内容。",
- "indexPatternManagement.indexPatternPrompt.exampleOneTitle": "单数据源",
- "indexPatternManagement.indexPatternPrompt.examplesTitle": "索引模式示例",
- "indexPatternManagement.indexPatternPrompt.exampleThree": "具体而言,将这些日志每月存档的汇总/打包指标分组成不同的索引模式,从而可以聚合历史趋势以进行比较。",
- "indexPatternManagement.indexPatternPrompt.exampleThreeTitle": "定制分组",
- "indexPatternManagement.indexPatternPrompt.exampleTwo": "分组以 log-west* 开头的所有传入数据源,以便可以查询所有西海岸服务器日志。",
- "indexPatternManagement.indexPatternPrompt.exampleTwoTitle": "多数据源",
- "indexPatternManagement.indexPatternPrompt.subtitle": "索引模式允许您将异类的数据源一起装入存储桶,从而可以在 Kibana 中查询它们共享的字段。",
- "indexPatternManagement.indexPatternPrompt.title": "关于索引模式",
"indexPatternManagement.indexPatterns.badge.readOnly.text": "只读",
"indexPatternManagement.indexPatterns.badge.readOnly.tooltip": "无法保存索引模式",
"indexPatternManagement.indexPatterns.createBreadcrumb": "创建索引模式",
@@ -14067,10 +14052,6 @@
"xpack.observability.home.sectionsubtitle": "通过根据需要将日志、指标和跟踪都置于单个堆栈上,来监测、分析和响应环境中任何位置发生的事件。",
"xpack.observability.home.sectionTitle": "整个生态系统的统一可见性",
"xpack.observability.home.title": "可观测性",
- "xpack.observability.ingestManafer.beta": "公测版",
- "xpack.observability.ingestManafer.button": "试用采集管理器公测版",
- "xpack.observability.ingestManafer.text": "通过 Elastic 代理,您能够以简单统一的方式将日志、指标和其他类型数据的监测添加到主机。不再需要安装多个 Beats 和其他代理,这样在整个基础设施中部署配置会更轻松更快速。",
- "xpack.observability.ingestManafer.title": "是否了解我们全新的采集管理器?",
"xpack.observability.landing.breadcrumb": "入门",
"xpack.observability.news.readFullStory": "详细了解",
"xpack.observability.news.title": "最近的新闻",
diff --git a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts
index 90660cc99507d3..91511b508aca67 100644
--- a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts
+++ b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts
@@ -4,26 +4,25 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import http from 'http';
+import getPort from 'get-port';
import { FtrProviderContext } from '../../../../common/ftr_provider_context';
-import {
- getExternalServiceSimulatorPath,
- ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions_simulators/server/plugin';
+import { getSlackServer } from '../../../../common/fixtures/plugins/actions_simulators/server/plugin';
// eslint-disable-next-line import/no-default-export
export default function slackTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
- const kibanaServer = getService('kibanaServer');
describe('slack action', () => {
- let slackSimulatorURL: string = '';
+ let slackSimulatorURL: string = '';
+ let slackServer: http.Server;
- // need to wait for kibanaServer to settle ...
- before(() => {
- slackSimulatorURL = kibanaServer.resolveUrl(
- getExternalServiceSimulatorPath(ExternalServiceSimulator.SLACK)
- );
+ before(async () => {
+ slackServer = await getSlackServer();
+ const availablePort = await getPort({ port: 9000 });
+ slackServer.listen(availablePort);
+ slackSimulatorURL = `http://localhost:${availablePort}`;
});
it('should return 403 when creating a slack action', async () => {
@@ -44,5 +43,9 @@ export default function slackTest({ getService }: FtrProviderContext) {
'Action type .slack is disabled because your basic license does not support it. Please upgrade your license.',
});
});
+
+ after(() => {
+ slackServer.close();
+ });
});
}
diff --git a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts
index af1d413ff3c462..039f1d4dd3275d 100644
--- a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts
+++ b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts
@@ -4,25 +4,24 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import http from 'http';
+import getPort from 'get-port';
import { FtrProviderContext } from '../../../../common/ftr_provider_context';
-import {
- getExternalServiceSimulatorPath,
- ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions_simulators/server/plugin';
+import { getWebhookServer } from '../../../../common/fixtures/plugins/actions_simulators/server/plugin';
// eslint-disable-next-line import/no-default-export
export default function webhookTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
- const kibanaServer = getService('kibanaServer');
describe('webhook action', () => {
- let webhookSimulatorURL: string = '';
-
+ let webhookSimulatorURL: string = '';
+ let webhookServer: http.Server;
// need to wait for kibanaServer to settle ...
- before(() => {
- webhookSimulatorURL = kibanaServer.resolveUrl(
- getExternalServiceSimulatorPath(ExternalServiceSimulator.WEBHOOK)
- );
+ before(async () => {
+ webhookServer = await getWebhookServer();
+ const availablePort = await getPort({ port: 9000 });
+ webhookServer.listen(availablePort);
+ webhookSimulatorURL = `http://localhost:${availablePort}`;
});
it('should return 403 when creating a webhook action', async () => {
@@ -47,5 +46,9 @@ export default function webhookTest({ getService }: FtrProviderContext) {
'Action type .webhook is disabled because your basic license does not support it. Please upgrade your license.',
});
});
+
+ after(() => {
+ webhookServer.close();
+ });
});
}
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/plugin.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/plugin.ts
index cb1271494c294e..0f7acf5ead1a18 100644
--- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/plugin.ts
+++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/plugin.ts
@@ -4,6 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import http from 'http';
import { Plugin, CoreSetup, IRouter } from 'kibana/server';
import { EncryptedSavedObjectsPluginStart } from '../../../../../../../plugins/encrypted_saved_objects/server';
import { PluginSetupContract as FeaturesPluginSetup } from '../../../../../../../plugins/features/server';
@@ -13,6 +14,8 @@ import { initPlugin as initPagerduty } from './pagerduty_simulation';
import { initPlugin as initServiceNow } from './servicenow_simulation';
import { initPlugin as initJira } from './jira_simulation';
import { initPlugin as initResilient } from './resilient_simulation';
+import { initPlugin as initSlack } from './slack_simulation';
+import { initPlugin as initWebhook } from './webhook_simulation';
export const NAME = 'actions-FTS-external-service-simulators';
@@ -39,6 +42,14 @@ export function getAllExternalServiceSimulatorPaths(): string[] {
return allPaths;
}
+export async function getWebhookServer(): Promise {
+ return await initWebhook();
+}
+
+export async function getSlackServer(): Promise {
+ return await initSlack();
+}
+
interface FixtureSetupDeps {
actions: ActionsPluginSetupContract;
features: FeaturesPluginSetup;
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/slack_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/slack_simulation.ts
new file mode 100644
index 00000000000000..5032112e702e25
--- /dev/null
+++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/slack_simulation.ts
@@ -0,0 +1,69 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import http from 'http';
+
+export async function initPlugin() {
+ return http.createServer((request, response) => {
+ if (request.method === 'POST') {
+ let data = '';
+ request.on('data', (chunk) => {
+ data += chunk;
+ });
+ request.on('end', () => {
+ const body = JSON.parse(data);
+ const text = body && body.text;
+
+ if (text == null) {
+ response.statusCode = 400;
+ response.end('bad request to slack simulator');
+ return;
+ }
+
+ switch (text) {
+ case 'success': {
+ response.statusCode = 200;
+ response.end('ok');
+ return;
+ }
+ case 'no_text':
+ response.statusCode = 400;
+ response.end('no_text');
+ return;
+
+ case 'invalid_payload':
+ response.statusCode = 400;
+ response.end('invalid_payload');
+ return;
+
+ case 'invalid_token':
+ response.statusCode = 403;
+ response.end('invalid_token');
+ return;
+
+ case 'status_500':
+ response.statusCode = 500;
+ response.end('simulated slack 500 response');
+ return;
+
+ case 'rate_limit':
+ const res = {
+ retry_after: 1,
+ ok: false,
+ error: 'rate_limited',
+ };
+
+ response.writeHead(429, { 'Content-Type': 'application/json', 'Retry-After': '1' });
+ response.write(JSON.stringify(res));
+ response.end();
+ return;
+ }
+ response.statusCode = 400;
+ response.end('unknown request to slack simulator');
+ });
+ }
+ });
+}
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/webhook_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/webhook_simulation.ts
new file mode 100644
index 00000000000000..44d8ea0c2da20c
--- /dev/null
+++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/webhook_simulation.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+import expect from '@kbn/expect';
+import http from 'http';
+import { fromNullable, map, filter, getOrElse } from 'fp-ts/lib/Option';
+import { pipe } from 'fp-ts/lib/pipeable';
+import { constant } from 'fp-ts/lib/function';
+
+export async function initPlugin() {
+ return http.createServer((request, response) => {
+ const credentials = pipe(
+ fromNullable(request.headers.authorization),
+ map((authorization) => authorization.split(/\s+/)),
+ filter((parts) => parts.length > 1),
+ map((parts) => Buffer.from(parts[1], 'base64').toString()),
+ filter((credentialsPart) => credentialsPart.indexOf(':') !== -1),
+ map((credentialsPart) => {
+ const [username, password] = credentialsPart.split(':');
+ return { username, password };
+ }),
+ getOrElse(constant({ username: '', password: '' }))
+ );
+
+ if (request.method === 'POST' || request.method === 'PUT') {
+ let data = '';
+ request.on('data', (chunk) => {
+ data += chunk;
+ });
+ request.on('end', () => {
+ switch (data) {
+ case 'success':
+ response.statusCode = 200;
+ response.end('OK');
+ return;
+ case 'authenticate':
+ return validateAuthentication(credentials, response);
+ case 'success_post_method':
+ return validateRequestUsesMethod(request.method ?? '', 'post', response);
+ case 'success_put_method':
+ return validateRequestUsesMethod(request.method ?? '', 'put', response);
+ case 'failure':
+ response.statusCode = 500;
+ response.end('Error');
+ return;
+ }
+ response.statusCode = 400;
+ response.end(
+ `unknown request to webhook simulator [${data ? `content: ${data}` : `no content`}]`
+ );
+ return;
+ });
+ } else {
+ request.on('end', () => {
+ response.statusCode = 400;
+ response.end('unknown request to webhook simulator [no content]');
+ return;
+ });
+ }
+ });
+}
+
+function validateAuthentication(credentials: any, res: any) {
+ try {
+ expect(credentials).to.eql({
+ username: 'elastic',
+ password: 'changeme',
+ });
+ res.statusCode = 200;
+ res.end('OK');
+ } catch (ex) {
+ res.statusCode = 403;
+ res.end(`the validateAuthentication operation failed. ${ex.message}`);
+ }
+}
+
+function validateRequestUsesMethod(requestMethod: string, method: string, res: any) {
+ try {
+ expect(requestMethod.toLowerCase()).to.eql(method);
+ res.statusCode = 200;
+ res.end('OK');
+ } catch (ex) {
+ res.statusCode = 403;
+ res.end(`the validateAuthentication operation failed. ${ex.message}`);
+ }
+}
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/index.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/index.ts
deleted file mode 100644
index 43e6a73673556c..00000000000000
--- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/index.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License;
- * you may not use this file except in compliance with the Elastic License.
- */
-import Hapi from 'hapi';
-import {
- getExternalServiceSimulatorPath,
- NAME,
- ExternalServiceSimulator,
-} from '../actions_simulators/server/plugin';
-
-import { initPlugin as initWebhook } from './webhook_simulation';
-import { initPlugin as initSlack } from './slack_simulation';
-
-// eslint-disable-next-line import/no-default-export
-export default function (kibana: any) {
- return new kibana.Plugin({
- require: ['xpack_main'],
- name: `${NAME}-legacy`,
- init: (server: Hapi.Server) => {
- initWebhook(server, getExternalServiceSimulatorPath(ExternalServiceSimulator.WEBHOOK));
- initSlack(server, getExternalServiceSimulatorPath(ExternalServiceSimulator.SLACK));
- },
- });
-}
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/package.json b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/package.json
deleted file mode 100644
index 644cd77d3be753..00000000000000
--- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/package.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "actions-fixtures-legacy",
- "version": "0.0.0",
- "kibana": {
- "version": "kibana"
- }
-}
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/slack_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/slack_simulation.ts
deleted file mode 100644
index b914386b136ccc..00000000000000
--- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/slack_simulation.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import Joi from 'joi';
-import Hapi from 'hapi';
-
-interface SlackRequest extends Hapi.Request {
- payload: {
- text: string;
- };
-}
-export function initPlugin(server: Hapi.Server, path: string) {
- server.route({
- method: 'POST',
- path,
- options: {
- auth: false,
- validate: {
- options: { abortEarly: false },
- payload: Joi.object().keys({
- text: Joi.string(),
- }),
- },
- },
- handler: slackHandler as Hapi.Lifecycle.Method,
- });
-}
-// Slack simulator: create a slack action pointing here, and you can get
-// different responses based on the message posted. See the README.md for
-// more info.
-
-function slackHandler(request: SlackRequest, h: any) {
- const body = request.payload;
- const text = body && body.text;
-
- if (text == null) {
- return htmlResponse(h, 400, 'bad request to slack simulator');
- }
-
- switch (text) {
- case 'success':
- return htmlResponse(h, 200, 'ok');
-
- case 'no_text':
- return htmlResponse(h, 400, 'no_text');
-
- case 'invalid_payload':
- return htmlResponse(h, 400, 'invalid_payload');
-
- case 'invalid_token':
- return htmlResponse(h, 403, 'invalid_token');
-
- case 'status_500':
- return htmlResponse(h, 500, 'simulated slack 500 response');
-
- case 'rate_limit':
- const response = {
- retry_after: 1,
- ok: false,
- error: 'rate_limited',
- };
-
- return h.response(response).type('application/json').header('retry-after', '1').code(429);
- }
-
- return htmlResponse(h, 400, 'unknown request to slack simulator');
-}
-
-function htmlResponse(h: any, code: number, text: string) {
- return h.response(text).type('text/html').code(code);
-}
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/webhook_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/webhook_simulation.ts
deleted file mode 100644
index 44e1aff162c922..00000000000000
--- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/webhook_simulation.ts
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License;
- * you may not use this file except in compliance with the Elastic License.
- */
-import expect from '@kbn/expect';
-import Joi from 'joi';
-import Hapi, { Util } from 'hapi';
-import { fromNullable, map, filter, getOrElse } from 'fp-ts/lib/Option';
-import { pipe } from 'fp-ts/lib/pipeable';
-import { constant } from 'fp-ts/lib/function';
-
-interface WebhookRequest extends Hapi.Request {
- payload: string;
-}
-
-export async function initPlugin(server: Hapi.Server, path: string) {
- server.auth.scheme('identifyCredentialsIfPresent', function identifyCredentialsIfPresent(
- s: Hapi.Server,
- options?: Hapi.ServerAuthSchemeOptions
- ) {
- const scheme = {
- async authenticate(request: Hapi.Request, h: Hapi.ResponseToolkit) {
- const credentials = pipe(
- fromNullable(request.headers.authorization),
- map((authorization) => authorization.split(/\s+/)),
- filter((parts) => parts.length > 1),
- map((parts) => Buffer.from(parts[1], 'base64').toString()),
- filter((credentialsPart) => credentialsPart.indexOf(':') !== -1),
- map((credentialsPart) => {
- const [username, password] = credentialsPart.split(':');
- return { username, password };
- }),
- getOrElse(constant({ username: '', password: '' }))
- );
-
- return h.authenticated({ credentials });
- },
- };
-
- return scheme;
- });
- server.auth.strategy('simple', 'identifyCredentialsIfPresent');
-
- server.route({
- method: ['POST', 'PUT'],
- path,
- options: {
- auth: 'simple',
- validate: {
- options: { abortEarly: false },
- payload: Joi.string(),
- },
- },
- handler: webhookHandler as Hapi.Lifecycle.Method,
- });
-}
-
-function webhookHandler(request: WebhookRequest, h: any) {
- const body = request.payload;
-
- switch (body) {
- case 'success':
- return htmlResponse(h, 200, `OK`);
- case 'authenticate':
- return validateAuthentication(request, h);
- case 'success_post_method':
- return validateRequestUsesMethod(request, h, 'post');
- case 'success_put_method':
- return validateRequestUsesMethod(request, h, 'put');
- case 'failure':
- return htmlResponse(h, 500, `Error`);
- }
-
- return htmlResponse(
- h,
- 400,
- `unknown request to webhook simulator [${body ? `content: ${body}` : `no content`}]`
- );
-}
-
-function validateAuthentication(request: WebhookRequest, h: any) {
- const {
- auth: { credentials },
- } = request;
- try {
- expect(credentials).to.eql({
- username: 'elastic',
- password: 'changeme',
- });
- return htmlResponse(h, 200, `OK`);
- } catch (ex) {
- return htmlResponse(h, 403, `the validateAuthentication operation failed. ${ex.message}`);
- }
-}
-
-function validateRequestUsesMethod(
- request: WebhookRequest,
- h: any,
- method: Util.HTTP_METHODS_PARTIAL
-) {
- try {
- expect(request.method).to.eql(method);
- return htmlResponse(h, 200, `OK`);
- } catch (ex) {
- return htmlResponse(h, 403, `the validateAuthentication operation failed. ${ex.message}`);
- }
-}
-
-function htmlResponse(h: any, code: number, text: string) {
- return h.response(text).type('text/html').code(code);
-}
diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts
index f21bc8edeef1e4..c68bcaa0ad4e8d 100644
--- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts
+++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts
@@ -5,28 +5,27 @@
*/
import expect from '@kbn/expect';
-
+import http from 'http';
+import getPort from 'get-port';
import { FtrProviderContext } from '../../../../common/ftr_provider_context';
-import {
- getExternalServiceSimulatorPath,
- ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions_simulators/server/plugin';
+import { getSlackServer } from '../../../../common/fixtures/plugins/actions_simulators/server/plugin';
// eslint-disable-next-line import/no-default-export
export default function slackTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
- const kibanaServer = getService('kibanaServer');
describe('slack action', () => {
let simulatedActionId = '';
- let slackSimulatorURL: string = '';
+ let slackSimulatorURL: string = '';
+ let slackServer: http.Server;
// need to wait for kibanaServer to settle ...
- before(() => {
- slackSimulatorURL = kibanaServer.resolveUrl(
- getExternalServiceSimulatorPath(ExternalServiceSimulator.SLACK)
- );
+ before(async () => {
+ slackServer = await getSlackServer();
+ const availablePort = await getPort({ port: 9000 });
+ slackServer.listen(availablePort);
+ slackSimulatorURL = `http://localhost:${availablePort}`;
});
it('should return 200 when creating a slack action successfully', async () => {
@@ -220,5 +219,9 @@ export default function slackTest({ getService }: FtrProviderContext) {
expect(result.message).to.match(/error posting a slack message, retry later/);
expect(result.retry).to.equal(true);
});
+
+ after(() => {
+ slackServer.close();
+ });
});
}
diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts
index 7eba753d7e98ba..8f17ab54184b5b 100644
--- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts
+++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts
@@ -4,12 +4,15 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import http from 'http';
+import getPort from 'get-port';
import expect from '@kbn/expect';
import { URL, format as formatUrl } from 'url';
import { FtrProviderContext } from '../../../../common/ftr_provider_context';
import {
getExternalServiceSimulatorPath,
ExternalServiceSimulator,
+ getWebhookServer,
} from '../../../../common/fixtures/plugins/actions_simulators/server/plugin';
const defaultValues: Record = {
@@ -30,11 +33,13 @@ export default function webhookTest({ getService }: FtrProviderContext) {
const kibanaServer = getService('kibanaServer');
async function createWebhookAction(
- urlWithCreds: string,
- config: Record> = {}
+ webhookSimulatorURL: string,
+ config: Record> = {},
+ kibanaUrlWithCreds: string
): Promise {
- const { url: fullUrl, user, password } = extractCredentialsFromUrl(urlWithCreds);
- const url = config.url && typeof config.url === 'object' ? parsePort(config.url) : fullUrl;
+ const { user, password } = extractCredentialsFromUrl(kibanaUrlWithCreds);
+ const url =
+ config.url && typeof config.url === 'object' ? parsePort(config.url) : webhookSimulatorURL;
const composedConfig = {
headers: {
'Content-Type': 'text/plain',
@@ -61,11 +66,17 @@ export default function webhookTest({ getService }: FtrProviderContext) {
}
describe('webhook action', () => {
- let webhookSimulatorURL: string = '';
-
+ let webhookSimulatorURL: string = '';
+ let webhookServer: http.Server;
+ let kibanaURL: string = '';
// need to wait for kibanaServer to settle ...
- before(() => {
- webhookSimulatorURL = kibanaServer.resolveUrl(
+ before(async () => {
+ webhookServer = await getWebhookServer();
+ const availablePort = await getPort({ port: 9000 });
+ webhookServer.listen(availablePort);
+ webhookSimulatorURL = `http://localhost:${availablePort}`;
+
+ kibanaURL = kibanaServer.resolveUrl(
getExternalServiceSimulatorPath(ExternalServiceSimulator.WEBHOOK)
);
});
@@ -117,7 +128,7 @@ export default function webhookTest({ getService }: FtrProviderContext) {
});
it('should send authentication to the webhook target', async () => {
- const webhookActionId = await createWebhookAction(webhookSimulatorURL);
+ const webhookActionId = await createWebhookAction(webhookSimulatorURL, {}, kibanaURL);
const { body: result } = await supertest
.post(`/api/actions/action/${webhookActionId}/_execute`)
.set('kbn-xsrf', 'test')
@@ -132,7 +143,11 @@ export default function webhookTest({ getService }: FtrProviderContext) {
});
it('should support the POST method against webhook target', async () => {
- const webhookActionId = await createWebhookAction(webhookSimulatorURL, { method: 'post' });
+ const webhookActionId = await createWebhookAction(
+ webhookSimulatorURL,
+ { method: 'post' },
+ kibanaURL
+ );
const { body: result } = await supertest
.post(`/api/actions/action/${webhookActionId}/_execute`)
.set('kbn-xsrf', 'test')
@@ -147,7 +162,11 @@ export default function webhookTest({ getService }: FtrProviderContext) {
});
it('should support the PUT method against webhook target', async () => {
- const webhookActionId = await createWebhookAction(webhookSimulatorURL, { method: 'put' });
+ const webhookActionId = await createWebhookAction(
+ webhookSimulatorURL,
+ { method: 'put' },
+ kibanaURL
+ );
const { body: result } = await supertest
.post(`/api/actions/action/${webhookActionId}/_execute`)
.set('kbn-xsrf', 'test')
@@ -183,7 +202,11 @@ export default function webhookTest({ getService }: FtrProviderContext) {
});
it('should handle unreachable webhook targets', async () => {
- const webhookActionId = await createWebhookAction('http://some.non.existent.com/endpoint');
+ const webhookActionId = await createWebhookAction(
+ 'http://some.non.existent.com/endpoint',
+ {},
+ kibanaURL
+ );
const { body: result } = await supertest
.post(`/api/actions/action/${webhookActionId}/_execute`)
.set('kbn-xsrf', 'test')
@@ -199,7 +222,7 @@ export default function webhookTest({ getService }: FtrProviderContext) {
});
it('should handle failing webhook targets', async () => {
- const webhookActionId = await createWebhookAction(webhookSimulatorURL);
+ const webhookActionId = await createWebhookAction(webhookSimulatorURL, {}, kibanaURL);
const { body: result } = await supertest
.post(`/api/actions/action/${webhookActionId}/_execute`)
.set('kbn-xsrf', 'test')
@@ -214,6 +237,10 @@ export default function webhookTest({ getService }: FtrProviderContext) {
expect(result.message).to.match(/error calling webhook, retry later/);
expect(result.serviceMessage).to.eql('[500] Internal Server Error');
});
+
+ after(() => {
+ webhookServer.close();
+ });
});
}
diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/update.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/update.ts
index cac6355409ac93..ab3a92d0b3f706 100644
--- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/update.ts
+++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/update.ts
@@ -31,8 +31,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) {
.then((response: SupertestResponse) => response.body);
}
- // FLAKY: https://github.com/elastic/kibana/issues/72803
- describe.skip('update', () => {
+ describe('update', () => {
const objectRemover = new ObjectRemover(supertest);
after(() => objectRemover.removeAll());
diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts
index b3572978cee703..acfbad007d7220 100644
--- a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts
+++ b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts
@@ -4,24 +4,22 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import http from 'http';
+import getPort from 'get-port';
import expect from '@kbn/expect';
import { URL, format as formatUrl } from 'url';
import { FtrProviderContext } from '../../../../common/ftr_provider_context';
-import {
- getExternalServiceSimulatorPath,
- ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions_simulators/server/plugin';
+import { getWebhookServer } from '../../../../common/fixtures/plugins/actions_simulators/server/plugin';
// eslint-disable-next-line import/no-default-export
export default function webhookTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
- const kibanaServer = getService('kibanaServer');
async function createWebhookAction(
- urlWithCreds: string,
+ webhookSimulatorURL: string,
config: Record> = {}
): Promise {
- const url = formatUrl(new URL(urlWithCreds), { auth: false });
+ const url = formatUrl(new URL(webhookSimulatorURL), { auth: false });
const composedConfig = {
headers: {
'Content-Type': 'text/plain',
@@ -45,13 +43,13 @@ export default function webhookTest({ getService }: FtrProviderContext) {
}
describe('webhook action', () => {
- let webhookSimulatorURL: string = '';
-
- // need to wait for kibanaServer to settle ...
- before(() => {
- webhookSimulatorURL = kibanaServer.resolveUrl(
- getExternalServiceSimulatorPath(ExternalServiceSimulator.WEBHOOK)
- );
+ let webhookSimulatorURL: string = '';
+ let webhookServer: http.Server;
+ before(async () => {
+ webhookServer = await getWebhookServer();
+ const availablePort = await getPort({ port: 9000 });
+ webhookServer.listen(availablePort);
+ webhookSimulatorURL = `http://localhost:${availablePort}`;
});
it('webhook can be executed without username and password', async () => {
@@ -68,5 +66,9 @@ export default function webhookTest({ getService }: FtrProviderContext) {
expect(result.status).to.eql('ok');
});
+
+ after(() => {
+ webhookServer.close();
+ });
});
}
diff --git a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts b/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts
index bc36f70df3641d..cedd96f147c2b2 100644
--- a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts
+++ b/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts
@@ -130,7 +130,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
it(`index pattern listing doesn't show create button`, async () => {
await PageObjects.settings.clickKibanaIndexPatterns();
- await testSubjects.existOrFail('indexPatternTable');
+ await testSubjects.existOrFail('emptyIndexPatternPrompt');
await testSubjects.missingOrFail('createIndexPatternButton');
});
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts
new file mode 100644
index 00000000000000..6148dbcc7090e6
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts
@@ -0,0 +1,119 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { ExceptionListItemSchema } from '../../../../plugins/lists/common';
+import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock';
+import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+import {
+ getCreateExceptionListItemMinimalSchemaMock,
+ getCreateExceptionListItemMinimalSchemaMockWithoutId,
+} from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock';
+import {
+ EXCEPTION_LIST_ITEM_URL,
+ EXCEPTION_LIST_URL,
+} from '../../../../plugins/lists/common/constants';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+
+import {
+ removeListItemServerGeneratedProperties,
+ removeExceptionListItemServerGeneratedProperties,
+} from '../../utils';
+
+import { deleteAllExceptions } from '../../utils';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext) => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('create_exception_list_items', () => {
+ describe('validation errors', () => {
+ it('should give a 404 error that the exception list must exist first before being able to add a list item to the exception list', async () => {
+ const { body } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMock())
+ .expect(404);
+
+ expect(body).to.eql({
+ message: 'exception list id: "some-list-id" does not exist',
+ status_code: 404,
+ });
+ });
+ });
+
+ describe('creating exception list items', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should create a simple exception list item with a list item id', async () => {
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ const { body } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMock())
+ .expect(200);
+
+ const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(getExceptionListItemResponseMockWithoutAutoGeneratedValues());
+ });
+
+ it('should create a simple exception list item without an id', async () => {
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ const { body } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMockWithoutId())
+ .expect(200);
+
+ const bodyToCompare = removeListItemServerGeneratedProperties(body);
+ const outputList: Partial = {
+ ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(),
+ item_id: body.item_id,
+ };
+ expect(bodyToCompare).to.eql(outputList);
+ });
+
+ it('should cause a 409 conflict if we attempt to create the same exception list item twice', async () => {
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMock())
+ .expect(200);
+
+ const { body } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMock())
+ .expect(409);
+
+ expect(body).to.eql({
+ message: 'exception list item id: "some-list-item-id" already exists',
+ status_code: 409,
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts
new file mode 100644
index 00000000000000..2b654c72ae282e
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts
@@ -0,0 +1,77 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { ExceptionListSchema } from '../../../../plugins/lists/common';
+import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock';
+import {
+ getCreateExceptionListMinimalSchemaMock,
+ getCreateExceptionListMinimalSchemaMockWithoutId,
+} from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+
+import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext) => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('create_exception_lists', () => {
+ describe('creating exception lists', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should create a simple exception list', async () => {
+ const { body } = await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(getExceptionResponseMockWithoutAutoGeneratedValues());
+ });
+
+ it('should create a simple exception list without a list_id', async () => {
+ const { body } = await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMockWithoutId())
+ .expect(200);
+
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ const outputtedList: Partial = {
+ ...getExceptionResponseMockWithoutAutoGeneratedValues(),
+ list_id: bodyToCompare.list_id,
+ };
+ expect(bodyToCompare).to.eql(outputtedList);
+ });
+
+ it('should cause a 409 conflict if we attempt to create the same list_id twice', async () => {
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ const { body } = await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(409);
+
+ expect(body).to.eql({
+ message: 'exception list id: "some-list-id" already exists',
+ status_code: 409,
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts
new file mode 100644
index 00000000000000..16bdd264dc5464
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts
@@ -0,0 +1,119 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { ExceptionListItemSchema } from '../../../../plugins/lists/common';
+import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock';
+import {
+ getCreateExceptionListItemMinimalSchemaMock,
+ getCreateExceptionListItemMinimalSchemaMockWithoutId,
+} from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock';
+import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import {
+ EXCEPTION_LIST_URL,
+ EXCEPTION_LIST_ITEM_URL,
+} from '../../../../plugins/lists/common/constants';
+
+import { deleteAllExceptions, removeExceptionListItemServerGeneratedProperties } from '../../utils';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext) => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('delete_exception_list_items', () => {
+ describe('delete exception list items', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should delete a single exception list item by its item_id', async () => {
+ // create an exception list
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // create an exception list item
+ await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMock())
+ .expect(200);
+
+ // delete the exception list item by its item_id
+ const { body } = await supertest
+ .delete(
+ `${EXCEPTION_LIST_ITEM_URL}?item_id=${
+ getCreateExceptionListItemMinimalSchemaMock().item_id
+ }`
+ )
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+
+ const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(getExceptionListItemResponseMockWithoutAutoGeneratedValues());
+ });
+
+ it('should delete a single exception list item using an auto generated id', async () => {
+ // create an exception list
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // create an exception list item
+ const { body: bodyWithCreatedList } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMockWithoutId())
+ .expect(200);
+
+ // delete that exception list item by its auto-generated id
+ const { body } = await supertest
+ .delete(`${EXCEPTION_LIST_ITEM_URL}?id=${bodyWithCreatedList.id}`)
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+ const outputtedList: Partial = {
+ ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(),
+ item_id: body.item_id,
+ };
+
+ const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputtedList);
+ });
+
+ it('should return an error if the id does not exist when trying to delete it', async () => {
+ const { body } = await supertest
+ .delete(`${EXCEPTION_LIST_ITEM_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`)
+ .set('kbn-xsrf', 'true')
+ .expect(404);
+
+ expect(body).to.eql({
+ message: 'exception list item id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist',
+ status_code: 404,
+ });
+ });
+
+ it('should return an error if the item_id does not exist when trying to delete it', async () => {
+ const { body } = await supertest
+ .delete(`${EXCEPTION_LIST_ITEM_URL}?item_id=c1e1b359-7ac1-4e96-bc81-c683c092436f`)
+ .set('kbn-xsrf', 'true')
+ .expect(404);
+
+ expect(body).to.eql({
+ message:
+ 'exception list item item_id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist',
+ status_code: 404,
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts
new file mode 100644
index 00000000000000..56e4bcd9641cfe
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts
@@ -0,0 +1,98 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { ExceptionListSchema } from '../../../../plugins/lists/common';
+import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock';
+import {
+ getCreateExceptionListMinimalSchemaMock,
+ getCreateExceptionListMinimalSchemaMockWithoutId,
+} from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants';
+
+import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext) => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('delete_exception_lists', () => {
+ describe('delete exception lists', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should delete a single exception list by its list_id', async () => {
+ // create an exception list
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // delete the exception list by its list id
+ const { body } = await supertest
+ .delete(
+ `${EXCEPTION_LIST_URL}?list_id=${getCreateExceptionListMinimalSchemaMock().list_id}`
+ )
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(getExceptionResponseMockWithoutAutoGeneratedValues());
+ });
+
+ it('should delete a single exception list using an auto generated id', async () => {
+ // create an exception list
+ const { body: bodyWithCreatedList } = await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMockWithoutId())
+ .expect(200);
+
+ // delete that list by its auto-generated id
+ const { body } = await supertest
+ .delete(`${EXCEPTION_LIST_URL}?id=${bodyWithCreatedList.id}`)
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+
+ const outputtedList: Partial = {
+ ...getExceptionResponseMockWithoutAutoGeneratedValues(),
+ list_id: body.list_id,
+ };
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputtedList);
+ });
+
+ it('should return an error if the id does not exist when trying to delete it', async () => {
+ const { body } = await supertest
+ .delete(`${EXCEPTION_LIST_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`)
+ .set('kbn-xsrf', 'true')
+ .expect(404);
+
+ expect(body).to.eql({
+ message: 'exception list id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist',
+ status_code: 404,
+ });
+ });
+
+ it('should return an error if the list_id does not exist when trying to delete it', async () => {
+ const { body } = await supertest
+ .delete(`${EXCEPTION_LIST_URL}?list_id=c1e1b359-7ac1-4e96-bc81-c683c092436f`)
+ .set('kbn-xsrf', 'true')
+ .expect(404);
+
+ expect(body).to.eql({
+ message: 'exception list list_id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist',
+ status_code: 404,
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts
index 6fe783fc497f2c..74c28f5abdfc1d 100644
--- a/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts
@@ -96,8 +96,9 @@ export default ({ getService }: FtrProviderContext): void => {
.set('kbn-xsrf', 'true')
.expect(200)
.parse(binaryToString);
-
- expect(body.toString()).to.eql('127.0.0.2\n127.0.0.1\n');
+ const bodyString = body.toString();
+ expect(bodyString.includes('127.0.0.1')).to.be(true);
+ expect(bodyString.includes('127.0.0.2')).to.be(true);
});
});
});
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts
new file mode 100644
index 00000000000000..a65e9f344986fa
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts
@@ -0,0 +1,105 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock';
+import { getCreateExceptionListItemMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock';
+import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import {
+ EXCEPTION_LIST_URL,
+ EXCEPTION_LIST_ITEM_URL,
+} from '../../../../plugins/lists/common/constants';
+
+import { deleteAllExceptions, removeExceptionListItemServerGeneratedProperties } from '../../utils';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext): void => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('find_exception_list_items', () => {
+ describe('find exception list items', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should return an empty find body correctly if no exception list items are loaded', async () => {
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ const { body } = await supertest
+ .get(
+ `${EXCEPTION_LIST_ITEM_URL}/_find?list_id=${
+ getCreateExceptionListMinimalSchemaMock().list_id
+ }`
+ )
+ .set('kbn-xsrf', 'true')
+ .send()
+ .expect(200);
+
+ expect(body).to.eql({
+ data: [],
+ page: 1,
+ per_page: 20,
+ total: 0,
+ });
+ });
+
+ it('should return 404 if given a list_id that does not exist', async () => {
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_ITEM_URL}/_find?list_id=non_exist`)
+ .set('kbn-xsrf', 'true')
+ .send()
+ .expect(404);
+
+ expect(body).to.eql({
+ message: 'exception list id: "non_exist" does not exist',
+ status_code: 404,
+ });
+ });
+
+ it('should return a single exception list item when a single exception list item is loaded from a find with defaults added', async () => {
+ // add the exception list
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // add a single exception list item
+ await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMock())
+ .expect(200);
+
+ // query the single exception list from _find
+ const { body } = await supertest
+ .get(
+ `${EXCEPTION_LIST_ITEM_URL}/_find?list_id=${
+ getCreateExceptionListMinimalSchemaMock().list_id
+ }`
+ )
+ .set('kbn-xsrf', 'true')
+ .send()
+ .expect(200);
+
+ body.data = [removeExceptionListItemServerGeneratedProperties(body.data[0])];
+ expect(body).to.eql({
+ data: [getExceptionListItemResponseMockWithoutAutoGeneratedValues()],
+ page: 1,
+ per_page: 20,
+ total: 1,
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts
new file mode 100644
index 00000000000000..c2328a7d112f43
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts
@@ -0,0 +1,67 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock';
+import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants';
+
+import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext): void => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('find_exception_lists', () => {
+ describe('find exception lists', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should return an empty find body correctly if no exception lists are loaded', async () => {
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_URL}/_find`)
+ .set('kbn-xsrf', 'true')
+ .send()
+ .expect(200);
+
+ expect(body).to.eql({
+ data: [],
+ page: 1,
+ per_page: 20,
+ total: 0,
+ });
+ });
+
+ it('should return a single exception list when a single exception list is loaded from a find with defaults added', async () => {
+ // add a single exception list
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // query the single exception list from _find
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_URL}/_find`)
+ .set('kbn-xsrf', 'true')
+ .send()
+ .expect(200);
+
+ body.data = [removeExceptionListServerGeneratedProperties(body.data[0])];
+ expect(body).to.eql({
+ data: [getExceptionResponseMockWithoutAutoGeneratedValues()],
+ page: 1,
+ per_page: 20,
+ total: 1,
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts
index 4befb6bbaf0500..7b7a6173fb4081 100644
--- a/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts
@@ -45,7 +45,7 @@ export default ({ getService }: FtrProviderContext): void => {
});
});
- describe('importing rules with an index', () => {
+ describe('importing lists with an index', () => {
beforeEach(async () => {
await createListsIndex(supertest);
});
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts
index 302877a680aa66..5458b4a9a7db25 100644
--- a/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts
@@ -23,5 +23,15 @@ export default ({ loadTestFile }: FtrProviderContext): void => {
loadTestFile(require.resolve('./find_list_items'));
loadTestFile(require.resolve('./import_list_items'));
loadTestFile(require.resolve('./export_list_items'));
+ loadTestFile(require.resolve('./create_exception_lists'));
+ loadTestFile(require.resolve('./create_exception_list_items'));
+ loadTestFile(require.resolve('./read_exception_lists'));
+ loadTestFile(require.resolve('./read_exception_list_items'));
+ loadTestFile(require.resolve('./update_exception_lists'));
+ loadTestFile(require.resolve('./update_exception_list_items'));
+ loadTestFile(require.resolve('./delete_exception_lists'));
+ loadTestFile(require.resolve('./delete_exception_list_items'));
+ loadTestFile(require.resolve('./find_exception_lists'));
+ loadTestFile(require.resolve('./find_exception_list_items'));
});
};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts
new file mode 100644
index 00000000000000..26b969e940a2b3
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts
@@ -0,0 +1,159 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock';
+import {
+ getCreateExceptionListItemMinimalSchemaMock,
+ getCreateExceptionListItemMinimalSchemaMockWithoutId,
+} from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock';
+import { ExceptionListItemSchema } from '../../../../plugins/lists/common';
+import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import {
+ EXCEPTION_LIST_URL,
+ EXCEPTION_LIST_ITEM_URL,
+} from '../../../../plugins/lists/common/constants';
+
+import { deleteAllExceptions, removeExceptionListItemServerGeneratedProperties } from '../../utils';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext) => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('read_exception_list_items', () => {
+ describe('reading exception list items', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should be able to read a single exception list items using item_id', async () => {
+ // create a simple exception list to read
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ const { body } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMock())
+ .expect(200);
+
+ const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(getExceptionListItemResponseMockWithoutAutoGeneratedValues());
+ });
+
+ it('should be able to read a single exception list item using id', async () => {
+ // create a simple exception list to read
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // create a simple exception list item to read
+ const { body: createListBody } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMock())
+ .expect(200);
+
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_ITEM_URL}?id=${createListBody.id}`)
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+
+ const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(getExceptionListItemResponseMockWithoutAutoGeneratedValues());
+ });
+
+ it('should be able to read a single list item with an auto-generated id', async () => {
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // create a simple exception list item to read
+ const { body: createListBody } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMockWithoutId())
+ .expect(200);
+
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_ITEM_URL}?id=${createListBody.id}`)
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+
+ const outputtedList: Partial = {
+ ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(),
+ item_id: body.item_id,
+ };
+
+ const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputtedList);
+ });
+
+ it('should be able to read a single list item with an auto-generated item_id', async () => {
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // create a simple exception list item to read
+ const { body: createListBody } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMockWithoutId())
+ .expect(200);
+
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_ITEM_URL}?item_id=${createListBody.item_id}`)
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+
+ const outputtedList: Partial = {
+ ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(),
+ item_id: body.item_id,
+ };
+
+ const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputtedList);
+ });
+
+ it('should return 404 if given a fake id', async () => {
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_ITEM_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`)
+ .set('kbn-xsrf', 'true')
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message: 'exception list item id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist',
+ });
+ });
+
+ it('should return 404 if given a fake list_id', async () => {
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_ITEM_URL}?item_id=c1e1b359-7ac1-4e96-bc81-c683c092436f`)
+ .set('kbn-xsrf', 'true')
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message:
+ 'exception list item item_id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist',
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts
new file mode 100644
index 00000000000000..ee6bef3200f5c7
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts
@@ -0,0 +1,112 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { ExceptionListSchema } from '../../../../plugins/lists/common';
+import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock';
+import {
+ getCreateExceptionListMinimalSchemaMock,
+ getCreateExceptionListMinimalSchemaMockWithoutId,
+} from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants';
+
+import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext) => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('read_exception_lists', () => {
+ describe('reading exception lists', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should be able to read a single exception list using list_id', async () => {
+ // create a simple exception list to read
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_URL}?list_id=${getCreateExceptionListMinimalSchemaMock().list_id}`)
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(getExceptionResponseMockWithoutAutoGeneratedValues());
+ });
+
+ it('should be able to read a single exception list using id', async () => {
+ // create a simple exception list to read
+ const { body: createListBody } = await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_URL}?id=${createListBody.id}`)
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(getExceptionResponseMockWithoutAutoGeneratedValues());
+ });
+
+ it('should be able to read a single list with an auto-generated list_id', async () => {
+ // create a simple exception list to read
+ const { body: createListBody } = await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMockWithoutId())
+ .expect(200);
+
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_URL}?list_id=${createListBody.list_id}`)
+ .set('kbn-xsrf', 'true')
+ .expect(200);
+
+ const outputtedList: Partial = {
+ ...getExceptionResponseMockWithoutAutoGeneratedValues(),
+ list_id: body.list_id,
+ };
+
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputtedList);
+ });
+
+ it('should return 404 if given a fake id', async () => {
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`)
+ .set('kbn-xsrf', 'true')
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message: 'exception list id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist',
+ });
+ });
+
+ it('should return 404 if given a fake list_id', async () => {
+ const { body } = await supertest
+ .get(`${EXCEPTION_LIST_URL}?list_id=c1e1b359-7ac1-4e96-bc81-c683c092436f`)
+ .set('kbn-xsrf', 'true')
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message: 'exception list list_id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist',
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts
new file mode 100644
index 00000000000000..40fb705620a196
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts
@@ -0,0 +1,168 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock';
+import { getCreateExceptionListItemMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock';
+import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import {
+ EXCEPTION_LIST_URL,
+ EXCEPTION_LIST_ITEM_URL,
+} from '../../../../plugins/lists/common/constants';
+
+import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils';
+import {
+ UpdateExceptionListItemSchema,
+ ExceptionListItemSchema,
+} from '../../../../plugins/lists/common/schemas';
+
+import { getUpdateMinimalExceptionListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/update_exception_list_item_schema.mock';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext) => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('update_exception_list_items', () => {
+ describe('update exception list items', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should update a single exception list item property of name using an id', async () => {
+ // create a simple exception list
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // create a simple exception list item
+ await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListItemMinimalSchemaMock())
+ .expect(200);
+
+ // update a exception list item's name
+ const updatedList: UpdateExceptionListItemSchema = {
+ ...getUpdateMinimalExceptionListItemSchemaMock(),
+ name: 'some other name',
+ };
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(updatedList)
+ .expect(200);
+
+ const outputList: Partial = {
+ ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(),
+ name: 'some other name',
+ };
+
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputList);
+ });
+
+ it('should update a single exception list item property of name using an auto-generated item_id', async () => {
+ // create a simple exception list
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ const { item_id, ...itemNoId } = getCreateExceptionListItemMinimalSchemaMock();
+
+ // create a simple exception list item
+ const { body: createListBody } = await supertest
+ .post(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(itemNoId)
+ .expect(200);
+
+ // update a exception list item's name
+ const updatedList: UpdateExceptionListItemSchema = {
+ ...getUpdateMinimalExceptionListItemSchemaMock(),
+ item_id: createListBody.item_id,
+ name: 'some other name',
+ };
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(updatedList)
+ .expect(200);
+
+ const outputList: Partial = {
+ ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(),
+ name: 'some other name',
+ item_id: body.item_id,
+ };
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputList);
+ });
+
+ it('should give a 404 if it is given a fake exception list item id', async () => {
+ const updatedList: UpdateExceptionListItemSchema = {
+ ...getUpdateMinimalExceptionListItemSchemaMock(),
+ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d',
+ };
+ delete updatedList.item_id;
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(updatedList)
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message: 'exception list item id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" does not exist',
+ });
+ });
+
+ it('should give a 404 if it is given a fake item_id', async () => {
+ const updatedList: UpdateExceptionListItemSchema = {
+ ...getUpdateMinimalExceptionListItemSchemaMock(),
+ item_id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d',
+ };
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(updatedList)
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message:
+ 'exception list item item_id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" does not exist',
+ });
+ });
+
+ it('should give a 404 if both id and list_id is null', async () => {
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ const { item_id, ...listNoId } = getUpdateMinimalExceptionListItemSchemaMock();
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_ITEM_URL)
+ .set('kbn-xsrf', 'true')
+ .send(listNoId)
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message: 'either id or item_id need to be defined',
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts
new file mode 100644
index 00000000000000..bd30dd87963eda
--- /dev/null
+++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts
@@ -0,0 +1,182 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import expect from '@kbn/expect';
+
+import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock';
+import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock';
+import { FtrProviderContext } from '../../common/ftr_provider_context';
+import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants';
+
+import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils';
+import {
+ UpdateExceptionListSchema,
+ ExceptionListSchema,
+} from '../../../../plugins/lists/common/schemas';
+
+import { getUpdateMinimalExceptionListSchemaMock } from '../../../../plugins/lists/common/schemas/request/update_exception_list_schema.mock';
+
+// eslint-disable-next-line import/no-default-export
+export default ({ getService }: FtrProviderContext) => {
+ const supertest = getService('supertest');
+ const es = getService('es');
+
+ describe('update_exception_lists', () => {
+ describe('update exception lists', () => {
+ afterEach(async () => {
+ await deleteAllExceptions(es);
+ });
+
+ it('should update a single exception list property of name using an id', async () => {
+ // create a simple exception list
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // update a exception list's name
+ const updatedList: UpdateExceptionListSchema = {
+ ...getUpdateMinimalExceptionListSchemaMock(),
+ name: 'some other name',
+ };
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(updatedList)
+ .expect(200);
+
+ const outputList: Partial = {
+ ...getExceptionResponseMockWithoutAutoGeneratedValues(),
+ name: 'some other name',
+ version: 2,
+ };
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputList);
+ });
+
+ it('should update a single exception list property of name using an auto-generated list_id', async () => {
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ const { list_id, ...listNoId } = getCreateExceptionListMinimalSchemaMock();
+
+ // create a simple exception list
+ const { body: createListBody } = await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(listNoId)
+ .expect(200);
+
+ // update a exception list's name
+ const updatedList: UpdateExceptionListSchema = {
+ ...getUpdateMinimalExceptionListSchemaMock(),
+ id: createListBody.id,
+ name: 'some other name',
+ };
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(updatedList)
+ .expect(200);
+
+ const outputList: Partial = {
+ ...getExceptionResponseMockWithoutAutoGeneratedValues(),
+ name: 'some other name',
+ list_id: body.list_id,
+ version: 2,
+ };
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputList);
+ });
+
+ it('should change the version of a list when it updates two properties', async () => {
+ // create a simple exception list
+ await supertest
+ .post(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(getCreateExceptionListMinimalSchemaMock())
+ .expect(200);
+
+ // update a simple exception list property of name and description
+ // update a exception list's name
+ const updatedList: UpdateExceptionListSchema = {
+ ...getUpdateMinimalExceptionListSchemaMock(),
+ name: 'some other name',
+ description: 'some other description',
+ };
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(updatedList)
+ .expect(200);
+
+ const outputList: Partial = {
+ ...getExceptionResponseMockWithoutAutoGeneratedValues(),
+ name: 'some other name',
+ description: 'some other description',
+ version: 2,
+ };
+ const bodyToCompare = removeExceptionListServerGeneratedProperties(body);
+ expect(bodyToCompare).to.eql(outputList);
+ });
+
+ it('should give a 404 if it is given a fake id', async () => {
+ const updatedList: UpdateExceptionListSchema = {
+ ...getUpdateMinimalExceptionListSchemaMock(),
+ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d',
+ };
+ delete updatedList.list_id;
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(updatedList)
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message: 'exception list id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" does not exist',
+ });
+ });
+
+ it('should give a 404 if it is given a fake list_id', async () => {
+ const updatedList: UpdateExceptionListSchema = {
+ ...getUpdateMinimalExceptionListSchemaMock(),
+ list_id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d',
+ };
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(updatedList)
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message: 'exception list list_id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" does not exist',
+ });
+ });
+
+ it('should give a 404 if both id and list_id is null', async () => {
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ const { list_id, ...listNoId } = getUpdateMinimalExceptionListSchemaMock();
+
+ const { body } = await supertest
+ .put(EXCEPTION_LIST_URL)
+ .set('kbn-xsrf', 'true')
+ .send(listNoId)
+ .expect(404);
+
+ expect(body).to.eql({
+ status_code: 404,
+ message: 'either id or list_id need to be defined',
+ });
+ });
+ });
+ });
+};
diff --git a/x-pack/test/lists_api_integration/utils.ts b/x-pack/test/lists_api_integration/utils.ts
index 272768fdf50b30..54a13fc027c99d 100644
--- a/x-pack/test/lists_api_integration/utils.ts
+++ b/x-pack/test/lists_api_integration/utils.ts
@@ -6,8 +6,13 @@
import { SuperTest } from 'supertest';
import supertestAsPromised from 'supertest-as-promised';
+import { Client } from '@elastic/elasticsearch';
-import { ListItemSchema } from '../../plugins/lists/common/schemas';
+import {
+ ListItemSchema,
+ ExceptionListSchema,
+ ExceptionListItemSchema,
+} from '../../plugins/lists/common/schemas';
import { ListSchema } from '../../plugins/lists/common';
import { LIST_INDEX } from '../../plugins/lists/common/constants';
@@ -83,6 +88,30 @@ export const removeListItemServerGeneratedProperties = (
return removedProperties;
};
+/**
+ * This will remove server generated properties such as date times, etc...
+ * @param list List to pass in to remove typical server generated properties
+ */
+export const removeExceptionListItemServerGeneratedProperties = (
+ list: Partial
+): Partial => {
+ /* eslint-disable-next-line @typescript-eslint/naming-convention */
+ const { created_at, updated_at, id, tie_breaker_id, _version, ...removedProperties } = list;
+ return removedProperties;
+};
+
+/**
+ * This will remove server generated properties such as date times, etc...
+ * @param list List to pass in to remove typical server generated properties
+ */
+export const removeExceptionListServerGeneratedProperties = (
+ list: Partial
+): Partial => {
+ /* eslint-disable-next-line @typescript-eslint/naming-convention */
+ const { created_at, updated_at, id, tie_breaker_id, _version, ...removedProperties } = list;
+ return removedProperties;
+};
+
// Similar to ReactJs's waitFor from here: https://testing-library.com/docs/dom-testing-library/api-async#waitfor
export const waitFor = async (
functionToTest: () => Promise,
@@ -124,3 +153,32 @@ export const binaryToString = (res: any, callback: any): void => {
callback(null, Buffer.from(res.data));
});
};
+
+/**
+ * Remove all exceptions from the .kibana index
+ * This will retry 20 times before giving up and hopefully still not interfere with other tests
+ * @param es The ElasticSearch handle
+ */
+export const deleteAllExceptions = async (es: Client, retryCount = 20): Promise => {
+ if (retryCount > 0) {
+ try {
+ await es.deleteByQuery({
+ index: '.kibana',
+ q: 'type:exception-list or type:exception-list-agnostic',
+ wait_for_completion: true,
+ refresh: true,
+ body: {},
+ });
+ } catch (err) {
+ // eslint-disable-next-line no-console
+ console.log(
+ `Failure trying to deleteAllExceptions, retries left are: ${retryCount - 1}`,
+ err
+ );
+ await deleteAllExceptions(es, retryCount - 1);
+ }
+ } else {
+ // eslint-disable-next-line no-console
+ console.log('Could not deleteAllExceptions, no retries are left');
+ }
+};
diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js
index ea95eb42dd6ff5..c87a5039360b8f 100644
--- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js
+++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js
@@ -28,8 +28,7 @@ export default function ({ getService }) {
const testHistoryIndex = '.kibana_task_manager_test_result';
const supertest = supertestAsPromised(url.format(config.get('servers.kibana')));
- // FLAKY: https://github.com/elastic/kibana/issues/71390
- describe.skip('scheduling and running tasks', () => {
+ describe('scheduling and running tasks', () => {
beforeEach(
async () => await supertest.delete('/api/sample_tasks').set('kbn-xsrf', 'xxx').expect(200)
);
diff --git a/yarn.lock b/yarn.lock
index 7731d2f7a8ea19..42c4b800e6b0c0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -25,14 +25,7 @@
dependencies:
"@babel/highlight" "^7.0.0"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
- integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
- dependencies:
- "@babel/highlight" "^7.8.3"
-
-"@babel/code-frame@^7.10.4":
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
@@ -48,38 +41,7 @@
invariant "^2.2.4"
semver "^5.5.0"
-"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c"
- integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==
- dependencies:
- browserslist "^4.9.1"
- invariant "^2.2.4"
- semver "^5.5.0"
-
-"@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.4.3", "@babel/core@^7.7.5":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e"
- integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/generator" "^7.9.0"
- "@babel/helper-module-transforms" "^7.9.0"
- "@babel/helpers" "^7.9.0"
- "@babel/parser" "^7.9.0"
- "@babel/template" "^7.8.6"
- "@babel/traverse" "^7.9.0"
- "@babel/types" "^7.9.0"
- convert-source-map "^1.7.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.1"
- json5 "^2.1.2"
- lodash "^4.17.13"
- resolve "^1.3.2"
- semver "^5.4.1"
- source-map "^0.5.0"
-
-"@babel/core@^7.11.1":
+"@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.4.3", "@babel/core@^7.7.5":
version "7.11.1"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643"
integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==
@@ -101,17 +63,7 @@
semver "^5.4.1"
source-map "^0.5.0"
-"@babel/generator@^7.0.0", "@babel/generator@^7.9.0":
- version "7.9.4"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce"
- integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==
- dependencies:
- "@babel/types" "^7.9.0"
- jsesc "^2.5.1"
- lodash "^4.17.13"
- source-map "^0.5.0"
-
-"@babel/generator@^7.11.0":
+"@babel/generator@^7.0.0", "@babel/generator@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c"
integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==
@@ -120,24 +72,7 @@
jsesc "^2.5.1"
source-map "^0.5.0"
-"@babel/generator@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9"
- integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==
- dependencies:
- "@babel/types" "^7.9.5"
- jsesc "^2.5.1"
- lodash "^4.17.13"
- source-map "^0.5.0"
-
-"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee"
- integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==
- dependencies:
- "@babel/types" "^7.8.3"
-
-"@babel/helper-annotate-as-pure@^7.10.4":
+"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==
@@ -152,14 +87,6 @@
"@babel/helper-explode-assignable-expression" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503"
- integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==
- dependencies:
- "@babel/helper-explode-assignable-expression" "^7.8.3"
- "@babel/types" "^7.8.3"
-
"@babel/helper-builder-react-jsx-experimental@^7.10.4":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz#f35e956a19955ff08c1258e44a515a6d6248646b"
@@ -169,15 +96,6 @@
"@babel/helper-module-imports" "^7.10.4"
"@babel/types" "^7.10.5"
-"@babel/helper-builder-react-jsx-experimental@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43"
- integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.8.3"
- "@babel/helper-module-imports" "^7.8.3"
- "@babel/types" "^7.9.0"
-
"@babel/helper-builder-react-jsx@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d"
@@ -186,14 +104,6 @@
"@babel/helper-annotate-as-pure" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/helper-builder-react-jsx@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32"
- integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.8.3"
- "@babel/types" "^7.9.0"
-
"@babel/helper-compilation-targets@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2"
@@ -205,17 +115,6 @@
levenary "^1.1.1"
semver "^5.5.0"
-"@babel/helper-compilation-targets@^7.8.7":
- version "7.8.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde"
- integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==
- dependencies:
- "@babel/compat-data" "^7.8.6"
- browserslist "^4.9.1"
- invariant "^2.2.4"
- levenary "^1.1.1"
- semver "^5.5.0"
-
"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
@@ -228,18 +127,6 @@
"@babel/helper-replace-supers" "^7.10.4"
"@babel/helper-split-export-declaration" "^7.10.4"
-"@babel/helper-create-class-features-plugin@^7.8.3":
- version "7.8.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0"
- integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==
- dependencies:
- "@babel/helper-function-name" "^7.8.3"
- "@babel/helper-member-expression-to-functions" "^7.8.3"
- "@babel/helper-optimise-call-expression" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-replace-supers" "^7.8.6"
- "@babel/helper-split-export-declaration" "^7.8.3"
-
"@babel/helper-create-regexp-features-plugin@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8"
@@ -249,15 +136,6 @@
"@babel/helper-regex" "^7.10.4"
regexpu-core "^4.7.0"
-"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8":
- version "7.8.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087"
- integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.8.3"
- "@babel/helper-regex" "^7.8.3"
- regexpu-core "^4.7.0"
-
"@babel/helper-define-map@^7.10.4":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30"
@@ -267,15 +145,6 @@
"@babel/types" "^7.10.5"
lodash "^4.17.19"
-"@babel/helper-define-map@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15"
- integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==
- dependencies:
- "@babel/helper-function-name" "^7.8.3"
- "@babel/types" "^7.8.3"
- lodash "^4.17.13"
-
"@babel/helper-explode-assignable-expression@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c"
@@ -284,14 +153,6 @@
"@babel/traverse" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/helper-explode-assignable-expression@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982"
- integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==
- dependencies:
- "@babel/traverse" "^7.8.3"
- "@babel/types" "^7.8.3"
-
"@babel/helper-function-name@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
@@ -301,24 +162,6 @@
"@babel/template" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/helper-function-name@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca"
- integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==
- dependencies:
- "@babel/helper-get-function-arity" "^7.8.3"
- "@babel/template" "^7.8.3"
- "@babel/types" "^7.8.3"
-
-"@babel/helper-function-name@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c"
- integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==
- dependencies:
- "@babel/helper-get-function-arity" "^7.8.3"
- "@babel/template" "^7.8.3"
- "@babel/types" "^7.9.5"
-
"@babel/helper-get-function-arity@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
@@ -326,13 +169,6 @@
dependencies:
"@babel/types" "^7.10.4"
-"@babel/helper-get-function-arity@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5"
- integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==
- dependencies:
- "@babel/types" "^7.8.3"
-
"@babel/helper-hoist-variables@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e"
@@ -340,13 +176,6 @@
dependencies:
"@babel/types" "^7.10.4"
-"@babel/helper-hoist-variables@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134"
- integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==
- dependencies:
- "@babel/types" "^7.8.3"
-
"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df"
@@ -354,21 +183,7 @@
dependencies:
"@babel/types" "^7.11.0"
-"@babel/helper-member-expression-to-functions@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c"
- integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==
- dependencies:
- "@babel/types" "^7.8.3"
-
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
- integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
- dependencies:
- "@babel/types" "^7.8.3"
-
-"@babel/helper-module-imports@^7.10.4":
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
@@ -388,19 +203,6 @@
"@babel/types" "^7.11.0"
lodash "^4.17.19"
-"@babel/helper-module-transforms@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5"
- integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==
- dependencies:
- "@babel/helper-module-imports" "^7.8.3"
- "@babel/helper-replace-supers" "^7.8.6"
- "@babel/helper-simple-access" "^7.8.3"
- "@babel/helper-split-export-declaration" "^7.8.3"
- "@babel/template" "^7.8.6"
- "@babel/types" "^7.9.0"
- lodash "^4.17.13"
-
"@babel/helper-optimise-call-expression@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
@@ -408,19 +210,7 @@
dependencies:
"@babel/types" "^7.10.4"
-"@babel/helper-optimise-call-expression@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9"
- integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==
- dependencies:
- "@babel/types" "^7.8.3"
-
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670"
- integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==
-
-"@babel/helper-plugin-utils@^7.10.4":
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
@@ -432,13 +222,6 @@
dependencies:
lodash "^4.17.19"
-"@babel/helper-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965"
- integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==
- dependencies:
- lodash "^4.17.13"
-
"@babel/helper-remap-async-to-generator@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5"
@@ -450,17 +233,6 @@
"@babel/traverse" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/helper-remap-async-to-generator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86"
- integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.8.3"
- "@babel/helper-wrap-function" "^7.8.3"
- "@babel/template" "^7.8.3"
- "@babel/traverse" "^7.8.3"
- "@babel/types" "^7.8.3"
-
"@babel/helper-replace-supers@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
@@ -471,16 +243,6 @@
"@babel/traverse" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6":
- version "7.8.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8"
- integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==
- dependencies:
- "@babel/helper-member-expression-to-functions" "^7.8.3"
- "@babel/helper-optimise-call-expression" "^7.8.3"
- "@babel/traverse" "^7.8.6"
- "@babel/types" "^7.8.6"
-
"@babel/helper-simple-access@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
@@ -489,14 +251,6 @@
"@babel/template" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/helper-simple-access@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
- integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
- dependencies:
- "@babel/template" "^7.8.3"
- "@babel/types" "^7.8.3"
-
"@babel/helper-skip-transparent-expression-wrappers@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729"
@@ -511,28 +265,11 @@
dependencies:
"@babel/types" "^7.11.0"
-"@babel/helper-split-export-declaration@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9"
- integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==
- dependencies:
- "@babel/types" "^7.8.3"
-
"@babel/helper-validator-identifier@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
-"@babel/helper-validator-identifier@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed"
- integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==
-
-"@babel/helper-validator-identifier@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
- integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
-
"@babel/helper-wrap-function@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87"
@@ -543,16 +280,6 @@
"@babel/traverse" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/helper-wrap-function@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610"
- integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==
- dependencies:
- "@babel/helper-function-name" "^7.8.3"
- "@babel/template" "^7.8.3"
- "@babel/traverse" "^7.8.3"
- "@babel/types" "^7.8.3"
-
"@babel/helpers@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044"
@@ -562,25 +289,7 @@
"@babel/traverse" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/helpers@^7.9.0":
- version "7.9.2"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f"
- integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==
- dependencies:
- "@babel/template" "^7.8.3"
- "@babel/traverse" "^7.9.0"
- "@babel/types" "^7.9.0"
-
-"@babel/highlight@^7.0.0", "@babel/highlight@^7.8.3":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079"
- integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==
- dependencies:
- "@babel/helper-validator-identifier" "^7.9.0"
- chalk "^2.0.0"
- js-tokens "^4.0.0"
-
-"@babel/highlight@^7.10.4":
+"@babel/highlight@^7.0.0", "@babel/highlight@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
@@ -589,15 +298,10 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.2.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0":
- version "7.9.4"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8"
- integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==
-
-"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1", "@babel/parser@^7.11.2":
- version "7.11.2"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.2.tgz#0882ab8a455df3065ea2dcb4c753b2460a24bead"
- integrity sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1", "@babel/parser@^7.11.2", "@babel/parser@^7.2.0", "@babel/parser@^7.7.5":
+ version "7.11.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9"
+ integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==
"@babel/plugin-proposal-async-generator-functions@^7.10.4":
version "7.10.5"
@@ -608,16 +312,7 @@
"@babel/helper-remap-async-to-generator" "^7.10.4"
"@babel/plugin-syntax-async-generators" "^7.8.0"
-"@babel/plugin-proposal-async-generator-functions@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f"
- integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-remap-async-to-generator" "^7.8.3"
- "@babel/plugin-syntax-async-generators" "^7.8.0"
-
-"@babel/plugin-proposal-class-properties@^7.10.4":
+"@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.7.0":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807"
integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==
@@ -625,14 +320,6 @@
"@babel/helper-create-class-features-plugin" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-proposal-class-properties@^7.7.0":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e"
- integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-proposal-dynamic-import@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e"
@@ -641,14 +328,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
-"@babel/plugin-proposal-dynamic-import@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054"
- integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-dynamic-import" "^7.8.0"
-
"@babel/plugin-proposal-export-namespace-from@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54"
@@ -665,14 +344,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.0"
-"@babel/plugin-proposal-json-strings@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b"
- integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-json-strings" "^7.8.0"
-
"@babel/plugin-proposal-logical-assignment-operators@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8"
@@ -689,14 +360,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2"
- integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
-
"@babel/plugin-proposal-numeric-separator@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06"
@@ -705,15 +368,7 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-proposal-numeric-separator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8"
- integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.8.3"
-
-"@babel/plugin-proposal-object-rest-spread@^7.11.0":
+"@babel/plugin-proposal-object-rest-spread@^7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.6.2":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af"
integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==
@@ -722,14 +377,6 @@
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
"@babel/plugin-transform-parameters" "^7.10.4"
-"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f"
- integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
-
"@babel/plugin-proposal-optional-catch-binding@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd"
@@ -738,14 +385,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
-"@babel/plugin-proposal-optional-catch-binding@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9"
- integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
-
"@babel/plugin-proposal-optional-chaining@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076"
@@ -755,14 +394,6 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
"@babel/plugin-syntax-optional-chaining" "^7.8.0"
-"@babel/plugin-proposal-optional-chaining@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58"
- integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-optional-chaining" "^7.8.0"
-
"@babel/plugin-proposal-private-methods@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909"
@@ -771,7 +402,7 @@
"@babel/helper-create-class-features-plugin" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-proposal-unicode-property-regex@^7.10.4":
+"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d"
integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==
@@ -779,14 +410,6 @@
"@babel/helper-create-regexp-features-plugin" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3":
- version "7.8.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d"
- integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.8.8"
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
@@ -801,20 +424,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-class-properties@^7.10.4":
+"@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c"
integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-syntax-class-properties@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7"
- integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
@@ -829,12 +445,12 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-flow@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f"
- integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==
+"@babel/plugin-syntax-flow@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6"
+ integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3":
version "7.8.3"
@@ -850,27 +466,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-syntax-jsx@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94"
- integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897"
- integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
@@ -878,20 +480,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-numeric-separator@^7.10.4":
+"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f"
- integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
@@ -920,13 +515,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-syntax-top-level-await@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391"
- integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-syntax-typescript@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25"
@@ -941,13 +529,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-arrow-functions@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6"
- integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-async-to-generator@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37"
@@ -957,15 +538,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/helper-remap-async-to-generator" "^7.10.4"
-"@babel/plugin-transform-async-to-generator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086"
- integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==
- dependencies:
- "@babel/helper-module-imports" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-remap-async-to-generator" "^7.8.3"
-
"@babel/plugin-transform-block-scoped-functions@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8"
@@ -973,13 +545,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-block-scoped-functions@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3"
- integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-block-scoping@^7.10.4":
version "7.11.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215"
@@ -987,14 +552,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-block-scoping@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a"
- integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- lodash "^4.17.13"
-
"@babel/plugin-transform-classes@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7"
@@ -1009,20 +566,6 @@
"@babel/helper-split-export-declaration" "^7.10.4"
globals "^11.1.0"
-"@babel/plugin-transform-classes@^7.9.0":
- version "7.9.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d"
- integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.8.3"
- "@babel/helper-define-map" "^7.8.3"
- "@babel/helper-function-name" "^7.8.3"
- "@babel/helper-optimise-call-expression" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-replace-supers" "^7.8.6"
- "@babel/helper-split-export-declaration" "^7.8.3"
- globals "^11.1.0"
-
"@babel/plugin-transform-computed-properties@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb"
@@ -1030,13 +573,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-computed-properties@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b"
- integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-destructuring@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5"
@@ -1044,14 +580,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-destructuring@^7.8.3":
- version "7.8.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b"
- integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-dotall-regex@^7.10.4":
+"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee"
integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==
@@ -1059,14 +588,6 @@
"@babel/helper-create-regexp-features-plugin" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e"
- integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-duplicate-keys@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47"
@@ -1074,13 +595,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-duplicate-keys@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1"
- integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-exponentiation-operator@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e"
@@ -1089,21 +603,13 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-exponentiation-operator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7"
- integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==
- dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-flow-strip-types@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392"
- integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==
+"@babel/plugin-transform-flow-strip-types@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz#c497957f09e86e3df7296271e9eb642876bf7788"
+ integrity sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-flow" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-flow" "^7.10.4"
"@babel/plugin-transform-for-of@^7.10.4":
version "7.10.4"
@@ -1112,13 +618,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-for-of@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e"
- integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-function-name@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7"
@@ -1127,14 +626,6 @@
"@babel/helper-function-name" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-function-name@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b"
- integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==
- dependencies:
- "@babel/helper-function-name" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-literals@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c"
@@ -1142,13 +633,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-literals@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1"
- integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-member-expression-literals@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7"
@@ -1156,13 +640,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-member-expression-literals@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410"
- integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-modules-amd@^7.10.4":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1"
@@ -1172,15 +649,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-amd@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4"
- integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==
- dependencies:
- "@babel/helper-module-transforms" "^7.9.0"
- "@babel/helper-plugin-utils" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.0"
-
"@babel/plugin-transform-modules-commonjs@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0"
@@ -1191,16 +659,6 @@
"@babel/helper-simple-access" "^7.10.4"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-commonjs@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940"
- integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==
- dependencies:
- "@babel/helper-module-transforms" "^7.9.0"
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-simple-access" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.0"
-
"@babel/plugin-transform-modules-systemjs@^7.10.4":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85"
@@ -1211,16 +669,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-systemjs@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90"
- integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==
- dependencies:
- "@babel/helper-hoist-variables" "^7.8.3"
- "@babel/helper-module-transforms" "^7.9.0"
- "@babel/helper-plugin-utils" "^7.8.3"
- babel-plugin-dynamic-import-node "^2.3.0"
-
"@babel/plugin-transform-modules-umd@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e"
@@ -1229,14 +677,6 @@
"@babel/helper-module-transforms" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-modules-umd@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697"
- integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==
- dependencies:
- "@babel/helper-module-transforms" "^7.9.0"
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6"
@@ -1244,13 +684,6 @@
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.10.4"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c"
- integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.8.3"
-
"@babel/plugin-transform-new-target@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888"
@@ -1258,13 +691,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-new-target@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43"
- integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-object-super@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894"
@@ -1273,14 +699,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/helper-replace-supers" "^7.10.4"
-"@babel/plugin-transform-object-super@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725"
- integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-replace-supers" "^7.8.3"
-
"@babel/plugin-transform-parameters@^7.10.4":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a"
@@ -1289,14 +707,6 @@
"@babel/helper-get-function-arity" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-parameters@^7.8.7":
- version "7.9.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a"
- integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==
- dependencies:
- "@babel/helper-get-function-arity" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-property-literals@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0"
@@ -1304,19 +714,12 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-property-literals@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263"
- integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-react-constant-elements@^7.0.0", "@babel/plugin-transform-react-constant-elements@^7.2.0", "@babel/plugin-transform-react-constant-elements@^7.6.3":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz#a75abc936a3819edec42d3386d9f1c93f28d9d9e"
- integrity sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw==
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz#0f485260bf1c29012bb973e7e404749eaac12c9e"
+ integrity sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-react-display-name@^7.10.4":
version "7.10.4"
@@ -1325,13 +728,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-react-display-name@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5"
- integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-react-jsx-development@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz#6ec90f244394604623880e15ebc3c34c356258ba"
@@ -1341,15 +737,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-jsx" "^7.10.4"
-"@babel/plugin-transform-react-jsx-development@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754"
- integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw==
- dependencies:
- "@babel/helper-builder-react-jsx-experimental" "^7.9.0"
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-jsx" "^7.8.3"
-
"@babel/plugin-transform-react-jsx-self@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369"
@@ -1358,14 +745,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-jsx" "^7.10.4"
-"@babel/plugin-transform-react-jsx-self@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b"
- integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-jsx" "^7.8.3"
-
"@babel/plugin-transform-react-jsx-source@^7.10.4":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4"
@@ -1374,14 +753,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-jsx" "^7.10.4"
-"@babel/plugin-transform-react-jsx-source@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0"
- integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-jsx" "^7.8.3"
-
"@babel/plugin-transform-react-jsx@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2"
@@ -1392,16 +763,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-jsx" "^7.10.4"
-"@babel/plugin-transform-react-jsx@^7.9.4":
- version "7.9.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f"
- integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==
- dependencies:
- "@babel/helper-builder-react-jsx" "^7.9.0"
- "@babel/helper-builder-react-jsx-experimental" "^7.9.0"
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-syntax-jsx" "^7.8.3"
-
"@babel/plugin-transform-react-pure-annotations@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501"
@@ -1417,13 +778,6 @@
dependencies:
regenerator-transform "^0.14.2"
-"@babel/plugin-transform-regenerator@^7.8.7":
- version "7.8.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8"
- integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==
- dependencies:
- regenerator-transform "^0.14.2"
-
"@babel/plugin-transform-reserved-words@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd"
@@ -1431,13 +785,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-reserved-words@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5"
- integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-runtime@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf"
@@ -1455,13 +802,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-shorthand-properties@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8"
- integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-spread@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc"
@@ -1470,13 +810,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
-"@babel/plugin-transform-spread@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8"
- integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-sticky-regex@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d"
@@ -1485,14 +818,6 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/helper-regex" "^7.10.4"
-"@babel/plugin-transform-sticky-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100"
- integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/helper-regex" "^7.8.3"
-
"@babel/plugin-transform-template-literals@^7.10.4":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c"
@@ -1501,14 +826,6 @@
"@babel/helper-annotate-as-pure" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-template-literals@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80"
- integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-typeof-symbol@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc"
@@ -1516,13 +833,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-typeof-symbol@^7.8.4":
- version "7.8.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412"
- integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
"@babel/plugin-transform-typescript@^7.10.4":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb"
@@ -1547,81 +857,7 @@
"@babel/helper-create-regexp-features-plugin" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
-"@babel/plugin-transform-unicode-regex@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad"
- integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.4.3", "@babel/preset-env@^7.4.5":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8"
- integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==
- dependencies:
- "@babel/compat-data" "^7.9.0"
- "@babel/helper-compilation-targets" "^7.8.7"
- "@babel/helper-module-imports" "^7.8.3"
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-proposal-async-generator-functions" "^7.8.3"
- "@babel/plugin-proposal-dynamic-import" "^7.8.3"
- "@babel/plugin-proposal-json-strings" "^7.8.3"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-proposal-numeric-separator" "^7.8.3"
- "@babel/plugin-proposal-object-rest-spread" "^7.9.0"
- "@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
- "@babel/plugin-proposal-optional-chaining" "^7.9.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
- "@babel/plugin-syntax-async-generators" "^7.8.0"
- "@babel/plugin-syntax-dynamic-import" "^7.8.0"
- "@babel/plugin-syntax-json-strings" "^7.8.0"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
- "@babel/plugin-syntax-numeric-separator" "^7.8.0"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
- "@babel/plugin-syntax-optional-chaining" "^7.8.0"
- "@babel/plugin-syntax-top-level-await" "^7.8.3"
- "@babel/plugin-transform-arrow-functions" "^7.8.3"
- "@babel/plugin-transform-async-to-generator" "^7.8.3"
- "@babel/plugin-transform-block-scoped-functions" "^7.8.3"
- "@babel/plugin-transform-block-scoping" "^7.8.3"
- "@babel/plugin-transform-classes" "^7.9.0"
- "@babel/plugin-transform-computed-properties" "^7.8.3"
- "@babel/plugin-transform-destructuring" "^7.8.3"
- "@babel/plugin-transform-dotall-regex" "^7.8.3"
- "@babel/plugin-transform-duplicate-keys" "^7.8.3"
- "@babel/plugin-transform-exponentiation-operator" "^7.8.3"
- "@babel/plugin-transform-for-of" "^7.9.0"
- "@babel/plugin-transform-function-name" "^7.8.3"
- "@babel/plugin-transform-literals" "^7.8.3"
- "@babel/plugin-transform-member-expression-literals" "^7.8.3"
- "@babel/plugin-transform-modules-amd" "^7.9.0"
- "@babel/plugin-transform-modules-commonjs" "^7.9.0"
- "@babel/plugin-transform-modules-systemjs" "^7.9.0"
- "@babel/plugin-transform-modules-umd" "^7.9.0"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
- "@babel/plugin-transform-new-target" "^7.8.3"
- "@babel/plugin-transform-object-super" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.8.7"
- "@babel/plugin-transform-property-literals" "^7.8.3"
- "@babel/plugin-transform-regenerator" "^7.8.7"
- "@babel/plugin-transform-reserved-words" "^7.8.3"
- "@babel/plugin-transform-shorthand-properties" "^7.8.3"
- "@babel/plugin-transform-spread" "^7.8.3"
- "@babel/plugin-transform-sticky-regex" "^7.8.3"
- "@babel/plugin-transform-template-literals" "^7.8.3"
- "@babel/plugin-transform-typeof-symbol" "^7.8.4"
- "@babel/plugin-transform-unicode-regex" "^7.8.3"
- "@babel/preset-modules" "^0.1.3"
- "@babel/types" "^7.9.0"
- browserslist "^4.9.1"
- core-js-compat "^3.6.2"
- invariant "^2.2.2"
- levenary "^1.1.1"
- semver "^5.5.0"
-
-"@babel/preset-env@^7.11.0":
+"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.4.3", "@babel/preset-env@^7.4.5":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796"
integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==
@@ -1696,12 +932,12 @@
semver "^5.5.0"
"@babel/preset-flow@^7.0.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.9.0.tgz#fee847c3e090b0b2d9227c1949e4da1d1379280d"
- integrity sha512-88uSmlshIrlmPkNkEcx3UpSZ6b8n0UGBq0/0ZMZCF/uxAW0XIAUuDHBhIOAh0pvweafH4RxOwi/H3rWhtqOYPA==
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.10.4.tgz#e0d9c72f8cb02d1633f6a5b7b16763aa2edf659f"
+ integrity sha512-XI6l1CptQCOBv+ZKYwynyswhtOKwpZZp5n0LG1QKCo8erRhqjoQV6nvx61Eg30JHpysWQSBwA2AWRU3pBbSY5g==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-transform-flow-strip-types" "^7.9.0"
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-transform-flow-strip-types" "^7.10.4"
"@babel/preset-modules@^0.1.3":
version "0.1.3"
@@ -1714,19 +950,7 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
-"@babel/preset-react@^7.0.0":
- version "7.9.4"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d"
- integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
- "@babel/plugin-transform-react-display-name" "^7.8.3"
- "@babel/plugin-transform-react-jsx" "^7.9.4"
- "@babel/plugin-transform-react-jsx-development" "^7.9.0"
- "@babel/plugin-transform-react-jsx-self" "^7.9.0"
- "@babel/plugin-transform-react-jsx-source" "^7.9.0"
-
-"@babel/preset-react@^7.10.4":
+"@babel/preset-react@^7.0.0", "@babel/preset-react@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf"
integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==
@@ -1759,9 +983,9 @@
source-map-support "^0.5.16"
"@babel/runtime-corejs2@^7.2.0", "@babel/runtime-corejs2@^7.6.3":
- version "7.9.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.9.2.tgz#f11d074ff99b9b4319b5ecf0501f12202bf2bf4d"
- integrity sha512-ayjSOxuK2GaSDJFCtLgHnYjuMyIpViNujWrZo8GUpN60/n7juzJKK5yOo6RFVb0zdU9ACJFK+MsZrUnj3OmXMw==
+ version "7.11.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.11.2.tgz#700a03945ebad0d31ba6690fc8a6bcc9040faa47"
+ integrity sha512-AC/ciV28adSSpEkBglONBWq4/Lvm6GAZuxIoyVtsnUpZMl0bxLtoChEnYAkP+47KyOCayZanojtflUEUJtR/6Q==
dependencies:
core-js "^2.6.5"
regenerator-runtime "^0.13.4"
@@ -1773,42 +997,19 @@
dependencies:
regenerator-runtime "^0.12.0"
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
- version "7.9.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
- integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==
- dependencies:
- regenerator-runtime "^0.13.4"
-
-"@babel/runtime@^7.11.2":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.11.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/runtime@^7.3.1", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.7":
- version "7.10.5"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c"
- integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==
- dependencies:
- regenerator-runtime "^0.13.4"
-
"@babel/standalone@^7.4.5":
- version "7.10.5"
- resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.10.5.tgz#4ee38dc79fda10a2a0da0897f09e270310151314"
- integrity sha512-PERGHqhQ7H3TrdglvSW4pEHULywMJEdytnzaR0VPF1HN45aS+3FcE62efb90XPKS9TlgrEUkYDvYMt+0m6G0YA==
-
-"@babel/template@^7.0.0", "@babel/template@^7.3.3", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
- version "7.8.6"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b"
- integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/parser" "^7.8.6"
- "@babel/types" "^7.8.6"
+ version "7.11.3"
+ resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.11.3.tgz#043e6ff3b12226e41ed2013418b9a4c055d9c21e"
+ integrity sha512-rcoT32Hw0faYhmCDR0P84ODKL5kpEdhYPgdzlTKs7+v9oJaVLsGvq0xlkmLRj01F6LrItH3tY9eEoRsPLie4RQ==
-"@babel/template@^7.10.4":
+"@babel/template@^7.0.0", "@babel/template@^7.10.4", "@babel/template@^7.3.3", "@babel/template@^7.7.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
@@ -1817,22 +1018,7 @@
"@babel/parser" "^7.10.4"
"@babel/types" "^7.10.4"
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.4.5", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892"
- integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/generator" "^7.9.0"
- "@babel/helper-function-name" "^7.8.3"
- "@babel/helper-split-export-declaration" "^7.8.3"
- "@babel/parser" "^7.9.0"
- "@babel/types" "^7.9.0"
- debug "^4.1.0"
- globals "^11.1.0"
- lodash "^4.17.13"
-
-"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0":
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.4":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24"
integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==
@@ -1847,31 +1033,7 @@
globals "^11.1.0"
lodash "^4.17.19"
-"@babel/traverse@^7.7.4":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2"
- integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==
- dependencies:
- "@babel/code-frame" "^7.8.3"
- "@babel/generator" "^7.9.5"
- "@babel/helper-function-name" "^7.9.5"
- "@babel/helper-split-export-declaration" "^7.8.3"
- "@babel/parser" "^7.9.0"
- "@babel/types" "^7.9.5"
- debug "^4.1.0"
- globals "^11.1.0"
- lodash "^4.17.13"
-
-"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0":
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5"
- integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==
- dependencies:
- "@babel/helper-validator-identifier" "^7.9.0"
- lodash "^4.17.13"
- to-fast-properties "^2.0.0"
-
-"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0":
+"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d"
integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==
@@ -1880,24 +1042,6 @@
lodash "^4.17.19"
to-fast-properties "^2.0.0"
-"@babel/types@^7.3.3":
- version "7.9.6"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7"
- integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==
- dependencies:
- "@babel/helper-validator-identifier" "^7.9.5"
- lodash "^4.17.13"
- to-fast-properties "^2.0.0"
-
-"@babel/types@^7.4", "@babel/types@^7.9.5":
- version "7.9.5"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444"
- integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==
- dependencies:
- "@babel/helper-validator-identifier" "^7.9.5"
- lodash "^4.17.13"
- to-fast-properties "^2.0.0"
-
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@@ -7695,13 +6839,6 @@ babel-plugin-add-react-displayname@^0.0.5:
resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5"
integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U=
-babel-plugin-dynamic-import-node@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f"
- integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==
- dependencies:
- object.assign "^4.1.0"
-
babel-plugin-dynamic-import-node@^2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
@@ -8653,16 +7790,6 @@ browserslist@^4.8.3:
electron-to-chromium "^1.3.338"
node-releases "^1.1.46"
-browserslist@^4.9.1:
- version "4.11.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad"
- integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==
- dependencies:
- caniuse-lite "^1.0.30001035"
- electron-to-chromium "^1.3.380"
- node-releases "^1.1.52"
- pkg-up "^3.1.0"
-
bser@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
@@ -8751,11 +7878,6 @@ builtin-status-codes@^3.0.0:
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
-builtins@0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a"
- integrity sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=
-
bytes@1:
version "1.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
@@ -9089,7 +8211,7 @@ can-use-dom@^0.1.0:
resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a"
integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo=
-caniuse-lite@^1.0.30000984, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001022, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001043:
+caniuse-lite@^1.0.30000984, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001022, caniuse-lite@^1.0.30001043:
version "1.0.30001094"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001094.tgz#0b11d02e1cdc201348dbd8e3e57bd9b6ce82b175"
integrity sha512-ufHZNtMaDEuRBpTbqD93tIQnngmJ+oBknjvr0IbFympSdtFpAUFmNv4mVKbb53qltxFx0nK3iy32S9AqkLzUNA==
@@ -12470,11 +11592,6 @@ electron-to-chromium@^1.3.191, electron-to-chromium@^1.3.338:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.340.tgz#5d4fe78e984d4211194cf5a52e08069543da146f"
integrity sha512-hRFBAglhcj5iVYH+o8QU0+XId1WGoc0VGowJB1cuJAt3exHGrivZvWeAO5BRgBZqwZtwxjm8a5MQeGoT/Su3ww==
-electron-to-chromium@^1.3.380:
- version "1.3.382"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.382.tgz#cad02da655c33f7a3d6ca7525bd35c17e90f3a8f"
- integrity sha512-gJfxOcgnBlXhfnUUObsq3n3ReU8CT6S8je97HndYRkKsNZMJJ38zO/pI5aqO7L3Myfq+E3pqPyKK/ynyLEQfBA==
-
electron-to-chromium@^1.3.413:
version "1.3.465"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.465.tgz#d692e5c383317570c2bd82092a24a0308c6ccf29"
@@ -14977,7 +14094,7 @@ get-own-enumerable-property-symbols@^3.0.0:
resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203"
integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==
-get-port@4.2.0:
+get-port@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119"
integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==
@@ -22121,13 +21238,6 @@ node-releases@^1.1.25, node-releases@^1.1.46:
dependencies:
semver "^6.3.0"
-node-releases@^1.1.52:
- version "1.1.52"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9"
- integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==
- dependencies:
- semver "^6.3.0"
-
node-releases@^1.1.53:
version "1.1.58"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935"
@@ -30844,13 +29954,6 @@ validate-npm-package-license@^3.0.1:
spdx-correct "~1.0.0"
spdx-expression-parse "~1.0.0"
-validate-npm-package-name@2.2.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz#f65695b22f7324442019a3c7fa39a6e7fd299085"
- integrity sha1-9laVsi9zJEQgGaPH+jmm5/0pkIU=
- dependencies:
- builtins "0.0.7"
-
validator@^10.11.0:
version "10.11.0"
resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228"