) => PolicyConfig = createSelector(
- policyDetails,
+ licensedPolicy,
(policyData) => {
return policyData?.inputs[0]?.config?.policy?.value ?? defaultFullPolicy;
}
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/types.ts b/x-pack/plugins/security_solution/public/management/pages/policy/types.ts
index 3926ad2220e35..889bcc15d8df0 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/types.ts
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/types.ts
@@ -4,6 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import { ILicense } from '../../../../../licensing/common/types';
import {
AppLocation,
Immutable,
@@ -66,6 +67,8 @@ export interface PolicyDetailsState {
success: boolean;
error?: ServerApiError;
};
+ /** current license */
+ license?: ILicense;
}
/**
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/with_security_context.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/with_security_context.tsx
index f65dbaf1087d8..118ebdf56db90 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/with_security_context.tsx
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/with_security_context.tsx
@@ -8,6 +8,7 @@ import React, { ComponentType, memo } from 'react';
import { CoreStart } from 'kibana/public';
import { combineReducers, createStore, compose, applyMiddleware } from 'redux';
import { Provider as ReduxStoreProvider } from 'react-redux';
+import { CurrentLicense } from '../../../../../common/components/current_license';
import { StartPlugins } from '../../../../../types';
import { managementReducer } from '../../../../store/reducer';
import { managementMiddlewareFactory } from '../../../../store/middleware';
@@ -57,7 +58,9 @@ export const withSecurityContext = ({
return (
-
+
+
+
);
});
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx
index d611c4102e8f8..8e631e497e57b 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx
@@ -55,16 +55,19 @@ const ProtectionRadio = React.memo(({ id, label }: { id: ProtectionModes; label:
const radioButtonId = useMemo(() => htmlIdGenerator()(), []);
// currently just taking windows.malware, but both windows.malware and mac.malware should be the same value
const selected = policyDetailsConfig && policyDetailsConfig.windows.malware.mode;
+ const isPlatinumPlus = useLicense().isPlatinumPlus();
const handleRadioChange = useCallback(() => {
if (policyDetailsConfig) {
const newPayload = cloneDeep(policyDetailsConfig);
for (const os of OSes) {
newPayload[os][protection].mode = id;
- if (id === ProtectionModes.prevent) {
- newPayload[os].popup[protection].enabled = true;
- } else {
- newPayload[os].popup[protection].enabled = false;
+ if (isPlatinumPlus) {
+ if (id === ProtectionModes.prevent) {
+ newPayload[os].popup[protection].enabled = true;
+ } else {
+ newPayload[os].popup[protection].enabled = false;
+ }
}
}
dispatch({
@@ -72,7 +75,7 @@ const ProtectionRadio = React.memo(({ id, label }: { id: ProtectionModes; label:
payload: { policyConfig: newPayload },
});
}
- }, [dispatch, id, policyDetailsConfig]);
+ }, [dispatch, id, policyDetailsConfig, isPlatinumPlus]);
/**
* Passing an arbitrary id because EuiRadio
@@ -158,12 +161,16 @@ export const MalwareProtections = React.memo(() => {
if (event.target.checked === false) {
for (const os of OSes) {
newPayload[os][protection].mode = ProtectionModes.off;
- newPayload[os].popup[protection].enabled = event.target.checked;
+ if (isPlatinumPlus) {
+ newPayload[os].popup[protection].enabled = event.target.checked;
+ }
}
} else {
for (const os of OSes) {
newPayload[os][protection].mode = ProtectionModes.prevent;
- newPayload[os].popup[protection].enabled = event.target.checked;
+ if (isPlatinumPlus) {
+ newPayload[os].popup[protection].enabled = event.target.checked;
+ }
}
}
dispatch({
@@ -172,7 +179,7 @@ export const MalwareProtections = React.memo(() => {
});
}
},
- [dispatch, policyDetailsConfig]
+ [dispatch, policyDetailsConfig, isPlatinumPlus]
);
const handleUserNotificationCheckbox = useCallback(
@@ -243,6 +250,7 @@ export const MalwareProtections = React.memo(() => {
id="xpack.securitySolution.endpoint.policyDetail.malware.userNotification"
onChange={handleUserNotificationCheckbox}
checked={userNotificationSelected}
+ disabled={selected === ProtectionModes.off}
label={i18n.translate(
'xpack.securitySolution.endpoint.policyDetail.malware.notifyUser',
{
@@ -305,6 +313,7 @@ export const MalwareProtections = React.memo(() => {
);
}, [
radios,
+ selected,
isPlatinumPlus,
handleUserNotificationCheckbox,
userNotificationSelected,
diff --git a/x-pack/plugins/security_solution/public/management/routes.tsx b/x-pack/plugins/security_solution/public/management/routes.tsx
index 209d7dd6dbcde..bc24b9ca51980 100644
--- a/x-pack/plugins/security_solution/public/management/routes.tsx
+++ b/x-pack/plugins/security_solution/public/management/routes.tsx
@@ -8,13 +8,16 @@ import React from 'react';
import { Route, Switch } from 'react-router-dom';
import { ManagementContainer } from './pages';
import { NotFoundPage } from '../app/404';
+import { CurrentLicense } from '../common/components/current_license';
/**
* Returns the React Router Routes for the management area
*/
export const ManagementRoutes = () => (
-
-
- } />
-
+
+
+
+ } />
+
+
);
diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/note_cards/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/notes/note_cards/index.test.tsx
index afec2055140d3..febbbb23db1ef 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/notes/note_cards/index.test.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/notes/note_cards/index.test.tsx
@@ -11,6 +11,7 @@ import '../../../../common/mock/formatted_relative';
import { NoteCards } from '.';
import { TimelineStatus } from '../../../../../common/types/timeline';
import { TestProviders } from '../../../../common/mock';
+import { TimelineResultNote } from '../../open_timeline/types';
const getNotesByIds = () => ({
abc: {
@@ -38,35 +39,42 @@ jest.mock('../../../../common/hooks/use_selector', () => ({
}));
describe('NoteCards', () => {
- const noteIds = ['abc', 'def'];
+ const notes: TimelineResultNote[] = Object.entries(getNotesByIds()).map(
+ ([_, { created, id, note, saveObjectId, user }]) => ({
+ saveObjectId,
+ note,
+ noteId: id,
+ updated: created.getTime(),
+ updatedBy: user,
+ })
+ );
const props = {
associateNote: jest.fn(),
ariaRowindex: 2,
getNotesByIds,
getNewNoteId: jest.fn(),
- noteIds,
+ notes: [],
showAddNote: true,
status: TimelineStatus.active,
toggleShowAddNote: jest.fn(),
updateNote: jest.fn(),
};
- test('it renders the notes column when noteIds are specified', () => {
+ test('it renders the notes column when notes are specified', () => {
const wrapper = mount(
-
+
);
expect(wrapper.find('[data-test-subj="notes"]').exists()).toEqual(true);
});
- test('it does NOT render the notes column when noteIds are NOT specified', () => {
- const testProps = { ...props, noteIds: [] };
+ test('it does NOT render the notes column when notes are NOT specified', () => {
const wrapper = mount(
-
+
);
@@ -76,7 +84,7 @@ describe('NoteCards', () => {
test('renders note cards', () => {
const wrapper = mount(
-
+
);
@@ -85,6 +93,18 @@ describe('NoteCards', () => {
);
});
+ test('renders the expected screenreader only text', () => {
+ const wrapper = mount(
+
+
+
+ );
+
+ expect(wrapper.find('[data-test-subj="screenReaderOnly"]').first().text()).toEqual(
+ 'You are viewing notes for the event in row 2. Press the up arrow key when finished to return to the event.'
+ );
+ });
+
test('it shows controls for adding notes when showAddNote is true', () => {
const wrapper = mount(
diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/note_cards/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/notes/note_cards/index.tsx
index 99cf8740809da..9b307690cf12c 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/notes/note_cards/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/notes/note_cards/index.tsx
@@ -5,11 +5,10 @@
*/
import { EuiFlexGroup, EuiPanel, EuiScreenReaderOnly } from '@elastic/eui';
-import React, { useState, useCallback, useMemo } from 'react';
+import React, { useState, useCallback } from 'react';
import styled from 'styled-components';
-import { appSelectors } from '../../../../common/store';
-import { useDeepEqualSelector } from '../../../../common/hooks/use_selector';
+import { getNotesContainerClassName } from '../../../../common/components/accessibility/helpers';
import { AddNote } from '../add_note';
import { AssociateNote } from '../helpers';
import { NotePreviews, NotePreviewsContainer } from '../../open_timeline/note_previews';
@@ -44,16 +43,14 @@ NotesContainer.displayName = 'NotesContainer';
interface Props {
ariaRowindex: number;
associateNote: AssociateNote;
- noteIds: string[];
+ notes: TimelineResultNote[];
showAddNote: boolean;
toggleShowAddNote: () => void;
}
/** A view for entering and reviewing notes */
export const NoteCards = React.memo(
- ({ ariaRowindex, associateNote, noteIds, showAddNote, toggleShowAddNote }) => {
- const getNotesByIds = useMemo(() => appSelectors.notesByIdsSelector(), []);
- const notesById = useDeepEqualSelector(getNotesByIds);
+ ({ ariaRowindex, associateNote, notes, showAddNote, toggleShowAddNote }) => {
const [newNote, setNewNote] = useState('');
const associateNoteAndToggleShow = useCallback(
@@ -64,23 +61,16 @@ export const NoteCards = React.memo(
[associateNote, toggleShowAddNote]
);
- const notes: TimelineResultNote[] = useMemo(
- () =>
- appSelectors.getNotes(notesById, noteIds).map((note) => ({
- savedObjectId: note.saveObjectId,
- note: note.note,
- noteId: note.id,
- updated: (note.lastEdit ?? note.created).getTime(),
- updatedBy: note.user,
- })),
- [notesById, noteIds]
- );
-
return (
{notes.length ? (
-
+
{i18n.YOU_ARE_VIEWING_NOTES(ariaRowindex)}
diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.tsx
index 2a1d0d2ad11cf..fc05e61442e83 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/index.tsx
@@ -5,7 +5,7 @@
*/
import { uniqBy } from 'lodash/fp';
-import { EuiAvatar, EuiButtonIcon, EuiCommentList } from '@elastic/eui';
+import { EuiAvatar, EuiButtonIcon, EuiCommentList, EuiScreenReaderOnly } from '@elastic/eui';
import { FormattedRelative } from '@kbn/i18n/react';
import React, { useCallback, useMemo } from 'react';
import styled from 'styled-components';
@@ -15,6 +15,7 @@ import { TimelineResultNote } from '../types';
import { getEmptyValue, defaultToEmptyTag } from '../../../../common/components/empty_value';
import { MarkdownRenderer } from '../../../../common/components/markdown_editor';
import { timelineActions } from '../../../store/timeline';
+import { NOTE_CONTENT_CLASS_NAME } from '../../timeline/body/helpers';
import * as i18n from './translations';
export const NotePreviewsContainer = styled.section`
@@ -89,7 +90,14 @@ export const NotePreviews = React.memo(
) : (
getEmptyValue()
),
- children: {note.note ?? ''},
+ children: (
+
+
+ {i18n.USER_ADDED_A_NOTE(note.updatedBy ?? i18n.AN_UNKNOWN_USER)}
+
+
{note.note ?? ''}
+
+ ),
actions:
eventId && timelineId ? (
diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/translations.ts
index 9857e55e36570..d38dee8a41504 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/translations.ts
+++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/translations.ts
@@ -12,3 +12,16 @@ export const TOGGLE_EXPAND_EVENT_DETAILS = i18n.translate(
defaultMessage: 'Expand event details',
}
);
+
+export const USER_ADDED_A_NOTE = (user: string) =>
+ i18n.translate('xpack.securitySolution.timeline.userAddedANoteScreenReaderOnly', {
+ values: { user },
+ defaultMessage: '{user} added a note',
+ });
+
+export const AN_UNKNOWN_USER = i18n.translate(
+ 'xpack.securitySolution.timeline.anUnknownUserScreenReaderOnly',
+ {
+ defaultMessage: 'an unknown user',
+ }
+);
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/__snapshots__/index.test.tsx.snap
index 8f514ca49e848..d112a665d77c0 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/__snapshots__/index.test.tsx.snap
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/__snapshots__/index.test.tsx.snap
@@ -44,6 +44,7 @@ exports[`Columns it renders the expected columns 1`] = `
truncate={true}
/>
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
`;
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/index.test.tsx
index 00b3a10bba538..d7931b563c777 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/index.test.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/index.test.tsx
@@ -26,6 +26,8 @@ describe('Columns', () => {
columnRenderers={columnRenderers}
data={mockTimelineData[0].data}
ecsData={mockTimelineData[0].ecs}
+ hasRowRenderers={false}
+ notesCount={0}
timelineId="test"
/>
);
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/index.tsx
index 6dad9851e5adb..c497d4f459f00 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/index.tsx
@@ -21,12 +21,14 @@ import * as i18n from './translations';
interface Props {
_id: string;
- activeTab?: TimelineTabs;
ariaRowindex: number;
columnHeaders: ColumnHeaderOptions[];
columnRenderers: ColumnRenderer[];
data: TimelineNonEcsData[];
ecsData: Ecs;
+ hasRowRenderers: boolean;
+ notesCount: number;
+ tabType?: TimelineTabs;
timelineId: string;
}
@@ -74,12 +76,23 @@ export const onKeyDown = (keyboardEvent: React.KeyboardEvent) => {
};
export const DataDrivenColumns = React.memo(
- ({ _id, activeTab, ariaRowindex, columnHeaders, columnRenderers, data, ecsData, timelineId }) => (
+ ({
+ _id,
+ ariaRowindex,
+ columnHeaders,
+ columnRenderers,
+ data,
+ ecsData,
+ hasRowRenderers,
+ notesCount,
+ tabType,
+ timelineId,
+ }) => (
{columnHeaders.map((header, i) => (
(
eventId: _id,
field: header,
linkValues: getOr([], header.linkField ?? '', ecsData),
- timelineId: activeTab != null ? `${timelineId}-${activeTab}` : timelineId,
+ timelineId: tabType != null ? `${timelineId}-${tabType}` : timelineId,
truncate: true,
values: getMappedNonEcsValue({
data,
@@ -104,6 +117,17 @@ export const DataDrivenColumns = React.memo(
})}
>
+ {hasRowRenderers && (
+
+ {i18n.EVENT_HAS_AN_EVENT_RENDERER(ariaRowindex)}
+
+ )}
+
+ {notesCount && (
+
+ {i18n.EVENT_HAS_NOTES({ row: ariaRowindex, notesCount })}
+
+ )}
))}
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/translations.ts
index 80199e0026ac3..63086d56d0753 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/translations.ts
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/data_driven_columns/translations.ts
@@ -11,3 +11,17 @@ export const YOU_ARE_IN_A_TABLE_CELL = ({ column, row }: { column: number; row:
values: { column, row },
defaultMessage: 'You are in a table cell. row: {row}, column: {column}',
});
+
+export const EVENT_HAS_AN_EVENT_RENDERER = (row: number) =>
+ i18n.translate('xpack.securitySolution.timeline.eventHasEventRendererScreenReaderOnly', {
+ values: { row },
+ defaultMessage:
+ 'The event in row {row} has an event renderer. Press shift + down arrow to focus it.',
+ });
+
+export const EVENT_HAS_NOTES = ({ notesCount, row }: { notesCount: number; row: number }) =>
+ i18n.translate('xpack.securitySolution.timeline.eventHasNotesScreenReaderOnly', {
+ values: { notesCount, row },
+ defaultMessage:
+ 'The event in row {row} has {notesCount, plural, =1 {a note} other {{notesCount} notes}}. Press shift + right arrow to focus notes.',
+ });
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.test.tsx
index 9bb8a695454d7..0525767e616be 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.test.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.test.tsx
@@ -36,8 +36,10 @@ describe('EventColumnView', () => {
},
eventIdToNoteIds: {},
expanded: false,
+ hasRowRenderers: false,
loading: false,
loadingEventIds: [],
+ notesCount: 0,
onEventToggled: jest.fn(),
onPinEvent: jest.fn(),
onRowSelected: jest.fn(),
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx
index 6aee6f9d4fdfa..ae8d2a47c7dc7 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx
@@ -35,7 +35,6 @@ import * as i18n from '../translations';
interface Props {
id: string;
actionsColumnWidth: number;
- activeTab?: TimelineTabs;
ariaRowindex: number;
columnHeaders: ColumnHeaderOptions[];
columnRenderers: ColumnRenderer[];
@@ -46,15 +45,18 @@ interface Props {
isEventPinned: boolean;
isEventViewer?: boolean;
loadingEventIds: Readonly;
+ notesCount: number;
onEventToggled: () => void;
onPinEvent: OnPinEvent;
onRowSelected: OnRowSelected;
onUnPinEvent: OnUnPinEvent;
refetch: inputsModel.Refetch;
onRuleChange?: () => void;
+ hasRowRenderers: boolean;
selectedEventIds: Readonly>;
showCheckboxes: boolean;
showNotes: boolean;
+ tabType?: TimelineTabs;
timelineId: string;
toggleShowNotes: () => void;
}
@@ -65,7 +67,6 @@ export const EventColumnView = React.memo(
({
id,
actionsColumnWidth,
- activeTab,
ariaRowindex,
columnHeaders,
columnRenderers,
@@ -76,15 +77,18 @@ export const EventColumnView = React.memo(
isEventPinned = false,
isEventViewer = false,
loadingEventIds,
+ notesCount,
onEventToggled,
onPinEvent,
onRowSelected,
onUnPinEvent,
refetch,
+ hasRowRenderers,
onRuleChange,
selectedEventIds,
showCheckboxes,
showNotes,
+ tabType,
timelineId,
toggleShowNotes,
}) => {
@@ -225,12 +229,14 @@ export const EventColumnView = React.memo(
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/index.tsx
index bce5f1293e66b..92ae01b185f7a 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/index.tsx
@@ -24,7 +24,6 @@ import { eventIsPinned } from '../helpers';
const ARIA_ROW_INDEX_OFFSET = 2;
interface Props {
- activeTab?: TimelineTabs;
actionsColumnWidth: number;
browserFields: BrowserFields;
columnHeaders: ColumnHeaderOptions[];
@@ -43,11 +42,11 @@ interface Props {
rowRenderers: RowRenderer[];
selectedEventIds: Readonly>;
showCheckboxes: boolean;
+ tabType?: TimelineTabs;
}
const EventsComponent: React.FC = ({
actionsColumnWidth,
- activeTab,
browserFields,
columnHeaders,
columnRenderers,
@@ -65,11 +64,11 @@ const EventsComponent: React.FC = ({
rowRenderers,
selectedEventIds,
showCheckboxes,
+ tabType,
}) => (
{data.map((event, i) => (
= ({
eventIdToNoteIds={eventIdToNoteIds}
isEventPinned={eventIsPinned({ eventId: event._id, pinnedEventIds })}
isEventViewer={isEventViewer}
- key={`${id}_${activeTab}_${event._id}_${event._index}`}
+ key={`${id}_${tabType}_${event._id}_${event._index}`}
lastFocusedAriaColindex={lastFocusedAriaColindex}
loadingEventIds={loadingEventIds}
onRowSelected={onRowSelected}
@@ -89,6 +88,7 @@ const EventsComponent: React.FC = ({
onRuleChange={onRuleChange}
selectedEventIds={selectedEventIds}
showCheckboxes={showCheckboxes}
+ tabType={tabType}
timelineId={id}
/>
))}
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx
index 9802e4532b05b..e3f5a744e8b7d 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx
@@ -19,22 +19,22 @@ import { OnPinEvent, OnRowSelected } from '../../events';
import { STATEFUL_EVENT_CSS_CLASS_NAME } from '../../helpers';
import { EventsTrGroup, EventsTrSupplement, EventsTrSupplementContainer } from '../../styles';
import { ColumnRenderer } from '../renderers/column_renderer';
-
import { RowRenderer } from '../renderers/row_renderer';
import { isEventBuildingBlockType, getEventType } from '../helpers';
import { NoteCards } from '../../../notes/note_cards';
import { useEventDetailsWidthContext } from '../../../../../common/components/events_viewer/event_details_width_context';
import { EventColumnView } from './event_column_view';
-import { inputsModel } from '../../../../../common/store';
+import { appSelectors, inputsModel } from '../../../../../common/store';
import { timelineActions, timelineSelectors } from '../../../../store/timeline';
import { activeTimeline } from '../../../../containers/active_timeline_context';
+import { TimelineResultNote } from '../../../open_timeline/types';
+import { getRowRenderer } from '../renderers/get_row_renderer';
import { StatefulRowRenderer } from './stateful_row_renderer';
import { NOTES_BUTTON_CLASS_NAME } from '../../properties/helpers';
import { timelineDefaults } from '../../../../store/timeline/defaults';
interface Props {
actionsColumnWidth: number;
- activeTab?: TimelineTabs;
containerRef: React.MutableRefObject;
browserFields: BrowserFields;
columnHeaders: ColumnHeaderOptions[];
@@ -52,6 +52,7 @@ interface Props {
rowRenderers: RowRenderer[];
selectedEventIds: Readonly>;
showCheckboxes: boolean;
+ tabType?: TimelineTabs;
timelineId: string;
}
@@ -66,7 +67,6 @@ EventsTrSupplementContainerWrapper.displayName = 'EventsTrSupplementContainerWra
const StatefulEventComponent: React.FC = ({
actionsColumnWidth,
- activeTab,
browserFields,
containerRef,
columnHeaders,
@@ -84,6 +84,7 @@ const StatefulEventComponent: React.FC = ({
ariaRowindex,
selectedEventIds,
showCheckboxes,
+ tabType,
timelineId,
}) => {
const trGroupRef = useRef(null);
@@ -93,12 +94,31 @@ const StatefulEventComponent: React.FC = ({
const expandedEvent = useDeepEqualSelector(
(state) => (getTimeline(state, timelineId) ?? timelineDefaults).expandedEvent
);
-
+ const getNotesByIds = useMemo(() => appSelectors.notesByIdsSelector(), []);
+ const notesById = useDeepEqualSelector(getNotesByIds);
+ const noteIds: string[] = eventIdToNoteIds[event._id] || emptyNotes;
const isExpanded = useMemo(() => expandedEvent && expandedEvent.eventId === event._id, [
event._id,
expandedEvent,
]);
+ const notes: TimelineResultNote[] = useMemo(
+ () =>
+ appSelectors.getNotes(notesById, noteIds).map((note) => ({
+ savedObjectId: note.saveObjectId,
+ note: note.note,
+ noteId: note.id,
+ updated: (note.lastEdit ?? note.created).getTime(),
+ updatedBy: note.user,
+ })),
+ [notesById, noteIds]
+ );
+
+ const hasRowRenderers: boolean = useMemo(() => getRowRenderer(event.ecs, rowRenderers) != null, [
+ event.ecs,
+ rowRenderers,
+ ]);
+
const onToggleShowNotes = useCallback(() => {
const eventId = event._id;
@@ -195,7 +215,6 @@ const StatefulEventComponent: React.FC = ({
= ({
ecsData={event.ecs}
eventIdToNoteIds={eventIdToNoteIds}
expanded={isExpanded}
+ hasRowRenderers={hasRowRenderers}
isEventPinned={isEventPinned}
isEventViewer={isEventViewer}
loadingEventIds={loadingEventIds}
+ notesCount={notes.length}
onEventToggled={handleOnEventToggled}
onPinEvent={onPinEvent}
onRowSelected={onRowSelected}
@@ -215,6 +236,7 @@ const StatefulEventComponent: React.FC = ({
selectedEventIds={selectedEventIds}
showCheckboxes={showCheckboxes}
showNotes={!!showNotes[event._id]}
+ tabType={tabType}
timelineId={timelineId}
toggleShowNotes={onToggleShowNotes}
/>
@@ -228,7 +250,7 @@ const StatefulEventComponent: React.FC = ({
ariaRowindex={ariaRowindex}
associateNote={associateNote}
data-test-subj="note-cards"
- noteIds={eventIdToNoteIds[event._id] || emptyNotes}
+ notes={notes}
showAddNote={!!showNotes[event._id]}
toggleShowAddNote={onToggleShowNotes}
/>
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx
index 1628824b46a08..4000ebcfd767a 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx
@@ -12,6 +12,7 @@ import { BrowserFields } from '../../../../../../common/containers/source';
import {
ARIA_COLINDEX_ATTRIBUTE,
ARIA_ROWINDEX_ATTRIBUTE,
+ getRowRendererClassName,
} from '../../../../../../common/components/accessibility/helpers';
import { TimelineItem } from '../../../../../../../common/search_strategy/timeline';
import { getRowRenderer } from '../../renderers/get_row_renderer';
@@ -59,28 +60,44 @@ export const StatefulRowRenderer = ({
rowindexAttribute: ARIA_ROWINDEX_ATTRIBUTE,
});
+ const rowRenderer = useMemo(() => getRowRenderer(event.ecs, rowRenderers), [
+ event.ecs,
+ rowRenderers,
+ ]);
+
const content = useMemo(
- () => (
-
-
- {i18n.YOU_ARE_IN_AN_EVENT_RENDERER(ariaRowindex)}
-
-
- {getRowRenderer(event.ecs, rowRenderers).renderRow({
- browserFields,
- data: event.ecs,
- timelineId,
- })}
+ () =>
+ rowRenderer && (
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
+
+
+
+
+ {i18n.YOU_ARE_IN_AN_EVENT_RENDERER(ariaRowindex)}
+
+
+ {rowRenderer.renderRow({
+ browserFields,
+ data: event.ecs,
+ timelineId,
+ })}
+
+
+
-
- ),
- [ariaRowindex, browserFields, event.ecs, focusOwnership, onKeyDown, rowRenderers, timelineId]
+ ),
+ [
+ ariaRowindex,
+ browserFields,
+ event.ecs,
+ focusOwnership,
+ onFocus,
+ onKeyDown,
+ onOutsideClick,
+ rowRenderer,
+ timelineId,
+ ]
);
- return (
- // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
-
- {content}
-
- );
+ return content;
};
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.tsx
index 3470dba636aa8..0295d44b646d7 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.tsx
@@ -160,3 +160,9 @@ const InvestigateInResolverActionComponent: React.FC
{
setSelected: (jest.fn() as unknown) as StatefulBodyProps['setSelected'],
sort: mockSort,
showCheckboxes: false,
- activeTab: TimelineTabs.query,
+ tabType: TimelineTabs.query,
totalPages: 1,
};
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx
index f6190b39214e9..4a33d0d3af33e 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx
@@ -21,7 +21,7 @@ import { BrowserFields } from '../../../../common/containers/source';
import { TimelineItem } from '../../../../../common/search_strategy/timeline';
import { inputsModel, State } from '../../../../common/store';
import { useManageTimeline } from '../../manage_timeline';
-import { ColumnHeaderOptions, TimelineModel } from '../../../store/timeline/model';
+import { ColumnHeaderOptions, TimelineModel, TimelineTabs } from '../../../store/timeline/model';
import { timelineDefaults } from '../../../store/timeline/defaults';
import { timelineActions, timelineSelectors } from '../../../store/timeline';
import { OnRowSelected, OnSelectAll } from '../events';
@@ -43,6 +43,7 @@ interface OwnProps {
isEventViewer?: boolean;
sort: Sort[];
refetch: inputsModel.Refetch;
+ tabType: TimelineTabs;
totalPages: number;
onRuleChange?: () => void;
}
@@ -60,7 +61,6 @@ export type StatefulBodyProps = OwnProps & PropsFromRedux;
export const BodyComponent = React.memo(
({
- activeTab,
activePage,
browserFields,
columnHeaders,
@@ -79,6 +79,7 @@ export const BodyComponent = React.memo(
showCheckboxes,
refetch,
sort,
+ tabType,
totalPages,
}) => {
const containerRef = useRef(null);
@@ -200,7 +201,6 @@ export const BodyComponent = React.memo(
(
onRuleChange={onRuleChange}
selectedEventIds={selectedEventIds}
showCheckboxes={showCheckboxes}
+ tabType={tabType}
/>
@@ -225,7 +226,6 @@ export const BodyComponent = React.memo(
);
},
(prevProps, nextProps) =>
- prevProps.activeTab === nextProps.activeTab &&
deepEqual(prevProps.browserFields, nextProps.browserFields) &&
deepEqual(prevProps.columnHeaders, nextProps.columnHeaders) &&
deepEqual(prevProps.data, nextProps.data) &&
@@ -238,7 +238,8 @@ export const BodyComponent = React.memo(
prevProps.id === nextProps.id &&
prevProps.isEventViewer === nextProps.isEventViewer &&
prevProps.isSelectAllChecked === nextProps.isSelectAllChecked &&
- prevProps.showCheckboxes === nextProps.showCheckboxes
+ prevProps.showCheckboxes === nextProps.showCheckboxes &&
+ prevProps.tabType === nextProps.tabType
);
BodyComponent.displayName = 'BodyComponent';
@@ -253,7 +254,6 @@ const makeMapStateToProps = () => {
const mapStateToProps = (state: State, { browserFields, id }: OwnProps) => {
const timeline: TimelineModel = getTimeline(state, id) ?? timelineDefaults;
const {
- activeTab,
columns,
eventIdToNoteIds,
excludedRowRendererIds,
@@ -265,7 +265,6 @@ const makeMapStateToProps = () => {
} = timeline;
return {
- activeTab: id === TimelineId.active ? activeTab : undefined,
columnHeaders: memoizedColumnHeaders(columns, browserFields),
eventIdToNoteIds,
excludedRowRendererIds,
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx
index b4fdc427d9db3..f3a914ff4be29 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx
@@ -48,7 +48,7 @@ describe('get_column_renderer', () => {
test('renders correctly against snapshot', () => {
const rowRenderer = getRowRenderer(nonSuricata, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: nonSuricata,
timelineId: 'test',
@@ -60,7 +60,7 @@ describe('get_column_renderer', () => {
test('should render plain row data when it is a non suricata row', () => {
const rowRenderer = getRowRenderer(nonSuricata, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: nonSuricata,
timelineId: 'test',
@@ -75,7 +75,7 @@ describe('get_column_renderer', () => {
test('should render a suricata row data when it is a suricata row', () => {
const rowRenderer = getRowRenderer(suricata, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: suricata,
timelineId: 'test',
@@ -93,7 +93,7 @@ describe('get_column_renderer', () => {
test('should render a suricata row data if event.category is network_traffic', () => {
suricata.event = { ...suricata.event, ...{ category: ['network_traffic'] } };
const rowRenderer = getRowRenderer(suricata, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: suricata,
timelineId: 'test',
@@ -111,7 +111,7 @@ describe('get_column_renderer', () => {
test('should render a zeek row data if event.category is network_traffic', () => {
zeek.event = { ...zeek.event, ...{ category: ['network_traffic'] } };
const rowRenderer = getRowRenderer(zeek, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: zeek,
timelineId: 'test',
@@ -129,7 +129,7 @@ describe('get_column_renderer', () => {
test('should render a system row data if event.category is network_traffic', () => {
system.event = { ...system.event, ...{ category: ['network_traffic'] } };
const rowRenderer = getRowRenderer(system, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: system,
timelineId: 'test',
@@ -147,7 +147,7 @@ describe('get_column_renderer', () => {
test('should render a auditd row data if event.category is network_traffic', () => {
auditd.event = { ...auditd.event, ...{ category: ['network_traffic'] } };
const rowRenderer = getRowRenderer(auditd, rowRenderers);
- const row = rowRenderer.renderRow({
+ const row = rowRenderer?.renderRow({
browserFields: mockBrowserFields,
data: auditd,
timelineId: 'test',
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts
index 779d54216e26c..1662cf4037cac 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts
@@ -7,15 +7,5 @@
import { Ecs } from '../../../../../../common/ecs';
import { RowRenderer } from './row_renderer';
-const unhandledRowRenderer = (): never => {
- throw new Error('Unhandled Row Renderer');
-};
-
-export const getRowRenderer = (ecs: Ecs, rowRenderers: RowRenderer[]): RowRenderer => {
- const renderer = rowRenderers.find((rowRenderer) => rowRenderer.isInstance(ecs));
- if (renderer == null) {
- return unhandledRowRenderer();
- } else {
- return renderer;
- }
-};
+export const getRowRenderer = (ecs: Ecs, rowRenderers: RowRenderer[]): RowRenderer | null =>
+ rowRenderers.find((rowRenderer) => rowRenderer.isInstance(ecs)) ?? null;
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts
index 8e95fc3ad238a..f4498b10e4c8d 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts
@@ -9,7 +9,6 @@ import { ColumnRenderer } from './column_renderer';
import { emptyColumnRenderer } from './empty_column_renderer';
import { netflowRowRenderer } from './netflow/netflow_row_renderer';
import { plainColumnRenderer } from './plain_column_renderer';
-import { plainRowRenderer } from './plain_row_renderer';
import { RowRenderer } from './row_renderer';
import { suricataRowRenderer } from './suricata/suricata_row_renderer';
import { unknownColumnRenderer } from './unknown_column_renderer';
@@ -29,7 +28,6 @@ export const rowRenderers: RowRenderer[] = [
suricataRowRenderer,
zeekRowRenderer,
netflowRowRenderer,
- plainRowRenderer, // falls-back to the plain row renderer
];
export const columnRenderers: ColumnRenderer[] = [
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.tsx
index 45c190c42605c..a0d2ca57f90b3 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.tsx
@@ -23,7 +23,7 @@ import { EventDetailsWidthProvider } from '../../../../common/components/events_
import { SourcererScopeName } from '../../../../common/store/sourcerer/model';
import { timelineDefaults } from '../../../store/timeline/defaults';
import { useSourcererScope } from '../../../../common/containers/sourcerer';
-import { TimelineModel } from '../../../store/timeline/model';
+import { TimelineModel, TimelineTabs } from '../../../store/timeline/model';
import { EventDetails } from '../event_details';
import { ToggleExpandedEvent } from '../../../store/timeline/actions';
import { State } from '../../../../common/store';
@@ -183,6 +183,7 @@ export const PinnedTabContentComponent: React.FC = ({
id={timelineId}
refetch={refetch}
sort={sort}
+ tabType={TimelineTabs.pinned}
totalPages={calculateTotalPages({
itemsCount: totalCount,
itemsPerPage,
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx
index f6d6654d7fece..c0840d58174b3 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx
@@ -330,6 +330,7 @@ export const QueryTabContentComponent: React.FC = ({
id={timelineId}
refetch={refetch}
sort={sort}
+ tabType={TimelineTabs.query}
totalPages={calculateTotalPages({
itemsCount: totalCount,
itemsPerPage,
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx
index 7f0809cf9b9d8..c97571fbbd6f3 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx
@@ -199,7 +199,7 @@ const TabsContentComponent: React.FC = ({ timelineId, graphEve
disabled={!graphEventId}
key={TimelineTabs.graph}
>
- {i18n.GRAPH_TAB}
+ {i18n.ANALYZER_TAB}
{
- const policyConfig = policy.inputs[0].config?.policy.value;
+ const updatePolicy: UpdatePackagePolicy = {
+ name: policy.name,
+ description: policy.description,
+ namespace: policy.namespace,
+ enabled: policy.enabled,
+ policy_id: policy.policy_id,
+ output_id: policy.output_id,
+ package: policy.package,
+ inputs: policy.inputs,
+ version: policy.version,
+ };
+ const policyConfig = updatePolicy.inputs[0].config?.policy.value;
if (!isEndpointPolicyValidForLicense(policyConfig, license)) {
- policy.inputs[0].config!.policy.value = unsetPolicyFeaturesAboveLicenseLevel(
+ updatePolicy.inputs[0].config!.policy.value = unsetPolicyFeaturesAboveLicenseLevel(
policyConfig,
license
);
try {
- await this.policyService.update(this.soClient, policy.id, policy);
+ await this.policyService.update(this.soClient, policy.id, updatePolicy);
} catch (e) {
// try again for transient issues
try {
- await this.policyService.update(this.soClient, policy.id, policy);
+ await this.policyService.update(this.soClient, policy.id, updatePolicy);
} catch (ee) {
this.logger.warn(
`Unable to remove platinum features from policy ${policy.id}: ${ee.message}`
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/utils.test.ts
index 36131c2e2844d..32c1d8d3cdf56 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/utils.test.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/utils.test.ts
@@ -35,7 +35,7 @@ let alertsClient: ReturnType;
describe('utils', () => {
describe('transformError', () => {
test('returns transformed output error from boom object with a 500 and payload of internal server error', () => {
- const boom = new Boom('some boom message');
+ const boom = new Boom.Boom('some boom message');
const transformed = transformError(boom);
expect(transformed).toEqual({
message: 'An internal server error occurred',
@@ -124,7 +124,7 @@ describe('utils', () => {
describe('transformBulkError', () => {
test('returns transformed object if it is a boom object', () => {
- const boom = new Boom('some boom message', { statusCode: 400 });
+ const boom = new Boom.Boom('some boom message', { statusCode: 400 });
const transformed = transformBulkError('rule-1', boom);
const expected: BulkError = {
rule_id: 'rule-1',
@@ -252,7 +252,7 @@ describe('utils', () => {
describe('transformImportError', () => {
test('returns transformed object if it is a boom object', () => {
- const boom = new Boom('some boom message', { statusCode: 400 });
+ const boom = new Boom.Boom('some boom message', { statusCode: 400 });
const transformed = transformImportError('rule-1', boom, {
success_count: 1,
success: false,
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.test.ts
index 6a75d0655cf59..022c07defc9c1 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.test.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.test.ts
@@ -4,329 +4,77 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { sampleDocNoSortIdNoVersion } from './__mocks__/es_results';
-import { getThresholdSignalQueryFields } from './bulk_create_threshold_signals';
+import { loggingSystemMock } from '../../../../../../../src/core/server/mocks';
+import { sampleDocNoSortId, sampleDocSearchResultsNoSortId } from './__mocks__/es_results';
+import { transformThresholdResultsToEcs } from './bulk_create_threshold_signals';
+import { calculateThresholdSignalUuid } from './utils';
-describe('getThresholdSignalQueryFields', () => {
- it('should return proper fields for match_phrase filters', () => {
- const mockHit = {
- ...sampleDocNoSortIdNoVersion(),
- _source: {
- '@timestamp': '2020-11-03T02:31:47.431Z',
- event: {
- dataset: 'traefik.access',
- module: 'traefik',
- },
- traefik: {
- access: {
- entryPointName: 'web-secure',
- },
- },
- url: {
- domain: 'kibana.siem.estc.dev',
- },
- },
- };
- const mockFilters = {
- bool: {
- must: [],
- filter: [
- {
- bool: {
- filter: [
- {
- bool: {
- should: [
- {
- match_phrase: {
- 'event.module': 'traefik',
- },
- },
- ],
- minimum_should_match: 1,
- },
- },
- {
- bool: {
- filter: [
- {
- bool: {
- should: [
- {
- match_phrase: {
- 'event.dataset': 'traefik.access',
- },
- },
- ],
- minimum_should_match: 1,
- },
- },
- {
- bool: {
- should: [
- {
- match_phrase: {
- 'traefik.access.entryPointName': 'web-secure',
- },
- },
- ],
- minimum_should_match: 1,
- },
- },
- ],
- },
- },
- ],
- },
- },
- {
- match_phrase: {
- 'url.domain': 'kibana.siem.estc.dev',
- },
- },
- ],
- should: [],
- must_not: [],
- },
- };
-
- expect(getThresholdSignalQueryFields(mockHit, mockFilters)).toEqual({
- 'event.dataset': 'traefik.access',
- 'event.module': 'traefik',
- 'traefik.access.entryPointName': 'web-secure',
- 'url.domain': 'kibana.siem.estc.dev',
- });
- });
-
- it('should return proper fields object for nested match filters', () => {
- const mockHit = {
- ...sampleDocNoSortIdNoVersion(),
- _source: {
- '@timestamp': '2020-11-03T02:31:47.431Z',
- event: {
- dataset: 'traefik.access',
- module: 'traefik',
- },
- url: {
- domain: 'kibana.siem.estc.dev',
- },
- },
- };
- const filters = {
- bool: {
- must: [],
- filter: [
- {
- bool: {
- filter: [
- {
- bool: {
- should: [
- {
- match_phrase: {
- 'event.module': 'traefik',
- },
- },
- ],
- minimum_should_match: 1,
- },
- },
- {
- bool: {
- should: [
- {
- match: {
- 'event.dataset': 'traefik.*',
- },
- },
- ],
- minimum_should_match: 1,
- },
- },
- ],
- },
- },
- ],
- should: [],
- must_not: [],
- },
- };
-
- expect(getThresholdSignalQueryFields(mockHit, filters)).toEqual({
- 'event.dataset': 'traefik.access',
- 'event.module': 'traefik',
- });
- });
-
- it('should return proper object for simple match filters', () => {
- const mockHit = {
- ...sampleDocNoSortIdNoVersion(),
- _source: {
- '@timestamp': '2020-11-03T02:31:47.431Z',
- event: {
- dataset: 'traefik.access',
- module: 'traefik',
- },
- },
- };
- const filters = {
- bool: {
- must: [],
- filter: [
- {
- bool: {
- should: [
- {
- match: {
- 'event.module': 'traefik',
- },
- },
- ],
- minimum_should_match: 1,
- },
- },
- {
- match_phrase: {
- 'event.dataset': 'traefik.access',
- },
- },
- ],
- should: [],
- must_not: [],
- },
- };
-
- expect(getThresholdSignalQueryFields(mockHit, filters)).toEqual({
- 'event.dataset': 'traefik.access',
- 'event.module': 'traefik',
- });
- });
-
- it('should return proper object for simple match_phrase filters', () => {
- const mockHit = {
- ...sampleDocNoSortIdNoVersion(),
- _source: {
- '@timestamp': '2020-11-03T02:31:47.431Z',
- event: {
- dataset: 'traefik.access',
- module: 'traefik',
- },
- },
+describe('transformThresholdResultsToEcs', () => {
+ it('should return transformed threshold results', () => {
+ const threshold = {
+ field: 'source.ip',
+ value: 1,
};
- const filters = {
- bool: {
- must: [],
- filter: [
- {
- bool: {
- should: [
- {
- match_phrase: {
- 'event.module': 'traefik',
+ const startedAt = new Date('2020-12-17T16:27:00Z');
+ const transformedResults = transformThresholdResultsToEcs(
+ {
+ ...sampleDocSearchResultsNoSortId('abcd'),
+ aggregations: {
+ threshold: {
+ buckets: [
+ {
+ key: '127.0.0.1',
+ doc_count: 1,
+ top_threshold_hits: {
+ hits: {
+ hits: [sampleDocNoSortId('abcd')],
},
},
- ],
- minimum_should_match: 1,
- },
- },
- {
- match_phrase: {
- 'event.dataset': 'traefik.access',
- },
+ },
+ ],
},
- ],
- should: [],
- must_not: [],
- },
- };
-
- expect(getThresholdSignalQueryFields(mockHit, filters)).toEqual({
- 'event.module': 'traefik',
- 'event.dataset': 'traefik.access',
- });
- });
-
- it('should return proper object for exists filters', () => {
- const mockHit = {
- ...sampleDocNoSortIdNoVersion(),
- _source: {
- '@timestamp': '2020-11-03T02:31:47.431Z',
- event: {
- module: 'traefik',
},
},
- };
- const filters = {
- bool: {
- should: [
- {
- bool: {
- should: [
- {
- exists: {
- field: 'process.name',
- },
- },
- ],
- minimum_should_match: 1,
- },
- },
- {
- bool: {
- should: [
- {
- exists: {
- field: 'event.type',
- },
- },
- ],
- minimum_should_match: 1,
- },
- },
- ],
- minimum_should_match: 1,
+ 'test',
+ startedAt,
+ undefined,
+ loggingSystemMock.createLogger(),
+ threshold,
+ '1234',
+ undefined
+ );
+ const _id = calculateThresholdSignalUuid('1234', startedAt, 'source.ip', '127.0.0.1');
+ expect(transformedResults).toEqual({
+ took: 10,
+ timed_out: false,
+ _shards: {
+ total: 10,
+ successful: 10,
+ failed: 0,
+ skipped: 0,
},
- };
- expect(getThresholdSignalQueryFields(mockHit, filters)).toEqual({});
- });
-
- it('should NOT add invalid characters from CIDR such as the "/" proper object for simple match_phrase filters', () => {
- const mockHit = {
- ...sampleDocNoSortIdNoVersion(),
- _source: {
- '@timestamp': '2020-11-03T02:31:47.431Z',
- destination: {
- ip: '192.168.0.16',
- },
- event: {
- module: 'traefik',
+ results: {
+ hits: {
+ total: 1,
},
},
- };
- const filters = {
- bool: {
- must: [],
- filter: [
+ hits: {
+ total: 100,
+ max_score: 100,
+ hits: [
{
- bool: {
- should: [
- {
- match: {
- 'destination.ip': '192.168.0.0/16',
- },
- },
- ],
- minimum_should_match: 1,
+ _id,
+ _index: 'test',
+ _source: {
+ '@timestamp': '2020-04-20T21:27:45+0000',
+ threshold_result: {
+ count: 1,
+ value: '127.0.0.1',
+ },
},
},
],
- should: [],
- must_not: [],
},
- };
-
- expect(getThresholdSignalQueryFields(mockHit, filters)).toEqual({
- 'destination.ip': '192.168.0.16',
});
});
});
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.ts
index a98aae4ec8107..3cad33b278749 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.ts
@@ -4,8 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import uuidv5 from 'uuid/v5';
-import { reduce, get, isEmpty } from 'lodash/fp';
+import { get, isEmpty } from 'lodash/fp';
import set from 'set-value';
import {
@@ -17,12 +16,10 @@ import { AlertServices } from '../../../../../alerts/server';
import { RuleAlertAction } from '../../../../common/detection_engine/types';
import { RuleTypeParams, RefreshTypes } from '../types';
import { singleBulkCreate, SingleBulkCreateResponse } from './single_bulk_create';
-import { SignalSearchResponse, SignalSourceHit, ThresholdAggregationBucket } from './types';
+import { SignalSearchResponse, ThresholdAggregationBucket } from './types';
+import { calculateThresholdSignalUuid } from './utils';
import { BuildRuleMessage } from './rule_messages';
-// used to generate constant Threshold Signals ID when run with the same params
-const NAMESPACE_ID = '0684ec03-7201-4ee0-8ee0-3a3f6b2479b2';
-
interface BulkCreateThresholdSignalsParams {
actions: RuleAlertAction[];
someResult: SignalSearchResponse;
@@ -48,81 +45,6 @@ interface BulkCreateThresholdSignalsParams {
buildRuleMessage: BuildRuleMessage;
}
-interface FilterObject {
- bool?: {
- filter?: FilterObject | FilterObject[];
- should?: Array>>;
- };
-}
-
-const injectFirstMatch = (
- hit: SignalSourceHit,
- match: object | Record
-): Record | undefined => {
- if (match != null) {
- for (const key of Object.keys(match)) {
- return { [key]: get(key, hit._source) } as Record;
- }
- }
-};
-
-const getNestedQueryFilters = (
- hit: SignalSourceHit,
- filtersObj: FilterObject
-): Record => {
- if (Array.isArray(filtersObj.bool?.filter)) {
- return reduce(
- (acc, filterItem) => {
- const nestedFilter = getNestedQueryFilters(hit, filterItem);
-
- if (nestedFilter) {
- return { ...acc, ...nestedFilter };
- }
-
- return acc;
- },
- {},
- filtersObj.bool?.filter
- );
- } else {
- return (
- (filtersObj.bool?.should &&
- filtersObj.bool?.should[0] &&
- (injectFirstMatch(hit, filtersObj.bool.should[0].match) ||
- injectFirstMatch(hit, filtersObj.bool.should[0].match_phrase))) ??
- {}
- );
- }
-};
-
-export const getThresholdSignalQueryFields = (hit: SignalSourceHit, filter: unknown) => {
- const filters = get('bool.filter', filter);
-
- return reduce(
- (acc, item) => {
- if (item.match_phrase) {
- return { ...acc, ...injectFirstMatch(hit, item.match_phrase) };
- }
-
- if (item.bool?.should && (item.bool.should[0].match || item.bool.should[0].match_phrase)) {
- return {
- ...acc,
- ...(injectFirstMatch(hit, item.bool.should[0].match) ||
- injectFirstMatch(hit, item.bool.should[0].match_phrase)),
- };
- }
-
- if (item.bool?.filter) {
- return { ...acc, ...getNestedQueryFilters(hit, item) };
- }
-
- return acc;
- },
- {},
- filters
- );
-};
-
const getTransformedHits = (
results: SignalSearchResponse,
inputIndex: string,
@@ -153,13 +75,12 @@ const getTransformedHits = (
count: totalResults,
value: ruleId,
},
- ...getThresholdSignalQueryFields(hit, filter),
};
return [
{
_index: inputIndex,
- _id: uuidv5(`${ruleId}${startedAt}${threshold.field}`, NAMESPACE_ID),
+ _id: calculateThresholdSignalUuid(ruleId, startedAt, threshold.field),
_source: source,
},
];
@@ -183,14 +104,11 @@ const getTransformedHits = (
count: docCount,
value: get(threshold.field, hit._source),
},
- ...getThresholdSignalQueryFields(hit, filter),
};
- set(source, threshold.field, key);
-
return {
_index: inputIndex,
- _id: uuidv5(`${ruleId}${startedAt}${threshold.field}${key}`, NAMESPACE_ID),
+ _id: calculateThresholdSignalUuid(ruleId, startedAt, threshold.field, key),
_source: source,
};
}
@@ -226,6 +144,8 @@ export const transformThresholdResultsToEcs = (
},
};
+ delete thresholdResults.aggregations; // no longer needed
+
set(thresholdResults, 'results.hits.total', transformedHits.length);
return thresholdResults;
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts
index 7fd99a17598ae..3928228357d4c 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts
@@ -8,7 +8,6 @@
import { Logger, KibanaRequest } from 'src/core/server';
-import { Filter } from 'src/plugins/data/common';
import {
SIGNALS_ID,
DEFAULT_SEARCH_AFTER_PAGE_SIZE,
@@ -29,7 +28,6 @@ import {
SignalRuleAlertTypeDefinition,
RuleAlertAttributes,
EqlSignalSearchResponse,
- ThresholdQueryBucket,
WrappedSignalHit,
} from './types';
import {
@@ -48,9 +46,9 @@ import { signalParamsSchema } from './signal_params_schema';
import { siemRuleActionGroups } from './siem_rule_action_groups';
import { findMlSignals } from './find_ml_signals';
import { findThresholdSignals } from './find_threshold_signals';
-import { findPreviousThresholdSignals } from './find_previous_threshold_signals';
import { bulkCreateMlSignals } from './bulk_create_ml_signals';
import { bulkCreateThresholdSignals } from './bulk_create_threshold_signals';
+import { getThresholdBucketFilters } from './threshold_get_bucket_filters';
import {
scheduleNotificationActions,
NotificationRuleTypeParams,
@@ -307,21 +305,11 @@ export const signalRulesAlertType = ({
]);
} else if (isThresholdRule(type) && threshold) {
const inputIndex = await getInputIndex(services, version, index);
- const esFilter = await getFilter({
- type,
- filters,
- language,
- query,
- savedId,
- services,
- index: inputIndex,
- lists: exceptionItems ?? [],
- });
const {
- searchResult: previousSignals,
+ filters: bucketFilters,
searchErrors: previousSearchErrors,
- } = await findPreviousThresholdSignals({
+ } = await getThresholdBucketFilters({
indexPattern: [outputIndex],
from,
to,
@@ -333,29 +321,15 @@ export const signalRulesAlertType = ({
buildRuleMessage,
});
- previousSignals.aggregations.threshold.buckets.forEach((bucket: ThresholdQueryBucket) => {
- esFilter.bool.filter.push(({
- bool: {
- must_not: {
- bool: {
- must: [
- {
- term: {
- [threshold.field || 'signal.rule.rule_id']: bucket.key,
- },
- },
- {
- range: {
- [timestampOverride ?? '@timestamp']: {
- lte: bucket.lastSignalTimestamp.value_as_string,
- },
- },
- },
- ],
- },
- },
- },
- } as unknown) as Filter);
+ const esFilter = await getFilter({
+ type,
+ filters: filters ? filters.concat(bucketFilters) : bucketFilters,
+ language,
+ query,
+ savedId,
+ services,
+ index: inputIndex,
+ lists: exceptionItems ?? [],
});
const { searchResult: thresholdResults, searchErrors } = await findThresholdSignals({
@@ -400,6 +374,7 @@ export const signalRulesAlertType = ({
tags,
buildRuleMessage,
});
+
result = mergeReturns([
result,
createSearchAfterReturnTypeFromResponse({
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/find_previous_threshold_signals.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/threshold_find_previous_signals.ts
similarity index 100%
rename from x-pack/plugins/security_solution/server/lib/detection_engine/signals/find_previous_threshold_signals.ts
rename to x-pack/plugins/security_solution/server/lib/detection_engine/signals/threshold_find_previous_signals.ts
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/threshold_get_bucket_filters.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/threshold_get_bucket_filters.ts
new file mode 100644
index 0000000000000..bf060da1e76b8
--- /dev/null
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/threshold_get_bucket_filters.ts
@@ -0,0 +1,96 @@
+/*
+ * 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 { isEmpty } from 'lodash';
+
+import { Filter } from 'src/plugins/data/common';
+import { ESFilter } from '../../../../../../typings/elasticsearch';
+
+import { TimestampOverrideOrUndefined } from '../../../../common/detection_engine/schemas/common/schemas';
+import { AlertServices } from '../../../../../alerts/server';
+import { Logger } from '../../../../../../../src/core/server';
+import { ThresholdQueryBucket } from './types';
+import { BuildRuleMessage } from './rule_messages';
+import { findPreviousThresholdSignals } from './threshold_find_previous_signals';
+
+interface GetThresholdBucketFiltersParams {
+ from: string;
+ to: string;
+ indexPattern: string[];
+ services: AlertServices;
+ logger: Logger;
+ ruleId: string;
+ bucketByField: string;
+ timestampOverride: TimestampOverrideOrUndefined;
+ buildRuleMessage: BuildRuleMessage;
+}
+
+export const getThresholdBucketFilters = async ({
+ from,
+ to,
+ indexPattern,
+ services,
+ logger,
+ ruleId,
+ bucketByField,
+ timestampOverride,
+ buildRuleMessage,
+}: GetThresholdBucketFiltersParams): Promise<{
+ filters: Filter[];
+ searchErrors: string[];
+}> => {
+ const { searchResult, searchErrors } = await findPreviousThresholdSignals({
+ indexPattern,
+ from,
+ to,
+ services,
+ logger,
+ ruleId,
+ bucketByField,
+ timestampOverride,
+ buildRuleMessage,
+ });
+
+ const filters = searchResult.aggregations.threshold.buckets.reduce(
+ (acc: ESFilter[], bucket: ThresholdQueryBucket): ESFilter[] => {
+ const filter = {
+ bool: {
+ filter: [
+ {
+ range: {
+ [timestampOverride ?? '@timestamp']: {
+ lte: bucket.lastSignalTimestamp.value_as_string,
+ },
+ },
+ },
+ ],
+ },
+ } as ESFilter;
+
+ if (!isEmpty(bucketByField)) {
+ (filter.bool.filter as ESFilter[]).push({
+ term: {
+ [bucketByField]: bucket.key,
+ },
+ });
+ }
+
+ return [...acc, filter];
+ },
+ [] as ESFilter[]
+ );
+
+ return {
+ filters: [
+ ({
+ bool: {
+ must_not: filters,
+ },
+ } as unknown) as Filter,
+ ],
+ searchErrors,
+ };
+};
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts
index dd936776f691a..073e30bbc6e26 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts
@@ -36,6 +36,7 @@ import {
mergeReturns,
createTotalHitsFromSearchResult,
lastValidDate,
+ calculateThresholdSignalUuid,
} from './utils';
import { BulkResponseErrorAggregation, SearchAfterAndBulkCreateReturnType } from './types';
import {
@@ -1303,4 +1304,18 @@ describe('utils', () => {
expect(result).toEqual(4);
});
});
+
+ describe('calculateThresholdSignalUuid', () => {
+ it('should generate a uuid without key', () => {
+ const startedAt = new Date('2020-12-17T16:27:00Z');
+ const signalUuid = calculateThresholdSignalUuid('abcd', startedAt, 'agent.name');
+ expect(signalUuid).toEqual('c0cbe4b7-48de-5734-ae81-d8de3e79839d');
+ });
+
+ it('should generate a uuid with key', () => {
+ const startedAt = new Date('2019-11-18T13:32:00Z');
+ const signalUuid = calculateThresholdSignalUuid('abcd', startedAt, 'host.ip', '1.2.3.4');
+ expect(signalUuid).toEqual('f568509e-b570-5d3c-a7ed-7c73fd29ddaf');
+ });
+ });
});
diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts
index 2114f21d9cead..18f6e8d127b1b 100644
--- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts
+++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts
@@ -5,6 +5,7 @@
*/
import { createHash } from 'crypto';
import moment from 'moment';
+import uuidv5 from 'uuid/v5';
import dateMath from '@elastic/datemath';
import { TimestampOverrideOrUndefined } from '../../../../common/detection_engine/schemas/common/schemas';
@@ -661,3 +662,20 @@ export const createTotalHitsFromSearchResult = ({
: searchResult.hits.total.value;
return totalHits;
};
+
+export const calculateThresholdSignalUuid = (
+ ruleId: string,
+ startedAt: Date,
+ thresholdField: string,
+ key?: string
+): string => {
+ // used to generate constant Threshold Signals ID when run with the same params
+ const NAMESPACE_ID = '0684ec03-7201-4ee0-8ee0-3a3f6b2479b2';
+
+ let baseString = `${ruleId}${startedAt}${thresholdField}`;
+ if (key != null) {
+ baseString = `${baseString}${key}`;
+ }
+
+ return uuidv5(baseString, NAMESPACE_ID);
+};
diff --git a/x-pack/plugins/spaces/server/lib/copy_to_spaces/lib/create_empty_failure_response.ts b/x-pack/plugins/spaces/server/lib/copy_to_spaces/lib/create_empty_failure_response.ts
index 764ae5a87ec0e..3980eef7caac2 100644
--- a/x-pack/plugins/spaces/server/lib/copy_to_spaces/lib/create_empty_failure_response.ts
+++ b/x-pack/plugins/spaces/server/lib/copy_to_spaces/lib/create_empty_failure_response.ts
@@ -6,10 +6,10 @@
import Boom, { Payload } from '@hapi/boom';
import { SavedObjectsImportError } from 'src/core/server';
-export const createEmptyFailureResponse = (errors?: Array) => {
+export const createEmptyFailureResponse = (errors?: Array) => {
const errorMessages: Array = (errors || []).map((error) => {
if (Boom.isBoom(error as any)) {
- return (error as Boom).output.payload as Payload;
+ return (error as Boom.Boom).output.payload as Payload;
}
return error as SavedObjectsImportError;
});
diff --git a/x-pack/plugins/spaces/server/lib/errors.ts b/x-pack/plugins/spaces/server/lib/errors.ts
index 13a5c2440877a..0f6bf0f1d56b4 100644
--- a/x-pack/plugins/spaces/server/lib/errors.ts
+++ b/x-pack/plugins/spaces/server/lib/errors.ts
@@ -11,7 +11,7 @@ export function wrapError(error: any): CustomHttpResponseOptions
const boom = isBoom(error) ? error : boomify(error);
return {
body: boom,
- headers: boom.output.headers,
+ headers: boom.output.headers as { [key: string]: string },
statusCode: boom.output.statusCode,
};
}
diff --git a/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/index.ts b/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/index.ts
index 59effdbf8f512..ba490b91fae10 100644
--- a/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/index.ts
+++ b/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/index.ts
@@ -12,9 +12,6 @@ import { AlertTypeModel } from '../../../../triggers_actions_ui/public';
export function getAlertType(): AlertTypeModel {
return {
id: '.geo-containment',
- name: i18n.translate('xpack.stackAlerts.geoContainment.name.trackingContainment', {
- defaultMessage: 'Tracking containment',
- }),
description: i18n.translate('xpack.stackAlerts.geoContainment.descriptionText', {
defaultMessage: 'Alert when an entity is contained within a geo boundary.',
}),
diff --git a/x-pack/plugins/stack_alerts/public/alert_types/geo_threshold/index.ts b/x-pack/plugins/stack_alerts/public/alert_types/geo_threshold/index.ts
index cc8d78b53137e..8ba632633a3af 100644
--- a/x-pack/plugins/stack_alerts/public/alert_types/geo_threshold/index.ts
+++ b/x-pack/plugins/stack_alerts/public/alert_types/geo_threshold/index.ts
@@ -12,9 +12,6 @@ import { AlertTypeModel } from '../../../../triggers_actions_ui/public';
export function getAlertType(): AlertTypeModel {
return {
id: '.geo-threshold',
- name: i18n.translate('xpack.stackAlerts.geoThreshold.name.trackingThreshold', {
- defaultMessage: 'Tracking threshold',
- }),
description: i18n.translate('xpack.stackAlerts.geoThreshold.descriptionText', {
defaultMessage: 'Alert when an entity enters or leaves a geo boundary.',
}),
diff --git a/x-pack/plugins/stack_alerts/public/alert_types/threshold/index.ts b/x-pack/plugins/stack_alerts/public/alert_types/threshold/index.ts
index f09d1630cd675..184277bae3da8 100644
--- a/x-pack/plugins/stack_alerts/public/alert_types/threshold/index.ts
+++ b/x-pack/plugins/stack_alerts/public/alert_types/threshold/index.ts
@@ -12,9 +12,6 @@ import { AlertTypeModel } from '../../../../triggers_actions_ui/public';
export function getAlertType(): AlertTypeModel {
return {
id: '.index-threshold',
- name: i18n.translate('xpack.stackAlerts.threshold.ui.alertType.nameText', {
- defaultMessage: 'Index threshold',
- }),
description: i18n.translate('xpack.stackAlerts.threshold.ui.alertType.descriptionText', {
defaultMessage: 'Alert when an aggregated query meets the threshold.',
}),
diff --git a/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/alert_type.ts b/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/alert_type.ts
index 164ce993eebac..51d7361bfe762 100644
--- a/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/alert_type.ts
+++ b/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/alert_type.ts
@@ -114,7 +114,7 @@ export interface GeoContainmentParams {
export function getAlertType(logger: Logger): AlertType {
const alertTypeName = i18n.translate('xpack.stackAlerts.geoContainment.alertTypeTitle', {
- defaultMessage: 'Geo tracking containment',
+ defaultMessage: 'Tracking containment',
});
const actionGroupName = i18n.translate(
diff --git a/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/tests/alert_type.test.ts b/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/tests/alert_type.test.ts
index f3dc3855eb91b..0592c944de570 100644
--- a/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/tests/alert_type.test.ts
+++ b/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/tests/alert_type.test.ts
@@ -14,7 +14,7 @@ describe('alertType', () => {
it('alert type creation structure is the expected value', async () => {
expect(alertType.id).toBe('.geo-containment');
- expect(alertType.name).toBe('Geo tracking containment');
+ expect(alertType.name).toBe('Tracking containment');
expect(alertType.actionGroups).toEqual([
{ id: 'Tracked entity contained', name: 'Tracking containment met' },
]);
diff --git a/x-pack/plugins/stack_alerts/server/alert_types/geo_threshold/alert_type.ts b/x-pack/plugins/stack_alerts/server/alert_types/geo_threshold/alert_type.ts
index 93a6c0d29cf3c..bf5e2fe2289db 100644
--- a/x-pack/plugins/stack_alerts/server/alert_types/geo_threshold/alert_type.ts
+++ b/x-pack/plugins/stack_alerts/server/alert_types/geo_threshold/alert_type.ts
@@ -174,7 +174,7 @@ export interface GeoThresholdParams {
export function getAlertType(logger: Logger): AlertType {
const alertTypeName = i18n.translate('xpack.stackAlerts.geoThreshold.alertTypeTitle', {
- defaultMessage: 'Geo tracking threshold',
+ defaultMessage: 'Tracking threshold',
});
const actionGroupName = i18n.translate(
diff --git a/x-pack/plugins/stack_alerts/server/alert_types/geo_threshold/tests/alert_type.test.ts b/x-pack/plugins/stack_alerts/server/alert_types/geo_threshold/tests/alert_type.test.ts
index 49b56b5571b44..0cfce2d47f189 100644
--- a/x-pack/plugins/stack_alerts/server/alert_types/geo_threshold/tests/alert_type.test.ts
+++ b/x-pack/plugins/stack_alerts/server/alert_types/geo_threshold/tests/alert_type.test.ts
@@ -14,7 +14,7 @@ describe('alertType', () => {
it('alert type creation structure is the expected value', async () => {
expect(alertType.id).toBe('.geo-threshold');
- expect(alertType.name).toBe('Geo tracking threshold');
+ expect(alertType.name).toBe('Tracking threshold');
expect(alertType.actionGroups).toEqual([
{ id: 'tracking threshold met', name: 'Tracking threshold met' },
]);
diff --git a/x-pack/plugins/stack_alerts/server/plugin.test.ts b/x-pack/plugins/stack_alerts/server/plugin.test.ts
index 3037504ed3e39..0f747e9c24eec 100644
--- a/x-pack/plugins/stack_alerts/server/plugin.test.ts
+++ b/x-pack/plugins/stack_alerts/server/plugin.test.ts
@@ -63,7 +63,7 @@ describe('AlertingBuiltins Plugin', () => {
},
],
"id": ".geo-threshold",
- "name": "Geo tracking threshold",
+ "name": "Tracking threshold",
}
`);
diff --git a/x-pack/plugins/transform/server/routes/api/error_utils.ts b/x-pack/plugins/transform/server/routes/api/error_utils.ts
index 4986eb718dc2c..356158913eb92 100644
--- a/x-pack/plugins/transform/server/routes/api/error_utils.ts
+++ b/x-pack/plugins/transform/server/routes/api/error_utils.ts
@@ -79,7 +79,7 @@ export function wrapError(error: any): CustomHttpResponseOptions
const boom = Boom.isBoom(error) ? error : Boom.boomify(error, { statusCode: error.statusCode });
return {
body: boom,
- headers: boom.output.headers,
+ headers: boom.output.headers as { [key: string]: string },
statusCode: boom.output.statusCode,
};
}
@@ -130,7 +130,6 @@ export function wrapEsError(err: any, statusCodeToMessageMap: Record = ({ size }) => (
+
+
+
+
+
+);
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx
index 0f20ade8187fd..66f7c1d36dfb2 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx
@@ -9,7 +9,7 @@ import { Option, none, some, fold } from 'fp-ts/lib/Option';
import { pipe } from 'fp-ts/lib/pipeable';
import { FormattedMessage } from '@kbn/i18n/react';
-import { EuiLink, EuiLoadingSpinner } from '@elastic/eui';
+import { EuiLink, EuiSpacer } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { EuiEmptyPrompt, EuiCode } from '@elastic/eui';
@@ -19,6 +19,7 @@ import { health } from '../lib/alert_api';
import './health_check.scss';
import { useHealthContext } from '../context/health_context';
import { useKibana } from '../../common/lib/kibana';
+import { CenterJustifiedSpinner } from './center_justified_spinner';
interface Props {
inFlyout?: boolean;
@@ -47,7 +48,15 @@ export const HealthCheck: React.FunctionComponent = ({
return pipe(
alertingHealth,
fold(
- () => (waitForCheck ? : {children}),
+ () =>
+ waitForCheck ? (
+
+
+
+
+ ) : (
+ {children}
+ ),
(healthCheck) => {
return healthCheck?.isSufficientlySecure && healthCheck?.hasPermanentEncryptionKey ? (
{children}
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.test.ts
index e364661361814..0cd5118c5e316 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.test.ts
+++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/alert_type_compare.test.ts
@@ -30,7 +30,6 @@ test('should sort groups by containing enabled alert types first and then by nam
alertTypeItem: {
id: 'my-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: () => {
@@ -52,7 +51,6 @@ test('should sort groups by containing enabled alert types first and then by nam
alertTypeItem: {
id: 'my-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: () => {
@@ -69,7 +67,6 @@ test('should sort groups by containing enabled alert types first and then by nam
alertTypeItem: {
id: 'disabled-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: () => {
@@ -91,7 +88,6 @@ test('should sort groups by containing enabled alert types first and then by nam
alertTypeItem: {
id: 'my-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: () => {
@@ -130,7 +126,6 @@ test('should sort alert types by enabled first and then by name', async () => {
alertTypeItem: {
id: 'my-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: () => {
@@ -147,7 +142,6 @@ test('should sort alert types by enabled first and then by name', async () => {
alertTypeItem: {
id: 'my-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: () => {
@@ -164,7 +158,6 @@ test('should sort alert types by enabled first and then by name', async () => {
alertTypeItem: {
id: 'disabled-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: () => {
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/suspended_component_with_props.tsx b/x-pack/plugins/triggers_actions_ui/public/application/lib/suspended_component_with_props.tsx
index 563353793f991..98c20c5abcc2d 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/lib/suspended_component_with_props.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/suspended_component_with_props.tsx
@@ -4,23 +4,15 @@
* you may not use this file except in compliance with the Elastic License.
*/
import React, { Suspense } from 'react';
-import { EuiLoadingSpinner, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import { EuiLoadingSpinnerSize } from '@elastic/eui/src/components/loading/loading_spinner';
+import { CenterJustifiedSpinner } from '../components/center_justified_spinner';
export function suspendedComponentWithProps(
ComponentToSuspend: React.ComponentType,
size?: EuiLoadingSpinnerSize
) {
return (props: T) => (
-
-
-
-
-
- }
- >
+ }>
);
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx
index 7d8949421126c..a83194d67a759 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx
@@ -12,9 +12,6 @@ import {
EuiSpacer,
EuiFieldText,
EuiFormRow,
- EuiLoadingSpinner,
- EuiFlexGroup,
- EuiFlexItem,
EuiErrorBoundary,
EuiTitle,
} from '@elastic/eui';
@@ -29,6 +26,7 @@ import {
} from '../../../types';
import { hasSaveActionsCapability } from '../../lib/capabilities';
import { useKibana } from '../../../common/lib/kibana';
+import { SectionLoading } from '../../components/section_loading';
export function validateBaseProperties(actionObject: ActionConnector) {
const validationResult = { errors: {} };
@@ -181,11 +179,12 @@ export const ActionConnectorForm = ({
-
-
-
-
+
+
+
}
>
{ParamsFieldsComponent ? (
-
-
-
-
-
- }
- >
+
void;
@@ -31,6 +33,7 @@ export const ActionTypeMenu = ({
http,
notifications: { toasts },
} = useKibana().services;
+ const [loadingActionTypes, setLoadingActionTypes] = useState(false);
const [actionTypesIndex, setActionTypesIndex] = useState(undefined);
useEffect(() => {
@@ -43,11 +46,14 @@ export const ActionTypeMenu = ({
*
* TODO: Remove when cases connector is available across Kibana. Issue: https://github.com/elastic/kibana/issues/82502.
* */
- const availableActionTypes =
- actionTypes ??
- (await loadActionTypes({ http })).filter(
+ let availableActionTypes = actionTypes;
+ if (!availableActionTypes) {
+ setLoadingActionTypes(true);
+ availableActionTypes = (await loadActionTypes({ http })).filter(
(actionType) => !DEFAULT_HIDDEN_ACTION_TYPES.includes(actionType.id)
);
+ setLoadingActionTypes(false);
+ }
const index: ActionTypeIndex = {};
for (const actionTypeItem of availableActionTypes) {
index[actionTypeItem.id] = actionTypeItem;
@@ -117,7 +123,14 @@ export const ActionTypeMenu = ({
);
});
- return (
+ return loadingActionTypes ? (
+
+
+
+ ) : (
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx
index 2df75436f5f96..bf6786d0d4e4c 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx
@@ -10,7 +10,6 @@ import {
EuiSpacer,
EuiButton,
EuiLink,
- EuiLoadingSpinner,
EuiIconTip,
EuiFlexGroup,
EuiFlexItem,
@@ -40,6 +39,7 @@ import { ActionConnector, ActionConnectorTableItem, ActionTypeIndex } from '../.
import { EmptyConnectorsPrompt } from '../../../components/prompts/empty_connectors_prompt';
import { useKibana } from '../../../../common/lib/kibana';
import { DEFAULT_HIDDEN_ACTION_TYPES } from '../../../../';
+import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner';
export const ActionsConnectorsList: React.FunctionComponent = () => {
const {
@@ -355,13 +355,7 @@ export const ActionsConnectorsList: React.FunctionComponent = () => {
/>
{/* Render the view based on if there's data or if they can save */}
- {(isLoadingActions || isLoadingActionTypes) && (
-
-
-
-
-
- )}
+ {(isLoadingActions || isLoadingActionTypes) && }
{actionConnectorTableItems.length !== 0 && table}
{actionConnectorTableItems.length === 0 &&
canSave &&
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx
index e25e703de5f7e..30ca2c620f1d7 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx
@@ -657,7 +657,6 @@ describe('edit button', () => {
const alertTypeR: AlertTypeModel = {
id: 'my-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: () => {
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.test.tsx
index 48360647e24ee..7a12c43427a91 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.test.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.test.tsx
@@ -10,7 +10,7 @@ import { createMemoryHistory, createLocation } from 'history';
import { ToastsApi } from 'kibana/public';
import { AlertDetailsRoute, getAlertData } from './alert_details_route';
import { Alert } from '../../../../types';
-import { EuiLoadingSpinner } from '@elastic/eui';
+import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner';
jest.mock('../../../../common/lib/kibana');
describe('alert_details_route', () => {
@@ -20,7 +20,7 @@ describe('alert_details_route', () => {
expect(
shallow(
- ).containsMatchingElement()
+ ).containsMatchingElement()
).toBeTruthy();
});
});
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx
index fc3e05fbfaed0..ae729dd4f0095 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx
@@ -7,7 +7,6 @@
import { i18n } from '@kbn/i18n';
import React, { useState, useEffect } from 'react';
import { RouteComponentProps } from 'react-router-dom';
-import { EuiLoadingSpinner } from '@elastic/eui';
import { ToastsApi } from 'kibana/public';
import { Alert, AlertType, ActionType } from '../../../../types';
import { AlertDetailsWithApi as AlertDetails } from './alert_details';
@@ -21,6 +20,7 @@ import {
withActionOperations,
} from '../../common/components/with_actions_api_operations';
import { useKibana } from '../../../../common/lib/kibana';
+import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner';
type AlertDetailsRouteProps = RouteComponentProps<{
alertId: string;
@@ -66,14 +66,7 @@ export const AlertDetailsRoute: React.FunctionComponent
requestRefresh={async () => requestRefresh(Date.now())}
/>
) : (
-
-
-
+
);
};
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances_route.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances_route.test.tsx
index e3fe9cd86356a..dfaed32ff72ae 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances_route.test.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances_route.test.tsx
@@ -9,7 +9,7 @@ import { shallow } from 'enzyme';
import { ToastsApi } from 'kibana/public';
import { AlertInstancesRoute, getAlertInstanceSummary } from './alert_instances_route';
import { Alert, AlertInstanceSummary, AlertType } from '../../../../types';
-import { EuiLoadingSpinner } from '@elastic/eui';
+import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner';
jest.mock('../../../../common/lib/kibana');
const fakeNow = new Date('2020-02-09T23:15:41.941Z');
@@ -23,7 +23,7 @@ describe('alert_instance_summary_route', () => {
expect(
shallow(
- ).containsMatchingElement()
+ ).containsMatchingElement()
).toBeTruthy();
});
});
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances_route.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances_route.tsx
index e1e0866d886a3..a122d59959156 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances_route.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_instances_route.tsx
@@ -7,7 +7,6 @@
import { i18n } from '@kbn/i18n';
import { ToastsApi } from 'kibana/public';
import React, { useState, useEffect } from 'react';
-import { EuiLoadingSpinner } from '@elastic/eui';
import { Alert, AlertInstanceSummary, AlertType } from '../../../../types';
import {
ComponentOpts as AlertApis,
@@ -15,6 +14,7 @@ import {
} from '../../common/components/with_bulk_alert_api_operations';
import { AlertInstancesWithApi as AlertInstances } from './alert_instances';
import { useKibana } from '../../../../common/lib/kibana';
+import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner';
type WithAlertInstanceSummaryProps = {
alert: Alert;
@@ -52,14 +52,7 @@ export const AlertInstancesRoute: React.FunctionComponent
) : (
-
-
-
+
);
};
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx
index 2790ea8aa6bfa..6057d2669f04c 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx
@@ -94,7 +94,6 @@ describe('alert_add', () => {
const alertType = {
id: 'my-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'test',
documentationUrl: null,
validate: (): ValidationResult => {
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx
index 25f830df58df5..e5a6a8977a8c8 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx
@@ -52,7 +52,6 @@ describe('alert_edit', () => {
const alertType = {
id: 'my-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'test',
documentationUrl: null,
validate: (): ValidationResult => {
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx
index d41ca915f34c1..ef8d17d8c4c28 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.test.tsx
@@ -26,7 +26,6 @@ describe('alert_form', () => {
const alertType = {
id: 'my-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: (): ValidationResult => {
@@ -54,7 +53,6 @@ describe('alert_form', () => {
const alertTypeNonEditable = {
id: 'non-edit-alert-type',
iconClass: 'test',
- name: 'non edit alert',
description: 'test',
documentationUrl: null,
validate: (): ValidationResult => {
@@ -67,7 +65,6 @@ describe('alert_form', () => {
const disabledByLicenseAlertType = {
id: 'disabled-by-license',
iconClass: 'test',
- name: 'test-alert',
description: 'Alert when testing',
documentationUrl: 'https://localhost.local/docs',
validate: (): ValidationResult => {
@@ -306,7 +303,6 @@ describe('alert_form', () => {
{
id: 'same-consumer-producer-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'test',
documentationUrl: null,
validate: (): ValidationResult => {
@@ -318,7 +314,6 @@ describe('alert_form', () => {
{
id: 'other-consumer-producer-alert-type',
iconClass: 'test',
- name: 'test-alert',
description: 'test',
documentationUrl: null,
validate: (): ValidationResult => {
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx
index 3210d53841993..a67fd218d55f3 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx
+++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx
@@ -3,7 +3,7 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
-import React, { Fragment, useState, useEffect, Suspense, useCallback } from 'react';
+import React, { Fragment, useState, useEffect, useCallback, Suspense } from 'react';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import {
@@ -23,7 +23,6 @@ import {
EuiIconTip,
EuiButtonIcon,
EuiHorizontalRule,
- EuiLoadingSpinner,
EuiEmptyPrompt,
EuiListGroupItem,
EuiListGroup,
@@ -71,6 +70,7 @@ import { AlertNotifyWhen } from './alert_notify_when';
import { checkAlertTypeEnabled } from '../../lib/check_alert_type_enabled';
import { alertTypeCompare, alertTypeGroupCompare } from '../../lib/alert_type_compare';
import { VIEW_LICENSE_OPTIONS_LINK } from '../../../common/constants';
+import { SectionLoading } from '../../components/section_loading';
const ENTER_KEY = 13;
@@ -289,10 +289,7 @@ export const AlertForm = ({
)
.filter((alertTypeItem) =>
searchValue
- ? alertTypeItem.alertTypeModel.name
- .toString()
- .toLocaleLowerCase()
- .includes(searchValue) ||
+ ? alertTypeItem.alertType.name.toString().toLocaleLowerCase().includes(searchValue) ||
alertTypeItem.alertType!.producer.toLocaleLowerCase().includes(searchValue) ||
alertTypeItem.alertTypeModel.description.toLocaleLowerCase().includes(searchValue)
: alertTypeItem
@@ -378,10 +375,7 @@ export const AlertForm = ({
hasDisabledByLicenseAlertTypes = true;
}
(result[producer] = result[producer] || []).push({
- name:
- typeof alertTypeValue.alertTypeModel.name === 'string'
- ? alertTypeValue.alertTypeModel.name
- : alertTypeValue.alertTypeModel.name.props.defaultMessage,
+ name: alertTypeValue.alertType.name,
id: alertTypeValue.alertTypeModel.id,
checkEnabledResult,
alertTypeItem: alertTypeValue.alertTypeModel,
@@ -475,11 +469,9 @@ export const AlertForm = ({
-
+ {alert.alertTypeId && alertTypesIndex && alertTypesIndex.has(alert.alertTypeId)
+ ? alertTypesIndex.get(alert.alertTypeId)!.name
+ : ''}
@@ -535,7 +527,16 @@ export const AlertForm = ({
alert.alertTypeId &&
selectedAlertType ? (
- }>
+
+
+
+ }
+ >
) : (
-
+
+
+
)}
);
};
-const CenterJustifiedSpinner = () => (
-
-
-
-
-
-);
-
const NoAuthorizedAlertTypes = ({ operation }: { operation: string }) => (
{
{loadedItems.length || isFilterApplied ? (
table
) : alertTypesState.isLoading || alertsState.isLoading ? (
-
-
-
-
-
+
) : authorizedToCreateAnyAlerts ? (
setAlertFlyoutVisibility(true)} />
) : (
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts
index f875bcabdcde8..aa61fcde9e9c2 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts
+++ b/x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts
@@ -11,10 +11,9 @@ export const ExpressionComponent: React.FunctionComponent = () => {
return null;
};
-const getTestAlertType = (id?: string, name?: string, iconClass?: string) => {
+const getTestAlertType = (id?: string, iconClass?: string) => {
return {
id: id || 'test-alet-type',
- name: name || 'Test alert type',
description: 'Test description',
iconClass: iconClass || 'icon',
documentationUrl: null,
diff --git a/x-pack/plugins/triggers_actions_ui/public/types.ts b/x-pack/plugins/triggers_actions_ui/public/types.ts
index cd1ebe47a8c22..3fffe9fe230b4 100644
--- a/x-pack/plugins/triggers_actions_ui/public/types.ts
+++ b/x-pack/plugins/triggers_actions_ui/public/types.ts
@@ -187,7 +187,6 @@ export interface AlertTypeParamsExpressionProps<
export interface AlertTypeModel {
id: string;
- name: string | JSX.Element;
description: string;
iconClass: string;
documentationUrl: string | ((docLinks: DocLinksStart) => string) | null;
diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/test_data.tsx b/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/test_data.tsx
index 9bb506b3ebf14..77362752f6960 100644
--- a/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/test_data.tsx
+++ b/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/test_data.tsx
@@ -11,13 +11,12 @@ import { ActionWizard } from './action_wizard';
import { ActionFactory, ActionFactoryDefinition, BaseActionConfig } from '../../dynamic_actions';
import { CollectConfigProps } from '../../../../../../src/plugins/kibana_utils/public';
import { licensingMock } from '../../../../licensing/public/mocks';
+import { Trigger, TriggerId } from '../../../../../../src/plugins/ui_actions/public';
+import { APPLY_FILTER_TRIGGER } from '../../../../../../src/plugins/data/public';
import {
- APPLY_FILTER_TRIGGER,
SELECT_RANGE_TRIGGER,
- Trigger,
- TriggerId,
VALUE_CLICK_TRIGGER,
-} from '../../../../../../src/plugins/ui_actions/public';
+} from '../../../../../../src/plugins/embeddable/public';
export const dashboards = [
{ id: 'dashboard1', title: 'Dashboard 1' },
diff --git a/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts b/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts
index 8da45276fa532..7e297c1cb6d7b 100644
--- a/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts
+++ b/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts
@@ -207,11 +207,6 @@ describe('monitor status alert type', () => {
"documentationUrl": [Function],
"iconClass": "uptimeApp",
"id": "xpack.uptime.alerts.monitorStatus",
- "name": ,
"requiresAppContext": false,
"validate": [Function],
}
diff --git a/x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx b/x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx
index e02cc11269e9c..39a8a36a6d0a8 100644
--- a/x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx
+++ b/x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx
@@ -10,7 +10,7 @@ import { CLIENT_ALERT_TYPES } from '../../../common/constants/alerts';
import { DurationAnomalyTranslations } from './translations';
import { AlertTypeInitializer } from '.';
-const { name, defaultActionMessage, description } = DurationAnomalyTranslations;
+const { defaultActionMessage, description } = DurationAnomalyTranslations;
const DurationAnomalyAlert = React.lazy(() => import('./lazy_wrapper/duration_anomaly'));
export const initDurationAnomalyAlertType: AlertTypeInitializer = ({
@@ -25,7 +25,6 @@ export const initDurationAnomalyAlertType: AlertTypeInitializer = ({
alertParamsExpression: (params: unknown) => (
),
- name,
description,
validate: () => ({ errors: {} }),
defaultActionMessage,
diff --git a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx
index 43aaa26d86642..6a00d2987f12b 100644
--- a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx
+++ b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx
@@ -5,7 +5,6 @@
*/
import React from 'react';
-import { FormattedMessage } from '@kbn/i18n/react';
import { AlertTypeModel, ValidationResult } from '../../../../triggers_actions_ui/public';
import { AlertTypeInitializer } from '.';
@@ -23,12 +22,6 @@ export const initMonitorStatusAlertType: AlertTypeInitializer = ({
plugins,
}): AlertTypeModel => ({
id: CLIENT_ALERT_TYPES.MONITOR_STATUS,
- name: (
-
- ),
description,
iconClass: 'uptimeApp',
documentationUrl(docLinks) {
diff --git a/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx b/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx
index 83c4792e26f59..43e5b75aa5f8b 100644
--- a/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx
+++ b/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx
@@ -10,7 +10,7 @@ import { CLIENT_ALERT_TYPES } from '../../../common/constants/alerts';
import { TlsTranslations } from './translations';
import { AlertTypeInitializer } from '.';
-const { name, defaultActionMessage, description } = TlsTranslations;
+const { defaultActionMessage, description } = TlsTranslations;
const TLSAlert = React.lazy(() => import('./lazy_wrapper/tls_alert'));
export const initTlsAlertType: AlertTypeInitializer = ({ core, plugins }): AlertTypeModel => ({
id: CLIENT_ALERT_TYPES.TLS,
@@ -21,7 +21,6 @@ export const initTlsAlertType: AlertTypeInitializer = ({ core, plugins }): Alert
alertParamsExpression: (params: any) => (
),
- name,
description,
validate: () => ({ errors: {} }),
defaultActionMessage,
diff --git a/x-pack/plugins/xpack_legacy/server/routes/settings.test.ts b/x-pack/plugins/xpack_legacy/server/routes/settings.test.ts
index 5d22e22ee0eb6..5d3a2c105c4a4 100644
--- a/x-pack/plugins/xpack_legacy/server/routes/settings.test.ts
+++ b/x-pack/plugins/xpack_legacy/server/routes/settings.test.ts
@@ -24,6 +24,12 @@ import { registerSettingsRoute } from './settings';
type HttpService = ReturnType;
type HttpSetup = UnwrapPromise>;
+export function mockGetClusterInfo(clusterInfo: any) {
+ const esClient = elasticsearchServiceMock.createScopedClusterClient().asCurrentUser;
+ // @ts-ignore we only care about the response body
+ esClient.info.mockResolvedValue({ body: { ...clusterInfo } });
+ return esClient;
+}
describe('/api/settings', () => {
let server: HttpService;
let httpSetup: HttpSetup;
@@ -31,7 +37,7 @@ describe('/api/settings', () => {
let mockApiCaller: jest.Mocked;
beforeEach(async () => {
- mockApiCaller = jest.fn().mockResolvedValue({ cluster_uuid: 'yyy-yyyyy' });
+ mockApiCaller = jest.fn();
server = createHttpServer();
httpSetup = await server.setup({
context: contextServiceMock.createSetupContract({
@@ -43,7 +49,7 @@ describe('/api/settings', () => {
},
},
client: {
- asCurrentUser: elasticsearchServiceMock.createScopedClusterClient().asCurrentUser,
+ asCurrentUser: mockGetClusterInfo({ cluster_uuid: 'yyy-yyyyy' }),
},
},
savedObjects: {
diff --git a/x-pack/plugins/xpack_legacy/server/routes/settings.ts b/x-pack/plugins/xpack_legacy/server/routes/settings.ts
index 9a30ca30616b7..93dc6898f0c2e 100644
--- a/x-pack/plugins/xpack_legacy/server/routes/settings.ts
+++ b/x-pack/plugins/xpack_legacy/server/routes/settings.ts
@@ -58,9 +58,9 @@ export function registerSettingsRoute({
const settings =
(await settingsCollector.fetch(collectorFetchContext)) ??
settingsCollector.getEmailValueStructure(null);
- const { cluster_uuid: uuid } = await callAsCurrentUser('info', {
- filterPath: 'cluster_uuid',
- });
+
+ const { body } = await collectorFetchContext.esClient.info({ filter_path: 'cluster_uuid' });
+ const uuid: string = body.cluster_uuid;
const overallStatus = await overallStatus$.pipe(first()).toPromise();
@@ -76,7 +76,6 @@ export function registerSettingsRoute({
snapshot: SNAPSHOT_REGEX.test(config.kibanaVersion),
status: ServiceStatusToLegacyState[overallStatus.level.toString()],
};
-
return res.ok({
body: {
cluster_uuid: uuid,
diff --git a/x-pack/test/api_integration/apis/ml/saved_objects/can_delete_job.ts b/x-pack/test/api_integration/apis/ml/saved_objects/can_delete_job.ts
index d95c90d417203..e80d5a333bbdf 100644
--- a/x-pack/test/api_integration/apis/ml/saved_objects/can_delete_job.ts
+++ b/x-pack/test/api_integration/apis/ml/saved_objects/can_delete_job.ts
@@ -75,7 +75,7 @@ export default ({ getService }: FtrProviderContext) => {
idSpace1
);
- expect(body).to.eql({ [adJobIdSpace12]: { canDelete: false, canUntag: true } });
+ expect(body).to.eql({ [adJobIdSpace12]: { canDelete: false, canRemoveFromSpace: true } });
});
it('job in individual spaces, all spaces user can delete and untag', async () => {
@@ -87,7 +87,7 @@ export default ({ getService }: FtrProviderContext) => {
idSpace1
);
- expect(body).to.eql({ [adJobIdSpace12]: { canDelete: true, canUntag: true } });
+ expect(body).to.eql({ [adJobIdSpace12]: { canDelete: true, canRemoveFromSpace: true } });
});
it('job in * space, single space user can not untag or delete', async () => {
@@ -99,7 +99,7 @@ export default ({ getService }: FtrProviderContext) => {
idSpace1
);
- expect(body).to.eql({ [adJobIdStarSpace]: { canDelete: false, canUntag: false } });
+ expect(body).to.eql({ [adJobIdStarSpace]: { canDelete: false, canRemoveFromSpace: false } });
});
it('job in * space, all spaces user can delete but not untag', async () => {
@@ -111,7 +111,7 @@ export default ({ getService }: FtrProviderContext) => {
idStarSpace
);
- expect(body).to.eql({ [adJobIdStarSpace]: { canDelete: true, canUntag: false } });
+ expect(body).to.eql({ [adJobIdStarSpace]: { canDelete: true, canRemoveFromSpace: false } });
});
});
};
diff --git a/x-pack/test/fleet_api_integration/apis/index.js b/x-pack/test/fleet_api_integration/apis/index.js
index 5b230e5a179a5..0d634f60e282f 100644
--- a/x-pack/test/fleet_api_integration/apis/index.js
+++ b/x-pack/test/fleet_api_integration/apis/index.js
@@ -7,8 +7,6 @@
export default function ({ loadTestFile }) {
describe('Fleet Endpoints', function () {
this.tags('ciGroup10');
- // Fleet setup
- loadTestFile(require.resolve('./setup'));
// Agent setup
loadTestFile(require.resolve('./agents_setup'));
// Agents
diff --git a/x-pack/test/fleet_api_integration/apis/setup.ts b/x-pack/test/fleet_api_integration/apis/setup.ts
deleted file mode 100644
index 4d1562e703770..0000000000000
--- a/x-pack/test/fleet_api_integration/apis/setup.ts
+++ /dev/null
@@ -1,32 +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 { FtrProviderContext } from '../../api_integration/ftr_provider_context';
-
-export default function (providerContext: FtrProviderContext) {
- const { getService } = providerContext;
- const supertest = getService('supertest');
- const es = getService('es');
- describe('Fleet setup', async () => {
- before(async () => {
- await supertest.post(`/api/fleet/setup`).set('kbn-xsrf', 'xxx').send();
- });
-
- it('should have installed placeholder indices', async function () {
- const resLogsIndexPatternPlaceholder = await es.transport.request({
- method: 'GET',
- path: `/logs-index_pattern_placeholder`,
- });
- expect(resLogsIndexPatternPlaceholder.statusCode).equal(200);
- const resMetricsIndexPatternPlaceholder = await es.transport.request({
- method: 'GET',
- path: `/metrics-index_pattern_placeholder`,
- });
- expect(resMetricsIndexPatternPlaceholder.statusCode).equal(200);
- });
- });
-}
diff --git a/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/public/plugin.ts b/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/public/plugin.ts
index af4aedda06ef7..50de66ac1c3ba 100644
--- a/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/public/plugin.ts
+++ b/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/public/plugin.ts
@@ -28,7 +28,6 @@ export class AlertingFixturePlugin implements Plugin {
+ await pageObjects.hosts.navigateToSecurityHostsPage();
+ await pageObjects.common.dismissBanner();
+ const fromTime = 'Jan 1, 2018 @ 00:00:00.000';
+ const toTime = 'now';
+ await pageObjects.timePicker.setAbsoluteRange(fromTime, toTime);
+ };
+
+ describe.skip('Endpoint Event Resolver', function () {
before(async () => {
- await pageObjects.hosts.navigateToSecurityHostsPage();
- await pageObjects.common.dismissBanner();
- const fromTime = 'Jan 1, 2018 @ 00:00:00.000';
- const toTime = 'now';
- await pageObjects.timePicker.setAbsoluteRange(fromTime, toTime);
await browser.setWindowSize(1800, 1200);
});
- describe.skip('Endpoint Resolver Tree', function () {
+ after(async () => {
+ await pageObjects.hosts.deleteDataStreams();
+ });
+
+ describe('Endpoint Resolver Tree', function () {
before(async () => {
await esArchiver.load('empty_kibana');
await esArchiver.load('endpoint/resolver_tree/functions', { useCreate: true });
+ await navigateToHostsAndSetDate();
await pageObjects.hosts.executeQueryAndOpenResolver('event.dataset : endpoint.events.file');
});
after(async () => {
@@ -213,6 +226,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
before(async () => {
await esArchiver.load('empty_kibana');
await esArchiver.load('endpoint/resolver_tree/alert_events', { useCreate: true });
+ await navigateToHostsAndSetDate();
});
after(async () => {
await pageObjects.hosts.deleteDataStreams();
diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts
index 220d932787fff..3f27d1868461f 100644
--- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts
+++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts
@@ -277,7 +277,7 @@ export default function ({ getService }: FtrProviderContext) {
.set('kbn-xsrf', 'xxx')
.send({
filter: entityIDFilter,
- indexPatterns: ['metrics-*'],
+ indexPatterns: ['doesnotexist-*'],
timeRange: {
from: tree.startTime,
to: tree.endTime,
diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts
index 9a731f1d5aee0..ab6cac7f357a0 100644
--- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts
+++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts
@@ -281,7 +281,7 @@ export default function ({ getService }: FtrProviderContext) {
from: tree.startTime.toISOString(),
to: tree.endTime.toISOString(),
},
- indexPatterns: ['metrics-*'],
+ indexPatterns: ['doesnotexist-*'],
})
.expect(200);
expect(body).to.be.empty();
diff --git a/yarn.lock b/yarn.lock
index 4dbfa610be6c3..6e4df2f5b197a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1765,18 +1765,13 @@
normalize-path "^2.0.1"
through2 "^2.0.3"
-"@hapi/accept@^3.2.4":
- version "3.2.4"
- resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-3.2.4.tgz#687510529493fe1d7d47954c31aff360d9364bd1"
- integrity sha512-soThGB+QMgfxlh0Vzhzlf3ZOEOPk5biEwcOXhkF0Eedqx8VnhGiggL9UYHrIsOb1rUg3Be3K8kp0iDL2wbVSOQ==
+"@hapi/accept@^5.0.1":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.1.tgz#068553e867f0f63225a506ed74e899441af53e10"
+ integrity sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q==
dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/hoek" "8.x.x"
-
-"@hapi/address@2.x.x", "@hapi/address@^2.1.2":
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
- integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==
+ "@hapi/boom" "9.x.x"
+ "@hapi/hoek" "9.x.x"
"@hapi/address@^4.1.0":
version "4.1.0"
@@ -1785,225 +1780,194 @@
dependencies:
"@hapi/hoek" "^9.0.0"
-"@hapi/ammo@3.x.x", "@hapi/ammo@^3.1.2":
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-3.1.2.tgz#a9edf5d48d99b75fdcd7ab3dabf9059942a06961"
- integrity sha512-ej9OtFmiZv1qr45g1bxEZNGyaR4jRpyMxU6VhbxjaYThymvOwsyIsUKMZnP5Qw2tfYFuwqCJuIBHGpeIbdX9gQ==
+"@hapi/ammo@5.x.x", "@hapi/ammo@^5.0.1":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-5.0.1.tgz#9d34560f5c214eda563d838c01297387efaab490"
+ integrity sha512-FbCNwcTbnQP4VYYhLNGZmA76xb2aHg9AMPiy18NZyWMG310P5KdFGyA9v2rm5ujrIny77dEEIkMOwl0Xv+fSSA==
dependencies:
- "@hapi/hoek" "8.x.x"
+ "@hapi/hoek" "9.x.x"
-"@hapi/b64@4.x.x":
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-4.2.1.tgz#bf8418d7907c5e73463f2e3b5c6fca7e9f2a1357"
- integrity sha512-zqHpQuH5CBMw6hADzKfU/IGNrxq1Q+/wTYV+OiZRQN9F3tMyk+9BUMeBvFRMamduuqL8iSp62QAnJ+7ATiYLWA==
+"@hapi/b64@5.x.x":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d"
+ integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==
dependencies:
- "@hapi/hoek" "8.x.x"
+ "@hapi/hoek" "9.x.x"
-"@hapi/boom@7.x.x", "@hapi/boom@^7.4.11":
- version "7.4.11"
- resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-7.4.11.tgz#37af8417eb9416aef3367aa60fa04a1a9f1fc262"
- integrity sha512-VSU/Cnj1DXouukYxxkes4nNJonCnlogHvIff1v1RVoN4xzkKhMXX+GRmb3NyH1iar10I9WFPDv2JPwfH3GaV0A==
+"@hapi/boom@9.x.x", "@hapi/boom@^9.0.0", "@hapi/boom@^9.1.1":
+ version "9.1.1"
+ resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.1.tgz#89e6f0e01637c2a4228da0d113e8157c93677b04"
+ integrity sha512-VNR8eDbBrOxBgbkddRYIe7+8DZ+vSbV6qlmaN2x7eWjsUjy2VmQgChkOKcVZIeupEZYj+I0dqNg430OhwzagjA==
dependencies:
- "@hapi/hoek" "8.x.x"
+ "@hapi/hoek" "9.x.x"
-"@hapi/bounce@1.x.x":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@hapi/bounce/-/bounce-1.3.2.tgz#3b096bb02f67de6115e6e4f0debc390be5a86bad"
- integrity sha512-3bnb1AlcEByFZnpDIidxQyw1Gds81z/1rSqlx4bIEE+wUN0ATj0D49B5cE1wGocy90Rp/de4tv7GjsKd5RQeew==
+"@hapi/bounce@2.x.x":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/bounce/-/bounce-2.0.0.tgz#e6ef56991c366b1e2738b2cd83b01354d938cf3d"
+ integrity sha512-JesW92uyzOOyuzJKjoLHM1ThiOvHPOLDHw01YV8yh5nCso7sDwJho1h0Ad2N+E62bZyz46TG3xhAi/78Gsct6A==
dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/hoek" "^8.3.1"
+ "@hapi/boom" "9.x.x"
+ "@hapi/hoek" "9.x.x"
-"@hapi/bourne@1.x.x":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a"
- integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==
+"@hapi/bourne@2.x.x":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d"
+ integrity sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==
-"@hapi/call@^5.1.3":
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/@hapi/call/-/call-5.1.3.tgz#217af45e3bc3d38b03aa5c9edfe1be939eee3741"
- integrity sha512-5DfWpMk7qZiYhvBhM5oUiT4GQ/O8a2rFR121/PdwA/eZ2C1EsuD547ZggMKAR5bZ+FtxOf0fdM20zzcXzq2mZA==
+"@hapi/call@8.x.x":
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/@hapi/call/-/call-8.0.1.tgz#9e64cd8ba6128eb5be6e432caaa572b1ed8cd7c0"
+ integrity sha512-bOff6GTdOnoe5b8oXRV3lwkQSb/LAWylvDMae6RgEWWntd0SHtkYbQukDHKlfaYtVnSAgIavJ0kqszF/AIBb6g==
dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/hoek" "8.x.x"
+ "@hapi/boom" "9.x.x"
+ "@hapi/hoek" "9.x.x"
-"@hapi/catbox-memory@4.x.x":
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/catbox-memory/-/catbox-memory-4.1.1.tgz#263a6f3361f7a200552c5772c98a8e80a1da712f"
- integrity sha512-T6Hdy8DExzG0jY7C8yYWZB4XHfc0v+p1EGkwxl2HoaPYAmW7I3E59M/IvmSVpis8RPcIoBp41ZpO2aZPBpM2Ww==
+"@hapi/catbox-memory@5.x.x":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/catbox-memory/-/catbox-memory-5.0.0.tgz#6c18dad1a80737480d1c33bfbefd5d028deec86d"
+ integrity sha512-ByuxVJPHNaXwLzbBv4GdTr6ccpe1nG+AfYt+8ftDWEJY7EWBWzD+Klhy5oPTDGzU26pNUh1e7fcYI1ILZRxAXQ==
dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/hoek" "8.x.x"
+ "@hapi/boom" "9.x.x"
+ "@hapi/hoek" "9.x.x"
-"@hapi/catbox@10.x.x":
- version "10.2.3"
- resolved "https://registry.yarnpkg.com/@hapi/catbox/-/catbox-10.2.3.tgz#2df51ab943d7613df3718fa2bfd981dd9558cec5"
- integrity sha512-kN9hXO4NYyOHW09CXiuj5qW1syc/0XeVOBsNNk0Tz89wWNQE5h21WF+VsfAw3uFR8swn/Wj3YEVBnWqo82m/JQ==
+"@hapi/catbox@^11.1.1":
+ version "11.1.1"
+ resolved "https://registry.yarnpkg.com/@hapi/catbox/-/catbox-11.1.1.tgz#d277e2d5023fd69cddb33d05b224ea03065fec0c"
+ integrity sha512-u/8HvB7dD/6X8hsZIpskSDo4yMKpHxFd7NluoylhGrL6cUfYxdQPnvUp9YU2C6F9hsyBVLGulBd9vBN1ebfXOQ==
dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/joi" "16.x.x"
- "@hapi/podium" "3.x.x"
+ "@hapi/boom" "9.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/podium" "4.x.x"
+ "@hapi/validate" "1.x.x"
-"@hapi/content@^4.1.1":
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/content/-/content-4.1.1.tgz#179673d1e2b7eb36c564d8f9605d019bd2252cbf"
- integrity sha512-3TWvmwpVPxFSF3KBjKZ8yDqIKKZZIm7VurDSweYpXYENZrJH3C1hd1+qEQW9wQaUaI76pPBLGrXl6I3B7i3ipA==
+"@hapi/content@^5.0.2":
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/@hapi/content/-/content-5.0.2.tgz#ae57954761de570392763e64cdd75f074176a804"
+ integrity sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw==
dependencies:
- "@hapi/boom" "7.x.x"
+ "@hapi/boom" "9.x.x"
-"@hapi/cookie@^10.1.2":
- version "10.1.2"
- resolved "https://registry.yarnpkg.com/@hapi/cookie/-/cookie-10.1.2.tgz#9ea7d80f05d764faaf892b84e80c1bf13f5e3bf5"
- integrity sha512-wch/uT5NgDEujmaLIqUoohbEP6PUr4ML2Z6zqheWHeHrSzXangPH4dveW+fiMsoPMW2S9ecAyUjCfkh4qRfxjg==
+"@hapi/cookie@^11.0.2":
+ version "11.0.2"
+ resolved "https://registry.yarnpkg.com/@hapi/cookie/-/cookie-11.0.2.tgz#7169c060157a3541146b976e5f0ca9b3f7577d7f"
+ integrity sha512-LRpSuHC53urzml83c5eUHSPPt7YtK1CaaPZU9KmnhZlacVVojrWJzOUIcwOADDvCZjDxowCO3zPMaOqzEm9kgg==
dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/bounce" "1.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/joi" "16.x.x"
+ "@hapi/boom" "9.x.x"
+ "@hapi/bounce" "2.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/validate" "1.x.x"
-"@hapi/cryptiles@4.x.x":
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-4.2.1.tgz#ff0f18d79074659838caedbb911851313ad1ffbc"
- integrity sha512-XoqgKsHK0l/VpqPs+tr6j6vE+VQ3+2bkF2stvttmc7xAOf1oSAwHcJ0tlp/6MxMysktt1IEY0Csy3khKaP9/uQ==
+"@hapi/cryptiles@5.x.x":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43"
+ integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==
dependencies:
- "@hapi/boom" "7.x.x"
-
-"@hapi/file@1.x.x":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@hapi/file/-/file-1.0.0.tgz#c91c39fd04db8bed5af82d2e032e7a4e65555b38"
- integrity sha512-Bsfp/+1Gyf70eGtnIgmScvrH8sSypO3TcK3Zf0QdHnzn/ACnAkI6KLtGACmNRPEzzIy+W7aJX5E+1fc9GwIABQ==
+ "@hapi/boom" "9.x.x"
-"@hapi/formula@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-1.2.0.tgz#994649c7fea1a90b91a0a1e6d983523f680e10cd"
- integrity sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==
+"@hapi/file@2.x.x":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/file/-/file-2.0.0.tgz#2ecda37d1ae9d3078a67c13b7da86e8c3237dfb9"
+ integrity sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ==
"@hapi/formula@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-2.0.0.tgz#edade0619ed58c8e4f164f233cda70211e787128"
integrity sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==
-"@hapi/good-squeeze@5.2.1":
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/@hapi/good-squeeze/-/good-squeeze-5.2.1.tgz#a7ed3f344c9602348af8f059beda663610ab8a4c"
- integrity sha512-ZBiRgEDMtI5XowD0i4jgYD3wntN2JneY5EA1lUbSk9YoVIV9rWc77+6S0oqwfG0nj4xU/FjrXHvAahNEvRc6tg==
+"@hapi/good-squeeze@6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/good-squeeze/-/good-squeeze-6.0.0.tgz#bb72d6869cd7398b615a6b7270f630dc4f76aebf"
+ integrity sha512-UgHAF9Lm8fJPzgf2HymtowOwNc1+IL+p08YTVR+XA4d8nmyE1t9x3RLA4riqldnOKHkVqGakJ1jGqUG7jk77Cg==
dependencies:
- "@hapi/hoek" "8.x.x"
+ "@hapi/hoek" "9.x.x"
fast-safe-stringify "2.x.x"
-"@hapi/h2o2@^8.3.2":
- version "8.3.2"
- resolved "https://registry.yarnpkg.com/@hapi/h2o2/-/h2o2-8.3.2.tgz#008a8f9ec3d9bba29077691aa9ec0ace93d4de80"
- integrity sha512-2WkZq+QAkvYHWGqnUuG0stcVeGyv9T7bopBYnCJSUEuvBZlUf2BTX2JCVSKxsnTLOxCYwoC/aI4Rr0ZSRd2oVg==
- dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/joi" "16.x.x"
- "@hapi/wreck" "15.x.x"
-
-"@hapi/hapi@^18.4.1":
- version "18.4.1"
- resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-18.4.1.tgz#023fbc131074b1cb2cd7f6766d65f4b0e92df788"
- integrity sha512-9HjVGa0Z4Qv9jk9AVoUdJMQLA+KuZ+liKWyEEkVBx3e3H1F0JM6aGbPkY9jRfwsITBWGBU2iXazn65SFKSi/tg==
- dependencies:
- "@hapi/accept" "^3.2.4"
- "@hapi/ammo" "^3.1.2"
- "@hapi/boom" "7.x.x"
- "@hapi/bounce" "1.x.x"
- "@hapi/call" "^5.1.3"
- "@hapi/catbox" "10.x.x"
- "@hapi/catbox-memory" "4.x.x"
- "@hapi/heavy" "6.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/joi" "15.x.x"
- "@hapi/mimos" "4.x.x"
- "@hapi/podium" "3.x.x"
- "@hapi/shot" "4.x.x"
- "@hapi/somever" "2.x.x"
- "@hapi/statehood" "6.x.x"
- "@hapi/subtext" "^6.1.3"
- "@hapi/teamwork" "3.x.x"
- "@hapi/topo" "3.x.x"
-
-"@hapi/heavy@6.x.x":
- version "6.2.2"
- resolved "https://registry.yarnpkg.com/@hapi/heavy/-/heavy-6.2.2.tgz#d42a282c62d5bb6332e497d8ce9ba52f1609f3e6"
- integrity sha512-PY1dCCO6dsze7RlafIRhTaGeyTgVe49A/lSkxbhKGjQ7x46o/OFf7hLiRqTCDh3atcEKf6362EaB3+kTUbCsVA==
+"@hapi/h2o2@^9.0.2":
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/@hapi/h2o2/-/h2o2-9.0.2.tgz#e9f1dfe789257c80d6ee37ec9fe358f8c69f855a"
+ integrity sha512-V7RsmVyl7uyWeuEko4uaSZbFpBHKcSFSui6PXNRaRLJHFX+iPbqWmeH6m1pW/WJ8DuaCVJFKhluDCDI9l4+1cw==
dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/joi" "16.x.x"
-
-"@hapi/hoek@8.x.x", "@hapi/hoek@^8.2.4", "@hapi/hoek@^8.3.0", "@hapi/hoek@^8.3.1", "@hapi/hoek@^8.5.1":
- version "8.5.1"
- resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06"
- integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==
+ "@hapi/boom" "9.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/validate" "1.x.x"
+ "@hapi/wreck" "17.x.x"
+
+"@hapi/hapi@^20.0.3":
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-20.0.3.tgz#e72cad460394e6d2c15f9c57abb5d3332dea27e3"
+ integrity sha512-aqJVHVjoY3phiZsgsGjDRG15CoUNIs1azScqLZDOCZUSKYGTbzPi+K0QP+RUjUJ0m8L9dRuTZ27c8HKxG3wEhA==
+ dependencies:
+ "@hapi/accept" "^5.0.1"
+ "@hapi/ammo" "^5.0.1"
+ "@hapi/boom" "9.x.x"
+ "@hapi/bounce" "2.x.x"
+ "@hapi/call" "8.x.x"
+ "@hapi/catbox" "^11.1.1"
+ "@hapi/catbox-memory" "5.x.x"
+ "@hapi/heavy" "^7.0.1"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/mimos" "5.x.x"
+ "@hapi/podium" "^4.1.1"
+ "@hapi/shot" "^5.0.1"
+ "@hapi/somever" "3.x.x"
+ "@hapi/statehood" "^7.0.3"
+ "@hapi/subtext" "^7.0.3"
+ "@hapi/teamwork" "5.x.x"
+ "@hapi/topo" "5.x.x"
+ "@hapi/validate" "^1.1.0"
+
+"@hapi/heavy@^7.0.1":
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/@hapi/heavy/-/heavy-7.0.1.tgz#73315ae33b6e7682a0906b7a11e8ca70e3045874"
+ integrity sha512-vJ/vzRQ13MtRzz6Qd4zRHWS3FaUc/5uivV2TIuExGTM9Qk+7Zzqj0e2G7EpE6KztO9SalTbiIkTh7qFKj/33cA==
+ dependencies:
+ "@hapi/boom" "9.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/validate" "1.x.x"
-"@hapi/hoek@9.x.x", "@hapi/hoek@^9.0.0":
+"@hapi/hoek@9.x.x", "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.0.4", "@hapi/hoek@^9.1.0":
version "9.1.0"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.0.tgz#6c9eafc78c1529248f8f4d92b0799a712b6052c6"
integrity sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==
-"@hapi/inert@^5.2.2":
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/@hapi/inert/-/inert-5.2.2.tgz#3ba4d93afc6d5b42e4bab19cd09556ddd49b5dac"
- integrity sha512-8IaGfAEF8SwZtpdaTq0G3aDPG35ZTfWKjnMNniG2N3kE+qioMsBuImIGxna8TNQ+sYMXYK78aqmvzbQHno8qSQ==
+"@hapi/inert@^6.0.3":
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/@hapi/inert/-/inert-6.0.3.tgz#57af5d912893fabcb57eb4b956f84f6cd8020fe1"
+ integrity sha512-Z6Pi0Wsn2pJex5CmBaq+Dky9q40LGzXLUIUFrYpDtReuMkmfy9UuUeYc4064jQ1Xe9uuw7kbwE6Fq6rqKAdjAg==
dependencies:
- "@hapi/ammo" "3.x.x"
- "@hapi/boom" "7.x.x"
- "@hapi/bounce" "1.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/joi" "16.x.x"
- lru-cache "4.1.x"
+ "@hapi/ammo" "5.x.x"
+ "@hapi/boom" "9.x.x"
+ "@hapi/bounce" "2.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/validate" "1.x.x"
+ lru-cache "^6.0.0"
-"@hapi/iron@*", "@hapi/iron@5.x.x", "@hapi/iron@^5.1.4":
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-5.1.4.tgz#7406f36847f798f52b92d1d97f855e27973832b7"
- integrity sha512-+ElC+OCiwWLjlJBmm8ZEWjlfzTMQTdgPnU/TsoU5QsktspIWmWi9IU4kU83nH+X/SSya8TP8h8P11Wr5L7dkQQ==
- dependencies:
- "@hapi/b64" "4.x.x"
- "@hapi/boom" "7.x.x"
- "@hapi/bourne" "1.x.x"
- "@hapi/cryptiles" "4.x.x"
- "@hapi/hoek" "8.x.x"
-
-"@hapi/joi@15.x.x":
- version "15.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7"
- integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==
- dependencies:
- "@hapi/address" "2.x.x"
- "@hapi/bourne" "1.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/topo" "3.x.x"
-
-"@hapi/joi@16.x.x":
- version "16.1.8"
- resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.8.tgz#84c1f126269489871ad4e2decc786e0adef06839"
- integrity sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==
- dependencies:
- "@hapi/address" "^2.1.2"
- "@hapi/formula" "^1.2.0"
- "@hapi/hoek" "^8.2.4"
- "@hapi/pinpoint" "^1.0.2"
- "@hapi/topo" "^3.1.3"
-
-"@hapi/mimos@4.x.x":
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/mimos/-/mimos-4.1.1.tgz#4dab8ed5c64df0603c204c725963a5faa4687e8a"
- integrity sha512-CXoi/zfcTWfKYX756eEea8rXJRIb9sR4d7VwyAH9d3BkDyNgAesZxvqIdm55npQc6S9mU3FExinMAQVlIkz0eA==
+"@hapi/iron@6.x.x", "@hapi/iron@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f"
+ integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==
dependencies:
- "@hapi/hoek" "8.x.x"
+ "@hapi/b64" "5.x.x"
+ "@hapi/boom" "9.x.x"
+ "@hapi/bourne" "2.x.x"
+ "@hapi/cryptiles" "5.x.x"
+ "@hapi/hoek" "9.x.x"
+
+"@hapi/mimos@5.x.x":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/mimos/-/mimos-5.0.0.tgz#245c6c98b1cc2c13395755c730321b913de074eb"
+ integrity sha512-EVS6wJYeE73InTlPWt+2e3Izn319iIvffDreci3qDNT+t3lA5ylJ0/SoTaID8e0TPNUkHUSsgJZXEmLHvoYzrA==
+ dependencies:
+ "@hapi/hoek" "9.x.x"
mime-db "1.x.x"
-"@hapi/nigel@3.x.x":
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/nigel/-/nigel-3.1.1.tgz#84794021c9ee6e48e854fea9fb76e9f7e78c99ad"
- integrity sha512-R9YWx4S8yu0gcCBrMUDCiEFm1SQT895dMlYoeNBp8I6YhF1BFF1iYPueKA2Kkp9BvyHdjmvrxCOns7GMmpl+Fw==
+"@hapi/nigel@4.x.x":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@hapi/nigel/-/nigel-4.0.2.tgz#8f84ef4bca4fb03b2376463578f253b0b8e863c4"
+ integrity sha512-ht2KoEsDW22BxQOEkLEJaqfpoKPXxi7tvabXy7B/77eFtOyG5ZEstfZwxHQcqAiZhp58Ae5vkhEqI03kawkYNw==
dependencies:
- "@hapi/hoek" "8.x.x"
- "@hapi/vise" "3.x.x"
+ "@hapi/hoek" "^9.0.4"
+ "@hapi/vise" "^4.0.0"
"@hapi/oppsy@3.x.x":
version "3.0.0"
@@ -2012,97 +1976,86 @@
dependencies:
"@hapi/hoek" "9.x.x"
-"@hapi/pez@^4.1.2":
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-4.1.2.tgz#14984d0c31fed348f10c962968a21d9761f55503"
- integrity sha512-8zSdJ8cZrJLFldTgwjU9Fb1JebID+aBCrCsycgqKYe0OZtM2r3Yv3aAwW5z97VsZWCROC1Vx6Mdn4rujh5Ktcg==
+"@hapi/pez@^5.0.1":
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-5.0.3.tgz#b75446e6fef8cbb16816573ab7da1b0522e7a2a1"
+ integrity sha512-mpikYRJjtrbJgdDHG/H9ySqYqwJ+QU/D7FXsYciS9P7NYBXE2ayKDAy3H0ou6CohOCaxPuTV4SZ0D936+VomHA==
dependencies:
- "@hapi/b64" "4.x.x"
- "@hapi/boom" "7.x.x"
- "@hapi/content" "^4.1.1"
- "@hapi/hoek" "8.x.x"
- "@hapi/nigel" "3.x.x"
-
-"@hapi/pinpoint@^1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-1.0.2.tgz#025b7a36dbbf4d35bf1acd071c26b20ef41e0d13"
- integrity sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==
+ "@hapi/b64" "5.x.x"
+ "@hapi/boom" "9.x.x"
+ "@hapi/content" "^5.0.2"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/nigel" "4.x.x"
"@hapi/pinpoint@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-2.0.0.tgz#805b40d4dbec04fc116a73089494e00f073de8df"
integrity sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==
-"@hapi/podium@3.x.x", "@hapi/podium@^3.4.3":
- version "3.4.3"
- resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-3.4.3.tgz#d28935870ae1372e2f983a7161e710c968a60de1"
- integrity sha512-QJlnYLEYZWlKQ9fSOtuUcpANyoVGwT68GA9P0iQQCAetBK0fI+nbRBt58+aMixoifczWZUthuGkNjqKxgPh/CQ==
+"@hapi/podium@4.x.x", "@hapi/podium@^4.1.1":
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-4.1.1.tgz#106e5849f2cb19b8767cc16007e0107f27c3c791"
+ integrity sha512-jh7a6+5Z4FUWzx8fgmxjaAa1DTBu+Qfg+NbVdo0f++rE5DgsVidUYrLDp3db65+QjDLleA2MfKQXkpT8ylBDXA==
dependencies:
- "@hapi/hoek" "8.x.x"
- "@hapi/joi" "16.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/teamwork" "5.x.x"
+ "@hapi/validate" "1.x.x"
-"@hapi/shot@4.x.x":
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/@hapi/shot/-/shot-4.1.2.tgz#69f999956041fe468701a89a413175a521dabed5"
- integrity sha512-6LeHLjvsq/bQ0R+fhEyr7mqExRGguNTrxFZf5DyKe3CK6pNabiGgYO4JVFaRrLZ3JyuhkS0fo8iiRE2Ql2oA/A==
+"@hapi/shot@^5.0.1":
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/@hapi/shot/-/shot-5.0.4.tgz#6c978314f21a054c041f4becc50095dd78d3d775"
+ integrity sha512-PcEz0WJgFDA3xNSMeONgQmothFr7jhbbRRSAKaDh7chN7zOXBlhl13bvKZW6CMb2xVfJUmt34CW3e/oExMgBhQ==
dependencies:
- "@hapi/hoek" "8.x.x"
- "@hapi/joi" "16.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/validate" "1.x.x"
-"@hapi/somever@2.x.x":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/somever/-/somever-2.1.1.tgz#142bddf7cc4d829f678ed4e60618630a9a7ae845"
- integrity sha512-cic5Sto4KGd9B0oQSdKTokju+rYhCbdpzbMb0EBnrH5Oc1z048hY8PaZ1lx2vBD7I/XIfTQVQetBH57fU51XRA==
+"@hapi/somever@3.x.x":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/somever/-/somever-3.0.0.tgz#f4e9b16a948415b926b4dd898013602b0cb45758"
+ integrity sha512-Upw/kmKotC9iEmK4y047HMYe4LDKsE5NWfjgX41XNKmFvxsQL7OiaCWVhuyyhU0ShDGBfIAnCH8jZr49z/JzZA==
dependencies:
- "@hapi/bounce" "1.x.x"
- "@hapi/hoek" "8.x.x"
+ "@hapi/bounce" "2.x.x"
+ "@hapi/hoek" "9.x.x"
-"@hapi/statehood@6.x.x", "@hapi/statehood@^6.1.2":
- version "6.1.2"
- resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-6.1.2.tgz#6dda508b5da99a28a3ed295c3cac795cf6c12a02"
- integrity sha512-pYXw1x6npz/UfmtcpUhuMvdK5kuOGTKcJNfLqdNptzietK2UZH5RzNJSlv5bDHeSmordFM3kGItcuQWX2lj2nQ==
- dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/bounce" "1.x.x"
- "@hapi/bourne" "1.x.x"
- "@hapi/cryptiles" "4.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/iron" "5.x.x"
- "@hapi/joi" "16.x.x"
-
-"@hapi/subtext@^6.1.3":
- version "6.1.3"
- resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-6.1.3.tgz#bbd07771ae2a4e73ac360c93ed74ac641718b9c6"
- integrity sha512-qWN6NbiHNzohVcJMeAlpku/vzbyH4zIpnnMPMPioQMwIxbPFKeNViDCNI6fVBbMPBiw/xB4FjqiJkRG5P9eWWg==
- dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/bourne" "1.x.x"
- "@hapi/content" "^4.1.1"
- "@hapi/file" "1.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/pez" "^4.1.2"
- "@hapi/wreck" "15.x.x"
-
-"@hapi/teamwork@3.x.x":
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-3.3.1.tgz#b52d0ec48682dc793926bd432e22ceb19c915d3f"
- integrity sha512-61tiqWCYvMKP7fCTXy0M4VE6uNIwA0qvgFoiDubgfj7uqJ0fdHJFQNnVPGrxhLWlwz0uBPWrQlBH7r8y9vFITQ==
+"@hapi/statehood@^7.0.3":
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-7.0.3.tgz#655166f3768344ed3c3b50375a303cdeca8040d9"
+ integrity sha512-pYB+pyCHkf2Amh67QAXz7e/DN9jcMplIL7Z6N8h0K+ZTy0b404JKPEYkbWHSnDtxLjJB/OtgElxocr2fMH4G7w==
+ dependencies:
+ "@hapi/boom" "9.x.x"
+ "@hapi/bounce" "2.x.x"
+ "@hapi/bourne" "2.x.x"
+ "@hapi/cryptiles" "5.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/iron" "6.x.x"
+ "@hapi/validate" "1.x.x"
-"@hapi/topo@3.x.x", "@hapi/topo@^3.1.3":
- version "3.1.6"
- resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29"
- integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==
+"@hapi/subtext@^7.0.3":
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-7.0.3.tgz#f7440fc7c966858e1f39681e99eb6171c71e7abd"
+ integrity sha512-CekDizZkDGERJ01C0+TzHlKtqdXZxzSWTOaH6THBrbOHnsr3GY+yiMZC+AfNCypfE17RaIakGIAbpL2Tk1z2+A==
dependencies:
- "@hapi/hoek" "^8.3.0"
+ "@hapi/boom" "9.x.x"
+ "@hapi/bourne" "2.x.x"
+ "@hapi/content" "^5.0.2"
+ "@hapi/file" "2.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/pez" "^5.0.1"
+ "@hapi/wreck" "17.x.x"
-"@hapi/topo@^5.0.0":
+"@hapi/teamwork@5.x.x":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.0.tgz#7801a61fc727f702fd2196ef7625eb4e389f4124"
+ integrity sha512-llqoQTrAJDTXxG3c4Kz/uzhBS1TsmSBa/XG5SPcVXgmffHE1nFtyLIK0hNJHCB3EuBKT84adzd1hZNY9GJLWtg==
+
+"@hapi/topo@5.x.x", "@hapi/topo@^5.0.0":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7"
integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==
dependencies:
"@hapi/hoek" "^9.0.0"
-"@hapi/validate@1.x.x":
+"@hapi/validate@1.x.x", "@hapi/validate@^1.1.0":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-1.1.3.tgz#f750a07283929e09b51aa16be34affb44e1931ad"
integrity sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==
@@ -2110,31 +2063,31 @@
"@hapi/hoek" "^9.0.0"
"@hapi/topo" "^5.0.0"
-"@hapi/vise@3.x.x":
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/@hapi/vise/-/vise-3.1.1.tgz#dfc88f2ac90682f48bdc1b3f9b8f1eab4eabe0c8"
- integrity sha512-OXarbiCSadvtg+bSdVPqu31Z1JoBL+FwNYz3cYoBKQ5xq1/Cr4A3IkGpAZbAuxU5y4NL5pZFZG3d2a3ZGm/dOQ==
+"@hapi/vise@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@hapi/vise/-/vise-4.0.0.tgz#c6a94fe121b94a53bf99e7489f7fcc74c104db02"
+ integrity sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg==
dependencies:
- "@hapi/hoek" "8.x.x"
+ "@hapi/hoek" "9.x.x"
-"@hapi/vision@^5.5.4":
- version "5.5.4"
- resolved "https://registry.yarnpkg.com/@hapi/vision/-/vision-5.5.4.tgz#03a01374fb5e0a498d6e502e635a0b54d70501a1"
- integrity sha512-/DFgnQtcrlf2eQNkh/DHnjrCRHLSmHraU+PHe1SlxLUJxATQCw8VIEt6rJraM2jGTpFgHNk6B6ELtu3sBJCClg==
+"@hapi/vision@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/@hapi/vision/-/vision-6.0.1.tgz#976c3575be56d3cb5b472ddcfe0b7403778706fd"
+ integrity sha512-xv4PwmhbXCLzDfojZ7l4+P/YynBhMInV8GtLPH4gB74prhwOl8lGcJxxK8V9rf1aMH/vonM5yVGd9FuoA9sT0A==
dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/bounce" "1.x.x"
- "@hapi/hoek" "8.x.x"
- "@hapi/joi" "16.x.x"
+ "@hapi/boom" "9.x.x"
+ "@hapi/bounce" "2.x.x"
+ "@hapi/hoek" "9.x.x"
+ "@hapi/validate" "1.x.x"
-"@hapi/wreck@15.x.x", "@hapi/wreck@^15.0.2":
- version "15.1.0"
- resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-15.1.0.tgz#7917cd25950ce9b023f7fd2bea6e2ef72c71e59d"
- integrity sha512-tQczYRTTeYBmvhsek/D49En/5khcShaBEmzrAaDjMrFXKJRuF8xA8+tlq1ETLBFwGd6Do6g2OC74rt11kzawzg==
+"@hapi/wreck@17.x.x", "@hapi/wreck@^17.0.0", "@hapi/wreck@^17.1.0":
+ version "17.1.0"
+ resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-17.1.0.tgz#fbdc380c6f3fa1f8052dc612b2d3b6ce3e88dbec"
+ integrity sha512-nx6sFyfqOpJ+EFrHX+XWwJAxs3ju4iHdbB/bwR8yTNZOiYmuhA8eCe7lYPtYmb4j7vyK/SlbaQsmTtUrMvPEBw==
dependencies:
- "@hapi/boom" "7.x.x"
- "@hapi/bourne" "1.x.x"
- "@hapi/hoek" "8.x.x"
+ "@hapi/boom" "9.x.x"
+ "@hapi/bourne" "2.x.x"
+ "@hapi/hoek" "9.x.x"
"@icons/material@^0.2.4":
version "0.2.4"
@@ -2998,7 +2951,7 @@
resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e"
integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=
-"@mapbox/vector-tile@^1.3.1":
+"@mapbox/vector-tile@1.3.1", "@mapbox/vector-tile@^1.3.1":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666"
integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==
@@ -4869,11 +4822,6 @@
"@types/vinyl-fs" "*"
chokidar "^2.1.2"
-"@types/hapi__boom@*", "@types/hapi__boom@^7.4.1":
- version "7.4.1"
- resolved "https://registry.yarnpkg.com/@types/hapi__boom/-/hapi__boom-7.4.1.tgz#06439d7637245dcbe6dd6548d2a91f2c1243d80b"
- integrity sha512-x/ZK824GomII7Yoei/nMoB46NQcSfGe0iVpZK3uUivxIAfUUSzRvu8RQO7ZkKapIgzgshHZc+GR+z/BQ8l2VLg==
-
"@types/hapi__catbox@*":
version "10.2.3"
resolved "https://registry.yarnpkg.com/@types/hapi__catbox/-/hapi__catbox-10.2.3.tgz#c9279c16d709bf2987491c332e11d18124ae018f"
@@ -4886,54 +4834,38 @@
dependencies:
"@types/hapi__hapi" "*"
-"@types/hapi__h2o2@8.3.0":
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/@types/hapi__h2o2/-/hapi__h2o2-8.3.0.tgz#c2e6598ab6ed28edb1a5edd44ddc185e1c252dd8"
- integrity sha512-jD6L+8BJ+SVbwBzQK3W7zGnDYgrwuCNDl9r1P0GdwoYsysNADl7STfrhJ/m9qPt2fD1vFVJsfsFjoJ/iCyNlOQ==
+"@types/hapi__h2o2@^8.3.2":
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/@types/hapi__h2o2/-/hapi__h2o2-8.3.2.tgz#43cce95972c3097a2ca3efe6b7054a0c95fbf291"
+ integrity sha512-l36uuLHTwUQNbNUIkT14Z4WbJl1CIWpBZu7ZCBemGBypiNnbJxN3o0YyQ6QAid3YYa2C7LVDIdyY4MhpX8q9ZA==
dependencies:
- "@types/hapi__boom" "*"
+ "@hapi/boom" "^9.0.0"
+ "@hapi/wreck" "^17.0.0"
"@types/hapi__hapi" "*"
"@types/node" "*"
-"@types/hapi__hapi@*", "@types/hapi__hapi@^18.2.6":
- version "18.2.6"
- resolved "https://registry.yarnpkg.com/@types/hapi__hapi/-/hapi__hapi-18.2.6.tgz#61c1b210c55dee4636df594e7a0868ad48c8042a"
- integrity sha512-sXFlSg9btu/LdHqK/N/kuQXVqZhSvibXbtZc0KfEcelRXKthdU5ZSu5qItDIov7SYnyK2faMe7dbZaC/VpC33w==
+"@types/hapi__hapi@*", "@types/hapi__hapi@^20.0.2":
+ version "20.0.2"
+ resolved "https://registry.yarnpkg.com/@types/hapi__hapi/-/hapi__hapi-20.0.2.tgz#e7571451f7fb75e87ab3873ec91b92f92cd55fff"
+ integrity sha512-7FwFoaxSCtHXbHbDdArSeVABFOfMLgVkOvOUtWrqUBzw639B2rq9OHv3kOVDHY0bOao0f6ubMzUxio8WQ9QZfQ==
dependencies:
- "@types/hapi__boom" "*"
+ "@hapi/boom" "^9.0.0"
+ "@hapi/iron" "^6.0.0"
"@types/hapi__catbox" "*"
- "@types/hapi__iron" "*"
- "@types/hapi__joi" "*"
"@types/hapi__mimos" "*"
"@types/hapi__podium" "*"
"@types/hapi__shot" "*"
+ "@types/joi" "*"
"@types/node" "*"
-"@types/hapi__hoek@^6.2.0":
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/@types/hapi__hoek/-/hapi__hoek-6.2.0.tgz#61ec4dfb93e6aaccf2b407d6074a0633069e5d2d"
- integrity sha512-MMS8ZD0SR2lklVkpNJw7iUYBmlvBLw1T04VSBhbWpiOi0ee6RoJUCcocVao1FLnSYR8Tt03dykRBv+FkvPIJSg==
-
-"@types/hapi__inert@^5.2.1":
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/@types/hapi__inert/-/hapi__inert-5.2.1.tgz#cce395e7470a969f63cf57d561da230218b8b2bb"
- integrity sha512-pFvXfN9bTGgR6jkgKseXmu5/eHVGVEsGh0LKHCkcezEqZZMJV9YabREVLa6kcYEQMIDQzQSwSakSnemCFiSnOg==
+"@types/hapi__inert@^5.2.2":
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/@types/hapi__inert/-/hapi__inert-5.2.2.tgz#6513c487d216ed9377c2c0efceb178fda0928bfa"
+ integrity sha512-Vp9HS2wi3Qbm1oUlcTvzA2Zd+f3Dwg+tgLqWA6KTCgKbQX4LCPKIvVssbaQAVncmcpH0aPrtkAfftJlS/sMsGg==
dependencies:
"@types/hapi__hapi" "*"
-"@types/hapi__iron@*":
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/@types/hapi__iron/-/hapi__iron-6.0.1.tgz#ec8b23eff3d69313f1187c234deb80652384ad6b"
- integrity sha512-NTr+1FKl+nvEeSwVpfcks36dCm6+tbcQh3tJYbyQ5XWb5sIbCIptW6p38zmCYE5ppOoU/2PK1Y8taGpl6cOl5w==
- dependencies:
- "@hapi/iron" "*"
-
-"@types/hapi__joi@*":
- version "17.1.6"
- resolved "https://registry.yarnpkg.com/@types/hapi__joi/-/hapi__joi-17.1.6.tgz#b84663676aa9753c17183718338dd40ddcbd3754"
- integrity sha512-y3A1MzNC0FmzD5+ys59RziE1WqKrL13nxtJgrSzjoO7boue5B7zZD2nZLPwrSuUviFjpKFQtgHYSvhDGfIE4jA==
-
-"@types/hapi__mimos@*", "@types/hapi__mimos@4.1.0":
+"@types/hapi__mimos@*":
version "4.1.0"
resolved "https://registry.yarnpkg.com/@types/hapi__mimos/-/hapi__mimos-4.1.0.tgz#47dbf89ebfc05183c1de2797e9426793db9a0d85"
integrity sha512-hcdSoYa32wcP+sEfyf85ieGwElwokcZ/mma8eyqQ4OTHeCAGwfaoiGxjG4z1Dm+RGhIYLHlW54ji5FFwahH12A==
@@ -4952,14 +4884,6 @@
dependencies:
"@types/node" "*"
-"@types/hapi__wreck@^15.0.1":
- version "15.0.1"
- resolved "https://registry.yarnpkg.com/@types/hapi__wreck/-/hapi__wreck-15.0.1.tgz#41df4e122c49316f0057cb5e9c6eb4c00e671e95"
- integrity sha512-OXhOaFWPFkWkqU5IlFwgTK/Q3yzc3iDhC1/S+3rQ6d2qkl6xvcRZaayJGjDXORf3krnGtDN1l3bIajNcuUl6QA==
- dependencies:
- "@types/hapi__boom" "*"
- "@types/node" "*"
-
"@types/has-ansi@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/has-ansi/-/has-ansi-3.0.0.tgz#636403dc4e0b2649421c4158e5c404416f3f0330"
@@ -5099,6 +5023,11 @@
jest-diff "^25.2.1"
pretty-format "^25.2.1"
+"@types/joi@*":
+ version "14.3.4"
+ resolved "https://registry.yarnpkg.com/@types/joi/-/joi-14.3.4.tgz#eed1e14cbb07716079c814138831a520a725a1e0"
+ integrity sha512-1TQNDJvIKlgYXGNIABfgFp9y0FziDpuGrd799Q5RcnsDu+krD+eeW/0Fs5PHARvWWFelOhIG2OPCo6KbadBM4A==
+
"@types/joi@^13.4.2":
version "13.6.1"
resolved "https://registry.yarnpkg.com/@types/joi/-/joi-13.6.1.tgz#325486a397504f8e22c8c551dc8b0e1d41d5d5ae"
@@ -19303,7 +19232,7 @@ lowlight@^1.14.0, lowlight@^1.2.0:
fault "^1.0.0"
highlight.js "~10.4.0"
-lru-cache@4.1.x, lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.5:
+lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.5:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
@@ -21931,7 +21860,7 @@ pathval@^1.1.0:
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=
-pbf@^3.0.5, pbf@^3.2.1:
+pbf@3.2.1, pbf@^3.0.5, pbf@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a"
integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==