From a170f7ab5b5319c3309f813a4bad8c409c846f1f Mon Sep 17 00:00:00 2001 From: Bill McConaghy Date: Thu, 7 Mar 2019 12:01:39 -0500 Subject: [PATCH 01/51] replacing Angular watch list UI with React one (#32401) * replacing Angular watch list UI with React one * fixing TS issues * addressing PR feedback * fixing TS issues * more TS fixes * TS fix * addressing more PR feedback * TS fixes * removing unused/incompatible translations * fixing functional test * prettier fix * fixing typp * fixing missing comma * fixing data-test-subject typo * fixing functional test * fixing functional tests * fixing delete functional tests * addressing PR feedback --- .../translations/translations/zh-CN.json | 17 -- .../{action_modes.js => action_modes.ts} | 6 +- .../{action_states.js => action_states.ts} | 16 +- .../{action_types.js => action_types.ts} | 6 +- .../constants/{agg_types.js => agg_types.ts} | 6 +- .../{comparators.js => comparators.ts} | 6 +- .../{error_codes.js => error_codes.ts} | 3 +- ...roll_settings.js => es_scroll_settings.ts} | 8 +- .../common/constants/{index.js => index.ts} | 0 .../{index_names.js => index_names.ts} | 2 +- .../common/constants/{lists.js => lists.ts} | 4 +- .../{pagination.js => pagination.ts} | 4 +- .../constants/{watch_history.js => plugin.ts} | 4 +- ...resh_intervals.js => refresh_intervals.ts} | 4 +- .../common/constants/{routes.js => routes.ts} | 2 +- .../{sort_orders.js => sort_orders.ts} | 4 +- .../{time_units.js => time_units.ts} | 4 +- .../watcher/common/constants/watch_history.ts | 9 + .../common/constants/watch_state_comments.js | 33 --- .../common/constants/watch_state_comments.ts | 46 +++ .../{watch_states.js => watch_states.ts} | 14 +- .../{watch_types.js => watch_types.ts} | 6 +- .../components/delete_watches_modal.tsx | 88 ++++++ x-pack/plugins/watcher/public/index.scss | 2 +- x-pack/plugins/watcher/public/lib/api.ts | 33 +++ .../public/lib/manage_angular_lifecycle.js | 23 ++ .../plugin.js => public/models/index.d.ts} | 7 +- .../watch_list/components/watch_list.tsx | 269 ++++++++++++++++++ .../components/watch_list/_index.scss | 1 - .../components/watch_list/_watch_list.scss | 6 - .../watch_list/components/watch_list/index.js | 7 - .../components/watch_list/watch_list.html | 121 -------- .../components/watch_list/watch_list.js | 210 -------------- .../components/watch_table/index.js | 7 - .../components/watch_table/watch_table.html | 174 ----------- .../components/watch_table/watch_table.js | 89 ------ .../public/sections/watch_list/index.scss | 6 + .../sections/watch_list/watch_list_route.html | 5 +- .../sections/watch_list/watch_list_route.js | 88 +++--- .../api/watches/register_delete_route.js | 35 ++- .../functional/apps/watcher/watcher_test.js | 20 +- .../functional/page_objects/watcher_page.js | 21 +- 42 files changed, 609 insertions(+), 807 deletions(-) rename x-pack/plugins/watcher/common/constants/{action_modes.js => action_modes.ts} (94%) rename x-pack/plugins/watcher/common/constants/{action_states.js => action_states.ts} (82%) rename x-pack/plugins/watcher/common/constants/{action_types.js => action_types.ts} (82%) rename x-pack/plugins/watcher/common/constants/{agg_types.js => agg_types.ts} (82%) rename x-pack/plugins/watcher/common/constants/{comparators.js => comparators.ts} (78%) rename x-pack/plugins/watcher/common/constants/{error_codes.js => error_codes.ts} (85%) rename x-pack/plugins/watcher/common/constants/{es_scroll_settings.js => es_scroll_settings.ts} (77%) rename x-pack/plugins/watcher/common/constants/{index.js => index.ts} (100%) rename x-pack/plugins/watcher/common/constants/{index_names.js => index_names.ts} (84%) rename x-pack/plugins/watcher/common/constants/{lists.js => lists.ts} (74%) rename x-pack/plugins/watcher/common/constants/{pagination.js => pagination.ts} (77%) rename x-pack/plugins/watcher/common/constants/{watch_history.js => plugin.ts} (78%) rename x-pack/plugins/watcher/common/constants/{refresh_intervals.js => refresh_intervals.ts} (78%) rename x-pack/plugins/watcher/common/constants/{routes.js => routes.ts} (84%) rename x-pack/plugins/watcher/common/constants/{sort_orders.js => sort_orders.ts} (77%) rename x-pack/plugins/watcher/common/constants/{time_units.js => time_units.ts} (81%) create mode 100644 x-pack/plugins/watcher/common/constants/watch_history.ts delete mode 100644 x-pack/plugins/watcher/common/constants/watch_state_comments.js create mode 100644 x-pack/plugins/watcher/common/constants/watch_state_comments.ts rename x-pack/plugins/watcher/common/constants/{watch_states.js => watch_states.ts} (77%) rename x-pack/plugins/watcher/common/constants/{watch_types.js => watch_types.ts} (77%) create mode 100644 x-pack/plugins/watcher/public/components/delete_watches_modal.tsx create mode 100644 x-pack/plugins/watcher/public/lib/api.ts create mode 100644 x-pack/plugins/watcher/public/lib/manage_angular_lifecycle.js rename x-pack/plugins/watcher/{common/constants/plugin.js => public/models/index.d.ts} (75%) create mode 100644 x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/_index.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/_watch_list.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/watch_list.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/watch_list.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/watch_table.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/watch_table.js create mode 100644 x-pack/plugins/watcher/public/sections/watch_list/index.scss diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 557603eb7d11a5..cc949f1a2c8188 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8117,31 +8117,14 @@ "xpack.watcher.sections.watchHistoryItem.executionOutputLabel": "执行输出:", "xpack.watcher.sections.watchHistoryItem.watchSummary.executionStatusLabel": "执行状态:", "xpack.watcher.sections.watchList.createAdvancedWatchButtonLabel": "创建高级监视", - "xpack.watcher.sections.watchList.createAdvancedWatchTooltip": "以原始 JSON 格式设置定制监视", "xpack.watcher.sections.watchList.createThresholdAlertButtonLabel": "创建阈值告警", - "xpack.watcher.sections.watchList.createThresholdAlertButtonTooltip": "在特定条件下发送告警", - "xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.deleteButtonLabel": "删除 {numWatchesToDelete, plural, one {# 个监视} other {# 个监视}} ", - "xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.descriptionText": "这将永久删除 {numWatchesToDelete, plural, one {# 个监视} other {# 个监视}}。是否确定?", - "xpack.watcher.sections.watchList.deleteSelectedWatchesErrorNotification.descriptionText": "已选的 {numTotal}{numWatchesToDelete, plural, one {# 个监视} other {# 个监视}}有 {numErrors} 个无法删除", - "xpack.watcher.sections.watchList.deleteSelectedWatchesSuccessNotification.descriptionText": "已选的 {numTotal}{numWatchesToDelete, plural, one {# 个监视} other {# 个监视}}有 {numSuccesses} 个已删除", "xpack.watcher.sections.watchList.deleteWatchButtonLabel": "删除", "xpack.watcher.sections.watchList.managementSection.editDisplayName": "编辑", "xpack.watcher.sections.watchList.managementSection.newWatchDisplayName": "新建监视", "xpack.watcher.sections.watchList.managementSection.statusDisplayName": "状态", "xpack.watcher.sections.watchList.managementSection.watcherDisplayName": "Watcher", "xpack.watcher.sections.watchList.managementSection.watchesDisplayName": "监视", - "xpack.watcher.sections.watchList.noPermissionToManageWatchesText": "您无权管理监视。", - "xpack.watcher.sections.watchList.selectedMultipleWatchText": "监视", - "xpack.watcher.sections.watchList.selectedSingleWatchText": "监视", - "xpack.watcher.sections.watchList.watchesNotFoundText": "未找到任何监视。", - "xpack.watcher.sections.watchList.watchTable.commentColumnLabel": "注释", - "xpack.watcher.sections.watchList.watchTable.idColumnLabel": "ID", - "xpack.watcher.sections.watchList.watchTable.lastFiredColumnLabel": "最后发送时间", - "xpack.watcher.sections.watchList.watchTable.lastTriggeredColumnLabel": "最后触发时间", - "xpack.watcher.sections.watchList.watchTable.menuEditButtonLabel": "编辑", "xpack.watcher.sections.watchList.watchTable.menuEditButtonTitle": "编辑", - "xpack.watcher.sections.watchList.watchTable.nameColumnLabel": "名称", - "xpack.watcher.sections.watchList.watchTable.stateColumnLabel": "状态", "xpack.watcher.server.checkLicense.licenseExpiredTextMessage": "您不能使用 {watcher},因为您的 {licenseType} 许可证已过期", "xpack.watcher.thresholdPreviewChart.dataDoesNotExistTextMessage": "您的索引和条件未返回任何数据", "xpack.watcher.thresholdWatchExpression.aggField.itemDescription": "/", diff --git a/x-pack/plugins/watcher/common/constants/action_modes.js b/x-pack/plugins/watcher/common/constants/action_modes.ts similarity index 94% rename from x-pack/plugins/watcher/common/constants/action_modes.js rename to x-pack/plugins/watcher/common/constants/action_modes.ts index 245f237f16efa1..5f703f14b39338 100644 --- a/x-pack/plugins/watcher/common/constants/action_modes.js +++ b/x-pack/plugins/watcher/common/constants/action_modes.ts @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export const ACTION_MODES = { - +export const ACTION_MODES: { [key: string]: string } = { // The action execution will be simulated. For example, The email action will create the email that would have been sent but will not actually send it. In this mode, the action may be throttled if the current state of the watch indicates it should be. SIMULATE: 'simulate', @@ -19,6 +18,5 @@ export const ACTION_MODES = { FORCE_EXECUTE: 'force_execute', // The action will be skipped and won’t be executed nor simulated. Effectively forcing the action to be throttled. - SKIP: 'skip' - + SKIP: 'skip', }; diff --git a/x-pack/plugins/watcher/common/constants/action_states.js b/x-pack/plugins/watcher/common/constants/action_states.ts similarity index 82% rename from x-pack/plugins/watcher/common/constants/action_states.js rename to x-pack/plugins/watcher/common/constants/action_states.ts index e34a5fd37ff3ab..e9501fc2a60c4e 100644 --- a/x-pack/plugins/watcher/common/constants/action_states.js +++ b/x-pack/plugins/watcher/common/constants/action_states.ts @@ -6,36 +6,34 @@ import { i18n } from '@kbn/i18n'; -export const ACTION_STATES = { - +export const ACTION_STATES: { [key: string]: string } = { // Action is not being executed because conditions haven't been met OK: i18n.translate('xpack.watcher.constants.actionStates.okStateText', { - defaultMessage: 'OK' + defaultMessage: 'OK', }), // Action has been acknowledged by user ACKNOWLEDGED: i18n.translate('xpack.watcher.constants.actionStates.acknowledgedStateText', { - defaultMessage: 'Acked' + defaultMessage: 'Acked', }), // Action has been throttled (time-based) by the system THROTTLED: i18n.translate('xpack.watcher.constants.actionStates.throttledStateText', { - defaultMessage: 'Throttled' + defaultMessage: 'Throttled', }), // Action has been completed FIRING: i18n.translate('xpack.watcher.constants.actionStates.firingStateText', { - defaultMessage: 'Firing' + defaultMessage: 'Firing', }), // Action has failed ERROR: i18n.translate('xpack.watcher.constants.actionStates.errorStateText', { - defaultMessage: 'Error' + defaultMessage: 'Error', }), // Action has a configuration error CONFIG_ERROR: i18n.translate('xpack.watcher.constants.actionStates.configErrorStateText', { - defaultMessage: 'Config error' + defaultMessage: 'Config error', }), - }; diff --git a/x-pack/plugins/watcher/common/constants/action_types.js b/x-pack/plugins/watcher/common/constants/action_types.ts similarity index 82% rename from x-pack/plugins/watcher/common/constants/action_types.js rename to x-pack/plugins/watcher/common/constants/action_types.ts index 7b408f0d3a0cc0..3bb0d5748347cc 100644 --- a/x-pack/plugins/watcher/common/constants/action_types.js +++ b/x-pack/plugins/watcher/common/constants/action_types.ts @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export const ACTION_TYPES = { - +export const ACTION_TYPES: { [key: string]: string } = { EMAIL: 'email', WEBHOOK: 'webhook', @@ -22,6 +21,5 @@ export const ACTION_TYPES = { PAGERDUTY: 'pagerduty', - UNKNOWN: 'unknown/invalid' - + UNKNOWN: 'unknown/invalid', }; diff --git a/x-pack/plugins/watcher/common/constants/agg_types.js b/x-pack/plugins/watcher/common/constants/agg_types.ts similarity index 82% rename from x-pack/plugins/watcher/common/constants/agg_types.js rename to x-pack/plugins/watcher/common/constants/agg_types.ts index 3f53a36e89127d..1a0f78c33111c6 100644 --- a/x-pack/plugins/watcher/common/constants/agg_types.js +++ b/x-pack/plugins/watcher/common/constants/agg_types.ts @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export const AGG_TYPES = { - +export const AGG_TYPES: { [key: string]: string } = { COUNT: 'count', AVERAGE: 'avg', @@ -14,6 +13,5 @@ export const AGG_TYPES = { MIN: 'min', - MAX: 'max' - + MAX: 'max', }; diff --git a/x-pack/plugins/watcher/common/constants/comparators.js b/x-pack/plugins/watcher/common/constants/comparators.ts similarity index 78% rename from x-pack/plugins/watcher/common/constants/comparators.js rename to x-pack/plugins/watcher/common/constants/comparators.ts index 69009b2f604b6a..4a27b7e275b65e 100644 --- a/x-pack/plugins/watcher/common/constants/comparators.js +++ b/x-pack/plugins/watcher/common/constants/comparators.ts @@ -4,10 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -export const COMPARATORS = { - +export const COMPARATORS: { [key: string]: string } = { GREATER_THAN: '>', - LESS_THAN: '<' - + LESS_THAN: '<', }; diff --git a/x-pack/plugins/watcher/common/constants/error_codes.js b/x-pack/plugins/watcher/common/constants/error_codes.ts similarity index 85% rename from x-pack/plugins/watcher/common/constants/error_codes.js rename to x-pack/plugins/watcher/common/constants/error_codes.ts index 2fa875549358f2..f5433ebb576e69 100644 --- a/x-pack/plugins/watcher/common/constants/error_codes.js +++ b/x-pack/plugins/watcher/common/constants/error_codes.ts @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export const ERROR_CODES = { - +export const ERROR_CODES: { [key: string]: string } = { // Property missing on object ERR_PROP_MISSING: 'ERR_PROP_MISSING', }; diff --git a/x-pack/plugins/watcher/common/constants/es_scroll_settings.js b/x-pack/plugins/watcher/common/constants/es_scroll_settings.ts similarity index 77% rename from x-pack/plugins/watcher/common/constants/es_scroll_settings.js rename to x-pack/plugins/watcher/common/constants/es_scroll_settings.ts index 25bdcca565ee9c..a51a7b117eea69 100644 --- a/x-pack/plugins/watcher/common/constants/es_scroll_settings.js +++ b/x-pack/plugins/watcher/common/constants/es_scroll_settings.ts @@ -4,11 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -export const ES_SCROLL_SETTINGS = { - +export const ES_SCROLL_SETTINGS: { + KEEPALIVE: string; + PAGE_SIZE: number; +} = { // How long to keep a scroll alive KEEPALIVE: '30s', // How many results to return per scroll response - PAGE_SIZE: 100 + PAGE_SIZE: 100, }; diff --git a/x-pack/plugins/watcher/common/constants/index.js b/x-pack/plugins/watcher/common/constants/index.ts similarity index 100% rename from x-pack/plugins/watcher/common/constants/index.js rename to x-pack/plugins/watcher/common/constants/index.ts diff --git a/x-pack/plugins/watcher/common/constants/index_names.js b/x-pack/plugins/watcher/common/constants/index_names.ts similarity index 84% rename from x-pack/plugins/watcher/common/constants/index_names.js rename to x-pack/plugins/watcher/common/constants/index_names.ts index 663d932fbe1337..b9ca85963a33da 100644 --- a/x-pack/plugins/watcher/common/constants/index_names.js +++ b/x-pack/plugins/watcher/common/constants/index_names.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export const INDEX_NAMES = { +export const INDEX_NAMES: { [key: string]: string } = { WATCHES: '.watches', WATCHER_HISTORY: '.watcher-history-*', }; diff --git a/x-pack/plugins/watcher/common/constants/lists.js b/x-pack/plugins/watcher/common/constants/lists.ts similarity index 74% rename from x-pack/plugins/watcher/common/constants/lists.js rename to x-pack/plugins/watcher/common/constants/lists.ts index da89b99f828baa..1224b279f4816a 100644 --- a/x-pack/plugins/watcher/common/constants/lists.js +++ b/x-pack/plugins/watcher/common/constants/lists.ts @@ -5,6 +5,6 @@ */ // Durations are in ms -export const LISTS = { - NEW_ITEMS_HIGHLIGHT_DURATION: 1 * 1000 +export const LISTS: { [key: string]: number } = { + NEW_ITEMS_HIGHLIGHT_DURATION: 1 * 1000, }; diff --git a/x-pack/plugins/watcher/common/constants/pagination.js b/x-pack/plugins/watcher/common/constants/pagination.ts similarity index 77% rename from x-pack/plugins/watcher/common/constants/pagination.js rename to x-pack/plugins/watcher/common/constants/pagination.ts index fd44ffdecfc3b5..8ae9d769831c56 100644 --- a/x-pack/plugins/watcher/common/constants/pagination.js +++ b/x-pack/plugins/watcher/common/constants/pagination.ts @@ -4,6 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -export const PAGINATION = { - PAGE_SIZE: 20 +export const PAGINATION: { [key: string]: number } = { + PAGE_SIZE: 20, }; diff --git a/x-pack/plugins/watcher/common/constants/watch_history.js b/x-pack/plugins/watcher/common/constants/plugin.ts similarity index 78% rename from x-pack/plugins/watcher/common/constants/watch_history.js rename to x-pack/plugins/watcher/common/constants/plugin.ts index 3fad569ab7878b..118e6424679388 100644 --- a/x-pack/plugins/watcher/common/constants/watch_history.js +++ b/x-pack/plugins/watcher/common/constants/plugin.ts @@ -4,6 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -export const WATCH_HISTORY = { - INITIAL_RANGE: 'now-1h' +export const PLUGIN: { [key: string]: string } = { + ID: 'watcher', }; diff --git a/x-pack/plugins/watcher/common/constants/refresh_intervals.js b/x-pack/plugins/watcher/common/constants/refresh_intervals.ts similarity index 78% rename from x-pack/plugins/watcher/common/constants/refresh_intervals.js rename to x-pack/plugins/watcher/common/constants/refresh_intervals.ts index 1aff358bcd636e..db1daa865c3234 100644 --- a/x-pack/plugins/watcher/common/constants/refresh_intervals.js +++ b/x-pack/plugins/watcher/common/constants/refresh_intervals.ts @@ -7,8 +7,8 @@ // In milliseconds const SIXTY_SECONDS = 60 * 1000; -export const REFRESH_INTERVALS = { +export const REFRESH_INTERVALS: { [key: string]: number } = { WATCH_LIST: SIXTY_SECONDS, WATCH_HISTORY: SIXTY_SECONDS, - WATCH_VISUALIZATION: SIXTY_SECONDS + WATCH_VISUALIZATION: SIXTY_SECONDS, }; diff --git a/x-pack/plugins/watcher/common/constants/routes.js b/x-pack/plugins/watcher/common/constants/routes.ts similarity index 84% rename from x-pack/plugins/watcher/common/constants/routes.js rename to x-pack/plugins/watcher/common/constants/routes.ts index 97ae0ee6de181c..73a1824c507da4 100644 --- a/x-pack/plugins/watcher/common/constants/routes.js +++ b/x-pack/plugins/watcher/common/constants/routes.ts @@ -4,6 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -export const ROUTES = { +export const ROUTES: { [key: string]: string } = { API_ROOT: '/api/watcher', }; diff --git a/x-pack/plugins/watcher/common/constants/sort_orders.js b/x-pack/plugins/watcher/common/constants/sort_orders.ts similarity index 77% rename from x-pack/plugins/watcher/common/constants/sort_orders.js rename to x-pack/plugins/watcher/common/constants/sort_orders.ts index 062941929ddc68..c73d458a3018ff 100644 --- a/x-pack/plugins/watcher/common/constants/sort_orders.js +++ b/x-pack/plugins/watcher/common/constants/sort_orders.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export const SORT_ORDERS = { +export const SORT_ORDERS: { [key: string]: string } = { ASCENDING: 'asc', - DESCENDING: 'desc' + DESCENDING: 'desc', }; diff --git a/x-pack/plugins/watcher/common/constants/time_units.js b/x-pack/plugins/watcher/common/constants/time_units.ts similarity index 81% rename from x-pack/plugins/watcher/common/constants/time_units.js rename to x-pack/plugins/watcher/common/constants/time_units.ts index ea63c21e222133..c861d47416a804 100644 --- a/x-pack/plugins/watcher/common/constants/time_units.js +++ b/x-pack/plugins/watcher/common/constants/time_units.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -export const TIME_UNITS = { +export const TIME_UNITS: { [key: string]: string } = { SECOND: 's', MINUTE: 'm', HOUR: 'h', - DAY: 'd' + DAY: 'd', }; diff --git a/x-pack/plugins/watcher/common/constants/watch_history.ts b/x-pack/plugins/watcher/common/constants/watch_history.ts new file mode 100644 index 00000000000000..520fe1019c8c30 --- /dev/null +++ b/x-pack/plugins/watcher/common/constants/watch_history.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export const WATCH_HISTORY: { [key: string]: string } = { + INITIAL_RANGE: 'now-1h', +}; diff --git a/x-pack/plugins/watcher/common/constants/watch_state_comments.js b/x-pack/plugins/watcher/common/constants/watch_state_comments.js deleted file mode 100644 index cfa4d93d8a1400..00000000000000 --- a/x-pack/plugins/watcher/common/constants/watch_state_comments.js +++ /dev/null @@ -1,33 +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 { i18n } from '@kbn/i18n'; - -export const WATCH_STATE_COMMENTS = { - - OK: '', - - PARTIALLY_THROTTLED: i18n.translate('xpack.watcher.constants.watchStateComments.partiallyThrottledStateCommentText', { - defaultMessage: 'Partially Throttled' - }), - - THROTTLED: i18n.translate('xpack.watcher.constants.watchStateComments.throttledStateCommentText', { - defaultMessage: 'Throttled' - }), - - PARTIALLY_ACKNOWLEDGED: i18n.translate('xpack.watcher.constants.watchStateComments.partiallyAcknowledgedStateCommentText', { - defaultMessage: 'Partially Acked' - }), - - ACKNOWLEDGED: i18n.translate('xpack.watcher.constants.watchStateComments.acknowledgedStateCommentText', { - defaultMessage: 'Acked' - }), - - FAILING: i18n.translate('xpack.watcher.constants.watchStateComments.executionFailingStateCommentText', { - defaultMessage: 'Execution Failing' - }), - -}; diff --git a/x-pack/plugins/watcher/common/constants/watch_state_comments.ts b/x-pack/plugins/watcher/common/constants/watch_state_comments.ts new file mode 100644 index 00000000000000..c88425c7c1616e --- /dev/null +++ b/x-pack/plugins/watcher/common/constants/watch_state_comments.ts @@ -0,0 +1,46 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const WATCH_STATE_COMMENTS: { [key: string]: string } = { + OK: '', + + PARTIALLY_THROTTLED: i18n.translate( + 'xpack.watcher.constants.watchStateComments.partiallyThrottledStateCommentText', + { + defaultMessage: 'Partially throttled', + } + ), + + THROTTLED: i18n.translate( + 'xpack.watcher.constants.watchStateComments.throttledStateCommentText', + { + defaultMessage: 'Throttled', + } + ), + + PARTIALLY_ACKNOWLEDGED: i18n.translate( + 'xpack.watcher.constants.watchStateComments.partiallyAcknowledgedStateCommentText', + { + defaultMessage: 'Partially acked', + } + ), + + ACKNOWLEDGED: i18n.translate( + 'xpack.watcher.constants.watchStateComments.acknowledgedStateCommentText', + { + defaultMessage: 'Acked', + } + ), + + FAILING: i18n.translate( + 'xpack.watcher.constants.watchStateComments.executionFailingStateCommentText', + { + defaultMessage: 'Execution failing', + } + ), +}; diff --git a/x-pack/plugins/watcher/common/constants/watch_states.js b/x-pack/plugins/watcher/common/constants/watch_states.ts similarity index 77% rename from x-pack/plugins/watcher/common/constants/watch_states.js rename to x-pack/plugins/watcher/common/constants/watch_states.ts index 1c546139b688c3..6215b492975cfe 100644 --- a/x-pack/plugins/watcher/common/constants/watch_states.js +++ b/x-pack/plugins/watcher/common/constants/watch_states.ts @@ -6,26 +6,24 @@ import { i18n } from '@kbn/i18n'; -export const WATCH_STATES = { - +export const WATCH_STATES: { [key: string]: string } = { DISABLED: i18n.translate('xpack.watcher.constants.watchStates.disabledStateText', { - defaultMessage: 'Disabled' + defaultMessage: 'Disabled', }), OK: i18n.translate('xpack.watcher.constants.watchStates.okStateText', { - defaultMessage: 'OK' + defaultMessage: 'OK', }), FIRING: i18n.translate('xpack.watcher.constants.watchStates.firingStateText', { - defaultMessage: 'Firing' + defaultMessage: 'Firing', }), ERROR: i18n.translate('xpack.watcher.constants.watchStates.errorStateText', { - defaultMessage: 'Error!' + defaultMessage: 'Error', }), CONFIG_ERROR: i18n.translate('xpack.watcher.constants.watchStates.configErrorStateText', { - defaultMessage: 'Config error' + defaultMessage: 'Config error', }), - }; diff --git a/x-pack/plugins/watcher/common/constants/watch_types.js b/x-pack/plugins/watcher/common/constants/watch_types.ts similarity index 77% rename from x-pack/plugins/watcher/common/constants/watch_types.js rename to x-pack/plugins/watcher/common/constants/watch_types.ts index 51e89a19b6ca0d..f0ebd3efc40782 100644 --- a/x-pack/plugins/watcher/common/constants/watch_types.js +++ b/x-pack/plugins/watcher/common/constants/watch_types.ts @@ -4,12 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -export const WATCH_TYPES = { - +export const WATCH_TYPES: { [key: string]: string } = { JSON: 'json', THRESHOLD: 'threshold', - MONITORING: 'monitoring' - + MONITORING: 'monitoring', }; diff --git a/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx new file mode 100644 index 00000000000000..2ac41c159e3546 --- /dev/null +++ b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { toastNotifications } from 'ui/notify'; +import { deleteWatches } from '../lib/api'; + +export const DeleteWatchesModal = ({ + watchesToDelete, + callback, +}: { + watchesToDelete: string[]; + callback: (deleted?: string[]) => void; +}) => { + const numWatchesToDelete = watchesToDelete.length; + if (!numWatchesToDelete) { + return null; + } + const confirmModalText = i18n.translate( + 'xpack.watcher.deleteSelectedWatchesConfirmModal.descriptionText', + { + defaultMessage: + 'This will permanently delete {numWatchesToDelete, plural, one {a watch} other {# watches}}. Are you sure?', + values: { numWatchesToDelete }, + } + ); + const confirmButtonText = i18n.translate( + 'xpack.watcher.deleteSelectedWatchesConfirmModal.deleteButtonLabel', + { + defaultMessage: 'Delete {numWatchesToDelete, plural, one {watch} other {# watches}} ', + values: { numWatchesToDelete }, + } + ); + const cancelButtonText = i18n.translate( + 'xpack.watcher.deleteSelectedWatchesConfirmModal.cancelButtonLabel', + { + defaultMessage: 'Cancel', + } + ); + return ( + + callback()} + onConfirm={async () => { + const { successes, errors } = await deleteWatches(watchesToDelete); + const numSuccesses = successes.length; + const numErrors = errors.length; + callback(successes); + if (numSuccesses > 0) { + toastNotifications.addSuccess( + i18n.translate( + 'xpack.watcher.sections.watchList.deleteSelectedWatchesSuccessNotification.descriptionText', + { + defaultMessage: + 'Deleted {numWatchesToDelete, plural, one {watch} other {{numSuccesses} out of # selected watches}} ', + values: { numSuccesses, numWatchesToDelete }, + } + ) + ); + } + + if (numErrors > 0) { + toastNotifications.addDanger( + i18n.translate( + 'xpack.watcher.sections.watchList.deleteSelectedWatchesErrorNotification.descriptionText', + { + defaultMessage: + "Couldn't delete {numWatchesToDelete, plural, one {watch} other {{numErrors} out of # selected watches}}", + values: { numErrors, numWatchesToDelete }, + } + ) + ); + } + }} + cancelButtonText={cancelButtonText} + confirmButtonText={confirmButtonText} + > + {confirmModalText} + + + ); +}; diff --git a/x-pack/plugins/watcher/public/index.scss b/x-pack/plugins/watcher/public/index.scss index b66733cc06c7e2..ebf042c7cbd1c4 100644 --- a/x-pack/plugins/watcher/public/index.scss +++ b/x-pack/plugins/watcher/public/index.scss @@ -26,4 +26,4 @@ @import 'sections/watch_edit/components/watch_edit_detail/index'; @import 'sections/watch_edit/components/watch_edit_execute_detail/index'; @import 'sections/watch_edit/components/watch_edit_title_panel/index'; -@import 'sections/watch_list/components/watch_list/index'; +@import 'sections/watch_list/index'; diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts new file mode 100644 index 00000000000000..e93adf6f71b2ad --- /dev/null +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -0,0 +1,33 @@ +/* + * 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 { Watch } from 'plugins/watcher/models/watch'; +import chrome from 'ui/chrome'; +import { ROUTES } from '../../common/constants'; +let httpClient: ng.IHttpService; +export const setHttpClient = (anHttpClient: ng.IHttpService) => { + httpClient = anHttpClient; +}; +export const getHttpClient = () => { + return httpClient; +}; +const basePath = chrome.addBasePath(ROUTES.API_ROOT); +export const fetchWatches = async () => { + const { + data: { watches }, + } = await getHttpClient().get(`${basePath}/watches`); + return watches.map((watch: any) => { + return Watch.fromUpstreamJson(watch); + }); +}; +export const deleteWatches = async (watchIds: string[]) => { + const body = { + watchIds, + }; + const { + data: { results }, + } = await getHttpClient().post(`${basePath}/watches/delete`, body); + return results; +}; diff --git a/x-pack/plugins/watcher/public/lib/manage_angular_lifecycle.js b/x-pack/plugins/watcher/public/lib/manage_angular_lifecycle.js new file mode 100644 index 00000000000000..3813e632a0a738 --- /dev/null +++ b/x-pack/plugins/watcher/public/lib/manage_angular_lifecycle.js @@ -0,0 +1,23 @@ +/* + * 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 { unmountComponentAtNode } from 'react-dom'; + +export const manageAngularLifecycle = ($scope, $route, elem) => { + const lastRoute = $route.current; + + const deregister = $scope.$on('$locationChangeSuccess', () => { + const currentRoute = $route.current; + if (lastRoute.$$route.template === currentRoute.$$route.template) { + $route.current = lastRoute; + } + }); + + $scope.$on('$destroy', () => { + deregister && deregister(); + elem && unmountComponentAtNode(elem); + }); +}; diff --git a/x-pack/plugins/watcher/common/constants/plugin.js b/x-pack/plugins/watcher/public/models/index.d.ts similarity index 75% rename from x-pack/plugins/watcher/common/constants/plugin.js rename to x-pack/plugins/watcher/public/models/index.d.ts index bcff9278630192..81787a375d44e3 100644 --- a/x-pack/plugins/watcher/common/constants/plugin.js +++ b/x-pack/plugins/watcher/public/models/index.d.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - -export const PLUGIN = { - ID: 'watcher' -}; +declare module 'plugins/watcher/models/watch' { + export const Watch: any; +} diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx new file mode 100644 index 00000000000000..45437a5485c9c7 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -0,0 +1,269 @@ +/* + * 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 React, { useEffect, useState } from 'react'; + +import { + EuiButton, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiInMemoryTable, + EuiLink, + EuiPageContent, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; +import { Moment } from 'moment'; +import { REFRESH_INTERVALS, WATCH_STATES } from '../../../../common/constants'; +import { DeleteWatchesModal } from '../../../components/delete_watches_modal'; +import { fetchWatches } from '../../../lib/api'; + +const stateToIcon: { [key: string]: JSX.Element } = { + [WATCH_STATES.OK]: , + [WATCH_STATES.DISABLED]: , + [WATCH_STATES.FIRING]: , + [WATCH_STATES.ERROR]: , + [WATCH_STATES.CONFIG_ERROR]: , +}; + +const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { + // hooks + const [isWatchesLoading, setIsWatchesLoading] = useState(true); + const [watchesToDelete, setWatchesToDelete] = useState([]); + const [watches, setWatches] = useState([]); + const [selection, setSelection] = useState([]); + const loadWatches = async () => { + const loadedWatches = await fetchWatches(); + setWatches(loadedWatches); + setIsWatchesLoading(false); + }; + useEffect(() => { + loadWatches(); + const refreshIntervalId = setInterval(loadWatches, REFRESH_INTERVALS.WATCH_LIST); + return () => { + clearInterval(refreshIntervalId); + }; + }, []); + const columns = [ + { + field: 'id', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.idHeader', { + defaultMessage: 'ID', + }), + sortable: true, + truncateText: true, + render: (id: string) => { + return ( + + {id} + + ); + }, + }, + { + field: 'name', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.nameHeader', { + defaultMessage: 'Name', + }), + render: (name: string, item: any) => { + return {name}; + }, + sortable: true, + truncateText: true, + }, + { + field: 'watchStatus.state', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.stateHeader', { + defaultMessage: 'State', + }), + sortable: true, + render: (state: string) => { + return ( + + {stateToIcon[state]} + + {state} + + + ); + }, + }, + { + field: 'watchStatus.comment', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.commentHeader', { + defaultMessage: 'Comment', + }), + sortable: true, + truncateText: true, + }, + { + field: 'watchStatus.lastMetCondition', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.lastFiredHeader', { + defaultMessage: 'Last fired', + }), + sortable: true, + truncateText: true, + render: (lastMetCondition: Moment) => { + return lastMetCondition ? lastMetCondition.fromNow() : lastMetCondition; + }, + }, + { + field: 'watchStatus.lastChecked', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.lastTriggeredHeader', { + defaultMessage: 'Last triggered', + }), + sortable: true, + truncateText: true, + render: (lastChecked: Moment) => { + return lastChecked ? lastChecked.fromNow() : lastChecked; + }, + }, + { + actions: [ + { + render: (watch: any) => { + const disabled = watch.isSystemWatch; + return ( + + + + ); + }, + }, + ], + }, + ]; + const selectionConfig = { + onSelectionChange: setSelection, + }; + const pagination = { + initialPageSize: 10, + pageSizeOptions: [10, 50, 100], + }; + const searchConfig = { + box: { + incremental: true, + }, + toolsRight: ( + { + setWatchesToDelete(selection.map((selected: any) => selected.id)); + }} + color="danger" + disabled={!selection.length} + > + + + ), + }; + return ( + + { + if (deleted) { + setWatches( + watches.filter((watch: any) => { + return !deleted.includes(watch.id); + }) + ); + } + setWatchesToDelete([]); + }} + watchesToDelete={watchesToDelete} + /> + + + +

+ +

+
+ + +

+ +

+
+
+
+ + + + + + + + + + + + + + + + + } + /> +
+ ); +}; +export const WatchList = injectI18n(WatchListUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/_index.scss b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/_index.scss deleted file mode 100644 index 068a77f2e54b28..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './watch_list'; diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/_watch_list.scss b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/_watch_list.scss deleted file mode 100644 index c26daaee9a08ce..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/_watch_list.scss +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 1. Watch list width collapses without this. - */ -.watcherWatchList { - width: 100%; /* 1 */ -} diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/index.js b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/index.js deleted file mode 100644 index 1097bb146ff053..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/index.js +++ /dev/null @@ -1,7 +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 './watch_list'; diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/watch_list.html b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/watch_list.html deleted file mode 100644 index e0fc117fa0c5c0..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/watch_list.html +++ /dev/null @@ -1,121 +0,0 @@ - -
- - {{ 'xpack.watcher.sections.watchList.noPermissionToManageWatchesText' | i18n: { defaultMessage: 'You do not have permission to manage watches.' } }} - - -
-

- Watcher -

-
-

-
-
-
- - - -
- -
- -
-
-
- -
- -
- -
- -
- - -
-
- - - - - - {{ 'xpack.watcher.sections.watchList.watchesNotFoundText' | i18n: { defaultMessage: 'No watches found.' } }} - - -
-
- -
- -
- - -
-
-
-
-
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/watch_list.js b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/watch_list.js deleted file mode 100644 index 548581ea6be7a5..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list/watch_list.js +++ /dev/null @@ -1,210 +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 { uiModules } from 'ui/modules'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import { toastNotifications } from 'ui/notify'; -import template from './watch_list.html'; -import '../watch_table'; -import { PAGINATION, REFRESH_INTERVALS, WATCH_TYPES } from 'plugins/watcher/../common/constants'; -import 'ui/pager_control'; -import 'ui/pager'; -import 'ui/react_components'; -import 'ui/table_info'; -import 'plugins/watcher/components/tool_bar_selected_count'; -import 'plugins/watcher/components/forbidden_message'; -import 'plugins/watcher/services/watches'; -import 'plugins/watcher/services/license'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchList', function ($injector, i18n) { - const pagerFactory = $injector.get('pagerFactory'); - const watchesService = $injector.get('xpackWatcherWatchesService'); - const licenseService = $injector.get('xpackWatcherLicenseService'); - const confirmModal = $injector.get('confirmModal'); - const $interval = $injector.get('$interval'); - const kbnUrl = $injector.get('kbnUrl'); - - const $filter = $injector.get('$filter'); - const filter = $filter('filter'); - const orderBy = $filter('orderBy'); - const limitTo = $filter('limitTo'); - - return { - restrict: 'E', - template: template, - scope: { - watches: '=' - }, - bindToController: true, - controllerAs: 'watchList', - controller: class WatchListController extends InitAfterBindingsWorkaround { - initAfterBindings($scope) { - this.forbidden = false; - - //The initial load from watch_list_route will return null on a 403 error - if (this.watches === null) { - this.watches = []; - this.forbidden = true; - } - - this.selectedWatches = []; - this.pageOfWatches = []; - this.sortField = 'id'; - this.sortReverse = false; - - this.pager = pagerFactory.create(this.watches.length, PAGINATION.PAGE_SIZE, 1); - - // Reload watches periodically - const refreshInterval = $interval(() => this.loadWatches(), REFRESH_INTERVALS.WATCH_LIST); - $scope.$on('$destroy', () => $interval.cancel(refreshInterval)); - - // react to watch and ui changes - $scope.$watchMulti([ - 'watchList.watches', - 'watchList.sortField', - 'watchList.sortReverse', - 'watchList.query', - 'watchList.pager.currentPage' - ], this.applyFilters); - } - - get hasPageOfWatches() { - return this.pageOfWatches.length > 0; - } - - get hasSelectedWatches() { - return this.selectedWatches.length > 0; - } - - loadWatches = () => { - watchesService.getWatchList() - .then(watches => { - this.watches = watches; - this.forbidden = false; - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => { - if (err.status === 403) { - this.forbidden = true; - } else { - toastNotifications.addDanger(err.data.message); - } - }); - }); - } - - onQueryChange = (query) => { - this.query = query; - }; - - onPageNext = () => { - this.pager.nextPage(); - }; - - onPagePrevious = () => { - this.pager.previousPage(); - }; - - onSortChange = (field, reverse) => { - this.sortField = field; - this.sortReverse = reverse; - }; - - onSelectedChange = (selectedWatches) => { - this.selectedWatches = selectedWatches; - }; - - onClickCreateThresholdAlert = () => { - this.goToWatchWizardForType(WATCH_TYPES.THRESHOLD); - }; - - onClickCreateAdvancedWatch = () => { - this.goToWatchWizardForType(WATCH_TYPES.JSON); - }; - - goToWatchWizardForType = (watchType) => { - const url = `management/elasticsearch/watcher/watches/new-watch/${watchType}`; - kbnUrl.change(url, {}); - }; - - onSelectedWatchesDelete = () => { - const watchesBeingDeleted = this.selectedWatches; - const numWatchesToDelete = watchesBeingDeleted.length; - - const confirmModalText = i18n('xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.descriptionText', { - defaultMessage: 'This will permanently delete {numWatchesToDelete, plural, one {# Watch} other {# Watches}}. Are you sure?', - values: { numWatchesToDelete } - }); - const confirmButtonText = i18n('xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.deleteButtonLabel', { - defaultMessage: 'Delete {numWatchesToDelete, plural, one {# Watch} other {# Watches}} ', - values: { numWatchesToDelete } - }); - - const confirmModalOptions = { - confirmButtonText, - onConfirm: () => this.deleteSelectedWatches(watchesBeingDeleted) - }; - - return confirmModal(confirmModalText, confirmModalOptions); - }; - - deleteSelectedWatches = (watchesBeingDeleted) => { - this.watchesBeingDeleted = watchesBeingDeleted; - - const numWatchesToDelete = this.watchesBeingDeleted.length; - - const watchIds = this.watchesBeingDeleted.map(watch => watch.id); - return watchesService.deleteWatches(watchIds) - .then(results => { - const numSuccesses = results.numSuccesses; - const numErrors = results.numErrors; - const numTotal = numWatchesToDelete; - - if (numSuccesses > 0) { - toastNotifications.addSuccess( - i18n('xpack.watcher.sections.watchList.deleteSelectedWatchesSuccessNotification.descriptionText', { - defaultMessage: - 'Deleted {numSuccesses} out of {numTotal} selected {numWatchesToDelete, plural, one {# watch} other {# watches}}', - values: { numSuccesses, numTotal, numWatchesToDelete } - }) - ); - } - - if (numErrors > 0) { - toastNotifications.addError( - i18n('xpack.watcher.sections.watchList.deleteSelectedWatchesErrorNotification.descriptionText', { - defaultMessage: - 'Couldn\'t delete {numErrors} out of {numTotal} selected {numWatchesToDelete, plural, one {# watch} other {# watches}}', - values: { numErrors, numTotal, numWatchesToDelete } - }) - ); - } - - this.loadWatches(); - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => toastNotifications.addDanger(err.data.message)); - }); - } - - applyFilters = () => { - let filteredWatches = this.watches; - let pageOfWatches = []; - - filteredWatches = filter(filteredWatches, { searchValue: this.query }); - filteredWatches = orderBy(filteredWatches, this.sortField, this.sortReverse); - pageOfWatches = limitTo(filteredWatches, this.pager.pageSize, this.pager.startIndex); - - this.pageOfWatches = pageOfWatches; - this.pager.setTotalItems(filteredWatches.length); - }; - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/index.js b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/index.js deleted file mode 100644 index cb748ea0489617..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/index.js +++ /dev/null @@ -1,7 +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 './watch_table'; diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/watch_table.html b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/watch_table.html deleted file mode 100644 index b4c0adb60435d9..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/watch_table.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - {{ 'xpack.watcher.sections.watchList.watchTable.idColumnLabel' | i18n: { defaultMessage: 'ID' } }} - - - - {{ 'xpack.watcher.sections.watchList.watchTable.nameColumnLabel' | i18n: { defaultMessage: 'Name' } }} - - - - {{ 'xpack.watcher.sections.watchList.watchTable.stateColumnLabel' | i18n: { defaultMessage: 'State' } }} - - - - {{ 'xpack.watcher.sections.watchList.watchTable.commentColumnLabel' | i18n: { defaultMessage: 'Comment' } }} - - - - {{ 'xpack.watcher.sections.watchList.watchTable.lastFiredColumnLabel' | i18n: { defaultMessage: 'Last Fired' } }} - - - - {{ 'xpack.watcher.sections.watchList.watchTable.lastTriggeredColumnLabel' | i18n: { defaultMessage: 'Last Triggered' } }} - -
-
- -
-
-
- - - {{item.watch.id}} - - - {{item.watch.id}} - - -
-
-
- - {{item.watch.name}} - -
-
-
- - - {{ item.watch.watchStatus.state }} - -
-
-
- - {{item.watch.watchStatus.comment}} - -
-
-
- - - {{item.watch.watchStatus.lastFiredHumanized}} - - -
-
-
- - - {{item.watch.watchStatus.lastCheckedHumanized}} - - -
-
-
- -
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/watch_table.js b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/watch_table.js deleted file mode 100644 index f442b5f8447f4e..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_table/watch_table.js +++ /dev/null @@ -1,89 +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 _ from 'lodash'; -import { uiModules } from 'ui/modules'; -import 'ui/check_box'; -import 'ui/sortable_column'; -import template from './watch_table.html'; -import 'plugins/watcher/components/watch_state_icon'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchTable', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watches: '=', - watchesBeingDeleted: '=', - sortField: '=', - sortReverse: '=', - onSortChange: '=', - onSelectChange: '=' - }, - controllerAs: 'watchTable', - bindToController: true, - controller: class WatchTableController { - constructor($scope) { - this.allSelected = false; - - $scope.$watch('watchTable.watches', (watches) => { - const previousItems = this.items; - - this.items = _.map(watches, (watch) => { - const matchedItem = _.find(previousItems, previousItem => previousItem.watch.id === watch.id); - const selected = Boolean(_.get(matchedItem, 'selected')); - return { watch: watch, selected: selected }; - }); - this.editableItems = this.items.filter(item => this.isEditable(item)); - this.updateSelectedWatches(); - }); - - $scope.$watch('watchTable.watchesBeingDeleted', watches => { - this.items.forEach(item => { - const matchedItem = _.find(watches, watch => watch.id === item.watch.id); - item.selected = false; - item.isBeingDeleted = Boolean(matchedItem); - }); - this.editableItems = this.items.filter(item => this.isEditable(item)); - this.updateSelectedWatches(); - }); - } - - onAllSelectedChange = (itemId, allSelected) => { - _.forEach(this.editableItems, item => { - item.selected = allSelected; - }); - this.updateSelectedWatches(); - }; - - onWatchSelectedChange = (watchId, selected) => { - _.find(this.items, item => item.watch.id === watchId).selected = selected; - this.updateSelectedWatches(); - }; - - updateSelectedWatches = () => { - const selectedItems = _.filter(this.items, item => item.selected); - const selectedWatches = _.map(selectedItems, item => item.watch); - - const areAllEditableItemsSelected = selectedWatches.length === this.editableItems.length; - this.allSelected = areAllEditableItemsSelected && this.editableItems.length > 0; - - this.onSelectChange(selectedWatches); - }; - - isEditable = (item) => { - return !item.watch.isSystemWatch && !item.isBeingDeleted; - } - - areAnyEditable = () => { - return this.editableItems.length !== 0; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_list/index.scss b/x-pack/plugins/watcher/public/sections/watch_list/index.scss new file mode 100644 index 00000000000000..d46f170c06b491 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_list/index.scss @@ -0,0 +1,6 @@ +/** + * 1. Prevent inherited flexbox layout from compressing this element on IE. + */ +.watchState__message { + flex-basis: auto !important; /* 1 */ +} diff --git a/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.html b/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.html index ce7b6a2e892dd4..13203e912b3706 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.html +++ b/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.html @@ -1 +1,4 @@ - + +
+
+ diff --git a/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.js b/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.js index 822ac71eaebfc9..e171e0bf336444 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.js +++ b/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.js @@ -3,61 +3,57 @@ * 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 from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; import routes from 'ui/routes'; import { management } from 'ui/management'; -import { toastNotifications } from 'ui/notify'; import template from './watch_list_route.html'; -import './components/watch_list'; import 'plugins/watcher/services/license'; import { getWatchListBreadcrumbs } from '../../lib/breadcrumbs'; +import { WatchList } from './components/watch_list'; +import { setHttpClient } from '../../lib/api'; +import { I18nContext } from 'ui/i18n'; +import { manageAngularLifecycle } from '../../lib/manage_angular_lifecycle'; -routes - .when('/management/elasticsearch/watcher/', { - redirectTo: '/management/elasticsearch/watcher/watches/' - }); - -routes - .when('/management/elasticsearch/watcher/watches/', { - template: template, - controller: class WatchListRouteController { - constructor($injector) { - const $route = $injector.get('$route'); - this.watches = $route.current.locals.watches; - } - }, - controllerAs: 'watchListRoute', - k7Breadcrumbs: getWatchListBreadcrumbs, - resolve: { - watches: ($injector) => { - const watchesService = $injector.get('xpackWatcherWatchesService'); - const licenseService = $injector.get('xpackWatcherLicenseService'); - const kbnUrl = $injector.get('kbnUrl'); - - return watchesService.getWatchList() - .catch(err => { - return licenseService.checkValidity() - .then(() => { - if (err.status === 403) { - return null; - } +let elem; +const renderReact = async elem => { + render( + + + , + elem + ); +}; +routes.when('/management/elasticsearch/watcher/', { + redirectTo: '/management/elasticsearch/watcher/watches/', +}); - toastNotifications.addDanger(err.data.message); - kbnUrl.redirect('/management'); - return Promise.reject(); - }); - }); - }, - checkLicense: ($injector) => { - const licenseService = $injector.get('xpackWatcherLicenseService'); - return licenseService.checkValidity(); - } +routes.when('/management/elasticsearch/watcher/watches/', { + template, + controller: class WatchListRouteController { + constructor($injector, $scope, $http) { + const $route = $injector.get('$route'); + this.watches = $route.current.locals.watches; + // clean up previously rendered React app if one exists + // this happens because of React Router redirects + elem && unmountComponentAtNode(elem); + // NOTE: We depend upon Angular's $http service because it's decorated with interceptors, + // e.g. to check license status per request. + setHttpClient($http); + $scope.$$postDigest(() => { + elem = document.getElementById('watchListReactRoot'); + renderReact(elem); + manageAngularLifecycle($scope, $route, elem); + }); } - }); + }, + controllerAs: 'watchListRoute', + k7Breadcrumbs: getWatchListBreadcrumbs, +}); routes.defaults(/\/management/, { resolve: { - watcherManagementSection: ($injector) => { + watcherManagementSection: $injector => { const licenseService = $injector.get('xpackWatcherLicenseService'); const watchesSection = management.getSection('elasticsearch/watcher'); @@ -74,6 +70,6 @@ routes.defaults(/\/management/, { watchesSection.disable(); watchesSection.tooltip = licenseService.message; } - } - } + }, + }, }); diff --git a/x-pack/plugins/watcher/server/routes/api/watches/register_delete_route.js b/x-pack/plugins/watcher/server/routes/api/watches/register_delete_route.js index 29ee6f60676bc3..a0bbfb954b755a 100644 --- a/x-pack/plugins/watcher/server/routes/api/watches/register_delete_route.js +++ b/x-pack/plugins/watcher/server/routes/api/watches/register_delete_route.js @@ -6,37 +6,42 @@ import { callWithRequestFactory } from '../../../lib/call_with_request_factory'; import { wrapUnknownError } from '../../../lib/error_wrappers'; -import { licensePreRoutingFactory } from'../../../lib/license_pre_routing_factory'; +import { licensePreRoutingFactory } from '../../../lib/license_pre_routing_factory'; function deleteWatches(callWithRequest, watchIds) { const deletePromises = watchIds.map(watchId => { return callWithRequest('watcher.deleteWatch', { - id: watchId + id: watchId, }) .then(success => ({ success })) .catch(error => ({ error })); }); - return Promise.all(deletePromises) - .then(results => { - const successes = results.filter(result => Boolean(result.success)); - const errors = results.filter(result => Boolean(result.error)); - - return { - numSuccesses: successes.length, - numErrors: errors.length - }; + return Promise.all(deletePromises).then(results => { + const errors = []; + const successes = []; + results.forEach(({ success, error }) => { + if (success) { + successes.push(success._id); + } else if (error) { + errors.push(error._id); + } }); + + return { + successes, + errors, + }; + }); } export function registerDeleteRoute(server) { - const licensePreRouting = licensePreRoutingFactory(server); server.route({ path: '/api/watcher/watches/delete', method: 'POST', - handler: async (request) => { + handler: async request => { const callWithRequest = callWithRequestFactory(server, request); try { @@ -47,7 +52,7 @@ export function registerDeleteRoute(server) { } }, config: { - pre: [ licensePreRouting ] - } + pre: [licensePreRouting], + }, }); } diff --git a/x-pack/test/functional/apps/watcher/watcher_test.js b/x-pack/test/functional/apps/watcher/watcher_test.js index 1af7da85036bfe..d82d9f0049655d 100644 --- a/x-pack/test/functional/apps/watcher/watcher_test.js +++ b/x-pack/test/functional/apps/watcher/watcher_test.js @@ -12,6 +12,8 @@ const watchName = 'watch Name'; const updatedName = 'updatedName'; export default function ({ getService, getPageObjects }) { const browser = getService('browser'); + const find = getService('find'); + const retry = getService('retry'); const testSubjects = getService('testSubjects'); const log = getService('log'); const PageObjects = getPageObjects(['security', 'common', 'header', 'settings', 'watcher']); @@ -34,8 +36,10 @@ export default function ({ getService, getPageObjects }) { it('should prompt user to check to see if you can override a watch with a sameID', async () => { await PageObjects.watcher.createWatch(watchID, updatedName); const modal = await testSubjects.find('confirmModalBodyText'); - const modalText = await modal.getVisibleText(); - expect(modalText).to.be(`Watch with ID "${watchID}" (name: "${watchName}") already exists. Do you want to overwrite it?`); + const modalText = await modal.getVisibleText(); + expect(modalText).to.be( + `Watch with ID "${watchID}" (name: "${watchName}") already exists. Do you want to overwrite it?` + ); await testSubjects.click('confirmModalConfirmButton'); const watch = await PageObjects.watcher.getWatch(watchID); expect(watch.id).to.be(watchID); @@ -48,15 +52,13 @@ export default function ({ getService, getPageObjects }) { log.debug(watchList); expect(watchList.watchID.name).to.eql([updatedName]); await PageObjects.watcher.deleteWatch(watchID); - const modal = await testSubjects.find('confirmModalBodyText'); - const modalText = await modal.getVisibleText(); - expect(modalText).to.be('This will permanently delete 1 Watch. Are you sure?'); await testSubjects.click('confirmModalConfirmButton'); await PageObjects.header.waitUntilLoadingHasFinished(); - const watchList1 = indexBy(await PageObjects.watcher.getWatches(), 'id'); - log.debug(watchList1); - expect(watchList1).to.not.have.key(watchID); + retry.try(async () => { + const row = await find.byCssSelector('.euiTableRow'); + const cell = await row.findByCssSelector('td:nth-child(1)'); + expect(cell.getVisibleText()).to.equal('No watches to show'); + }); }); - }); } diff --git a/x-pack/test/functional/page_objects/watcher_page.js b/x-pack/test/functional/page_objects/watcher_page.js index b34750b2e6d950..f0758313af32b2 100644 --- a/x-pack/test/functional/page_objects/watcher_page.js +++ b/x-pack/test/functional/page_objects/watcher_page.js @@ -13,9 +13,9 @@ export function WatcherPageProvider({ getPageObjects, getService }) { class WatcherPage { async clearAllWatches() { - const checkBoxExists = await testSubjects.exists('selectAllWatchesCheckBox'); + const checkBoxExists = await testSubjects.exists('checkboxSelectAll'); if (checkBoxExists) { - await testSubjects.click('selectAllWatchesCheckBox'); + await testSubjects.click('checkboxSelectAll'); await testSubjects.click('btnDeleteWatches'); await testSubjects.click('confirmModalConfirmButton'); await PageObjects.header.waitUntilLoadingHasFinished(); @@ -31,23 +31,24 @@ export function WatcherPageProvider({ getPageObjects, getService }) { } async getWatch(watchID) { - const watchRow = await testSubjects.find(`watchRow-${watchID}`); - const text = await watchRow.getVisibleText(); - const columns = text.split('\n'); + const watchIdColumn = await testSubjects.find(`watchIdColumn-${watchID}`); + const watchNameColumn = await testSubjects.find(`watchNameColumn-${watchID}`); + const id = await watchIdColumn.getVisibleText(); + const name = await watchNameColumn.getVisibleText(); return { - id: columns[0], - name: columns[1] + id, + name, }; } async deleteWatch() { - await testSubjects.click('selectAllWatchesCheckBox'); + await testSubjects.click('checkboxSelectAll'); await testSubjects.click('btnDeleteWatches'); } //get all the watches in the list async getWatches() { - const watches = await find.allByCssSelector('.kuiTableRow'); + const watches = await find.allByCssSelector('.euiTableRow'); return mapAsync(watches, async watch => { const checkBox = await watch.findByCssSelector('td:nth-child(1)'); const id = await watch.findByCssSelector('td:nth-child(2)'); @@ -56,7 +57,7 @@ export function WatcherPageProvider({ getPageObjects, getService }) { return { checkBox: (await checkBox.getProperty('innerHTML')).includes('input'), id: await id.getVisibleText(), - name: (await name.getVisibleText()).split(',').map(role => role.trim()) + name: (await name.getVisibleText()).split(',').map(role => role.trim()), }; }); } From a7ecccc3b484028cb517bc82565144bc2b851f70 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 5 Apr 2019 11:04:05 -0400 Subject: [PATCH 02/51] Watcher port edit watch (#34633) * replacing Angular watch list UI with React one * fixing TS issues * addressing PR feedback * fixing TS issues * more TS fixes * TS fix * addressing more PR feedback * TS fixes * removing unused/incompatible translations * fixing functional test * prettier fix * fixing typp * fixing missing comma * fixing data-test-subject typo * fixing functional test * fixing functional tests * fixing delete functional tests * addressing PR feedback * progress on watch edit * port advanced watcher to react (#34188) * port advanced watcher to react * fix i18n * update execute trigger override text fields to number input and select fields * fix page title for edit mode * remove todo comments * add license validity check; pass kbnUrl service as prop * address review comments --- .../plugins/watcher/common/constants/index.ts | 1 + .../watcher/common/constants/time_units.ts | 1 + .../watcher/common/constants/watch_tabs.ts | 30 + ...{get_action_type.js => get_action_type.ts} | 9 +- .../get_action_type/{index.js => index.ts} | 0 .../watcher/common/types/watch_types.ts | 57 ++ .../components/confirm_watches_modal.tsx | 44 ++ .../watcher/public/components/form_errors.tsx | 38 ++ x-pack/plugins/watcher/public/lib/api.ts | 45 ++ ...tation_links.js => documentation_links.ts} | 6 +- .../{index.js => index.ts} | 2 +- ...ion_link.js => make_documentation_link.ts} | 11 +- .../models/execute_details/execute_details.js | 38 +- .../plugins/watcher/public/models/index.d.ts | 20 + .../watcher/public/models/watch/base_watch.js | 2 +- .../public/models/watch/threshold_watch.js | 40 +- .../public/sections/watch_edit/agg_types.ts | 46 ++ .../public/sections/watch_edit/comparators.ts | 28 + .../components/json_watch_edit_component.tsx | 104 +++ .../components/json_watch_edit_form.tsx | 225 +++++++ .../components/json_watch_edit_simulate.tsx | 484 ++++++++++++++ .../json_watch_edit_simulate_results.tsx | 174 +++++ .../threshold_watch_edit_component.tsx | 608 ++++++++++++++++++ .../watch_edit/components/watch_context.ts | 8 + .../watch_edit/components/watch_edit.tsx | 89 +++ .../sections/watch_edit/group_by_types.ts | 31 + .../watch_edit/json_watch_edit_actions.ts | 144 +++++ .../public/sections/watch_edit/time_units.ts | 55 ++ .../sections/watch_edit/watch_edit_route.html | 3 + .../sections/watch_edit/watch_edit_route.js | 138 ++-- .../models/execute_details/execute_details.js | 2 +- 31 files changed, 2393 insertions(+), 90 deletions(-) create mode 100644 x-pack/plugins/watcher/common/constants/watch_tabs.ts rename x-pack/plugins/watcher/common/lib/get_action_type/{get_action_type.js => get_action_type.ts} (57%) rename x-pack/plugins/watcher/common/lib/get_action_type/{index.js => index.ts} (100%) create mode 100644 x-pack/plugins/watcher/common/types/watch_types.ts create mode 100644 x-pack/plugins/watcher/public/components/confirm_watches_modal.tsx create mode 100644 x-pack/plugins/watcher/public/components/form_errors.tsx rename x-pack/plugins/watcher/public/lib/documentation_links/{documentation_links.js => documentation_links.ts} (71%) rename x-pack/plugins/watcher/public/lib/documentation_links/{index.js => index.ts} (79%) rename x-pack/plugins/watcher/public/lib/documentation_links/{make_documentation_link.js => make_documentation_link.ts} (59%) create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/agg_types.ts create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/comparators.ts create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_context.ts create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/group_by_types.ts create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/json_watch_edit_actions.ts create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/time_units.ts diff --git a/x-pack/plugins/watcher/common/constants/index.ts b/x-pack/plugins/watcher/common/constants/index.ts index 4260688c6eb451..d9156e132c038a 100644 --- a/x-pack/plugins/watcher/common/constants/index.ts +++ b/x-pack/plugins/watcher/common/constants/index.ts @@ -23,3 +23,4 @@ export { WATCH_HISTORY } from './watch_history'; export { WATCH_STATES } from './watch_states'; export { WATCH_TYPES } from './watch_types'; export { ERROR_CODES } from './error_codes'; +export { WATCH_TABS, WATCH_TAB_ID_EDIT, WATCH_TAB_ID_SIMULATE } from './watch_tabs'; diff --git a/x-pack/plugins/watcher/common/constants/time_units.ts b/x-pack/plugins/watcher/common/constants/time_units.ts index c861d47416a804..9b79f163e5831a 100644 --- a/x-pack/plugins/watcher/common/constants/time_units.ts +++ b/x-pack/plugins/watcher/common/constants/time_units.ts @@ -5,6 +5,7 @@ */ export const TIME_UNITS: { [key: string]: string } = { + MILLISECOND: 'ms', SECOND: 's', MINUTE: 'm', HOUR: 'h', diff --git a/x-pack/plugins/watcher/common/constants/watch_tabs.ts b/x-pack/plugins/watcher/common/constants/watch_tabs.ts new file mode 100644 index 00000000000000..1d741b9610663c --- /dev/null +++ b/x-pack/plugins/watcher/common/constants/watch_tabs.ts @@ -0,0 +1,30 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const WATCH_TAB_ID_EDIT = 'watchEditTab'; +export const WATCH_TAB_ID_SIMULATE = 'watchSimulateTab'; + +interface WatchTab { + id: string; + name: string; +} + +export const WATCH_TABS: WatchTab[] = [ + { + id: WATCH_TAB_ID_EDIT, + name: i18n.translate('xpack.watcher.sections.watchEdit.json.editTabLabel', { + defaultMessage: 'Edit', + }), + }, + { + id: WATCH_TAB_ID_SIMULATE, + name: i18n.translate('xpack.watcher.sections.watchEdit.json.simulateTabLabel', { + defaultMessage: 'Simulate', + }), + }, +]; diff --git a/x-pack/plugins/watcher/common/lib/get_action_type/get_action_type.js b/x-pack/plugins/watcher/common/lib/get_action_type/get_action_type.ts similarity index 57% rename from x-pack/plugins/watcher/common/lib/get_action_type/get_action_type.js rename to x-pack/plugins/watcher/common/lib/get_action_type/get_action_type.ts index 6fdaa81c64260e..95aaef71cd2bef 100644 --- a/x-pack/plugins/watcher/common/lib/get_action_type/get_action_type.js +++ b/x-pack/plugins/watcher/common/lib/get_action_type/get_action_type.ts @@ -4,14 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { keys, values, intersection } from 'lodash'; +import { intersection, keys, values } from 'lodash'; import { ACTION_TYPES } from '../../constants'; -export function getActionType(action) { - const type = intersection( - keys(action), - values(ACTION_TYPES) - )[0] || ACTION_TYPES.UNKNOWN; +export function getActionType(action: { [key: string]: { [key: string]: any } }) { + const type = intersection(keys(action), values(ACTION_TYPES))[0] || ACTION_TYPES.UNKNOWN; return type; } diff --git a/x-pack/plugins/watcher/common/lib/get_action_type/index.js b/x-pack/plugins/watcher/common/lib/get_action_type/index.ts similarity index 100% rename from x-pack/plugins/watcher/common/lib/get_action_type/index.js rename to x-pack/plugins/watcher/common/lib/get_action_type/index.ts diff --git a/x-pack/plugins/watcher/common/types/watch_types.ts b/x-pack/plugins/watcher/common/types/watch_types.ts new file mode 100644 index 00000000000000..545920496bc3a6 --- /dev/null +++ b/x-pack/plugins/watcher/common/types/watch_types.ts @@ -0,0 +1,57 @@ +/* + * 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. + */ + +export interface ExecutedWatchResults { + id: string; + watchId: string; + details: any; + startTime: Date; + watchStatus: { + state: string; + actionStatuses: Array<{ state: string; lastExecutionReason: string }>; + }; +} + +export interface ExecutedWatchDetails { + triggerData: { + triggeredTime: Date; + scheduledTime: Date; + }; + ignoreCondition: boolean; + alternativeInput: any; + actionModes: { + [key: string]: string; + }; + recordExecution: boolean; + upstreamJson: any; +} + +export interface BaseWatch { + id: string; + type: string; + isNew: boolean; + name: string; + isSystemWatch: boolean; + watchStatus: any; + watchErrors: any; + typeName: string; + displayName: string; + upstreamJson: any; + resetActions: () => void; + createAction: (type: string, actionProps: {}) => void; + validate: () => { warning: { message: string } }; + actions: [ + { + id: string; + type: string; + } + ]; + watch: { + actions: { + [key: string]: { [key: string]: any }; + }; + }; +} diff --git a/x-pack/plugins/watcher/public/components/confirm_watches_modal.tsx b/x-pack/plugins/watcher/public/components/confirm_watches_modal.tsx new file mode 100644 index 00000000000000..61adccb45ebb24 --- /dev/null +++ b/x-pack/plugins/watcher/public/components/confirm_watches_modal.tsx @@ -0,0 +1,44 @@ +/* + * 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 { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; + +export const ConfirmWatchesModal = ({ + modalOptions, + callback, +}: { + modalOptions: { message: string } | null; + callback: (isConfirmed?: boolean) => void; +}) => { + if (!modalOptions) { + return null; + } + return ( + + callback()} + onConfirm={() => { + callback(true); + }} + cancelButtonText={i18n.translate( + 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.cancelButtonLabel', + { defaultMessage: 'Cancel' } + )} + confirmButtonText={i18n.translate( + 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.saveButtonLabel', + { defaultMessage: 'Save' } + )} + > + {modalOptions.message} + + + ); +}; diff --git a/x-pack/plugins/watcher/public/components/form_errors.tsx b/x-pack/plugins/watcher/public/components/form_errors.tsx new file mode 100644 index 00000000000000..4bedc582f23f5f --- /dev/null +++ b/x-pack/plugins/watcher/public/components/form_errors.tsx @@ -0,0 +1,38 @@ +/* + * 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 { EuiFormRow } from '@elastic/eui'; +import React, { Children, cloneElement, Fragment, ReactElement } from 'react'; + +export const ErrableFormRow = ({ + errorKey, + isShowingErrors, + errors, + children, + ...rest +}: { + errorKey: string; + isShowingErrors: boolean; + errors: { [key: string]: string[] }; + children: ReactElement; + [key: string]: any; +}) => { + return ( + 0} + error={errors[errorKey]} + {...rest} + > + + {Children.map(children, child => + cloneElement(child, { + isInvalid: isShowingErrors && errors[errorKey].length > 0, + }) + )} + + + ); +}; diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index e93adf6f71b2ad..2f4056d2712cb9 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -4,8 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ import { Watch } from 'plugins/watcher/models/watch'; +import { __await } from 'tslib'; import chrome from 'ui/chrome'; import { ROUTES } from '../../common/constants'; +import { BaseWatch, ExecutedWatchDetails } from '../../common/types/watch_types'; + let httpClient: ng.IHttpService; export const setHttpClient = (anHttpClient: ng.IHttpService) => { httpClient = anHttpClient; @@ -31,3 +34,45 @@ export const deleteWatches = async (watchIds: string[]) => { } = await getHttpClient().post(`${basePath}/watches/delete`, body); return results; }; +export const fetchWatch = async (watchId: string) => { + const body = { + watchId, + }; + const { + data: { results }, + } = await getHttpClient().post(`${basePath}/watches/`, body); + return results; +}; +export const loadWatch = async (id: string) => { + const { data: watch } = await getHttpClient().get(`${basePath}/watch/${id}`); + return Watch.fromUpstreamJson(watch.watch); +}; +export const getMatchingIndices = async (pattern: string) => { + if (!pattern.startsWith('*')) { + pattern = `*${pattern}`; + } + if (!pattern.endsWith('*')) { + pattern = `${pattern}*`; + } + const { + data: { indices }, + } = await getHttpClient().post(`${basePath}/indices`, { pattern }); + return indices; +}; +export const fetchFields = async (indexes: string[]) => { + const { + data: { fields }, + } = await getHttpClient().post(`${basePath}/fields`, { indexes }); + return fields; +}; +export const createWatch = async (watch: BaseWatch) => { + const { data } = await getHttpClient().put(`${basePath}/watch/${watch.id}`, watch.upstreamJson); + return data; +}; +export const executeWatch = async (executeWatchDetails: ExecutedWatchDetails, watch: BaseWatch) => { + const { data } = await getHttpClient().put(`${basePath}/watch/execute`, { + executeDetails: executeWatchDetails.upstreamJson, + watch: watch.upstreamJson, + }); + return data; +}; diff --git a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.js b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts similarity index 71% rename from x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.js rename to x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts index 4a807d37493947..1868a4f372ae0d 100644 --- a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.js +++ b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts @@ -8,6 +8,8 @@ import { makeDocumentationLink } from './make_documentation_link'; export const documentationLinks = { watcher: { - putWatchApi: makeDocumentationLink('{baseUrl}guide/en/elasticsearch/reference/{urlVersion}/watcher-api-put-watch.html') - } + putWatchApi: makeDocumentationLink( + '{baseUrl}guide/en/elasticsearch/reference/{urlVersion}/watcher-api-put-watch.html' + ), + }, }; diff --git a/x-pack/plugins/watcher/public/lib/documentation_links/index.js b/x-pack/plugins/watcher/public/lib/documentation_links/index.ts similarity index 79% rename from x-pack/plugins/watcher/public/lib/documentation_links/index.js rename to x-pack/plugins/watcher/public/lib/documentation_links/index.ts index 2972d0ca806038..98a45e81f4e70a 100644 --- a/x-pack/plugins/watcher/public/lib/documentation_links/index.js +++ b/x-pack/plugins/watcher/public/lib/documentation_links/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { documentationLinks } from './documentation_links.js'; +export { documentationLinks } from './documentation_links'; diff --git a/x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.js b/x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.ts similarity index 59% rename from x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.js rename to x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.ts index ebe81ae0f3a0f3..bcd0880a7324cb 100644 --- a/x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.js +++ b/x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.ts @@ -13,13 +13,6 @@ const minor = semver.minor(metadata.version); const urlVersion = `${major}.${minor}`; const baseUrl = 'https://www.elastic.co/'; -/** - * - * @param {string} linkTemplate Link template containing {baseUrl} and {urlVersion} placeholders - * @return {string} Actual link, with placeholders in template replaced - */ -export function makeDocumentationLink(linkTemplate) { - return linkTemplate - .replace('{baseUrl}', baseUrl) - .replace('{urlVersion}', urlVersion); +export function makeDocumentationLink(linkTemplate: string) { + return linkTemplate.replace('{baseUrl}', baseUrl).replace('{urlVersion}', urlVersion); } diff --git a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js index c6c27d18b77e25..855f805349f599 100644 --- a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js +++ b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js @@ -4,9 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ +import { TIME_UNITS } from '../../../common/constants'; +import moment from 'moment'; + export class ExecuteDetails { constructor(props = {}) { - this.triggeredTime = props.triggeredTime; + this.triggeredTimeValue = props.triggeredTimeValue; + this.triggeredTimeUnit = props.triggeredTimeUnit; + this.scheduledTimeValue = props.scheduledTimeValue; + this.scheduledTimeUnit = props.scheduledTimeUnit; this.scheduledTime = props.scheduledTime; this.ignoreCondition = props.ignoreCondition; this.alternativeInput = props.alternativeInput; @@ -14,14 +20,36 @@ export class ExecuteDetails { this.recordExecution = props.recordExecution; } + formatTime(timeUnit, value) { + let timeValue = moment(); + switch (timeUnit) { + case TIME_UNITS.SECOND: + timeValue = timeValue.add(value, 'seconds'); + break; + case TIME_UNITS.MINUTE: + timeValue = timeValue.add(value, 'minutes'); + break; + case TIME_UNITS.HOUR: + timeValue = timeValue.add(value, 'hours'); + break; + case TIME_UNITS.MILLISECOND: + timeValue = timeValue.add(value, 'milliseconds'); + break; + } + return timeValue.format(); + } + get upstreamJson() { + const hasTriggerTime = this.triggeredTimeValue !== ''; + const hasScheduleTime = this.scheduledTimeValue !== ''; + const formattedTriggerTime = hasTriggerTime ? this.formatTime(this.triggeredTimeUnit, this.triggeredTimeValue) : undefined; + const formattedScheduleTime = hasScheduleTime ? this.formatTime(this.scheduledTimeUnit, this.scheduledTimeValue) : undefined; const triggerData = { - triggeredTime: this.triggeredTime, - scheduledTime: this.scheduledTime, + triggeredTime: formattedTriggerTime, + scheduledTime: formattedScheduleTime, }; - return { - triggerData: triggerData, + triggerData, ignoreCondition: this.ignoreCondition, alternativeInput: this.alternativeInput, actionModes: this.actionModes, diff --git a/x-pack/plugins/watcher/public/models/index.d.ts b/x-pack/plugins/watcher/public/models/index.d.ts index 81787a375d44e3..61ed512248a497 100644 --- a/x-pack/plugins/watcher/public/models/index.d.ts +++ b/x-pack/plugins/watcher/public/models/index.d.ts @@ -6,3 +6,23 @@ declare module 'plugins/watcher/models/watch' { export const Watch: any; } +declare module 'plugins/watcher/models/watch/threshold_watch' { + export const ThresholdWatch: any; +} +declare module 'plugins/watcher/models/watch/json_watch' { + export const JsonWatch: any; +} + +declare module 'plugins/watcher/models/execute_details/execute_details' { + export const ExecuteDetails: any; +} + +declare module 'plugins/watcher/models/watch_history_item' { + export const WatchHistoryItem: any; +} + +// TODO: Remove once typescript definitions are in EUI +declare module '@elastic/eui' { + export const EuiCodeEditor: React.SFC; + export const EuiDescribedFormGroup: React.SFC; +} diff --git a/x-pack/plugins/watcher/public/models/watch/base_watch.js b/x-pack/plugins/watcher/public/models/watch/base_watch.js index 8363ebaf05cc34..5cd96dce91690c 100644 --- a/x-pack/plugins/watcher/public/models/watch/base_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/base_watch.js @@ -25,7 +25,7 @@ export class BaseWatch { * @param {array} props.actions Action definitions */ constructor(props = {}) { - this.id = get(props, 'id'); + this.id = get(props, 'id', ''); this.type = get(props, 'type'); this.isNew = get(props, 'isNew', true); diff --git a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js index 0643a74ea35edc..d32177844f90bc 100644 --- a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js @@ -18,7 +18,8 @@ const DEFAULT_VALUES = { TIME_WINDOW_UNIT: 'm', TRIGGER_INTERVAL_SIZE: 1, TRIGGER_INTERVAL_UNIT: 'm', - THRESHOLD: 1000 + THRESHOLD: 1000, + GROUP_BY: 'all', }; /** @@ -30,7 +31,7 @@ export class ThresholdWatch extends BaseWatch { props.type = WATCH_TYPES.THRESHOLD; super(props); - this.index = props.index; + this.index = props.index || []; this.timeField = props.timeField; this.triggerIntervalSize = props.triggerIntervalSize || DEFAULT_VALUES.TRIGGER_INTERVAL_SIZE; this.triggerIntervalUnit = props.triggerIntervalUnit || DEFAULT_VALUES.TRIGGER_INTERVAL_UNIT; @@ -41,6 +42,7 @@ export class ThresholdWatch extends BaseWatch { this.thresholdComparator = props.thresholdComparator || DEFAULT_VALUES.THRESHOLD_COMPARATOR; this.timeWindowSize = props.timeWindowSize || DEFAULT_VALUES.TIME_WINDOW_SIZE; this.timeWindowUnit = props.timeWindowUnit || DEFAULT_VALUES.TIME_WINDOW_UNIT; + this.groupBy = props.groupBy || DEFAULT_VALUES.GROUP_BY; //NOTE: The threshold must be of the appropriate type, i.e.,number/date. //Conversion from string must occur by consumer when assigning a @@ -53,25 +55,33 @@ export class ThresholdWatch extends BaseWatch { } get termOrder() { - return this.thresholdComparator === COMPARATORS.GREATER_THAN ? SORT_ORDERS.DESCENDING : SORT_ORDERS.ASCENDING; + return this.thresholdComparator === COMPARATORS.GREATER_THAN + ? SORT_ORDERS.DESCENDING + : SORT_ORDERS.ASCENDING; } get titleDescription() { - const staticPart = i18n.translate('xpack.watcher.models.thresholdWatch.sendAlertOnSpecificConditionTitleDescription', { - defaultMessage: 'Send an alert when a specific condition is met.' - }); + const staticPart = i18n.translate( + 'xpack.watcher.models.thresholdWatch.sendAlertOnSpecificConditionTitleDescription', + { + defaultMessage: 'Send an alert when a specific condition is met.', + } + ); if (isNaN(this.triggerIntervalSize)) { return staticPart; } const timeUnitLabel = getTimeUnitsLabel(this.triggerIntervalUnit, this.triggerIntervalSize); - const dynamicPartText = i18n.translate('xpack.watcher.models.thresholdWatch.thresholdWatchIntervalTitleDescription', { - defaultMessage: 'This will run every {triggerIntervalSize} {timeUnitLabel}.', - values: { - triggerIntervalSize: this.triggerIntervalSize, - timeUnitLabel + const dynamicPartText = i18n.translate( + 'xpack.watcher.models.thresholdWatch.thresholdWatchIntervalTitleDescription', + { + defaultMessage: 'This will run every {triggerIntervalSize} {timeUnitLabel}.', + values: { + triggerIntervalSize: this.triggerIntervalSize, + timeUnitLabel, + }, } - }); + ); return `${staticPart} ${dynamicPartText}`; } @@ -89,7 +99,7 @@ export class ThresholdWatch extends BaseWatch { thresholdComparator: this.thresholdComparator, timeWindowSize: this.timeWindowSize, timeWindowUnit: this.timeWindowUnit, - threshold: this.threshold + threshold: this.threshold, }); return result; @@ -104,11 +114,11 @@ export class ThresholdWatch extends BaseWatch { } static typeName = i18n.translate('xpack.watcher.models.thresholdWatch.typeName', { - defaultMessage: 'Threshold Alert' + defaultMessage: 'Threshold Alert', }); static iconClass = ''; static selectMessage = i18n.translate('xpack.watcher.models.thresholdWatch.selectMessageText', { - defaultMessage: 'Send an alert on a specific condition' + defaultMessage: 'Send an alert on a specific condition', }); static isCreatable = true; static selectSortOrder = 1; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/agg_types.ts b/x-pack/plugins/watcher/public/sections/watch_edit/agg_types.ts new file mode 100644 index 00000000000000..65ab537889ea44 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/agg_types.ts @@ -0,0 +1,46 @@ +/* + * 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 { AGG_TYPES } from '../../../common/constants'; + +export interface AggType { + text: string; + fieldRequired: boolean; + value: string; + validNormalizedTypes: string[]; +} +export const aggTypes: { [key: string]: AggType } = { + count: { + text: 'count()', + fieldRequired: false, + value: AGG_TYPES.COUNT, + validNormalizedTypes: [], + }, + avg: { + text: 'average()', + fieldRequired: true, + validNormalizedTypes: ['number'], + value: AGG_TYPES.AVERAGE, + }, + sum: { + text: 'sum()', + fieldRequired: true, + validNormalizedTypes: ['number'], + value: AGG_TYPES.SUM, + }, + min: { + text: 'min()', + fieldRequired: true, + validNormalizedTypes: ['number', 'date'], + value: AGG_TYPES.MIN, + }, + max: { + text: 'max()', + fieldRequired: true, + validNormalizedTypes: ['number', 'date'], + value: AGG_TYPES.MAX, + }, +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/comparators.ts b/x-pack/plugins/watcher/public/sections/watch_edit/comparators.ts new file mode 100644 index 00000000000000..63508732f83891 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/comparators.ts @@ -0,0 +1,28 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +import { COMPARATORS } from '../../../common/constants'; + +export interface Comparator { + text: string; + value: string; +} +export const comparators: { [key: string]: Comparator } = { + [COMPARATORS.GREATER_THAN]: { + text: i18n.translate('xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel', { + defaultMessage: 'Is above', + }), + value: COMPARATORS.GREATER_THAN, + }, + [COMPARATORS.LESS_THAN]: { + text: i18n.translate('xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel', { + defaultMessage: 'Is below', + }), + value: COMPARATORS.LESS_THAN, + }, +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx new file mode 100644 index 00000000000000..47e1b26dc366e0 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx @@ -0,0 +1,104 @@ +/* + * 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 React, { useContext, useState } from 'react'; + +import { + EuiFlexGroup, + EuiFlexItem, + EuiPageContent, + EuiSpacer, + EuiTab, + EuiTabs, + EuiTitle, +} from '@elastic/eui'; +import { injectI18n } from '@kbn/i18n/react'; +import { WATCH_TAB_ID_EDIT, WATCH_TAB_ID_SIMULATE, WATCH_TABS } from '../../../../common/constants'; +import { JsonWatchEditForm } from './json_watch_edit_form'; +import { JsonWatchEditSimulate } from './json_watch_edit_simulate'; +import { WatchContext } from './watch_context'; + +const JsonWatchEditUi = ({ + pageTitle, + kbnUrl, + licenseService, +}: { + pageTitle: string; + kbnUrl: any; + licenseService: any; +}) => { + const { watch } = useContext(WatchContext); + // hooks + const [selectedTab, setSelectedTab] = useState(WATCH_TAB_ID_EDIT); + const [watchErrors, setWatchErrors] = useState<{ [key: string]: string[] }>({ + watchId: [], + watchJson: [], + }); + const [isShowingWatchErrors, setIsShowingWatchErrors] = useState(false); + const [executeWatchJsonString, setExecuteWatchJsonString] = useState(''); + const [isShowingExecuteWatchErrors, setIsShowingExecuteWatchErrors] = useState(false); + const [executeWatchErrors, setExecuteWatchErrors] = useState<{ [key: string]: string[] }>({ + simulateExecutionInputOverride: [], + }); + // ace editor requires json to be in string format + const [watchJsonString, setWatchJsonString] = useState( + JSON.stringify(watch.watch, null, 2) + ); + return ( + + + + +

{pageTitle}

+
+
+
+ + {WATCH_TABS.map((tab, index) => ( + { + setSelectedTab(tab.id); + }} + isSelected={tab.id === selectedTab} + key={index} + > + {tab.name} + + ))} + + + {selectedTab === WATCH_TAB_ID_SIMULATE && ( + setExecuteWatchJsonString(json)} + errors={executeWatchErrors} + setErrors={(errors: { [key: string]: string[] }) => setExecuteWatchErrors(errors)} + isShowingErrors={isShowingExecuteWatchErrors} + setIsShowingErrors={(isShowingErrors: boolean) => + setIsShowingExecuteWatchErrors(isShowingErrors) + } + isDisabled={isShowingExecuteWatchErrors || isShowingWatchErrors} + /> + )} + {selectedTab === WATCH_TAB_ID_EDIT && ( + setWatchJsonString(json)} + errors={watchErrors} + setErrors={(errors: { [key: string]: string[] }) => setWatchErrors(errors)} + isShowingErrors={isShowingWatchErrors} + setIsShowingErrors={(isShowingErrors: boolean) => + setIsShowingWatchErrors(isShowingErrors) + } + /> + )} +
+ ); +}; + +export const JsonWatchEdit = injectI18n(JsonWatchEditUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx new file mode 100644 index 00000000000000..d2e77c938cfadd --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx @@ -0,0 +1,225 @@ +/* + * 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 React, { Fragment, useContext, useState } from 'react'; + +import { + EuiButton, + EuiButtonEmpty, + EuiCodeEditor, + EuiFieldText, + EuiFlexGroup, + EuiFlexItem, + EuiForm, + EuiFormRow, + EuiLink, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { JsonWatch } from 'plugins/watcher/models/watch/json_watch'; +import { ConfirmWatchesModal } from '../../../components/confirm_watches_modal'; +import { ErrableFormRow } from '../../../components/form_errors'; +import { documentationLinks } from '../../../lib/documentation_links'; +import { onWatchSave, saveWatch } from '../json_watch_edit_actions'; +import { WatchContext } from './watch_context'; + +const JSON_WATCH_IDS = { + ID: 'watchId', + NAME: 'watchName', + JSON: 'watchJson', +}; + +function validateId(id: string) { + const regex = /^[A-Za-z0-9\-\_]+$/; + if (!id) { + return i18n.translate('xpack.watcher.sections.watchEdit.json.error.requiredIdText', { + defaultMessage: 'ID is required', + }); + } else if (!regex.test(id)) { + return i18n.translate('xpack.watcher.sections.watchEdit.json.error.invalidIdText', { + defaultMessage: 'ID must only letters, underscores, dashes, and numbers.', + }); + } + return false; +} + +export const JsonWatchEditForm = ({ + kbnUrl, + licenseService, + watchJsonString, + setWatchJsonString, + errors, + setErrors, + isShowingErrors, + setIsShowingErrors, +}: { + kbnUrl: any; + licenseService: any; + watchJsonString: string; + setWatchJsonString: (json: string) => void; + errors: { [key: string]: string[] }; + setErrors: (errors: { [key: string]: string[] }) => void; + isShowingErrors: boolean; + setIsShowingErrors: (isShowingErrors: boolean) => void; +}) => { + const { watch, setWatch } = useContext(WatchContext); + // hooks + const [modal, setModal] = useState<{ message: string } | null>(null); + return ( + + { + if (isConfirmed) { + saveWatch(watch, kbnUrl, licenseService); + } + setModal(null); + }} + /> + + + ) => { + const id = e.target.value; + const error = validateId(id); + const newErrors = { ...errors, [JSON_WATCH_IDS.ID]: error ? [error] : [] }; + const isInvalidForm = !!Object.keys(newErrors).find( + errorKey => newErrors[errorKey].length >= 1 + ); + setErrors(newErrors); + setIsShowingErrors(isInvalidForm); + setWatch(new JsonWatch({ ...watch, id })); + }} + /> + + + ) => { + setWatch(new JsonWatch({ ...watch, name: e.target.value })); + }} + /> + + + {i18n.translate('xpack.watcher.sections.watchEdit.json.form.watchJsonLabel', { + defaultMessage: 'Watch JSON', + })}{' '} + ( + + {i18n.translate('xpack.watcher.sections.watchEdit.json.form.watchJsonDocLink', { + defaultMessage: 'Syntax', + })} + + ) + + } + errorKey={JSON_WATCH_IDS.JSON} + isShowingErrors={isShowingErrors} + fullWidth + errors={errors} + > + { + setWatchJsonString(json); + try { + const watchJson = JSON.parse(json); + if (watchJson && typeof watchJson === 'object') { + setWatch( + new JsonWatch({ + ...watch, + watch: watchJson, + }) + ); + const newErrors = { ...errors, [JSON_WATCH_IDS.JSON]: [] }; + const isInvalidForm = !!Object.keys(newErrors).find( + errorKey => newErrors[errorKey].length >= 1 + ); + setErrors(newErrors); + setIsShowingErrors(isInvalidForm); + } + } catch (e) { + setErrors({ + ...errors, + [JSON_WATCH_IDS.JSON]: [ + i18n.translate('xpack.watcher.sections.watchEdit.json.error.invalidJsonText', { + defaultMessage: 'Invalid JSON', + }), + ], + }); + setIsShowingErrors(true); + } + }} + /> + + + + { + const error = validateId(watch.id); + setErrors({ ...errors, [JSON_WATCH_IDS.ID]: error ? [error] : [] }); + setIsShowingErrors(!!error); + if (!error) { + const savedWatch = await onWatchSave(watch, kbnUrl, licenseService); + if (savedWatch && savedWatch.error) { + return setModal(savedWatch.error); + } + } + }} + > + {i18n.translate('xpack.watcher.sections.watchEdit.json.saveButtonLabel', { + defaultMessage: 'Save', + })} + + + + + {i18n.translate('xpack.watcher.sections.watchEdit.json.cancelButtonLabel', { + defaultMessage: 'Cancel', + })} + + + + + + ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx new file mode 100644 index 00000000000000..51977ed724c755 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx @@ -0,0 +1,484 @@ +/* + * 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 React, { Fragment, useContext, useState } from 'react'; + +import { + EuiBasicTable, + EuiButton, + EuiCodeEditor, + EuiDescribedFormGroup, + EuiFieldNumber, + EuiFlexGroup, + EuiFlexItem, + EuiForm, + EuiFormRow, + EuiSelect, + EuiSpacer, + EuiSwitch, + EuiText, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { map } from 'lodash'; +import { ExecuteDetails } from 'plugins/watcher/models/execute_details/execute_details'; +import { WatchHistoryItem } from 'plugins/watcher/models/watch_history_item'; +import { toastNotifications } from 'ui/notify'; +import { ACTION_MODES, TIME_UNITS } from '../../../../common/constants'; +import { getActionType } from '../../../../common/lib/get_action_type'; +import { BaseWatch, ExecutedWatchResults } from '../../../../common/types/watch_types'; +import { ErrableFormRow } from '../../../components/form_errors'; +import { executeWatch } from '../../../lib/api'; +import { WatchContext } from '../../../sections/watch_edit/components/watch_context'; +import { timeUnits } from '../time_units'; +import { JsonWatchEditSimulateResults } from './json_watch_edit_simulate_results'; + +interface TableDataRow { + actionId: string | undefined; + actionMode: string | undefined; + type: string; +} + +interface TableData extends Array {} + +const EXECUTE_DETAILS_INITIAL_STATE = { + triggeredTimeValue: 0, + triggeredTimeUnit: TIME_UNITS.MILLISECOND, + scheduledTimeValue: 0, + scheduledTimeUnit: TIME_UNITS.SECOND, + ignoreCondition: false, +}; + +const INPUT_OVERRIDE_ID = 'simulateExecutionInputOverride'; + +function getTableData(watch: BaseWatch) { + const actions = watch.watch && watch.watch.actions; + return map(actions, (action, actionId) => { + const type = getActionType(action); + return { + actionId, + type, + actionMode: ACTION_MODES.SIMULATE, + }; + }); +} + +function getActionModes(items: TableData) { + const result = items.reduce((itemsAccum: any, item) => { + if (item.actionId) { + itemsAccum[item && item.actionId] = item.actionMode; + } + return itemsAccum; + }, {}); + return result; +} + +export const JsonWatchEditSimulate = ({ + executeWatchJsonString, + setExecuteWatchJsonString, + errors, + setErrors, + isShowingErrors, + setIsShowingErrors, + isDisabled, +}: { + executeWatchJsonString: string; + setExecuteWatchJsonString: (json: string) => void; + errors: { [key: string]: string[] }; + setErrors: (errors: { [key: string]: string[] }) => void; + isShowingErrors: boolean; + setIsShowingErrors: (isShowingErrors: boolean) => void; + isDisabled: boolean; +}) => { + const { watch } = useContext(WatchContext); + const tableData = getTableData(watch); + + // hooks + const [executeDetails, setExecuteDetails] = useState( + new ExecuteDetails({ + ...EXECUTE_DETAILS_INITIAL_STATE, + actionModes: getActionModes(tableData), + }) + ); + const [executeResults, setExecuteResults] = useState(null); + + const columns = [ + { + field: 'actionId', + name: i18n.translate('xpack.watcher.sections.watchEdit.simulate.table.idColumnLabel', { + defaultMessage: 'ID', + }), + sortable: true, + truncateText: true, + }, + { + field: 'type', + name: i18n.translate('xpack.watcher.sections.watchEdit.simulate.table.typeColumnLabel', { + defaultMessage: 'Type', + }), + truncateText: true, + }, + { + field: 'actionMode', + name: i18n.translate('xpack.watcher.sections.watchEdit.simulate.table.modeColumnLabel', { + defaultMessage: 'Mode', + }), + render: ({}, row: { actionId: string }) => ( + { + setExecuteDetails( + new ExecuteDetails({ + ...executeDetails, + actionModes: { ...executeDetails.actionModes, [row.actionId]: e.target.value }, + }) + ); + }} + aria-label={i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.table.modeSelectLabel', + { + defaultMessage: 'Action modes', + } + )} + /> + ), + }, + ]; + + return ( + + {executeResults && ( + setExecuteResults(null)} + /> + )} + +

+ {i18n.translate('xpack.watcher.sections.watchEdit.simulate.pageDescription', { + defaultMessage: 'Modify the fields below to simulate a watch execution.', + })} +

+
+ + + + {i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.triggerOverridesTitle', + { defaultMessage: 'Trigger overrides' } + )} + + } + description={i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.triggerOverridesDescription', + { + defaultMessage: + 'These fields are parsed as the data of the trigger event that will be used during the watch execution.', + } + )} + > + + + + { + const value = e.target.value; + setExecuteDetails( + new ExecuteDetails({ + ...executeDetails, + scheduledTimeValue: value === '' ? value : parseInt(value, 10), + }) + ); + }} + /> + + + { + setExecuteDetails( + new ExecuteDetails({ + ...executeDetails, + scheduledTimeUnit: e.target.value, + }) + ); + }} + /> + + + + + + + { + const value = e.target.value; + setExecuteDetails( + new ExecuteDetails({ + ...executeDetails, + triggeredTimeValue: value === '' ? value : parseInt(value, 10), + }) + ); + }} + /> + + + { + setExecuteDetails( + new ExecuteDetails({ + ...executeDetails, + triggeredTimeUnit: e.target.value, + }) + ); + }} + /> + + + + + + {i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.inputOverridesTitle', + { defaultMessage: 'Input overrides' } + )} + + } + description={i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.inputOverridesDescription', + { + defaultMessage: + 'When present, the watch uses this object as a payload instead of executing its own input.', + } + )} + > + + { + setExecuteWatchJsonString(json); + try { + const alternativeInput = json === '' ? undefined : JSON.parse(json); + if ( + typeof alternativeInput === 'undefined' || + (alternativeInput && typeof alternativeInput === 'object') + ) { + setExecuteDetails( + new ExecuteDetails({ + ...executeDetails, + alternativeInput, + }) + ); + setIsShowingErrors(false); + setErrors({ ...errors, [INPUT_OVERRIDE_ID]: [] }); + } + } catch (e) { + setErrors({ + ...errors, + [INPUT_OVERRIDE_ID]: [ + i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.alternativeInputFieldError', + { + defaultMessage: 'Invalid JSON', + } + ), + ], + }); + setIsShowingErrors(true); + } + }} + /> + + + + {i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.conditionOverridesTitle', + { defaultMessage: 'Condition overrides' } + )} + + } + description={i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.conditionOverridesDescription', + { + defaultMessage: 'When enabled, the watch execution uses the Always Condition.', + } + )} + > + { + setExecuteDetails( + new ExecuteDetails({ ...executeDetails, ignoreCondition: e.target.checked }) + ); + }} + /> + + + {i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.actionOverridesTitle', + { defaultMessage: 'Action overrides' } + )} + + } + description={i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.actionOverridesDescription', + { + defaultMessage: + 'The action modes determine how to handle the watch actions as part of the watch execution.', + } + )} + > + + + + + { + try { + const executedWatch = await executeWatch(executeDetails, watch); + const formattedResults = WatchHistoryItem.fromUpstreamJson( + executedWatch.watchHistoryItem + ); + setExecuteResults(formattedResults); + } catch (e) { + return toastNotifications.addDanger(e.data.message); + } + }} + > + {i18n.translate('xpack.watcher.sections.watchEdit.simulate.form.saveButtonLabel', { + defaultMessage: 'Simulate watch', + })} + + +
+ ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx new file mode 100644 index 00000000000000..cc67aefe98650e --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx @@ -0,0 +1,174 @@ +/* + * 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 React from 'react'; + +import { + EuiBasicTable, + EuiCodeBlock, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutHeader, + EuiHealth, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { find } from 'lodash'; +import { WATCH_STATES } from '../../../../common/constants'; +import { + BaseWatch, + ExecutedWatchDetails, + ExecutedWatchResults, +} from '../../../../common/types/watch_types'; + +const WATCH_ICON_COLORS = { + [WATCH_STATES.DISABLED]: 'subdued', + [WATCH_STATES.OK]: 'success', + [WATCH_STATES.FIRING]: 'warning', + [WATCH_STATES.ERROR]: 'danger', + [WATCH_STATES.CONFIG_ERROR]: 'danger', +}; + +export const JsonWatchEditSimulateResults = ({ + executeDetails, + executeResults, + onCloseFlyout, + watch, +}: { + executeDetails: ExecutedWatchDetails; + executeResults: ExecutedWatchResults; + onCloseFlyout: () => void; + watch: BaseWatch; +}) => { + const getTableData = () => { + const actions = watch.actions; + const actionStatuses = executeResults.watchStatus.actionStatuses; + const actionModes = executeDetails.actionModes; + const actionDetails = actions.map(action => { + const actionMode = actionModes[action.id]; + const actionStatus = find(actionStatuses, { id: action.id }); + + return { + actionId: action.id, + actionType: action.type, + actionMode, + actionState: actionStatus && actionStatus.state, + actionReason: actionStatus && actionStatus.lastExecutionReason, + }; + }); + return actionDetails; + }; + + const tableData = getTableData(); + + const columns = [ + { + field: 'actionId', + name: i18n.translate( + 'xpack.watcher.sections.watchEdit.simulateResults.table.actionColumnLabel', + { + defaultMessage: 'ID', + } + ), + sortable: true, + truncateText: true, + }, + { + field: 'actionType', + name: i18n.translate( + 'xpack.watcher.sections.watchEdit.simulateResults.table.typeColumnLabel', + { + defaultMessage: 'Type', + } + ), + truncateText: true, + }, + { + field: 'actionMode', + name: i18n.translate( + 'xpack.watcher.sections.watchEdit.simulateResults.table.modeColumnLabel', + { + defaultMessage: 'Mode', + } + ), + }, + { + field: 'actionState', + name: i18n.translate( + 'xpack.watcher.sections.watchEdit.simulateResults.table.stateColumnLabel', + { + defaultMessage: 'State', + } + ), + dataType: 'string', + render: (actionState: string) => { + return {actionState}; + }, + }, + { + field: 'actionReason', + name: i18n.translate( + 'xpack.watcher.sections.watchEdit.simulateResults.table.reasonColumnLabel', + { + defaultMessage: 'Reason', + } + ), + }, + ]; + + return ( + { + onCloseFlyout(); + }} + aria-labelledby="simulateResultsFlyOutTitle" + > + + +

+ {i18n.translate('xpack.watcher.sections.watchEdit.simulateResults.title', { + defaultMessage: 'Simulation results', + })}{' '} + + {executeResults.watchStatus.state} + +

+
+
+ + +
+ {i18n.translate( + 'xpack.watcher.sections.watchEdit.simulateResults.actionsSectionTitle', + { + defaultMessage: 'Actions', + } + )} +
+
+ + + + +
+ {i18n.translate( + 'xpack.watcher.sections.watchEdit.simulateResults.simulationOutputSectionTitle', + { + defaultMessage: 'Simulation output', + } + )} +
+
+ + + {JSON.stringify(executeResults.details, null, 2)} + +
+
+ ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx new file mode 100644 index 00000000000000..883800e57ea453 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx @@ -0,0 +1,608 @@ +/* + * 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 React, { Fragment, useContext, useEffect, useState } from 'react'; + +import { + EuiComboBox, + EuiComboBoxOptionProps, + EuiExpression, + EuiFieldNumber, + EuiFieldText, + EuiFlexGroup, + EuiFlexItem, + EuiForm, + EuiPageContent, + EuiPopover, + EuiPopoverTitle, + EuiSelect, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; +import { ThresholdWatch } from 'plugins/watcher/models/watch/threshold_watch'; +import { ErrableFormRow } from '../../../components/form_errors'; +import { fetchFields, getMatchingIndices } from '../../../lib/api'; +import { aggTypes } from '../agg_types'; +import { comparators } from '../comparators'; +import { groupByTypes } from '../group_by_types'; +import { timeUnits } from '../time_units'; +import { WatchContext } from './watch_context'; +const firstFieldOption = { + text: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel', { + defaultMessage: 'Select a field', + }), + value: '', +}; +const getFields = async (indices: string[]) => { + return await fetchFields(indices); +}; +const getTimeFieldOptions = (fields: any) => { + const options = [firstFieldOption]; + if (!fields.length) { + return options; + } + + fields.forEach((field: any) => { + if (field.type === 'date') { + options.push({ + text: field.name, + value: field.name, + }); + } + }); + return options; +}; +interface IOption { + label: string; + options: Array<{ value: string; label: string }>; +} +const getIndexOptions = async (patternString: string, indexPatterns: string[]) => { + const options: IOption[] = []; + if (!patternString) { + return options; + } + const matchingIndices = (await getMatchingIndices(patternString)) as string[]; + const matchingIndexPatterns = indexPatterns.filter(anIndexPattern => { + return anIndexPattern.includes(patternString); + }) as string[]; + if (matchingIndices) { + options.push({ + label: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.indicesAndAliasesLabel', { + defaultMessage: 'Based on your indices/aliases', + }), + options: matchingIndices.map(matchingIndex => { + return { + label: matchingIndex, + value: matchingIndex, + }; + }), + }); + } + if (matchingIndexPatterns) { + options.push({ + label: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.indexPatternLabel', { + defaultMessage: 'Based on your index patterns', + }), + options: matchingIndexPatterns.map(matchingIndexPattern => { + return { + label: matchingIndexPattern, + value: matchingIndexPattern, + }; + }), + }); + } + options.push({ + label: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.chooseLabel', { + defaultMessage: 'Choose...', + }), + options: [ + { + value: patternString, + label: patternString, + }, + ], + }); + return options; +}; + +const ThresholdWatchEditUi = ({ + intl, + savedObjectsClient, + pageTitle, +}: { + intl: InjectedIntl; + savedObjectsClient: any; + pageTitle: string; +}) => { + // hooks + const [indexPatterns, setIndexPatterns] = useState([]); + const [fields, setFields] = useState([]); + const [indexOptions, setIndexOptions] = useState([]); + const [timeFieldOptions, setTimeFieldOptions] = useState([firstFieldOption]); + + const [aggFieldPopoverOpen, setAggFieldPopoverOpen] = useState(false); + const [groupByPopoverOpen, setGroupByPopoverOpen] = useState(false); + const [watchThresholdPopoverOpen, setWatchThresholdPopoverOpen] = useState(false); + const [watchDurationPopoverOpen, setWatchDurationPopoverOpen] = useState(false); + const [aggTypePopoverOpen, setAggTypePopoverOpen] = useState(false); + const { watch, setWatch } = useContext(WatchContext); + const getIndexPatterns = async () => { + const { savedObjects } = await savedObjectsClient.find({ + type: 'index-pattern', + fields: ['title'], + perPage: 10000, + }); + const titles = savedObjects.map((indexPattern: any) => indexPattern.attributes.title); + setIndexPatterns(titles); + }; + const loadData = async () => { + const theFields = await getFields(watch.index); + setFields(theFields); + setTimeFieldOptions(getTimeFieldOptions(fields)); + getIndexPatterns(); + }; + useEffect(() => { + loadData(); + }, []); + return ( + + + + +

{pageTitle}

+
+ + + {watch.titleDescription} + +
+
+ + + + } + errorKey="watchName" + isShowingErrors={false} + errors={{}} + > + { + setWatch(new ThresholdWatch({ ...watch, name: e.target.value })); + }} + /> + + + + + } + errorKey="watchName" + isShowingErrors={false} + errors={{}} + helpText={ + + } + > + { + return { + label: anIndex, + value: anIndex, + }; + })} + onChange={async (selected: EuiComboBoxOptionProps[]) => { + watch.index = selected.map(aSelected => aSelected.value); + setWatch(new ThresholdWatch(watch)); + setWatch(new ThresholdWatch(watch)); + const indices = selected.map(s => s.value as string); + const theFields = await getFields(indices); + setFields(theFields); + + setTimeFieldOptions(getTimeFieldOptions(fields)); + }} + onSearchChange={async search => { + setIndexOptions(await getIndexOptions(search, indexPatterns)); + }} + /> + + + + + } + errorKey="watchName" + isShowingErrors={false} + errors={{}} + > + { + watch.timeField = e.target.value; + setWatch(new ThresholdWatch(watch)); + }} + /> + + + + + + + { + watch.triggerIntervalSize = e.target.value; + setWatch(new ThresholdWatch(watch)); + }} + /> + + + { + watch.triggerIntervalUnit = e.target.value; + setWatch(new ThresholdWatch(watch)); + }} + options={[ + { + value: 's', + text: intl.formatMessage({ + id: 'xpack.watcher.sections.watchEdit.titlePanel.secondsLabel', + defaultMessage: 'seconds', + }), + }, + { + value: 'm', + text: intl.formatMessage({ + id: 'xpack.watcher.sections.watchEdit.titlePanel.minutesLabel', + defaultMessage: 'minutes', + }), + }, + { + value: 'd', + text: intl.formatMessage({ + id: 'xpack.watcher.sections.watchEdit.titlePanel.daysLabel', + defaultMessage: 'days', + }), + }, + { + value: 'h', + text: intl.formatMessage({ + id: 'xpack.watcher.sections.watchEdit.titlePanel.hoursLabel', + defaultMessage: 'hours', + }), + }, + ]} + /> + + + + + + + + + { + setAggTypePopoverOpen(true); + }} + /> + } + isOpen={aggTypePopoverOpen} + closePopover={() => { + setAggTypePopoverOpen(false); + }} + ownFocus + withTitle + anchorPosition="downLeft" + > +
+ when + { + watch.aggType = e.target.value; + setWatch(new ThresholdWatch(watch)); + setAggTypePopoverOpen(false); + }} + options={Object.values(aggTypes)} + /> +
+
+
+ {watch.aggType && aggTypes[watch.aggType].fieldRequired ? ( + + { + setAggFieldPopoverOpen(true); + }} + /> + } + isOpen={aggFieldPopoverOpen} + closePopover={() => { + setAggFieldPopoverOpen(false); + }} + ownFocus + anchorPosition="downLeft" + > +
+ of + + + { + watch.aggField = e.target.value; + setWatch(new ThresholdWatch(watch)); + setAggFieldPopoverOpen(false); + }} + options={fields.reduce( + (options, field: any) => { + if ( + aggTypes[watch.aggType].validNormalizedTypes.includes( + field.normalizedType + ) + ) { + options.push({ + text: field.name, + value: field.name, + }); + } + return options; + }, + [ + { + text: 'select a field', + value: '', + }, + ] + )} + /> + + +
+
+
+ ) : null} + + { + setGroupByPopoverOpen(true); + }} + /> + } + isOpen={groupByPopoverOpen} + closePopover={() => { + setGroupByPopoverOpen(false); + }} + ownFocus + withTitle + anchorPosition="downLeft" + > +
+ over + + + { + watch.groupBy = e.target.value; + setWatch(new ThresholdWatch(watch)); + }} + options={Object.values(groupByTypes)} + /> + + + {groupByTypes[watch.groupBy].sizeRequired ? ( + + + + + + { + watch.aggField = e.target.value; + setWatch(new ThresholdWatch(watch)); + setAggFieldPopoverOpen(false); + }} + options={fields.reduce( + (options, field: any) => { + if ( + groupByTypes[watch.groupBy].validNormalizedTypes.includes( + field.normalizedType + ) + ) { + options.push({ + text: field.name, + value: field.name, + }); + } + return options; + }, + [] as Array<{ text: string; value: string }> + )} + /> + + + ) : null} + +
+
+
+ + { + setWatchThresholdPopoverOpen(true); + }} + /> + } + isOpen={watchThresholdPopoverOpen} + closePopover={() => { + setWatchThresholdPopoverOpen(false); + }} + ownFocus + withTitle + anchorPosition="downLeft" + > +
+ {comparators[watch.thresholdComparator].text} + + + { + watch.thresholdComparator = e.target.value; + setWatch(new ThresholdWatch(watch)); + }} + options={Object.values(comparators)} + /> + + + { + watch.threshold = parseInt(e.target.value, 10); + setWatch(new ThresholdWatch(watch)); + }} + /> + + +
+
+
+ + { + setWatchDurationPopoverOpen(true); + }} + /> + } + isOpen={watchDurationPopoverOpen} + closePopover={() => { + setWatchDurationPopoverOpen(false); + }} + ownFocus + withTitle + anchorPosition="downLeft" + > +
+ For the last + + + { + watch.timeWindowSize = e.target.value; + setWatch(new ThresholdWatch(watch)); + }} + /> + + + { + watch.timeWindowUnit = e.target.value; + setWatch(new ThresholdWatch(watch)); + }} + options={Object.entries(timeUnits).map(([key, value]) => { + return { + text: + watch.timeWindowSize && parseInt(watch.timeWindowSize, 10) === 1 + ? value.labelSingular + : value.labelPlural, + value: key, + }; + })} + /> + + +
+
+
+
+
+
+ ); +}; +export const ThresholdWatchEdit = injectI18n(ThresholdWatchEditUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_context.ts b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_context.ts new file mode 100644 index 00000000000000..a786f7534e37a1 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_context.ts @@ -0,0 +1,8 @@ +/* + * 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 React from 'react'; +export const WatchContext = React.createContext({} as any); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx new file mode 100644 index 00000000000000..51a8e692e49300 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -0,0 +1,89 @@ +/* + * 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 { EuiLoadingSpinner, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { Watch } from 'plugins/watcher/models/watch'; +import React, { useEffect, useState } from 'react'; +import { WATCH_TYPES } from '../../../../common/constants'; +import { BaseWatch } from '../../../../common/types/watch_types'; +import { loadWatch } from '../../../lib/api'; +import { JsonWatchEdit } from './json_watch_edit_component'; +import { ThresholdWatchEdit } from './threshold_watch_edit_component'; +import { WatchContext } from './watch_context'; + +const getTitle = (watch: BaseWatch) => { + if (watch.isNew) { + const typeName = watch.typeName.toLowerCase(); + return i18n.translate( + 'xpack.watcher.sections.watchEdit.json.titlePanel.createNewTypeOfWatchTitle', + { + defaultMessage: 'Create a new {typeName}', + values: { typeName }, + } + ); + } else { + return i18n.translate('xpack.watcher.sections.watchEdit.json.titlePanel.editWatchTitle', { + defaultMessage: 'Edit {watchName}', + values: { watchName: watch.name ? watch.name : watch.id }, + }); + } +}; + +export const WatchEdit = ({ + watchId, + watchType, + savedObjectsClient, + kbnUrl, + licenseService, +}: { + watchId: string; + watchType: string; + savedObjectsClient: any; + kbnUrl: any; + licenseService: any; +}) => { + // hooks + const [watch, setWatch] = useState(null); + const getWatch = async () => { + let theWatch; + if (watchId) { + theWatch = await loadWatch(watchId); + setWatch(theWatch); + } else { + const WatchType = Watch.getWatchTypes()[watchType]; + if (WatchType) { + setWatch(new WatchType()); + } + } + }; + useEffect(() => { + getWatch(); + }, []); + if (!watch) { + return ; + } + const pageTitle = getTitle(watch); + let EditComponent = null; + if (watch.type === WATCH_TYPES.THRESHOLD) { + EditComponent = ThresholdWatchEdit; + } else { + EditComponent = EuiSpacer; + } + if (watch.type === WATCH_TYPES.JSON) { + EditComponent = JsonWatchEdit; + } + return ( + + + + ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/group_by_types.ts b/x-pack/plugins/watcher/public/sections/watch_edit/group_by_types.ts new file mode 100644 index 00000000000000..37dee2f9946e3d --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/group_by_types.ts @@ -0,0 +1,31 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +export interface GroupByType { + text: string; + sizeRequired: boolean; + value: string; + validNormalizedTypes: string[]; +} +export const groupByTypes: { [key: string]: GroupByType } = { + all: { + text: i18n.translate('xpack.watcher.thresholdWatchExpression.groupByLabel.allDocumentsLabel', { + defaultMessage: 'all documents', + }), + sizeRequired: false, + value: 'all', + validNormalizedTypes: [], + }, + top: { + text: i18n.translate('xpack.watcher.thresholdWatchExpression.groupByLabel.topLabel', { + defaultMessage: 'top', + }), + sizeRequired: true, + value: 'top', + validNormalizedTypes: ['number', 'date', 'keyword'], + }, +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/json_watch_edit_actions.ts b/x-pack/plugins/watcher/public/sections/watch_edit/json_watch_edit_actions.ts new file mode 100644 index 00000000000000..2eec64dab2404c --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/json_watch_edit_actions.ts @@ -0,0 +1,144 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { toastNotifications } from 'ui/notify'; +import { ACTION_TYPES } from '../../../common/constants'; +import { BaseWatch } from '../../../common/types/watch_types'; +import { createWatch, loadWatch } from '../../lib/api'; + +/** + * Get the type from an action where a key defines its type. + * eg: { email: { ... } } | { slack: { ... } } + */ +function getTypeFromAction(action: { [key: string]: any }) { + const actionKeys = Object.keys(action); + let type; + Object.keys(ACTION_TYPES).forEach(k => { + if (actionKeys.includes(ACTION_TYPES[k])) { + type = ACTION_TYPES[k]; + } + }); + + return type ? type : ACTION_TYPES.UNKNOWN; +} + +function getPropsFromAction(type: string, action: { [key: string]: any }) { + if (type === ACTION_TYPES.SLACK) { + // Slack action has its props inside the "message" object + return action[type].message; + } + return action[type]; +} + +/** + * Actions instances are not automatically added to the Watch _actions_ Array + * when we add them in the Json editor. This method takes takes care of it. + */ +function createActionsForWatch(watchInstance: BaseWatch) { + watchInstance.resetActions(); + + let action; + let type; + let actionProps; + + Object.keys(watchInstance.watch.actions).forEach(k => { + action = watchInstance.watch.actions[k]; + type = getTypeFromAction(action); + actionProps = getPropsFromAction(type, action); + watchInstance.createAction(type, actionProps); + }); + return watchInstance; +} + +export async function saveWatch(watch: BaseWatch, kbnUrl: any, licenseService: any) { + try { + await createWatch(watch); + toastNotifications.addSuccess( + i18n.translate('xpack.watcher.sections.watchEdit.json.saveSuccessNotificationText', { + defaultMessage: "Saved '{watchDisplayName}'", + values: { + watchDisplayName: watch.displayName, + }, + }) + ); + // TODO: Not correctly redirecting back to /watches route + kbnUrl.change('/management/elasticsearch/watcher/watches', {}); + } catch (error) { + return licenseService + .checkValidity() + .then(() => toastNotifications.addDanger(error.data.message)); + } +} + +export async function validateActionsAndSaveWatch( + watch: BaseWatch, + kbnUrl: any, + licenseService: any +) { + const { warning } = watch.validate(); + if (warning) { + return { + error: { + message: warning.message, + }, + }; + } + // client validation passed, make request to create watch + saveWatch(watch, kbnUrl, licenseService); +} + +export async function onWatchSave( + watch: BaseWatch, + kbnUrl: any, + licenseService: any +): Promise { + const watchActions = watch.watch && watch.watch.actions; + const watchData = watchActions ? createActionsForWatch(watch) : watch; + + if (!watchData.isNew) { + return validateActionsAndSaveWatch(watch, kbnUrl, licenseService); + } + + try { + const existingWatch = await loadWatch(watchData.id); + if (existingWatch) { + return { + error: { + message: i18n.translate( + 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.descriptionText', + { + defaultMessage: + 'Watch with ID "{watchId}" {watchNameMessageFragment} already exists. Do you want to overwrite it?', + values: { + watchId: existingWatch.id, + watchNameMessageFragment: existingWatch.name + ? i18n.translate( + 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.descriptionFragmentText', + { + defaultMessage: '(name: "{existingWatchName}")', + values: { + existingWatchName: existingWatch.name, + }, + } + ) + : '', + }, + } + ), + }, + }; + } + } catch (error) { + // Confirms watcher does not already exist + return licenseService.checkValidity().then(() => { + if (error.status === 404) { + return validateActionsAndSaveWatch(watchData, kbnUrl, licenseService); + } + return toastNotifications.addDanger(error.data.message); + }); + } +} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/time_units.ts b/x-pack/plugins/watcher/public/sections/watch_edit/time_units.ts new file mode 100644 index 00000000000000..3b5ed35044f48b --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/time_units.ts @@ -0,0 +1,55 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { TIME_UNITS as COMMON_TIME_UNITS } from '../../../common/constants/time_units'; + +interface TimeUnit { + labelPlural: string; + labelSingular: string; +} +export const timeUnits: { [key: string]: TimeUnit } = { + [COMMON_TIME_UNITS.MILLISECOND]: { + labelPlural: i18n.translate('xpack.watcher.timeUnits.millisecondPluralLabel', { + defaultMessage: 'milliseconds', + }), + labelSingular: i18n.translate('xpack.watcher.timeUnits.millisecondSingularLabel', { + defaultMessage: 'millisecond', + }), + }, + [COMMON_TIME_UNITS.SECOND]: { + labelPlural: i18n.translate('xpack.watcher.timeUnits.secondPluralLabel', { + defaultMessage: 'seconds', + }), + labelSingular: i18n.translate('xpack.watcher.timeUnits.secondSingularLabel', { + defaultMessage: 'second', + }), + }, + [COMMON_TIME_UNITS.MINUTE]: { + labelPlural: i18n.translate('xpack.watcher.timeUnits.minutePluralLabel', { + defaultMessage: 'minutes', + }), + labelSingular: i18n.translate('xpack.watcher.timeUnits.minuteSingularLabel', { + defaultMessage: 'minute', + }), + }, + [COMMON_TIME_UNITS.HOUR]: { + labelPlural: i18n.translate('xpack.watcher.timeUnits.hourPluralLabel', { + defaultMessage: 'hours', + }), + labelSingular: i18n.translate('xpack.watcher.timeUnits.hourSingularLabel', { + defaultMessage: 'hour', + }), + }, + [COMMON_TIME_UNITS.DAY]: { + labelPlural: i18n.translate('xpack.watcher.timeUnits.dayPluralLabel', { + defaultMessage: 'days', + }), + labelSingular: i18n.translate('xpack.watcher.timeUnits.daySingularLabel', { + defaultMessage: 'day', + }), + }, +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.html b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.html index b23df49ffe4273..027183a5d6b15a 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.html +++ b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.html @@ -1,3 +1,6 @@ + +
+
{ + render( + + + , + elem + ); +}; routes .when('/management/elasticsearch/watcher/watches/watch/:id/edit') .when('/management/elasticsearch/watcher/watches/new-watch/:watchType') - .defaults(/management\/elasticsearch\/watcher\/watches\/(new-watch\/:watchType|watch\/:id\/edit)/, { - template: template, - k7Breadcrumbs: getWatchDetailBreadcrumbs, - controller: class WatchEditRouteController { - constructor($injector) { - const $route = $injector.get('$route'); - this.watch = $route.current.locals.xpackWatch; - this.WATCH_TYPES = WATCH_TYPES; - } - }, - controllerAs: 'watchEditRoute', - resolve: { - watchTabs: ($injector) => { - const $route = $injector.get('$route'); - const watchId = $route.current.params.id; - updateWatchSections(watchId); - }, - xpackWatch: function ($injector) { - const $route = $injector.get('$route'); - const watchService = $injector.get('xpackWatcherWatchService'); - const licenseService = $injector.get('xpackWatcherLicenseService'); - const kbnUrl = $injector.get('kbnUrl'); + .defaults( + /management\/elasticsearch\/watcher\/watches\/(new-watch\/:watchType|watch\/:id\/edit)/, + { + template: template, + k7Breadcrumbs: getWatchDetailBreadcrumbs, + controller: class WatchEditRouteController { + constructor($injector, $scope, $http, Private) { + const $route = $injector.get('$route'); + const kbnUrl = $injector.get('kbnUrl'); + const licenseService = $injector.get('xpackWatcherLicenseService'); + this.watch = $route.current.locals.xpackWatch; + this.WATCH_TYPES = WATCH_TYPES; + const watchId = $route.current.params.id; + const watchType = $route.current.params.watchType; + // clean up previously rendered React app if one exists + // this happens because of React Router redirects + elem && unmountComponentAtNode(elem); + // NOTE: We depend upon Angular's $http service because it's decorated with interceptors, + // e.g. to check license status per request. + setHttpClient($http); + $scope.$$postDigest(() => { + elem = document.getElementById('watchEditReactRoot'); + const savedObjectsClient = Private(SavedObjectsClientProvider); - const watchId = $route.current.params.id; - const watchType = $route.current.params.watchType; + renderReact(elem, watchType, watchId, savedObjectsClient, kbnUrl, licenseService); + manageAngularLifecycle($scope, $route, elem); + }); + } + }, + controllerAs: 'watchEditRoute', + resolve: { + watchTabs: $injector => { + const $route = $injector.get('$route'); + const watchId = $route.current.params.id; + updateWatchSections(watchId); + }, + xpackWatch: function ($injector) { + const $route = $injector.get('$route'); + const watchService = $injector.get('xpackWatcherWatchService'); + const licenseService = $injector.get('xpackWatcherLicenseService'); + const kbnUrl = $injector.get('kbnUrl'); + const watchId = $route.current.params.id; + const watchType = $route.current.params.watchType; - if (!watchId) { - return licenseService.refreshLicense() - .then(() => { - return watchService.newWatch(watchType); - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => { + if (!watchId) { + return licenseService + .refreshLicense() + .then(() => { + return watchService.newWatch(watchType); + }) + .catch(err => { + return licenseService.checkValidity().then(() => { if (err.status !== 403) { toastNotifications.addDanger(err.data.message); } @@ -60,25 +99,24 @@ routes kbnUrl.redirect('/management/elasticsearch/watcher/watches'); return Promise.reject(); }); - }); - } + }); + } - return watchService.loadWatch(watchId) - .catch(err => { - return licenseService.checkValidity() - .then(() => { - if (err.status !== 403) { - toastNotifications.addDanger(err.data.message); - } + return watchService.loadWatch(watchId).catch(err => { + return licenseService.checkValidity().then(() => { + if (err.status !== 403) { + toastNotifications.addDanger(err.data.message); + } - kbnUrl.redirect('/management/elasticsearch/watcher/watches'); - return Promise.reject(); - }); + kbnUrl.redirect('/management/elasticsearch/watcher/watches'); + return Promise.reject(); + }); }); + }, + checkLicense: $injector => { + const licenseService = $injector.get('xpackWatcherLicenseService'); + return licenseService.checkValidity(); + }, }, - checkLicense: ($injector) => { - const licenseService = $injector.get('xpackWatcherLicenseService'); - return licenseService.checkValidity(); - } } - }); + ); diff --git a/x-pack/plugins/watcher/server/models/execute_details/execute_details.js b/x-pack/plugins/watcher/server/models/execute_details/execute_details.js index 2c67c4896cbcdc..229bd29f07e2d4 100644 --- a/x-pack/plugins/watcher/server/models/execute_details/execute_details.js +++ b/x-pack/plugins/watcher/server/models/execute_details/execute_details.js @@ -18,7 +18,7 @@ export class ExecuteDetails { get upstreamJson() { const triggerData = { triggered_time: this.triggerData.triggeredTime, - scheduled_time: this.triggerData.scheduledTime + scheduled_time: this.triggerData.scheduledTime, }; const result = { From 7de0bff071b6467c273290600599d300661112d7 Mon Sep 17 00:00:00 2001 From: Bill McConaghy Date: Wed, 10 Apr 2019 12:44:44 -0400 Subject: [PATCH 03/51] partial progress on threshold watch form including validation (#34819) * partial progress on threshold watch form including validation * fixing tsc issues * cleaning up some PR feedback --- .../watcher/public/components/form_errors.tsx | 8 +- .../watcher/public/models/watch/base_watch.js | 2 +- .../public/models/watch/threshold_watch.js | 41 ++++- .../components/json_watch_edit_component.tsx | 6 +- .../components/json_watch_edit_form.tsx | 26 ++-- .../threshold_watch_edit_component.tsx | 147 ++++++++++++------ .../watch_edit/components/watch_edit.tsx | 43 +++-- ..._edit_actions.ts => watch_edit_actions.ts} | 16 +- .../sections/watch_edit/watch_edit_route.js | 13 +- 9 files changed, 200 insertions(+), 102 deletions(-) rename x-pack/plugins/watcher/public/sections/watch_edit/{json_watch_edit_actions.ts => watch_edit_actions.ts} (90%) diff --git a/x-pack/plugins/watcher/public/components/form_errors.tsx b/x-pack/plugins/watcher/public/components/form_errors.tsx index 4bedc582f23f5f..4314a8c877e259 100644 --- a/x-pack/plugins/watcher/public/components/form_errors.tsx +++ b/x-pack/plugins/watcher/public/components/form_errors.tsx @@ -26,13 +26,7 @@ export const ErrableFormRow = ({ error={errors[errorKey]} {...rest} > - - {Children.map(children, child => - cloneElement(child, { - isInvalid: isShowingErrors && errors[errorKey].length > 0, - }) - )} - + {Children.map(children, child => cloneElement(child))} ); }; diff --git a/x-pack/plugins/watcher/public/models/watch/base_watch.js b/x-pack/plugins/watcher/public/models/watch/base_watch.js index 5cd96dce91690c..c19e20db5ea90b 100644 --- a/x-pack/plugins/watcher/public/models/watch/base_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/base_watch.js @@ -29,7 +29,7 @@ export class BaseWatch { this.type = get(props, 'type'); this.isNew = get(props, 'isNew', true); - this.name = get(props, 'name', ''); + this.name = get(props, 'name'); this.isSystemWatch = Boolean(get(props, 'isSystemWatch')); this.watchStatus = WatchStatus.fromUpstreamJson(get(props, 'watchStatus')); this.watchErrors = WatchErrors.fromUpstreamJson(get(props, 'watchErrors')); diff --git a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js index d32177844f90bc..efc4abc46c6665 100644 --- a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js @@ -31,13 +31,13 @@ export class ThresholdWatch extends BaseWatch { props.type = WATCH_TYPES.THRESHOLD; super(props); - this.index = props.index || []; + this.index = props.index; this.timeField = props.timeField; - this.triggerIntervalSize = props.triggerIntervalSize || DEFAULT_VALUES.TRIGGER_INTERVAL_SIZE; + this.triggerIntervalSize = props.triggerIntervalSize == null ? DEFAULT_VALUES.TRIGGER_INTERVAL_SIZE : props.triggerIntervalSize; this.triggerIntervalUnit = props.triggerIntervalUnit || DEFAULT_VALUES.TRIGGER_INTERVAL_UNIT; this.aggType = props.aggType || DEFAULT_VALUES.AGG_TYPE; this.aggField = props.aggField; - this.termSize = props.termSize || DEFAULT_VALUES.TERM_SIZE; + this.termSize = props.termSize == null ? DEFAULT_VALUES.TERM_SIZE : props.termSize; this.termField = props.termField; this.thresholdComparator = props.thresholdComparator || DEFAULT_VALUES.THRESHOLD_COMPARATOR; this.timeWindowSize = props.timeWindowSize || DEFAULT_VALUES.TIME_WINDOW_SIZE; @@ -47,7 +47,7 @@ export class ThresholdWatch extends BaseWatch { //NOTE: The threshold must be of the appropriate type, i.e.,number/date. //Conversion from string must occur by consumer when assigning a //value to this property. - this.threshold = props.threshold || DEFAULT_VALUES.THRESHOLD; + this.threshold = props.threshold == null ? DEFAULT_VALUES.THRESHOLD : props.threshold; } get hasTermsAgg() { @@ -84,7 +84,38 @@ export class ThresholdWatch extends BaseWatch { ); return `${staticPart} ${dynamicPartText}`; } - + validate() { + const validationResult = super.validate(); + const errors = { + name: [], + index: [], + timeField: [], + triggerIntervalSize: [], + }; + validationResult.errors = errors; + if (!this.name) { + errors.name.push(i18n.translate('xpack.watcher.sections.watchEdit.threshold.error.requiredNameText', { + defaultMessage: 'Name is required', + })); + } + if (this.index !== undefined && this.index.length < 1) { + errors.index.push(i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.enterOneOrMoreIndicesValidationMessage', { + defaultMessage: 'Enter one or more indices' + })); + } + if (!this.timeField) { + errors.timeField.push(i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldIsRequiredValidationText', { + defaultMessage: 'A time field is required' + })); + } + if (!this.triggerIntervalSize) { + errors.triggerIntervalSize.push( + i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.intervalSizeIsRequiredValidationMessage', { + defaultMessage: 'Interval size is required' + })); + } + return validationResult; + } get upstreamJson() { const result = super.upstreamJson; Object.assign(result, { diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx index 47e1b26dc366e0..c43e8ecdda937b 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx @@ -23,11 +23,11 @@ import { WatchContext } from './watch_context'; const JsonWatchEditUi = ({ pageTitle, - kbnUrl, + urlService, licenseService, }: { pageTitle: string; - kbnUrl: any; + urlService: any; licenseService: any; }) => { const { watch } = useContext(WatchContext); @@ -85,7 +85,7 @@ const JsonWatchEditUi = ({ )} {selectedTab === WATCH_TAB_ID_EDIT && ( setWatchJsonString(json)} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx index d2e77c938cfadd..b110f64aa365a8 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx @@ -18,11 +18,10 @@ import { EuiLink, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { JsonWatch } from 'plugins/watcher/models/watch/json_watch'; import { ConfirmWatchesModal } from '../../../components/confirm_watches_modal'; import { ErrableFormRow } from '../../../components/form_errors'; import { documentationLinks } from '../../../lib/documentation_links'; -import { onWatchSave, saveWatch } from '../json_watch_edit_actions'; +import { onWatchSave, saveWatch } from '../watch_edit_actions'; import { WatchContext } from './watch_context'; const JSON_WATCH_IDS = { @@ -39,14 +38,14 @@ function validateId(id: string) { }); } else if (!regex.test(id)) { return i18n.translate('xpack.watcher.sections.watchEdit.json.error.invalidIdText', { - defaultMessage: 'ID must only letters, underscores, dashes, and numbers.', + defaultMessage: 'ID can only contain letters, underscores, dashes, and numbers.', }); } return false; } export const JsonWatchEditForm = ({ - kbnUrl, + urlService, licenseService, watchJsonString, setWatchJsonString, @@ -55,7 +54,7 @@ export const JsonWatchEditForm = ({ isShowingErrors, setIsShowingErrors, }: { - kbnUrl: any; + urlService: any; licenseService: any; watchJsonString: string; setWatchJsonString: (json: string) => void; @@ -64,7 +63,7 @@ export const JsonWatchEditForm = ({ isShowingErrors: boolean; setIsShowingErrors: (isShowingErrors: boolean) => void; }) => { - const { watch, setWatch } = useContext(WatchContext); + const { watch, setWatchProperty } = useContext(WatchContext); // hooks const [modal, setModal] = useState<{ message: string } | null>(null); return ( @@ -73,7 +72,7 @@ export const JsonWatchEditForm = ({ modalOptions={modal} callback={async isConfirmed => { if (isConfirmed) { - saveWatch(watch, kbnUrl, licenseService); + saveWatch(watch, urlService, licenseService); } setModal(null); }} @@ -103,7 +102,7 @@ export const JsonWatchEditForm = ({ ); setErrors(newErrors); setIsShowingErrors(isInvalidForm); - setWatch(new JsonWatch({ ...watch, id })); + setWatchProperty('id', id); }} /> @@ -119,7 +118,7 @@ export const JsonWatchEditForm = ({ name="name" value={watch.name} onChange={(e: React.ChangeEvent) => { - setWatch(new JsonWatch({ ...watch, name: e.target.value })); + setWatchProperty('name', e.target.value); }} /> @@ -161,12 +160,7 @@ export const JsonWatchEditForm = ({ try { const watchJson = JSON.parse(json); if (watchJson && typeof watchJson === 'object') { - setWatch( - new JsonWatch({ - ...watch, - watch: watchJson, - }) - ); + setWatchProperty('watch', watchJson); const newErrors = { ...errors, [JSON_WATCH_IDS.JSON]: [] }; const isInvalidForm = !!Object.keys(newErrors).find( errorKey => newErrors[errorKey].length >= 1 @@ -199,7 +193,7 @@ export const JsonWatchEditForm = ({ setErrors({ ...errors, [JSON_WATCH_IDS.ID]: error ? [error] : [] }); setIsShowingErrors(!!error); if (!error) { - const savedWatch = await onWatchSave(watch, kbnUrl, licenseService); + const savedWatch = await onWatchSave(watch, urlService, licenseService); if (savedWatch && savedWatch.error) { return setModal(savedWatch.error); } diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx index 883800e57ea453..01048a7167b60f 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx @@ -7,6 +7,8 @@ import React, { Fragment, useContext, useEffect, useState } from 'react'; import { + EuiButton, + EuiButtonEmpty, EuiComboBox, EuiComboBoxOptionProps, EuiExpression, @@ -25,13 +27,14 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; -import { ThresholdWatch } from 'plugins/watcher/models/watch/threshold_watch'; +import { ConfirmWatchesModal } from '../../../components/confirm_watches_modal'; import { ErrableFormRow } from '../../../components/form_errors'; import { fetchFields, getMatchingIndices } from '../../../lib/api'; import { aggTypes } from '../agg_types'; import { comparators } from '../comparators'; import { groupByTypes } from '../group_by_types'; import { timeUnits } from '../time_units'; +import { onWatchSave, saveWatch } from '../watch_edit_actions'; import { WatchContext } from './watch_context'; const firstFieldOption = { text: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel', { @@ -115,10 +118,14 @@ const ThresholdWatchEditUi = ({ intl, savedObjectsClient, pageTitle, + urlService, + licenseService, }: { intl: InjectedIntl; savedObjectsClient: any; pageTitle: string; + urlService: any; + licenseService: any; }) => { // hooks const [indexPatterns, setIndexPatterns] = useState([]); @@ -131,7 +138,8 @@ const ThresholdWatchEditUi = ({ const [watchThresholdPopoverOpen, setWatchThresholdPopoverOpen] = useState(false); const [watchDurationPopoverOpen, setWatchDurationPopoverOpen] = useState(false); const [aggTypePopoverOpen, setAggTypePopoverOpen] = useState(false); - const { watch, setWatch } = useContext(WatchContext); + const [modal, setModal] = useState<{ message: string } | null>(null); + const { watch, setWatchProperty } = useContext(WatchContext); const getIndexPatterns = async () => { const { savedObjects } = await savedObjectsClient.find({ type: 'index-pattern', @@ -144,12 +152,15 @@ const ThresholdWatchEditUi = ({ const loadData = async () => { const theFields = await getFields(watch.index); setFields(theFields); - setTimeFieldOptions(getTimeFieldOptions(fields)); + setTimeFieldOptions(getTimeFieldOptions(theFields)); getIndexPatterns(); }; useEffect(() => { loadData(); }, []); + const { errors } = watch.validate(); + const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); + return ( @@ -164,6 +175,15 @@ const ThresholdWatchEditUi = ({ + { + if (isConfirmed) { + saveWatch(watch, urlService, licenseService); + } + setModal(null); + }} + /> } - errorKey="watchName" - isShowingErrors={false} - errors={{}} + errorKey="name" + isShowingErrors={hasErrors && watch.name !== undefined} + errors={errors} > { - setWatch(new ThresholdWatch({ ...watch, name: e.target.value })); + setWatchProperty('name', e.target.value); + }} + onBlur={() => { + if (!watch.name) { + setWatchProperty('name', ''); + } }} /> @@ -195,9 +220,9 @@ const ThresholdWatchEditUi = ({ defaultMessage="Indices to query" /> } - errorKey="watchName" - isShowingErrors={false} - errors={{}} + errorKey="index" + isShowingErrors={hasErrors && watch.index !== undefined} + errors={errors} helpText={ { + selectedOptions={(watch.index || []).map((anIndex: string) => { return { label: anIndex, value: anIndex, }; })} onChange={async (selected: EuiComboBoxOptionProps[]) => { - watch.index = selected.map(aSelected => aSelected.value); - setWatch(new ThresholdWatch(watch)); - setWatch(new ThresholdWatch(watch)); + setWatchProperty('index', selected.map(aSelected => aSelected.value)); const indices = selected.map(s => s.value as string); const theFields = await getFields(indices); setFields(theFields); - setTimeFieldOptions(getTimeFieldOptions(fields)); + setTimeFieldOptions(getTimeFieldOptions(theFields)); }} onSearchChange={async search => { setIndexOptions(await getIndexOptions(search, indexPatterns)); }} + onBlur={() => { + if (!watch.index) { + setWatchProperty('index', []); + } + }} /> @@ -239,17 +267,21 @@ const ThresholdWatchEditUi = ({ defaultMessage="Time field" /> } - errorKey="watchName" - isShowingErrors={false} - errors={{}} + errorKey="timeField" + isShowingErrors={hasErrors && watch.timeField !== undefined} + errors={errors} > { - watch.timeField = e.target.value; - setWatch(new ThresholdWatch(watch)); + setWatchProperty('timeField', e.target.value); + }} + onBlur={() => { + if (watch.timeField === undefined) { + setWatchProperty('timeField', ''); + } }} /> @@ -261,9 +293,9 @@ const ThresholdWatchEditUi = ({ id: 'xpack.watcher.sections.watchEdit.titlePanel.watchIntervalLabel', defaultMessage: 'Run watch every', })} - errorKey="watchInterval" - isShowingErrors={false} - errors={{}} + errorKey="triggerIntervalSize" + isShowingErrors={hasErrors && watch.triggerIntervalSize !== undefined} + errors={errors} > @@ -271,8 +303,14 @@ const ThresholdWatchEditUi = ({ min={1} value={watch.triggerIntervalSize} onChange={e => { - watch.triggerIntervalSize = e.target.value; - setWatch(new ThresholdWatch(watch)); + const { value } = e.target; + const triggerIntervalSize = value !== '' ? parseInt(value, 10) : value; + setWatchProperty('triggerIntervalSize', triggerIntervalSize); + }} + onBlur={e => { + if (watch.triggerIntervalSize === undefined) { + setWatchProperty('triggerIntervalSize', ''); + } }} /> @@ -284,8 +322,7 @@ const ThresholdWatchEditUi = ({ defaultMessage: 'Duration time unit', })} onChange={e => { - watch.triggerIntervalUnit = e.target.value; - setWatch(new ThresholdWatch(watch)); + setWatchProperty('triggerIntervalUnit', e.target.value); }} options={[ { @@ -351,8 +388,7 @@ const ThresholdWatchEditUi = ({ { - watch.aggType = e.target.value; - setWatch(new ThresholdWatch(watch)); + setWatchProperty('aggType', e.target.value); setAggTypePopoverOpen(false); }} options={Object.values(aggTypes)} @@ -388,8 +424,7 @@ const ThresholdWatchEditUi = ({ { - watch.aggField = e.target.value; - setWatch(new ThresholdWatch(watch)); + setWatchProperty('aggField', e.target.value); setAggFieldPopoverOpen(false); }} options={fields.reduce( @@ -448,8 +483,7 @@ const ThresholdWatchEditUi = ({ { - watch.groupBy = e.target.value; - setWatch(new ThresholdWatch(watch)); + setWatchProperty('groupBy', e.target.value); }} options={Object.values(groupByTypes)} /> @@ -464,8 +498,7 @@ const ThresholdWatchEditUi = ({ { - watch.aggField = e.target.value; - setWatch(new ThresholdWatch(watch)); + setWatchProperty('aggField', e.target.value); setAggFieldPopoverOpen(false); }} options={fields.reduce( @@ -520,8 +553,7 @@ const ThresholdWatchEditUi = ({ { - watch.thresholdComparator = e.target.value; - setWatch(new ThresholdWatch(watch)); + setWatchProperty('thresholdComparator', e.target.value); }} options={Object.values(comparators)} /> @@ -531,8 +563,9 @@ const ThresholdWatchEditUi = ({ value={watch.threshold} min={1} onChange={e => { - watch.threshold = parseInt(e.target.value, 10); - setWatch(new ThresholdWatch(watch)); + const { value } = e.target; + const threshold = value !== '' ? parseInt(value, 10) : value; + setWatchProperty('threshold', threshold); }} /> @@ -573,8 +606,9 @@ const ThresholdWatchEditUi = ({ min={1} value={watch.timeWindowSize} onChange={e => { - watch.timeWindowSize = e.target.value; - setWatch(new ThresholdWatch(watch)); + const { value } = e.target; + const timeWindowSize = value !== '' ? parseInt(value, 10) : value; + setWatchProperty('timeWindowSize', timeWindowSize); }} /> @@ -582,8 +616,7 @@ const ThresholdWatchEditUi = ({ { - watch.timeWindowUnit = e.target.value; - setWatch(new ThresholdWatch(watch)); + setWatchProperty('timeWindowUnit', e.target.value); }} options={Object.entries(timeUnits).map(([key, value]) => { return { @@ -601,6 +634,32 @@ const ThresholdWatchEditUi = ({ + + + { + const savedWatch = await onWatchSave(watch, urlService, licenseService); + if (savedWatch && savedWatch.error) { + return setModal(savedWatch.error); + } + }} + > + {i18n.translate('xpack.watcher.sections.watchEdit.threshold.saveButtonLabel', { + defaultMessage: 'Save', + })} + + + + + {i18n.translate('xpack.watcher.sections.watchEdit.threshold.cancelButtonLabel', { + defaultMessage: 'Cancel', + })} + + + ); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx index 51a8e692e49300..4b537bfe7e637f 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiLoadingSpinner, EuiSpacer } from '@elastic/eui'; +import { EuiLoadingSpinner } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Watch } from 'plugins/watcher/models/watch'; -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useReducer } from 'react'; import { WATCH_TYPES } from '../../../../common/constants'; import { BaseWatch } from '../../../../common/types/watch_types'; import { loadWatch } from '../../../lib/api'; @@ -32,31 +32,49 @@ const getTitle = (watch: BaseWatch) => { }); } }; +const watchReducer = (state: any, action: any) => { + const { command, payload } = action; + switch (command) { + case 'setWatch': + return payload; + case 'setProperty': + return new (Watch.getWatchTypes())[state.type]({ ...state, ...payload }); + case 'addAction': + const newWatch = new (Watch.getWatchTypes())[state.type](state); + newWatch.addAction(payload); + return newWatch; + } +}; export const WatchEdit = ({ watchId, watchType, savedObjectsClient, - kbnUrl, + urlService, licenseService, }: { watchId: string; watchType: string; savedObjectsClient: any; - kbnUrl: any; + urlService: any; licenseService: any; }) => { // hooks - const [watch, setWatch] = useState(null); + const [watch, dispatch] = useReducer(watchReducer, null); + const setWatchProperty = (property: string, value: any) => { + dispatch({ command: 'setProperty', payload: { [property]: value } }); + }; + const addAction = (action: any) => { + dispatch({ command: 'addAction', payload: action }); + }; const getWatch = async () => { - let theWatch; if (watchId) { - theWatch = await loadWatch(watchId); - setWatch(theWatch); + const theWatch = await loadWatch(watchId); + dispatch({ command: 'setWatch', payload: theWatch }); } else { const WatchType = Watch.getWatchTypes()[watchType]; if (WatchType) { - setWatch(new WatchType()); + dispatch({ command: 'setWatch', payload: new WatchType() }); } } }; @@ -71,17 +89,14 @@ export const WatchEdit = ({ if (watch.type === WATCH_TYPES.THRESHOLD) { EditComponent = ThresholdWatchEdit; } else { - EditComponent = EuiSpacer; - } - if (watch.type === WATCH_TYPES.JSON) { EditComponent = JsonWatchEdit; } return ( - + diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/json_watch_edit_actions.ts b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts similarity index 90% rename from x-pack/plugins/watcher/public/sections/watch_edit/json_watch_edit_actions.ts rename to x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts index 2eec64dab2404c..e751e04ac0fed6 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/json_watch_edit_actions.ts +++ b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts @@ -54,7 +54,7 @@ function createActionsForWatch(watchInstance: BaseWatch) { return watchInstance; } -export async function saveWatch(watch: BaseWatch, kbnUrl: any, licenseService: any) { +export async function saveWatch(watch: BaseWatch, urlService: any, licenseService: any) { try { await createWatch(watch); toastNotifications.addSuccess( @@ -66,7 +66,7 @@ export async function saveWatch(watch: BaseWatch, kbnUrl: any, licenseService: a }) ); // TODO: Not correctly redirecting back to /watches route - kbnUrl.change('/management/elasticsearch/watcher/watches', {}); + urlService.change('/management/elasticsearch/watcher/watches', {}); } catch (error) { return licenseService .checkValidity() @@ -76,7 +76,7 @@ export async function saveWatch(watch: BaseWatch, kbnUrl: any, licenseService: a export async function validateActionsAndSaveWatch( watch: BaseWatch, - kbnUrl: any, + urlService: any, licenseService: any ) { const { warning } = watch.validate(); @@ -88,21 +88,19 @@ export async function validateActionsAndSaveWatch( }; } // client validation passed, make request to create watch - saveWatch(watch, kbnUrl, licenseService); + saveWatch(watch, urlService, licenseService); } export async function onWatchSave( watch: BaseWatch, - kbnUrl: any, + urlService: any, licenseService: any ): Promise { const watchActions = watch.watch && watch.watch.actions; const watchData = watchActions ? createActionsForWatch(watch) : watch; - if (!watchData.isNew) { - return validateActionsAndSaveWatch(watch, kbnUrl, licenseService); + return validateActionsAndSaveWatch(watch, urlService, licenseService); } - try { const existingWatch = await loadWatch(watchData.id); if (existingWatch) { @@ -136,7 +134,7 @@ export async function onWatchSave( // Confirms watcher does not already exist return licenseService.checkValidity().then(() => { if (error.status === 404) { - return validateActionsAndSaveWatch(watchData, kbnUrl, licenseService); + return validateActionsAndSaveWatch(watchData, urlService, licenseService); } return toastNotifications.addDanger(error.data.message); }); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.js b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.js index b6f3b51d8471be..8c9f2245a374d6 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.js +++ b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.js @@ -23,14 +23,14 @@ import { manageAngularLifecycle } from '../../lib/manage_angular_lifecycle'; import { WatchEdit } from './components/watch_edit'; let elem; -const renderReact = async (elem, watchType, watchId, savedObjectsClient, kbnUrl, licenseService) => { +const renderReact = async (elem, watchType, watchId, savedObjectsClient, urlService, licenseService) => { render( , @@ -49,6 +49,13 @@ routes constructor($injector, $scope, $http, Private) { const $route = $injector.get('$route'); const kbnUrl = $injector.get('kbnUrl'); + const $rootScope = $injector.get('$rootScope'); + const urlService = { + change: (url) =>{ + kbnUrl.change(url); + $rootScope.$digest(); + } + }; const licenseService = $injector.get('xpackWatcherLicenseService'); this.watch = $route.current.locals.xpackWatch; this.WATCH_TYPES = WATCH_TYPES; @@ -64,7 +71,7 @@ routes elem = document.getElementById('watchEditReactRoot'); const savedObjectsClient = Private(SavedObjectsClientProvider); - renderReact(elem, watchType, watchId, savedObjectsClient, kbnUrl, licenseService); + renderReact(elem, watchType, watchId, savedObjectsClient, urlService, licenseService); manageAngularLifecycle($scope, $route, elem); }); } From 0078417179b57de65b8a6fdd7e7bdf87a5049940 Mon Sep 17 00:00:00 2001 From: Paul Sanwald Date: Thu, 11 Apr 2019 20:27:57 -0400 Subject: [PATCH 04/51] Watcher history page: port to react (#33047) Get watch detail page ported to react. --- .../components/delete_watches_modal.tsx | 2 +- x-pack/plugins/watcher/public/lib/api.ts | 47 +++ .../plugins/watcher/public/models/index.d.ts | 3 + .../watch_detail/watch_action_status.tsx | 24 ++ .../watch_detail/watch_detail_component.tsx | 102 +++++ .../watch_detail/watch_history_component.tsx | 353 ++++++++++++++++++ .../watch_detail/watch_detail_route.html | 10 +- .../watch_detail/watch_detail_route.js | 35 +- .../components/json_watch_edit_simulate.tsx | 1 + 9 files changed, 569 insertions(+), 8 deletions(-) create mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_action_status.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail_component.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_history_component.tsx diff --git a/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx index 2ac41c159e3546..6fcab4b9d93036 100644 --- a/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx +++ b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx @@ -24,7 +24,7 @@ export const DeleteWatchesModal = ({ 'xpack.watcher.deleteSelectedWatchesConfirmModal.descriptionText', { defaultMessage: - 'This will permanently delete {numWatchesToDelete, plural, one {a watch} other {# watches}}. Are you sure?', + 'This will permanently delete {numWatchesToDelete, plural, one {a watch} other {# watches}}. You can’t recover a deleted watch.', values: { numWatchesToDelete }, } ); diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index 2f4056d2712cb9..6aeede8136122e 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -4,6 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ import { Watch } from 'plugins/watcher/models/watch'; +import { WatchHistoryItem } from 'plugins/watcher/models/watch_history_item'; +import { WatchStatus } from 'plugins/watcher/models/watch_status'; + import { __await } from 'tslib'; import chrome from 'ui/chrome'; import { ROUTES } from '../../common/constants'; @@ -25,6 +28,35 @@ export const fetchWatches = async () => { return Watch.fromUpstreamJson(watch); }); }; + +export const fetchWatchDetail = async (id: string) => { + const { + data: { watch }, + } = await getHttpClient().get(`${basePath}/watch/${id}`); + return Watch.fromUpstreamJson(watch); +}; + +export const fetchWatchHistoryDetail = async (id: string) => { + const { + data: { watchHistoryItem }, + } = await getHttpClient().get(`${basePath}/history/${id}`); + const item = WatchHistoryItem.fromUpstreamJson(watchHistoryItem); + return item; +}; + +export const fetchWatchHistory = async (id: string, startTime: string) => { + let url = `${basePath}/watch/${id}/history`; + if (startTime) { + url += `?startTime=${startTime}`; + } + const result: any = await getHttpClient().get(url); + const items: any = result.data.watchHistoryItems; + return items.map((historyItem: any) => { + const item = WatchHistoryItem.fromUpstreamJson(historyItem); + return item; + }); +}; + export const deleteWatches = async (watchIds: string[]) => { const body = { watchIds, @@ -34,6 +66,21 @@ export const deleteWatches = async (watchIds: string[]) => { } = await getHttpClient().post(`${basePath}/watches/delete`, body); return results; }; + +export const deactivateWatch = async (id: string) => { + const { + data: { watchStatus }, + } = await getHttpClient().put(`${basePath}/watch/${id}/deactivate`, null); + return WatchStatus.fromUpstreamJson(watchStatus); +}; + +export const activateWatch = async (id: string) => { + const { + data: { watchStatus }, + } = await getHttpClient().put(`${basePath}/watch/${id}/activate`, null); + return WatchStatus.fromUpstreamJson(watchStatus); +}; + export const fetchWatch = async (watchId: string) => { const body = { watchId, diff --git a/x-pack/plugins/watcher/public/models/index.d.ts b/x-pack/plugins/watcher/public/models/index.d.ts index 61ed512248a497..10ffa05ec7ff95 100644 --- a/x-pack/plugins/watcher/public/models/index.d.ts +++ b/x-pack/plugins/watcher/public/models/index.d.ts @@ -21,6 +21,9 @@ declare module 'plugins/watcher/models/watch_history_item' { export const WatchHistoryItem: any; } +declare module 'plugins/watcher/models/watch_status' { + export const WatchStatus: any; +} // TODO: Remove once typescript definitions are in EUI declare module '@elastic/eui' { export const EuiCodeEditor: React.SFC; diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_action_status.tsx b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_action_status.tsx new file mode 100644 index 00000000000000..4874770b1c2a50 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_action_status.tsx @@ -0,0 +1,24 @@ +/* + * 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 { InjectedIntl, injectI18n } from '@kbn/i18n/react'; +import React from 'react'; +import { EuiIcon } from '@elastic/eui'; +import { WATCH_STATES } from '../../../../../common/constants/watch_states'; + +const WatchActionStatusUi = ({ intl, watchState }: { intl: InjectedIntl; watchState: string }) => { + const stateToIcon: { [key: string]: JSX.Element } = { + [WATCH_STATES.OK]: , + [WATCH_STATES.DISABLED]: , + [WATCH_STATES.FIRING]: , + [WATCH_STATES.ERROR]: , + [WATCH_STATES.CONFIG_ERROR]: , + }; + + return
{stateToIcon[watchState]}
; +}; + +export const WatchActionStatus = injectI18n(WatchActionStatusUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail_component.tsx b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail_component.tsx new file mode 100644 index 00000000000000..a26db5ee0bfa0a --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail_component.tsx @@ -0,0 +1,102 @@ +/* + * 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 { + EuiFlexGroup, + EuiFlexItem, + EuiInMemoryTable, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; +import React, { Fragment, useEffect, useState } from 'react'; +import { fetchWatchDetail } from '../../../../lib/api'; +import { WatchActionStatus } from './watch_action_status'; + +const WatchDetailUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }) => { + const [isWatchesLoading, setIsWatchesLoading] = useState(true); + const [actions, setWatchActions] = useState([]); + + const pagination = { + initialPageSize: 10, + pageSizeOptions: [10, 50, 100], + }; + + const columns = [ + { + field: 'id', + name: i18n.translate('xpack.watcher.sections.watchDetail.watchTable.actionHeader', { + defaultMessage: 'Action', + }), + sortable: true, + truncateText: true, + render: (action: string) => { + return {action}; + }, + }, + { + field: 'state', + name: i18n.translate('xpack.watcher.sections.watchDetail.watchTable.stateHeader', { + defaultMessage: 'State', + }), + sortable: true, + truncateText: true, + render: (state: string) => { + return ( + + + + + + {state} + + + ); + }, + }, + ]; + const loadWatchActions = async () => { + const loadedWatchActions = await fetchWatchDetail(watchId); + setWatchActions(loadedWatchActions.watchStatus.actionStatuses); + setIsWatchesLoading(false); + }; + useEffect(() => { + loadWatchActions(); + // only run the first time the component loads + }, []); + + return ( + + +

+ +

+
+ + + } + /> +
+ ); +}; + +export const WatchDetail = injectI18n(WatchDetailUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_history_component.tsx b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_history_component.tsx new file mode 100644 index 00000000000000..2b06a1f99074c3 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_history_component.tsx @@ -0,0 +1,353 @@ +/* + * 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 { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; +import { Moment } from 'moment'; +import React, { Fragment, useEffect, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { toastNotifications } from 'ui/notify'; +import { + EuiButton, + EuiCodeBlock, + EuiFlexGroup, + EuiFlexItem, + EuiFlyout, + EuiFlyoutHeader, + EuiInMemoryTable, + EuiLink, + EuiSelect, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { fetchWatchDetail } from '../../../../lib/api'; +import { DeleteWatchesModal } from '../../../../components/delete_watches_modal'; +import { WatchActionStatus } from './watch_action_status'; +import { + activateWatch, + deactivateWatch, + fetchWatchHistory, + fetchWatchHistoryDetail, +} from '../../../../lib/api'; + +const WatchHistoryUI = ({ + intl, + watchId, + urlService, +}: { + intl: InjectedIntl; + watchId: string; + urlService: any; +}) => { + const [isLoading, setIsLoading] = useState(true); + const [isActivated, setIsActivated] = useState(true); + const [history, setWatchHistory] = useState([]); + const [isDetailVisible, setIsDetailVisible] = useState(true); + const [watchesToDelete, setWatchesToDelete] = useState([]); + const [itemDetail, setItemDetail] = useState<{ + id?: string; + details?: any; + watchId?: string; + watchStatus?: { actionStatuses?: any }; + }>({}); + const [executionDetail, setExecutionDetail] = useState(''); + + const pagination = { + initialPageSize: 10, + pageSizeOptions: [10, 50, 100], + }; + + const loadWatch = async () => { + const loadedWatch = await fetchWatchDetail(watchId); + setIsActivated(loadedWatch.watchStatus.isActive); + }; + + const watchHistoryTimeSpanOptions = [ + { + value: 'now-1h', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.1h', { + defaultMessage: 'Last one hour', + }), + }, + { + value: 'now-24h', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.24h', { + defaultMessage: 'Last 24 hours', + }), + }, + { + value: 'now-7d', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.7d', { + defaultMessage: 'Last 7 days', + }), + }, + { + value: 'now-30d', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.30d', { + defaultMessage: 'Last 30 days', + }), + }, + { + value: 'now-6M', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.6M', { + defaultMessage: 'Last 6 months', + }), + }, + { + value: 'now-1y', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.1y', { + defaultMessage: 'Last 1 year', + }), + }, + ]; + const [watchHistoryTimeSpan, setWatchHistoryTimeSpan] = useState( + watchHistoryTimeSpanOptions[0].value + ); + + const columns = [ + { + field: 'startTime', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.startTimeHeader', { + defaultMessage: 'Trigger Time', + }), + sortable: true, + truncateText: true, + render: (startTime: Moment, item: any) => { + const formattedDate = startTime.format(); + return ( + showDetailFlyout(item)} + > + {formattedDate} + + ); + }, + }, + { + field: 'watchStatus.state', + name: i18n.translate('xpack.watcher.sections.watchHistory.watchTable.stateHeader', { + defaultMessage: 'State', + }), + sortable: true, + truncateText: true, + render: (state: string) => { + return ( + + + + + + {state} + + + ); + }, + }, + { + field: 'watchStatus.comment', + name: i18n.translate('xpack.watcher.sections.watchHistory.watchTable.commentHeader', { + defaultMessage: 'Comment', + }), + sortable: true, + truncateText: true, + render: (comment: string) => { + return {comment}; + }, + }, + ]; + + const onTimespanChange = (e: React.ChangeEvent) => { + const timespan = e.target.value; + setWatchHistoryTimeSpan(timespan); + loadWatchHistory(timespan); + }; + const loadWatchHistory = async (timespan: string) => { + const loadedWatchHistory = await fetchWatchHistory(watchId, timespan); + setWatchHistory(loadedWatchHistory); + setIsLoading(false); + }; + + const hideDetailFlyout = async () => { + setItemDetail({}); + return setIsDetailVisible(false); + }; + + const showDetailFlyout = async (item: { id: string }) => { + const watchHistoryItemDetail = await fetchWatchHistoryDetail(item.id); + setItemDetail(watchHistoryItemDetail); + setExecutionDetail(JSON.stringify(watchHistoryItemDetail.details, null, 2)); + return setIsDetailVisible(true); + }; + + const toggleWatchActivation = async () => { + try { + if (isActivated) { + await deactivateWatch(watchId); + } else { + await activateWatch(watchId); + } + setIsActivated(!isActivated); + } catch (e) { + if (e.data.statusCode !== 200) { + toastNotifications.addDanger( + i18n.translate( + 'xpack.watcher.sections.watchList.deactivateWatchErrorNotification.descriptionText', + { + defaultMessage: "Couldn't deactivate watch", + } + ) + ); + } + } + }; + + useEffect(() => { + loadWatchHistory(watchHistoryTimeSpan); + loadWatch(); + // only run the first time the component loads + }, []); + + let flyout; + + if (isDetailVisible && Object.keys(itemDetail).length !== 0) { + const detailColumns = [ + { + field: 'id', + name: i18n.translate('xpack.watcher.sections.watchHistory.watchActionStatusTable.id', { + defaultMessage: 'Name', + }), + sortable: true, + truncateText: true, + render: (id: string) => { + return {id}; + }, + }, + { + field: 'state', + name: i18n.translate('xpack.watcher.sections.watchHistory.watchActionStatusTable.state', { + defaultMessage: 'State', + }), + sortable: true, + truncateText: true, + render: (state: string) => { + return {state}; + }, + }, + ]; + + flyout = ( + + + +

Watch history detail

+
+
+ + + + } + /> + + + + + {executionDetail} + + + +
+ ); + } + const activationButtonText = isActivated ? 'Deactivate watch' : 'Activate watch'; + return ( + + { + if (deleted) { + urlService.redirect('/management/elasticsearch/watcher/watches'); + } + setWatchesToDelete([]); + }} + watchesToDelete={watchesToDelete} + /> + + + +

+ +

+
+
+ + + + + + + toggleWatchActivation()}>{activationButtonText} + + + { + setWatchesToDelete([watchId]); + }} + color="danger" + disabled={false} + > + + + + + +
+ + + + } + /> + {flyout} +
+ ); +}; + +export const WatchHistory = injectI18n(WatchHistoryUI); diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.html b/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.html index 0e467e412874c4..325d49e94153d3 100644 --- a/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.html +++ b/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.html @@ -1,5 +1,5 @@ - + + +
+
+ diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.js b/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.js index 28830f7eb31fe4..d557701b67903c 100644 --- a/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.js +++ b/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.js @@ -4,16 +4,38 @@ * you may not use this file except in compliance with the Elastic License. */ +import React from 'react'; +import { render } from 'react-dom'; import routes from 'ui/routes'; import 'ui/url'; import { toastNotifications } from 'ui/notify'; import template from './watch_detail_route.html'; import 'plugins/watcher/services/watch'; -import './components/watch_detail'; import { WATCH_HISTORY } from '../../../common/constants'; import { updateWatchSections } from 'plugins/watcher/lib/update_management_sections'; import 'plugins/watcher/services/license'; import { getWatchDetailBreadcrumbs } from '../../lib/breadcrumbs'; +import { setHttpClient } from '../../lib/api'; +import { manageAngularLifecycle } from '../../lib/manage_angular_lifecycle'; +import './components/watch_detail'; +import { WatchDetail } from './components/watch_detail/watch_detail_component'; +import { WatchHistory } from './components/watch_detail/watch_history_component'; +import { I18nContext } from 'ui/i18n'; +import { EuiPageContent, EuiSpacer } from '@elastic/eui'; + +let elem; +const renderReact = async (elem, watchId, kbnUrlService) => { + render( + + + + + + + , + elem + ); +}; routes .when('/management/elasticsearch/watcher/watches/watch/:id', { @@ -74,11 +96,20 @@ routes }, controllerAs: 'watchDetailRoute', controller: class WatchDetailRouteController { - constructor($injector) { + constructor($injector, $scope, $http) { const $route = $injector.get('$route'); + const kbnUrlService = $injector.get('kbnUrl'); this.initialHistoryRange = $route.current.locals.initialHistoryRange; this.watch = $route.current.locals.watch; this.watchHistoryItems = $route.current.locals.watchHistoryItems; + // NOTE: We depend upon Angular's $http service because it's decorated with interceptors, + // e.g. to check license status per request. + setHttpClient($http); + $scope.$$postDigest(() => { + elem = document.getElementById('watchDetailReactRoot'); + renderReact(elem, $route.current.params.id, kbnUrlService); + manageAngularLifecycle($scope, $route, elem); + }); } } }); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx index 51977ed724c755..1f5e972fcaf0d1 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx @@ -41,6 +41,7 @@ interface TableDataRow { type: string; } +// eslint-disable-next-line @typescript-eslint/no-empty-interface interface TableData extends Array {} const EXECUTE_DETAILS_INITIAL_STATE = { From ed4701e66fd0b20fa28d3e9cbc2fafea3ff6d89b Mon Sep 17 00:00:00 2001 From: Bill McConaghy Date: Fri, 12 Apr 2019 12:08:44 -0400 Subject: [PATCH 05/51] adding validation and UI feedback for threshold watch expression (#34948) * adding validation and UI feedback for threshold watch expression * fixing tsc issues * fixing inconsistent messages * fixing some i18n labels * addressing PR feedback * fixing unused translations issue * addressing PR feedback --- .../translations/translations/zh-CN.json | 2 + .../watch_edit => models/watch}/agg_types.ts | 0 .../watch}/group_by_types.ts | 0 .../public/models/watch/threshold_watch.js | 112 ++- .../threshold_watch_edit_component.tsx | 655 +++++++++++------- 5 files changed, 492 insertions(+), 277 deletions(-) rename x-pack/plugins/watcher/public/{sections/watch_edit => models/watch}/agg_types.ts (100%) rename x-pack/plugins/watcher/public/{sections/watch_edit => models/watch}/group_by_types.ts (100%) diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 097a659bf633e4..beb8f130c930a8 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7969,6 +7969,8 @@ "xpack.watcher.sections.watchEdit.json.watchErrorsWarning.confirmSaveWatch": "保存监视", "xpack.watcher.sections.watchEdit.threshold.matchingFollowingConditionTitle": "匹配以下条件", "xpack.watcher.sections.watchEdit.threshold.saveButtonLabel": "保存", + "xpack.watcher.sections.watchEdit.threshold.enterOneOrMoreIndicesValidationMessage": "输入一个或多个索引", + "xpack.watcher.sections.watchEdit.threshold.intervalSizeIsRequiredValidationMessage": "“时间间隔大小”必填", "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.description": "ID “{watchId}{watchNameMessageFragment}” 的监视已存在。确定要覆盖?", "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.descriptionFragmentText": "(名称:“{existingWatchName}”)", "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.overwriteWatchButtonLabel": "覆盖监视", diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/agg_types.ts b/x-pack/plugins/watcher/public/models/watch/agg_types.ts similarity index 100% rename from x-pack/plugins/watcher/public/sections/watch_edit/agg_types.ts rename to x-pack/plugins/watcher/public/models/watch/agg_types.ts diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/group_by_types.ts b/x-pack/plugins/watcher/public/models/watch/group_by_types.ts similarity index 100% rename from x-pack/plugins/watcher/public/sections/watch_edit/group_by_types.ts rename to x-pack/plugins/watcher/public/models/watch/group_by_types.ts diff --git a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js index efc4abc46c6665..ad6bf88294ab0f 100644 --- a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js @@ -9,7 +9,8 @@ import uuid from 'uuid'; import { WATCH_TYPES, SORT_ORDERS, COMPARATORS } from 'plugins/watcher/../common/constants'; import { getTimeUnitsLabel } from 'plugins/watcher/lib/get_time_units_label'; import { i18n } from '@kbn/i18n'; - +import { aggTypes } from './agg_types'; +import { groupByTypes } from './group_by_types'; const DEFAULT_VALUES = { AGG_TYPE: 'count', TERM_SIZE: 5, @@ -33,16 +34,23 @@ export class ThresholdWatch extends BaseWatch { this.index = props.index; this.timeField = props.timeField; - this.triggerIntervalSize = props.triggerIntervalSize == null ? DEFAULT_VALUES.TRIGGER_INTERVAL_SIZE : props.triggerIntervalSize; + this.triggerIntervalSize = + props.triggerIntervalSize == null + ? DEFAULT_VALUES.TRIGGER_INTERVAL_SIZE + : props.triggerIntervalSize; this.triggerIntervalUnit = props.triggerIntervalUnit || DEFAULT_VALUES.TRIGGER_INTERVAL_UNIT; this.aggType = props.aggType || DEFAULT_VALUES.AGG_TYPE; this.aggField = props.aggField; this.termSize = props.termSize == null ? DEFAULT_VALUES.TERM_SIZE : props.termSize; this.termField = props.termField; this.thresholdComparator = props.thresholdComparator || DEFAULT_VALUES.THRESHOLD_COMPARATOR; - this.timeWindowSize = props.timeWindowSize || DEFAULT_VALUES.TIME_WINDOW_SIZE; + this.timeWindowSize = + props.timeWindowSize == null ? DEFAULT_VALUES.TIME_WINDOW_SIZE : props.timeWindowSize; this.timeWindowUnit = props.timeWindowUnit || DEFAULT_VALUES.TIME_WINDOW_UNIT; this.groupBy = props.groupBy || DEFAULT_VALUES.GROUP_BY; + if (this.termField != null) { + this.groupBy = 'top'; + } //NOTE: The threshold must be of the appropriate type, i.e.,number/date. //Conversion from string must occur by consumer when assigning a @@ -91,28 +99,102 @@ export class ThresholdWatch extends BaseWatch { index: [], timeField: [], triggerIntervalSize: [], + aggField: [], + termSize: [], + termField: [], + threshold: [], + timeWindowSize: [], }; validationResult.errors = errors; if (!this.name) { - errors.name.push(i18n.translate('xpack.watcher.sections.watchEdit.threshold.error.requiredNameText', { - defaultMessage: 'Name is required', - })); + errors.name.push( + i18n.translate('xpack.watcher.sections.watchEdit.threshold.error.requiredNameText', { + defaultMessage: 'Name is required', + }) + ); } if (this.index !== undefined && this.index.length < 1) { - errors.index.push(i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.enterOneOrMoreIndicesValidationMessage', { - defaultMessage: 'Enter one or more indices' - })); + errors.index.push( + i18n.translate( + 'xpack.watcher.sections.watchEdit.threshold.enterOneOrMoreIndicesValidationMessage', + { + defaultMessage: 'Enter one or more indices', + } + ) + ); } if (!this.timeField) { - errors.timeField.push(i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldIsRequiredValidationText', { - defaultMessage: 'A time field is required' - })); + errors.timeField.push( + i18n.translate( + 'xpack.watcher.sections.watchEdit.threshold.timeFieldIsRequiredValidationText', + { + defaultMessage: 'A time field is required', + } + ) + ); } if (!this.triggerIntervalSize) { errors.triggerIntervalSize.push( - i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.intervalSizeIsRequiredValidationMessage', { - defaultMessage: 'Interval size is required' - })); + i18n.translate( + 'xpack.watcher.sections.watchEdit.threshold.intervalSizeIsRequiredValidationMessage', + { + defaultMessage: 'Interval size is required', + } + ) + ); + } + if (aggTypes[this.aggType].fieldRequired && !this.aggField) { + errors.aggField.push( + i18n.translate( + 'xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage', + { + defaultMessage: 'Please select a field', + } + ) + ); + } + // term field and term size only required if the group by type requires them + if (groupByTypes[this.groupBy].sizeRequired) { + if (!this.termSize) { + errors.termSize.push( + i18n.translate( + 'xpack.watcher.thresholdWatchExpression.aggType.xpack.watcher.thresholdWatchExpression.groupBy.requiredValueValidationMessage', + { + defaultMessage: 'A value is required.', + } + ) + ); + } + if (!this.termField) { + errors.termField.push( + i18n.translate( + 'xpack.watcher.thresholdWatchExpression.groupBy.requiredFieldValidationMessage', + { + defaultMessage: 'Please select a field.', + } + ) + ); + } + } + if (!this.threshold) { + errors.threshold.push( + i18n.translate( + 'xpack.watcher.thresholdWatchExpression.thresholdLevel.valueIsRequiredValidationMessage', + { + defaultMessage: 'A value is required.', + } + ) + ); + } + if (!this.timeWindowSize) { + errors.timeWindowSize.push( + i18n.translate( + 'xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeIsRequiredValidationMessage', + { + defaultMessage: 'Window duration size is required.', + } + ) + ); } return validationResult; } diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx index 01048a7167b60f..31afca67b914be 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx @@ -30,9 +30,9 @@ import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; import { ConfirmWatchesModal } from '../../../components/confirm_watches_modal'; import { ErrableFormRow } from '../../../components/form_errors'; import { fetchFields, getMatchingIndices } from '../../../lib/api'; -import { aggTypes } from '../agg_types'; +import { aggTypes } from '../../../models/watch/agg_types'; +import { groupByTypes } from '../../../models/watch/group_by_types'; import { comparators } from '../comparators'; -import { groupByTypes } from '../group_by_types'; import { timeUnits } from '../time_units'; import { onWatchSave, saveWatch } from '../watch_edit_actions'; import { WatchContext } from './watch_context'; @@ -150,9 +150,11 @@ const ThresholdWatchEditUi = ({ setIndexPatterns(titles); }; const loadData = async () => { - const theFields = await getFields(watch.index); - setFields(theFields); - setTimeFieldOptions(getTimeFieldOptions(theFields)); + if (watch.index && watch.index.length > 0) { + const theFields = await getFields(watch.index); + setFields(theFields); + setTimeFieldOptions(getTimeFieldOptions(theFields)); + } getIndexPatterns(); }; useEffect(() => { @@ -160,7 +162,16 @@ const ThresholdWatchEditUi = ({ }, []); const { errors } = watch.validate(); const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); - + const expressionErrorMessage = i18n.translate( + 'xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage', + { + defaultMessage: 'Please fix the errors in the expression below.', + } + ); + const expressionFields = ['aggField', 'termSize', 'termField', 'threshold', 'timeWindowSize']; + const hasExpressionErrors = !!Object.keys(errors).find( + errorKey => expressionFields.includes(errorKey) && errors[errorKey].length >= 1 + ); return ( @@ -199,7 +210,7 @@ const ThresholdWatchEditUi = ({ > { setWatchProperty('name', e.target.value); }} @@ -361,279 +372,399 @@ const ThresholdWatchEditUi = ({ - - - { - setAggTypePopoverOpen(true); - }} - /> - } - isOpen={aggTypePopoverOpen} - closePopover={() => { - setAggTypePopoverOpen(false); - }} - ownFocus - withTitle - anchorPosition="downLeft" - > -
- when - { - setWatchProperty('aggType', e.target.value); + {watch.index && watch.index.length > 0 ? ( + + {hasExpressionErrors ? ( + + {expressionErrorMessage} + + + ) : null} + + + { + setAggTypePopoverOpen(true); + }} + /> + } + isOpen={aggTypePopoverOpen} + closePopover={() => { setAggTypePopoverOpen(false); }} - options={Object.values(aggTypes)} - /> -
-
-
- {watch.aggType && aggTypes[watch.aggType].fieldRequired ? ( - - { - setAggFieldPopoverOpen(true); - }} - /> - } - isOpen={aggFieldPopoverOpen} - closePopover={() => { - setAggFieldPopoverOpen(false); - }} - ownFocus - anchorPosition="downLeft" - > -
- of - - - { - setWatchProperty('aggField', e.target.value); - setAggFieldPopoverOpen(false); - }} - options={fields.reduce( - (options, field: any) => { - if ( - aggTypes[watch.aggType].validNormalizedTypes.includes( - field.normalizedType - ) - ) { - options.push({ - text: field.name, - value: field.name, - }); - } - return options; - }, - [ - { - text: 'select a field', - value: '', - }, - ] - )} - /> - - -
-
-
- ) : null} - - { - setGroupByPopoverOpen(true); - }} - /> - } - isOpen={groupByPopoverOpen} - closePopover={() => { - setGroupByPopoverOpen(false); - }} - ownFocus - withTitle - anchorPosition="downLeft" - > -
- over - - + ownFocus + withTitle + anchorPosition="downLeft" + > +
+ + {i18n.translate( + 'xpack.watcher.sections.watchEdit.threshold.whenButtonLabel', + { + defaultMessage: 'when', + } + )} + { - setWatchProperty('groupBy', e.target.value); + setWatchProperty('aggType', e.target.value); + setAggTypePopoverOpen(false); }} - options={Object.values(groupByTypes)} + options={Object.values(aggTypes).map(({ text, value }) => { + return { + text, + value, + }; + })} /> - - - {groupByTypes[watch.groupBy].sizeRequired ? ( - - - - +
+ +
+ {watch.aggType && aggTypes[watch.aggType].fieldRequired ? ( + + { + setAggFieldPopoverOpen(true); + }} + color={watch.aggField ? 'secondary' : 'danger'} + /> + } + isOpen={aggFieldPopoverOpen} + closePopover={() => { + setAggFieldPopoverOpen(false); + }} + ownFocus + anchorPosition="downLeft" + > +
+ + {i18n.translate( + 'xpack.watcher.sections.watchEdit.threshold.ofButtonLabel', + { + defaultMessage: 'of', + } + )} + + + + + { + setWatchProperty('aggField', e.target.value); + }} + onBlur={() => { + if (!watch.aggField) { + setWatchProperty('aggField', ''); + } + }} + options={fields.reduce( + (options, field: any) => { + if ( + aggTypes[watch.aggType].validNormalizedTypes.includes( + field.normalizedType + ) + ) { + options.push({ + text: field.name, + value: field.name, + }); + } + return options; + }, + [firstFieldOption] + )} + /> + + + +
+
+
+ ) : null} + + { + setGroupByPopoverOpen(true); + }} + color={ + watch.groupBy === 'all' || (watch.termSize && watch.termField) + ? 'secondary' + : 'danger' + } + /> + } + isOpen={groupByPopoverOpen} + closePopover={() => { + setGroupByPopoverOpen(false); + }} + ownFocus + withTitle + anchorPosition="downLeft" + > +
+ + {i18n.translate( + 'xpack.watcher.sections.watchEdit.threshold.overButtonLabel', + { + defaultMessage: 'over', + } + )} + + { - setWatchProperty('aggField', e.target.value); - setAggFieldPopoverOpen(false); + setWatchProperty('termSize', null); + setWatchProperty('termField', null); + setWatchProperty('groupBy', e.target.value); }} - options={fields.reduce( - (options, field: any) => { - if ( - groupByTypes[watch.groupBy].validNormalizedTypes.includes( - field.normalizedType - ) - ) { - options.push({ - text: field.name, - value: field.name, - }); - } - return options; - }, - [] as Array<{ text: string; value: string }> - )} + options={Object.values(groupByTypes).map(({ text, value }) => { + return { + text, + value, + }; + })} /> - - ) : null} - -
-
-
- - { - setWatchThresholdPopoverOpen(true); - }} - /> - } - isOpen={watchThresholdPopoverOpen} - closePopover={() => { - setWatchThresholdPopoverOpen(false); - }} - ownFocus - withTitle - anchorPosition="downLeft" - > -
- {comparators[watch.thresholdComparator].text} - - - { - setWatchProperty('thresholdComparator', e.target.value); - }} - options={Object.values(comparators)} - /> - - - + + + { + setWatchProperty('termSize', e.target.value); + }} + min={1} + /> + + + + + { + setWatchProperty('termField', e.target.value); + }} + options={fields.reduce( + (options, field: any) => { + if ( + groupByTypes[watch.groupBy].validNormalizedTypes.includes( + field.normalizedType + ) + ) { + options.push({ + text: field.name, + value: field.name, + }); + } + return options; + }, + [firstFieldOption] + )} + /> + + + + ) : null} + +
+
+
+ + { - const { value } = e.target; - const threshold = value !== '' ? parseInt(value, 10) : value; - setWatchProperty('threshold', threshold); + isActive={watchThresholdPopoverOpen || !watch.threshold} + onClick={() => { + setWatchThresholdPopoverOpen(true); }} + color={watch.threshold ? 'secondary' : 'danger'} /> - -
-
-
-
- - { - setWatchDurationPopoverOpen(true); + } + isOpen={watchThresholdPopoverOpen} + closePopover={() => { + setWatchThresholdPopoverOpen(false); }} - /> - } - isOpen={watchDurationPopoverOpen} - closePopover={() => { - setWatchDurationPopoverOpen(false); - }} - ownFocus - withTitle - anchorPosition="downLeft" - > -
- For the last - - - { - const { value } = e.target; - const timeWindowSize = value !== '' ? parseInt(value, 10) : value; - setWatchProperty('timeWindowSize', timeWindowSize); - }} - /> - - - { - setWatchProperty('timeWindowUnit', e.target.value); + ownFocus + withTitle + anchorPosition="downLeft" + > +
+ {comparators[watch.thresholdComparator].text} + + + { + setWatchProperty('thresholdComparator', e.target.value); + }} + options={Object.values(comparators)} + /> + + + + { + const { value } = e.target; + const threshold = value !== '' ? parseInt(value, 10) : value; + setWatchProperty('threshold', threshold); + }} + /> + + + +
+ +
+ + { + setWatchDurationPopoverOpen(true); }} - options={Object.entries(timeUnits).map(([key, value]) => { - return { - text: - watch.timeWindowSize && parseInt(watch.timeWindowSize, 10) === 1 - ? value.labelSingular - : value.labelPlural, - value: key, - }; - })} + color={watch.timeWindowSize ? 'secondary' : 'danger'} /> - -
-
-
-
-
+ } + isOpen={watchDurationPopoverOpen} + closePopover={() => { + setWatchDurationPopoverOpen(false); + }} + ownFocus + withTitle + anchorPosition="downLeft" + > +
+ For the last + + + + { + const { value } = e.target; + const timeWindowSize = value !== '' ? parseInt(value, 10) : value; + setWatchProperty('timeWindowSize', timeWindowSize); + }} + /> + + + + { + setWatchProperty('timeWindowUnit', e.target.value); + }} + options={Object.entries(timeUnits).map(([key, value]) => { + return { + text: + watch.timeWindowSize && parseInt(watch.timeWindowSize, 10) === 1 + ? value.labelSingular + : value.labelPlural, + value: key, + }; + })} + /> + + +
+ + + + + ) : null} Date: Mon, 15 Apr 2019 10:26:35 -0400 Subject: [PATCH 06/51] Advanced watch cleanup (#34955) * remove use of lodash map; persist state when toggling tabs * text improvements * add validation for watch action types * fix actions table on simulation results flyout when in edit mode * additional text improvements * rework form validation * update text based on feedback and fix ts errors * fix i18n * address pr feedback * address pr feedback; i18n fix --- .../translations/translations/zh-CN.json | 3 +- .../plugins/watcher/common/constants/index.ts | 1 - .../watcher/common/constants/watch_tabs.ts | 30 --- .../watcher/common/types/watch_types.ts | 12 +- .../components/confirm_watches_modal.tsx | 28 ++- .../documentation_links.ts | 6 + .../public/models/action/slack_action.js | 28 ++- .../models/execute_details/execute_details.js | 48 +++-- .../watcher/public/models/watch/base_watch.js | 3 +- .../watcher/public/models/watch/json_watch.js | 67 ++++++- .../components/json_watch_edit_component.tsx | 120 ++++++++---- .../components/json_watch_edit_form.tsx | 118 ++++-------- .../components/json_watch_edit_simulate.tsx | 181 ++++++------------ .../json_watch_edit_simulate_results.tsx | 81 ++++---- .../threshold_watch_edit_component.tsx | 2 +- .../watch_edit/components/watch_edit.tsx | 12 +- .../sections/watch_edit/watch_edit_actions.ts | 41 ++-- 17 files changed, 407 insertions(+), 374 deletions(-) delete mode 100644 x-pack/plugins/watcher/common/constants/watch_tabs.ts diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index beb8f130c930a8..3eb940d9ab5853 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7965,7 +7965,6 @@ "xpack.watcher.sections.watchEdit.json.simulateTabTitle": "模拟监视", "xpack.watcher.sections.watchEdit.json.simulateWatchButtonLabel": "模拟监视", "xpack.watcher.sections.watchEdit.json.simulationOutputLabel": "模拟输出:", - "xpack.watcher.sections.watchEdit.json.warningPossibleInvalidSlackAction.description": "此监视具有不包含“to”属性的 Slack 操作。 只有在 Elasticsearch 的 Slack“message_default”中指定了“to”属性,此监视才有效。", "xpack.watcher.sections.watchEdit.json.watchErrorsWarning.confirmSaveWatch": "保存监视", "xpack.watcher.sections.watchEdit.threshold.matchingFollowingConditionTitle": "匹配以下条件", "xpack.watcher.sections.watchEdit.threshold.saveButtonLabel": "保存", @@ -8081,4 +8080,4 @@ "xpack.watcher.watchActionsTitle": "满足后将执行 {watchActionsCount, plural, one{# 个操作} other {# 个操作}}", "xpack.watcher.watcherDescription": "通过创建、管理和监测警报来检测数据中的更改。" } -} +} \ No newline at end of file diff --git a/x-pack/plugins/watcher/common/constants/index.ts b/x-pack/plugins/watcher/common/constants/index.ts index d9156e132c038a..4260688c6eb451 100644 --- a/x-pack/plugins/watcher/common/constants/index.ts +++ b/x-pack/plugins/watcher/common/constants/index.ts @@ -23,4 +23,3 @@ export { WATCH_HISTORY } from './watch_history'; export { WATCH_STATES } from './watch_states'; export { WATCH_TYPES } from './watch_types'; export { ERROR_CODES } from './error_codes'; -export { WATCH_TABS, WATCH_TAB_ID_EDIT, WATCH_TAB_ID_SIMULATE } from './watch_tabs'; diff --git a/x-pack/plugins/watcher/common/constants/watch_tabs.ts b/x-pack/plugins/watcher/common/constants/watch_tabs.ts deleted file mode 100644 index 1d741b9610663c..00000000000000 --- a/x-pack/plugins/watcher/common/constants/watch_tabs.ts +++ /dev/null @@ -1,30 +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 { i18n } from '@kbn/i18n'; - -export const WATCH_TAB_ID_EDIT = 'watchEditTab'; -export const WATCH_TAB_ID_SIMULATE = 'watchSimulateTab'; - -interface WatchTab { - id: string; - name: string; -} - -export const WATCH_TABS: WatchTab[] = [ - { - id: WATCH_TAB_ID_EDIT, - name: i18n.translate('xpack.watcher.sections.watchEdit.json.editTabLabel', { - defaultMessage: 'Edit', - }), - }, - { - id: WATCH_TAB_ID_SIMULATE, - name: i18n.translate('xpack.watcher.sections.watchEdit.json.simulateTabLabel', { - defaultMessage: 'Simulate', - }), - }, -]; diff --git a/x-pack/plugins/watcher/common/types/watch_types.ts b/x-pack/plugins/watcher/common/types/watch_types.ts index 545920496bc3a6..0850911cdab6c4 100644 --- a/x-pack/plugins/watcher/common/types/watch_types.ts +++ b/x-pack/plugins/watcher/common/types/watch_types.ts @@ -11,15 +11,15 @@ export interface ExecutedWatchResults { startTime: Date; watchStatus: { state: string; - actionStatuses: Array<{ state: string; lastExecutionReason: string }>; + actionStatuses: Array<{ state: string; lastExecutionReason: string; id: string }>; }; } export interface ExecutedWatchDetails { - triggerData: { - triggeredTime: Date; - scheduledTime: Date; - }; + scheduledTimeValue: string | undefined; + scheduledTimeUnit: string; + triggeredTimeValue: string | undefined; + triggeredTimeUnit: string; ignoreCondition: boolean; alternativeInput: any; actionModes: { @@ -42,7 +42,7 @@ export interface BaseWatch { upstreamJson: any; resetActions: () => void; createAction: (type: string, actionProps: {}) => void; - validate: () => { warning: { message: string } }; + validate: () => { warning: { message: string; title?: string } }; actions: [ { id: string; diff --git a/x-pack/plugins/watcher/public/components/confirm_watches_modal.tsx b/x-pack/plugins/watcher/public/components/confirm_watches_modal.tsx index 61adccb45ebb24..2ab21d34d648e6 100644 --- a/x-pack/plugins/watcher/public/components/confirm_watches_modal.tsx +++ b/x-pack/plugins/watcher/public/components/confirm_watches_modal.tsx @@ -11,19 +11,23 @@ export const ConfirmWatchesModal = ({ modalOptions, callback, }: { - modalOptions: { message: string } | null; + modalOptions: { + title: string; + message: string; + buttonLabel?: string; + buttonType?: 'primary' | 'danger'; + } | null; callback: (isConfirmed?: boolean) => void; }) => { if (!modalOptions) { return null; } + const { title, message, buttonType, buttonLabel } = modalOptions; return ( callback()} onConfirm={() => { callback(true); @@ -32,12 +36,16 @@ export const ConfirmWatchesModal = ({ 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.cancelButtonLabel', { defaultMessage: 'Cancel' } )} - confirmButtonText={i18n.translate( - 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.saveButtonLabel', - { defaultMessage: 'Save' } - )} + confirmButtonText={ + buttonLabel + ? buttonLabel + : i18n.translate( + 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.saveButtonLabel', + { defaultMessage: 'Save watch' } + ) + } > - {modalOptions.message} + {message} ); diff --git a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts index 1868a4f372ae0d..19ca2689e4cd1c 100644 --- a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts +++ b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts @@ -11,5 +11,11 @@ export const documentationLinks = { putWatchApi: makeDocumentationLink( '{baseUrl}guide/en/elasticsearch/reference/{urlVersion}/watcher-api-put-watch.html' ), + executeWatchApi: makeDocumentationLink( + '{baseUrl}guide/en/elasticsearch/reference/{urlVersion}/watcher-api-execute-watch.html#watcher-api-execute-watch-action-mode' + ), + watchNotificationSettings: makeDocumentationLink( + '{baseUrl}guide/en/elasticsearch/reference/{urlVersion}/notification-settings.html#slack-notification-settings' + ), }, }; diff --git a/x-pack/plugins/watcher/public/models/action/slack_action.js b/x-pack/plugins/watcher/public/models/action/slack_action.js index f94bc2f06b19d8..2cbfa27b2ca7a0 100644 --- a/x-pack/plugins/watcher/public/models/action/slack_action.js +++ b/x-pack/plugins/watcher/public/models/action/slack_action.js @@ -4,9 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ +import React from 'react'; import { get, isArray } from 'lodash'; import { BaseAction } from './base_action'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiCode, EuiLink } from '@elastic/eui'; +import { documentationLinks } from '../../lib/documentation_links'; export class SlackAction extends BaseAction { constructor(props = {}) { @@ -21,11 +25,27 @@ export class SlackAction extends BaseAction { const errors = []; if (!this.to.length) { + const message = ( + message_defaults, + link: ( + + + + ) + }} + /> + ); errors.push({ - message: i18n.translate('xpack.watcher.sections.watchEdit.json.warningPossibleInvalidSlackAction.description', { - // eslint-disable-next-line max-len - defaultMessage: 'This watch has a Slack action without a "to" property. This watch will only be valid if you specified the "to" property in the Slack "message_default" setting in Elasticsearch.' - }) + message }); } diff --git a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js index 855f805349f599..68cc4e45c9a87f 100644 --- a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js +++ b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js @@ -6,6 +6,7 @@ import { TIME_UNITS } from '../../../common/constants'; import moment from 'moment'; +import { i18n } from '@kbn/i18n'; export class ExecuteDetails { constructor(props = {}) { @@ -13,13 +14,39 @@ export class ExecuteDetails { this.triggeredTimeUnit = props.triggeredTimeUnit; this.scheduledTimeValue = props.scheduledTimeValue; this.scheduledTimeUnit = props.scheduledTimeUnit; - this.scheduledTime = props.scheduledTime; this.ignoreCondition = props.ignoreCondition; - this.alternativeInput = props.alternativeInput; + this.alternativeInput = props.alternativeInput || ''; this.actionModes = props.actionModes; this.recordExecution = props.recordExecution; } + validate() { + const errors = { + json: [], + }; + if (this.alternativeInput || this.alternativeInput !== '') { + try { + const parsedJson = JSON.parse(this.alternativeInput); + if (parsedJson && typeof parsedJson !== 'object') { + errors.json.push(i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.alternativeInputFieldError', + { + defaultMessage: 'Invalid JSON', + } + )); + } + } catch (e) { + errors.json.push(i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.alternativeInputFieldError', + { + defaultMessage: 'Invalid JSON', + } + )); + } + } + return errors; + } + formatTime(timeUnit, value) { let timeValue = moment(); switch (timeUnit) { @@ -42,18 +69,17 @@ export class ExecuteDetails { get upstreamJson() { const hasTriggerTime = this.triggeredTimeValue !== ''; const hasScheduleTime = this.scheduledTimeValue !== ''; - const formattedTriggerTime = hasTriggerTime ? this.formatTime(this.triggeredTimeUnit, this.triggeredTimeValue) : undefined; - const formattedScheduleTime = hasScheduleTime ? this.formatTime(this.scheduledTimeUnit, this.scheduledTimeValue) : undefined; - const triggerData = { - triggeredTime: formattedTriggerTime, - scheduledTime: formattedScheduleTime, - }; + const triggeredTime = hasTriggerTime ? this.formatTime(this.triggeredTimeUnit, this.triggeredTimeValue) : undefined; + const scheduledTime = hasScheduleTime ? this.formatTime(this.scheduledTimeUnit, this.scheduledTimeValue) : undefined; return { - triggerData, + triggerData: { + triggeredTime, + scheduledTime, + }, ignoreCondition: this.ignoreCondition, - alternativeInput: this.alternativeInput, + alternativeInput: this.alternativeInput !== '' ? JSON.parse(this.alternativeInput) : undefined, actionModes: this.actionModes, - recordExecution: this.recordExecution + recordExecution: this.recordExecution, }; } } diff --git a/x-pack/plugins/watcher/public/models/watch/base_watch.js b/x-pack/plugins/watcher/public/models/watch/base_watch.js index c19e20db5ea90b..94d8079387101b 100644 --- a/x-pack/plugins/watcher/public/models/watch/base_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/base_watch.js @@ -25,10 +25,9 @@ export class BaseWatch { * @param {array} props.actions Action definitions */ constructor(props = {}) { - this.id = get(props, 'id', ''); + this.id = get(props, 'id'); this.type = get(props, 'type'); this.isNew = get(props, 'isNew', true); - this.name = get(props, 'name'); this.isSystemWatch = Boolean(get(props, 'isSystemWatch')); this.watchStatus = WatchStatus.fromUpstreamJson(get(props, 'watchStatus')); diff --git a/x-pack/plugins/watcher/public/models/watch/json_watch.js b/x-pack/plugins/watcher/public/models/watch/json_watch.js index 586efc5ad7f780..e051bc63412e43 100644 --- a/x-pack/plugins/watcher/public/models/watch/json_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/json_watch.js @@ -6,7 +6,7 @@ import { get } from 'lodash'; import { BaseWatch } from './base_watch'; -import { WATCH_TYPES } from 'plugins/watcher/../common/constants'; +import { ACTION_TYPES, WATCH_TYPES } from 'plugins/watcher/../common/constants'; import defaultWatchJson from './default_watch.json'; import { i18n } from '@kbn/i18n'; @@ -17,8 +17,70 @@ export class JsonWatch extends BaseWatch { constructor(props = {}) { props.type = WATCH_TYPES.JSON; super(props); + const existingWatch = get(props, 'watch'); + this.watch = existingWatch ? existingWatch : defaultWatchJson; + this.watchString = get(props, 'watchString', JSON.stringify(existingWatch ? existingWatch : defaultWatchJson, null, 2)); + } - this.watch = get(props, 'watch', defaultWatchJson); + validate() { + const validationResult = super.validate(); + const idRegex = /^[A-Za-z0-9\-\_]+$/; + const errors = { + id: [], + json: [], + }; + validationResult.errors = errors; + // Watch id validation + if (!this.id) { + errors.id.push( + i18n.translate('xpack.watcher.sections.watchEdit.json.error.requiredIdText', { + defaultMessage: 'ID is required', + }) + ); + } else if (!idRegex.test(this.id)) { + errors.id.push(i18n.translate('xpack.watcher.sections.watchEdit.json.error.invalidIdText', { + defaultMessage: 'ID can only contain letters, underscores, dashes, and numbers.', + })); + } + // JSON validation + if (!this.watchString || this.watchString === '') { + errors.json.push(i18n.translate('xpack.watcher.sections.watchEdit.json.error.requiredJsonText', { + defaultMessage: 'JSON is required', + })); + } else { + try { + const parsedJson = JSON.parse(this.watchString); + if (parsedJson && typeof parsedJson === 'object') { + const { actions } = parsedJson; + if (actions) { + // Validate if the action(s) provided is one of the supported actions + const invalidActions = Object.keys(actions).find(actionKey => { + const actionKeys = Object.keys(actions[actionKey]); + let type; + Object.keys(ACTION_TYPES).forEach(actionTypeKey => { + if (actionKeys.includes(ACTION_TYPES[actionTypeKey]) && !actionKeys.includes(ACTION_TYPES.UNKNOWN)) { + type = ACTION_TYPES[actionTypeKey]; + } + }); + return !type; + }); + if (invalidActions) { + errors.json.push(i18n.translate('xpack.watcher.sections.watchEdit.json.error.invalidActionType', { + defaultMessage: 'Unknown action type provided for action "{action}".', + values: { + action: invalidActions, + }, + })); + } + } + } + } catch (e) { + errors.json.push(i18n.translate('xpack.watcher.sections.watchEdit.json.error.invalidJsonText', { + defaultMessage: 'Invalid JSON', + })); + } + } + return validationResult; } get upstreamJson() { @@ -26,7 +88,6 @@ export class JsonWatch extends BaseWatch { Object.assign(result, { watch: this.watch }); - return result; } diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx index c43e8ecdda937b..88c486652be160 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx @@ -15,11 +15,70 @@ import { EuiTabs, EuiTitle, } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { injectI18n } from '@kbn/i18n/react'; -import { WATCH_TAB_ID_EDIT, WATCH_TAB_ID_SIMULATE, WATCH_TABS } from '../../../../common/constants'; +import { ExecuteDetails } from 'plugins/watcher/models/execute_details/execute_details'; +import { getActionType } from '../../../../common/lib/get_action_type'; +import { BaseWatch, ExecutedWatchDetails } from '../../../../common/types/watch_types'; +import { ACTION_MODES, TIME_UNITS } from '../../../../common/constants'; import { JsonWatchEditForm } from './json_watch_edit_form'; import { JsonWatchEditSimulate } from './json_watch_edit_simulate'; import { WatchContext } from './watch_context'; +interface WatchAction { + actionId: string; + actionMode: string; + type: string; +} + +interface WatchTab { + id: string; + name: string; +} + +const WATCH_EDIT_TAB = 'watchEditTab'; +const WATCH_SIMULATE_TAB = 'watchSimulateTab'; + +const WATCH_TABS: WatchTab[] = [ + { + id: WATCH_EDIT_TAB, + name: i18n.translate('xpack.watcher.sections.watchEdit.json.editTabLabel', { + defaultMessage: 'Edit', + }), + }, + { + id: WATCH_SIMULATE_TAB, + name: i18n.translate('xpack.watcher.sections.watchEdit.json.simulateTabLabel', { + defaultMessage: 'Simulate', + }), + }, +]; + +const EXECUTE_DETAILS_INITIAL_STATE = { + triggeredTimeValue: 0, + triggeredTimeUnit: TIME_UNITS.MILLISECOND, + scheduledTimeValue: 0, + scheduledTimeUnit: TIME_UNITS.SECOND, + ignoreCondition: false, +}; + +function getActions(watch: BaseWatch) { + const actions = (watch.watch && watch.watch.actions) || {}; + return Object.keys(actions).map(actionKey => ({ + actionId: actionKey, + type: getActionType(actions[actionKey]), + actionMode: ACTION_MODES.SIMULATE, + })); +} + +function getActionModes(items: WatchAction[]) { + const result = items.reduce((itemsAccum: any, item) => { + if (item.actionId) { + itemsAccum[item && item.actionId] = item.actionMode; + } + return itemsAccum; + }, {}); + return result; +} const JsonWatchEditUi = ({ pageTitle, @@ -31,21 +90,18 @@ const JsonWatchEditUi = ({ licenseService: any; }) => { const { watch } = useContext(WatchContext); + const watchActions = getActions(watch); // hooks - const [selectedTab, setSelectedTab] = useState(WATCH_TAB_ID_EDIT); - const [watchErrors, setWatchErrors] = useState<{ [key: string]: string[] }>({ - watchId: [], - watchJson: [], - }); - const [isShowingWatchErrors, setIsShowingWatchErrors] = useState(false); - const [executeWatchJsonString, setExecuteWatchJsonString] = useState(''); - const [isShowingExecuteWatchErrors, setIsShowingExecuteWatchErrors] = useState(false); - const [executeWatchErrors, setExecuteWatchErrors] = useState<{ [key: string]: string[] }>({ - simulateExecutionInputOverride: [], - }); - // ace editor requires json to be in string format - const [watchJsonString, setWatchJsonString] = useState( - JSON.stringify(watch.watch, null, 2) + const [selectedTab, setSelectedTab] = useState(WATCH_EDIT_TAB); + const [executeDetails, setExecuteDetails] = useState( + new ExecuteDetails({ + ...EXECUTE_DETAILS_INITIAL_STATE, + actionModes: getActionModes(watchActions), + }) + ); + const executeWatchErrors = executeDetails.validate(); + const hasExecuteWatchErrors = !!Object.keys(executeWatchErrors).find( + errorKey => executeWatchErrors[errorKey].length >= 1 ); return ( @@ -61,6 +117,9 @@ const JsonWatchEditUi = ({ { setSelectedTab(tab.id); + setExecuteDetails( + new ExecuteDetails({ ...executeDetails, actionModes: getActionModes(watchActions) }) + ); }} isSelected={tab.id === selectedTab} key={index} @@ -70,32 +129,17 @@ const JsonWatchEditUi = ({ ))} - {selectedTab === WATCH_TAB_ID_SIMULATE && ( + {selectedTab === WATCH_SIMULATE_TAB && ( setExecuteWatchJsonString(json)} - errors={executeWatchErrors} - setErrors={(errors: { [key: string]: string[] }) => setExecuteWatchErrors(errors)} - isShowingErrors={isShowingExecuteWatchErrors} - setIsShowingErrors={(isShowingErrors: boolean) => - setIsShowingExecuteWatchErrors(isShowingErrors) - } - isDisabled={isShowingExecuteWatchErrors || isShowingWatchErrors} + executeDetails={executeDetails} + setExecuteDetails={(details: ExecutedWatchDetails) => setExecuteDetails(details)} + executeWatchErrors={executeWatchErrors} + hasExecuteWatchErrors={hasExecuteWatchErrors} + watchActions={watchActions} /> )} - {selectedTab === WATCH_TAB_ID_EDIT && ( - setWatchJsonString(json)} - errors={watchErrors} - setErrors={(errors: { [key: string]: string[] }) => setWatchErrors(errors)} - isShowingErrors={isShowingWatchErrors} - setIsShowingErrors={(isShowingErrors: boolean) => - setIsShowingWatchErrors(isShowingErrors) - } - /> + {selectedTab === WATCH_EDIT_TAB && ( + )} ); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx index b110f64aa365a8..9bfc0ea115e6fc 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx @@ -24,48 +24,23 @@ import { documentationLinks } from '../../../lib/documentation_links'; import { onWatchSave, saveWatch } from '../watch_edit_actions'; import { WatchContext } from './watch_context'; -const JSON_WATCH_IDS = { - ID: 'watchId', - NAME: 'watchName', - JSON: 'watchJson', -}; - -function validateId(id: string) { - const regex = /^[A-Za-z0-9\-\_]+$/; - if (!id) { - return i18n.translate('xpack.watcher.sections.watchEdit.json.error.requiredIdText', { - defaultMessage: 'ID is required', - }); - } else if (!regex.test(id)) { - return i18n.translate('xpack.watcher.sections.watchEdit.json.error.invalidIdText', { - defaultMessage: 'ID can only contain letters, underscores, dashes, and numbers.', - }); - } - return false; -} - export const JsonWatchEditForm = ({ urlService, licenseService, - watchJsonString, - setWatchJsonString, - errors, - setErrors, - isShowingErrors, - setIsShowingErrors, }: { urlService: any; licenseService: any; - watchJsonString: string; - setWatchJsonString: (json: string) => void; - errors: { [key: string]: string[] }; - setErrors: (errors: { [key: string]: string[] }) => void; - isShowingErrors: boolean; - setIsShowingErrors: (isShowingErrors: boolean) => void; }) => { const { watch, setWatchProperty } = useContext(WatchContext); // hooks - const [modal, setModal] = useState<{ message: string } | null>(null); + const [modal, setModal] = useState<{ title: string; message: string } | null>(null); + const { errors } = watch.validate(); + const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); + + if (errors.json.length === 0) { + setWatchProperty('watch', JSON.parse(watch.watchString)); + } + return ( ) => { - const id = e.target.value; - const error = validateId(id); - const newErrors = { ...errors, [JSON_WATCH_IDS.ID]: error ? [error] : [] }; - const isInvalidForm = !!Object.keys(newErrors).find( - errorKey => newErrors[errorKey].length >= 1 - ); - setErrors(newErrors); - setIsShowingErrors(isInvalidForm); - setWatchProperty('id', id); + setWatchProperty('id', e.target.value); + }} + onBlur={() => { + if (!watch.id) { + setWatchProperty('id', ''); + } }} /> ) => { setWatchProperty('name', e.target.value); }} + onBlur={() => { + if (!watch.name) { + setWatchProperty('name', ''); + } + }} /> {i18n.translate('xpack.watcher.sections.watchEdit.json.form.watchJsonLabel', { @@ -138,8 +115,8 @@ export const JsonWatchEditForm = ({ ) } - errorKey={JSON_WATCH_IDS.JSON} - isShowingErrors={isShowingErrors} + errorKey="json" + isShowingErrors={hasErrors} fullWidth errors={errors} > @@ -154,31 +131,9 @@ export const JsonWatchEditForm = ({ defaultMessage: 'Code editor', } )} - value={watchJsonString} + value={watch.watchString} onChange={(json: string) => { - setWatchJsonString(json); - try { - const watchJson = JSON.parse(json); - if (watchJson && typeof watchJson === 'object') { - setWatchProperty('watch', watchJson); - const newErrors = { ...errors, [JSON_WATCH_IDS.JSON]: [] }; - const isInvalidForm = !!Object.keys(newErrors).find( - errorKey => newErrors[errorKey].length >= 1 - ); - setErrors(newErrors); - setIsShowingErrors(isInvalidForm); - } - } catch (e) { - setErrors({ - ...errors, - [JSON_WATCH_IDS.JSON]: [ - i18n.translate('xpack.watcher.sections.watchEdit.json.error.invalidJsonText', { - defaultMessage: 'Invalid JSON', - }), - ], - }); - setIsShowingErrors(true); - } + setWatchProperty('watchString', json); }} /> @@ -187,16 +142,11 @@ export const JsonWatchEditForm = ({ { - const error = validateId(watch.id); - setErrors({ ...errors, [JSON_WATCH_IDS.ID]: error ? [error] : [] }); - setIsShowingErrors(!!error); - if (!error) { - const savedWatch = await onWatchSave(watch, urlService, licenseService); - if (savedWatch && savedWatch.error) { - return setModal(savedWatch.error); - } + const savedWatch = await onWatchSave(watch, urlService, licenseService); + if (savedWatch && savedWatch.error) { + return setModal(savedWatch.error); } }} > diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx index 1f5e972fcaf0d1..c8d45d7ccc2909 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx @@ -16,94 +16,48 @@ import { EuiFlexItem, EuiForm, EuiFormRow, + EuiLink, EuiSelect, EuiSpacer, EuiSwitch, EuiText, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { map } from 'lodash'; +import { FormattedMessage } from '@kbn/i18n/react'; import { ExecuteDetails } from 'plugins/watcher/models/execute_details/execute_details'; import { WatchHistoryItem } from 'plugins/watcher/models/watch_history_item'; import { toastNotifications } from 'ui/notify'; import { ACTION_MODES, TIME_UNITS } from '../../../../common/constants'; -import { getActionType } from '../../../../common/lib/get_action_type'; -import { BaseWatch, ExecutedWatchResults } from '../../../../common/types/watch_types'; +import { ExecutedWatchDetails, ExecutedWatchResults } from '../../../../common/types/watch_types'; import { ErrableFormRow } from '../../../components/form_errors'; import { executeWatch } from '../../../lib/api'; +import { documentationLinks } from '../../../lib/documentation_links'; import { WatchContext } from '../../../sections/watch_edit/components/watch_context'; import { timeUnits } from '../time_units'; import { JsonWatchEditSimulateResults } from './json_watch_edit_simulate_results'; -interface TableDataRow { - actionId: string | undefined; - actionMode: string | undefined; - type: string; -} - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -interface TableData extends Array {} - -const EXECUTE_DETAILS_INITIAL_STATE = { - triggeredTimeValue: 0, - triggeredTimeUnit: TIME_UNITS.MILLISECOND, - scheduledTimeValue: 0, - scheduledTimeUnit: TIME_UNITS.SECOND, - ignoreCondition: false, -}; - -const INPUT_OVERRIDE_ID = 'simulateExecutionInputOverride'; - -function getTableData(watch: BaseWatch) { - const actions = watch.watch && watch.watch.actions; - return map(actions, (action, actionId) => { - const type = getActionType(action); - return { - actionId, - type, - actionMode: ACTION_MODES.SIMULATE, - }; - }); -} - -function getActionModes(items: TableData) { - const result = items.reduce((itemsAccum: any, item) => { - if (item.actionId) { - itemsAccum[item && item.actionId] = item.actionMode; - } - return itemsAccum; - }, {}); - return result; -} - export const JsonWatchEditSimulate = ({ - executeWatchJsonString, - setExecuteWatchJsonString, - errors, - setErrors, - isShowingErrors, - setIsShowingErrors, - isDisabled, + executeWatchErrors, + hasExecuteWatchErrors, + executeDetails, + setExecuteDetails, + watchActions, }: { - executeWatchJsonString: string; - setExecuteWatchJsonString: (json: string) => void; - errors: { [key: string]: string[] }; - setErrors: (errors: { [key: string]: string[] }) => void; - isShowingErrors: boolean; - setIsShowingErrors: (isShowingErrors: boolean) => void; - isDisabled: boolean; + executeWatchErrors: { [key: string]: string[] }; + hasExecuteWatchErrors: boolean; + executeDetails: ExecutedWatchDetails; + setExecuteDetails: (details: ExecutedWatchDetails) => void; + watchActions: Array<{ + actionId: string; + actionMode: string; + type: string; + }>; }) => { const { watch } = useContext(WatchContext); - const tableData = getTableData(watch); - // hooks - const [executeDetails, setExecuteDetails] = useState( - new ExecuteDetails({ - ...EXECUTE_DETAILS_INITIAL_STATE, - actionModes: getActionModes(tableData), - }) - ); const [executeResults, setExecuteResults] = useState(null); + const { errors: watchErrors } = watch.validate(); + const hasWatchJsonError = watchErrors.json.length >= 1; const columns = [ { @@ -176,14 +130,14 @@ export const JsonWatchEditSimulate = ({ setExecuteResults(null)} /> )}

{i18n.translate('xpack.watcher.sections.watchEdit.simulate.pageDescription', { - defaultMessage: 'Modify the fields below to simulate a watch execution.', + defaultMessage: + 'Use the simulator to override the watch schedule, input results, conditions, and actions.', })}

@@ -195,15 +149,14 @@ export const JsonWatchEditSimulate = ({

{i18n.translate( 'xpack.watcher.sections.watchEdit.simulate.form.triggerOverridesTitle', - { defaultMessage: 'Trigger overrides' } + { defaultMessage: 'Trigger' } )}

} description={i18n.translate( 'xpack.watcher.sections.watchEdit.simulate.form.triggerOverridesDescription', { - defaultMessage: - 'These fields are parsed as the data of the trigger event that will be used during the watch execution.', + defaultMessage: 'Schedule the time and date for starting the watch.', } )} > @@ -317,7 +270,7 @@ export const JsonWatchEditSimulate = ({

{i18n.translate( 'xpack.watcher.sections.watchEdit.simulate.form.inputOverridesTitle', - { defaultMessage: 'Input overrides' } + { defaultMessage: 'Input' } )}

} @@ -325,12 +278,12 @@ export const JsonWatchEditSimulate = ({ 'xpack.watcher.sections.watchEdit.simulate.form.inputOverridesDescription', { defaultMessage: - 'When present, the watch uses this object as a payload instead of executing its own input.', + 'Enter JSON data to override the watch payload that comes from running the input.', } )} > { - setExecuteWatchJsonString(json); - try { - const alternativeInput = json === '' ? undefined : JSON.parse(json); - if ( - typeof alternativeInput === 'undefined' || - (alternativeInput && typeof alternativeInput === 'object') - ) { - setExecuteDetails( - new ExecuteDetails({ - ...executeDetails, - alternativeInput, - }) - ); - setIsShowingErrors(false); - setErrors({ ...errors, [INPUT_OVERRIDE_ID]: [] }); - } - } catch (e) { - setErrors({ - ...errors, - [INPUT_OVERRIDE_ID]: [ - i18n.translate( - 'xpack.watcher.sections.watchEdit.simulate.form.alternativeInputFieldError', - { - defaultMessage: 'Invalid JSON', - } - ), - ], - }); - setIsShowingErrors(true); - } + setExecuteDetails( + new ExecuteDetails({ + ...executeDetails, + alternativeInput: json, + }) + ); }} /> @@ -396,14 +325,15 @@ export const JsonWatchEditSimulate = ({

{i18n.translate( 'xpack.watcher.sections.watchEdit.simulate.form.conditionOverridesTitle', - { defaultMessage: 'Condition overrides' } + { defaultMessage: 'Condition' } )}

} description={i18n.translate( 'xpack.watcher.sections.watchEdit.simulate.form.conditionOverridesDescription', { - defaultMessage: 'When enabled, the watch execution uses the Always Condition.', + defaultMessage: + 'Execute the watch when the condition is met. Otherwise, ignore the condition and run the watch on a fixed schedule.', } )} > @@ -429,17 +359,28 @@ export const JsonWatchEditSimulate = ({

{i18n.translate( 'xpack.watcher.sections.watchEdit.simulate.form.actionOverridesTitle', - { defaultMessage: 'Action overrides' } + { defaultMessage: 'Actions' } )}

} - description={i18n.translate( - 'xpack.watcher.sections.watchEdit.simulate.form.actionOverridesDescription', - { - defaultMessage: - 'The action modes determine how to handle the watch actions as part of the watch execution.', - } - )} + description={ + + {i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.actionOverridesDescription.linkLabel', + { + defaultMessage: 'Learn about actions.', + } + )} + + ), + }} + /> + } > @@ -462,7 +403,7 @@ export const JsonWatchEditSimulate = ({ iconType="play" fill type="submit" - isDisabled={isDisabled} + isDisabled={hasExecuteWatchErrors || hasWatchJsonError} onClick={async () => { try { const executedWatch = await executeWatch(executeDetails, watch); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx index cc67aefe98650e..ce7c0d194bf539 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { Fragment, useContext } from 'react'; import { EuiBasicTable, @@ -18,13 +18,10 @@ import { EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { find } from 'lodash'; import { WATCH_STATES } from '../../../../common/constants'; -import { - BaseWatch, - ExecutedWatchDetails, - ExecutedWatchResults, -} from '../../../../common/types/watch_types'; +import { ExecutedWatchDetails, ExecutedWatchResults } from '../../../../common/types/watch_types'; +import { getTypeFromAction } from '../watch_edit_actions'; +import { WatchContext } from './watch_context'; const WATCH_ICON_COLORS = { [WATCH_STATES.DISABLED]: 'subdued', @@ -35,36 +32,36 @@ const WATCH_ICON_COLORS = { }; export const JsonWatchEditSimulateResults = ({ - executeDetails, executeResults, + executeDetails, onCloseFlyout, - watch, }: { - executeDetails: ExecutedWatchDetails; executeResults: ExecutedWatchResults; + executeDetails: ExecutedWatchDetails; onCloseFlyout: () => void; - watch: BaseWatch; }) => { + const { watch } = useContext(WatchContext); + const getTableData = () => { - const actions = watch.actions; - const actionStatuses = executeResults.watchStatus.actionStatuses; + const actionStatuses = executeResults.watchStatus && executeResults.watchStatus.actionStatuses; const actionModes = executeDetails.actionModes; - const actionDetails = actions.map(action => { - const actionMode = actionModes[action.id]; - const actionStatus = find(actionStatuses, { id: action.id }); - - return { - actionId: action.id, - actionType: action.type, - actionMode, - actionState: actionStatus && actionStatus.state, - actionReason: actionStatus && actionStatus.lastExecutionReason, - }; - }); - return actionDetails; + const actions = watch.watch && watch.watch.actions; + if (actions) { + return Object.keys(actions).map(actionKey => { + const actionStatus = actionStatuses.find(status => status.id === actionKey); + return { + actionId: actionKey, + actionType: getTypeFromAction(actions[actionKey]), + actionMode: actionModes[actionKey], + actionState: actionStatus && actionStatus.state, + actionReason: actionStatus && actionStatus.lastExecutionReason, + }; + }); + } + return []; }; - const tableData = getTableData(); + const actionsTableData = getTableData(); const columns = [ { @@ -141,19 +138,23 @@ export const JsonWatchEditSimulateResults = ({ - -
- {i18n.translate( - 'xpack.watcher.sections.watchEdit.simulateResults.actionsSectionTitle', - { - defaultMessage: 'Actions', - } - )} -
-
- - - + {actionsTableData && actionsTableData.length > 0 && ( + + +
+ {i18n.translate( + 'xpack.watcher.sections.watchEdit.simulateResults.actionsSectionTitle', + { + defaultMessage: 'Actions', + } + )} +
+
+ + + +
+ )}
{i18n.translate( diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx index 31afca67b914be..e415f89cc3a65c 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx @@ -138,7 +138,7 @@ const ThresholdWatchEditUi = ({ const [watchThresholdPopoverOpen, setWatchThresholdPopoverOpen] = useState(false); const [watchDurationPopoverOpen, setWatchDurationPopoverOpen] = useState(false); const [aggTypePopoverOpen, setAggTypePopoverOpen] = useState(false); - const [modal, setModal] = useState<{ message: string } | null>(null); + const [modal, setModal] = useState<{ title: string; message: string } | null>(null); const { watch, setWatchProperty } = useContext(WatchContext); const getIndexPatterns = async () => { const { savedObjects } = await savedObjectsClient.find({ diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx index 4b537bfe7e637f..7b2f1f4cc70bb7 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -8,6 +8,7 @@ import { EuiLoadingSpinner } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Watch } from 'plugins/watcher/models/watch'; import React, { useEffect, useReducer } from 'react'; +import { isEqual } from 'lodash'; import { WATCH_TYPES } from '../../../../common/constants'; import { BaseWatch } from '../../../../common/types/watch_types'; import { loadWatch } from '../../../lib/api'; @@ -21,7 +22,7 @@ const getTitle = (watch: BaseWatch) => { return i18n.translate( 'xpack.watcher.sections.watchEdit.json.titlePanel.createNewTypeOfWatchTitle', { - defaultMessage: 'Create a new {typeName}', + defaultMessage: 'Create {typeName}', values: { typeName }, } ); @@ -38,7 +39,12 @@ const watchReducer = (state: any, action: any) => { case 'setWatch': return payload; case 'setProperty': - return new (Watch.getWatchTypes())[state.type]({ ...state, ...payload }); + const { property, value } = payload; + if (isEqual(state[property], value)) { + return state; + } else { + return new (Watch.getWatchTypes())[state.type]({ ...state, [property]: value }); + } case 'addAction': const newWatch = new (Watch.getWatchTypes())[state.type](state); newWatch.addAction(payload); @@ -62,7 +68,7 @@ export const WatchEdit = ({ // hooks const [watch, dispatch] = useReducer(watchReducer, null); const setWatchProperty = (property: string, value: any) => { - dispatch({ command: 'setProperty', payload: { [property]: value } }); + dispatch({ command: 'setProperty', payload: { property, value } }); }; const addAction = (action: any) => { dispatch({ command: 'addAction', payload: action }); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts index e751e04ac0fed6..cd054dafc34971 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts +++ b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts @@ -14,7 +14,7 @@ import { createWatch, loadWatch } from '../../lib/api'; * Get the type from an action where a key defines its type. * eg: { email: { ... } } | { slack: { ... } } */ -function getTypeFromAction(action: { [key: string]: any }) { +export function getTypeFromAction(action: { [key: string]: any }) { const actionKeys = Object.keys(action); let type; Object.keys(ACTION_TYPES).forEach(k => { @@ -65,7 +65,6 @@ export async function saveWatch(watch: BaseWatch, urlService: any, licenseServic }, }) ); - // TODO: Not correctly redirecting back to /watches route urlService.change('/management/elasticsearch/watcher/watches', {}); } catch (error) { return licenseService @@ -83,6 +82,12 @@ export async function validateActionsAndSaveWatch( if (warning) { return { error: { + title: i18n.translate( + 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.errorValidationTitleText', + { + defaultMessage: 'Save watch?', + } + ), message: warning.message, }, }; @@ -106,27 +111,25 @@ export async function onWatchSave( if (existingWatch) { return { error: { + title: i18n.translate( + 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.existingWatchTitleText', + { + defaultMessage: 'A watch with this ID already exists', + } + ), message: i18n.translate( - 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.descriptionText', + 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.existingWatchDescriptionText', + { + defaultMessage: 'Saving this watch will overwrite previous content.', + } + ), + buttonLabel: i18n.translate( + 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.existingWatchButtonLabel', { - defaultMessage: - 'Watch with ID "{watchId}" {watchNameMessageFragment} already exists. Do you want to overwrite it?', - values: { - watchId: existingWatch.id, - watchNameMessageFragment: existingWatch.name - ? i18n.translate( - 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.descriptionFragmentText', - { - defaultMessage: '(name: "{existingWatchName}")', - values: { - existingWatchName: existingWatch.name, - }, - } - ) - : '', - }, + defaultMessage: 'Overwrite', } ), + buttonType: 'danger', }, }; } From cadca11dbd4231fe87b6c759c22d0124eb920362 Mon Sep 17 00:00:00 2001 From: Bill McConaghy Date: Fri, 19 Apr 2019 13:49:37 -0400 Subject: [PATCH 07/51] turning it all into one React app (#35185) * turning it all into one React app * removing dependency on kbnUrl * fixing import * fixing tsc issues * fixing eslint issues * fixing typo * fixing import * removing unused translations * removing more missing translations * removing unused style sheets * deleting scss file * fixing test * fixing tests for reals * test fix * fix test * fixing another test --- .../translations/translations/zh-CN.json | 155 --------- x-pack/plugins/watcher/plugin_definition.js | 12 +- x-pack/plugins/watcher/public/app.html | 3 + x-pack/plugins/watcher/public/app.js | 59 ++++ .../action_state_icon/action_state_icon.html | 22 -- .../action_state_icon/action_state_icon.js | 29 -- .../_action_type_select.scss | 44 --- .../components/action_type_select/_index.scss | 1 - .../action_type_select.html | 34 -- .../action_type_select/action_type_select.js | 72 ---- .../chart_tooltip/_chart_tooltip.scss | 21 -- .../components/chart_tooltip/_index.scss | 1 - .../chart_tooltip/chart_tooltip.html | 5 - .../components/chart_tooltip/chart_tooltip.js | 70 ---- .../public/components/chart_tooltip/index.js | 7 - .../duration_select/_duration_select.scss | 11 - .../components/duration_select/_index.scss | 1 - .../duration_select/duration_select.html | 24 -- .../duration_select/duration_select.js | 76 ---- .../errors_display_modal.html | 18 - .../errors_display_modal.js | 18 - .../components/errors_display_modal/index.js | 7 - .../components/expression_builder/_index.scss | 1 - .../expression_item/expression_item.html | 26 -- .../expression_item/expression_item.js | 98 ------ .../components/expression_item/index.js | 7 - .../_expression_popover.scss | 3 - .../expression_popover.html | 13 - .../expression_popover/expression_popover.js | 28 -- .../components/expression_popover/index.js | 7 - .../expression_builder.html | 3 - .../expression_builder/expression_builder.js | 28 -- .../components/expression_builder/index.js | 7 - .../components/flot_chart/_flot_chart.scss | 3 - .../public/components/flot_chart/_index.scss | 1 - .../public/components/flot_chart/constants.js | 7 - .../components/flot_chart/flot_chart.html | 1 - .../components/flot_chart/flot_chart.js | 65 ---- .../public/components/flot_chart/index.js | 7 - .../forbidden_message/forbidden_message.html | 17 - .../forbidden_message/forbidden_message.js | 25 -- .../components/forbidden_message/index.js | 7 - .../components/index_select/_index.scss | 1 - .../index_select/_index_select.scss | 55 --- .../public/components/index_select/index.js | 7 - .../components/index_select/index_select.html | 46 --- .../components/index_select/index_select.js | 207 ----------- .../public/components/json_editor/_index.scss | 1 - .../components/json_editor/_json_editor.scss | 3 - .../public/components/json_editor/index.js | 7 - .../components/json_editor/json_editor.html | 12 - .../components/json_editor/json_editor.js | 48 --- .../kbn_tabs/components/kbn_tab/index.js | 7 - .../kbn_tabs/components/kbn_tab/kbn_tab.html | 9 - .../kbn_tabs/components/kbn_tab/kbn_tab.js | 30 -- .../kbn_tabs/components/kbn_tabs/index.js | 7 - .../components/kbn_tabs/kbn_tabs.html | 1 - .../kbn_tabs/components/kbn_tabs/kbn_tabs.js | 32 -- .../public/components/kbn_tabs/index.js | 8 - .../public/components/panel_pager/_index.scss | 1 - .../components/panel_pager/_panel_pager.scss | 31 -- .../public/components/panel_pager/index.js | 7 - .../components/panel_pager/panel_pager.html | 28 -- .../components/panel_pager/panel_pager.js | 28 -- .../threshold_preview_chart/_index.scss | 1 - .../_threshold_preview_chart.scss | 15 - .../threshold_preview_chart/index.js | 7 - .../threshold_preview_chart.html | 22 -- .../threshold_preview_chart.js | 188 ---------- .../threshold_watch_expression/_index.scss | 1 - .../_threshold_watch_expression.scss | 17 - .../threshold_watch_agg_field/index.js | 7 - .../threshold_watch_agg_field.html | 37 -- .../threshold_watch_agg_field.js | 67 ---- .../threshold_watch_agg_type/index.js | 7 - .../threshold_watch_agg_type.html | 31 -- .../threshold_watch_agg_type.js | 56 --- .../components/threshold_watch_base/index.js | 7 - .../threshold_watch_base.js | 57 --- .../threshold_watch_group_by/index.js | 7 - .../threshold_watch_group_by.html | 77 ----- .../threshold_watch_group_by.js | 85 ----- .../threshold_watch_threshold_level/index.js | 7 - .../threshold_watch_threshold_level.html | 45 --- .../threshold_watch_threshold_level.js | 59 ---- .../threshold_watch_time_window/index.js | 7 - .../threshold_watch_time_window.html | 63 ---- .../threshold_watch_time_window.js | 76 ---- .../threshold_watch_expression/index.js | 7 - .../lib/agg_types.js | 39 --- .../lib/comparators.js | 24 -- .../lib/group_by_types.js | 26 -- .../lib/time_units.js | 46 --- .../threshold_watch_expression.html | 89 ----- .../threshold_watch_expression.js | 228 ------------ .../tool_bar_selected_count/index.js | 7 - .../tool_bar_selected_count.html | 4 - .../tool_bar_selected_count.js | 27 -- .../components/watch_actions/_index.scss | 2 - .../watch_actions/_watch_actions.scss | 14 - .../lib/watch_action_controller_base/index.js | 7 - .../watch_action_controller_base.js | 18 - .../watch_action/_watch_action.scss | 56 --- .../components/watch_action/index.js | 7 - .../components/watch_action/watch_action.html | 57 --- .../components/watch_action/watch_action.js | 76 ---- .../components/watch_email_action/index.js | 7 - .../watch_email_action.html | 72 ---- .../watch_email_action/watch_email_action.js | 47 --- .../components/watch_logging_action/index.js | 7 - .../watch_logging_action.html | 25 -- .../watch_logging_action.js | 36 -- .../components/watch_slack_action/index.js | 7 - .../watch_slack_action.html | 48 --- .../watch_slack_action/watch_slack_action.js | 46 --- .../public/components/watch_actions/index.js | 7 - .../watch_actions/watch_actions.html | 27 -- .../components/watch_actions/watch_actions.js | 104 ------ .../watch_history_item_detail/_index.scss | 1 - .../_watch_history_item_detail.scss | 6 - .../watch_history_item_detail/index.js | 7 - .../watch_history_item_detail.html | 14 - .../watch_history_item_detail.js | 32 -- .../components/watch_state_icon/index.js | 7 - .../watch_state_icon/watch_state_icon.html | 18 - .../watch_state_icon/watch_state_icon.js | 29 -- .../components/xpack_aria_describes/index.js | 7 - .../xpack_aria_describes.js | 81 ----- .../index.js => constants/base_path.ts} | 2 +- .../public/constants/{index.js => index.ts} | 1 + .../{time_units.js => time_units.ts} | 6 +- .../directives/check_box/check_box.html | 6 - .../public/directives/check_box/check_box.js | 27 -- .../public/directives/check_box/index.js | 7 - .../watcher/public/directives/json_input.js | 38 -- .../directives/sortable_column/index.js | 8 - .../sortable_column/sortable_column.html | 14 - .../sortable_column/sortable_column.js | 62 ---- .../public/directives/toggle_button/index.js | 7 - .../toggle_button/toggle_button.html | 12 - .../directives/toggle_button/toggle_button.js | 28 -- .../public/directives/toggle_panel/index.js | 7 - .../directives/toggle_panel/toggle_panel.html | 15 - .../directives/toggle_panel/toggle_panel.js | 34 -- .../public/directives/tooltip/index.js | 7 - .../public/directives/tooltip/tooltip.html | 6 - .../public/directives/tooltip/tooltip.js | 40 --- .../{components/duration_select => }/index.js | 3 +- x-pack/plugins/watcher/public/index.scss | 29 -- x-pack/plugins/watcher/public/lib/api.ts | 15 + .../constants.js => lib/navigation.ts} | 17 +- .../index.js => license_service_context.ts} | 3 +- ...ion.js => register_management_sections.js} | 38 +- .../watch_list_route.js => register_route.js} | 38 +- .../action_status_table.html | 74 ---- .../action_status_table.js | 44 --- .../components/action_status_table/index.js | 7 - .../components/watch_detail/index.js | 7 - .../components/watch_detail/watch_detail.html | 89 ----- .../components/watch_detail/watch_detail.js | 221 ------------ .../components/watch_history/index.js | 7 - .../watch_history/watch_history.html | 60 ---- .../components/watch_history/watch_history.js | 85 ----- .../watch_history_range_filter/index.js | 7 - .../watch_history_range_filter.html | 41 --- .../watch_history_range_filter.js | 31 -- .../components/watch_history_table/index.js | 7 - .../watch_history_table.html | 71 ---- .../watch_history_table.js | 53 --- .../public/sections/watch_detail/index.js | 7 - .../watch_detail/watch_detail_route.html | 5 - .../watch_detail/watch_detail_route.js | 115 ------- ...edit_component.tsx => json_watch_edit.tsx} | 15 +- .../components/json_watch_edit/index.js | 7 - .../json_watch_edit/json_watch_edit.html | 121 ------- .../json_watch_edit/json_watch_edit.js | 288 ---------------- .../components/json_watch_edit_form.tsx | 17 +- ...component.tsx => threshold_watch_edit.tsx} | 31 +- .../threshold_watch_edit/_index.scss | 1 - .../_threshold_watch_edit.scss | 31 -- .../components/threshold_watch_edit/index.js | 7 - .../threshold_watch_edit.html | 105 ------ .../threshold_watch_edit.js | 324 ------------------ .../watch_action_mode_table/index.js | 7 - .../watch_action_mode_table.html | 46 --- .../watch_action_mode_table.js | 58 ---- .../watch_edit/components/watch_edit.tsx | 38 +- .../index.js | 7 - .../watch_edit_actions_execute_summary.html | 64 ---- .../watch_edit_actions_execute_summary.js | 51 --- .../components/watch_edit_detail/_index.scss | 1 - .../watch_edit_detail/_watch_edit_detail.scss | 5 - .../components/watch_edit_detail/index.js | 7 - .../watch_edit_detail/watch_edit_detail.html | 81 ----- .../watch_edit_detail/watch_edit_detail.js | 68 ---- .../watch_edit_execute_detail/_index.scss | 1 - .../_watch_edit_execute_detail.scss | 19 - .../watch_edit_execute_detail/index.js | 7 - .../watch_edit_execute_detail.html | 125 ------- .../watch_edit_execute_detail.js | 109 ------ .../watch_edit_execute_info_panel/index.js | 7 - .../watch_edit_execute_info_panel.html | 18 - .../watch_edit_execute_info_panel.js | 25 -- .../components/watch_edit_title_bar/index.js | 7 - .../watch_edit_title_bar.html | 37 -- .../watch_edit_title_bar.js | 31 -- .../watch_edit_title_panel/_index.scss | 1 - .../_watch_edit_title_panel.scss | 13 - .../watch_edit_title_panel/index.js | 7 - .../watch_edit_title_panel.html | 201 ----------- .../watch_edit_title_panel.js | 174 ---------- .../watch_edit_watch_execute_summary/index.js | 7 - .../watch_edit_watch_execute_summary.html | 8 - .../watch_edit_watch_execute_summary.js | 27 -- .../public/sections/watch_edit/index.js | 7 - .../sections/watch_edit/watch_edit_actions.ts | 23 +- .../sections/watch_edit/watch_edit_route.html | 11 - .../sections/watch_edit/watch_edit_route.js | 129 ------- .../components/watch_history_item/index.js | 7 - .../watch_history_item.html | 26 -- .../watch_history_item/watch_history_item.js | 38 -- .../index.js | 7 - .../watch_history_item_actions_summary.html | 53 --- .../watch_history_item_actions_summary.js | 42 --- .../watch_history_item_watch_summary/index.js | 7 - .../watch_history_item_watch_summary.html | 10 - .../watch_history_item_watch_summary.js | 27 -- .../sections/watch_history_item/index.js | 7 - .../watch_history_item_route.html | 4 - .../watch_history_item_route.js | 75 ---- .../public/sections/watch_list/index.js | 8 - .../public/sections/watch_list/index.scss | 6 - .../sections/watch_list/watch_list_route.html | 4 - .../components}/watch_action_status.tsx | 2 +- .../components/watch_detail.tsx} | 2 +- .../components/watch_history.tsx} | 19 +- .../sections/watch_status/watch_status.tsx | 30 ++ .../functional/apps/watcher/watcher_test.js | 4 +- .../functional/page_objects/watcher_page.js | 4 +- 239 files changed, 221 insertions(+), 7871 deletions(-) create mode 100644 x-pack/plugins/watcher/public/app.html create mode 100644 x-pack/plugins/watcher/public/app.js delete mode 100644 x-pack/plugins/watcher/public/components/action_state_icon/action_state_icon.html delete mode 100644 x-pack/plugins/watcher/public/components/action_state_icon/action_state_icon.js delete mode 100644 x-pack/plugins/watcher/public/components/action_type_select/_action_type_select.scss delete mode 100644 x-pack/plugins/watcher/public/components/action_type_select/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/action_type_select/action_type_select.html delete mode 100644 x-pack/plugins/watcher/public/components/action_type_select/action_type_select.js delete mode 100644 x-pack/plugins/watcher/public/components/chart_tooltip/_chart_tooltip.scss delete mode 100644 x-pack/plugins/watcher/public/components/chart_tooltip/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/chart_tooltip/chart_tooltip.html delete mode 100644 x-pack/plugins/watcher/public/components/chart_tooltip/chart_tooltip.js delete mode 100644 x-pack/plugins/watcher/public/components/chart_tooltip/index.js delete mode 100644 x-pack/plugins/watcher/public/components/duration_select/_duration_select.scss delete mode 100644 x-pack/plugins/watcher/public/components/duration_select/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/duration_select/duration_select.html delete mode 100644 x-pack/plugins/watcher/public/components/duration_select/duration_select.js delete mode 100644 x-pack/plugins/watcher/public/components/errors_display_modal/errors_display_modal.html delete mode 100644 x-pack/plugins/watcher/public/components/errors_display_modal/errors_display_modal.js delete mode 100644 x-pack/plugins/watcher/public/components/errors_display_modal/index.js delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/expression_item.html delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/expression_item.js delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/index.js delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/_expression_popover.scss delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/expression_popover.html delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/expression_popover.js delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/index.js delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/expression_builder.html delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/expression_builder.js delete mode 100644 x-pack/plugins/watcher/public/components/expression_builder/index.js delete mode 100644 x-pack/plugins/watcher/public/components/flot_chart/_flot_chart.scss delete mode 100644 x-pack/plugins/watcher/public/components/flot_chart/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/flot_chart/constants.js delete mode 100644 x-pack/plugins/watcher/public/components/flot_chart/flot_chart.html delete mode 100644 x-pack/plugins/watcher/public/components/flot_chart/flot_chart.js delete mode 100644 x-pack/plugins/watcher/public/components/flot_chart/index.js delete mode 100644 x-pack/plugins/watcher/public/components/forbidden_message/forbidden_message.html delete mode 100644 x-pack/plugins/watcher/public/components/forbidden_message/forbidden_message.js delete mode 100644 x-pack/plugins/watcher/public/components/forbidden_message/index.js delete mode 100644 x-pack/plugins/watcher/public/components/index_select/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/index_select/_index_select.scss delete mode 100644 x-pack/plugins/watcher/public/components/index_select/index.js delete mode 100644 x-pack/plugins/watcher/public/components/index_select/index_select.html delete mode 100644 x-pack/plugins/watcher/public/components/index_select/index_select.js delete mode 100644 x-pack/plugins/watcher/public/components/json_editor/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/json_editor/_json_editor.scss delete mode 100644 x-pack/plugins/watcher/public/components/json_editor/index.js delete mode 100644 x-pack/plugins/watcher/public/components/json_editor/json_editor.html delete mode 100644 x-pack/plugins/watcher/public/components/json_editor/json_editor.js delete mode 100644 x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/index.js delete mode 100644 x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/kbn_tab.html delete mode 100644 x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/kbn_tab.js delete mode 100644 x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/index.js delete mode 100644 x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/kbn_tabs.html delete mode 100644 x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/kbn_tabs.js delete mode 100644 x-pack/plugins/watcher/public/components/kbn_tabs/index.js delete mode 100644 x-pack/plugins/watcher/public/components/panel_pager/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/panel_pager/_panel_pager.scss delete mode 100644 x-pack/plugins/watcher/public/components/panel_pager/index.js delete mode 100644 x-pack/plugins/watcher/public/components/panel_pager/panel_pager.html delete mode 100644 x-pack/plugins/watcher/public/components/panel_pager/panel_pager.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_preview_chart/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/threshold_preview_chart/_threshold_preview_chart.scss delete mode 100644 x-pack/plugins/watcher/public/components/threshold_preview_chart/index.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_preview_chart/threshold_preview_chart.html delete mode 100644 x-pack/plugins/watcher/public/components/threshold_preview_chart/threshold_preview_chart.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/_threshold_watch_expression.scss delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/index.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/threshold_watch_agg_field.html delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/threshold_watch_agg_field.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/index.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/threshold_watch_agg_type.html delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/threshold_watch_agg_type.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_base/index.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_base/threshold_watch_base.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/index.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/threshold_watch_group_by.html delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/threshold_watch_group_by.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/index.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/threshold_watch_threshold_level.html delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/threshold_watch_threshold_level.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/index.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/threshold_watch_time_window.html delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/threshold_watch_time_window.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/index.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/agg_types.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/comparators.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/group_by_types.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/time_units.js delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/threshold_watch_expression.html delete mode 100644 x-pack/plugins/watcher/public/components/threshold_watch_expression/threshold_watch_expression.js delete mode 100644 x-pack/plugins/watcher/public/components/tool_bar_selected_count/index.js delete mode 100644 x-pack/plugins/watcher/public/components/tool_bar_selected_count/tool_bar_selected_count.html delete mode 100644 x-pack/plugins/watcher/public/components/tool_bar_selected_count/tool_bar_selected_count.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/_watch_actions.scss delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/lib/watch_action_controller_base/index.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/lib/watch_action_controller_base/watch_action_controller_base.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/_watch_action.scss delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/index.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/watch_action.html delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/watch_action.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/index.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/watch_email_action.html delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/watch_email_action.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/index.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/watch_logging_action.html delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/watch_logging_action.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/index.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/watch_slack_action.html delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/watch_slack_action.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/index.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/watch_actions.html delete mode 100644 x-pack/plugins/watcher/public/components/watch_actions/watch_actions.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_history_item_detail/_index.scss delete mode 100644 x-pack/plugins/watcher/public/components/watch_history_item_detail/_watch_history_item_detail.scss delete mode 100644 x-pack/plugins/watcher/public/components/watch_history_item_detail/index.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_history_item_detail/watch_history_item_detail.html delete mode 100644 x-pack/plugins/watcher/public/components/watch_history_item_detail/watch_history_item_detail.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_state_icon/index.js delete mode 100644 x-pack/plugins/watcher/public/components/watch_state_icon/watch_state_icon.html delete mode 100644 x-pack/plugins/watcher/public/components/watch_state_icon/watch_state_icon.js delete mode 100644 x-pack/plugins/watcher/public/components/xpack_aria_describes/index.js delete mode 100644 x-pack/plugins/watcher/public/components/xpack_aria_describes/xpack_aria_describes.js rename x-pack/plugins/watcher/public/{components/action_type_select/index.js => constants/base_path.ts} (79%) rename x-pack/plugins/watcher/public/constants/{index.js => index.ts} (87%) rename x-pack/plugins/watcher/public/constants/{time_units.js => time_units.ts} (92%) delete mode 100644 x-pack/plugins/watcher/public/directives/check_box/check_box.html delete mode 100644 x-pack/plugins/watcher/public/directives/check_box/check_box.js delete mode 100644 x-pack/plugins/watcher/public/directives/check_box/index.js delete mode 100644 x-pack/plugins/watcher/public/directives/json_input.js delete mode 100644 x-pack/plugins/watcher/public/directives/sortable_column/index.js delete mode 100644 x-pack/plugins/watcher/public/directives/sortable_column/sortable_column.html delete mode 100644 x-pack/plugins/watcher/public/directives/sortable_column/sortable_column.js delete mode 100644 x-pack/plugins/watcher/public/directives/toggle_button/index.js delete mode 100644 x-pack/plugins/watcher/public/directives/toggle_button/toggle_button.html delete mode 100644 x-pack/plugins/watcher/public/directives/toggle_button/toggle_button.js delete mode 100644 x-pack/plugins/watcher/public/directives/toggle_panel/index.js delete mode 100644 x-pack/plugins/watcher/public/directives/toggle_panel/toggle_panel.html delete mode 100644 x-pack/plugins/watcher/public/directives/toggle_panel/toggle_panel.js delete mode 100644 x-pack/plugins/watcher/public/directives/tooltip/index.js delete mode 100644 x-pack/plugins/watcher/public/directives/tooltip/tooltip.html delete mode 100644 x-pack/plugins/watcher/public/directives/tooltip/tooltip.js rename x-pack/plugins/watcher/public/{components/duration_select => }/index.js (78%) delete mode 100644 x-pack/plugins/watcher/public/index.scss rename x-pack/plugins/watcher/public/{components/threshold_preview_chart/constants.js => lib/navigation.ts} (52%) rename x-pack/plugins/watcher/public/{components/action_state_icon/index.js => license_service_context.ts} (71%) rename x-pack/plugins/watcher/public/{sections/watch_list/register_management_section.js => register_management_sections.js} (75%) rename x-pack/plugins/watcher/public/{sections/watch_list/watch_list_route.js => register_route.js} (62%) delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/action_status_table.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/action_status_table.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/watch_history.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/watch_history.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/watch_history_range_filter.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/watch_history_range_filter.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/watch_history_table.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/watch_history_table.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.js rename x-pack/plugins/watcher/public/sections/watch_edit/components/{json_watch_edit_component.tsx => json_watch_edit.tsx} (93%) delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.js rename x-pack/plugins/watcher/public/sections/watch_edit/components/{threshold_watch_edit_component.tsx => threshold_watch_edit.tsx} (97%) delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/_index.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/_threshold_watch_edit.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/watch_action_mode_table.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/watch_action_mode_table.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/watch_edit_actions_execute_summary.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/watch_edit_actions_execute_summary.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/_index.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/_watch_edit_detail.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/watch_edit_detail.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/watch_edit_detail.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/_index.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/_watch_edit_execute_detail.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/watch_edit_execute_detail.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/watch_edit_execute_detail.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/watch_edit_execute_info_panel.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/watch_edit_execute_info_panel.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/watch_edit_title_bar.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/watch_edit_title_bar.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/_index.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/_watch_edit_title_panel.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/watch_edit_title_panel.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/watch_edit_title_panel.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/watch_edit_watch_execute_summary.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/watch_edit_watch_execute_summary.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/watch_history_item.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/watch_history_item.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/watch_history_item_actions_summary.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/watch_history_item_actions_summary.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/watch_history_item_watch_summary.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/watch_history_item_watch_summary.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/watch_history_item_route.html delete mode 100644 x-pack/plugins/watcher/public/sections/watch_history_item/watch_history_item_route.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/index.js delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/index.scss delete mode 100644 x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.html rename x-pack/plugins/watcher/public/sections/{watch_detail/components/watch_detail => watch_status/components}/watch_action_status.tsx (92%) rename x-pack/plugins/watcher/public/sections/{watch_detail/components/watch_detail/watch_detail_component.tsx => watch_status/components/watch_detail.tsx} (98%) rename x-pack/plugins/watcher/public/sections/{watch_detail/components/watch_detail/watch_history_component.tsx => watch_status/components/watch_history.tsx} (96%) create mode 100644 x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 3eb940d9ab5853..30900da2dd4579 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7811,8 +7811,6 @@ "xpack.uptime.snapshotHistogram.series.downLabel": "关闭", "xpack.uptime.snapshotHistogram.series.upLabel": "运行", "xpack.uptime.uptimeFeatureCatalogueTitle": "运行时间", - "xpack.watcher.actionTypeSelect.actionDisabledTextMessage": "已禁用。配置 {elasticsearchYmlText}。", - "xpack.watcher.actionTypeSelect.addNewActionPlaceholder": "添加新操作", "xpack.watcher.checkLicense.licenseDoesNotSupportTextMessage": "您的 {licenseType} 许可证不支持 {watcher}。请升级您的许可。", "xpack.watcher.checkLicense.licenseInformationNotAvailableTextMessage": "您不能使用 {watcher},因为许可证信息当前不可用。", "xpack.watcher.constants.actionStates.acknowledgedStateText": "已确认", @@ -7831,11 +7829,6 @@ "xpack.watcher.constants.watchStates.errorStateText": "错误!", "xpack.watcher.constants.watchStates.firingStateText": "正在发送", "xpack.watcher.constants.watchStates.okStateText": "确定", - "xpack.watcher.durationSelect.durationAmountAriaLabel": "持续时间量", - "xpack.watcher.durationSelect.durationTimeUnitAriaLabel": "持续时间单位", - "xpack.watcher.forbiddenMessage.contactAdministratorTextMessage": "请联系您的管理员。", - "xpack.watcher.indexSelect.buildingListTextMessage": "正在生成列表…… 请稍候", - "xpack.watcher.indexSelect.startTypingPlaceholder": "开始键入……", "xpack.watcher.models.action.actionJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJson} 属性", "xpack.watcher.models.actionStatus.actionStatusJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {actionStatusJson} 属性", "xpack.watcher.models.actionStatus.idPropertyMissingBadRequestMessage": "json 参数必须包含 {id} 属性", @@ -7896,117 +7889,16 @@ "xpack.watcher.models.watchHistoryItem.watchIdPropertyMissingBadRequestMessage": "json 参数必须包含 {watchId} 属性", "xpack.watcher.models.watchStatus.idPropertyMissingBadRequestMessage": "json 参数必须包含 {id} 属性", "xpack.watcher.models.watchStatus.watchStatusJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {watchStatusJson} 属性", - "xpack.watcher.sections.watchDetail.actionStatusTable.acknowledgeButtonLabel": "确认", - "xpack.watcher.sections.watchDetail.actionStatusTable.acknowledgeButtonTitle": "确认", - "xpack.watcher.sections.watchDetail.actionStatusTable.actionColumnLabel": "操作", - "xpack.watcher.sections.watchDetail.actionStatusTable.stateColumnLabel": "状态", - "xpack.watcher.sections.watchDetail.actionStatusTotalErrors": "{total, number} {total, plural, one {个错误} other {个错误}}", - "xpack.watcher.sections.watchDetail.activateButtonLabel": "激活", - "xpack.watcher.sections.watchDetail.currentStatusTitle": "当前状态", - "xpack.watcher.sections.watchDetail.deactivateButtonLabel": "停用", - "xpack.watcher.sections.watchDetail.deleteButtonLabel": "删除", - "xpack.watcher.sections.watchDetail.deleteConfirmModal.deleteWatchButtonLabel": "删除监视", - "xpack.watcher.sections.watchDetail.deleteConfirmModal.description": "这将永久删除该监视。是否确定?", - "xpack.watcher.sections.watchDetail.deleteWatchSuccessNotificationText": "已删除 {watchName}", - "xpack.watcher.sections.watchDetail.errorDisplayModalTitleText": "“{actionId}” 操作中有错误", - "xpack.watcher.sections.watchDetail.noActionsFoundText": "未找到操作。", - "xpack.watcher.sections.watchDetail.watchHistory.watchHistoryLoadingText": "正在加载监视历史记录", - "xpack.watcher.sections.watchDetail.watchHistory.watchHistoryNotFoundText": "未找到任何监视历史记录。", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.allLabel": "全部", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last1HourLabel": "过去 1 小时", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last1YearLabel": "过去 1 年", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last24HoursLabel": "过去 24 小时", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last30DaysLabel": "过去 30 天", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last6MonthsLabel": "过去 6 个月", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last7DaysLabel": "过去 7 天", - "xpack.watcher.sections.watchDetail.watchHistoryTable.commentColumnLabel": "注释", - "xpack.watcher.sections.watchDetail.watchHistoryTable.stateColumnLabel": "状态", - "xpack.watcher.sections.watchDetail.watchHistoryTable.triggerTimeColumnLabel": "触发时间", - "xpack.watcher.sections.watchDetail.watchHistoryTitle": "监视历史记录", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.actionColumnLabel": "操作", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.modeColumnLabel": "模式", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.reasonColumnLabel": "原因", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.stateColumnLabel": "状态", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.typeColumnLabel": "类型", - "xpack.watcher.sections.watchEdit.detail.idIsRequiredValidationMessage": "ID 必填。", - "xpack.watcher.sections.watchEdit.detail.idLabel": "ID", - "xpack.watcher.sections.watchEdit.detail.idNamingDescription": "ID 必须以字母或下划线开头,并只能包含字母、下划线、短划线和数字。", - "xpack.watcher.sections.watchEdit.detail.invalidJSONErrorMessage": "JSON 无效", - "xpack.watcher.sections.watchEdit.detail.nameLabel": "名称", - "xpack.watcher.sections.watchEdit.detail.syntaxLinkLabel": "语法", - "xpack.watcher.sections.watchEdit.detail.watchJSONLabel": "监视 JSON", - "xpack.watcher.sections.watchEdit.executeDetail.actionOverrides.actionModesLabel": "操作模式", - "xpack.watcher.sections.watchEdit.executeDetail.actionOverridesButtonLabel": "操作覆盖", - "xpack.watcher.sections.watchEdit.executeDetail.conditionOverrides.ignoreConditionLabel": "忽略条件(条件始终为 true)", - "xpack.watcher.sections.watchEdit.executeDetail.conditionOverridesButtonLabel": "条件覆盖", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.alternativeInputLabel": "备用输入", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.alternativeInputLinkText": "从之前执行复制", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.invalidJSONErrorMessage": "JSON 无效", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverridesButtonLabel": "输入覆盖", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.scheduledTimeLabel": "排定时间", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.scheduledTimePlaceholder": "现在", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.triggeredTimeLabel": "触发时间", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.triggeredTimePlaceholder": "现在", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverridesButtonLabel": "触发覆盖", - "xpack.watcher.sections.watchEdit.executeInfoPanel.howToModifyWatchExecutionDescription": "要修改执行监视的方式,请展开以下部分", - "xpack.watcher.sections.watchEdit.executeInfoPanel.testWatchExecutionTitle": "测试您的监视执行", - "xpack.watcher.sections.watchEdit.json.deleteConfirmModal.description": "这将永久删除该监视。是否确定?", - "xpack.watcher.sections.watchEdit.json.deleteConfirmModal.overwriteWatchButtonLabel": "删除监视", - "xpack.watcher.sections.watchEdit.json.deleteSuccessNotificationText": "已删除“{watchDisplayName}”", "xpack.watcher.sections.watchEdit.json.editTabLabel": "编辑", - "xpack.watcher.sections.watchEdit.json.editTabTitle": "编辑监视", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.description": "ID “{watchId}{watchNameMessageFragment}” 的监视已存在。确定要覆盖?", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.descriptionFragmentText": "(名称:“{existingWatchName}”)", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.overwriteWatchButtonLabel": "覆盖监视", - "xpack.watcher.sections.watchEdit.json.saveSuccessNotificationText": "已保存“{watchDisplayName}”", - "xpack.watcher.sections.watchEdit.json.simulateResultsTabLabel": "模拟结果", - "xpack.watcher.sections.watchEdit.json.simulateResultsTabTitle": "模拟结果", - "xpack.watcher.sections.watchEdit.json.simulateTabLabel": "模拟", - "xpack.watcher.sections.watchEdit.json.simulateTabTitle": "模拟监视", - "xpack.watcher.sections.watchEdit.json.simulateWatchButtonLabel": "模拟监视", - "xpack.watcher.sections.watchEdit.json.simulationOutputLabel": "模拟输出:", - "xpack.watcher.sections.watchEdit.json.watchErrorsWarning.confirmSaveWatch": "保存监视", - "xpack.watcher.sections.watchEdit.threshold.matchingFollowingConditionTitle": "匹配以下条件", "xpack.watcher.sections.watchEdit.threshold.saveButtonLabel": "保存", "xpack.watcher.sections.watchEdit.threshold.enterOneOrMoreIndicesValidationMessage": "输入一个或多个索引", "xpack.watcher.sections.watchEdit.threshold.intervalSizeIsRequiredValidationMessage": "“时间间隔大小”必填", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.description": "ID “{watchId}{watchNameMessageFragment}” 的监视已存在。确定要覆盖?", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.descriptionFragmentText": "(名称:“{existingWatchName}”)", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.overwriteWatchButtonLabel": "覆盖监视", - "xpack.watcher.sections.watchEdit.threshold.saveSuccessNotificationText": "已保存“{watchDisplayName}”", - "xpack.watcher.sections.watchEdit.titleBar.cancelButtonLabel": "取消", - "xpack.watcher.sections.watchEdit.titleBar.deleteButtonLabel": "删除", - "xpack.watcher.sections.watchEdit.titleBar.deleteButtonTooltip": "删除监视", - "xpack.watcher.sections.watchEdit.titleBar.newWatchTitle": "新建监视", - "xpack.watcher.sections.watchEdit.titleBar.saveButtonLabel": "保存", - "xpack.watcher.sections.watchEdit.titlePanel.associatedTimeFieldIsMissedInIndexQueryValidationMessage": "您的索引查询没有关联的时间字段", - "xpack.watcher.sections.watchEdit.titlePanel.createNewTypeOfWatchTitle": "创建新的 {typeName}", - "xpack.watcher.sections.watchEdit.titlePanel.enterOneOrMoreIndicesValidationMessage": "输入一个或多个索引", "xpack.watcher.sections.watchEdit.titlePanel.howToBroadenSearchQueryDescription": "使用 * 拓宽您的搜索查询", "xpack.watcher.sections.watchEdit.titlePanel.indicesToQueryLabel": "要查询的索引", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeIsRequiredValidationMessage": "“时间间隔大小”必填", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeMinimumDurationValidationMessage": " 最小持续时间为 {minSize}{minUnit}", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeNegativeNumberValidationMessage": "时间间隔大小不能为负数", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeUnitIsRequiredValidationMessage": "需要时间间隔大小", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeValidNumberValidationMessage": "时间间隔大小必须为有效数值", - "xpack.watcher.sections.watchEdit.titlePanel.queryDoesNotMatchAnyValidIndicesValidationMessage": "您的索引查询不匹配任何有效索引", - "xpack.watcher.sections.watchEdit.titlePanel.timeFieldIsRequiredValidationText": "需要时间字段", "xpack.watcher.sections.watchEdit.titlePanel.timeFieldLabel": "时间字段", "xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel": "选择字段", "xpack.watcher.sections.watchEdit.titlePanel.watchIntervalLabel": "运行监视的频率", - "xpack.watcher.sections.watchEdit.titlePanel.watchNameIsRequiredValidationMessage": "“名称”必填", "xpack.watcher.sections.watchEdit.titlePanel.watchNameLabel": "名称", - "xpack.watcher.sections.watchEdit.titlePanel.watchNamePlaceholder": "我的阈值监视", - "xpack.watcher.sections.watchEdit.watchActionModeTable.actionColumnLabel": "操作", - "xpack.watcher.sections.watchEdit.watchActionModeTable.modeColumnLabel": "模式", - "xpack.watcher.sections.watchEdit.watchActionModeTable.typeColumnLabel": "类型", - "xpack.watcher.sections.watchEdit.watchExecuteSummary.simulationStatusLabel": "模拟状态:", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.actionHeaderCellLabel": "操作", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.reasonHeaderCellLabel": "原因", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.stateHeaderCellLabel": "状态", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.typeHeaderCellLabel": "类型", - "xpack.watcher.sections.watchHistoryItem.executionOutputLabel": "执行输出:", - "xpack.watcher.sections.watchHistoryItem.watchSummary.executionStatusLabel": "执行状态:", "xpack.watcher.sections.watchList.createAdvancedWatchButtonLabel": "创建高级监视", "xpack.watcher.sections.watchList.createThresholdAlertButtonLabel": "创建阈值告警", "xpack.watcher.sections.watchList.deleteWatchButtonLabel": "删除", @@ -8017,43 +7909,12 @@ "xpack.watcher.sections.watchList.managementSection.watchesDisplayName": "监视", "xpack.watcher.sections.watchList.watchTable.menuEditButtonTitle": "编辑", "xpack.watcher.server.checkLicense.licenseExpiredTextMessage": "您不能使用 {watcher},因为您的 {licenseType} 许可证已过期", - "xpack.watcher.sortableColumn.sortAscendingAriaLabel": "升序排序 {field}", - "xpack.watcher.sortableColumn.sortDescendingAriaLabel": "降序排序 {field}", - "xpack.watcher.thresholdPreviewChart.dataDoesNotExistTextMessage": "您的索引和条件未返回任何数据", - "xpack.watcher.thresholdWatchExpression.aggField.itemDescription": "/", - "xpack.watcher.thresholdWatchExpression.aggField.selectFieldTextMessage": "选择字段", - "xpack.watcher.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "请选择字段。", - "xpack.watcher.thresholdWatchExpression.aggType.itemDescription": "当", - "xpack.watcher.thresholdWatchExpression.aggType.requiredTypeValidationMessage": "请选择聚合类型。", - "xpack.watcher.thresholdWatchExpression.aggType.selectFieldDropdownPlaceholder": "选择字段……", "xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel": "高于", "xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel": "低于", "xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage": "请解决如下表达式中的错误。", - "xpack.watcher.thresholdWatchExpression.groupBy.groupedItemDescription": "分组依据", - "xpack.watcher.thresholdWatchExpression.groupBy.itemDescription": "依据", - "xpack.watcher.thresholdWatchExpression.groupBy.requiredFieldValidationMessage": "请选择字段。", - "xpack.watcher.thresholdWatchExpression.groupBy.requiredValueValidationMessage": "需要值。", - "xpack.watcher.thresholdWatchExpression.groupBy.selectFieldDropdownPlaceholder": "选择字段……", - "xpack.watcher.thresholdWatchExpression.groupBy.valueMustBeGraterThanZeroValidationMessage": "值必须大于 0。", - "xpack.watcher.thresholdWatchExpression.groupBy.valueMustBeValidNumberValidationMessage": "值必须为有效数值。", "xpack.watcher.thresholdWatchExpression.groupByLabel.allDocumentsLabel": "所有文档", "xpack.watcher.thresholdWatchExpression.groupByLabel.topLabel": "顶部", "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueIsRequiredValidationMessage": "需要值。", - "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueMustBeValidNumberValidationMessage": "值必须为有效数值。", - "xpack.watcher.thresholdWatchExpression.timeUnits.dayPluralLabel": "天", - "xpack.watcher.thresholdWatchExpression.timeUnits.daySingularLabel": "天", - "xpack.watcher.thresholdWatchExpression.timeUnits.hourPluralLabel": "小时", - "xpack.watcher.thresholdWatchExpression.timeUnits.hourSingularLabel": "小时", - "xpack.watcher.thresholdWatchExpression.timeUnits.minutePluralLabel": "分钟", - "xpack.watcher.thresholdWatchExpression.timeUnits.minuteSingularLabel": "分钟", - "xpack.watcher.thresholdWatchExpression.timeUnits.secondPluralLabel": "秒", - "xpack.watcher.thresholdWatchExpression.timeUnits.secondSingularLabel": "秒", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationIsTooShortValidationMessage": "窗口持续时间过短。允许的最小值为 {minimumSize}{minimumUnit}。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeIsRequiredValidationMessage": "“窗口持续时间大小”必填。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeMustBePositiveNumberValidationMessage": "窗口持续时间大小不能为负数。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeMustBeValidNumberValidationMessage": "窗口持续时间大小必须为有效数值。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationUnitIsRequiredValidationMessage": "“窗口持续时间单位”必填。", - "xpack.watcher.thresholdWatchExpression.timeWindow.itemDescription": "过去", "xpack.watcher.timeUnits.dayPluralLabel": "天", "xpack.watcher.timeUnits.daySingularLabel": "天", "xpack.watcher.timeUnits.hourPluralLabel": "小时", @@ -8062,22 +7923,6 @@ "xpack.watcher.timeUnits.minuteSingularLabel": "分钟", "xpack.watcher.timeUnits.secondPluralLabel": "秒", "xpack.watcher.timeUnits.secondSingularLabel": "秒", - "xpack.watcher.toolBarSelectedCountText": "已选", - "xpack.watcher.watchActions.email.bodyIsRequiredValidationMessage": "“正文”必填。", - "xpack.watcher.watchActions.email.bodyLabel": "正文", - "xpack.watcher.watchActions.email.emailAddressIsRequiredValidationMessage": "“收件人电子邮件地址”必填。", - "xpack.watcher.watchActions.email.emailAddressLabel": "收件人电子邮件地址", - "xpack.watcher.watchActions.email.subjectIsRequiredValidationMessage": "“主题”必填。", - "xpack.watcher.watchActions.email.subjectLabel": "主题", - "xpack.watcher.watchActions.errorInActionValidationMessage": "此操作中有错误,在可以保存之前,需要解决这些错误。", - "xpack.watcher.watchActions.logging.logTextIsRequiredValidationMessage": "“日志文本”必填。", - "xpack.watcher.watchActions.logging.logTextLabel": "日志文本", - "xpack.watcher.watchActions.removeActionButtonLabel": "删除 {actionTypeName} 操作", - "xpack.watcher.watchActions.slack.messageIsRequiredValidationMessage": "“消息”必填。", - "xpack.watcher.watchActions.slack.messageLabel": "消息", - "xpack.watcher.watchActions.slack.recipientIsRequiredValidationMessage": "“收件人”必填。", - "xpack.watcher.watchActions.slack.recipientLabel": "收件人", - "xpack.watcher.watchActionsTitle": "满足后将执行 {watchActionsCount, plural, one{# 个操作} other {# 个操作}}", "xpack.watcher.watcherDescription": "通过创建、管理和监测警报来检测数据中的更改。" } } \ No newline at end of file diff --git a/x-pack/plugins/watcher/plugin_definition.js b/x-pack/plugins/watcher/plugin_definition.js index 269170b845c39d..a03341edb6f6e3 100644 --- a/x-pack/plugins/watcher/plugin_definition.js +++ b/x-pack/plugins/watcher/plugin_definition.js @@ -21,14 +21,8 @@ export const pluginDefinition = { publicDir: resolve(__dirname, 'public'), require: ['kibana', 'elasticsearch', 'xpack_main'], uiExports: { - managementSections: [ - 'plugins/watcher/sections/watch_detail', - 'plugins/watcher/sections/watch_edit', - 'plugins/watcher/sections/watch_list', - 'plugins/watcher/sections/watch_history_item', - ], - styleSheetPaths: resolve(__dirname, 'public/index.scss'), - home: ['plugins/watcher/register_feature'] + managementSections: ['plugins/watcher'], + home: ['plugins/watcher/register_feature'], }, init: function (server) { registerLicenseChecker(server); @@ -40,5 +34,5 @@ export const pluginDefinition = { registerSettingsRoutes(server); registerWatchesRoutes(server); registerWatchRoutes(server); - } + }, }; diff --git a/x-pack/plugins/watcher/public/app.html b/x-pack/plugins/watcher/public/app.html new file mode 100644 index 00000000000000..8c7c3eb946aefc --- /dev/null +++ b/x-pack/plugins/watcher/public/app.html @@ -0,0 +1,3 @@ + +
+
\ No newline at end of file diff --git a/x-pack/plugins/watcher/public/app.js b/x-pack/plugins/watcher/public/app.js new file mode 100644 index 00000000000000..66d98eb2354328 --- /dev/null +++ b/x-pack/plugins/watcher/public/app.js @@ -0,0 +1,59 @@ +/* + * 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 React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { HashRouter, Switch, Route, Redirect } from 'react-router-dom'; +import { WatchStatus } from './sections/watch_status/watch_status'; +import { WatchEdit } from './sections/watch_edit/components/watch_edit'; +import { WatchList } from './sections/watch_list/components/watch_list'; +import { registerRouter } from './lib/navigation'; +import { BASE_PATH } from './constants'; + +class ShareRouter extends Component { + static contextTypes = { + router: PropTypes.shape({ + history: PropTypes.shape({ + push: PropTypes.func.isRequired, + createHref: PropTypes.func.isRequired + }).isRequired + }).isRequired + } + constructor(...args) { + super(...args); + this.registerRouter(); + } + + registerRouter() { + // Share the router with the app without requiring React or context. + const { router } = this.context; + registerRouter(router); + } + + render() { + return this.props.children; + } +} +export const App = () => { + return ( + + + + + + ); +}; + +// Export this so we can test it with a different router. +export const AppWithoutRouter = () => ( + + + + + + + +); diff --git a/x-pack/plugins/watcher/public/components/action_state_icon/action_state_icon.html b/x-pack/plugins/watcher/public/components/action_state_icon/action_state_icon.html deleted file mode 100644 index 67c8c703aecf0d..00000000000000 --- a/x-pack/plugins/watcher/public/components/action_state_icon/action_state_icon.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
-
-
-
-
-
diff --git a/x-pack/plugins/watcher/public/components/action_state_icon/action_state_icon.js b/x-pack/plugins/watcher/public/components/action_state_icon/action_state_icon.js deleted file mode 100644 index bbf46b95a81966..00000000000000 --- a/x-pack/plugins/watcher/public/components/action_state_icon/action_state_icon.js +++ /dev/null @@ -1,29 +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 { uiModules } from 'ui/modules'; -import template from './action_state_icon.html'; -import { ACTION_STATES } from 'plugins/watcher/../common/constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('actionStateIcon', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - actionStatus: '=' - }, - bindToController: true, - controllerAs: 'actionStateIcon', - controller: class ActionStateIconController { - constructor() { - this.ACTION_STATES = ACTION_STATES; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/action_type_select/_action_type_select.scss b/x-pack/plugins/watcher/public/components/action_type_select/_action_type_select.scss deleted file mode 100644 index a500e13811aedc..00000000000000 --- a/x-pack/plugins/watcher/public/components/action_type_select/_action_type_select.scss +++ /dev/null @@ -1,44 +0,0 @@ -.actionTypeChoice { - display: flex; -} - -.actionTypeChoice--disabled { - opacity: 0.5; - cursor: default; -} - -.actionTypeIcon { - flex: 1 0 auto; - margin-right: $euiSizeM; - font-size: $euiFontSizeL; -} - -.actionTypeDescription { - flex: 1 1 auto; - width: 100%; -} - -.watchActionsActionType { - flex: 1 1 auto; - width: 450px; - - .ui-select-bootstrap > .ui-select-choices { - min-width: 350px; - } - - // Bootstrap ui select tweaks - .ui-select-bootstrap .ui-select-choices-row>span { - padding: $euiSizeM $euiSizeL; - } - - .ui-select-match .btn { - border-color: $euiColorPrimary; - color: $euiColorPrimary; - } - - .ui-select-placeholder { - color: $euiColorPrimary !important; - padding-right: $euiSizeM; - } - -} diff --git a/x-pack/plugins/watcher/public/components/action_type_select/_index.scss b/x-pack/plugins/watcher/public/components/action_type_select/_index.scss deleted file mode 100644 index d9033433513879..00000000000000 --- a/x-pack/plugins/watcher/public/components/action_type_select/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'action_type_select'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/action_type_select/action_type_select.html b/x-pack/plugins/watcher/public/components/action_type_select/action_type_select.html deleted file mode 100644 index dd8df4dba383a5..00000000000000 --- a/x-pack/plugins/watcher/public/components/action_type_select/action_type_select.html +++ /dev/null @@ -1,34 +0,0 @@ - - - {{$select.selected.typeName}} - - -
-
- -
-
-
-
- - -
-
-
-
-
diff --git a/x-pack/plugins/watcher/public/components/action_type_select/action_type_select.js b/x-pack/plugins/watcher/public/components/action_type_select/action_type_select.js deleted file mode 100644 index bfe48dbb872ab0..00000000000000 --- a/x-pack/plugins/watcher/public/components/action_type_select/action_type_select.js +++ /dev/null @@ -1,72 +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 { map } from 'lodash'; -import { uiModules } from 'ui/modules'; -import template from './action_type_select.html'; -import 'ui/angular_ui_select'; -import { Action } from 'plugins/watcher/models/action'; -import 'plugins/watcher/services/settings'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('actionTypeSelect', function ($injector) { - const watcherSettingsService = $injector.get('xpackWatcherSettingsService'); - - return { - restrict: 'E', - template: template, - scope: { - onChange: '=' - }, - controllerAs: 'actionTypeSelect', - bindToController: true, - controller: class ActionTypeSelectController { - constructor() { - this.selectedItem = { value: null }; - - this.loadActionTypes() - .then(actionTypes => { - this.actionTypes = actionTypes.filter((actionType) => { - // 'Action' is the default action type. If an action has the default then it's - // not fully implemented and shouldn't be presented to the user. - return actionType.typeName !== 'Action'; - }); - }); - } - - loadActionTypes() { - const allActionTypes = Action.getActionTypes(); - - // load the configuration settings to determine which actions are enabled - return watcherSettingsService.getSettings() - .then(settings => { - const result = map(allActionTypes, ({ typeName, iconClass, selectMessage }, type) => { - const isEnabled = settings.actionTypes[type].enabled; - - return { - type, - typeName, - iconClass, - selectMessage, - isEnabled - }; - }); - - return result; - }); - } - - onSelect(actionType) { - this.selectedItem = { value: null }; - - if (actionType.isEnabled) { - this.onChange(actionType.type); - } - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/chart_tooltip/_chart_tooltip.scss b/x-pack/plugins/watcher/public/components/chart_tooltip/_chart_tooltip.scss deleted file mode 100644 index f2eb9246dfd3ea..00000000000000 --- a/x-pack/plugins/watcher/public/components/chart_tooltip/_chart_tooltip.scss +++ /dev/null @@ -1,21 +0,0 @@ -.chartTooltip { - // The following rules adapted from ui/vislib/styles/_tooltip.less - line-height: 1.1; - font-size: $euiFontSize; - font-weight: normal; - background-color: $euiColorDarkestShade; - color: $euiColorEmptyShade; - border-radius: $euiBorderRadius; - position: fixed; - z-index: 120; - word-wrap: break-word; - max-width: 40%; - overflow: hidden; - pointer-events: none; - margin: $euiSizeS; - padding: $euiSizeXS; -} - -.chartTooltip__label { - font-weight: bold; -} diff --git a/x-pack/plugins/watcher/public/components/chart_tooltip/_index.scss b/x-pack/plugins/watcher/public/components/chart_tooltip/_index.scss deleted file mode 100644 index 11b36a0a21001e..00000000000000 --- a/x-pack/plugins/watcher/public/components/chart_tooltip/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'chart_tooltip'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/chart_tooltip/chart_tooltip.html b/x-pack/plugins/watcher/public/components/chart_tooltip/chart_tooltip.html deleted file mode 100644 index e0f163a2212dfa..00000000000000 --- a/x-pack/plugins/watcher/public/components/chart_tooltip/chart_tooltip.html +++ /dev/null @@ -1,5 +0,0 @@ -
diff --git a/x-pack/plugins/watcher/public/components/chart_tooltip/chart_tooltip.js b/x-pack/plugins/watcher/public/components/chart_tooltip/chart_tooltip.js deleted file mode 100644 index 7102567fb3cbf4..00000000000000 --- a/x-pack/plugins/watcher/public/components/chart_tooltip/chart_tooltip.js +++ /dev/null @@ -1,70 +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 { get } from 'lodash'; -import { uiModules } from 'ui/modules'; -import template from './chart_tooltip.html'; - -function calculateTooltipPosition(pointPosition, plotPosition, tooltipWidth, tooltipHeight) { - - const tooltipPosition = { - top: get(pointPosition, 'top'), - left: get(pointPosition, 'left') - }; - - const tooltipPositionBottom = pointPosition.top + tooltipHeight; - const isTooltipBeyondPlotBottom = tooltipPositionBottom > get(plotPosition, 'bottom'); - if (isTooltipBeyondPlotBottom) { - tooltipPosition.top -= tooltipHeight; - } - - const tooltipPositionRight = pointPosition.left + tooltipWidth; - const isTooltipBeyondPlotRight = tooltipPositionRight > get(plotPosition, 'right'); - if (isTooltipBeyondPlotRight) { - tooltipPosition.left -= tooltipWidth; - } - - return tooltipPosition; -} - -const app = uiModules.get('xpack/watcher'); - -app.directive('chartTooltip', function () { - return { - restrict: 'E', - replace: true, - transclude: true, - template: template, - scope: { - pointPosition: '=', - plotPosition: '=' - }, - controllerAs: 'chartTooltip', - bindToController: true, - link: ($scope, element) => { - $scope.$watchGroup([ - 'chartTooltip.pointPosition', - 'chartTooltip.plotPosition' - ], () => { - // Calculate tooltip position. This is especially necessary to make sure the tooltip - // stays within the bounds of the chart. - const pointPosition = $scope.chartTooltip.pointPosition; - const plotPosition = $scope.chartTooltip.plotPosition; - - const tooltipMargin = parseInt(element.css('margin')); // assumption: value is in px - const tooltipWidth = element[0].scrollWidth + (2 * tooltipMargin); - const tooltipHeight = element[0].scrollHeight + (2 * tooltipMargin); - - const tooltipPosition = calculateTooltipPosition(pointPosition, plotPosition, tooltipWidth, tooltipHeight); - $scope.chartTooltip.style = tooltipPosition; - }); - }, - controller: class ChartTooltipController { - constructor() { - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/chart_tooltip/index.js b/x-pack/plugins/watcher/public/components/chart_tooltip/index.js deleted file mode 100644 index 09d3ddf9ae8d63..00000000000000 --- a/x-pack/plugins/watcher/public/components/chart_tooltip/index.js +++ /dev/null @@ -1,7 +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 './chart_tooltip'; diff --git a/x-pack/plugins/watcher/public/components/duration_select/_duration_select.scss b/x-pack/plugins/watcher/public/components/duration_select/_duration_select.scss deleted file mode 100644 index 74d564f01cb6cf..00000000000000 --- a/x-pack/plugins/watcher/public/components/duration_select/_duration_select.scss +++ /dev/null @@ -1,11 +0,0 @@ -.durationSelect { - white-space: nowrap; -} - -.durationSelectSize { - display: inline-block; -} - -.durationSelectUnit { - display: inline-block; -} diff --git a/x-pack/plugins/watcher/public/components/duration_select/_index.scss b/x-pack/plugins/watcher/public/components/duration_select/_index.scss deleted file mode 100644 index 281271ef395198..00000000000000 --- a/x-pack/plugins/watcher/public/components/duration_select/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'duration_select'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/duration_select/duration_select.html b/x-pack/plugins/watcher/public/components/duration_select/duration_select.html deleted file mode 100644 index a19123cf17f43f..00000000000000 --- a/x-pack/plugins/watcher/public/components/duration_select/duration_select.html +++ /dev/null @@ -1,24 +0,0 @@ -
- - - -
diff --git a/x-pack/plugins/watcher/public/components/duration_select/duration_select.js b/x-pack/plugins/watcher/public/components/duration_select/duration_select.js deleted file mode 100644 index 9fab3504ac6381..00000000000000 --- a/x-pack/plugins/watcher/public/components/duration_select/duration_select.js +++ /dev/null @@ -1,76 +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 'ui/fancy_forms'; -import { uiModules } from 'ui/modules'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import { TIME_UNITS } from 'plugins/watcher/constants'; -import template from './duration_select.html'; -import moment from 'moment'; -import 'plugins/watcher/services/html_id_generator'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('durationSelect', function ($injector) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - require: '^form', - scope: { - durationId: '@', - minimumUnit: '=', - minimumSize: '=', - unit: '=', - size: '=', - describedBy: '@', - }, - template, - replace: true, - controllerAs: 'durationSelect', - bindToController: true, - link: function ($scope, $element, $attrs, $ctrl) { - $scope.durationSelect.form = $ctrl; - }, - controller: class DurationSelectController extends InitAfterBindingsWorkaround { - initAfterBindings($scope) { - this.timeUnits = TIME_UNITS; - this.makeId = htmlIdGeneratorFactory.create(['durationSelect', this.durationId]); - - $scope.$watchMulti([ - 'durationSelect.minimumSize', - 'durationSelect.minimumUnit' - ], ([minimumSize, minimumUnit]) => { - this.minimumDuration = moment.duration(Number(minimumSize), minimumUnit).asMilliseconds(); - this.checkValidity(); - }); - - $scope.$watchMulti([ - `durationSelect.size`, - `durationSelect.unit` - ], ([size, unit]) => { - this.duration = moment.duration(Number(size), unit).asMilliseconds(); - this.checkValidity(); - }); - } - - checkValidity = () => { - const isValid = this.duration >= this.minimumDuration; - const sizeName = this.makeId('size'); - const unitName = this.makeId('unit'); - - if (this.form[sizeName]) { - this.form[sizeName].$setTouched(true); - this.form[sizeName].$setValidity('minimumDuration', isValid); - } - - if (this.form[unitName]) { - this.form[unitName].$setTouched(true); - this.form[unitName].$setValidity('minimumDuration', isValid); - } - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/errors_display_modal/errors_display_modal.html b/x-pack/plugins/watcher/public/components/errors_display_modal/errors_display_modal.html deleted file mode 100644 index 3d4f25e7abc7d8..00000000000000 --- a/x-pack/plugins/watcher/public/components/errors_display_modal/errors_display_modal.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
-

{{ vm.title }}

-
-
-
    -
  • {{ error.message }}
  • -
-
-
- -
-
\ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/errors_display_modal/errors_display_modal.js b/x-pack/plugins/watcher/public/components/errors_display_modal/errors_display_modal.js deleted file mode 100644 index 1e17774193ec40..00000000000000 --- a/x-pack/plugins/watcher/public/components/errors_display_modal/errors_display_modal.js +++ /dev/null @@ -1,18 +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 { uiModules } from 'ui/modules'; - -const app = uiModules.get('xpack/watcher'); - -app.controller('WatcherErrorsDisplayController', function WatcherErrorsDisplayController($scope, $modalInstance, params) { - this.title = params.title; - this.errors = params.errors; - - this.close = function close() { - $modalInstance.close(); - }; -}); diff --git a/x-pack/plugins/watcher/public/components/errors_display_modal/index.js b/x-pack/plugins/watcher/public/components/errors_display_modal/index.js deleted file mode 100644 index 07daabc6bf1850..00000000000000 --- a/x-pack/plugins/watcher/public/components/errors_display_modal/index.js +++ /dev/null @@ -1,7 +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 './errors_display_modal'; diff --git a/x-pack/plugins/watcher/public/components/expression_builder/_index.scss b/x-pack/plugins/watcher/public/components/expression_builder/_index.scss deleted file mode 100644 index 20d5f2db36e734..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'components/expression_popover/expression_popover'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/expression_item.html b/x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/expression_item.html deleted file mode 100644 index 062374903fa956..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/expression_item.html +++ /dev/null @@ -1,26 +0,0 @@ -
- - - -
-
-
diff --git a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/expression_item.js b/x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/expression_item.js deleted file mode 100644 index 895a26280dbeb1..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/expression_item.js +++ /dev/null @@ -1,98 +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 'ui/fancy_forms'; -import { uiModules } from 'ui/modules'; -import { keyMap } from 'ui/utils/key_map'; -import template from './expression_item.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('expressionItem', function ($injector) { - const $document = $injector.get('$document'); - const $timeout = $injector.get('$timeout'); - - return { - restrict: 'E', - replace: true, - require: '^expressionBuilder', - transclude: true, - template: template, - scope: { - itemId: '@', - description: '=', - value: '=', - isOpen: '=', - isVisible: '=', - onOpen: '=', - onClose: '=', - isValid: '=', - isDirty: '=', - form: '=' - }, - bindToController: true, - controllerAs: 'expressionItem', - link: function ($scope, $el) { - $scope.expressionItem.$firstInput = $el.find('[data-id="expressionItemPopoverContent"]').find(':input:first'); - const $button = $el.find('[data-id="expressionItemButton"]'); - - const buttonFocusOrClick = () => { - $scope.$apply(() => { - $scope.expressionItem.onPopoverOpen(); - }); - }; - - const documentClick = (event) => { - if ($el.find(event.originalEvent.target).length === 0) { - $scope.$apply(() => { - $scope.expressionItem.onPopoverClose(); - }); - } - }; - - const documentKeydown = (event) => { - if ($scope.expressionItem.isOpen && keyMap[event.keyCode] === 'escape') { - $scope.$apply(() => { - $scope.expressionItem.onPopoverClose(); - }); - } - }; - - $button.on('focus', buttonFocusOrClick); - $button.on('click', buttonFocusOrClick); - $document.on('click', documentClick); - $document.on('keydown', documentKeydown); - $scope.$on('$destroy', () => { - $button.off('focus', buttonFocusOrClick); - $button.off('click', buttonFocusOrClick); - $document.off('click', documentClick); - $document.off('keydown', documentKeydown); - }); - }, - controller: class ExpressionItemController { - constructor($scope) { - $scope.$watch('expressionItem.isOpen', (isOpen, wasOpen) => { - if (isOpen) { - $timeout(() => { - $scope.expressionItem.$firstInput.focus(); - }); - } else if (wasOpen) { - this.form.$setTouched(true); - this.form.$setDirty(true); - } - }); - } - - onPopoverClose = () => { - this.onClose(this.itemId); - } - - onPopoverOpen = () => { - this.onOpen(this.itemId); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/index.js b/x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/index.js deleted file mode 100644 index 1891cc2c532441..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_item/index.js +++ /dev/null @@ -1,7 +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 './expression_item'; diff --git a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/_expression_popover.scss b/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/_expression_popover.scss deleted file mode 100644 index 9bf4389f438d45..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/_expression_popover.scss +++ /dev/null @@ -1,3 +0,0 @@ -.watcherExpressionPopover { - z-index: 1; // Addresses conflict between the expression popover and the visualization -} diff --git a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/expression_popover.html b/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/expression_popover.html deleted file mode 100644 index 2dea0d67c3a9ae..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/expression_popover.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
- {{ expressionPopover.popoverTitle }} -
- -
-
diff --git a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/expression_popover.js b/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/expression_popover.js deleted file mode 100644 index e5488b8be132ea..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/expression_popover.js +++ /dev/null @@ -1,28 +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 { uiModules } from 'ui/modules'; -import template from './expression_popover.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('expressionPopover', function () { - return { - restrict: 'E', - replace: true, - require: '^expressionItem', - transclude: true, - template: template, - scope: { - popoverTitle: '=' - }, - bindToController: true, - controllerAs: 'expressionPopover', - controller: class ExpressionPopoverController { - constructor() { } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/index.js b/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/index.js deleted file mode 100644 index 21cfc6ecb4bfe7..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/components/expression_popover/index.js +++ /dev/null @@ -1,7 +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 './expression_popover'; diff --git a/x-pack/plugins/watcher/public/components/expression_builder/expression_builder.html b/x-pack/plugins/watcher/public/components/expression_builder/expression_builder.html deleted file mode 100644 index f3c04c234b85f0..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/expression_builder.html +++ /dev/null @@ -1,3 +0,0 @@ -
diff --git a/x-pack/plugins/watcher/public/components/expression_builder/expression_builder.js b/x-pack/plugins/watcher/public/components/expression_builder/expression_builder.js deleted file mode 100644 index da1c3dcbc9943c..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/expression_builder.js +++ /dev/null @@ -1,28 +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 { uiModules } from 'ui/modules'; -import template from './expression_builder.html'; -import './components/expression_item'; -import './components/expression_popover'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('expressionBuilder', function () { - return { - restrict: 'E', - replace: true, - transclude: true, - template: template, - scope: {}, - bindToController: true, - controllerAs: 'expressionBuilder', - controller: class BuilderController { - constructor() { - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/expression_builder/index.js b/x-pack/plugins/watcher/public/components/expression_builder/index.js deleted file mode 100644 index cbfc2e75ed0aa8..00000000000000 --- a/x-pack/plugins/watcher/public/components/expression_builder/index.js +++ /dev/null @@ -1,7 +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 './expression_builder'; diff --git a/x-pack/plugins/watcher/public/components/flot_chart/_flot_chart.scss b/x-pack/plugins/watcher/public/components/flot_chart/_flot_chart.scss deleted file mode 100644 index db1100510a39b7..00000000000000 --- a/x-pack/plugins/watcher/public/components/flot_chart/_flot_chart.scss +++ /dev/null @@ -1,3 +0,0 @@ -.flotChart { - height: 100%; -} \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/flot_chart/_index.scss b/x-pack/plugins/watcher/public/components/flot_chart/_index.scss deleted file mode 100644 index 518b820c3e5b34..00000000000000 --- a/x-pack/plugins/watcher/public/components/flot_chart/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'flot_chart'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/flot_chart/constants.js b/x-pack/plugins/watcher/public/components/flot_chart/constants.js deleted file mode 100644 index 9ca626d4c29f21..00000000000000 --- a/x-pack/plugins/watcher/public/components/flot_chart/constants.js +++ /dev/null @@ -1,7 +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. - */ - -export const FLOT_EVENT_PLOT_HOVER_DEBOUNCE_MS = 20; // milliseconds diff --git a/x-pack/plugins/watcher/public/components/flot_chart/flot_chart.html b/x-pack/plugins/watcher/public/components/flot_chart/flot_chart.html deleted file mode 100644 index 73580867892ea6..00000000000000 --- a/x-pack/plugins/watcher/public/components/flot_chart/flot_chart.html +++ /dev/null @@ -1 +0,0 @@ -
\ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/flot_chart/flot_chart.js b/x-pack/plugins/watcher/public/components/flot_chart/flot_chart.js deleted file mode 100644 index be35b82dce61b5..00000000000000 --- a/x-pack/plugins/watcher/public/components/flot_chart/flot_chart.js +++ /dev/null @@ -1,65 +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 { isFunction, debounce } from 'lodash'; -import { uiModules } from 'ui/modules'; -import template from './flot_chart.html'; -import $ from 'plugins/xpack_main/jquery_flot'; -import { FLOT_EVENT_PLOT_HOVER_DEBOUNCE_MS } from './constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('flotChart', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - - // See https://github.com/flot/flot/blob/master/API.md#data-format - data: '=', - - // See https://github.com/flot/flot/blob/master/API.md#plot-options - options: '=', - - // Search for "plothover" in https://github.com/flot/flot/blob/master/API.md - onPlotHover: '=', - - }, - controllerAs: 'flotChart', - bindToController: true, - link: ($scope, element) => { - $scope.flotChart.container = element; - }, - controller: class FlotChartController { - constructor($scope) { - - $scope.$watchMulti([ - 'flotChart.data', - 'flotChart.options' - ], ([data, options]) => { - this.plot = $.plot(this.container, data, options); - }); - - $scope.$watch('flotChart.onPlotHover', (onPlotHover) => { - this.container.unbind('plothover'); - - if (isFunction(onPlotHover)) { - this.container.bind('plothover', debounce((...params) => { - // We use $scope.$apply to tell Angular to trigger a digest whenever - // the supplied event handler function is called - $scope.$apply(() => onPlotHover(...params, this.plot)); - }, FLOT_EVENT_PLOT_HOVER_DEBOUNCE_MS)); - } - }); - - $scope.$on('$destroy', () => { - this.container.unbind('plothover'); - }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/flot_chart/index.js b/x-pack/plugins/watcher/public/components/flot_chart/index.js deleted file mode 100644 index c95a866839fab2..00000000000000 --- a/x-pack/plugins/watcher/public/components/flot_chart/index.js +++ /dev/null @@ -1,7 +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 './flot_chart'; diff --git a/x-pack/plugins/watcher/public/components/forbidden_message/forbidden_message.html b/x-pack/plugins/watcher/public/components/forbidden_message/forbidden_message.html deleted file mode 100644 index 72ee8d9a397c1e..00000000000000 --- a/x-pack/plugins/watcher/public/components/forbidden_message/forbidden_message.html +++ /dev/null @@ -1,17 +0,0 @@ -
-
- - -
- -
-
-
-
diff --git a/x-pack/plugins/watcher/public/components/forbidden_message/forbidden_message.js b/x-pack/plugins/watcher/public/components/forbidden_message/forbidden_message.js deleted file mode 100644 index 7101885ef7dfbe..00000000000000 --- a/x-pack/plugins/watcher/public/components/forbidden_message/forbidden_message.js +++ /dev/null @@ -1,25 +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 { uiModules } from 'ui/modules'; -import template from './forbidden_message.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('forbiddenMessage', function () { - return { - restrict: 'E', - replace: true, - template: template, - transclude: true, - scope: {}, - controllerAs: 'forbiddenMessage', - bindToController: true, - controller: class ForbiddenMessageController { - constructor() { } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/forbidden_message/index.js b/x-pack/plugins/watcher/public/components/forbidden_message/index.js deleted file mode 100644 index 21819994ef8dd1..00000000000000 --- a/x-pack/plugins/watcher/public/components/forbidden_message/index.js +++ /dev/null @@ -1,7 +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 './forbidden_message'; diff --git a/x-pack/plugins/watcher/public/components/index_select/_index.scss b/x-pack/plugins/watcher/public/components/index_select/_index.scss deleted file mode 100644 index 6e2d69436be144..00000000000000 --- a/x-pack/plugins/watcher/public/components/index_select/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'index_select'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/index_select/_index_select.scss b/x-pack/plugins/watcher/public/components/index_select/_index_select.scss deleted file mode 100644 index 2b17cd39253133..00000000000000 --- a/x-pack/plugins/watcher/public/components/index_select/_index_select.scss +++ /dev/null @@ -1,55 +0,0 @@ -@mixin indexSelectSubText() { - color: $euiColorDarkShade; - font-size: $euiFontSizeXS; - padding: $euiSizeXS $euiSizeL; - line-height: $euiLineHeight; -} - -.indexSelectNoChoice { - @include indexSelectSubText; -} - -/** - * 1. To ensure a smooth UX, prevent the dropdown from hiding while we async search for more results - * 2. ui-select likes to clear the result set out of the UI when you enter - * a new search query which can cause a jarring UX. This helps mitigate - * that by at least providing something in the box so it's not empty - */ -.indexSelect--activeSearch { - .ui-select-dropdown.ng-hide { - display: block !important; /* 1 */ - - &:after { - content: 'Choose...'; /* 2 */ - @include indexSelectSubText; /* 2 */ - } - } -} - -/** - * 1. By default, hide this until the user searches or there are results - */ -.indexSelect--noSearch { - .ui-select-no-choice { - display: none !important; /* 1 */ - } -} - -/** - * 1. Provide a loading indicator to the user - */ -.indexSelect--fetchingWithNoIndices { - .ui-select-choices:before { - content: 'Loading...'; /* 1 */ - margin-left: $euiSize; /* 1 */ - font-style: italic; /* 1 */ - color: $euiColorDarkShade; /* 1 */ - } -} - -/** - * 1. Ensure that an invalid ui-select shows a red border - */ -.ui-select-multiple.ui-select-bootstrap.ng-invalid { - border-color: $euiColorDanger !important; /* 1 */ -} diff --git a/x-pack/plugins/watcher/public/components/index_select/index.js b/x-pack/plugins/watcher/public/components/index_select/index.js deleted file mode 100644 index a9230cb82c7d17..00000000000000 --- a/x-pack/plugins/watcher/public/components/index_select/index.js +++ /dev/null @@ -1,7 +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 './index_select'; diff --git a/x-pack/plugins/watcher/public/components/index_select/index_select.html b/x-pack/plugins/watcher/public/components/index_select/index_select.html deleted file mode 100644 index 1720af6d41f051..00000000000000 --- a/x-pack/plugins/watcher/public/components/index_select/index_select.html +++ /dev/null @@ -1,46 +0,0 @@ -
- - - {{$item.indexName}} - - -
-
-
-
-
-
-
- -

-
-
-
diff --git a/x-pack/plugins/watcher/public/components/index_select/index_select.js b/x-pack/plugins/watcher/public/components/index_select/index_select.js deleted file mode 100644 index f81d1ce65dd2dc..00000000000000 --- a/x-pack/plugins/watcher/public/components/index_select/index_select.js +++ /dev/null @@ -1,207 +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 { sortBy, pluck, map, startsWith, endsWith } from 'lodash'; -import 'plugins/watcher/services/indices'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import { uiModules } from 'ui/modules'; -import template from './index_select.html'; - -function mapIndex(indexName, isFromIndexPattern = false, isUserEntered = false) { - return { indexName, isFromIndexPattern, isUserEntered }; -} - -function collapseIndices(allIndices, allIndexPatterns) { - const indices = map(allIndices, indexName => mapIndex(indexName, false)); - const indexPatterns = map(allIndexPatterns, indexName => mapIndex(indexName, true)); - indices.push(...indexPatterns); - return indices; -} - -const INDICES_FROM_INDEX_PATTERNS_HEADER_COPY = 'Based on your index patterns'; -const INDICES_FOR_CREATION_HEADER_COPY = 'Choose...'; -const INDICES_FROM_INDICES_HEADER_COPY = 'Based on your indices and aliases'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('indexSelect', ($injector) => { - const indicesService = $injector.get('xpackWatcherIndicesService'); - const indexPatternsService = $injector.get('indexPatterns'); - const $timeout = $injector.get('$timeout'); - - return { - restrict: 'E', - template, - scope: { - index: '=', - onChange: '=', - onTouched: '=' - }, - controllerAs: 'indexSelect', - bindToController: true, - link: ($scope, $ele) => { - const $searchBox = $ele.find('input[type="search"]'); - $scope.indexSelect.$searchBox = $searchBox; - - $searchBox.attr('id', 'indexSelectSearchBox'); - }, - controller: class IndexSelectController extends InitAfterBindingsWorkaround { - initAfterBindings($scope) { - this.$scope = $scope; - this.indexPattern = undefined; - this.fetchingWithNoIndices = true; - this.selectedIndices = []; - this.fetchedIndices = []; - - if (Boolean(this.index)) { - if (Array.isArray(this.index)) { - this.selectedIndices.push(...this.index.map(mapIndex)); - } else { - this.selectedIndices.push(mapIndex(this.index)); - } - } - - if (this.onTouched) { - $timeout(() => { - this.$searchBox.on('blur', () => { - $scope.$apply(this.onTouched); - }); - }); - $scope.$on('$destroy', () => { - this.$searchBox.off('blur'); - }); - } - - $scope.$watch('indexSelect.index', () => { - $timeout(() => { - // Hack that forces the ui-select to resize itself - $scope.$$childHead.$select.sizeSearchInput(); - }, 100); - }); - } - - get hasIndexPattern() { - return Boolean(this.indexPattern); - } - - /** - * This method powers the `on-select` and `on-remove` within ui-select - * to handle when an index is added or removed from the list - */ - onIndicesChanged() { - const indexNames = pluck(this.selectedIndices, 'indexName'); - this.onChange(indexNames); - } - - /** - * This method powers the `tagging` within ui-select to format - * a search query that has no results into a valid result so it - * can be selected - * - * @param {object} item - */ - onNewItem(unmatchedIndexPattern) { - return mapIndex(unmatchedIndexPattern); - } - - /** - * This method powers the `group-by` within ui-select to group - * our indices array based on the source - * - * @param {object} index - */ - groupIndices(index) { - if (index.isFromIndexPattern) { - return INDICES_FROM_INDEX_PATTERNS_HEADER_COPY; - } - - if (index.isUserEntered) { - return INDICES_FOR_CREATION_HEADER_COPY; - } - - return INDICES_FROM_INDICES_HEADER_COPY; - } - - /** - * This method powers the `group-filter` within ui-select to allow - * us to sort the grouped object so we can control which group - * is shown first - * - * @param {object} grouped - */ - sortGroupedIndices(grouped) { - return sortBy(grouped, group => group.name); - } - - /** - * This method powers the `uis-open-close` within ui-select to ensure - * we reset the search state once the dropdown is closed. The default - * behavior of ui-select is to clear the input field when the dropdown - * is closed and if we fail to reset the search state at the same time - * it will lead to a poor UX. - * - * @param {bool} isOpen - */ - onDropdownToggled(isOpen) { - if (!isOpen) { - this.reset(); - } - } - - /** - * Resets the search state so we have no stored query or results - */ - reset() { - this.fetchedIndices.length = 0; - this.indexPattern = undefined; - } - - /** - * This powers the `refresh` within ui-select which is called - * as a way to async fetch results based on the typed in query - * - * @param {string} indexPattern - */ - fetchIndices(indexPattern) { - if (!Boolean(indexPattern)) { - this.reset(); - return; - } - - // Store this so we can display it if there are no matches - this.indexPattern = indexPattern; - - let pattern = indexPattern; - - // Use wildcards religiously to ensure partial matches - if (!endsWith(pattern, '*')) { - pattern += '*'; - } - if (!startsWith(pattern, '*')) { - pattern = '*' + pattern; - } - - const promises = [ - indicesService.getMatchingIndices(pattern), - indexPatternsService.getTitles() - ]; - - if (this.fetchedIndices.length === 0) { - this.fetchingWithNoIndices = true; - } - - Promise.all(promises) - .then(([allIndices, allIndexPatterns]) => { - const indices = collapseIndices(allIndices, allIndexPatterns); - this.fetchedIndices = sortBy(indices, 'indexName'); - this.fetchedIndices.push(mapIndex(this.indexPattern, false, true)); - this.fetchingWithNoIndices = false; - this.$scope.$apply(); - }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/json_editor/_index.scss b/x-pack/plugins/watcher/public/components/json_editor/_index.scss deleted file mode 100644 index a00b67f580531e..00000000000000 --- a/x-pack/plugins/watcher/public/components/json_editor/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'json_editor'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/json_editor/_json_editor.scss b/x-pack/plugins/watcher/public/components/json_editor/_json_editor.scss deleted file mode 100644 index 4176467cc2f60c..00000000000000 --- a/x-pack/plugins/watcher/public/components/json_editor/_json_editor.scss +++ /dev/null @@ -1,3 +0,0 @@ -.json-editor { - border: 1px solid $euiColorLightShade; -} diff --git a/x-pack/plugins/watcher/public/components/json_editor/index.js b/x-pack/plugins/watcher/public/components/json_editor/index.js deleted file mode 100644 index 2e2a91f13a085b..00000000000000 --- a/x-pack/plugins/watcher/public/components/json_editor/index.js +++ /dev/null @@ -1,7 +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 './json_editor'; diff --git a/x-pack/plugins/watcher/public/components/json_editor/json_editor.html b/x-pack/plugins/watcher/public/components/json_editor/json_editor.html deleted file mode 100644 index bef39e5e74c5c9..00000000000000 --- a/x-pack/plugins/watcher/public/components/json_editor/json_editor.html +++ /dev/null @@ -1,12 +0,0 @@ -
-
-
diff --git a/x-pack/plugins/watcher/public/components/json_editor/json_editor.js b/x-pack/plugins/watcher/public/components/json_editor/json_editor.js deleted file mode 100644 index e392a96f2e70a7..00000000000000 --- a/x-pack/plugins/watcher/public/components/json_editor/json_editor.js +++ /dev/null @@ -1,48 +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 { uiModules } from 'ui/modules'; -import template from './json_editor.html'; -import 'plugins/watcher/directives/json_input'; -import 'ace'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('jsonEditor', function () { - return { - restrict: 'E', - template: template, - replace: true, - scope: { - json: '=', - onChange: '=', - onValid: '=', - onInvalid: '=' - }, - bindToController: true, - controllerAs: 'jsonEditor', - controller: class JsonEditorController { - constructor($scope) { - $scope.aceLoaded = (editor) => { - this.editor = editor; - editor.$blockScrolling = Infinity; - }; - - $scope.$watch('jsonEditor.form.$valid', () => { - if (this.form.$invalid) { - this.onInvalid(); - } else { - this.onValid(); - } - }); - - $scope.$watch('jsonEditor.json', () => { - this.onChange(this.json); - }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/index.js b/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/index.js deleted file mode 100644 index 2b38a644a7e9f0..00000000000000 --- a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/index.js +++ /dev/null @@ -1,7 +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 './kbn_tab'; diff --git a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/kbn_tab.html b/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/kbn_tab.html deleted file mode 100644 index cfd76bae499671..00000000000000 --- a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/kbn_tab.html +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/kbn_tab.js b/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/kbn_tab.js deleted file mode 100644 index 4b2cffefb661a9..00000000000000 --- a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tab/kbn_tab.js +++ /dev/null @@ -1,30 +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 { uiModules } from 'ui/modules'; -import template from './kbn_tab.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('kbnTab', function () { - return { - require: '^^kbnTabs', - restrict: 'E', - transclude: true, - replace: true, - template: template, - scope: { - tabId: '@', - title: '@' - }, - controllerAs: 'kbnTab', - bindToController: true, - controller: class KbnTabController {}, - link: function ($scope, $ele, attrs, kbnTabs) { - $scope.kbnTabs = kbnTabs; - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/index.js b/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/index.js deleted file mode 100644 index 2ed8988b5323ed..00000000000000 --- a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/index.js +++ /dev/null @@ -1,7 +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 './kbn_tabs'; diff --git a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/kbn_tabs.html b/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/kbn_tabs.html deleted file mode 100644 index 34a2ff3cd3a39a..00000000000000 --- a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/kbn_tabs.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/kbn_tabs.js b/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/kbn_tabs.js deleted file mode 100644 index d9f70ad6b9abd5..00000000000000 --- a/x-pack/plugins/watcher/public/components/kbn_tabs/components/kbn_tabs/kbn_tabs.js +++ /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 { uiModules } from 'ui/modules'; -import template from './kbn_tabs.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('kbnTabs', function () { - return { - restrict: 'E', - replace: true, - transclude: true, - template: template, - scope: { - selectedTabId: '=', - onTabSelect: '=' - }, - controllerAs: 'kbnTabs', - bindToController: true, - controller: class KbnTabsController { - constructor() {} - - isTabSelected = (tabId) => { - return this.selectedTabId === tabId; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/kbn_tabs/index.js b/x-pack/plugins/watcher/public/components/kbn_tabs/index.js deleted file mode 100644 index 30953c4759223c..00000000000000 --- a/x-pack/plugins/watcher/public/components/kbn_tabs/index.js +++ /dev/null @@ -1,8 +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 './components/kbn_tabs'; -import './components/kbn_tab'; diff --git a/x-pack/plugins/watcher/public/components/panel_pager/_index.scss b/x-pack/plugins/watcher/public/components/panel_pager/_index.scss deleted file mode 100644 index 326d073b77e91f..00000000000000 --- a/x-pack/plugins/watcher/public/components/panel_pager/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'panel_pager'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/panel_pager/_panel_pager.scss b/x-pack/plugins/watcher/public/components/panel_pager/_panel_pager.scss deleted file mode 100644 index 98ec7854ce8684..00000000000000 --- a/x-pack/plugins/watcher/public/components/panel_pager/_panel_pager.scss +++ /dev/null @@ -1,31 +0,0 @@ -.kuiPanelPager { - height: 0px; -} - -.panelPagerPrevious, -.panelPagerNext { - position: relative; - top: -155px; - border-radius: 20px; - border: 1px solid $euiColorLightShade; - background-color: $euiColorEmptyShade; - height: 40px; - width: 40px; -} - -.panelPagerPrevious { - left: -20px; -} - -.panelPagerPrevious__icon { - margin-left: 2px; // positions the icon horizontally inside the circle container -} - -.panelPagerNext { - float: right; - right: -20px; -} - -.panelPagerNext__icon { - margin-left: 4px; // positions the icon horizontally inside the circle container -} diff --git a/x-pack/plugins/watcher/public/components/panel_pager/index.js b/x-pack/plugins/watcher/public/components/panel_pager/index.js deleted file mode 100644 index 3c81126a170331..00000000000000 --- a/x-pack/plugins/watcher/public/components/panel_pager/index.js +++ /dev/null @@ -1,7 +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 './panel_pager'; diff --git a/x-pack/plugins/watcher/public/components/panel_pager/panel_pager.html b/x-pack/plugins/watcher/public/components/panel_pager/panel_pager.html deleted file mode 100644 index 8a70fa2135028c..00000000000000 --- a/x-pack/plugins/watcher/public/components/panel_pager/panel_pager.html +++ /dev/null @@ -1,28 +0,0 @@ -
- - -
diff --git a/x-pack/plugins/watcher/public/components/panel_pager/panel_pager.js b/x-pack/plugins/watcher/public/components/panel_pager/panel_pager.js deleted file mode 100644 index 0511147a6ce1ae..00000000000000 --- a/x-pack/plugins/watcher/public/components/panel_pager/panel_pager.js +++ /dev/null @@ -1,28 +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 { uiModules } from 'ui/modules'; -import template from './panel_pager.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('panelPager', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - onNextPage: '=', - onPreviousPage: '=' - }, - bindToController: true, - controllerAs: 'panelPager', - controller: class PanelPagerController { - constructor() { - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/threshold_preview_chart/_index.scss b/x-pack/plugins/watcher/public/components/threshold_preview_chart/_index.scss deleted file mode 100644 index 4661c99f48e40a..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_preview_chart/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'threshold_preview_chart'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/threshold_preview_chart/_threshold_preview_chart.scss b/x-pack/plugins/watcher/public/components/threshold_preview_chart/_threshold_preview_chart.scss deleted file mode 100644 index 87c3c0f3fd3281..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_preview_chart/_threshold_preview_chart.scss +++ /dev/null @@ -1,15 +0,0 @@ -.thresholdPreviewChart { - height: 100%; - position: relative; - - .flot-tick-label { - color: $euiColorDarkShade; - } -} - -.thresholdPreviewChartNoData { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} diff --git a/x-pack/plugins/watcher/public/components/threshold_preview_chart/index.js b/x-pack/plugins/watcher/public/components/threshold_preview_chart/index.js deleted file mode 100644 index fbf2da1b515262..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_preview_chart/index.js +++ /dev/null @@ -1,7 +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 './threshold_preview_chart'; diff --git a/x-pack/plugins/watcher/public/components/threshold_preview_chart/threshold_preview_chart.html b/x-pack/plugins/watcher/public/components/threshold_preview_chart/threshold_preview_chart.html deleted file mode 100644 index b31dda450d5ad5..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_preview_chart/threshold_preview_chart.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

- - -
{{ thresholdPreviewChart.dataPointTooltip.yValue }}
-
{{ thresholdPreviewChart.formatAsMoment(thresholdPreviewChart.dataPointTooltip.xValue) | moment }}
-
-
diff --git a/x-pack/plugins/watcher/public/components/threshold_preview_chart/threshold_preview_chart.js b/x-pack/plugins/watcher/public/components/threshold_preview_chart/threshold_preview_chart.js deleted file mode 100644 index 9d598dc14e3c4b..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_preview_chart/threshold_preview_chart.js +++ /dev/null @@ -1,188 +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 moment from 'moment'; -import 'ui/filters/moment'; -import { isNumber, forEach, merge } from 'lodash'; -import { uiModules } from 'ui/modules'; -import { TimeBuckets } from 'ui/time_buckets'; -import 'plugins/watcher/components/flot_chart'; -import 'plugins/watcher/components/chart_tooltip'; -import template from './threshold_preview_chart.html'; -import { COLORS, LINE_WIDTHS, MARGINS } from './constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('thresholdPreviewChart', function ($injector) { - const config = $injector.get('config'); - - moment.tz.setDefault(config.get('dateFormat:tz')); - - return { - restrict: 'E', - replace: true, - template: template, - scope: { - // A single series (array) of (x, y) points - // - Format: [ [ xTimestamp1, yValue1 ], [ xTimestamp2, yValue2 ], ... ] - // - Units for timestamp values (xTimestamp1, xTimestamp2, etc.) are ms-since-epoch - // - Timestamp values are assumed to be in UTC timezone - // - Series array must be sorted in ascending order of timestamp values - series: '=', - - startDate: '=', - endDate: '=', - - // A single y-axis value - thresholdValue: '=' - }, - controllerAs: 'thresholdPreviewChart', - bindToController: true, - controller: class ThresholdPreviewChartController { - constructor($scope) { - - this.options = { - colors: [ COLORS.SERIES_LINE ], - grid: { - aboveData: true, - borderColor: COLORS.CHART_BORDER, - borderWidth: { top: 0, right: 0, bottom: 2, left: 2 }, - hoverable: true, - labelMargin: MARGINS.AXES_LABELS - }, - series: { - lines: { - show: true, - fill: true, - fillColor: COLORS.AREA_FILL - } - }, - yaxis: { - tickLength: 0 - } - }; - - $scope.$watch('thresholdPreviewChart.series', (series) => { - this.data = [ series ]; - - const timeBuckets = new TimeBuckets(); - timeBuckets.setBounds({ - min: this.startDate, - max: this.endDate - }); - const momentFormat = timeBuckets.getScaledDateFormat(); - - const options = { - xaxis: { - mode: 'time', - min: this.startDate, - max: this.endDate, - tickFormatter: (val) => moment(val).format(momentFormat) - } - }; - - this.updateOptions(options); - }); - - $scope.$watch('thresholdPreviewChart.thresholdValue', (thresholdValue) => { - const parsedThreshold = Number.parseFloat(thresholdValue); - - const options = { - grid: { - markings: [] - } - }; - - if (isNumber(parsedThreshold)) { - const thresholdLine = { - yaxis: { - from: parsedThreshold, - to: parsedThreshold - }, - color: COLORS.THRESHOLD_LINE, - lineWidth: LINE_WIDTHS.THRESHOLD_LINE - }; - - options.grid.markings.push(thresholdLine); - } - - this.updateOptions(options); - }); - } - - updateOptions = (options) => { - const yAxisRange = this.buildYAxisRange(); - this.options = merge({}, this.options, options, yAxisRange); - } - - buildYAxisRange = () => { - const parsedThreshold = Number.parseFloat(this.thresholdValue); - const series = this.data[0]; - - if (!series || !isNumber(parsedThreshold)) { - return { - yaxis: { - min: null, - max: null - } - }; - } - - const VALUE_INDEX = 1; - const options = { - yaxis: { - min: Number.POSITIVE_INFINITY, - max: Number.NEGATIVE_INFINITY - } - }; - - forEach(series, seriesItem => { - const itemValue = seriesItem[VALUE_INDEX]; - - if (itemValue !== null) { - options.yaxis.min = Math.min(options.yaxis.min, itemValue, parsedThreshold); - options.yaxis.max = Math.max(options.yaxis.max, itemValue, parsedThreshold); - } - }); - - return options; - } - - onPlotHover = (event, pos, item, plot) => { - if (!Boolean(item)) { - this.dataPointTooltip = undefined; - return; - } - - const plotLeft = plot.offset().left - window.pageXOffset; - const plotTop = plot.offset().top - window.pageYOffset; - - this.dataPointTooltip = { - plotPosition: { - left: plotLeft, - top: plotTop, - right: plotLeft + plot.width(), - bottom: plotTop + plot.height() - }, - pointPosition: { - left: item.pageX - window.pageXOffset, - top: item.pageY - window.pageYOffset - }, - xValue: item.datapoint[0], - yValue: item.datapoint[1] - }; - } - - get isDataExists() { - return Boolean(this.series); - } - - formatAsMoment = (msSinceEpoch) => { - return moment(msSinceEpoch); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/_index.scss b/x-pack/plugins/watcher/public/components/threshold_watch_expression/_index.scss deleted file mode 100644 index b71b8e81da8226..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'threshold_watch_expression'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/_threshold_watch_expression.scss b/x-pack/plugins/watcher/public/components/threshold_watch_expression/_threshold_watch_expression.scss deleted file mode 100644 index 8f6a7d4604b99c..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/_threshold_watch_expression.scss +++ /dev/null @@ -1,17 +0,0 @@ -.watcherNumberInput { - width: 85px; -} - -.thresholdWatchExpression { - .kuiExpressionButton { - margin-right: $euiSizeM; - } - - .kuiExpressionButton-isError { - border-color: $euiColorDanger; - } - - .kuiInputNote { - margin-top: $euiSizeS * -1; - } -} \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/index.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/index.js deleted file mode 100644 index 0d5da15d8b7843..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/index.js +++ /dev/null @@ -1,7 +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 './threshold_watch_agg_field'; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/threshold_watch_agg_field.html b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/threshold_watch_agg_field.html deleted file mode 100644 index a103fbecfc5881..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/threshold_watch_agg_field.html +++ /dev/null @@ -1,37 +0,0 @@ - -
-
- -
-
diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/threshold_watch_agg_field.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/threshold_watch_agg_field.js deleted file mode 100644 index 756ca66f47fcd8..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_field/threshold_watch_agg_field.js +++ /dev/null @@ -1,67 +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 { uiModules } from 'ui/modules'; -import template from './threshold_watch_agg_field.html'; -import { ThresholdWatchBaseController } from '../threshold_watch_base'; -import 'plugins/watcher/services/html_id_generator'; -import 'plugins/watcher/components/xpack_aria_describes'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('thresholdWatchAggField', function ($injector, i18n) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - restrict: 'E', - template: template, - scope: { - itemId: '@', - aggFields: '=', - aggField: '=', - isOpen: '=', - isVisible: '=', - onOpen: '=', - onClose: '=', - onChange: '=', - onValid: '=', - onInvalid: '=', - onDirty: '=', - onPristine: '=' - }, - bindToController: true, - controllerAs: 'thresholdWatchAggField', - controller: class ThresholdWatchAggFieldController extends ThresholdWatchBaseController { - initAfterBindings($scope) { - this.makeId = htmlIdGeneratorFactory.create(); - - $scope.$watch('thresholdWatchAggField.aggField', this.onChange); - - $scope.$watch('thresholdWatchAggField.form.$valid', this.checkValidity); - $scope.$watch('thresholdWatchAggField.form.$dirty', this.checkDirty); - - $scope.$watch('thresholdWatchAggField.isVisible', (isVisible, wasVisible) => { - this.checkValidity(); - if (!isVisible && wasVisible) { - this.resetForm(); - this.checkDirty(); - } - }); - - this.itemDescription = i18n('xpack.watcher.thresholdWatchExpression.aggField.itemDescription', { - defaultMessage: 'Of', - }); - } - - get itemValue() { - return this.aggField ? this.aggField.name : i18n( - 'xpack.watcher.thresholdWatchExpression.aggField.selectFieldTextMessage', { - defaultMessage: 'select a field', - }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/index.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/index.js deleted file mode 100644 index 9e649d220f4059..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/index.js +++ /dev/null @@ -1,7 +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 './threshold_watch_agg_type'; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/threshold_watch_agg_type.html b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/threshold_watch_agg_type.html deleted file mode 100644 index 981fcf12aa131c..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/threshold_watch_agg_type.html +++ /dev/null @@ -1,31 +0,0 @@ - -
-
- -
-
diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/threshold_watch_agg_type.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/threshold_watch_agg_type.js deleted file mode 100644 index 135c3341ee527f..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_agg_type/threshold_watch_agg_type.js +++ /dev/null @@ -1,56 +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 { uiModules } from 'ui/modules'; -import template from './threshold_watch_agg_type.html'; -import { ThresholdWatchBaseController } from '../threshold_watch_base'; -import 'plugins/watcher/services/html_id_generator'; -import 'plugins/watcher/components/xpack_aria_describes'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('thresholdWatchAggType', function ($injector, i18n) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - restrict: 'E', - template: template, - scope: { - itemId: '@', - aggTypes: '=', - aggType: '=', - isOpen: '=', - isVisible: '=', - onOpen: '=', - onClose: '=', - onChange: '=', - onValid: '=', - onInvalid: '=', - onDirty: '=', - onPristine: '=' - }, - bindToController: true, - controllerAs: 'thresholdWatchAggType', - controller: class ThresholdWatchAggTypeController extends ThresholdWatchBaseController { - initAfterBindings($scope) { - this.makeId = htmlIdGeneratorFactory.create(); - - $scope.$watch('thresholdWatchAggType.aggType', this.onChange); - - $scope.$watch('thresholdWatchAggType.form.$valid', this.checkValidity); - $scope.$watch('thresholdWatchAggType.form.$dirty', this.checkDirty); - - this.itemDescription = i18n('xpack.watcher.thresholdWatchExpression.aggType.itemDescription', { - defaultMessage: 'When', - }); - } - - get itemValue() { - return this.aggType ? this.aggType.label : ''; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_base/index.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_base/index.js deleted file mode 100644 index fa9e5839361839..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_base/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { ThresholdWatchBaseController } from './threshold_watch_base'; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_base/threshold_watch_base.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_base/threshold_watch_base.js deleted file mode 100644 index dfa3f5f01f5305..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_base/threshold_watch_base.js +++ /dev/null @@ -1,57 +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 { InitAfterBindingsWorkaround } from 'ui/compat'; -import { forEach, size } from 'lodash'; - -export class ThresholdWatchBaseController extends InitAfterBindingsWorkaround { - checkValidity = () => { - if (this.isValid()) { - this.onValid(this.itemId); - } else { - this.onInvalid(this.itemId); - } - } - - checkDirty = () => { - if (this.form.$dirty) { - this.onDirty(this.itemId); - } else { - this.onPristine(this.itemId); - } - } - - resetForm = () => { - forEach(this.form, (control) => { - if (Boolean(control) && typeof control.$setViewValue === 'function') { - control.$setViewValue(undefined); - } - }); - - this.form.$setPristine(); - this.form.$setUntouched(); - } - - isValid = () => { - return !(this.form.$invalid); - } - - isDirty = () => { - return this.form.$dirty; - } - - isValidationMessageVisible = (fieldName, errorType, showIfOtherErrors = true) => { - let showMessage = this.form[fieldName] && - (this.form[fieldName].$touched || this.form[fieldName].$dirty) && - this.form[fieldName].$error[errorType]; - - if (showMessage && !showIfOtherErrors && size(this.form[fieldName].$error) > 1) { - showMessage = false; - } - - return showMessage; - } -} diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/index.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/index.js deleted file mode 100644 index 581da9ac494779..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/index.js +++ /dev/null @@ -1,7 +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 './threshold_watch_group_by'; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/threshold_watch_group_by.html b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/threshold_watch_group_by.html deleted file mode 100644 index b978b55e58f66b..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/threshold_watch_group_by.html +++ /dev/null @@ -1,77 +0,0 @@ - -
-
-
-
-
- - - -
-
diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/threshold_watch_group_by.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/threshold_watch_group_by.js deleted file mode 100644 index e89a23070dd269..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_group_by/threshold_watch_group_by.js +++ /dev/null @@ -1,85 +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 { uiModules } from 'ui/modules'; -import template from './threshold_watch_group_by.html'; -import { ThresholdWatchBaseController } from '../threshold_watch_base'; -import 'plugins/watcher/services/html_id_generator'; -import 'plugins/watcher/components/xpack_aria_describes'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('thresholdWatchGroupBy', function ($injector, i18n) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - restrict: 'E', - template: template, - scope: { - itemId: '@', - groupByTypes: '=', - groupByType: '=', - termSize: '=', - termFields: '=', - termField: '=', - isOpen: '=', - isVisible: '=', - onOpen: '=', - onClose: '=', - onChange: '=', - onValid: '=', - onInvalid: '=', - onDirty: '=', - onPristine: '=' - }, - bindToController: true, - controllerAs: 'thresholdWatchGroupBy', - controller: class ThresholdWatchGroupByController extends ThresholdWatchBaseController { - initAfterBindings($scope) { - this.makeId = htmlIdGeneratorFactory.create(); - - $scope.$watchMulti([ - 'thresholdWatchGroupBy.groupByType', - 'thresholdWatchGroupBy.termSize', - 'thresholdWatchGroupBy.termField' - ], this.onChange); - - $scope.$watch('thresholdWatchGroupBy.groupByType', () => { - this.resetForm(); - this.checkDirty(); - }); - - $scope.$watch('thresholdWatchGroupBy.form.$valid', this.checkValidity); - $scope.$watch('thresholdWatchGroupBy.form.$dirty', this.checkDirty); - } - - get itemDescription() { - const itemDescription = (this.groupByType && this.groupByType.sizeRequired) - ? i18n('xpack.watcher.thresholdWatchExpression.groupBy.groupedItemDescription', { - defaultMessage: 'Grouped over', - }) - : i18n('xpack.watcher.thresholdWatchExpression.groupBy.itemDescription', { - defaultMessage: 'Over', - }); - - return itemDescription; - } - - get itemValue() { - if (!this.groupByType) { - return; - } - - const sizeRequired = this.groupByType.sizeRequired; - const typeLabel = this.groupByType.label; - const sizeLabel = (sizeRequired && this.termSize) ? ` ${this.termSize}` : ''; - const fieldLabel = (sizeRequired && this.termField) ? ` '${this.termField.name}'` : ''; - - return `${typeLabel}${sizeLabel}${fieldLabel}`; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/index.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/index.js deleted file mode 100644 index c19db9116509c5..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/index.js +++ /dev/null @@ -1,7 +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 './threshold_watch_threshold_level'; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/threshold_watch_threshold_level.html b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/threshold_watch_threshold_level.html deleted file mode 100644 index 76be0699679e0e..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/threshold_watch_threshold_level.html +++ /dev/null @@ -1,45 +0,0 @@ - -
-
-
- - -
-
diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/threshold_watch_threshold_level.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/threshold_watch_threshold_level.js deleted file mode 100644 index bbb52b7c9723b6..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_threshold_level/threshold_watch_threshold_level.js +++ /dev/null @@ -1,59 +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 { uiModules } from 'ui/modules'; -import template from './threshold_watch_threshold_level.html'; -import { ThresholdWatchBaseController } from '../threshold_watch_base'; -const app = uiModules.get('xpack/watcher'); -import 'plugins/watcher/services/html_id_generator'; -import 'plugins/watcher/components/xpack_aria_describes'; - -app.directive('thresholdWatchThresholdLevel', function ($injector) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - restrict: 'E', - template: template, - scope: { - itemId: '@', - comparators: '=', - thresholdComparator: '=', - threshold: '=', - isOpen: '=', - isVisible: '=', - onOpen: '=', - onClose: '=', - onChange: '=', - onValid: '=', - onInvalid: '=', - onDirty: '=', - onPristine: '=' - }, - bindToController: true, - controllerAs: 'thresholdWatchThresholdLevel', - controller: class ThresholdWatchThresholdLevelController extends ThresholdWatchBaseController { - initAfterBindings($scope) { - this.makeId = htmlIdGeneratorFactory.create(); - - $scope.$watchMulti([ - 'thresholdWatchThresholdLevel.thresholdComparator', - 'thresholdWatchThresholdLevel.threshold' - ], this.onChange); - - $scope.$watch('thresholdWatchThresholdLevel.form.$valid', this.checkValidity); - $scope.$watch('thresholdWatchThresholdLevel.form.$dirty', this.checkDirty); - } - - get itemDescription() { - return this.thresholdComparator ? this.thresholdComparator.label : ''; - } - - get itemValue() { - return this.threshold; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/index.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/index.js deleted file mode 100644 index b642cad45924f6..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/index.js +++ /dev/null @@ -1,7 +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 './threshold_watch_time_window'; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/threshold_watch_time_window.html b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/threshold_watch_time_window.html deleted file mode 100644 index 9972b9f5fc5ec1..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/threshold_watch_time_window.html +++ /dev/null @@ -1,63 +0,0 @@ - -
-
-
-
-
-
- -
-
diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/threshold_watch_time_window.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/threshold_watch_time_window.js deleted file mode 100644 index 1004318c06e3ad..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/components/threshold_watch_time_window/threshold_watch_time_window.js +++ /dev/null @@ -1,76 +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 { uiModules } from 'ui/modules'; -import template from './threshold_watch_time_window.html'; -import { TIME_UNITS } from 'plugins/watcher/../common/constants'; -import { getTimeUnitsLabel } from 'plugins/watcher/lib/get_time_units_label'; -import { ThresholdWatchBaseController } from '../threshold_watch_base'; -import 'plugins/watcher/components/duration_select'; -import 'plugins/watcher/services/html_id_generator'; -import 'plugins/watcher/components/xpack_aria_describes'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('thresholdWatchTimeWindow', function ($injector, i18n) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - restrict: 'E', - template: template, - scope: { - itemId: '@', - timeWindowUnits: '=', - timeWindowSize: '=', - timeWindowUnit: '=', - isOpen: '=', - isVisible: '=', - onOpen: '=', - onClose: '=', - onChange: '=', - onValid: '=', - onInvalid: '=', - onDirty: '=', - onPristine: '=' - }, - bindToController: true, - controllerAs: 'thresholdWatchTimeWindow', - controller: class ThresholdWatchTimeWindowController extends ThresholdWatchBaseController { - initAfterBindings($scope) { - this.makeId = htmlIdGeneratorFactory.create(); - - this.timeWindowMinimumUnit = TIME_UNITS.SECOND; - this.timeWindowMinimumSize = 10; - - $scope.$watchMulti([ - 'thresholdWatchTimeWindow.timeWindowSize', - 'thresholdWatchTimeWindow.timeWindowUnit' - ], this.onChange); - - $scope.$watch('thresholdWatchTimeWindow.form.$valid', this.checkValidity); - $scope.$watch('thresholdWatchTimeWindow.form.$dirty', this.checkDirty); - } - - get itemDescription() { - return i18n('xpack.watcher.thresholdWatchExpression.timeWindow.itemDescription', { - defaultMessage: 'For the last', - }); - } - - get itemValue() { - const sizeLabel = !isNaN(this.timeWindowSize) - ? `${this.timeWindowSize} ` - : '0'; - - const unitLabel = Boolean(this.timeWindowUnit) - ? getTimeUnitsLabel(this.timeWindowUnit, this.timeWindowSize) - : ''; - - return `${sizeLabel} ${unitLabel}`; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/index.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/index.js deleted file mode 100644 index d7751c33ed7a63..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/index.js +++ /dev/null @@ -1,7 +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 './threshold_watch_expression'; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/agg_types.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/agg_types.js deleted file mode 100644 index e26f6f57c42ffa..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/agg_types.js +++ /dev/null @@ -1,39 +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 { AGG_TYPES } from 'plugins/watcher/../common/constants'; - -export const aggTypes = { - count: { - label: 'count()', - fieldRequired: false, - value: AGG_TYPES.COUNT - }, - average: { - label: 'average()', - fieldRequired: true, - validNormalizedTypes: ['number'], - value: AGG_TYPES.AVERAGE - }, - sum: { - label: 'sum()', - fieldRequired: true, - validNormalizedTypes: ['number'], - value: AGG_TYPES.SUM - }, - min: { - label: 'min()', - fieldRequired: true, - validNormalizedTypes: ['number', 'date'], - value: AGG_TYPES.MIN - }, - max: { - label: 'max()', - fieldRequired: true, - validNormalizedTypes: ['number', 'date'], - value: AGG_TYPES.MAX - } -}; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/comparators.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/comparators.js deleted file mode 100644 index 12e0cbd1694459..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/comparators.js +++ /dev/null @@ -1,24 +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 { i18n } from '@kbn/i18n'; - -import { COMPARATORS } from 'plugins/watcher/../common/constants'; - -export const comparators = { - 'above': { - label: i18n.translate('xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel', { - defaultMessage: 'Is above', - }), - value: COMPARATORS.GREATER_THAN - }, - 'below': { - label: i18n.translate('xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel', { - defaultMessage: 'Is below', - }), - value: COMPARATORS.LESS_THAN - } -}; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/group_by_types.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/group_by_types.js deleted file mode 100644 index 44e9f00fcebf40..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/group_by_types.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; - -export const groupByTypes = { - 'all': { - label: i18n.translate('xpack.watcher.thresholdWatchExpression.groupByLabel.allDocumentsLabel', { - defaultMessage: 'all documents', - }), - sizeRequired: false, - value: 'all', - validNormalizedTypes: [] - }, - 'top': { - label: i18n.translate('xpack.watcher.thresholdWatchExpression.groupByLabel.topLabel', { - defaultMessage: 'top', - }), - sizeRequired: true, - value: 'top', - validNormalizedTypes: ['number', 'date', 'keyword'] - } -}; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/time_units.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/time_units.js deleted file mode 100644 index 4048bc11813f85..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/lib/time_units.js +++ /dev/null @@ -1,46 +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 { i18n } from '@kbn/i18n'; - -export const timeUnits = { - 'second': { - labelPlural: i18n.translate('xpack.watcher.thresholdWatchExpression.timeUnits.secondPluralLabel', { - defaultMessage: 'seconds', - }), - labelSingular: i18n.translate('xpack.watcher.thresholdWatchExpression.timeUnits.secondSingularLabel', { - defaultMessage: 'second', - }), - value: 's' - }, - 'minute': { - labelPlural: i18n.translate('xpack.watcher.thresholdWatchExpression.timeUnits.minutePluralLabel', { - defaultMessage: 'minutes', - }), - labelSingular: i18n.translate('xpack.watcher.thresholdWatchExpression.timeUnits.minuteSingularLabel', { - defaultMessage: 'minute', - }), - value: 'm' - }, - 'hour': { - labelPlural: i18n.translate('xpack.watcher.thresholdWatchExpression.timeUnits.hourPluralLabel', { - defaultMessage: 'hours', - }), - labelSingular: i18n.translate('xpack.watcher.thresholdWatchExpression.timeUnits.hourSingularLabel', { - defaultMessage: 'hour', - }), - value: 'h' - }, - 'day': { - labelPlural: i18n.translate('xpack.watcher.thresholdWatchExpression.timeUnits.dayPluralLabel', { - defaultMessage: 'days', - }), - labelSingular: i18n.translate('xpack.watcher.thresholdWatchExpression.timeUnits.daySingularLabel', { - defaultMessage: 'day', - }), - value: 'd' - } -}; diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/threshold_watch_expression.html b/x-pack/plugins/watcher/public/components/threshold_watch_expression/threshold_watch_expression.html deleted file mode 100644 index e69d5edc9499a3..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/threshold_watch_expression.html +++ /dev/null @@ -1,89 +0,0 @@ - -
- - - - - - - - - - - -
diff --git a/x-pack/plugins/watcher/public/components/threshold_watch_expression/threshold_watch_expression.js b/x-pack/plugins/watcher/public/components/threshold_watch_expression/threshold_watch_expression.js deleted file mode 100644 index aefb61525a1627..00000000000000 --- a/x-pack/plugins/watcher/public/components/threshold_watch_expression/threshold_watch_expression.js +++ /dev/null @@ -1,228 +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 { find, filter, includes, forEach, every, some } from 'lodash'; -import { uiModules } from 'ui/modules'; -import template from './threshold_watch_expression.html'; -import './components/threshold_watch_agg_type'; -import './components/threshold_watch_agg_field'; -import './components/threshold_watch_group_by'; -import './components/threshold_watch_threshold_level'; -import './components/threshold_watch_time_window'; -import 'plugins/watcher/components/expression_builder'; -import { aggTypes } from './lib/agg_types'; -import { comparators } from './lib/comparators'; -import { groupByTypes } from './lib/group_by_types'; -import { TIME_UNITS } from 'plugins/watcher/constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('thresholdWatchExpression', function () { - - return { - restrict: 'E', - template: template, - scope: { - thresholdWatch: '=', - fields: '=', - onChange: '=', - onValid: '=', - onInvalid: '=', - onDirty: '=' - }, - bindToController: true, - controllerAs: 'thresholdWatchExpression', - controller: class ThresholdWatchExpressionController { - constructor($scope) { - this.items = { - 'agg-type': { isOpen: false, isVisible: true, isValid: true }, - 'agg-field': { isOpen: false, isVisible: false, isValid: true }, - 'group-by': { isOpen: false, isVisible: true, isValid: true }, - 'threshold-level': { isOpen: false, isVisible: true, isValid: true }, - 'time-window': { isOpen: false, isVisible: true, isValid: true } - }; - - this.aggTypes = aggTypes; - this.groupByTypes = groupByTypes; - this.comparators = comparators; - this.timeUnits = TIME_UNITS; - this.initialized = false; - this.dirty = false; - - $scope.$watchGroup([ - 'thresholdWatchExpression.thresholdWatch', - 'thresholdWatchExpression.fields' - ], ([thresholdWatch, fields]) => { - if (!thresholdWatch || !fields) { - return; - } - - this.aggType = find(this.aggTypes, { value: this.thresholdWatch.aggType }); - this.aggField = find(this.fields, { name: this.thresholdWatch.aggField }); - this.groupByType = this.thresholdWatch.termField ? this.groupByTypes.top : this.groupByTypes.all; - this.termSize = this.thresholdWatch.termSize; - this.termField = find(this.fields, { name: this.thresholdWatch.termField }); - this.threshold = this.thresholdWatch.threshold; - this.thresholdComparator = find(this.comparators, { value: this.thresholdWatch.thresholdComparator }); - this.timeWindowSize = this.thresholdWatch.timeWindowSize; - this.timeWindowUnit = this.thresholdWatch.timeWindowUnit; - - this.initialized = true; - }); - } - - onAggTypeChange = (aggType) => { - if (!this.initialized) { - return; - } - - this.aggType = aggType; - - if (aggType.fieldRequired) { - this.items['agg-field'].isVisible = true; - this.aggFields = filter( - this.fields, field => includes(aggType.validNormalizedTypes, field.normalizedType) - ); - // The selected aggField may no longer be in the new array of aggFields. If so, - // unset it via the handler, so additional business logic is fired. - if (!includes(this.aggFields, this.aggField)) { - this.onAggFieldChange(null); - } - } else { - this.items['agg-field'].isVisible = false; - this.onAggFieldChange(null); - } - - this.thresholdWatch.aggType = aggType ? aggType.value : null; - - this.onChange(this.thresholdWatch); - }; - - onAggFieldChange = (aggField) => { - if (!this.initialized) { - return; - } - - this.aggField = aggField; - this.thresholdWatch.aggField = aggField ? aggField.name : null; - - this.onChange(this.thresholdWatch); - } - - onGroupByChange = ([groupByType, termSize, termField], [oldGroupByType]) => { - if (!this.initialized) { - return; - } - - this.groupByType = groupByType; - this.termSize = termSize; - this.termField = termField; - - if (groupByType !== oldGroupByType) { - this.termFields = filter( - this.fields, field => includes(this.groupByType.validNormalizedTypes, field.normalizedType) - ); - - if (Boolean(oldGroupByType)) { - if (this.groupByType === this.groupByTypes.all) { - this.termSize = null; - this.termField = null; - } else { - this.termSize = this.thresholdWatch.DEFAULT_VALUES.TERM_SIZE; - } - } - } - - this.thresholdWatch.termSize = this.termSize; - this.thresholdWatch.termField = this.termField ? this.termField.name : null; - - this.onChange(this.thresholdWatch); - } - - onThresholdLevelChange = ([thresholdComparator, threshold]) => { - if (!this.initialized) { - return; - } - - this.thresholdComparator = thresholdComparator; - this.threshold = threshold; - - this.thresholdWatch.thresholdComparator = this.thresholdComparator.value; - this.thresholdWatch.threshold = this.threshold; - - this.onChange(this.thresholdWatch); - } - - onTimeWindowChange = ([timeWindowSize, timeWindowUnit]) => { - if (!this.initialized) { - return; - } - - this.timeWindowSize = timeWindowSize; - this.timeWindowUnit = timeWindowUnit; - - this.thresholdWatch.timeWindowSize = this.timeWindowSize; - this.thresholdWatch.timeWindowUnit = this.timeWindowUnit; - - this.onChange(this.thresholdWatch); - } - - isItemVisible = (itemId) => { - return this.items[itemId].isVisible; - } - - isItemOpen = (itemId) => { - return this.items[itemId].isOpen; - } - - onItemOpen = (itemId) => { - forEach(this.items, (item, id) => { - item.isOpen = (itemId === id); - }); - } - - onItemClose = (itemId) => { - this.items[itemId].isOpen = false; - } - - isExpressionValid = () => { - return every(this.items, item => item.isValid || !item.isVisible); - } - - showExpressionValidation = () => { - return some(this.items, item => !item.isValid && item.isVisible && item.isDirty); - } - - checkValidity = () => { - if (this.isExpressionValid()) { - this.onValid(); - } else { - this.onInvalid(); - } - } - - onItemValid = (itemId) => { - this.items[itemId].isValid = true; - - this.checkValidity(); - } - - onItemInvalid = (itemId) => { - this.items[itemId].isValid = false; - - this.checkValidity(); - } - - onItemDirty = (itemId) => { - this.items[itemId].isDirty = true; - } - - onItemPristine = (itemId) => { - this.items[itemId].isDirty = false; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/tool_bar_selected_count/index.js b/x-pack/plugins/watcher/public/components/tool_bar_selected_count/index.js deleted file mode 100644 index 1deb0b2d23559c..00000000000000 --- a/x-pack/plugins/watcher/public/components/tool_bar_selected_count/index.js +++ /dev/null @@ -1,7 +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 './tool_bar_selected_count'; diff --git a/x-pack/plugins/watcher/public/components/tool_bar_selected_count/tool_bar_selected_count.html b/x-pack/plugins/watcher/public/components/tool_bar_selected_count/tool_bar_selected_count.html deleted file mode 100644 index 94b385d759ecde..00000000000000 --- a/x-pack/plugins/watcher/public/components/tool_bar_selected_count/tool_bar_selected_count.html +++ /dev/null @@ -1,4 +0,0 @@ -
- {{ toolBarSelectedCount.count }} {{ toolBarSelectedCount.count === 1 ? toolBarSelectedCount.singularName : toolBarSelectedCount.pluralName}} - {{ 'xpack.watcher.toolBarSelectedCountText' | i18n: { defaultMessage: 'selected' } }} -
diff --git a/x-pack/plugins/watcher/public/components/tool_bar_selected_count/tool_bar_selected_count.js b/x-pack/plugins/watcher/public/components/tool_bar_selected_count/tool_bar_selected_count.js deleted file mode 100644 index 0cd5e60bd9ed4f..00000000000000 --- a/x-pack/plugins/watcher/public/components/tool_bar_selected_count/tool_bar_selected_count.js +++ /dev/null @@ -1,27 +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 { uiModules } from 'ui/modules'; -import template from './tool_bar_selected_count.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('toolBarSelectedCount', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - count: '=', - singularName: '@', - pluralName: '@', - }, - controllerAs: 'toolBarSelectedCount', - bindToController: true, - controller: class ToolBarSelectedCountController { - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/watch_actions/_index.scss b/x-pack/plugins/watcher/public/components/watch_actions/_index.scss deleted file mode 100644 index 10fdcef69f31c5..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/_index.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import 'watch_actions'; -@import 'components/watch_action/watch_action'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/watch_actions/_watch_actions.scss b/x-pack/plugins/watcher/public/components/watch_actions/_watch_actions.scss deleted file mode 100644 index f44cb85e8302d8..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/_watch_actions.scss +++ /dev/null @@ -1,14 +0,0 @@ -.watchActionsHeader { - display: flex; - - .watchActionsHeaderTitle { - flex: 1 1 auto; - font-size: 18px; - width: 100%; - line-height: $euiSizeXL; - } -} - -.watchAction { - margin-top: $euiSize; -} diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/lib/watch_action_controller_base/index.js b/x-pack/plugins/watcher/public/components/watch_actions/components/lib/watch_action_controller_base/index.js deleted file mode 100644 index f33bd49bae9cac..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/lib/watch_action_controller_base/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { WatchActionControllerBase } from './watch_action_controller_base'; diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/lib/watch_action_controller_base/watch_action_controller_base.js b/x-pack/plugins/watcher/public/components/watch_actions/components/lib/watch_action_controller_base/watch_action_controller_base.js deleted file mode 100644 index 22f85efe8c2148..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/lib/watch_action_controller_base/watch_action_controller_base.js +++ /dev/null @@ -1,18 +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. - */ - -export class WatchActionControllerBase { - constructor($scope) { - this.action = $scope.action; - this.form = $scope.form; - this.onChange = $scope.onChange; - } - - isValidationMessageVisible = (fieldName, errorType) => { - return this.form[fieldName].$touched && - this.form[fieldName].$error[errorType]; - } -} diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/_watch_action.scss b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/_watch_action.scss deleted file mode 100644 index c5c0c12a5e6914..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/_watch_action.scss +++ /dev/null @@ -1,56 +0,0 @@ -.watchAction { - border-top: 1px dashed $euiColorMediumShade; -} - -.watchAction__error { - background-color: $euiColorLightestShade; -} - -.watchActionErrorMessage { - color: $euiColorDanger; -} - -.watchActionSummaryButton { - padding: $euiSize; - width: 100%; - background: transparent; - border: transparent; - text-align: left; - - &:hover { - background: tint($euiColorPrimary, 95%); - } -} - -.watchActionSummaryToggleIcon { - margin-right: $euiSizeS; - width: $euiSizeM; -} - -.watchActionSummaryTypeIcon { - margin-right: $euiSizeXS; -} - -.watchActionSummaryType { - font-size: $euiFontSizeXS; -} - -.watchActionHeader { - display: block; -} - -.watchActionDescription { - display: block; - color: $euiColorDarkShade; - margin-left: $euiSizeL; - margin-top: $euiSizeS; -} - -.watchActionDetails { - background-color: inherit; - padding: 0 $euiSizeM $euiSizeM $euiSizeXXL; -} - -.watchActionSimulateButton { - float: right; -} diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/index.js b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/index.js deleted file mode 100644 index d6b193cff929a2..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/index.js +++ /dev/null @@ -1,7 +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 './watch_action'; diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/watch_action.html b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/watch_action.html deleted file mode 100644 index 7c5c569f60f2be..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/watch_action.html +++ /dev/null @@ -1,57 +0,0 @@ -
- -
-
-
-
-
-
-
- - -
-
-
diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/watch_action.js b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/watch_action.js deleted file mode 100644 index 021d4a5ef7e171..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_action/watch_action.js +++ /dev/null @@ -1,76 +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 'ui/fancy_forms'; -import { uiModules } from 'ui/modules'; -import template from './watch_action.html'; -import angular from 'angular'; -import '../watch_email_action'; -import '../watch_logging_action'; -import '../watch_slack_action'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchAction', function ($injector) { - const $compile = $injector.get('$compile'); - - return { - restrict: 'E', - template: template, - replace: true, - scope: { - action: '=', - isCollapsed: '=', - isValid: '=', - onChange: '=', - onToggle: '=', - onSimulate: '=', - onDelete: '=', - onValid: '=', - onInvalid: '=' - }, - bindToController: true, - controllerAs: 'watchAction', - link: function ($scope, $el) { - const $container = $el.find('.watchActionDetailsContent'); - $container.empty(); - - const newScope = $scope.$new(); - newScope.action = $scope.watchAction.action; - newScope.form = $scope.watchAction.form; - newScope.onChange = $scope.watchAction.onChange; - - const $innerEl = angular.element(newScope.action.constructor.template); - const postLink = $compile($innerEl); - $container.append($innerEl); - postLink(newScope); - }, - controller: class WatchActionController { - constructor($scope) { - $scope.$watch('watchAction.isCollapsed', (isCollapsed) => { - if (isCollapsed) { - this.form.$setTouched(true); - } - }); - - $scope.$watch('watchAction.form.$valid', () => { - this.checkValidity(); - }); - } - - checkValidity = () => { - const isValid = !(this.form.$invalid); - - if (isValid) { - this.onValid(this.action); - } else { - this.onInvalid(this.action); - } - } - - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/index.js b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/index.js deleted file mode 100644 index 56abbca3c50bcc..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/index.js +++ /dev/null @@ -1,7 +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 './watch_email_action'; diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/watch_email_action.html b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/watch_email_action.html deleted file mode 100644 index 8d395448ecfde8..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/watch_email_action.html +++ /dev/null @@ -1,72 +0,0 @@ -
- - -
-
-
- - -
-
-
- - -
-
diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/watch_email_action.js b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/watch_email_action.js deleted file mode 100644 index 104d800869cb6e..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_email_action/watch_email_action.js +++ /dev/null @@ -1,47 +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 { uiModules } from 'ui/modules'; -import { WatchActionControllerBase } from '../lib/watch_action_controller_base'; -import template from './watch_email_action.html'; -import 'plugins/watcher/services/html_id_generator'; -import 'ui/directives/input_focus'; -import 'plugins/watcher/components/xpack_aria_describes'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchEmailAction', function ($injector) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - restrict: 'E', - template: template, - bindToController: true, - controllerAs: 'watchEmailAction', - controller: class WatchEmailActionController extends WatchActionControllerBase { - constructor($scope) { - super($scope); - - this.makeId = htmlIdGeneratorFactory.create(this.action.id); - - this.to = this.action.to.join(','); - - $scope.$watch('watchEmailAction.to', (toList) => { - const toArray = (toList || '').split(',').map(to => to.trim()); - this.to = toArray.join(', '); - - this.action.to = toArray; - }); - - $scope.$watchGroup([ - 'action.to', - 'action.subject', - 'action.body' - ], () => { this.onChange(this.action); }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/index.js b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/index.js deleted file mode 100644 index 349efc682f74ea..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/index.js +++ /dev/null @@ -1,7 +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 './watch_logging_action'; diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/watch_logging_action.html b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/watch_logging_action.html deleted file mode 100644 index d2a29d733efaa6..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/watch_logging_action.html +++ /dev/null @@ -1,25 +0,0 @@ -
- - -
-
diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/watch_logging_action.js b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/watch_logging_action.js deleted file mode 100644 index 96924b36c17b62..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_logging_action/watch_logging_action.js +++ /dev/null @@ -1,36 +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 { uiModules } from 'ui/modules'; -import { WatchActionControllerBase } from '../lib/watch_action_controller_base'; -import template from './watch_logging_action.html'; -import 'ui/directives/input_focus'; -import 'plugins/watcher/services/html_id_generator'; -import 'plugins/watcher/components/xpack_aria_describes'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchLoggingAction', function ($injector) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - restrict: 'E', - template: template, - bindToController: true, - controllerAs: 'watchLoggingAction', - controller: class WatchLoggingActionController extends WatchActionControllerBase { - constructor($scope) { - super($scope); - - this.makeId = htmlIdGeneratorFactory.create(this.action.id); - - $scope.$watch([ - 'action.text' - ], () => { this.onChange(this.action); }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/index.js b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/index.js deleted file mode 100644 index d553c4de48ca8f..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/index.js +++ /dev/null @@ -1,7 +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 './watch_slack_action'; diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/watch_slack_action.html b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/watch_slack_action.html deleted file mode 100644 index 6d6272a2f8e10f..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/watch_slack_action.html +++ /dev/null @@ -1,48 +0,0 @@ -
- - -
-
-
- - -
-
diff --git a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/watch_slack_action.js b/x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/watch_slack_action.js deleted file mode 100644 index ab107b3ad85bb0..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/components/watch_slack_action/watch_slack_action.js +++ /dev/null @@ -1,46 +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 { uiModules } from 'ui/modules'; -import { WatchActionControllerBase } from '../lib/watch_action_controller_base'; -import template from './watch_slack_action.html'; -import 'ui/directives/input_focus'; -import 'plugins/watcher/services/html_id_generator'; -import 'plugins/watcher/components/xpack_aria_describes'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchSlackAction', function ($injector) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - restrict: 'E', - template: template, - bindToController: true, - controllerAs: 'watchSlackAction', - controller: class WatchSlackActionController extends WatchActionControllerBase { - constructor($scope) { - super($scope); - - this.makeId = htmlIdGeneratorFactory.create(this.action.id); - - this.to = this.action.to.join(', '); - - $scope.$watch('watchSlackAction.to', (toList) => { - const toArray = (toList || '').split(',').map(to => to.trim()); - this.to = toArray.join(', '); - - this.action.to = toArray; - }); - - $scope.$watchGroup([ - 'action.to', - 'action.text' - ], () => { this.onChange(this.action); }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/watch_actions/index.js b/x-pack/plugins/watcher/public/components/watch_actions/index.js deleted file mode 100644 index 6a56a78a9737f8..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/index.js +++ /dev/null @@ -1,7 +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 './watch_actions'; diff --git a/x-pack/plugins/watcher/public/components/watch_actions/watch_actions.html b/x-pack/plugins/watcher/public/components/watch_actions/watch_actions.html deleted file mode 100644 index 974d2b6a6843e7..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/watch_actions.html +++ /dev/null @@ -1,27 +0,0 @@ -
-
-
- -
- - -
diff --git a/x-pack/plugins/watcher/public/components/watch_actions/watch_actions.js b/x-pack/plugins/watcher/public/components/watch_actions/watch_actions.js deleted file mode 100644 index 55ee5b5afbedfc..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_actions/watch_actions.js +++ /dev/null @@ -1,104 +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 { find, remove, map, difference, forEach } from 'lodash'; -import { uiModules } from 'ui/modules'; -import template from './watch_actions.html'; -import './components/watch_action'; -import 'plugins/watcher/components/action_type_select'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchActions', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - actions: '=', - onActionAdd: '=', - onActionChange: '=', - onActionSimulate: '=', - onActionDelete: '=', - onValid: '=', - onInvalid: '=' - }, - bindToController: true, - controllerAs: 'watchActions', - controller: class WatchActionsController { - constructor($scope) { - this.items = []; - - $scope.$watch('watchActions.actions', (newVal) => { - if (!Boolean(newVal)) { - return; - } - - this.items = map(newVal, action => { - return { - action, - isCollapsed: true, - isValid: true - }; - }); - this.checkValidity(); - }); - } - - onToggle = (action) => { - const item = find(this.items, { action }); - item.isCollapsed = !item.isCollapsed; - } - - onDelete = (action) => { - this.onActionDelete(action); - - const item = find(this.items, { action }); - remove(this.items, item); - - this.checkValidity(); - } - - onActionTypeChange = (type) => { - this.onActionAdd(type); - - const oldActions = map(this.items, item => item.action); - const newActions = difference(this.actions, oldActions); - - forEach(newActions, action => { - this.items.push({ - action, - isCollapsed: false - }); - }); - } - - checkValidity = () => { - const isValid = this.items.length === 0 || this.items.every(i => i.isValid); - - if (isValid) { - this.onValid(this.action); - } else { - this.onInvalid(this.action); - } - } - - onActionValid = (action) => { - const item = find(this.items, { action }); - item.isValid = true; - - this.checkValidity(); - } - - onActionInvalid = (action) => { - const item = find(this.items, { action }); - item.isValid = false; - - this.checkValidity(); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/watch_history_item_detail/_index.scss b/x-pack/plugins/watcher/public/components/watch_history_item_detail/_index.scss deleted file mode 100644 index 546ba813f2f0d6..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_history_item_detail/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'watch_history_item_detail'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/components/watch_history_item_detail/_watch_history_item_detail.scss b/x-pack/plugins/watcher/public/components/watch_history_item_detail/_watch_history_item_detail.scss deleted file mode 100644 index 12aa399dab3f53..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_history_item_detail/_watch_history_item_detail.scss +++ /dev/null @@ -1,6 +0,0 @@ -watch-history-item-detail { - .json-editor { - height: 400px; - border: 1px solid $euiColorLightShade; - } -} diff --git a/x-pack/plugins/watcher/public/components/watch_history_item_detail/index.js b/x-pack/plugins/watcher/public/components/watch_history_item_detail/index.js deleted file mode 100644 index 0efe696d243fd8..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_history_item_detail/index.js +++ /dev/null @@ -1,7 +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 './watch_history_item_detail'; diff --git a/x-pack/plugins/watcher/public/components/watch_history_item_detail/watch_history_item_detail.html b/x-pack/plugins/watcher/public/components/watch_history_item_detail/watch_history_item_detail.html deleted file mode 100644 index 7a988f3121a45f..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_history_item_detail/watch_history_item_detail.html +++ /dev/null @@ -1,14 +0,0 @@ -
diff --git a/x-pack/plugins/watcher/public/components/watch_history_item_detail/watch_history_item_detail.js b/x-pack/plugins/watcher/public/components/watch_history_item_detail/watch_history_item_detail.js deleted file mode 100644 index 51f5193bff294f..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_history_item_detail/watch_history_item_detail.js +++ /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 { uiModules } from 'ui/modules'; -import 'plugins/watcher/directives/json_input'; -import template from './watch_history_item_detail.html'; -import 'ace'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchHistoryItemDetail', function () { - return { - restrict: 'E', - template: template, - scope: { - watchHistoryItem: '=' - }, - bindToController: true, - controllerAs: 'watchHistoryItemDetail', - controller: class WatchHistoryItemDetailController { - constructor($scope) { - $scope.aceLoaded = (editor) => { - this.editor = editor; - editor.$blockScrolling = Infinity; - }; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/watch_state_icon/index.js b/x-pack/plugins/watcher/public/components/watch_state_icon/index.js deleted file mode 100644 index a1501d9a72e68f..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_state_icon/index.js +++ /dev/null @@ -1,7 +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 './watch_state_icon'; diff --git a/x-pack/plugins/watcher/public/components/watch_state_icon/watch_state_icon.html b/x-pack/plugins/watcher/public/components/watch_state_icon/watch_state_icon.html deleted file mode 100644 index 0f500771578117..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_state_icon/watch_state_icon.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
-
-
-
-
diff --git a/x-pack/plugins/watcher/public/components/watch_state_icon/watch_state_icon.js b/x-pack/plugins/watcher/public/components/watch_state_icon/watch_state_icon.js deleted file mode 100644 index 27717ac6ad82c8..00000000000000 --- a/x-pack/plugins/watcher/public/components/watch_state_icon/watch_state_icon.js +++ /dev/null @@ -1,29 +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 { uiModules } from 'ui/modules'; -import template from './watch_state_icon.html'; -import { WATCH_STATES } from 'plugins/watcher/../common/constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchStateIcon', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watchStatus: '=' - }, - bindToController: true, - controllerAs: 'watchStateIcon', - controller: class WatchStateIconController { - constructor() { - this.WATCH_STATES = WATCH_STATES; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/xpack_aria_describes/index.js b/x-pack/plugins/watcher/public/components/xpack_aria_describes/index.js deleted file mode 100644 index 6dac96d340be9f..00000000000000 --- a/x-pack/plugins/watcher/public/components/xpack_aria_describes/index.js +++ /dev/null @@ -1,7 +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 './xpack_aria_describes'; diff --git a/x-pack/plugins/watcher/public/components/xpack_aria_describes/xpack_aria_describes.js b/x-pack/plugins/watcher/public/components/xpack_aria_describes/xpack_aria_describes.js deleted file mode 100644 index 2fbbe42f7e5a21..00000000000000 --- a/x-pack/plugins/watcher/public/components/xpack_aria_describes/xpack_aria_describes.js +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import $ from 'jquery'; -import { uiModules } from 'ui/modules'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('xpackAriaDescribes', function () { - return { - restrict: 'A', - link: function ($scope, $ele, attr) { - if (!Object.keys(attr).includes('id')) { - throw new Error(`An element with xpack-aria-describes="${attr.xpackAriaDescribes}" does not have an id attribute defined`); - } - - let selector = ''; - - function updateAriaDescribedBy(elementId, targetIdList, targetLength, remove = false) { - if (!elementId || !targetIdList || targetLength === 0) { - return; - } - - const targetIds = targetIdList.split(' '); - targetIds.forEach(targetId => { - const $target = $(`#${targetId}`); - - // Preserve any existing ids in the target's aria-describedby attribute - const describedby = $target.attr('aria-describedby'); - const describedByParts = describedby ? describedby.split(' ') : []; - const targetIndex = describedByParts.indexOf(elementId); - - if (remove) { - // remove this control's id from the list if it is there. - if (targetIndex !== -1) { - describedByParts.splice(targetIndex, 1); - } - } else { - // add this control's id to the list if it is not already there. - if (targetIndex === -1) { - describedByParts.push(elementId); - } - } - - if (describedByParts.length === 0) { - $target.removeAttr('aria-describedby'); - } else { - const newDescribedBy = describedByParts.join(' '); - $target.attr('aria-describedby', newDescribedBy); - } - }); - } - - $scope.$watch(() => attr.xpackAriaDescribes, (xpackAriaDescribes) => { - const ids = xpackAriaDescribes.split(' '); - selector = ids.map(id => `#${id}`).join(','); - - $scope.targetIdList = xpackAriaDescribes; - }); - - $scope.$watchMulti([ - () => attr.id, - 'targetIdList', - () => $(selector).length - ], ([elementId, targetIdList, targetLength]) => { - updateAriaDescribedBy(elementId, targetIdList, targetLength); - }); - - $scope.$on('$destroy', () => { - const elementId = attr.id; - const targetIdList = $scope.targetIdList; - const targetLength = $(selector).length; - - updateAriaDescribedBy(elementId, targetIdList, targetLength, true); - }); - } - }; -}); diff --git a/x-pack/plugins/watcher/public/components/action_type_select/index.js b/x-pack/plugins/watcher/public/constants/base_path.ts similarity index 79% rename from x-pack/plugins/watcher/public/components/action_type_select/index.js rename to x-pack/plugins/watcher/public/constants/base_path.ts index 5c476dc06f40e0..f5a8c96b68d7c6 100644 --- a/x-pack/plugins/watcher/public/components/action_type_select/index.js +++ b/x-pack/plugins/watcher/public/constants/base_path.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import './action_type_select'; +export const BASE_PATH = '/management/elasticsearch/watcher/'; diff --git a/x-pack/plugins/watcher/public/constants/index.js b/x-pack/plugins/watcher/public/constants/index.ts similarity index 87% rename from x-pack/plugins/watcher/public/constants/index.js rename to x-pack/plugins/watcher/public/constants/index.ts index c8b655abf167c2..82c7927a35fff0 100644 --- a/x-pack/plugins/watcher/public/constants/index.js +++ b/x-pack/plugins/watcher/public/constants/index.ts @@ -5,3 +5,4 @@ */ export { TIME_UNITS } from './time_units'; +export { BASE_PATH } from './base_path'; diff --git a/x-pack/plugins/watcher/public/constants/time_units.js b/x-pack/plugins/watcher/public/constants/time_units.ts similarity index 92% rename from x-pack/plugins/watcher/public/constants/time_units.js rename to x-pack/plugins/watcher/public/constants/time_units.ts index 05457882472695..cdf58dea7af21a 100644 --- a/x-pack/plugins/watcher/public/constants/time_units.js +++ b/x-pack/plugins/watcher/public/constants/time_units.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TIME_UNITS as COMMON_TIME_UNITS } from 'plugins/watcher/../common/constants/time_units'; import { i18n } from '@kbn/i18n'; +import { TIME_UNITS as COMMON_TIME_UNITS } from '../../common/constants/time_units'; export const TIME_UNITS = { [COMMON_TIME_UNITS.SECOND]: { @@ -22,7 +22,7 @@ export const TIME_UNITS = { }), labelSingular: i18n.translate('xpack.watcher.timeUnits.minuteSingularLabel', { defaultMessage: 'minute', - }) + }), }, [COMMON_TIME_UNITS.HOUR]: { labelPlural: i18n.translate('xpack.watcher.timeUnits.hourPluralLabel', { @@ -39,5 +39,5 @@ export const TIME_UNITS = { labelSingular: i18n.translate('xpack.watcher.timeUnits.daySingularLabel', { defaultMessage: 'day', }), - } + }, }; diff --git a/x-pack/plugins/watcher/public/directives/check_box/check_box.html b/x-pack/plugins/watcher/public/directives/check_box/check_box.html deleted file mode 100644 index a9c7e904c5aa6b..00000000000000 --- a/x-pack/plugins/watcher/public/directives/check_box/check_box.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/x-pack/plugins/watcher/public/directives/check_box/check_box.js b/x-pack/plugins/watcher/public/directives/check_box/check_box.js deleted file mode 100644 index 19ee351b0717e8..00000000000000 --- a/x-pack/plugins/watcher/public/directives/check_box/check_box.js +++ /dev/null @@ -1,27 +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 { uiModules } from 'ui/modules'; -import template from './check_box.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('checkBox', function () { - return { - restrict: 'E', - replace: true, - template, - scope: { - id: '=', - isSelected: '=', - onSelectChange: '=', - }, - controllerAs: 'checkBox', - bindToController: true, - controller: class CheckBoxController { - } - }; -}); diff --git a/x-pack/plugins/watcher/public/directives/check_box/index.js b/x-pack/plugins/watcher/public/directives/check_box/index.js deleted file mode 100644 index 15972a56dcc36f..00000000000000 --- a/x-pack/plugins/watcher/public/directives/check_box/index.js +++ /dev/null @@ -1,7 +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 './check_box'; diff --git a/x-pack/plugins/watcher/public/directives/json_input.js b/x-pack/plugins/watcher/public/directives/json_input.js deleted file mode 100644 index a4ee023f93328e..00000000000000 --- a/x-pack/plugins/watcher/public/directives/json_input.js +++ /dev/null @@ -1,38 +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 _ from 'lodash'; -import angular from 'angular'; -import { uiModules } from 'ui/modules'; - -uiModules - .get('xpack/watcher') - .directive('jsonInput', function () { - return { - restrict: 'A', - require: 'ngModel', - link: function (scope, $el, attrs, ngModelCntrl) { - ngModelCntrl.$formatters.push(toJSON); - ngModelCntrl.$parsers.push(fromJSON); - - function fromJSON(value) { - try { - value = JSON.parse(value); - const validity = !scope.$eval(attrs.requireKeys) ? true : _.keys(value).length > 0; - ngModelCntrl.$setValidity('json', validity); - } catch (e) { - ngModelCntrl.$setValidity('json', false); - } - return value; - } - - function toJSON(value) { - return angular.toJson(value, 2); - } - } - }; - }); - diff --git a/x-pack/plugins/watcher/public/directives/sortable_column/index.js b/x-pack/plugins/watcher/public/directives/sortable_column/index.js deleted file mode 100644 index dde1c9b375f834..00000000000000 --- a/x-pack/plugins/watcher/public/directives/sortable_column/index.js +++ /dev/null @@ -1,8 +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 './sortable_column'; diff --git a/x-pack/plugins/watcher/public/directives/sortable_column/sortable_column.html b/x-pack/plugins/watcher/public/directives/sortable_column/sortable_column.html deleted file mode 100644 index 25a14d553fb30a..00000000000000 --- a/x-pack/plugins/watcher/public/directives/sortable_column/sortable_column.html +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/x-pack/plugins/watcher/public/directives/sortable_column/sortable_column.js b/x-pack/plugins/watcher/public/directives/sortable_column/sortable_column.js deleted file mode 100644 index 2644f87c8a720d..00000000000000 --- a/x-pack/plugins/watcher/public/directives/sortable_column/sortable_column.js +++ /dev/null @@ -1,62 +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 { uiModules } from 'ui/modules'; -import template from './sortable_column.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('sortableColumn', function (i18n) { - return { - restrict: 'E', - transclude: true, - template: template, - scope: { - field: '@', - sortField: '=', - sortReverse: '=', - onSortChange: '=', - }, - controllerAs: 'sortableColumn', - bindToController: true, - controller: class SortableColumnController { - toggle = () => { - if (this.sortField === this.field) { - this.onSortChange(this.field, !this.sortReverse); - } else { - this.onSortChange(this.field, false); - } - } - - getAriaLabel() { - const isAscending = this.isSortedAscending(); - if(isAscending) { - return i18n('xpack.watcher.sortableColumn.sortAscendingAriaLabel', { - defaultMessage: 'Sort {field} ascending', - values: { field: this.field }, - }); - } - return i18n('xpack.watcher.sortableColumn.sortDescendingAriaLabel', { - defaultMessage: 'Sort {field} descending', - values: { field: this.field }, - }); - } - - isSorted() { - return this.sortField === this.field; - } - - isSortedAscending() { - return this.isSorted() && !this.sortReverse; - } - - isSortedDescending() { - return this.isSorted() && this.sortReverse; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/directives/toggle_button/index.js b/x-pack/plugins/watcher/public/directives/toggle_button/index.js deleted file mode 100644 index e88875670a7821..00000000000000 --- a/x-pack/plugins/watcher/public/directives/toggle_button/index.js +++ /dev/null @@ -1,7 +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 './toggle_button'; diff --git a/x-pack/plugins/watcher/public/directives/toggle_button/toggle_button.html b/x-pack/plugins/watcher/public/directives/toggle_button/toggle_button.html deleted file mode 100644 index d47103f758d70f..00000000000000 --- a/x-pack/plugins/watcher/public/directives/toggle_button/toggle_button.html +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/x-pack/plugins/watcher/public/directives/toggle_button/toggle_button.js b/x-pack/plugins/watcher/public/directives/toggle_button/toggle_button.js deleted file mode 100644 index 90abd3adfcd140..00000000000000 --- a/x-pack/plugins/watcher/public/directives/toggle_button/toggle_button.js +++ /dev/null @@ -1,28 +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 { uiModules } from 'ui/modules'; -import template from './toggle_button.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('toggleButton', function () { - return { - restrict: 'E', - replace: true, - transclude: true, - template: template, - scope: { - isDisabled: '=', - isCollapsed: '=', - onClick: '=', - }, - controllerAs: 'toggleButton', - bindToController: true, - controller: class ToggleButtonController { - } - }; -}); diff --git a/x-pack/plugins/watcher/public/directives/toggle_panel/index.js b/x-pack/plugins/watcher/public/directives/toggle_panel/index.js deleted file mode 100644 index d273e60278a628..00000000000000 --- a/x-pack/plugins/watcher/public/directives/toggle_panel/index.js +++ /dev/null @@ -1,7 +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 './toggle_panel'; diff --git a/x-pack/plugins/watcher/public/directives/toggle_panel/toggle_panel.html b/x-pack/plugins/watcher/public/directives/toggle_panel/toggle_panel.html deleted file mode 100644 index 6b2e6b85063375..00000000000000 --- a/x-pack/plugins/watcher/public/directives/toggle_panel/toggle_panel.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
- - {{togglePanel.buttonText}} - -
-
-
diff --git a/x-pack/plugins/watcher/public/directives/toggle_panel/toggle_panel.js b/x-pack/plugins/watcher/public/directives/toggle_panel/toggle_panel.js deleted file mode 100644 index a4e5656bf451b0..00000000000000 --- a/x-pack/plugins/watcher/public/directives/toggle_panel/toggle_panel.js +++ /dev/null @@ -1,34 +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 { uiModules } from 'ui/modules'; -import template from './toggle_panel.html'; -import '../toggle_button'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('togglePanel', function () { - return { - restrict: 'E', - replace: true, - transclude: true, - template: template, - scope: { - togglePanelId: '@', - buttonText: '@', - isDisabled: '=', - isCollapsed: '=', - onToggle: '=' - }, - controllerAs: 'togglePanel', - bindToController: true, - controller: class TogglePanelController { - toggle = () => { - this.onToggle(this.togglePanelId); - }; - } - }; -}); diff --git a/x-pack/plugins/watcher/public/directives/tooltip/index.js b/x-pack/plugins/watcher/public/directives/tooltip/index.js deleted file mode 100644 index 4812ceef7dc30a..00000000000000 --- a/x-pack/plugins/watcher/public/directives/tooltip/index.js +++ /dev/null @@ -1,7 +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 './tooltip'; diff --git a/x-pack/plugins/watcher/public/directives/tooltip/tooltip.html b/x-pack/plugins/watcher/public/directives/tooltip/tooltip.html deleted file mode 100644 index 6701d47e7692b9..00000000000000 --- a/x-pack/plugins/watcher/public/directives/tooltip/tooltip.html +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/directives/tooltip/tooltip.js b/x-pack/plugins/watcher/public/directives/tooltip/tooltip.js deleted file mode 100644 index a6f5a8ca281260..00000000000000 --- a/x-pack/plugins/watcher/public/directives/tooltip/tooltip.js +++ /dev/null @@ -1,40 +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 'ui/angular-bootstrap'; -import html from './tooltip.html'; -import chrome from 'ui/chrome'; -import { uiModules } from 'ui/modules'; - -uiModules.get('xpack/watcher') - .config(function ($tooltipProvider) { - // we use the uiSettings client because the config service is not available in the config phase - const uiSettings = chrome.getUiSettingsClient(); - - $tooltipProvider.setTriggers({ 'mouseenter': 'mouseleave click' }); - - $tooltipProvider.options({ - placement: 'bottom', - animation: !uiSettings.get('accessibility:disableAnimations'), - popupDelay: 150, - appendToBody: false - }); - }) - .directive('kbnTooltip', function () { - return { - restrict: 'E', - template: html, - transclude: true, - replace: true, - scope: true, - link: function ($scope, $el, attr) { - $scope.text = attr.text; - $scope.placement = attr.placement || 'top'; - $scope.delay = attr.delay || 400; - $scope.appendToBody = attr.appendToBody || 0; - } - }; - }); diff --git a/x-pack/plugins/watcher/public/components/duration_select/index.js b/x-pack/plugins/watcher/public/index.js similarity index 78% rename from x-pack/plugins/watcher/public/components/duration_select/index.js rename to x-pack/plugins/watcher/public/index.js index 2cad6b06e46947..c1b84e76d0008b 100644 --- a/x-pack/plugins/watcher/public/components/duration_select/index.js +++ b/x-pack/plugins/watcher/public/index.js @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -import './duration_select'; +import './register_route'; +import './register_management_sections'; diff --git a/x-pack/plugins/watcher/public/index.scss b/x-pack/plugins/watcher/public/index.scss deleted file mode 100644 index ebf042c7cbd1c4..00000000000000 --- a/x-pack/plugins/watcher/public/index.scss +++ /dev/null @@ -1,29 +0,0 @@ -// Import the EUI global scope so we can use EUI constants -@import 'src/legacy/ui/public/styles/_styling_constants'; - -// Temporary hacks -@import 'hacks'; - -// Watcher plugin styles - -// Prefix all styles with "watcher" to avoid conflicts. -// Examples -// watcher__ - -@import 'components/action_type_select/index'; -@import 'components/chart_tooltip/index'; -@import 'components/duration_select/index'; -@import 'components/expression_builder/index'; -@import 'components/flot_chart/index'; -@import 'components/index_select/index'; -@import 'components/json_editor/index'; -@import 'components/panel_pager/index'; -@import 'components/threshold_preview_chart/index'; -@import 'components/threshold_watch_expression/index'; -@import 'components/watch_actions/index'; -@import 'components/watch_history_item_detail/index'; -@import 'sections/watch_edit/components/threshold_watch_edit/index'; -@import 'sections/watch_edit/components/watch_edit_detail/index'; -@import 'sections/watch_edit/components/watch_edit_execute_detail/index'; -@import 'sections/watch_edit/components/watch_edit_title_panel/index'; -@import 'sections/watch_list/index'; diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index 6aeede8136122e..d1ed0e7919ff50 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -19,6 +19,13 @@ export const setHttpClient = (anHttpClient: ng.IHttpService) => { export const getHttpClient = () => { return httpClient; }; +let savedObjectsClient: any; +export const setSavedObjectsClient = (aSavedObjectsClient: any) => { + savedObjectsClient = aSavedObjectsClient; +}; +export const getSavedObjectsClient = () => { + return savedObjectsClient; +}; const basePath = chrome.addBasePath(ROUTES.API_ROOT); export const fetchWatches = async () => { const { @@ -123,3 +130,11 @@ export const executeWatch = async (executeWatchDetails: ExecutedWatchDetails, wa }); return data; }; +export const loadIndexPatterns = async () => { + const { savedObjects } = await getSavedObjectsClient().find({ + type: 'index-pattern', + fields: ['title'], + perPage: 10000, + }); + return savedObjects; +}; diff --git a/x-pack/plugins/watcher/public/components/threshold_preview_chart/constants.js b/x-pack/plugins/watcher/public/lib/navigation.ts similarity index 52% rename from x-pack/plugins/watcher/public/components/threshold_preview_chart/constants.js rename to x-pack/plugins/watcher/public/lib/navigation.ts index 74a5ede0e10a10..055803d50dc810 100644 --- a/x-pack/plugins/watcher/public/components/threshold_preview_chart/constants.js +++ b/x-pack/plugins/watcher/public/lib/navigation.ts @@ -4,17 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -export const COLORS = { - AREA_FILL: '#eff6f8', - SERIES_LINE: '#25a1d1', - THRESHOLD_LINE: '#dd1c74', - CHART_BORDER: '#676767' +import { BASE_PATH } from '../constants'; +let router: any; +export const registerRouter = (aRouter: any) => { + router = aRouter; }; -export const LINE_WIDTHS = { - THRESHOLD_LINE: 2 -}; - -export const MARGINS = { - AXES_LABELS: 10 +export const goToWatchList = () => { + router.history.push({ pathname: `${BASE_PATH}watches` }); }; diff --git a/x-pack/plugins/watcher/public/components/action_state_icon/index.js b/x-pack/plugins/watcher/public/license_service_context.ts similarity index 71% rename from x-pack/plugins/watcher/public/components/action_state_icon/index.js rename to x-pack/plugins/watcher/public/license_service_context.ts index dd97a047c45552..90993dd4c1e299 100644 --- a/x-pack/plugins/watcher/public/components/action_state_icon/index.js +++ b/x-pack/plugins/watcher/public/license_service_context.ts @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -import './action_state_icon'; +import React from 'react'; +export const LicenseServiceContext = React.createContext({} as any); diff --git a/x-pack/plugins/watcher/public/sections/watch_list/register_management_section.js b/x-pack/plugins/watcher/public/register_management_sections.js similarity index 75% rename from x-pack/plugins/watcher/public/sections/watch_list/register_management_section.js rename to x-pack/plugins/watcher/public/register_management_sections.js index c7b6937485705a..14bc14688a5ed6 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/register_management_section.js +++ b/x-pack/plugins/watcher/public/register_management_sections.js @@ -4,54 +4,58 @@ * you may not use this file except in compliance with the Elastic License. */ + import { management } from 'ui/management'; import { i18n } from '@kbn/i18n'; import 'plugins/watcher/services/license'; management.getSection('elasticsearch').register('watcher', { display: i18n.translate('xpack.watcher.sections.watchList.managementSection.watcherDisplayName', { - defaultMessage: 'Watcher' } - ), + defaultMessage: 'Watcher', + }), order: 6, - url: '#/management/elasticsearch/watcher/' + url: '#/management/elasticsearch/watcher/', }); management.getSection('elasticsearch/watcher').register('watches', { display: i18n.translate('xpack.watcher.sections.watchList.managementSection.watchesDisplayName', { - defaultMessage: 'Watches' } - ), - order: 1 + defaultMessage: 'Watches', + }), + order: 1, }); management.getSection('elasticsearch/watcher').register('watch', { - visible: false + visible: false, }); management.getSection('elasticsearch/watcher/watch').register('status', { display: i18n.translate('xpack.watcher.sections.watchList.managementSection.statusDisplayName', { - defaultMessage: 'Status' } - ), + defaultMessage: 'Status', + }), order: 1, - visible: false + visible: false, }); management.getSection('elasticsearch/watcher/watch').register('edit', { display: i18n.translate('xpack.watcher.sections.watchList.managementSection.editDisplayName', { - defaultMessage: 'Edit' } - ), + defaultMessage: 'Edit', + }), order: 2, - visible: false + visible: false, }); management.getSection('elasticsearch/watcher/watch').register('new', { - display: i18n.translate('xpack.watcher.sections.watchList.managementSection.newWatchDisplayName', { - defaultMessage: 'New Watch' } + display: i18n.translate( + 'xpack.watcher.sections.watchList.managementSection.newWatchDisplayName', + { + defaultMessage: 'New Watch', + } ), order: 1, - visible: false + visible: false, }); management.getSection('elasticsearch/watcher/watch').register('history-item', { order: 1, - visible: false + visible: false, }); diff --git a/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.js b/x-pack/plugins/watcher/public/register_route.js similarity index 62% rename from x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.js rename to x-pack/plugins/watcher/public/register_route.js index e171e0bf336444..997535eced7f19 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.js +++ b/x-pack/plugins/watcher/public/register_route.js @@ -5,49 +5,51 @@ */ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; +import { SavedObjectsClientProvider } from 'ui/saved_objects'; import routes from 'ui/routes'; import { management } from 'ui/management'; -import template from './watch_list_route.html'; +import template from './app.html'; +import { App } from './app'; import 'plugins/watcher/services/license'; -import { getWatchListBreadcrumbs } from '../../lib/breadcrumbs'; -import { WatchList } from './components/watch_list'; -import { setHttpClient } from '../../lib/api'; +import { getWatchListBreadcrumbs } from './lib/breadcrumbs'; +import { setHttpClient, setSavedObjectsClient } from './lib/api'; import { I18nContext } from 'ui/i18n'; -import { manageAngularLifecycle } from '../../lib/manage_angular_lifecycle'; +import { manageAngularLifecycle } from './lib/manage_angular_lifecycle'; +import { LicenseServiceContext } from './license_service_context'; let elem; -const renderReact = async elem => { +const renderReact = async (elem, licenseService) => { render( - + + + , elem ); }; -routes.when('/management/elasticsearch/watcher/', { - redirectTo: '/management/elasticsearch/watcher/watches/', -}); - -routes.when('/management/elasticsearch/watcher/watches/', { +routes.when('/management/elasticsearch/watcher/:param1?/:param2?/:param3?/:param4?', { template, - controller: class WatchListRouteController { - constructor($injector, $scope, $http) { + controller: class WatcherController { + constructor($injector, $scope, $http, Private) { const $route = $injector.get('$route'); - this.watches = $route.current.locals.watches; + const licenseService = $injector.get('xpackWatcherLicenseService'); // clean up previously rendered React app if one exists // this happens because of React Router redirects elem && unmountComponentAtNode(elem); + setSavedObjectsClient(Private(SavedObjectsClientProvider)); // NOTE: We depend upon Angular's $http service because it's decorated with interceptors, // e.g. to check license status per request. setHttpClient($http); $scope.$$postDigest(() => { - elem = document.getElementById('watchListReactRoot'); - renderReact(elem); + elem = document.getElementById('watchReactRoot'); + renderReact(elem, licenseService); manageAngularLifecycle($scope, $route, elem); }); } }, - controllerAs: 'watchListRoute', + controllerAs: 'watchRoute', + //TODO: fix breadcrumbs k7Breadcrumbs: getWatchListBreadcrumbs, }); diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/action_status_table.html b/x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/action_status_table.html deleted file mode 100644 index 3cf5b7c5e63042..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/action_status_table.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - -
- - {{ 'xpack.watcher.sections.watchDetail.actionStatusTable.actionColumnLabel' | i18n: { defaultMessage: 'Action' } }} - - - - {{ 'xpack.watcher.sections.watchDetail.actionStatusTable.stateColumnLabel' | i18n: { defaultMessage: 'State' } }} - - - Errors - -
-
- {{ actionStatus.id }} -
-
-
- - {{ actionStatus.state }} -
-
- - -
-
- -
-
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/action_status_table.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/action_status_table.js deleted file mode 100644 index db058c107d2251..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/action_status_table.js +++ /dev/null @@ -1,44 +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 { uiModules } from 'ui/modules'; -import template from './action_status_table.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('actionStatusTable', function ($injector, i18n) { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - actionStatuses: '=', - actionErrors: '=', - sortField: '=', - sortReverse: '=', - onSortChange: '=', - onActionAcknowledge: '=', - showErrors: '=' - }, - bindToController: true, - controllerAs: 'actionStatusTable', - controller: class ActionStatusTableController { - getLabelErrors(actionId) { - const errors = this.actionErrors[actionId]; - const total = errors.length; - - const label = i18n('xpack.watcher.sections.watchDetail.actionStatusTotalErrors', { - defaultMessage: '{total, number} {total, plural, one {error} other {errors}}', - values: { - total, - } - }); - - return label; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/index.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/index.js deleted file mode 100644 index 93e1cd9ad3aded..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/action_status_table/index.js +++ /dev/null @@ -1,7 +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 './action_status_table'; diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/index.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/index.js deleted file mode 100644 index 0a4b1629c610a3..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/index.js +++ /dev/null @@ -1,7 +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 './watch_detail'; diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail.html b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail.html deleted file mode 100644 index fa46a0b12097ae..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail.html +++ /dev/null @@ -1,89 +0,0 @@ - -
- -
-
- - -
-

-
- -
-
- - - -
-
-
-
- - - -
- - - - {{ 'xpack.watcher.sections.watchDetail.noActionsFoundText' | i18n: { defaultMessage: 'No actions found.' } }} - -
- - -
-

-
- -
- -
- - -
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail.js deleted file mode 100644 index 4d3fdea3816e11..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail.js +++ /dev/null @@ -1,221 +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 { uiModules } from 'ui/modules'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import moment from 'moment-timezone'; -import { toastNotifications } from 'ui/notify'; -import 'ui/config'; -import 'ui/url'; -import 'ui/table_info'; -import 'plugins/watcher/components/tool_bar_selected_count'; -import 'plugins/watcher/services/watch'; -import 'plugins/watcher/services/license'; -import 'plugins/watcher/components/errors_display_modal'; - -import template from './watch_detail.html'; -import errorsDisplayTemplate from 'plugins/watcher/components/errors_display_modal/errors_display_modal.html'; -import '../watch_history'; -import '../action_status_table'; -import { REFRESH_INTERVALS } from 'plugins/watcher/../common/constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchDetail', function ($injector, i18n) { - const watchService = $injector.get('xpackWatcherWatchService'); - const licenseService = $injector.get('xpackWatcherLicenseService'); - - const config = $injector.get('config'); - const kbnUrl = $injector.get('kbnUrl'); - const confirmModal = $injector.get('confirmModal'); - const $interval = $injector.get('$interval'); - - const $filter = $injector.get('$filter'); - const orderBy = $filter('orderBy'); - const $modal = $injector.get('$modal'); - - moment.tz.setDefault(config.get('dateFormat:tz')); - - return { - restrict: 'E', - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - initialHistoryRange: '=', - watchHistoryItems: '=' - }, - bindToController: true, - controllerAs: 'watchDetail', - controller: class WatchDetailController extends InitAfterBindingsWorkaround { - initAfterBindings($scope) { - // history settings - this.isHistoryLoading = false; - this.historyRange = this.initialHistoryRange; - - this.actionStatusTableSortField = 'id'; - this.actionStatusTableSortReverse = false; - this.actionErrors = (this.watch.watchErrors && this.watch.watchErrors.actionErrors) || null; - - this.omitBreadcrumbPages = ['watch', this.watch.id]; - this.breadcrumb = this.watch.displayName; - - // Reload watch history periodically - const refreshInterval = $interval( - () => this.loadWatchHistory(), - REFRESH_INTERVALS.WATCH_HISTORY - ); - $scope.$on('$destroy', () => $interval.cancel(refreshInterval)); - - // react to data and UI changes - $scope.$watchMulti( - ['watchDetail.actionStatusTableSortField', 'watchDetail.actionStatusTableSortReverse'], - this.applySortToActionStatusTable - ); - } - - loadWatchHistory = () => { - return watchService - .loadWatchHistory(this.watch.id, this.historyRange) - .then(watchHistoryItems => { - this.isHistoryLoading = false; - this.watchHistoryItems = watchHistoryItems; - }) - .catch(err => { - return licenseService.checkValidity().then(() => toastNotifications.addDanger(err)); - }); - }; - - // update the watch history items when the time range changes - onHistoryRangeChange = range => { - this.historyRange = range; - this.isHistoryLoading = true; - return this.loadWatchHistory(); - }; - - /** - * Action status table methods - */ - - get hasActionStatusTableActions() { - return this.sortedActionStatuses.length > 0; - } - - onActionSortChange = (field, reverse) => { - this.actionStatusTableSortField = field; - this.actionStatusTableSortReverse = reverse; - }; - - applySortToActionStatusTable = () => { - this.sortedActionStatuses = orderBy( - this.watch.watchStatus.actionStatuses, - this.actionStatusTableSortField, - this.actionStatusTableSortReverse - ); - }; - - onActionAcknowledge = (actionStatus) => { - return watchService.acknowledgeWatchAction(this.watch.id, actionStatus.id) - .then(watchStatus => { - this.watch.updateWatchStatus(watchStatus); - this.applySortToActionStatusTable(); - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => toastNotifications.addDanger(err)); - }); - } - - showErrors = (actionId, errors) => { - const errorsModal = $modal.open({ - template: errorsDisplayTemplate, - controller: 'WatcherErrorsDisplayController', - controllerAs: 'vm', - backdrop: 'static', - keyboard: true, - ariaLabelledBy: 'watcher__error-display-modal-title', - resolve: { - params: function () { - return { - title: i18n('xpack.watcher.sections.watchDetail.errorDisplayModalTitleText', { - defaultMessage: 'Errors in the "{actionId}" action', - values: { actionId } } - ), - errors, - }; - } - } - }); - - errorsModal.result.catch(() => { - // We need to add this empty Promise catch to avoid - // a console error "Possibly unhandled rejection" - }); - } - - /** - * Event handler methods - */ - - onWatchDeactivate = () => { - return watchService.deactivateWatch(this.watch.id) - .then(watchStatus => { - this.watch.updateWatchStatus(watchStatus); - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => toastNotifications.addDanger(err)); - }); - }; - - onWatchActivate = () => { - return watchService.activateWatch(this.watch.id) - .then(watchStatus => { - this.watch.updateWatchStatus(watchStatus); - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => toastNotifications.addDanger(err)); - }); - } - - onWatchDelete = () => { - const confirmModalOptions = { - confirmButtonText: i18n('xpack.watcher.sections.watchDetail.deleteConfirmModal.deleteWatchButtonLabel', { - defaultMessage: 'Delete Watch' } - ), - onConfirm: this.deleteWatch - }; - - return confirmModal( - i18n('xpack.watcher.sections.watchDetail.deleteConfirmModal.description', { - defaultMessage: 'This will permanently delete the watch. Are you sure?' } - ), - confirmModalOptions); - } - - deleteWatch = () => { - return watchService.deleteWatch(this.watch.id) - .then(() => { - toastNotifications.addSuccess( - i18n('xpack.watcher.sections.watchDetail.deleteWatchSuccessNotificationText', { - defaultMessage: 'Deleted {watchName}', - values: { watchName: this.watch.displayName } } - ), - ); - this.close(); - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => toastNotifications.addDanger(err)); - }); - } - - close = () => { - kbnUrl.change('/management/elasticsearch/watcher/watches', {}); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/index.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/index.js deleted file mode 100644 index 422fe636f34e43..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/index.js +++ /dev/null @@ -1,7 +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 './watch_history'; diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/watch_history.html b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/watch_history.html deleted file mode 100644 index 79238eb4838bd2..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/watch_history.html +++ /dev/null @@ -1,60 +0,0 @@ -
- -
-
- - -
- - -
- - -
-
- - - - {{ 'xpack.watcher.sections.watchDetail.watchHistory.watchHistoryLoadingText' | i18n: { defaultMessage: 'Loading watch history' } }}… - - - {{ 'xpack.watcher.sections.watchDetail.watchHistory.watchHistoryNotFoundText' | i18n: { defaultMessage: 'No watch history found.' } }} - - - - -
-
- - -
-
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/watch_history.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/watch_history.js deleted file mode 100644 index 1dcf96f86f8de1..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history/watch_history.js +++ /dev/null @@ -1,85 +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 'ui/filters/moment'; -import { uiModules } from 'ui/modules'; -import 'ui/pager_control'; -import 'ui/pager'; -import 'ui/table_info'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; - -import { PAGINATION } from 'plugins/watcher/../common/constants'; - -import template from './watch_history.html'; -import '../watch_history_table'; -import '../watch_history_range_filter'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchHistory', function ($injector) { - const pagerFactory = $injector.get('pagerFactory'); - - const $filter = $injector.get('$filter'); - const orderBy = $filter('orderBy'); - const limitTo = $filter('limitTo'); - - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - historyItems: '=', - initialRange: '=', - onRangeChange: '=', - isLoading: '=', - }, - bindToController: true, - controllerAs: 'watchHistory', - controller: class WatchHistoryController extends InitAfterBindingsWorkaround { - initAfterBindings($scope) { - this.isLoading = false; - this.sortField = 'startTime'; - this.sortReverse = true; - this.pageOfHistoryItems = []; - - this.historyRange = this.initialRange; - this.pager = pagerFactory.create(this.historyItems.length, PAGINATION.PAGE_SIZE, 1); - - // react to data and UI changes - $scope.$watchMulti([ - 'watchHistory.historyItems', - 'watchHistory.sortField', - 'watchHistory.sortReverse', - 'watchHistory.pager.currentPage', - ], this.applyFilters); - } - - get hasPageOfHistoryItems() { - return this.pageOfHistoryItems.length > 0; - } - - onPageNext = () => { - this.pager.nextPage(); - }; - - onPagePrevious = () => { - this.pager.previousPage(); - }; - - onSortChange = (field, reverse) => { - this.sortField = field; - this.sortReverse = reverse; - }; - - applyFilters = () => { - const orderedHistoryItems = orderBy(this.historyItems, this.sortField, this.sortReverse); - this.pageOfHistoryItems = limitTo(orderedHistoryItems, this.pager.pageSize, this.pager.startIndex); - this.pager.setTotalItems(orderedHistoryItems.length); - }; - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/index.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/index.js deleted file mode 100644 index dd189310a75a36..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/index.js +++ /dev/null @@ -1,7 +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 './watch_history_range_filter'; diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/watch_history_range_filter.html b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/watch_history_range_filter.html deleted file mode 100644 index 4b0f4fa2dad018..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/watch_history_range_filter.html +++ /dev/null @@ -1,41 +0,0 @@ - diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/watch_history_range_filter.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/watch_history_range_filter.js deleted file mode 100644 index c9b27a0f189dfa..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_range_filter/watch_history_range_filter.js +++ /dev/null @@ -1,31 +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 { uiModules } from 'ui/modules'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import template from './watch_history_range_filter.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchHistoryRangeFilter', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - historyRange: '=', - onRangeChange: '=', - }, - controllerAs: 'watchHistoryRangeFilter', - bindToController: true, - controller: class WatchHistoryRangeFilterController extends InitAfterBindingsWorkaround { - initAfterBindings() { - // avoid parent state mutation, since we have no one-way binding - this.range = this.historyRange; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/index.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/index.js deleted file mode 100644 index ddbfdfd90b3ae1..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/index.js +++ /dev/null @@ -1,7 +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 './watch_history_table'; diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/watch_history_table.html b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/watch_history_table.html deleted file mode 100644 index e87c1e57f11be1..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/watch_history_table.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - -
- - {{ 'xpack.watcher.sections.watchDetail.watchHistoryTable.triggerTimeColumnLabel' | i18n: { defaultMessage: 'Trigger Time' } }} - - - - {{ 'xpack.watcher.sections.watchDetail.watchHistoryTable.stateColumnLabel' | i18n: { defaultMessage: 'State' } }} - - - - {{ 'xpack.watcher.sections.watchDetail.watchHistoryTable.commentColumnLabel' | i18n: { defaultMessage: 'Comment' } }} - -
- - -
- - - {{ item.historyItem.watchStatus.state }} - -
-
-
- - {{item.historyItem.watchStatus.comment}} - -
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/watch_history_table.js b/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/watch_history_table.js deleted file mode 100644 index 8a19931113afdb..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_history_table/watch_history_table.js +++ /dev/null @@ -1,53 +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 'ui/filters/moment'; -import { uiModules } from 'ui/modules'; -import template from './watch_history_table.html'; -import 'plugins/watcher/components/watch_state_icon'; -import { find, isEmpty } from 'lodash'; -import { LISTS } from 'plugins/watcher/../common/constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchHistoryTable', function ($injector) { - const $timeout = $injector.get('$timeout'); - - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - historyItems: '=', - sortField: '=', - sortReverse: '=', - onSortChange: '=' - }, - bindToController: true, - controllerAs: 'watchHistoryTable', - controller: class WatchHistoryTableController { - constructor($scope) { - $scope.$watch('watchHistoryTable.historyItems', historyItems => { - const previousItems = this.items; - const isInitialLoad = isEmpty(previousItems); - - this.items = historyItems.map(historyItem => { - const matchedItem = find(previousItems, previousItem => previousItem.historyItem.id === historyItem.id); - const isNew = !isInitialLoad && Boolean(!matchedItem); - return { historyItem, isNew }; - }); - - $timeout(() => { - this.items.forEach(item => { - item.isNew = false; - }); - }, LISTS.NEW_ITEMS_HIGHLIGHT_DURATION); - }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/index.js b/x-pack/plugins/watcher/public/sections/watch_detail/index.js deleted file mode 100644 index ec0a7820ded818..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/index.js +++ /dev/null @@ -1,7 +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 './watch_detail_route'; diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.html b/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.html deleted file mode 100644 index 325d49e94153d3..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.html +++ /dev/null @@ -1,5 +0,0 @@ - - -
-
- diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.js b/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.js deleted file mode 100644 index d557701b67903c..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_detail/watch_detail_route.js +++ /dev/null @@ -1,115 +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 React from 'react'; -import { render } from 'react-dom'; -import routes from 'ui/routes'; -import 'ui/url'; -import { toastNotifications } from 'ui/notify'; -import template from './watch_detail_route.html'; -import 'plugins/watcher/services/watch'; -import { WATCH_HISTORY } from '../../../common/constants'; -import { updateWatchSections } from 'plugins/watcher/lib/update_management_sections'; -import 'plugins/watcher/services/license'; -import { getWatchDetailBreadcrumbs } from '../../lib/breadcrumbs'; -import { setHttpClient } from '../../lib/api'; -import { manageAngularLifecycle } from '../../lib/manage_angular_lifecycle'; -import './components/watch_detail'; -import { WatchDetail } from './components/watch_detail/watch_detail_component'; -import { WatchHistory } from './components/watch_detail/watch_history_component'; -import { I18nContext } from 'ui/i18n'; -import { EuiPageContent, EuiSpacer } from '@elastic/eui'; - -let elem; -const renderReact = async (elem, watchId, kbnUrlService) => { - render( - - - - - - - , - elem - ); -}; - -routes - .when('/management/elasticsearch/watcher/watches/watch/:id', { - redirectTo: '/management/elasticsearch/watcher/watches/watch/:id/status' - }); - -routes - .when('/management/elasticsearch/watcher/watches/watch/:id/status', { - template: template, - k7Breadcrumbs: getWatchDetailBreadcrumbs, - resolve: { - watchTabs: ($injector) => { - const $route = $injector.get('$route'); - const watchId = $route.current.params.id; - updateWatchSections(watchId); - }, - initialHistoryRange: function () { - return WATCH_HISTORY.INITIAL_RANGE; - }, - watch: function ($injector) { - const $route = $injector.get('$route'); - const watchService = $injector.get('xpackWatcherWatchService'); - const kbnUrl = $injector.get('kbnUrl'); - - const watchId = $route.current.params.id; - - return watchService.loadWatch(watchId) - .catch(err => { - if (err.status !== 403) { - toastNotifications.addDanger(err.data.message); - } - - kbnUrl.redirect('/management/elasticsearch/watcher/watches'); - return Promise.reject(); - }); - }, - watchHistoryItems: function ($injector) { - const $route = $injector.get('$route'); - const watchService = $injector.get('xpackWatcherWatchService'); - const kbnUrl = $injector.get('kbnUrl'); - - const watchId = $route.current.params.id; - - return watchService.loadWatchHistory(watchId, WATCH_HISTORY.INITIAL_RANGE) - .catch(err => { - if (err.status !== 403) { - toastNotifications.addDanger(err.data.message); - } - - kbnUrl.redirect('/management/elasticsearch/watcher/watches'); - return Promise.reject(); - }); - }, - checkLicense: ($injector) => { - const licenseService = $injector.get('xpackWatcherLicenseService'); - return licenseService.checkValidity(); - } - }, - controllerAs: 'watchDetailRoute', - controller: class WatchDetailRouteController { - constructor($injector, $scope, $http) { - const $route = $injector.get('$route'); - const kbnUrlService = $injector.get('kbnUrl'); - this.initialHistoryRange = $route.current.locals.initialHistoryRange; - this.watch = $route.current.locals.watch; - this.watchHistoryItems = $route.current.locals.watchHistoryItems; - // NOTE: We depend upon Angular's $http service because it's decorated with interceptors, - // e.g. to check license status per request. - setHttpClient($http); - $scope.$$postDigest(() => { - elem = document.getElementById('watchDetailReactRoot'); - renderReact(elem, $route.current.params.id, kbnUrlService); - manageAngularLifecycle($scope, $route, elem); - }); - } - } - }); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit.tsx similarity index 93% rename from x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx rename to x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit.tsx index 88c486652be160..161cd355c715a0 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_component.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit.tsx @@ -24,6 +24,7 @@ import { ACTION_MODES, TIME_UNITS } from '../../../../common/constants'; import { JsonWatchEditForm } from './json_watch_edit_form'; import { JsonWatchEditSimulate } from './json_watch_edit_simulate'; import { WatchContext } from './watch_context'; + interface WatchAction { actionId: string; actionMode: string; @@ -80,15 +81,7 @@ function getActionModes(items: WatchAction[]) { return result; } -const JsonWatchEditUi = ({ - pageTitle, - urlService, - licenseService, -}: { - pageTitle: string; - urlService: any; - licenseService: any; -}) => { +const JsonWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { const { watch } = useContext(WatchContext); const watchActions = getActions(watch); // hooks @@ -138,9 +131,7 @@ const JsonWatchEditUi = ({ watchActions={watchActions} /> )} - {selectedTab === WATCH_EDIT_TAB && ( - - )} + {selectedTab === WATCH_EDIT_TAB && } ); }; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/index.js deleted file mode 100644 index 4b1b16792dfb9c..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/index.js +++ /dev/null @@ -1,7 +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 './json_watch_edit'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.html deleted file mode 100644 index 824117b3d415c4..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.html +++ /dev/null @@ -1,121 +0,0 @@ - -
-
-
- -
- -
- - - {{ 'xpack.watcher.sections.watchEdit.json.editTabLabel' | i18n: { defaultMessage: 'Edit' } }} - - - {{ 'xpack.watcher.sections.watchEdit.json.simulateTabLabel' | i18n: { defaultMessage: 'Simulate' } }} - - - {{ 'xpack.watcher.sections.watchEdit.json.simulateResultsTabLabel' | i18n: { defaultMessage: 'Simulation Results' } }} - - -
- -
- -
- -
-
- -
- -
- -
- -
- -
-
- -
-
- -
- -
- -
- -
- - -
-
- -
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.js deleted file mode 100644 index 62602ade7eeace..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.js +++ /dev/null @@ -1,288 +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 { uiModules } from 'ui/modules'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import { toastNotifications } from 'ui/notify'; -import template from './json_watch_edit.html'; -import 'plugins/watcher/components/kbn_tabs'; -import 'plugins/watcher/components/watch_history_item_detail'; -import '../watch_edit_detail'; -import '../watch_edit_title_bar'; -import '../watch_edit_execute_info_panel'; -import '../watch_edit_execute_detail'; -import '../watch_edit_actions_execute_summary'; -import '../watch_edit_watch_execute_summary'; -import 'plugins/watcher/services/license'; -import { ACTION_TYPES } from '../../../../../common/constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('jsonWatchEdit', function ($injector, i18n) { - const watchService = $injector.get('xpackWatcherWatchService'); - const licenseService = $injector.get('xpackWatcherLicenseService'); - const kbnUrl = $injector.get('kbnUrl'); - const confirmModal = $injector.get('confirmModal'); - // const dirtyPrompt = $injector.get('dirtyPrompt'); - - return { - restrict: 'E', - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - }, - bindToController: true, - controllerAs: 'jsonWatchEdit', - controller: class JsonWatchEditController extends InitAfterBindingsWorkaround { - initAfterBindings() { - this.selectedTabId = 'edit-watch'; - this.simulateResults = null; - this.originalWatch = { - ...this.watch - }; - - this.omitBreadcrumbPages = [ - 'new-watch', - this.watch.id - ]; - this.breadcrumb = this.watch.displayName; - - // dirtyPrompt.register(() => !this.watch.isEqualTo(this.originalWatch)); - // $scope.$on('$destroy', dirtyPrompt.deregister); - - this.onExecuteDetailsValid(); - } - - onTabSelect = (tabId) => { - this.selectedTabId = tabId; - } - - isTabSelected = (tabId) => { - return this.selectedTabId === tabId; - } - - onWatchChange = (watch) => { - this.watch = watch; - } - - onValid = () => { - this.isValid = true; - } - - onInvalid = () => { - this.isValid = false; - } - - executeDetailsChange = (executeDetails) => { - this.executeDetails = executeDetails; - } - - onExecuteDetailsValid = () => { - this.isExecuteValid = true; - } - - onExecuteDetailsInvalid = () => { - this.isExecuteValid = false; - } - - onWatchExecute = () => { - return watchService.executeWatch(this.executeDetails, this.watch) - .then((watchHistoryItem) => { - this.simulateResults = watchHistoryItem; - this.onTabSelect('simulate-results'); - }) - .catch(e => { - toastNotifications.addDanger(e); - }); - } - - onWatchSave = () => { - this.createActionsForWatch(this.watch); - - if (!this.watch.isNew) { - return this.validateAndSaveWatch(); - } - - return this.isExistingWatch() - .then(existingWatch => { - if (!existingWatch) { - return this.validateAndSaveWatch(); - } - - const confirmModalOptions = { - onConfirm: this.saveWatch, - confirmButtonText: i18n('xpack.watcher.sections.watchEdit.json.saveConfirmModal.overwriteWatchButtonLabel', { - defaultMessage: 'Overwrite Watch', - }), - }; - - const message = i18n('xpack.watcher.sections.watchEdit.json.saveConfirmModal.description', { - defaultMessage: 'Watch with ID "{watchId}" {watchNameMessageFragment} already exists. Do you want to overwrite it?', - values: { - watchId: this.watch.id, - watchNameMessageFragment: existingWatch.name - ? i18n('xpack.watcher.sections.watchEdit.json.saveConfirmModal.descriptionFragmentText', { - defaultMessage: '(name: "{existingWatchName}")', - values: { - existingWatchName: existingWatch.name - } - }) - : '' - } - }); - return confirmModal(message, confirmModalOptions); - }) - .catch(err => toastNotifications.addDanger(err)); - } - - isExistingWatch = () => { - return watchService.loadWatch(this.watch.id) - .then(existingWatch => { - return existingWatch; - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => { - if (err.status === 404) { - return false; - } - throw err; - }); - }); - } - - validateAndSaveWatch = () => { - const { warning } = this.watch.validate(); - - if (warning) { - const confirmModalOptions = { - onConfirm: this.saveWatch, - confirmButtonText: i18n('xpack.watcher.sections.watchEdit.json.watchErrorsWarning.confirmSaveWatch', { - defaultMessage: 'Save watch', - }), - }; - - return confirmModal(warning.message, confirmModalOptions); - } - - return this.saveWatch(); - } - - saveWatch = () => { - return watchService.saveWatch(this.watch) - .then(() => { - this.watch.isNew = false; // without this, the message displays 'New Watch' - toastNotifications.addSuccess( - i18n('xpack.watcher.sections.watchEdit.json.saveSuccessNotificationText', { - defaultMessage: 'Saved \'{watchDisplayName}\'', - values: { - watchDisplayName: this.watch.displayName - } - }), - ); - this.onClose(); - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => toastNotifications.addDanger(err)); - }); - } - - onWatchDelete = () => { - const confirmModalOptions = { - onConfirm: this.deleteWatch, - confirmButtonText: i18n('xpack.watcher.sections.watchEdit.json.deleteConfirmModal.overwriteWatchButtonLabel', { - defaultMessage: 'Delete Watch', - }), - }; - - return confirmModal( - i18n('xpack.watcher.sections.watchEdit.json.deleteConfirmModal.description', { - defaultMessage: 'This will permanently delete the watch. Are you sure?', - }), - confirmModalOptions - ); - } - - deleteWatch = () => { - return watchService.deleteWatch(this.watch.id) - .then(() => { - toastNotifications.addSuccess( - i18n('xpack.watcher.sections.watchEdit.json.deleteSuccessNotificationText', { - defaultMessage: 'Deleted \'{watchDisplayName}\'', - values: { - watchDisplayName: this.watch.displayName - } - }), - ); - this.onClose(); - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => toastNotifications.addDanger(err)); - }); - } - - onClose = () => { - // dirtyPrompt.deregister(); - kbnUrl.change('/management/elasticsearch/watcher/watches', {}); - } - - /** - * Actions instances are not automatically added to the Watch _actions_ Array - * when we add them in the Json editor. This method takes takes care of it. - * - * @param watchModel Watch instance - * @return Watch instance - */ - createActionsForWatch(watchInstance) { - watchInstance.resetActions(); - - let action; - let type; - let actionProps; - - Object.keys(watchInstance.watch.actions).forEach((k) => { - action = watchInstance.watch.actions[k]; - type = this.getTypeFromAction(action); - actionProps = this.getPropsFromAction(type, action); - - watchInstance.createAction(type, actionProps); - }); - - return watchInstance; - } - - /** - * Get the type from an action where a key defines its type. - * eg: { email: { ... } } | { slack: { ... } } - * - * @param action A raw action object - * @return {string} The action type - */ - getTypeFromAction(action) { - const actionKeys = Object.keys(action); - let type; - - Object.keys(ACTION_TYPES).forEach((k) => { - if (actionKeys.includes(ACTION_TYPES[k])) { - type = ACTION_TYPES[k]; - } - }); - - return type ? type : ACTION_TYPES.UNKNOWN; - } - - getPropsFromAction(type, action) { - if (type === ACTION_TYPES.SLACK) { - // Slack action has its props inside the "message" object - return action[type].message; - } - return action[type]; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx index 9bfc0ea115e6fc..f8fa010628ca56 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx @@ -23,19 +23,15 @@ import { ErrableFormRow } from '../../../components/form_errors'; import { documentationLinks } from '../../../lib/documentation_links'; import { onWatchSave, saveWatch } from '../watch_edit_actions'; import { WatchContext } from './watch_context'; +import { LicenseServiceContext } from '../../../license_service_context'; -export const JsonWatchEditForm = ({ - urlService, - licenseService, -}: { - urlService: any; - licenseService: any; -}) => { +export const JsonWatchEditForm = () => { const { watch, setWatchProperty } = useContext(WatchContext); // hooks const [modal, setModal] = useState<{ title: string; message: string } | null>(null); const { errors } = watch.validate(); const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); + const licenseService = useContext(LicenseServiceContext); if (errors.json.length === 0) { setWatchProperty('watch', JSON.parse(watch.watchString)); @@ -47,7 +43,7 @@ export const JsonWatchEditForm = ({ modalOptions={modal} callback={async isConfirmed => { if (isConfirmed) { - saveWatch(watch, urlService, licenseService); + saveWatch(watch, licenseService); } setModal(null); }} @@ -65,6 +61,7 @@ export const JsonWatchEditForm = ({ > ) => { @@ -140,11 +138,12 @@ export const JsonWatchEditForm = ({ { - const savedWatch = await onWatchSave(watch, urlService, licenseService); + const savedWatch = await onWatchSave(watch, licenseService); if (savedWatch && savedWatch.error) { return setModal(savedWatch.error); } diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx similarity index 97% rename from x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx rename to x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx index e415f89cc3a65c..77c283cc93fbae 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit_component.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx @@ -29,13 +29,14 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; import { ConfirmWatchesModal } from '../../../components/confirm_watches_modal'; import { ErrableFormRow } from '../../../components/form_errors'; -import { fetchFields, getMatchingIndices } from '../../../lib/api'; +import { fetchFields, getMatchingIndices, loadIndexPatterns } from '../../../lib/api'; import { aggTypes } from '../../../models/watch/agg_types'; import { groupByTypes } from '../../../models/watch/group_by_types'; import { comparators } from '../comparators'; import { timeUnits } from '../time_units'; import { onWatchSave, saveWatch } from '../watch_edit_actions'; import { WatchContext } from './watch_context'; +import { LicenseServiceContext } from '../../../license_service_context'; const firstFieldOption = { text: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel', { defaultMessage: 'Select a field', @@ -114,19 +115,7 @@ const getIndexOptions = async (patternString: string, indexPatterns: string[]) = return options; }; -const ThresholdWatchEditUi = ({ - intl, - savedObjectsClient, - pageTitle, - urlService, - licenseService, -}: { - intl: InjectedIntl; - savedObjectsClient: any; - pageTitle: string; - urlService: any; - licenseService: any; -}) => { +const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTitle: string }) => { // hooks const [indexPatterns, setIndexPatterns] = useState([]); const [fields, setFields] = useState([]); @@ -140,13 +129,11 @@ const ThresholdWatchEditUi = ({ const [aggTypePopoverOpen, setAggTypePopoverOpen] = useState(false); const [modal, setModal] = useState<{ title: string; message: string } | null>(null); const { watch, setWatchProperty } = useContext(WatchContext); + const licenseService = useContext(LicenseServiceContext); + const getIndexPatterns = async () => { - const { savedObjects } = await savedObjectsClient.find({ - type: 'index-pattern', - fields: ['title'], - perPage: 10000, - }); - const titles = savedObjects.map((indexPattern: any) => indexPattern.attributes.title); + const indexPatternObjects = await loadIndexPatterns(); + const titles = indexPatternObjects.map((indexPattern: any) => indexPattern.attributes.title); setIndexPatterns(titles); }; const loadData = async () => { @@ -190,7 +177,7 @@ const ThresholdWatchEditUi = ({ modalOptions={modal} callback={async isConfirmed => { if (isConfirmed) { - saveWatch(watch, urlService, licenseService); + saveWatch(watch, licenseService); } setModal(null); }} @@ -772,7 +759,7 @@ const ThresholdWatchEditUi = ({ type="submit" isDisabled={hasErrors} onClick={async () => { - const savedWatch = await onWatchSave(watch, urlService, licenseService); + const savedWatch = await onWatchSave(watch, licenseService); if (savedWatch && savedWatch.error) { return setModal(savedWatch.error); } diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/_index.scss b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/_index.scss deleted file mode 100644 index d601bc6b0e9da2..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'threshold_watch_edit'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/_threshold_watch_edit.scss b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/_threshold_watch_edit.scss deleted file mode 100644 index b8a39a65c847f1..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/_threshold_watch_edit.scss +++ /dev/null @@ -1,31 +0,0 @@ -threshold-watch-edit { - .thresholdWatchEditButtons { - flex-direction:row-reverse; - } - - .thresholdWatchEditSectionPanel { - background-color: $euiColorEmptyShade; - padding: $euiSizeL; - } - - .kuiVerticalRhythm + .kuiVerticalRhythm { - margin-top: $euiSizeL; - } - - .kuiWatchVisualization { - width: 800px; - height: 250px; - border: 1px solid $euiColorLightShade; - padding: $euiSizeM; - border-radius: $euiBorderRadius; - background-color: $euiColorLightestShade; - } - - .kuiWatchVisualizationMulti { - margin: $euiSizeL; - } - - .kuiSubText { - margin-top: $euiSizeS; - } -} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/index.js deleted file mode 100644 index c00b7979a3f3b2..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/index.js +++ /dev/null @@ -1,7 +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 './threshold_watch_edit'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.html deleted file mode 100644 index 9283d2e9f43c26..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.html +++ /dev/null @@ -1,105 +0,0 @@ - -
- -
- -
-
-
-

-
-
- -
- -
- - -
-
-
-
- {{ thresholdWatchEdit.visualizeDataTitle }} -
-
-
- -
-
- -
-
- -
-
- -
- -
- -
- - - -
- -
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.js deleted file mode 100644 index 8da99a21519db4..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.js +++ /dev/null @@ -1,324 +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 { debounce, isEqual } from 'lodash'; -import { uiModules } from 'ui/modules'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import template from './threshold_watch_edit.html'; -import '../watch_edit_title_panel'; -import 'plugins/watcher/components/threshold_watch_expression'; -import 'plugins/watcher/components/threshold_preview_chart'; -import 'plugins/watcher/components/watch_actions'; -import 'plugins/watcher/components/panel_pager'; - -import 'plugins/watcher/services/fields'; -import 'plugins/watcher/services/license'; -import 'plugins/watcher/services/timezone'; -import 'plugins/watcher/services/watch'; -import 'plugins/watcher/services/interval'; -import 'plugins/watcher/services/action_defaults'; - -import dateMath from '@elastic/datemath'; -import { toastNotifications } from 'ui/notify'; -import { VisualizeOptions } from 'plugins/watcher/models/visualize_options'; -import { REFRESH_INTERVALS } from 'plugins/watcher/../common/constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('thresholdWatchEdit', function ($injector, i18n) { - const watchService = $injector.get('xpackWatcherWatchService'); - const fieldsService = $injector.get('xpackWatcherFieldsService'); - const timezoneService = $injector.get('xpackWatcherTimezoneService'); - const licenseService = $injector.get('xpackWatcherLicenseService'); - const intervalService = $injector.get('xpackWatcherIntervalService'); - const actionDefaultsService = $injector.get('xpackWatcherActionDefaultsService'); - const kbnUrl = $injector.get('kbnUrl'); - const confirmModal = $injector.get('confirmModal'); - // const dirtyPrompt = $injector.get('dirtyPrompt'); - const $interval = $injector.get('$interval'); - - return { - restrict: 'E', - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - }, - bindToController: true, - controllerAs: 'thresholdWatchEdit', - controller: class ThresholdWatchEditController extends InitAfterBindingsWorkaround { - initAfterBindings($scope) { - this.index = undefined; - this.originalWatch = { - ...this.watch - }; - - this.omitBreadcrumbPages = [ - 'new-watch', - this.watch.id - ]; - this.breadcrumb = this.watch.displayName; - - // dirtyPrompt.register(() => !this.watch.isEqualTo(this.originalWatch)); - $scope.$on('$destroy', () => { - // dirtyPrompt.deregister(); - this.stopRefreshWatchVisualizationTimer(); - }); - - this.loadFields(); - } - - loadFields = () => { - if (!isEqual(this.watch.index, this.index)) { - this.index = this.watch.index; - - if (!this.index.length) { - this.fields = []; - return; - } - - fieldsService.getFields(this.index) - .then((fields) => { - this.fields = fields; - }); - } - } - - onChange = (watch) => { - this.loadFields(); - this.watch = watch; - this.updateVisualizeTimeWindow(); - this.visualizeWatch(); - } - - onActionChange = () => {} - - onTitlePanelValid = () => { - this.titlePanelValid = true; - this.visualizeWatch(); - } - - onTitlePanelInvalid = () => { - this.titlePanelValid = false; - } - - onConditionPanelValid = () => { - this.conditionPanelValid = true; - this.visualizeWatch(); - } - - onConditionPanelInvalid = () => { - this.conditionPanelValid = false; - } - - onActionsValid = () => { - this.actionsPanelValid = true; - } - - onActionsInvalid = () => { - this.actionsPanelValid = false; - } - - onActionAdd = (actionType) => { - const defaults = actionDefaultsService.getDefaults(this.watch.type, actionType); - this.watch.createAction(actionType, defaults); - } - - onActionDelete = (action) => { - this.watch.deleteAction(action); - } - - onActionSimulate = (action) => { - watchService.simulateWatchAction(this.watch, action) - .then((watchHistoryItem) => { - const actionStatuses = watchHistoryItem.watchStatus.actionStatuses; - const actionStatus = actionStatuses.find(a => a.id === action.id); - - if (actionStatus.lastExecutionSuccessful === false) { - const message = actionStatus.lastExecutionReason || action.simulateFailMessage; - toastNotifications.addDanger(message); - } else { - toastNotifications.addSuccess(action.simulateMessage); - } - }) - .catch(err => { - toastNotifications.addDanger(err); - }); - } - - onClose = () => { - // dirtyPrompt.deregister(); - kbnUrl.change('/management/elasticsearch/watcher/watches', {}); - } - - get saveDisabled() { - return !(this.titlePanelValid && this.conditionPanelValid && this.actionsPanelValid); - } - - updateVisualizeTimeWindow = () => { - const VISUALIZE_TIME_WINDOW_MULTIPLIER = 5; - - const fromExpression = `now-${this.watch.timeWindowSize * VISUALIZE_TIME_WINDOW_MULTIPLIER}${this.watch.timeWindowUnit}`; - const toExpression = `now`; - - const fromMoment = dateMath.parse(fromExpression); - const toMoment = dateMath.parse(toExpression); - this.visualizeTimeWindowFrom = fromMoment ? fromMoment.valueOf() : undefined; - this.visualizeTimeWindowTo = toMoment ? toMoment.valueOf() : undefined; - } - - visualizeWatch = debounce(() => { - if (!this.titlePanelValid || !this.conditionPanelValid) { - return; - } - - const interval = intervalService.getInterval({ - min: this.visualizeTimeWindowFrom, - max: this.visualizeTimeWindowTo - }).expression; - - const visualizeOptions = new VisualizeOptions({ - rangeFrom: this.visualizeTimeWindowFrom, - rangeTo: this.visualizeTimeWindowTo, - interval, - timezone: timezoneService.getTimezone() - }); - - return watchService.visualizeWatch(this.watch, visualizeOptions) - .then(({ visualizeData }) => { - this.visualizeData = visualizeData; - this.visualizeDataPageCount = Object.keys(visualizeData).length; - this.setVisualizationPageByKey(this.visualizeDataKey); - this.restartRefreshWatchVisualizationTimer(); - }) - .catch(e => { - toastNotifications.addDanger(e); - this.stopRefreshWatchVisualizationTimer(); - }); - }, 500); - - setVisualizationPageByKey = (key) => { - const newIndex = Object.keys(this.visualizeData).indexOf(key); - if (newIndex === -1) { - this.setVisualizationPage(0); - } else { - this.setVisualizationPage(newIndex); - } - } - - setVisualizationPage = (index) => { - this.visualizeDataKey = Object.keys(this.visualizeData)[index]; - - this.visualizeDataPageIndex = index; - this.visualizeDataTitle = `${this.watch.termField} (${index + 1} of ${this.visualizeDataPageCount}): ${this.visualizeDataKey}`; - this.chartSeries = this.visualizeData[this.visualizeDataKey]; - } - - onVisualizationNextPage = () => { - const newIndex = this.visualizeDataPageIndex + 1; - - if (newIndex < this.visualizeDataPageCount) { - this.setVisualizationPage(newIndex); - } else { - this.setVisualizationPage(0); - } - } - - onVisualizationPreviousPage = () => { - const newIndex = this.visualizeDataPageIndex - 1; - - if (newIndex >= 0) { - this.setVisualizationPage(newIndex); - } else { - this.setVisualizationPage(this.visualizeDataPageCount - 1); - } - } - - restartRefreshWatchVisualizationTimer = () => { - this.stopRefreshWatchVisualizationTimer(); - this.refreshVisualizationWatchInterval = $interval(this.visualizeWatch, REFRESH_INTERVALS.WATCH_VISUALIZATION); - } - - stopRefreshWatchVisualizationTimer = () => { - if (Boolean(this.refreshVisualizationWatchInterval)) { - $interval.cancel(this.refreshVisualizationWatchInterval); - } - } - - onWatchSave = () => { - if (!this.watch.isNew) { - return this.saveWatch(); - } - - return this.isExistingWatch() - .then(existingWatch => { - if (!existingWatch) { - return this.saveWatch(); - } - - const confirmModalOptions = { - onConfirm: this.saveWatch, - confirmButtonText: i18n('xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.overwriteWatchButtonLabel', { - defaultMessage: 'Overwrite Watch', - }), - }; - - const message = i18n('xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.description', { - defaultMessage: 'Watch with ID "{watchId}" {watchNameMessageFragment} already exists. Do you want to overwrite it?', - values: { - watchId: this.watch.id, - watchNameMessageFragment: existingWatch.name - ? i18n('xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.descriptionFragmentText', { - defaultMessage: '(name: "{existingWatchName}")', - values: { - existingWatchName: existingWatch.name - } - }) - : '' - } - }); - return confirmModal(message, confirmModalOptions); - }) - .catch(err => toastNotifications.addDanger(err)); - } - - isExistingWatch = () => { - return watchService.loadWatch(this.watch.id) - .then(existingWatch => { - return existingWatch; - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => { - if (err.status === 404) { - return false; - } - throw err; - }); - }); - } - - saveWatch = () => { - return watchService.saveWatch(this.watch) - .then(() => { - this.watch.isNew = false; // without this, the message displays 'New Watch' - toastNotifications.addSuccess( - i18n('xpack.watcher.sections.watchEdit.threshold.saveSuccessNotificationText', { - defaultMessage: 'Saved \'{watchDisplayName}\'', - values: { - watchDisplayName: this.watch.displayName - } - }), - ); - this.onClose(); - }) - .catch(err => { - return licenseService.checkValidity() - .then(() => toastNotifications.addDanger(err)); - }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/index.js deleted file mode 100644 index 090d7bb5092ad1..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/index.js +++ /dev/null @@ -1,7 +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 './watch_action_mode_table'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/watch_action_mode_table.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/watch_action_mode_table.html deleted file mode 100644 index efa392a7f18b95..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/watch_action_mode_table.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - -
-
- {{actionOption.actionId}} -
-
-
- {{actionOption.type}} -
-
-
- -
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/watch_action_mode_table.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/watch_action_mode_table.js deleted file mode 100644 index 642daaceee83a0..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_action_mode_table/watch_action_mode_table.js +++ /dev/null @@ -1,58 +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 { map, get, values, set } from 'lodash'; -import { uiModules } from 'ui/modules'; -import template from './watch_action_mode_table.html'; -import { getActionType } from 'plugins/watcher/../common/lib/get_action_type'; -import { ACTION_MODES } from 'plugins/watcher/../common/constants'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchActionModeTable', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - onChange: '=' - }, - bindToController: true, - controllerAs: 'watchActionModeTable', - controller: class WatchActionModeTableController { - constructor($scope) { - $scope.$watch('watchActionModeTable.watch.watch', () => { - this.populateActionCollection(); - this.onActionModeChange(); - }); - - this.actionModes = values(ACTION_MODES); - } - - populateActionCollection() { - const actions = get(this.watch, 'watch.actions'); - - this.actionOptions = map(actions, (action, actionId) => { - const type = getActionType(action); - return { - actionId, - type, - actionMode: ACTION_MODES.SIMULATE - }; - }); - } - - onActionModeChange() { - const result = {}; - this.actionOptions.forEach(actionOption => { - set(result, actionOption.actionId, actionOption.actionMode); - }); - this.onChange(result); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx index 7b2f1f4cc70bb7..46de27ab958389 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -12,8 +12,8 @@ import { isEqual } from 'lodash'; import { WATCH_TYPES } from '../../../../common/constants'; import { BaseWatch } from '../../../../common/types/watch_types'; import { loadWatch } from '../../../lib/api'; -import { JsonWatchEdit } from './json_watch_edit_component'; -import { ThresholdWatchEdit } from './threshold_watch_edit_component'; +import { JsonWatchEdit } from './json_watch_edit'; +import { ThresholdWatchEdit } from './threshold_watch_edit'; import { WatchContext } from './watch_context'; const getTitle = (watch: BaseWatch) => { @@ -53,17 +53,16 @@ const watchReducer = (state: any, action: any) => { }; export const WatchEdit = ({ - watchId, - watchType, - savedObjectsClient, - urlService, - licenseService, + match: { + params: { id, type }, + }, }: { - watchId: string; - watchType: string; - savedObjectsClient: any; - urlService: any; - licenseService: any; + match: { + params: { + id: string | undefined; + type: string | undefined; + }; + }; }) => { // hooks const [watch, dispatch] = useReducer(watchReducer, null); @@ -74,11 +73,11 @@ export const WatchEdit = ({ dispatch({ command: 'addAction', payload: action }); }; const getWatch = async () => { - if (watchId) { - const theWatch = await loadWatch(watchId); + if (id) { + const theWatch = await loadWatch(id); dispatch({ command: 'setWatch', payload: theWatch }); - } else { - const WatchType = Watch.getWatchTypes()[watchType]; + } else if (type) { + const WatchType = Watch.getWatchTypes()[type]; if (WatchType) { dispatch({ command: 'setWatch', payload: new WatchType() }); } @@ -99,12 +98,7 @@ export const WatchEdit = ({ } return ( - + ); }; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/index.js deleted file mode 100644 index 7bae266bc8c163..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/index.js +++ /dev/null @@ -1,7 +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 './watch_edit_actions_execute_summary'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/watch_edit_actions_execute_summary.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/watch_edit_actions_execute_summary.html deleted file mode 100644 index e1b4f473c5c14e..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/watch_edit_actions_execute_summary.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - -
-
- {{actionDetail.action.id}} -
-
-
- {{actionDetail.action.type}} -
-
-
- {{actionDetail.actionMode}} -
-
-
- - {{actionDetail.actionStatus.state}} -
-
-
- {{actionDetail.actionStatus.lastExecutionReason}} -
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/watch_edit_actions_execute_summary.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/watch_edit_actions_execute_summary.js deleted file mode 100644 index 2d59f623243bcf..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_actions_execute_summary/watch_edit_actions_execute_summary.js +++ /dev/null @@ -1,51 +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 { find } from 'lodash'; -import { uiModules } from 'ui/modules'; -import template from './watch_edit_actions_execute_summary.html'; -import 'plugins/watcher/components/action_state_icon'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchEditActionsExecuteSummary', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - watchHistoryItem: '=', - executeDetails: '=' - }, - bindToController: true, - controllerAs: 'watchEditActionsExecuteSummary', - controller: class WatchEditActionsExecuteSummaryController { - constructor($scope) { - $scope.$watch('watchEditActionsExecuteSummary.watchHistoryItem', () => { - if (!this.watchHistoryItem) { - return; - } - - const actions = this.watch.actions; - const actionStatuses = this.watchHistoryItem.watchStatus.actionStatuses; - const actionModes = this.executeDetails.actionModes; - - this.actionDetails = actions.map(action => { - const actionMode = actionModes[action.id]; - const actionStatus = find(actionStatuses, { id: action.id }); - - return { - action, - actionMode, - actionStatus - }; - }); - }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/_index.scss b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/_index.scss deleted file mode 100644 index 046363fdb37e7f..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'watch_edit_detail'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/_watch_edit_detail.scss b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/_watch_edit_detail.scss deleted file mode 100644 index eac8309bc8f423..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/_watch_edit_detail.scss +++ /dev/null @@ -1,5 +0,0 @@ -watch-edit-detail { - .json-editor { - height: 400px; - } -} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/index.js deleted file mode 100644 index 44c63f0f985d44..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/index.js +++ /dev/null @@ -1,7 +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 './watch_edit_detail'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/watch_edit_detail.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/watch_edit_detail.html deleted file mode 100644 index 2b03a5f91930f8..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/watch_edit_detail.html +++ /dev/null @@ -1,81 +0,0 @@ -
-
- - -
-
-
- -
- - -
-
- -
- - -
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/watch_edit_detail.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/watch_edit_detail.js deleted file mode 100644 index 50875982ef485f..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_detail/watch_edit_detail.js +++ /dev/null @@ -1,68 +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 { uiModules } from 'ui/modules'; -import template from './watch_edit_detail.html'; -import 'plugins/watcher/components/json_editor'; -import { documentationLinks } from 'plugins/watcher/lib/documentation_links'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchEditDetail', function () { - return { - restrict: 'E', - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - onWatchChange: '=', - onInvalid: '=', - onValid: '=' - }, - bindToController: true, - controllerAs: 'watchEditDetail', - controller: class WatchEditDetailController { - constructor($scope) { - $scope.$watchMulti([ - 'watchEditDetail.watch.id', - 'watchEditDetail.watch.name', - 'watchEditDetail.watch.watch' - ], () => { - this.onWatchChange(this.watch); - }); - - $scope.$watch('watchEditDetail.form.$valid', () => { - this.updateIsValid(); - }); - - this.documentationLinks = documentationLinks; - } - - updateIsValid = () => { - const isValid = !(this.form.$invalid || !this.isJsonValid); - - if (isValid) { - this.onValid(); - } else { - this.onInvalid(); - } - } - - onJsonValid = () => { - this.isJsonValid = true; - this.updateIsValid(); - } - - onJsonInvalid = () => { - this.isJsonValid = false; - this.updateIsValid(); - } - - onJsonChange = (json) => { - this.watch.watch = json; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/_index.scss b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/_index.scss deleted file mode 100644 index 4f308b2526b8c6..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'watch_edit_execute_detail'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/_watch_edit_execute_detail.scss b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/_watch_edit_execute_detail.scss deleted file mode 100644 index 3d1dcf6cc31977..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/_watch_edit_execute_detail.scss +++ /dev/null @@ -1,19 +0,0 @@ -watch-edit-execute-detail { - .json-editor { - height: 300px; - } - - .copyFromPrevious { - float: right; - font-weight: normal; - } - - .kuiFormSection { - padding-left: $euiSize; - } - - label.collapserLabel { - font-weight: normal; - color: $euiColorDarkShade; - } -} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/index.js deleted file mode 100644 index 452b73308d0e89..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/index.js +++ /dev/null @@ -1,7 +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 './watch_edit_execute_detail'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/watch_edit_execute_detail.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/watch_edit_execute_detail.html deleted file mode 100644 index 69e7a282f5ec98..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/watch_edit_execute_detail.html +++ /dev/null @@ -1,125 +0,0 @@ -
- -
- - -
-
- - -
-
-
- - -
- - - -
-
-
- -
- -
- -
-
-
- -
- -
- - -
-
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/watch_edit_execute_detail.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/watch_edit_execute_detail.js deleted file mode 100644 index e190cf247ddb0a..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_detail/watch_edit_execute_detail.js +++ /dev/null @@ -1,109 +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 { isEmpty, get } from 'lodash'; -import { uiModules } from 'ui/modules'; -import template from './watch_edit_execute_detail.html'; -import '../watch_action_mode_table'; -import 'ace'; -import 'plugins/watcher/directives/toggle_panel'; -import { ExecuteDetails } from 'plugins/watcher/models/execute_details'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchEditExecuteDetail', function () { - return { - restrict: 'E', - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - previousWatchHistoryItem: '=', - onChange: '=', - onInvalid: '=', - onValid: '=' - }, - bindToController: true, - controllerAs: 'watchEditExecuteDetail', - controller: class WatchEditExecuteDetailController { - constructor($scope) { - this.executeDetails = new ExecuteDetails(); - - this.isCollapsed = { - trigger: true, - input: true, - condition: true, - action: true - }; - - $scope.aceLoaded = (editor) => { - this.editor = editor; - editor.$blockScrolling = Infinity; - }; - - $scope.$watchMulti([ - 'watchEditExecuteDetail.executeDetails.triggeredTime', - 'watchEditExecuteDetail.executeDetails.scheduledTime', - 'watchEditExecuteDetail.executeDetails.ignoreCondition', - 'watchEditExecuteDetail.executeDetails.recordExecution', - 'watchEditExecuteDetail.executeDetails.actionModes' - ], this.reportChanges); - } - - onSectionToggle = (sectionId) => { - this.isCollapsed[sectionId] = !this.isCollapsed[sectionId]; - } - - isSectionCollapsed = (sectionId) => { - return this.isCollapsed[sectionId]; - } - - onActionModesChanged = (actionModes) => { - this.executeDetails.actionModes = actionModes; - } - - copyFromPreviousExecution = () => { - this.executeDetails.alternativeInput = get( - this.previousWatchHistoryItem.details, - 'result.input.payload' - ); - } - - reportChanges = () => { - const isValid = this.triggerForm.$valid && - (this.isAlternativeInputValid || this.isAlternativeInputEmpty) && - this.conditionForm.$valid && - this.actionForm.$valid; - - if (isValid) { - this.onValid(); - } else { - this.onInvalid(); - } - - this.onChange(this.executeDetails); - } - - onAlternativeInputValid = () => { - this.isAlternativeInputValid = true; - this.reportChanges(); - } - - onAlternativeInputInvalid = () => { - this.isAlternativeInputValid = false; - this.reportChanges(); - } - - onAlternativeInputChange = (json) => { - this.executeDetails.alternativeInput = json; - this.reportChanges(); - } - - get isAlternativeInputEmpty() { - return isEmpty(String(this.executeDetails.alternativeInput)); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/index.js deleted file mode 100644 index cebe780523078f..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/index.js +++ /dev/null @@ -1,7 +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 './watch_edit_execute_info_panel'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/watch_edit_execute_info_panel.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/watch_edit_execute_info_panel.html deleted file mode 100644 index 7b29329f0fdb52..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/watch_edit_execute_info_panel.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
- - -
- -
-
-
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/watch_edit_execute_info_panel.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/watch_edit_execute_info_panel.js deleted file mode 100644 index 4335e790e6efd4..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_execute_info_panel/watch_edit_execute_info_panel.js +++ /dev/null @@ -1,25 +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 { uiModules } from 'ui/modules'; -import template from './watch_edit_execute_info_panel.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchEditExecuteInfoPanel', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: {}, - bindToController: true, - controllerAs: 'watchEditExecuteInfoPanel', - controller: class WatchEditExecuteInfoPanelController { - constructor() { - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/index.js deleted file mode 100644 index 40f404bf47e9be..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/index.js +++ /dev/null @@ -1,7 +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 './watch_edit_title_bar'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/watch_edit_title_bar.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/watch_edit_title_bar.html deleted file mode 100644 index 8efd0cb3672c4c..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/watch_edit_title_bar.html +++ /dev/null @@ -1,37 +0,0 @@ -
-
-

-
-
-
- - - -
-
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/watch_edit_title_bar.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/watch_edit_title_bar.js deleted file mode 100644 index ed826392b57158..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_bar/watch_edit_title_bar.js +++ /dev/null @@ -1,31 +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 { uiModules } from 'ui/modules'; -import template from './watch_edit_title_bar.html'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchEditTitleBar', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - isWatchValid: '=', - onWatchDelete: '=', - onWatchSave: '=', - onClose: '=' - }, - bindToController: true, - controllerAs: 'watchEditTitleBar', - controller: class WatchEditTitleBarController { - constructor() { - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/_index.scss b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/_index.scss deleted file mode 100644 index 0200b48921d3ee..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'watch_edit_title_panel'; \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/_watch_edit_title_panel.scss b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/_watch_edit_title_panel.scss deleted file mode 100644 index 8e466b6d0e2818..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/_watch_edit_title_panel.scss +++ /dev/null @@ -1,13 +0,0 @@ -.watchEditTitlePanelContent { - border-top: 1px solid $euiColorLightShade; - padding-top: $euiSize; - margin-top: $euiSize; -} - -.watchEditTitleIndexSelectContainer.ng-invalid .ui-select-container { - border-color: $euiColorDanger; -} - -.watchEditTitlePanelIntervalValidation { - width: 185px; -} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/index.js deleted file mode 100644 index b13094c53e927f..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/index.js +++ /dev/null @@ -1,7 +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 './watch_edit_title_panel'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/watch_edit_title_panel.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/watch_edit_title_panel.html deleted file mode 100644 index 20509afa1ae55c..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/watch_edit_title_panel.html +++ /dev/null @@ -1,201 +0,0 @@ -
-
-

- {{watchEditTitlePanel.title}} -

-
-

{{watchEditTitlePanel.description}}

-
-
-
-
-
- -
- -
-
-
-   -
-
-
-
-
- -
- - -
-
-
-
-
- -
-
- -
- -
- -
-
-
-   -
-
- -
- - -
- -
-
-
-
-
-
-
-
-
-
-
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/watch_edit_title_panel.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/watch_edit_title_panel.js deleted file mode 100644 index 3e85d8aa612c51..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_title_panel/watch_edit_title_panel.js +++ /dev/null @@ -1,174 +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 { size } from 'lodash'; -import { uiModules } from 'ui/modules'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import template from './watch_edit_title_panel.html'; -import { TIME_UNITS } from 'plugins/watcher/../common/constants'; - -import 'plugins/watcher/components/index_select'; -import 'plugins/watcher/components/duration_select'; -import 'plugins/watcher/services/html_id_generator'; -import 'plugins/watcher/components/xpack_aria_describes'; - -const app = uiModules.get('xpack/watcher'); - -const VALID_NORMALIZED_TYPES = ['date']; - -app.directive('watchEditTitlePanel', function ($injector, i18n) { - const htmlIdGeneratorFactory = $injector.get('xpackWatcherHtmlIdGeneratorFactory'); - - return { - restrict: 'E', - template: template, - replace: true, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - fields: '=', - onChange: '=', - onInvalid: '=', - onValid: '=' - }, - bindToController: true, - controllerAs: 'watchEditTitlePanel', - controller: class WatchEditTitlePanelController extends InitAfterBindingsWorkaround { - initAfterBindings($scope) { - this.makeId = htmlIdGeneratorFactory.create(); - - this.triggerIntervalSize = this.watch.triggerIntervalSize; - this.triggerIntervalUnit = this.watch.triggerIntervalUnit; - - this.triggerIntervalMinimumUnit = TIME_UNITS.SECOND; - this.triggerIntervalMinimumSize = 10; - - this.timeFields = []; - this.indexSelectTouched = false; - - $scope.$watch('watchEditTitlePanel.triggerIntervalSize', (newSize) => { - this.watch.triggerIntervalSize = Number(newSize); - this.onChange(this.watch); - }); - - $scope.$watch('watchEditTitlePanel.triggerIntervalUnit', (newUnit) => { - this.watch.triggerIntervalUnit = newUnit; - this.onChange(this.watch); - }); - - $scope.$watchMulti([ - 'watchEditTitlePanel.watch.name', - 'watchEditTitlePanel.watch.timeField' - ], () => { - this.onChange(this.watch); - }); - - $scope.$watch('watchEditTitlePanel.watch.index', (newIndex) => { - if (!Boolean(newIndex) || newIndex.length === 0) { - this.watch.timeField = undefined; - this.timeFields = []; - } - }); - - $scope.$watchMulti([ - 'watchEditTitlePanel.form.$valid', - 'watchEditTitlePanel.watch.index' - ], this.updateValidity); - - $scope.$watch('watchEditTitlePanel.fields', (fields) => { - this.timeFields = Boolean(fields) - ? fields.filter( - field => VALID_NORMALIZED_TYPES.includes(field.normalizedType) - ) - : []; - this.updateValidity(); - }); - } - - get title() { - if (this.watch.isNew) { - const typeName = this.watch.typeName.toLowerCase(); - return i18n('xpack.watcher.sections.watchEdit.titlePanel.createNewTypeOfWatchTitle', { - defaultMessage: 'Create a new {typeName}', - values: { typeName }, - }); - } else { - return this.watch.name; - } - } - - get description() { - return this.watch.titleDescription; - } - - onIndexSelectTouched = () => { - this.indexSelectTouched = true; - } - - onIndexSelection = (indices) => { - this.watch.index = indices; - this.indexSelectTouched = true; - this.updateValidity(); - this.onChange(this.watch); - } - - updateValidity = () => { - const isValid = this.form.$valid && this.hasAnyValidSelectedIndices(); - - if (isValid) { - this.onValid(); - } else { - this.onInvalid(); - } - } - - hasAnySelectedIndices = () => { - if (Array.isArray(this.watch.index)) { - return this.watch.index.length > 0; - } - return Boolean(this.watch.index); - } - - hasAnyValidSelectedIndices = () => { - return this.hasAnySelectedIndices() - && Boolean(this.fields) && this.fields.length > 0; - } - - isValidationMessageVisible = (fieldName, errorType, showIfOtherErrors = true) => { - if (!this.form[fieldName]) { - return false; - } - - let showMessage = (this.form[fieldName].$touched || this.form[fieldName].$dirty) && - this.form[fieldName].$error[errorType]; - - if (showMessage && !showIfOtherErrors && size(this.form[fieldName].$error) > 1) { - showMessage = false; - } - - return showMessage; - } - - showIndexSelectionValidationState = () => { - return !this.hasAnySelectedIndices() - || this.showInvalidIndexValidationMessage() - || this.showNoTimeFieldsValidationMessage(); - } - - showRequiredIndexSelectionValidationMessage = () => { - return this.indexSelectTouched && !this.hasAnySelectedIndices(); - } - - showInvalidIndexValidationMessage = () => { - return this.hasAnySelectedIndices() - && Boolean(this.fields) && this.fields.length === 0; - } - - showNoTimeFieldsValidationMessage = () => { - return this.hasAnyValidSelectedIndices() && this.timeFields.length === 0; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/index.js deleted file mode 100644 index 24e51a6e79c724..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/index.js +++ /dev/null @@ -1,7 +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 './watch_edit_watch_execute_summary'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/watch_edit_watch_execute_summary.html b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/watch_edit_watch_execute_summary.html deleted file mode 100644 index c4a59628729a36..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/watch_edit_watch_execute_summary.html +++ /dev/null @@ -1,8 +0,0 @@ -
- - - {{ watchEditWatchExecuteSummary.watchHistoryItem.watchStatus.state }} -
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/watch_edit_watch_execute_summary.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/watch_edit_watch_execute_summary.js deleted file mode 100644 index 2182cb20d26f39..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit_watch_execute_summary/watch_edit_watch_execute_summary.js +++ /dev/null @@ -1,27 +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 { uiModules } from 'ui/modules'; -import template from './watch_edit_watch_execute_summary.html'; -import 'plugins/watcher/components/watch_state_icon'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchEditWatchExecuteSummary', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watchHistoryItem: '=' - }, - bindToController: true, - controllerAs: 'watchEditWatchExecuteSummary', - controller: class WatchEditWatchExecuteSummaryController { - constructor() {} - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/index.js deleted file mode 100644 index 531ad45dd6933d..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/index.js +++ /dev/null @@ -1,7 +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 './watch_edit_route'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts index cd054dafc34971..4f086fed8a4bba 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts +++ b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts @@ -9,6 +9,7 @@ import { toastNotifications } from 'ui/notify'; import { ACTION_TYPES } from '../../../common/constants'; import { BaseWatch } from '../../../common/types/watch_types'; import { createWatch, loadWatch } from '../../lib/api'; +import { goToWatchList } from '../../lib/navigation'; /** * Get the type from an action where a key defines its type. @@ -54,7 +55,7 @@ function createActionsForWatch(watchInstance: BaseWatch) { return watchInstance; } -export async function saveWatch(watch: BaseWatch, urlService: any, licenseService: any) { +export async function saveWatch(watch: BaseWatch, licenseService: any) { try { await createWatch(watch); toastNotifications.addSuccess( @@ -65,7 +66,7 @@ export async function saveWatch(watch: BaseWatch, urlService: any, licenseServic }, }) ); - urlService.change('/management/elasticsearch/watcher/watches', {}); + goToWatchList(); } catch (error) { return licenseService .checkValidity() @@ -73,11 +74,7 @@ export async function saveWatch(watch: BaseWatch, urlService: any, licenseServic } } -export async function validateActionsAndSaveWatch( - watch: BaseWatch, - urlService: any, - licenseService: any -) { +export async function validateActionsAndSaveWatch(watch: BaseWatch, licenseService: any) { const { warning } = watch.validate(); if (warning) { return { @@ -93,18 +90,14 @@ export async function validateActionsAndSaveWatch( }; } // client validation passed, make request to create watch - saveWatch(watch, urlService, licenseService); + return saveWatch(watch, licenseService); } -export async function onWatchSave( - watch: BaseWatch, - urlService: any, - licenseService: any -): Promise { +export async function onWatchSave(watch: BaseWatch, licenseService: any): Promise { const watchActions = watch.watch && watch.watch.actions; const watchData = watchActions ? createActionsForWatch(watch) : watch; if (!watchData.isNew) { - return validateActionsAndSaveWatch(watch, urlService, licenseService); + return validateActionsAndSaveWatch(watch, licenseService); } try { const existingWatch = await loadWatch(watchData.id); @@ -137,7 +130,7 @@ export async function onWatchSave( // Confirms watcher does not already exist return licenseService.checkValidity().then(() => { if (error.status === 404) { - return validateActionsAndSaveWatch(watchData, urlService, licenseService); + return validateActionsAndSaveWatch(watchData, licenseService); } return toastNotifications.addDanger(error.data.message); }); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.html b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.html deleted file mode 100644 index 027183a5d6b15a..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.html +++ /dev/null @@ -1,11 +0,0 @@ - -
-
- - diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.js b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.js deleted file mode 100644 index 8c9f2245a374d6..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_route.js +++ /dev/null @@ -1,129 +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 React from 'react'; -import { SavedObjectsClientProvider } from 'ui/saved_objects'; -import { render, unmountComponentAtNode } from 'react-dom'; -import routes from 'ui/routes'; -import 'ui/url'; -import { toastNotifications } from 'ui/notify'; -import template from './watch_edit_route.html'; -import 'plugins/watcher/services/watch'; -import './components/json_watch_edit'; -import { setHttpClient } from '../../lib/api'; -import './components/threshold_watch_edit'; -import { WATCH_TYPES } from 'plugins/watcher/../common/constants'; -import { updateWatchSections } from 'plugins/watcher/lib/update_management_sections'; -import { I18nContext } from 'ui/i18n'; -import 'plugins/watcher/services/license'; -import { getWatchDetailBreadcrumbs } from '../../lib/breadcrumbs'; -import { manageAngularLifecycle } from '../../lib/manage_angular_lifecycle'; -import { WatchEdit } from './components/watch_edit'; - -let elem; -const renderReact = async (elem, watchType, watchId, savedObjectsClient, urlService, licenseService) => { - render( - - - , - elem - ); -}; -routes - .when('/management/elasticsearch/watcher/watches/watch/:id/edit') - .when('/management/elasticsearch/watcher/watches/new-watch/:watchType') - .defaults( - /management\/elasticsearch\/watcher\/watches\/(new-watch\/:watchType|watch\/:id\/edit)/, - { - template: template, - k7Breadcrumbs: getWatchDetailBreadcrumbs, - controller: class WatchEditRouteController { - constructor($injector, $scope, $http, Private) { - const $route = $injector.get('$route'); - const kbnUrl = $injector.get('kbnUrl'); - const $rootScope = $injector.get('$rootScope'); - const urlService = { - change: (url) =>{ - kbnUrl.change(url); - $rootScope.$digest(); - } - }; - const licenseService = $injector.get('xpackWatcherLicenseService'); - this.watch = $route.current.locals.xpackWatch; - this.WATCH_TYPES = WATCH_TYPES; - const watchId = $route.current.params.id; - const watchType = $route.current.params.watchType; - // clean up previously rendered React app if one exists - // this happens because of React Router redirects - elem && unmountComponentAtNode(elem); - // NOTE: We depend upon Angular's $http service because it's decorated with interceptors, - // e.g. to check license status per request. - setHttpClient($http); - $scope.$$postDigest(() => { - elem = document.getElementById('watchEditReactRoot'); - const savedObjectsClient = Private(SavedObjectsClientProvider); - - renderReact(elem, watchType, watchId, savedObjectsClient, urlService, licenseService); - manageAngularLifecycle($scope, $route, elem); - }); - } - }, - controllerAs: 'watchEditRoute', - resolve: { - watchTabs: $injector => { - const $route = $injector.get('$route'); - const watchId = $route.current.params.id; - updateWatchSections(watchId); - }, - xpackWatch: function ($injector) { - const $route = $injector.get('$route'); - const watchService = $injector.get('xpackWatcherWatchService'); - const licenseService = $injector.get('xpackWatcherLicenseService'); - const kbnUrl = $injector.get('kbnUrl'); - const watchId = $route.current.params.id; - const watchType = $route.current.params.watchType; - - if (!watchId) { - return licenseService - .refreshLicense() - .then(() => { - return watchService.newWatch(watchType); - }) - .catch(err => { - return licenseService.checkValidity().then(() => { - if (err.status !== 403) { - toastNotifications.addDanger(err.data.message); - } - - kbnUrl.redirect('/management/elasticsearch/watcher/watches'); - return Promise.reject(); - }); - }); - } - - return watchService.loadWatch(watchId).catch(err => { - return licenseService.checkValidity().then(() => { - if (err.status !== 403) { - toastNotifications.addDanger(err.data.message); - } - - kbnUrl.redirect('/management/elasticsearch/watcher/watches'); - return Promise.reject(); - }); - }); - }, - checkLicense: $injector => { - const licenseService = $injector.get('xpackWatcherLicenseService'); - return licenseService.checkValidity(); - }, - }, - } - ); diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/index.js b/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/index.js deleted file mode 100644 index ddccce8fa8d9be..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/index.js +++ /dev/null @@ -1,7 +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 './watch_history_item'; diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/watch_history_item.html b/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/watch_history_item.html deleted file mode 100644 index 8a16b5fdddeeb2..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/watch_history_item.html +++ /dev/null @@ -1,26 +0,0 @@ - -
-
- -
-
- -
-
- - -
-
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/watch_history_item.js b/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/watch_history_item.js deleted file mode 100644 index 540a8df90f46e8..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item/watch_history_item.js +++ /dev/null @@ -1,38 +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 { uiModules } from 'ui/modules'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import template from './watch_history_item.html'; - -import 'plugins/watcher/components/watch_history_item_detail'; -import '../watch_history_item_watch_summary'; -import '../watch_history_item_actions_summary'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchHistoryItem', function () { - return { - restrict: 'E', - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - watchHistoryItem: '=', - }, - bindToController: true, - controllerAs: 'watchHistoryItem', - controller: class WatchHistoryItemController extends InitAfterBindingsWorkaround { - initAfterBindings() { - this.omitBreadcrumbPages = [ - 'watch', - 'history-item', - this.watch.id - ]; - this.breadcrumb = this.watch.displayName; - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/index.js b/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/index.js deleted file mode 100644 index f316a1e75e6f58..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/index.js +++ /dev/null @@ -1,7 +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 './watch_history_item_actions_summary'; diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/watch_history_item_actions_summary.html b/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/watch_history_item_actions_summary.html deleted file mode 100644 index fce54f9faa4adb..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/watch_history_item_actions_summary.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - -
-
- {{actionDetail.action.id}} -
-
-
- {{actionDetail.action.type}} -
-
-
- - {{actionDetail.actionStatus.state}} -
-
-
- {{actionDetail.actionStatus.lastExecutionReason}} -
-
diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/watch_history_item_actions_summary.js b/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/watch_history_item_actions_summary.js deleted file mode 100644 index 8e78c12e8ad008..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_actions_summary/watch_history_item_actions_summary.js +++ /dev/null @@ -1,42 +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 { find } from 'lodash'; -import { uiModules } from 'ui/modules'; -import { InitAfterBindingsWorkaround } from 'ui/compat'; -import template from './watch_history_item_actions_summary.html'; -import 'plugins/watcher/components/action_state_icon'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchHistoryItemActionsSummary', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watch: '=xpackWatch', // Property names differ due to https://git.io/vSWXV - watchHistoryItem: '=', - }, - bindToController: true, - controllerAs: 'watchHistoryItemActionsSummary', - controller: class WatchHistoryItemActionsSummaryController extends InitAfterBindingsWorkaround { - initAfterBindings() { - const actions = this.watch.actions; - const actionStatuses = this.watchHistoryItem.watchStatus.actionStatuses; - - this.actionDetails = actions.map(action => { - const actionStatus = find(actionStatuses, { id: action.id }); - - return { - action, - actionStatus - }; - }); - } - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/index.js b/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/index.js deleted file mode 100644 index e3ceb3c063320e..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/index.js +++ /dev/null @@ -1,7 +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 './watch_history_item_watch_summary'; diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/watch_history_item_watch_summary.html b/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/watch_history_item_watch_summary.html deleted file mode 100644 index 0b63aeb42562ed..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/watch_history_item_watch_summary.html +++ /dev/null @@ -1,10 +0,0 @@ -
- - - {{ watchHistoryItemWatchSummary.watchHistoryItem.watchStatus.state }} -
diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/watch_history_item_watch_summary.js b/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/watch_history_item_watch_summary.js deleted file mode 100644 index 4aeb7b46278dd4..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/components/watch_history_item_watch_summary/watch_history_item_watch_summary.js +++ /dev/null @@ -1,27 +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 { uiModules } from 'ui/modules'; -import template from './watch_history_item_watch_summary.html'; -import 'plugins/watcher/components/watch_state_icon'; - -const app = uiModules.get('xpack/watcher'); - -app.directive('watchHistoryItemWatchSummary', function () { - return { - restrict: 'E', - replace: true, - template: template, - scope: { - watchHistoryItem: '=' - }, - bindToController: true, - controllerAs: 'watchHistoryItemWatchSummary', - controller: class WatchHistoryItemWatchSummaryController { - constructor() {} - } - }; -}); diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/index.js b/x-pack/plugins/watcher/public/sections/watch_history_item/index.js deleted file mode 100644 index d299a702230b0e..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/index.js +++ /dev/null @@ -1,7 +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 './watch_history_item_route'; diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/watch_history_item_route.html b/x-pack/plugins/watcher/public/sections/watch_history_item/watch_history_item_route.html deleted file mode 100644 index 70aa78a0be7523..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/watch_history_item_route.html +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/x-pack/plugins/watcher/public/sections/watch_history_item/watch_history_item_route.js b/x-pack/plugins/watcher/public/sections/watch_history_item/watch_history_item_route.js deleted file mode 100644 index 491aaa2364cb7d..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_history_item/watch_history_item_route.js +++ /dev/null @@ -1,75 +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 routes from 'ui/routes'; -import 'ui/url'; -import { toastNotifications } from 'ui/notify'; -import template from './watch_history_item_route.html'; -import 'plugins/watcher/services/watch'; -import 'plugins/watcher/services/watch_history'; -import './components/watch_history_item'; -import { updateHistorySection } from 'plugins/watcher/lib/update_management_sections'; -import { getWatchHistoryBreadcrumbs } from '../../lib/breadcrumbs'; - -routes - .when('/management/elasticsearch/watcher/watches/watch/:watchId/history-item/:watchHistoryItemId', { - template: template, - k7Breadcrumbs: getWatchHistoryBreadcrumbs, - resolve: { - watch: function ($injector) { - const $route = $injector.get('$route'); - const watchService = $injector.get('xpackWatcherWatchService'); - const kbnUrl = $injector.get('kbnUrl'); - - const watchId = $route.current.params.watchId; - - return watchService.loadWatch(watchId) - .catch(err => { - if (err.status !== 403) { - toastNotifications.addDanger(err.data.message); - } - - kbnUrl.redirect('/management/elasticsearch/watcher/watches'); - return Promise.reject(); - }); - }, - watchHistoryItem: function ($injector) { - const $route = $injector.get('$route'); - const $filter = $injector.get('$filter'); - const moment = $filter('moment'); - const watchHistoryService = $injector.get('xpackWatcherWatchHistoryService'); - const kbnUrl = $injector.get('kbnUrl'); - - const watchId = $route.current.params.watchId; - const watchHistoryItemId = $route.current.params.watchHistoryItemId; - - return watchHistoryService.loadWatchHistoryItem(watchHistoryItemId) - .then(historyItem => { - const display = moment(historyItem.startTime); - updateHistorySection(display); - - return historyItem; - }) - .catch(err => { - if (err.status !== 403) { - toastNotifications.addDanger(err.data.message); - } - - kbnUrl.redirect(`/management/elasticsearch/watcher/watches/watch/${watchId}/status`); - return Promise.reject(); - }); - } - }, - controllerAs: 'watchHistoryItemRoute', - controller: class WatchHistoryItemRouteController { - constructor($injector) { - const $route = $injector.get('$route'); - - this.watch = $route.current.locals.watch; - this.watchHistoryItem = $route.current.locals.watchHistoryItem; - } - } - }); diff --git a/x-pack/plugins/watcher/public/sections/watch_list/index.js b/x-pack/plugins/watcher/public/sections/watch_list/index.js deleted file mode 100644 index ec52b52d00203e..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/index.js +++ /dev/null @@ -1,8 +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 './register_management_section'; -import './watch_list_route'; diff --git a/x-pack/plugins/watcher/public/sections/watch_list/index.scss b/x-pack/plugins/watcher/public/sections/watch_list/index.scss deleted file mode 100644 index d46f170c06b491..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/index.scss +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 1. Prevent inherited flexbox layout from compressing this element on IE. - */ -.watchState__message { - flex-basis: auto !important; /* 1 */ -} diff --git a/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.html b/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.html deleted file mode 100644 index 13203e912b3706..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_list/watch_list_route.html +++ /dev/null @@ -1,4 +0,0 @@ - -
-
- diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_action_status.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_action_status.tsx similarity index 92% rename from x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_action_status.tsx rename to x-pack/plugins/watcher/public/sections/watch_status/components/watch_action_status.tsx index 4874770b1c2a50..9c98069ffa3e26 100644 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_action_status.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_action_status.tsx @@ -7,7 +7,7 @@ import { InjectedIntl, injectI18n } from '@kbn/i18n/react'; import React from 'react'; import { EuiIcon } from '@elastic/eui'; -import { WATCH_STATES } from '../../../../../common/constants/watch_states'; +import { WATCH_STATES } from '../../../../common/constants/watch_states'; const WatchActionStatusUi = ({ intl, watchState }: { intl: InjectedIntl; watchState: string }) => { const stateToIcon: { [key: string]: JSX.Element } = { diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail_component.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx similarity index 98% rename from x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail_component.tsx rename to x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index a26db5ee0bfa0a..8d9391a84e8ecb 100644 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_detail_component.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -15,7 +15,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; import React, { Fragment, useEffect, useState } from 'react'; -import { fetchWatchDetail } from '../../../../lib/api'; +import { fetchWatchDetail } from '../../../lib/api'; import { WatchActionStatus } from './watch_action_status'; const WatchDetailUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }) => { diff --git a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_history_component.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx similarity index 96% rename from x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_history_component.tsx rename to x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx index 2b06a1f99074c3..f71e9a5d31dbb7 100644 --- a/x-pack/plugins/watcher/public/sections/watch_detail/components/watch_detail/watch_history_component.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx @@ -23,25 +23,18 @@ import { EuiText, EuiTitle, } from '@elastic/eui'; -import { fetchWatchDetail } from '../../../../lib/api'; -import { DeleteWatchesModal } from '../../../../components/delete_watches_modal'; +import { goToWatchList } from '../../../lib/navigation'; +import { fetchWatchDetail } from '../../../lib/api'; +import { DeleteWatchesModal } from '../../../components/delete_watches_modal'; import { WatchActionStatus } from './watch_action_status'; import { activateWatch, deactivateWatch, fetchWatchHistory, fetchWatchHistoryDetail, -} from '../../../../lib/api'; +} from '../../../lib/api'; -const WatchHistoryUI = ({ - intl, - watchId, - urlService, -}: { - intl: InjectedIntl; - watchId: string; - urlService: any; -}) => { +const WatchHistoryUI = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }) => { const [isLoading, setIsLoading] = useState(true); const [isActivated, setIsActivated] = useState(true); const [history, setWatchHistory] = useState([]); @@ -281,7 +274,7 @@ const WatchHistoryUI = ({ { if (deleted) { - urlService.redirect('/management/elasticsearch/watcher/watches'); + goToWatchList(); } setWatchesToDelete([]); }} diff --git a/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx b/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx new file mode 100644 index 00000000000000..7ddde3cddead57 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx @@ -0,0 +1,30 @@ +/* + * 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 React from 'react'; +import { EuiPageContent, EuiSpacer } from '@elastic/eui'; +import { WatchDetail } from './components/watch_detail'; +import { WatchHistory } from './components/watch_history'; + +export const WatchStatus = ({ + match: { + params: { id }, + }, +}: { + match: { + params: { + id: string; + }; + }; +}) => { + return ( + + + + + + ); +}; diff --git a/x-pack/test/functional/apps/watcher/watcher_test.js b/x-pack/test/functional/apps/watcher/watcher_test.js index f44de30e4cb6cf..3c7e24196d79be 100644 --- a/x-pack/test/functional/apps/watcher/watcher_test.js +++ b/x-pack/test/functional/apps/watcher/watcher_test.js @@ -37,9 +37,7 @@ export default function ({ getService, getPageObjects }) { await PageObjects.watcher.createWatch(watchID, updatedName); const modal = await testSubjects.find('confirmModalBodyText'); const modalText = await modal.getVisibleText(); - expect(modalText).to.be( - `Watch with ID "${watchID}" (name: "${watchName}") already exists. Do you want to overwrite it?` - ); + expect(modalText).to.be('Saving this watch will overwrite previous content.'); await testSubjects.click('confirmModalConfirmButton'); const watch = await PageObjects.watcher.getWatch(watchID); expect(watch.id).to.be(watchID); diff --git a/x-pack/test/functional/page_objects/watcher_page.js b/x-pack/test/functional/page_objects/watcher_page.js index f0758313af32b2..791e8de08f2f15 100644 --- a/x-pack/test/functional/page_objects/watcher_page.js +++ b/x-pack/test/functional/page_objects/watcher_page.js @@ -25,8 +25,8 @@ export function WatcherPageProvider({ getPageObjects, getService }) { async createWatch(watchName, name) { await testSubjects.click('createAdvancedWatchButton'); await find.setValue('#id', watchName); - await find.setValue('#name', name); - await testSubjects.click('btnSaveWatch'); + await find.setValue('#watchName', name); + await find.clickByCssSelector('[type="submit"]'); await PageObjects.header.waitUntilLoadingHasFinished(); } From 14afdec2fc86c39a04dc8bb9d172eab8ca47850a Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Sat, 20 Apr 2019 19:59:20 -0700 Subject: [PATCH 08/51] Add tooltips back to creation buttons on watch list page. (#35385) --- .../watch_list/components/watch_list.tsx | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 45437a5485c9c7..b61d9a0260b741 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -18,6 +18,7 @@ import { EuiSpacer, EuiText, EuiTitle, + EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; @@ -222,27 +223,47 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { - + } > - - + + + + - + } > - - + + + + From fe371f4ea088caf6bddacebbaab3f544c2af32ab Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Mon, 22 Apr 2019 09:16:04 -0700 Subject: [PATCH 09/51] Simplify doc links service and fix links. (#35382) --- .../documentation_links.ts | 20 ++++++------------- .../public/lib/documentation_links/index.ts | 2 +- .../make_documentation_link.ts | 18 ----------------- .../public/models/action/slack_action.js | 4 ++-- .../components/json_watch_edit_form.tsx | 4 ++-- .../components/json_watch_edit_simulate.tsx | 4 ++-- 6 files changed, 13 insertions(+), 39 deletions(-) delete mode 100644 x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.ts diff --git a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts index 19ca2689e4cd1c..c5bd1c2f53c824 100644 --- a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts +++ b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts @@ -4,18 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { makeDocumentationLink } from './make_documentation_link'; +import { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } from 'ui/documentation_links'; -export const documentationLinks = { - watcher: { - putWatchApi: makeDocumentationLink( - '{baseUrl}guide/en/elasticsearch/reference/{urlVersion}/watcher-api-put-watch.html' - ), - executeWatchApi: makeDocumentationLink( - '{baseUrl}guide/en/elasticsearch/reference/{urlVersion}/watcher-api-execute-watch.html#watcher-api-execute-watch-action-mode' - ), - watchNotificationSettings: makeDocumentationLink( - '{baseUrl}guide/en/elasticsearch/reference/{urlVersion}/notification-settings.html#slack-notification-settings' - ), - }, -}; +const esBase = `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/reference/${DOC_LINK_VERSION}`; + +export const putWatchApiUrl = `${esBase}/watcher-api-put-watch.html`; +export const executeWatchApiUrl = `${esBase}/watcher-api-execute-watch.html#watcher-api-execute-watch-action-mode`; +export const watchNotificationSettingsUrl = `${esBase}/notification-settings.html#slack-notification-settings`; diff --git a/x-pack/plugins/watcher/public/lib/documentation_links/index.ts b/x-pack/plugins/watcher/public/lib/documentation_links/index.ts index 98a45e81f4e70a..81e0c494e28b3d 100644 --- a/x-pack/plugins/watcher/public/lib/documentation_links/index.ts +++ b/x-pack/plugins/watcher/public/lib/documentation_links/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { documentationLinks } from './documentation_links'; +export * from './documentation_links'; diff --git a/x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.ts b/x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.ts deleted file mode 100644 index bcd0880a7324cb..00000000000000 --- a/x-pack/plugins/watcher/public/lib/documentation_links/make_documentation_link.ts +++ /dev/null @@ -1,18 +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 semver from 'semver'; -import { metadata } from 'ui/metadata'; - -const major = semver.major(metadata.version); -const minor = semver.minor(metadata.version); - -const urlVersion = `${major}.${minor}`; -const baseUrl = 'https://www.elastic.co/'; - -export function makeDocumentationLink(linkTemplate: string) { - return linkTemplate.replace('{baseUrl}', baseUrl).replace('{urlVersion}', urlVersion); -} diff --git a/x-pack/plugins/watcher/public/models/action/slack_action.js b/x-pack/plugins/watcher/public/models/action/slack_action.js index 2cbfa27b2ca7a0..5072d1ab744bdb 100644 --- a/x-pack/plugins/watcher/public/models/action/slack_action.js +++ b/x-pack/plugins/watcher/public/models/action/slack_action.js @@ -10,7 +10,7 @@ import { BaseAction } from './base_action'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiCode, EuiLink } from '@elastic/eui'; -import { documentationLinks } from '../../lib/documentation_links'; +import { watchNotificationSettingsUrl } from '../../lib/documentation_links'; export class SlackAction extends BaseAction { constructor(props = {}) { @@ -34,7 +34,7 @@ export class SlackAction extends BaseAction { values={{ ymlValue: message_defaults, link: ( - + { defaultMessage: 'Watch JSON', })}{' '} ( - + {i18n.translate('xpack.watcher.sections.watchEdit.json.form.watchJsonDocLink', { defaultMessage: 'Syntax', })} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx index c8d45d7ccc2909..cc12c842aff544 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx @@ -31,7 +31,7 @@ import { ACTION_MODES, TIME_UNITS } from '../../../../common/constants'; import { ExecutedWatchDetails, ExecutedWatchResults } from '../../../../common/types/watch_types'; import { ErrableFormRow } from '../../../components/form_errors'; import { executeWatch } from '../../../lib/api'; -import { documentationLinks } from '../../../lib/documentation_links'; +import { executeWatchApiUrl } from '../../../lib/documentation_links'; import { WatchContext } from '../../../sections/watch_edit/components/watch_context'; import { timeUnits } from '../time_units'; import { JsonWatchEditSimulateResults } from './json_watch_edit_simulate_results'; @@ -369,7 +369,7 @@ export const JsonWatchEditSimulate = ({ defaultMessage="Allow the watch to execute or skip actions. {actionsLink}" values={{ actionsLink: ( - + {i18n.translate( 'xpack.watcher.sections.watchEdit.simulate.form.actionOverridesDescription.linkLabel', { From 5faec7bbb4bcc86716078c2de149f48f51b3610e Mon Sep 17 00:00:00 2001 From: Bill McConaghy Date: Tue, 23 Apr 2019 09:13:08 -0400 Subject: [PATCH 10/51] adding watch visualization (#35404) * adding watch visualization * fixing tsc errors * rendering multiple lines when a terms agg is used * responding to PR feedback * fixing React warning * adding missing var --- package.json | 1 + x-pack/plugins/watcher/public/lib/api.ts | 7 + .../plugins/watcher/public/models/index.d.ts | 10 + .../components/threshold_watch_edit.tsx | 5 +- .../components/watch_visualization.tsx | 198 ++++++++++++++++++ .../watcher/public/services/timezone/index.js | 7 - .../xpack_watcher_timezone_service.factory.js | 14 -- .../xpack_watcher_timezone_service.js | 31 --- yarn.lock | 142 ++++++++++++- 9 files changed, 357 insertions(+), 58 deletions(-) create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx delete mode 100644 x-pack/plugins/watcher/public/services/timezone/index.js delete mode 100644 x-pack/plugins/watcher/public/services/timezone/xpack_watcher_timezone_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/timezone/xpack_watcher_timezone_service.js diff --git a/package.json b/package.json index a21442104283de..3d0f12a263e1e9 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,7 @@ "@babel/core": "^7.3.4", "@babel/polyfill": "^7.2.5", "@babel/register": "^7.0.0", + "@elastic/charts": "^3.11.2", "@elastic/datemath": "5.0.2", "@elastic/eui": "9.9.0", "@elastic/filesaver": "1.1.2", diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index d1ed0e7919ff50..fe3fd522fea118 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -138,3 +138,10 @@ export const loadIndexPatterns = async () => { }); return savedObjects; }; +export const getWatchVisualizationData = async (watchModel: BaseWatch, visualizeOptions: any) => { + const response = await getHttpClient().post(`${basePath}/watch/visualize`, { + watch: watchModel.upstreamJson, + options: visualizeOptions.upstreamJson, + }); + return response.data; +}; diff --git a/x-pack/plugins/watcher/public/models/index.d.ts b/x-pack/plugins/watcher/public/models/index.d.ts index 10ffa05ec7ff95..12fbeaec4d1497 100644 --- a/x-pack/plugins/watcher/public/models/index.d.ts +++ b/x-pack/plugins/watcher/public/models/index.d.ts @@ -3,12 +3,18 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +declare module 'plugins/watcher/models/visualize_options' { + export const VisualizeOptions: any; +} + declare module 'plugins/watcher/models/watch' { export const Watch: any; } + declare module 'plugins/watcher/models/watch/threshold_watch' { export const ThresholdWatch: any; } + declare module 'plugins/watcher/models/watch/json_watch' { export const JsonWatch: any; } @@ -29,3 +35,7 @@ declare module '@elastic/eui' { export const EuiCodeEditor: React.SFC; export const EuiDescribedFormGroup: React.SFC; } + +declare module 'ui/time_buckets' { + export const TimeBuckets: any; +} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx index 77c283cc93fbae..14e10feb63573a 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx @@ -36,6 +36,7 @@ import { comparators } from '../comparators'; import { timeUnits } from '../time_units'; import { onWatchSave, saveWatch } from '../watch_edit_actions'; import { WatchContext } from './watch_context'; +import { WatchVisualization } from './watch_visualization'; import { LicenseServiceContext } from '../../../license_service_context'; const firstFieldOption = { text: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel', { @@ -159,6 +160,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit const hasExpressionErrors = !!Object.keys(errors).find( errorKey => expressionFields.includes(errorKey) && errors[errorKey].length >= 1 ); + const shouldShowThresholdExpression = watch.index && watch.index.length > 0 && watch.timeField; return ( @@ -359,7 +361,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit
- {watch.index && watch.index.length > 0 ? ( + {shouldShowThresholdExpression ? ( {hasExpressionErrors ? ( @@ -750,6 +752,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit + {hasErrors ? null : } ) : null} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx new file mode 100644 index 00000000000000..890e284fea6a8c --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx @@ -0,0 +1,198 @@ +/* + * 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 React, { Fragment, useContext, useEffect, useState } from 'react'; +import '@elastic/charts/dist/style.css'; +import { + Axis, + CustomSeriesColorsMap, + DARK_THEME, + DataSeriesColorsValues, + getAxisId, + getSpecId, + Chart, + LIGHT_THEME, + LineSeries, + Position, + ScaleType, + Settings, +} from '@elastic/charts'; +import { debounce } from 'lodash'; +import { TimeBuckets } from 'ui/time_buckets'; +import dateMath from '@elastic/datemath'; +import chrome from 'ui/chrome'; +import moment from 'moment-timezone'; +import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; +import { VisualizeOptions } from 'plugins/watcher/models/visualize_options'; +import { getWatchVisualizationData } from '../../../lib/api'; +import { WatchContext } from './watch_context'; +import { aggTypes } from '../../../models/watch/agg_types'; +const getChartTheme = () => { + const isDarkTheme = chrome.getUiSettingsClient().get('theme:darkMode'); + const baseTheme = isDarkTheme ? DARK_THEME : LIGHT_THEME; + + return { + ...baseTheme, + lineSeriesStyle: { + ...baseTheme.lineSeriesStyle, + line: { + ...baseTheme.lineSeriesStyle.line, + strokeWidth: 3, + }, + point: { + ...baseTheme.lineSeriesStyle.point, + visible: false, + }, + }, + }; +}; +const getTimezone = () => { + const config = chrome.getUiSettingsClient(); + const DATE_FORMAT_CONFIG_KEY = 'dateFormat:tz'; + const isCustomTimezone = !config.isDefault(DATE_FORMAT_CONFIG_KEY); + if (isCustomTimezone) { + return config.get(DATE_FORMAT_CONFIG_KEY); + } + + const detectedTimezone = moment.tz.guess(); + if (detectedTimezone) { + return detectedTimezone; + } + // default to UTC if we can't figure out the timezone + const tzOffset = moment().format('Z'); + return tzOffset; +}; + +const getDomain = (watch: any) => { + const VISUALIZE_TIME_WINDOW_MULTIPLIER = 5; + const fromExpression = `now-${watch.timeWindowSize * VISUALIZE_TIME_WINDOW_MULTIPLIER}${ + watch.timeWindowUnit + }`; + const toExpression = 'now'; + const fromMoment = dateMath.parse(fromExpression); + const toMoment = dateMath.parse(toExpression); + const visualizeTimeWindowFrom = fromMoment ? fromMoment.valueOf() : 0; + const visualizeTimeWindowTo = toMoment ? toMoment.valueOf() : 0; + return { + min: visualizeTimeWindowFrom, + max: visualizeTimeWindowTo, + }; +}; + +const getTimeBuckets = (watch: any) => { + const domain = getDomain(watch); + const timeBuckets = new TimeBuckets(); + timeBuckets.setBounds(domain); + return timeBuckets; +}; + +const loadWatchVisualizationData = debounce(async (watch: any, setWatchVisualizationData: any) => { + const domain = getDomain(watch); + const timeBuckets = new TimeBuckets(); + timeBuckets.setBounds(domain); + const interval = timeBuckets.getInterval().expression; + const visualizeOptions = new VisualizeOptions({ + rangeFrom: domain.min, + rangeTo: domain.max, + interval, + timezone: getTimezone(), + }); + const { visualizeData } = (await getWatchVisualizationData(watch, visualizeOptions)) as any; + setWatchVisualizationData(visualizeData || {}); +}, 500); + +const WatchVisualizationUi = () => { + const { watch } = useContext(WatchContext); + const [watchVisualizationData, setWatchVisualizationData] = useState({}); + + useEffect( + () => { + loadWatchVisualizationData(watch, setWatchVisualizationData); + }, + [watch] + ); + + const timezone = getTimezone(); + const dateFormatter = (d: number) => { + return moment(d) + .tz(timezone) + .format(getTimeBuckets(watch).getScaledDateFormat()); + }; + const aggLabel = aggTypes[watch.aggType].text; + const thresholdCustomSeriesColors: CustomSeriesColorsMap = new Map(); + const thresholdDataSeriesColorValues: DataSeriesColorsValues = { + colorValues: [], + specId: getSpecId('threshold'), + }; + thresholdCustomSeriesColors.set(thresholdDataSeriesColorValues, '#BD271E'); + const domain = getDomain(watch); + const watchVisualizationDataKeys = Object.keys(watchVisualizationData); + return ( + + + {watchVisualizationDataKeys.length ? ( + + + + + {watchVisualizationDataKeys.map((key: string) => { + return ( + + ); + })} + + + ) : ( + + } + color="warning" + > + + + )} + + + ); +}; +export const WatchVisualization = injectI18n(WatchVisualizationUi); diff --git a/x-pack/plugins/watcher/public/services/timezone/index.js b/x-pack/plugins/watcher/public/services/timezone/index.js deleted file mode 100644 index 00ad01e232a320..00000000000000 --- a/x-pack/plugins/watcher/public/services/timezone/index.js +++ /dev/null @@ -1,7 +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 './xpack_watcher_timezone_service.factory'; diff --git a/x-pack/plugins/watcher/public/services/timezone/xpack_watcher_timezone_service.factory.js b/x-pack/plugins/watcher/public/services/timezone/xpack_watcher_timezone_service.factory.js deleted file mode 100644 index 6d85e7b35bf12f..00000000000000 --- a/x-pack/plugins/watcher/public/services/timezone/xpack_watcher_timezone_service.factory.js +++ /dev/null @@ -1,14 +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 { uiModules } from 'ui/modules'; -import { XpackWatcherTimezoneService } from './xpack_watcher_timezone_service'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherTimezoneService', ($injector) => { - const config = $injector.get('config'); - return new XpackWatcherTimezoneService(config); - }); diff --git a/x-pack/plugins/watcher/public/services/timezone/xpack_watcher_timezone_service.js b/x-pack/plugins/watcher/public/services/timezone/xpack_watcher_timezone_service.js deleted file mode 100644 index 7f93427fdcc69f..00000000000000 --- a/x-pack/plugins/watcher/public/services/timezone/xpack_watcher_timezone_service.js +++ /dev/null @@ -1,31 +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 moment from 'moment-timezone'; - -export class XpackWatcherTimezoneService { - constructor(config) { - this.config = config; - } - - getTimezone() { - const DATE_FORMAT_CONFIG_KEY = 'dateFormat:tz'; - const isCustomTimezone = !this.config.isDefault(DATE_FORMAT_CONFIG_KEY); - if (isCustomTimezone) { - return this.config.get(DATE_FORMAT_CONFIG_KEY); - } - - const detectedTimezone = moment.tz.guess(); - if (detectedTimezone) { - return detectedTimezone; - } - - const tzOffset = moment().format('Z'); - return tzOffset; - } -} - - diff --git a/yarn.lock b/yarn.lock index 3f503637eb4d2f..20ad4a9581c0e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1317,6 +1317,32 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@elastic/charts@^3.11.2": + version "3.11.2" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-3.11.2.tgz#3644eeb7c0d17d6c368cfb380c2d2ef268655d72" + integrity sha512-ILU4ijT5GZC4usnbab/IVq1brQ6tFgkfBPwa4ixRtN5TlS+BWjPPVPFfIO3j4K9PijXE6XISfs8L2HkH1IDdtA== + dependencies: + "@types/d3-shape" "^1.3.1" + "@types/luxon" "^1.11.1" + classnames "^2.2.6" + d3-array "^2.0.3" + d3-collection "^1.0.7" + d3-scale "^2.2.2" + d3-shape "^1.3.4" + fp-ts "^1.14.2" + konva "^2.6.0" + lodash "^4.17.11" + luxon "^1.11.3" + mobx "^4.9.2" + mobx-react "^5.4.3" + newtype-ts "^0.2.4" + prop-types "^15.7.2" + react "^16.8.3" + react-dom "^16.8.3" + react-konva "16.8.3" + react-spring "^8.0.8" + resize-observer-polyfill "^1.5.1" + "@elastic/eui@0.0.23": version "0.0.23" resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-0.0.23.tgz#01a3d88aeaff175da5d42b70d407d08a32783f3d" @@ -3108,6 +3134,11 @@ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w== +"@types/luxon@^1.11.1": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-1.12.0.tgz#acf14294d18e6eba427a5e5d7dfce0f5cd2a9400" + integrity sha512-+UzPmwHSEEyv7aGlNkVpuFxp/BirXgl8NnPGCtmyx2KXIzAapoW3IqSVk87/Z3PUk8vEL8Pe1HXEMJbNBOQgtg== + "@types/mime-db@*": version "1.27.0" resolved "https://registry.yarnpkg.com/@types/mime-db/-/mime-db-1.27.0.tgz#9bc014a1fd1fdf47649c1a54c6dd7966b8284792" @@ -7064,7 +7095,7 @@ classnames@2.2.5, classnames@2.x, classnames@^2.2.4: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" integrity sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0= -classnames@^2.2.3, classnames@^2.2.5: +classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== @@ -8469,7 +8500,7 @@ d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== -d3-array@^2.0.2: +d3-array@^2.0.2, d3-array@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.0.3.tgz#9c0531eda701e416f28a030e3d4e6179ba74f19f" integrity sha512-C7g4aCOoJa+/K5hPVqZLG8wjYHsTUROTk7Z1Ep9F4P5l+WVrvV0+6nAZ1wKTRLMhFWpGbozxUpyjIPZYAaLi+g== @@ -8645,7 +8676,7 @@ d3-scale@^1.0.5: d3-time "1" d3-time-format "2" -d3-scale@^2.1.2: +d3-scale@^2.1.2, d3-scale@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== @@ -8671,6 +8702,13 @@ d3-shape@^1.2.2: dependencies: d3-path "1" +d3-shape@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.5.tgz#e81aea5940f59f0a79cfccac012232a8987c6033" + integrity sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg== + dependencies: + d3-path "1" + d3-time-format@2, d3-time-format@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.3.tgz#ae06f8e0126a9d60d6364eac5b1533ae1bac826b" @@ -11531,6 +11569,11 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.12.0.tgz#d333310e4ac104cdcb6bea47908e381bb09978e7" integrity sha512-fWwnAgVlTsV26Ruo9nx+fxNHIm6l1puE1VJ/C0XJ3nRQJJJIgRHYw6sigB3MuNFZL1o4fpGlhwFhcbxHK0RsOA== +fp-ts@^1.14.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.17.0.tgz#289127353ddbb4622ada1920d4ad6643182c1f1f" + integrity sha512-nBq25aCAMbCwVLobUUuM/MZihPKyjn0bCVBf6xMAGriHlf8W8Ze9UhyfLnbmfp0ekFTxMuTfLXrCzpJ34px7PQ== + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -13300,7 +13343,7 @@ hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0, hoist-non-react- resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== @@ -15895,6 +15938,11 @@ known-css-properties@^0.3.0: resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4" integrity sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ== +konva@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/konva/-/konva-2.6.0.tgz#43165b95e32a4378ce532d9113c914f4998409c3" + integrity sha512-LCOoavICTD9PYoAqtWo8sbxYtCiXdgEeY7vj/Sq8b2bwFmrQr9Ak0RkD4/jxAf5fcUQRL5e1zPLyfRpVndp20A== + kopy@^8.2.0: version "8.2.5" resolved "https://registry.yarnpkg.com/kopy/-/kopy-8.2.5.tgz#6c95f312e981ab917680d7e5de3cdf29a1bf221f" @@ -16874,6 +16922,11 @@ lru-queue@0.1: dependencies: es5-ext "~0.10.2" +luxon@^1.11.3: + version "1.12.1" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.12.1.tgz#924bd61404f70b0cc5168918cb0ac108e52aacc4" + integrity sha512-Zv/qJb2X1ESTrlniAViWx2aqGwi2cVpeoZFTbPdPiCu4EsadKsmb/QCH8HQjMUpDZKKJIHKHsJxV5Rwpq47HKQ== + lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" @@ -17552,6 +17605,19 @@ mkdirp@^0.3.5, mkdirp@~0.3.5: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= +mobx-react@^5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-5.4.3.tgz#6709b7dd89670c40e9815914ac2ca49cc02bfb47" + integrity sha512-WC8yFlwvJ91hy8j6CrydAuFteUafcuvdITFQeHl3LRIf5ayfT/4W3M/byhEYD2BcJWejeXr8y4Rh2H26RunCRQ== + dependencies: + hoist-non-react-statics "^3.0.0" + react-lifecycles-compat "^3.0.2" + +mobx@^4.9.2: + version "4.9.4" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-4.9.4.tgz#bb37a0e4e05f0b02be89ced9d23445cad73377ad" + integrity sha512-RaEpydw7D1ebp1pdFHrEMZcLk4nALAZyHAroCPQpqLzuIXIxJpLmMIe5PUZwYHqvlcWL6DVqDYCANZpPOi9iXA== + mocha@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.3.0.tgz#d29b7428d3f52c82e2e65df1ecb7064e1aabbfb5" @@ -17617,6 +17683,11 @@ moment@^2.10.6: resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" integrity sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ== +monocle-ts@^1.0.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/monocle-ts/-/monocle-ts-1.7.1.tgz#03a615938aa90983a4fa29749969d30f72d80ba1" + integrity sha512-X9OzpOyd/R83sYex8NYpJjUzi/MLQMvGNVfxDYiIvs+QMXMEUDwR61MQoARFN10Cqz5h/mbFSPnIQNUIGhYd2Q== + monotone-convex-hull-2d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz#47f5daeadf3c4afd37764baa1aa8787a40eee08c" @@ -17848,6 +17919,14 @@ nested-object-assign@^1.0.1: resolved "https://registry.yarnpkg.com/nested-object-assign/-/nested-object-assign-1.0.3.tgz#5aca69390d9affe5a612152b5f0843ae399ac597" integrity sha512-kgq1CuvLyUcbcIuTiCA93cQ2IJFSlRwXcN+hLcb2qLJwC2qrePHGZZa7IipyWqaWF6tQjdax2pQnVxdq19Zzwg== +newtype-ts@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/newtype-ts/-/newtype-ts-0.2.4.tgz#a02a8f160a3d179f871848d687a93de73a964a41" + integrity sha512-HrzPdG0+0FK1qHbc3ld/HXu252OYgmN993bFxUtZ6NFCLUk1eq+yKwdvP07BblXQibGqMWNXBUrNoLUq23Ma2Q== + dependencies: + fp-ts "^1.0.0" + monocle-ts "^1.0.0" + next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -19815,7 +19894,7 @@ prop-types@^15.5.7: loose-envify "^1.3.1" object-assign "^4.1.1" -prop-types@^15.6.0, prop-types@^15.6.2: +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -20518,6 +20597,16 @@ react-dom@^16.8.1: prop-types "^15.6.2" scheduler "^0.13.5" +react-dom@^16.8.3: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f" + integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.6" + react-draggable@3.x, "react-draggable@^2.2.6 || ^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-3.0.5.tgz#c031e0ed4313531f9409d6cd84c8ebcec0ddfe2d" @@ -20666,6 +20755,14 @@ react-is@~16.3.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22" integrity sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q== +react-konva@16.8.3: + version "16.8.3" + resolved "https://registry.yarnpkg.com/react-konva/-/react-konva-16.8.3.tgz#e55390040ea54675a0ef0d40b4fa93731e6d7b03" + integrity sha512-gU36TBxcPZANQOV5prAFnpRSNp2ikAT7zCICHTBJvOzAfa8Yhcyaey6EIrD+NTT/4y0PyGFBIkmWq6zdrlNrQg== + dependencies: + react-reconciler "^0.20.1" + scheduler "^0.13.3" + react-lib-adler32@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/react-lib-adler32/-/react-lib-adler32-1.0.1.tgz#01f7a0e24fe715580aadb8a827c39a850e1ccc4e" @@ -20756,6 +20853,16 @@ react-portal@^3.2.0: dependencies: prop-types "^15.5.8" +react-reconciler@^0.20.1: + version "0.20.4" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.20.4.tgz#3da6a95841592f849cb4edd3d38676c86fd920b2" + integrity sha512-kxERc4H32zV2lXMg/iMiwQHOtyqf15qojvkcZ5Ja2CPkjVohHw9k70pdDBwrnQhLVetUJBSYyqU3yqrlVTOajA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.6" + react-redux-request@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/react-redux-request/-/react-redux-request-1.5.6.tgz#8c514dc88264d225e113b4b54a265064e8020651" @@ -20906,6 +21013,13 @@ react-sizeme@^2.3.6: invariant "^2.2.2" lodash "^4.17.4" +react-spring@^8.0.8: + version "8.0.19" + resolved "https://registry.yarnpkg.com/react-spring/-/react-spring-8.0.19.tgz#62f4f396b4b73fa402838200a1c80374338cb12e" + integrity sha512-DjrwjXqqVEitj6e6GqdW5dUp1BoVyeFQhEcXvPfoQxwyIVSJ9smNt8CNjSvoQqRujVllE7XKaJRWSZO/ewd1/A== + dependencies: + "@babel/runtime" "^7.3.1" + react-sticky@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/react-sticky/-/react-sticky-6.0.3.tgz#7a18b643e1863da113d7f7036118d2a75d9ecde4" @@ -21054,6 +21168,16 @@ react@^16.8.1: prop-types "^15.6.2" scheduler "^0.13.5" +react@^16.8.3: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" + integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.6" + reactcss@1.2.3, reactcss@^1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd" @@ -22401,6 +22525,14 @@ scheduler@^0.13.2: loose-envify "^1.1.0" object-assign "^4.1.1" +scheduler@^0.13.3, scheduler@^0.13.6: + version "0.13.6" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" + integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler@^0.13.5: version "0.13.5" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.5.tgz#b7226625167041298af3b98088a9dbbf6d7733a8" From 3e1767b6be661e0b340c12122fbbf1baef99b955 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Tue, 23 Apr 2019 11:51:24 -0700 Subject: [PATCH 11/51] [Watcher] Handle 403 and 404 in Status and Edit routes and fix breadcrumbs (#35444) * Add useRequest custom hook and convert WatchList, WatchHistory, and WatchDetail to consume it. * Internationalize de/activate button and timespan select in WatchList. * Add getPageErrorCode, PageError, and PageErrorNotExist, and use these to surface 403 and 404 errors. * Fix breadcrumbs. --- src/legacy/ui/public/management/index.d.ts | 1 + .../public/components/page_error/index.ts | 7 + .../components/page_error/page_error.tsx | 38 ++++ .../page_error/page_error_forbidden.tsx | 27 +++ .../page_error/page_error_not_exist.tsx | 36 ++++ x-pack/plugins/watcher/public/lib/api.ts | 71 ++++--- .../plugins/watcher/public/lib/breadcrumbs.js | 49 ----- .../plugins/watcher/public/lib/breadcrumbs.ts | 32 +++ .../plugins/watcher/public/lib/use_request.ts | 121 +++++++++++ .../plugins/watcher/public/register_route.js | 3 - .../watch_edit/components/watch_edit.tsx | 84 +++++++- .../watch_list/components/watch_list.tsx | 67 ++++-- .../watch_status/components/watch_detail.tsx | 33 ++- .../watch_status/components/watch_history.tsx | 199 +++++++++--------- .../sections/watch_status/watch_status.tsx | 13 +- 15 files changed, 557 insertions(+), 224 deletions(-) create mode 100644 x-pack/plugins/watcher/public/components/page_error/index.ts create mode 100644 x-pack/plugins/watcher/public/components/page_error/page_error.tsx create mode 100644 x-pack/plugins/watcher/public/components/page_error/page_error_forbidden.tsx create mode 100644 x-pack/plugins/watcher/public/components/page_error/page_error_not_exist.tsx delete mode 100644 x-pack/plugins/watcher/public/lib/breadcrumbs.js create mode 100644 x-pack/plugins/watcher/public/lib/breadcrumbs.ts create mode 100644 x-pack/plugins/watcher/public/lib/use_request.ts diff --git a/src/legacy/ui/public/management/index.d.ts b/src/legacy/ui/public/management/index.d.ts index ed4658f82dea38..02e98b30f59048 100644 --- a/src/legacy/ui/public/management/index.d.ts +++ b/src/legacy/ui/public/management/index.d.ts @@ -28,4 +28,5 @@ declare module 'ui/management' { allowOverride: boolean ): void; export const management: any; // TODO - properly provide types + export const MANAGEMENT_BREADCRUMB: any; } diff --git a/x-pack/plugins/watcher/public/components/page_error/index.ts b/x-pack/plugins/watcher/public/components/page_error/index.ts new file mode 100644 index 00000000000000..cf350b1b989817 --- /dev/null +++ b/x-pack/plugins/watcher/public/components/page_error/index.ts @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export { getPageErrorCode, PageError } from './page_error'; diff --git a/x-pack/plugins/watcher/public/components/page_error/page_error.tsx b/x-pack/plugins/watcher/public/components/page_error/page_error.tsx new file mode 100644 index 00000000000000..429adccfe2acd8 --- /dev/null +++ b/x-pack/plugins/watcher/public/components/page_error/page_error.tsx @@ -0,0 +1,38 @@ +/* + * 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 React from 'react'; + +import { PageErrorNotExist } from './page_error_not_exist'; +import { PageErrorForbidden } from './page_error_forbidden'; + +export function getPageErrorCode(errorOrErrors: any) { + const errors = Array.isArray(errorOrErrors) ? errorOrErrors : [errorOrErrors]; + const firstError = errors.find((error: any) => { + if (error) { + return [403, 404].includes(error.status); + } + + return false; + }); + + if (firstError) { + return firstError.status; + } +} + +export function PageError({ errorCode, id }: { errorCode?: any; id?: any }) { + switch (errorCode) { + case 404: + return ; + + case 403: + default: + return ; + } + + return null; +} diff --git a/x-pack/plugins/watcher/public/components/page_error/page_error_forbidden.tsx b/x-pack/plugins/watcher/public/components/page_error/page_error_forbidden.tsx new file mode 100644 index 00000000000000..1561660aaee80d --- /dev/null +++ b/x-pack/plugins/watcher/public/components/page_error/page_error_forbidden.tsx @@ -0,0 +1,27 @@ +/* + * 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 React from 'react'; + +import { EuiEmptyPrompt } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; + +export function PageErrorForbidden() { + return ( + + +
+ } + /> + ); +} diff --git a/x-pack/plugins/watcher/public/components/page_error/page_error_not_exist.tsx b/x-pack/plugins/watcher/public/components/page_error/page_error_not_exist.tsx new file mode 100644 index 00000000000000..662ecaafadbb40 --- /dev/null +++ b/x-pack/plugins/watcher/public/components/page_error/page_error_not_exist.tsx @@ -0,0 +1,36 @@ +/* + * 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 React from 'react'; + +import { EuiEmptyPrompt } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; + +export function PageErrorNotExist({ id }: { id: any }) { + return ( + + + + } + body={ +

+ +

+ } + /> + ); +} diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index fe3fd522fea118..642f57ae020fc6 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -11,56 +11,69 @@ import { __await } from 'tslib'; import chrome from 'ui/chrome'; import { ROUTES } from '../../common/constants'; import { BaseWatch, ExecutedWatchDetails } from '../../common/types/watch_types'; +import { useRequest } from './use_request'; let httpClient: ng.IHttpService; + export const setHttpClient = (anHttpClient: ng.IHttpService) => { httpClient = anHttpClient; }; + export const getHttpClient = () => { return httpClient; }; + let savedObjectsClient: any; + export const setSavedObjectsClient = (aSavedObjectsClient: any) => { savedObjectsClient = aSavedObjectsClient; }; + export const getSavedObjectsClient = () => { return savedObjectsClient; }; + const basePath = chrome.addBasePath(ROUTES.API_ROOT); -export const fetchWatches = async () => { - const { - data: { watches }, - } = await getHttpClient().get(`${basePath}/watches`); - return watches.map((watch: any) => { - return Watch.fromUpstreamJson(watch); + +export const loadWatches = (interval: number) => { + return useRequest({ + path: `${basePath}/watches`, + method: 'get', + interval, + processData: ({ watches }: { watches: any }) => + watches.map((watch: any) => Watch.fromUpstreamJson(watch)), }); }; -export const fetchWatchDetail = async (id: string) => { - const { - data: { watch }, - } = await getHttpClient().get(`${basePath}/watch/${id}`); - return Watch.fromUpstreamJson(watch); +export const loadWatchDetail = (id: string) => { + return useRequest({ + path: `${basePath}/watch/${id}`, + method: 'get', + processData: ({ watch }: { watch: any }) => Watch.fromUpstreamJson(watch), + }); }; -export const fetchWatchHistoryDetail = async (id: string) => { - const { - data: { watchHistoryItem }, - } = await getHttpClient().get(`${basePath}/history/${id}`); - const item = WatchHistoryItem.fromUpstreamJson(watchHistoryItem); - return item; -}; +export const loadWatchHistory = (id: string, startTime: string) => { + let path = `${basePath}/watch/${id}/history`; -export const fetchWatchHistory = async (id: string, startTime: string) => { - let url = `${basePath}/watch/${id}/history`; if (startTime) { - url += `?startTime=${startTime}`; + path += `?startTime=${startTime}`; } - const result: any = await getHttpClient().get(url); - const items: any = result.data.watchHistoryItems; - return items.map((historyItem: any) => { - const item = WatchHistoryItem.fromUpstreamJson(historyItem); - return item; + + return useRequest({ + path, + method: 'get', + processData: ({ watchHistoryItems: items }: { watchHistoryItems: any }) => + items.map((historyItem: any) => WatchHistoryItem.fromUpstreamJson(historyItem)), + }); +}; + +export const loadWatchHistoryDetail = (id: string | undefined) => { + return useRequest({ + path: !id ? undefined : `${basePath}/history/${id}`, + method: 'get', + processData: ({ watchHistoryItem }: { watchHistoryItem: any }) => + WatchHistoryItem.fromUpstreamJson(watchHistoryItem), }); }; @@ -97,10 +110,12 @@ export const fetchWatch = async (watchId: string) => { } = await getHttpClient().post(`${basePath}/watches/`, body); return results; }; + export const loadWatch = async (id: string) => { const { data: watch } = await getHttpClient().get(`${basePath}/watch/${id}`); return Watch.fromUpstreamJson(watch.watch); }; + export const getMatchingIndices = async (pattern: string) => { if (!pattern.startsWith('*')) { pattern = `*${pattern}`; @@ -113,16 +128,19 @@ export const getMatchingIndices = async (pattern: string) => { } = await getHttpClient().post(`${basePath}/indices`, { pattern }); return indices; }; + export const fetchFields = async (indexes: string[]) => { const { data: { fields }, } = await getHttpClient().post(`${basePath}/fields`, { indexes }); return fields; }; + export const createWatch = async (watch: BaseWatch) => { const { data } = await getHttpClient().put(`${basePath}/watch/${watch.id}`, watch.upstreamJson); return data; }; + export const executeWatch = async (executeWatchDetails: ExecutedWatchDetails, watch: BaseWatch) => { const { data } = await getHttpClient().put(`${basePath}/watch/execute`, { executeDetails: executeWatchDetails.upstreamJson, @@ -130,6 +148,7 @@ export const executeWatch = async (executeWatchDetails: ExecutedWatchDetails, wa }); return data; }; + export const loadIndexPatterns = async () => { const { savedObjects } = await getSavedObjectsClient().find({ type: 'index-pattern', diff --git a/x-pack/plugins/watcher/public/lib/breadcrumbs.js b/x-pack/plugins/watcher/public/lib/breadcrumbs.js deleted file mode 100644 index c30bc4175375a3..00000000000000 --- a/x-pack/plugins/watcher/public/lib/breadcrumbs.js +++ /dev/null @@ -1,49 +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 chrome from 'ui/chrome'; -import { i18n } from '@kbn/i18n'; - -import { MANAGEMENT_BREADCRUMB } from 'ui/management'; - -const uiSettings = chrome.getUiSettingsClient(); - -export function getWatchListBreadcrumbs() { - return [ - MANAGEMENT_BREADCRUMB, - { - text: i18n.translate('xpack.watcher.list.breadcrumb', { - defaultMessage: 'Watcher' - }), - href: '#/management/elasticsearch/watcher/watches/' - } - ]; -} - -export function getWatchDetailBreadcrumbs($route) { - const watch = $route.current.locals.watch || $route.current.locals.xpackWatch; - - return [ - ...getWatchListBreadcrumbs(), - { - text: !watch.isNew - ? watch.name - : i18n.translate('xpack.watcher.create.breadcrumb', { defaultMessage: 'Create' }), - href: '#/management/elasticsearch/watcher/watches/watch/23eebf28-94fd-47e9-ac44-6fee6e427c33' - } - ]; -} - -export function getWatchHistoryBreadcrumbs($route) { - const { watchHistoryItem } = $route.current.locals; - - return [ - ...getWatchDetailBreadcrumbs($route), - { - text: watchHistoryItem.startTime.format(uiSettings.get('dateFormat')) - } - ]; -} diff --git a/x-pack/plugins/watcher/public/lib/breadcrumbs.ts b/x-pack/plugins/watcher/public/lib/breadcrumbs.ts new file mode 100644 index 00000000000000..a8c34599557cbd --- /dev/null +++ b/x-pack/plugins/watcher/public/lib/breadcrumbs.ts @@ -0,0 +1,32 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const listBreadcrumb: any = { + text: i18n.translate('xpack.watcher.breadcrumb.listLabel', { + defaultMessage: 'Watcher', + }), + href: '#/management/elasticsearch/watcher/watches/', +}; + +export const createBreadcrumb: any = { + text: i18n.translate('xpack.watcher.breadcrumb.createLabel', { + defaultMessage: 'Create', + }), +}; + +export const editBreadcrumb: any = { + text: i18n.translate('xpack.watcher.breadcrumb.editLabel', { + defaultMessage: 'Edit', + }), +}; + +export const statusBreadcrumb: any = { + text: i18n.translate('xpack.watcher.breadcrumb.statusLabel', { + defaultMessage: 'Status', + }), +}; diff --git a/x-pack/plugins/watcher/public/lib/use_request.ts b/x-pack/plugins/watcher/public/lib/use_request.ts new file mode 100644 index 00000000000000..6770f820b76565 --- /dev/null +++ b/x-pack/plugins/watcher/public/lib/use_request.ts @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useEffect, useState } from 'react'; +import { getHttpClient } from './api'; + +interface SendRequest { + path?: string; + method: string; + body?: any; +} + +interface SendRequestResponse { + data: any; + error: Error; +} + +export const sendRequest = async ({ + path, + method, + body, +}: SendRequest): Promise> => { + try { + const response = await (getHttpClient() as any)[method](path, body); + + if (!response.data) { + throw new Error(response.statusText); + } + + return { + data: response.data, + }; + } catch (e) { + return { + error: e, + }; + } +}; + +interface UseRequest extends SendRequest { + interval?: number; + initialData?: any; + processData?: any; +} + +export const useRequest = ({ + path, + method, + body, + interval, + initialData, + processData, +}: UseRequest) => { + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [data, setData] = useState(initialData); + + // Tied to every render and bound to each request. + let isOutdatedRequest = false; + + const createRequest = async () => { + // Set a neutral state for a non-request. + if (!path) { + setError(null); + setData(initialData); + setIsLoading(false); + return; + } + + setError(null); + setData(initialData); + setIsLoading(true); + + const { data: responseData, error: responseError } = await sendRequest({ + path, + method, + body, + }); + + // Don't update state if an outdated request has resolved. + if (isOutdatedRequest) { + return; + } + + setError(responseError); + setData(processData && responseData ? processData(responseData) : responseData); + setIsLoading(false); + }; + + useEffect( + () => { + function cancelOutdatedRequest() { + isOutdatedRequest = true; + } + + createRequest(); + + if (interval) { + const intervalRequest = setInterval(createRequest, interval); + return () => { + cancelOutdatedRequest(); + clearInterval(intervalRequest); + }; + } + + // Called when a new render will trigger this effect. + return cancelOutdatedRequest; + }, + [path] + ); + + return { + error, + isLoading, + data, + createRequest, + }; +}; diff --git a/x-pack/plugins/watcher/public/register_route.js b/x-pack/plugins/watcher/public/register_route.js index 997535eced7f19..f4c6b931e9a906 100644 --- a/x-pack/plugins/watcher/public/register_route.js +++ b/x-pack/plugins/watcher/public/register_route.js @@ -11,7 +11,6 @@ import { management } from 'ui/management'; import template from './app.html'; import { App } from './app'; import 'plugins/watcher/services/license'; -import { getWatchListBreadcrumbs } from './lib/breadcrumbs'; import { setHttpClient, setSavedObjectsClient } from './lib/api'; import { I18nContext } from 'ui/i18n'; import { manageAngularLifecycle } from './lib/manage_angular_lifecycle'; @@ -49,8 +48,6 @@ routes.when('/management/elasticsearch/watcher/:param1?/:param2?/:param3?/:param } }, controllerAs: 'watchRoute', - //TODO: fix breadcrumbs - k7Breadcrumbs: getWatchListBreadcrumbs, }); routes.defaults(/\/management/, { diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx index 46de27ab958389..dd7ba812d40f26 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -4,14 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiLoadingSpinner } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { Watch } from 'plugins/watcher/models/watch'; import React, { useEffect, useReducer } from 'react'; import { isEqual } from 'lodash'; + +import { EuiLoadingSpinner, EuiPageContent } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import chrome from 'ui/chrome'; +import { MANAGEMENT_BREADCRUMB } from 'ui/management'; + +import { Watch } from 'plugins/watcher/models/watch'; import { WATCH_TYPES } from '../../../../common/constants'; import { BaseWatch } from '../../../../common/types/watch_types'; +import { getPageErrorCode, PageError } from '../../../components/page_error'; import { loadWatch } from '../../../lib/api'; +import { listBreadcrumb, editBreadcrumb, createBreadcrumb } from '../../../lib/breadcrumbs'; import { JsonWatchEdit } from './json_watch_edit'; import { ThresholdWatchEdit } from './threshold_watch_edit'; import { WatchContext } from './watch_context'; @@ -33,22 +39,45 @@ const getTitle = (watch: BaseWatch) => { }); } }; + const watchReducer = (state: any, action: any) => { const { command, payload } = action; + const { watch } = state; + switch (command) { case 'setWatch': - return payload; + return { + ...state, + watch: payload, + }; + case 'setProperty': const { property, value } = payload; - if (isEqual(state[property], value)) { + if (isEqual(watch[property], value)) { return state; } else { - return new (Watch.getWatchTypes())[state.type]({ ...state, [property]: value }); + return { + ...state, + watch: new (Watch.getWatchTypes())[watch.type]({ + ...watch, + [property]: value, + }), + }; } + case 'addAction': - const newWatch = new (Watch.getWatchTypes())[state.type](state); + const newWatch = new (Watch.getWatchTypes())[watch.type](watch); newWatch.addAction(payload); - return newWatch; + return { + ...state, + watch: newWatch, + }; + + case 'setError': + return { + ...state, + loadError: payload, + }; } }; @@ -65,17 +94,24 @@ export const WatchEdit = ({ }; }) => { // hooks - const [watch, dispatch] = useReducer(watchReducer, null); + const [{ watch, loadError }, dispatch] = useReducer(watchReducer, { watch: null }); + const setWatchProperty = (property: string, value: any) => { dispatch({ command: 'setProperty', payload: { property, value } }); }; + const addAction = (action: any) => { dispatch({ command: 'addAction', payload: action }); }; + const getWatch = async () => { if (id) { - const theWatch = await loadWatch(id); - dispatch({ command: 'setWatch', payload: theWatch }); + try { + const loadedWatch = await loadWatch(id); + dispatch({ command: 'setWatch', payload: loadedWatch }); + } catch (error) { + dispatch({ command: 'setError', payload: error }); + } } else if (type) { const WatchType = Watch.getWatchTypes()[type]; if (WatchType) { @@ -83,19 +119,45 @@ export const WatchEdit = ({ } } }; + useEffect(() => { getWatch(); }, []); + + useEffect( + () => { + chrome.breadcrumbs.set([ + MANAGEMENT_BREADCRUMB, + listBreadcrumb, + id ? editBreadcrumb : createBreadcrumb, + ]); + }, + [id] + ); + + const errorCode = getPageErrorCode(loadError); + if (errorCode) { + return ( + + + + ); + } + if (!watch) { return ; } + const pageTitle = getTitle(watch); + let EditComponent = null; + if (watch.type === WATCH_TYPES.THRESHOLD) { EditComponent = ThresholdWatchEdit; } else { EditComponent = JsonWatchEdit; } + return ( diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index b61d9a0260b741..57debfda12971f 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useEffect, useState } from 'react'; +import React, { useState, useMemo, useEffect } from 'react'; import { EuiButton, @@ -23,9 +23,14 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; import { Moment } from 'moment'; +import chrome from 'ui/chrome'; +import { MANAGEMENT_BREADCRUMB } from 'ui/management'; + import { REFRESH_INTERVALS, WATCH_STATES } from '../../../../common/constants'; import { DeleteWatchesModal } from '../../../components/delete_watches_modal'; -import { fetchWatches } from '../../../lib/api'; +import { listBreadcrumb } from '../../../lib/breadcrumbs'; +import { getPageErrorCode, PageError } from '../../../components/page_error'; +import { loadWatches } from '../../../lib/api'; const stateToIcon: { [key: string]: JSX.Element } = { [WATCH_STATES.OK]: , @@ -37,22 +42,34 @@ const stateToIcon: { [key: string]: JSX.Element } = { const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { // hooks - const [isWatchesLoading, setIsWatchesLoading] = useState(true); - const [watchesToDelete, setWatchesToDelete] = useState([]); - const [watches, setWatches] = useState([]); const [selection, setSelection] = useState([]); - const loadWatches = async () => { - const loadedWatches = await fetchWatches(); - setWatches(loadedWatches); - setIsWatchesLoading(false); - }; + const [watchesToDelete, setWatchesToDelete] = useState([]); + // Filter out deleted watches on the client, because the API will return 200 even though some watches + // may not really be deleted until after they're done firing and this could take some time. + const [deletedWatches, setDeletedWatches] = useState([]); + useEffect(() => { - loadWatches(); - const refreshIntervalId = setInterval(loadWatches, REFRESH_INTERVALS.WATCH_LIST); - return () => { - clearInterval(refreshIntervalId); - }; + chrome.breadcrumbs.set([MANAGEMENT_BREADCRUMB, listBreadcrumb]); }, []); + + const { isLoading: isWatchesLoading, data: watches, error } = loadWatches( + REFRESH_INTERVALS.WATCH_LIST + ); + + const availableWatches = useMemo( + () => + watches ? watches.filter((watch: any) => !deletedWatches.includes(watch.id)) : undefined, + [watches, deletedWatches] + ); + + if (getPageErrorCode(error)) { + return ( + + + + ); + } + const columns = [ { field: 'id', @@ -157,13 +174,16 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { ], }, ]; + const selectionConfig = { onSelectionChange: setSelection, }; + const pagination = { initialPageSize: 10, pageSizeOptions: [10, 50, 100], }; + const searchConfig = { box: { incremental: true, @@ -184,21 +204,19 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => {
), }; + return ( { if (deleted) { - setWatches( - watches.filter((watch: any) => { - return !deleted.includes(watch.id); - }) - ); + setDeletedWatches([...deletedWatches, ...watchesToDelete]); } setWatchesToDelete([]); }} watchesToDelete={watchesToDelete} /> + @@ -209,7 +227,9 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { /> + +

{ + + { + + { ); }; + export const WatchList = injectI18n(WatchListUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index 8d9391a84e8ecb..c517f9652a2093 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -4,6 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import React, { Fragment } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; + import { EuiFlexGroup, EuiFlexItem, @@ -12,16 +16,11 @@ import { EuiText, EuiTitle, } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; -import React, { Fragment, useEffect, useState } from 'react'; -import { fetchWatchDetail } from '../../../lib/api'; +import { loadWatchDetail } from '../../../lib/api'; +import { getPageErrorCode } from '../../../components/page_error'; import { WatchActionStatus } from './watch_action_status'; const WatchDetailUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }) => { - const [isWatchesLoading, setIsWatchesLoading] = useState(true); - const [actions, setWatchActions] = useState([]); - const pagination = { initialPageSize: 10, pageSizeOptions: [10, 50, 100], @@ -60,15 +59,13 @@ const WatchDetailUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }, }, ]; - const loadWatchActions = async () => { - const loadedWatchActions = await fetchWatchDetail(watchId); - setWatchActions(loadedWatchActions.watchStatus.actionStatuses); - setIsWatchesLoading(false); - }; - useEffect(() => { - loadWatchActions(); - // only run the first time the component loads - }, []); + + const { error, data: watchDetail, isLoading } = loadWatchDetail(watchId); + + // Another part of the UI will surface the error. + if (getPageErrorCode(error)) { + return null; + } return ( @@ -82,12 +79,12 @@ const WatchDetailUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string { - const [isLoading, setIsLoading] = useState(true); - const [isActivated, setIsActivated] = useState(true); - const [history, setWatchHistory] = useState([]); - const [isDetailVisible, setIsDetailVisible] = useState(true); +const watchHistoryTimeSpanOptions = [ + { + value: 'now-1h', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.1h', { + defaultMessage: 'Last one hour', + }), + }, + { + value: 'now-24h', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.24h', { + defaultMessage: 'Last 24 hours', + }), + }, + { + value: 'now-7d', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.7d', { + defaultMessage: 'Last 7 days', + }), + }, + { + value: 'now-30d', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.30d', { + defaultMessage: 'Last 30 days', + }), + }, + { + value: 'now-6M', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.6M', { + defaultMessage: 'Last 6 months', + }), + }, + { + value: 'now-1y', + text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.1y', { + defaultMessage: 'Last 1 year', + }), + }, +]; + +const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }) => { + const [isActivated, setIsActivated] = useState(undefined); + const [detailWatchId, setDetailWatchId] = useState(undefined); const [watchesToDelete, setWatchesToDelete] = useState([]); - const [itemDetail, setItemDetail] = useState<{ - id?: string; - details?: any; - watchId?: string; - watchStatus?: { actionStatuses?: any }; - }>({}); - const [executionDetail, setExecutionDetail] = useState(''); - const pagination = { - initialPageSize: 10, - pageSizeOptions: [10, 50, 100], - }; + const [watchHistoryTimeSpan, setWatchHistoryTimeSpan] = useState( + watchHistoryTimeSpanOptions[0].value + ); + + const { error: watchDetailError, data: loadedWatch } = loadWatchDetail(watchId); - const loadWatch = async () => { - const loadedWatch = await fetchWatchDetail(watchId); + if (loadedWatch && isActivated === undefined) { + // Set initial value for isActivated based on the watch we just loaded. setIsActivated(loadedWatch.watchStatus.isActive); - }; + } - const watchHistoryTimeSpanOptions = [ - { - value: 'now-1h', - text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.1h', { - defaultMessage: 'Last one hour', - }), - }, - { - value: 'now-24h', - text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.24h', { - defaultMessage: 'Last 24 hours', - }), - }, - { - value: 'now-7d', - text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.7d', { - defaultMessage: 'Last 7 days', - }), - }, - { - value: 'now-30d', - text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.30d', { - defaultMessage: 'Last 30 days', - }), - }, - { - value: 'now-6M', - text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.6M', { - defaultMessage: 'Last 6 months', - }), - }, - { - value: 'now-1y', - text: i18n.translate('xpack.watcher.sections.watchHistory.timeSpan.1y', { - defaultMessage: 'Last 1 year', - }), - }, - ]; - const [watchHistoryTimeSpan, setWatchHistoryTimeSpan] = useState( - watchHistoryTimeSpanOptions[0].value + const { error: historyError, data: history, isLoading } = loadWatchHistory( + watchId, + watchHistoryTimeSpan + ); + + const { error: watchHistoryDetailsError, data: watchHistoryDetails } = loadWatchHistoryDetail( + detailWatchId ); + const executionDetail = watchHistoryDetails + ? JSON.stringify(watchHistoryDetails.details, null, 2) + : ''; + + const errorCode = getPageErrorCode([watchDetailError, historyError, watchHistoryDetailsError]); + if (errorCode) { + return ; + } + + const pagination = { + initialPageSize: 10, + pageSizeOptions: [10, 50, 100], + }; + const columns = [ { field: 'startTime', @@ -114,7 +129,7 @@ const WatchHistoryUI = ({ intl, watchId }: { intl: InjectedIntl; watchId: string showDetailFlyout(item)} + onClick={() => setDetailWatchId(item.id)} > {formattedDate} @@ -157,24 +172,6 @@ const WatchHistoryUI = ({ intl, watchId }: { intl: InjectedIntl; watchId: string const onTimespanChange = (e: React.ChangeEvent) => { const timespan = e.target.value; setWatchHistoryTimeSpan(timespan); - loadWatchHistory(timespan); - }; - const loadWatchHistory = async (timespan: string) => { - const loadedWatchHistory = await fetchWatchHistory(watchId, timespan); - setWatchHistory(loadedWatchHistory); - setIsLoading(false); - }; - - const hideDetailFlyout = async () => { - setItemDetail({}); - return setIsDetailVisible(false); - }; - - const showDetailFlyout = async (item: { id: string }) => { - const watchHistoryItemDetail = await fetchWatchHistoryDetail(item.id); - setItemDetail(watchHistoryItemDetail); - setExecutionDetail(JSON.stringify(watchHistoryItemDetail.details, null, 2)); - return setIsDetailVisible(true); }; const toggleWatchActivation = async () => { @@ -184,6 +181,7 @@ const WatchHistoryUI = ({ intl, watchId }: { intl: InjectedIntl; watchId: string } else { await activateWatch(watchId); } + setIsActivated(!isActivated); } catch (e) { if (e.data.statusCode !== 200) { @@ -199,15 +197,9 @@ const WatchHistoryUI = ({ intl, watchId }: { intl: InjectedIntl; watchId: string } }; - useEffect(() => { - loadWatchHistory(watchHistoryTimeSpan); - loadWatch(); - // only run the first time the component loads - }, []); - let flyout; - if (isDetailVisible && Object.keys(itemDetail).length !== 0) { + if (detailWatchId !== undefined && watchHistoryDetails !== undefined) { const detailColumns = [ { field: 'id', @@ -236,7 +228,7 @@ const WatchHistoryUI = ({ intl, watchId }: { intl: InjectedIntl; watchId: string flyout = ( setDetailWatchId(undefined)} aria-labelledby="indexDetailsFlyoutTitle" > @@ -247,7 +239,7 @@ const WatchHistoryUI = ({ intl, watchId }: { intl: InjectedIntl; watchId: string ); } - const activationButtonText = isActivated ? 'Deactivate watch' : 'Activate watch'; + + const activationButtonText = isActivated ? ( + + ) : ( + + ); + return ( @@ -343,4 +352,4 @@ const WatchHistoryUI = ({ intl, watchId }: { intl: InjectedIntl; watchId: string ); }; -export const WatchHistory = injectI18n(WatchHistoryUI); +export const WatchHistory = injectI18n(WatchHistoryUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx b/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx index 7ddde3cddead57..fdd853e3498fc2 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx @@ -4,10 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { useEffect } from 'react'; import { EuiPageContent, EuiSpacer } from '@elastic/eui'; +import chrome from 'ui/chrome'; +import { MANAGEMENT_BREADCRUMB } from 'ui/management'; + import { WatchDetail } from './components/watch_detail'; import { WatchHistory } from './components/watch_history'; +import { listBreadcrumb, statusBreadcrumb } from '../../lib/breadcrumbs'; export const WatchStatus = ({ match: { @@ -20,6 +24,13 @@ export const WatchStatus = ({ }; }; }) => { + useEffect( + () => { + chrome.breadcrumbs.set([MANAGEMENT_BREADCRUMB, listBreadcrumb, statusBreadcrumb]); + }, + [id] + ); + return ( From 96ee39525d8475295093de5215d429637d9801b9 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Tue, 23 Apr 2019 14:08:46 -0700 Subject: [PATCH 12/51] [Watcher] Refine copy and layout of Watch History detail panel. (#35462) * Remove unnecessary itemId prop and highlight JSON as json. --- .../watch_status/components/watch_detail.tsx | 16 +++- .../watch_status/components/watch_history.tsx | 96 +++++++++++++------ .../sections/watch_status/watch_status.tsx | 2 +- 3 files changed, 81 insertions(+), 33 deletions(-) diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index c517f9652a2093..18dd9fb65dbb59 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -73,11 +73,25 @@ const WatchDetailUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string

+ + + + +

+ +

+
+ + { - return {state}; + return ( + + + + + + {state} + + + ); }, }, ]; @@ -230,33 +240,57 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string data-test-subj="indexDetailFlyout" onClose={() => setDetailWatchId(undefined)} aria-labelledby="indexDetailsFlyoutTitle" + maxWidth={600} > - -

Watch history detail

+ +

+ +

- - - - } - /> - - - - - {executionDetail} - - - + + + +

+ +

+
+ + + } + /> + + + + +

+ +

+
+ + + + {executionDetail} +
); } @@ -284,15 +318,15 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }} watchesToDelete={watchesToDelete} /> - + - -

+ +

-

+

@@ -333,9 +367,9 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string
+ - +
); From 2f79b0607c55379d58815413e90b5dc13ee2bb1c Mon Sep 17 00:00:00 2001 From: Bill McConaghy Date: Fri, 26 Apr 2019 13:30:16 -0400 Subject: [PATCH 13/51] adding support for >=, <=, and between for threshold alerts (#35614) * adding support for >=, <=, and between for threshold alerts * adding i18n for AND label * making prettier happy * appeasing the linter * more linting issues * more linting * fixing test * fixing error state for threshold expression * fixing alignment for treshold inputs * addressing PR feedback * one more PR review fix * eslint fixes * fixing a couple of watch viz bugs --- .../watcher/common/constants/comparators.ts | 4 +- .../watcher/public/components/form_errors.tsx | 1 - .../public/models/watch/comparators.ts | 58 +++++++++++++ .../public/models/watch/threshold_watch.js | 31 +++++-- .../public/sections/watch_edit/comparators.ts | 28 ------ .../components/threshold_watch_edit.tsx | 86 +++++++++++++------ .../components/watch_visualization.tsx | 48 +++++++---- .../models/watch/__tests__/threshold_watch.js | 2 +- .../watch/threshold_watch/build_condition.js | 61 +++++++++++-- .../watch/threshold_watch/build_transform.js | 49 ++++++++++- .../watch/threshold_watch/threshold_watch.js | 2 +- 11 files changed, 279 insertions(+), 91 deletions(-) create mode 100644 x-pack/plugins/watcher/public/models/watch/comparators.ts delete mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/comparators.ts diff --git a/x-pack/plugins/watcher/common/constants/comparators.ts b/x-pack/plugins/watcher/common/constants/comparators.ts index 4a27b7e275b65e..21b350c0f8ce41 100644 --- a/x-pack/plugins/watcher/common/constants/comparators.ts +++ b/x-pack/plugins/watcher/common/constants/comparators.ts @@ -6,6 +6,8 @@ export const COMPARATORS: { [key: string]: string } = { GREATER_THAN: '>', - + GREATER_THAN_OR_EQUALS: '>=', + BETWEEN: 'between', LESS_THAN: '<', + LESS_THAN_OR_EQUALS: '<=', }; diff --git a/x-pack/plugins/watcher/public/components/form_errors.tsx b/x-pack/plugins/watcher/public/components/form_errors.tsx index 4314a8c877e259..0a35d6cb5d1046 100644 --- a/x-pack/plugins/watcher/public/components/form_errors.tsx +++ b/x-pack/plugins/watcher/public/components/form_errors.tsx @@ -6,7 +6,6 @@ import { EuiFormRow } from '@elastic/eui'; import React, { Children, cloneElement, Fragment, ReactElement } from 'react'; - export const ErrableFormRow = ({ errorKey, isShowingErrors, diff --git a/x-pack/plugins/watcher/public/models/watch/comparators.ts b/x-pack/plugins/watcher/public/models/watch/comparators.ts new file mode 100644 index 00000000000000..b636cdaf14c180 --- /dev/null +++ b/x-pack/plugins/watcher/public/models/watch/comparators.ts @@ -0,0 +1,58 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +import { COMPARATORS } from '../../../common/constants'; + +export interface Comparator { + text: string; + value: string; + requiredValues: number; +} +export const comparators: { [key: string]: Comparator } = { + [COMPARATORS.GREATER_THAN]: { + text: i18n.translate('xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel', { + defaultMessage: 'Is above', + }), + value: COMPARATORS.GREATER_THAN, + requiredValues: 1, + }, + [COMPARATORS.GREATER_THAN_OR_EQUALS]: { + text: i18n.translate( + 'xpack.watcher.thresholdWatchExpression.comparators.isAboveOrEqualsLabel', + { + defaultMessage: 'Is above or equals', + } + ), + value: COMPARATORS.GREATER_THAN_OR_EQUALS, + requiredValues: 1, + }, + [COMPARATORS.LESS_THAN]: { + text: i18n.translate('xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel', { + defaultMessage: 'Is below', + }), + value: COMPARATORS.LESS_THAN, + requiredValues: 1, + }, + [COMPARATORS.LESS_THAN_OR_EQUALS]: { + text: i18n.translate( + 'xpack.watcher.thresholdWatchExpression.comparators.isBelowOrEqualsLabel', + { + defaultMessage: 'Is below or equals', + } + ), + value: COMPARATORS.LESS_THAN_OR_EQUALS, + requiredValues: 1, + }, + [COMPARATORS.BETWEEN]: { + text: i18n.translate('xpack.watcher.thresholdWatchExpression.comparators.isBetweenLabel', { + defaultMessage: 'Is between', + }), + value: COMPARATORS.BETWEEN, + requiredValues: 2, + }, +}; diff --git a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js index ad6bf88294ab0f..fb27f657017084 100644 --- a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js @@ -11,6 +11,8 @@ import { getTimeUnitsLabel } from 'plugins/watcher/lib/get_time_units_label'; import { i18n } from '@kbn/i18n'; import { aggTypes } from './agg_types'; import { groupByTypes } from './group_by_types'; +import { comparators } from './comparators'; +const { BETWEEN } = COMPARATORS; const DEFAULT_VALUES = { AGG_TYPE: 'count', TERM_SIZE: 5, @@ -19,7 +21,7 @@ const DEFAULT_VALUES = { TIME_WINDOW_UNIT: 'm', TRIGGER_INTERVAL_SIZE: 1, TRIGGER_INTERVAL_UNIT: 'm', - THRESHOLD: 1000, + THRESHOLD: [1000, 5000], GROUP_BY: 'all', }; @@ -102,7 +104,6 @@ export class ThresholdWatch extends BaseWatch { aggField: [], termSize: [], termField: [], - threshold: [], timeWindowSize: [], }; validationResult.errors = errors; @@ -176,15 +177,29 @@ export class ThresholdWatch extends BaseWatch { ); } } - if (!this.threshold) { - errors.threshold.push( - i18n.translate( + + Array.from(Array(comparators[this.thresholdComparator].requiredValues)).forEach((value, i) => { + const key = `threshold${i}`; + errors[key] = []; + if (!this.threshold[i]) { + errors[key].push(i18n.translate( 'xpack.watcher.thresholdWatchExpression.thresholdLevel.valueIsRequiredValidationMessage', { defaultMessage: 'A value is required.', } - ) - ); + )); + } + }); + if (this.thresholdComparator === BETWEEN && this.threshold[0] && this.threshold[1] && !(this.threshold[1] > this.threshold[0])) { + errors.threshold1.push(i18n.translate( + 'xpack.watcher.thresholdWatchExpression.thresholdLevel.secondValueMustBeGreaterMessage', + { + defaultMessage: 'This value must be greater than {lowerBound}.', + values: { + lowerBound: this.threshold[0] + } + } + )); } if (!this.timeWindowSize) { errors.timeWindowSize.push( @@ -212,7 +227,7 @@ export class ThresholdWatch extends BaseWatch { thresholdComparator: this.thresholdComparator, timeWindowSize: this.timeWindowSize, timeWindowUnit: this.timeWindowUnit, - threshold: this.threshold, + threshold: comparators[this.thresholdComparator].requiredValues > 1 ? this.threshold : this.threshold[0], }); return result; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/comparators.ts b/x-pack/plugins/watcher/public/sections/watch_edit/comparators.ts deleted file mode 100644 index 63508732f83891..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_edit/comparators.ts +++ /dev/null @@ -1,28 +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 { i18n } from '@kbn/i18n'; - -import { COMPARATORS } from '../../../common/constants'; - -export interface Comparator { - text: string; - value: string; -} -export const comparators: { [key: string]: Comparator } = { - [COMPARATORS.GREATER_THAN]: { - text: i18n.translate('xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel', { - defaultMessage: 'Is above', - }), - value: COMPARATORS.GREATER_THAN, - }, - [COMPARATORS.LESS_THAN]: { - text: i18n.translate('xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel', { - defaultMessage: 'Is below', - }), - value: COMPARATORS.LESS_THAN, - }, -}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx index 14e10feb63573a..876c77d1f2b8f9 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx @@ -5,7 +5,6 @@ */ import React, { Fragment, useContext, useEffect, useState } from 'react'; - import { EuiButton, EuiButtonEmpty, @@ -32,7 +31,7 @@ import { ErrableFormRow } from '../../../components/form_errors'; import { fetchFields, getMatchingIndices, loadIndexPatterns } from '../../../lib/api'; import { aggTypes } from '../../../models/watch/agg_types'; import { groupByTypes } from '../../../models/watch/group_by_types'; -import { comparators } from '../comparators'; +import { comparators } from '../../../models/watch/comparators'; import { timeUnits } from '../time_units'; import { onWatchSave, saveWatch } from '../watch_edit_actions'; import { WatchContext } from './watch_context'; @@ -156,11 +155,21 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit defaultMessage: 'Please fix the errors in the expression below.', } ); - const expressionFields = ['aggField', 'termSize', 'termField', 'threshold', 'timeWindowSize']; + const expressionFields = [ + 'aggField', + 'termSize', + 'termField', + 'threshold0', + 'threshold1', + 'timeWindowSize', + ]; const hasExpressionErrors = !!Object.keys(errors).find( errorKey => expressionFields.includes(errorKey) && errors[errorKey].length >= 1 ); const shouldShowThresholdExpression = watch.index && watch.index.length > 0 && watch.timeField; + const andThresholdText = i18n.translate('xpack.watcher.sections.watchEdit.threshold.andLabel', { + defaultMessage: 'AND', + }); return ( @@ -630,12 +639,22 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit button={ { setWatchThresholdPopoverOpen(true); }} - color={watch.threshold ? 'secondary' : 'danger'} + color={ + errors.threshold0.length || (errors.threshold1 && errors.threshold1.length) + ? 'danger' + : 'secondary' + } /> } isOpen={watchThresholdPopoverOpen} @@ -648,33 +667,50 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit >
{comparators[watch.thresholdComparator].text} - + { setWatchProperty('thresholdComparator', e.target.value); }} - options={Object.values(comparators)} + options={Object.values(comparators).map(({ text, value }) => { + return { text, value }; + })} /> - - - { - const { value } = e.target; - const threshold = value !== '' ? parseInt(value, 10) : value; - setWatchProperty('threshold', threshold); - }} - /> - - + {Array.from(Array(comparators[watch.thresholdComparator].requiredValues)).map( + (notUsed, i) => { + return ( + + {i > 0 ? ( + + {andThresholdText} + + ) : null} + + + { + const { value } = e.target; + const threshold = value !== '' ? parseInt(value, 10) : value; + const newThreshold = [...watch.threshold]; + newThreshold[i] = threshold; + setWatchProperty('threshold', newThreshold); + }} + /> + + + + ); + } + )}
diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx index 890e284fea6a8c..2773a9677683e5 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx @@ -31,6 +31,7 @@ import { VisualizeOptions } from 'plugins/watcher/models/visualize_options'; import { getWatchVisualizationData } from '../../../lib/api'; import { WatchContext } from './watch_context'; import { aggTypes } from '../../../models/watch/agg_types'; +import { comparators } from '../../../models/watch/comparators'; const getChartTheme = () => { const isDarkTheme = chrome.getUiSettingsClient().get('theme:darkMode'); const baseTheme = isDarkTheme ? DARK_THEME : LIGHT_THEME; @@ -82,7 +83,9 @@ const getDomain = (watch: any) => { max: visualizeTimeWindowTo, }; }; - +const getThreshold = (watch: any) => { + return watch.threshold.slice(0, comparators[watch.thresholdComparator].requiredValues); +}; const getTimeBuckets = (watch: any) => { const domain = getDomain(watch); const timeBuckets = new TimeBuckets(); @@ -123,12 +126,17 @@ const WatchVisualizationUi = () => { .format(getTimeBuckets(watch).getScaledDateFormat()); }; const aggLabel = aggTypes[watch.aggType].text; - const thresholdCustomSeriesColors: CustomSeriesColorsMap = new Map(); - const thresholdDataSeriesColorValues: DataSeriesColorsValues = { - colorValues: [], - specId: getSpecId('threshold'), + + const getCustomColors = (specId: string) => { + const customSeriesColors: CustomSeriesColorsMap = new Map(); + const dataSeriesColorValues: DataSeriesColorsValues = { + colorValues: [], + specId: getSpecId(specId), + }; + customSeriesColors.set(dataSeriesColorValues, '#BD271E'); + return customSeriesColors; }; - thresholdCustomSeriesColors.set(thresholdDataSeriesColorValues, '#BD271E'); + const domain = getDomain(watch); const watchVisualizationDataKeys = Object.keys(watchVisualizationData); return ( @@ -163,17 +171,23 @@ const WatchVisualizationUi = () => { /> ); })} - + {getThreshold(watch).map((value: any, i: number) => { + const specId = i === 0 ? 'threshold' : `threshold${i}`; + return ( + + ); + })} ) : ( { thresholdComparator: 'thresholdComparator', timeWindowSize: 'timeWindowSize', timeWindowUnit: 'timeWindowUnit', - threshold: 'threshold' + threshold: ['threshold'] }; expect(actual).to.eql(expected); diff --git a/x-pack/plugins/watcher/server/models/watch/threshold_watch/build_condition.js b/x-pack/plugins/watcher/server/models/watch/threshold_watch/build_condition.js index 1c8d2ad422edb7..64ee0f44c31042 100644 --- a/x-pack/plugins/watcher/server/models/watch/threshold_watch/build_condition.js +++ b/x-pack/plugins/watcher/server/models/watch/threshold_watch/build_condition.js @@ -5,7 +5,8 @@ */ import { singleLineScript } from '../lib/single_line_script'; - +import { COMPARATORS } from '../../../../common/constants'; +const { BETWEEN } = COMPARATORS; /* watch.condition.script.inline */ @@ -13,17 +14,39 @@ function buildInline({ aggType, thresholdComparator, hasTermsAgg }) { let script = ''; if (aggType === 'count' && !hasTermsAgg) { - script = ` + if (thresholdComparator === BETWEEN) { + script = ` + if (ctx.payload.hits.total >= params.threshold[0] && ctx.payload.hits.total <= params.threshold[1]) { + return true; + } + + return false; + `; + } else { + script = ` if (ctx.payload.hits.total ${thresholdComparator} params.threshold) { return true; } return false; `; + } } if (aggType === 'count' && hasTermsAgg) { - script = ` + if (thresholdComparator === BETWEEN) { + script = ` + ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets; + for (int i = 0; i < arr.length; i++) { + if (arr[i].doc_count >= params.threshold[0] && arr[i].doc_count <= params.threshold[1]) { + return true; + } + } + + return false; + `; + } else { + script = ` ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets; for (int i = 0; i < arr.length; i++) { if (arr[i].doc_count ${thresholdComparator} params.threshold) { @@ -33,20 +56,44 @@ function buildInline({ aggType, thresholdComparator, hasTermsAgg }) { return false; `; - } + } + } if (aggType !== 'count' && !hasTermsAgg) { - script = ` + if (thresholdComparator === BETWEEN) { + script = ` + if (ctx.payload.aggregations.metricAgg.value >= params.threshold[0] + && ctx.payload.aggregations.metricAgg.value <= params.threshold[1]) { + return true; + } + + return false; + `; + } else { + script = ` if (ctx.payload.aggregations.metricAgg.value ${thresholdComparator} params.threshold) { return true; } return false; `; + } } if (aggType !== 'count' && hasTermsAgg) { - script = ` + if (thresholdComparator === BETWEEN) { + script = ` + ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets; + for (int i = 0; i < arr.length; i++) { + if (arr[i]['metricAgg'].value >= params.threshold[0] && arr[i]['metricAgg'].value <= params.threshold[1]) { + return true; + } + } + + return false; + `; + } else { + script = ` ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets; for (int i = 0; i < arr.length; i++) { if (arr[i]['metricAgg'].value ${thresholdComparator} params.threshold) { @@ -56,6 +103,8 @@ function buildInline({ aggType, thresholdComparator, hasTermsAgg }) { return false; `; + } + } return singleLineScript(script); diff --git a/x-pack/plugins/watcher/server/models/watch/threshold_watch/build_transform.js b/x-pack/plugins/watcher/server/models/watch/threshold_watch/build_transform.js index d2a6116ca803f7..a302dde245634a 100644 --- a/x-pack/plugins/watcher/server/models/watch/threshold_watch/build_transform.js +++ b/x-pack/plugins/watcher/server/models/watch/threshold_watch/build_transform.js @@ -5,7 +5,8 @@ */ import { singleLineScript } from '../lib/single_line_script'; - +import { COMPARATORS } from '../../../../common/constants'; +const { BETWEEN } = COMPARATORS; /* watch.transform.script.inline */ @@ -22,7 +23,26 @@ function buildInline({ aggType, hasTermsAgg, thresholdComparator }) { } if (aggType === 'count' && hasTermsAgg) { - script = ` + if (thresholdComparator === BETWEEN) { + script = ` + HashMap result = new HashMap(); + ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets; + ArrayList filteredHits = new ArrayList(); + + for (int i = 0; i < arr.length; i++) { + HashMap filteredHit = new HashMap(); + filteredHit.key = arr[i].key; + filteredHit.value = arr[i].doc_count; + if (filteredHit.value >= params.threshold[0] && filteredHit.value <= params.threshold[1]) { + filteredHits.add(filteredHit); + } + } + result.results = filteredHits; + + return result; + `; + } else { + script = ` HashMap result = new HashMap(); ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets; ArrayList filteredHits = new ArrayList(); @@ -39,6 +59,8 @@ function buildInline({ aggType, hasTermsAgg, thresholdComparator }) { return result; `; + } + } if (aggType !== 'count' && !hasTermsAgg) { @@ -51,7 +73,26 @@ function buildInline({ aggType, hasTermsAgg, thresholdComparator }) { } if (aggType !== 'count' && hasTermsAgg) { - script = ` + if (thresholdComparator === BETWEEN) { + script = ` + HashMap result = new HashMap(); + ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets; + ArrayList filteredHits = new ArrayList(); + + for (int i = 0; i < arr.length; i++) { + HashMap filteredHit = new HashMap(); + filteredHit.key = arr[i].key; + filteredHit.value = arr[i]['metricAgg'].value; + if (filteredHit.value >= params.threshold[0] && filteredHit.value <= params.threshold[1]) { + filteredHits.add(filteredHit); + } + } + result.results = filteredHits; + + return result; + `; + } else { + script = ` HashMap result = new HashMap(); ArrayList arr = ctx.payload.aggregations.bucketAgg.buckets; ArrayList filteredHits = new ArrayList(); @@ -68,6 +109,8 @@ function buildInline({ aggType, hasTermsAgg, thresholdComparator }) { return result; `; + } + } return singleLineScript(script); diff --git a/x-pack/plugins/watcher/server/models/watch/threshold_watch/threshold_watch.js b/x-pack/plugins/watcher/server/models/watch/threshold_watch/threshold_watch.js index eaf9feabf7bf97..4fbc0111f57dd2 100644 --- a/x-pack/plugins/watcher/server/models/watch/threshold_watch/threshold_watch.js +++ b/x-pack/plugins/watcher/server/models/watch/threshold_watch/threshold_watch.js @@ -120,7 +120,7 @@ export class ThresholdWatch extends BaseWatch { thresholdComparator: metadata.threshold_comparator, timeWindowSize: metadata.time_window_size, timeWindowUnit: metadata.time_window_unit, - threshold: metadata.threshold + threshold: Array.isArray(metadata.threshold) ? metadata.threshold : [metadata.threshold] } ); From 02a0a380a2800c3651080a1f8925a2a1c7a32176 Mon Sep 17 00:00:00 2001 From: Bill McConaghy Date: Tue, 30 Apr 2019 10:55:35 -0400 Subject: [PATCH 14/51] adding loading spinner for watch visualization (#35798) * adding loading spinner for watch visualization * responding to PR feedback --- .../components/watch_visualization.tsx | 56 ++++++++++++------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx index 2773a9677683e5..5daab470254e3e 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx @@ -20,12 +20,11 @@ import { ScaleType, Settings, } from '@elastic/charts'; -import { debounce } from 'lodash'; import { TimeBuckets } from 'ui/time_buckets'; import dateMath from '@elastic/datemath'; import chrome from 'ui/chrome'; import moment from 'moment-timezone'; -import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLoadingChart, EuiSpacer } from '@elastic/eui'; import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; import { VisualizeOptions } from 'plugins/watcher/models/visualize_options'; import { getWatchVisualizationData } from '../../../lib/api'; @@ -93,28 +92,31 @@ const getTimeBuckets = (watch: any) => { return timeBuckets; }; -const loadWatchVisualizationData = debounce(async (watch: any, setWatchVisualizationData: any) => { - const domain = getDomain(watch); - const timeBuckets = new TimeBuckets(); - timeBuckets.setBounds(domain); - const interval = timeBuckets.getInterval().expression; - const visualizeOptions = new VisualizeOptions({ - rangeFrom: domain.min, - rangeTo: domain.max, - interval, - timezone: getTimezone(), - }); - const { visualizeData } = (await getWatchVisualizationData(watch, visualizeOptions)) as any; - setWatchVisualizationData(visualizeData || {}); -}, 500); - const WatchVisualizationUi = () => { const { watch } = useContext(WatchContext); const [watchVisualizationData, setWatchVisualizationData] = useState({}); - + const [isLoading, setIsLoading] = useState(true); + const loadWatchVisualizationData = async () => { + const domain = getDomain(watch); + const timeBuckets = new TimeBuckets(); + timeBuckets.setBounds(domain); + const interval = timeBuckets.getInterval().expression; + const visualizeOptions = new VisualizeOptions({ + rangeFrom: domain.min, + rangeTo: domain.max, + interval, + timezone: getTimezone(), + }); + const { visualizeData } = (await getWatchVisualizationData(watch, visualizeOptions)) as any; + setIsLoading(false); + setWatchVisualizationData(visualizeData || {}); + }; useEffect( () => { - loadWatchVisualizationData(watch, setWatchVisualizationData); + const handler = setTimeout(loadWatchVisualizationData, 500); + return () => { + clearTimeout(handler); + }; }, [watch] ); @@ -137,8 +139,24 @@ const WatchVisualizationUi = () => { return customSeriesColors; }; + if (isLoading) { + return ( + + + + + + + + + + + ); + } + const domain = getDomain(watch); const watchVisualizationDataKeys = Object.keys(watchVisualizationData); + return ( From 46d7f2ff54bb6291f8acf099da4ece11721bce38 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Fri, 3 May 2019 10:26:21 -0700 Subject: [PATCH 15/51] Fix yarn.lock. --- yarn.lock | 10196 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 5892 insertions(+), 4304 deletions(-) diff --git a/yarn.lock b/yarn.lock index f47cef985e0bb8..1005c34730588b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,29 +3,38 @@ "@babel/cli@^7.2.3": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.4.4.tgz#5454bb7112f29026a4069d8e6f0e1794e651966c" - integrity sha512-XGr5YjQSjgTa6OzQZY57FAJsdeVSAKR/u/KA5exWIz66IKtv/zXtHy+fIZcMry/EgYegwuHE7vzGnrFhjdIAsQ== + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.2.3.tgz#1b262e42a3e959d28ab3d205ba2718e1923cfee6" + integrity sha512-bfna97nmJV6nDJhXNPeEfxyMjWnt6+IjUAaDPiYRTBlm8L41n8nvw6UAqUCbvpFfU246gHPxW7sfWwqtF4FcYA== dependencies: commander "^2.8.1" convert-source-map "^1.1.0" fs-readdir-recursive "^1.1.0" glob "^7.0.0" - lodash "^4.17.11" + lodash "^4.17.10" mkdirp "^0.5.1" output-file-sync "^2.0.0" slash "^2.0.0" source-map "^0.5.0" optionalDependencies: - chokidar "^2.0.4" + chokidar "^2.0.3" -"@babel/code-frame@7.0.0", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": +"@babel/code-frame@7.0.0", "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== dependencies: "@babel/highlight" "^7.0.0" +"@babel/code-frame@^7.0.0-beta.35": + version "7.0.0-beta.37" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.37.tgz#2da1dd3b1b57bfdea777ddc378df7cd12fe40171" + integrity sha512-LIpcKm+2otOOvOvhCbD6wkNYi8aUwHk73uWR+hxBdW2EFht5D0QX89n4me8nyeNGWr5zC3Pvmjq+9MvUof+jkg== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + "@babel/core@7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" @@ -46,7 +55,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@7.3.4": +"@babel/core@7.3.4", "@babel/core@^7.1.0", "@babel/core@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== @@ -66,18 +75,18 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.3.4", "@babel/core@^7.4.3": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.4.tgz#84055750b05fcd50f9915a826b44fa347a825250" - integrity sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ== +"@babel/core@^7.1.6": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.0.tgz#248fd6874b7d755010bfe61f557461d4f446d9e9" + integrity sha512-Dzl7U0/T69DFOTwqz/FJdnOSWS57NpjNfCwMKHABr589Lg8uX1RrlBIJ7L5Dubt/xkLsx0xH5EBFzlBVes1ayA== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helpers" "^7.4.4" - "@babel/parser" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.0" + "@babel/parser" "^7.4.0" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -86,12 +95,23 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.2.2", "@babel/generator@^7.3.4", "@babel/generator@^7.4.0", "@babel/generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" - integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== +"@babel/generator@^7.0.0", "@babel/generator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" + integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.3.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/generator@^7.2.2", "@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== + dependencies: + "@babel/types" "^7.4.0" jsesc "^2.5.1" lodash "^4.17.11" source-map "^0.5.0" @@ -112,7 +132,7 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-builder-react-jsx@^7.3.0": +"@babel/helper-builder-react-jsx@^7.0.0": version "7.3.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== @@ -120,34 +140,64 @@ "@babel/types" "^7.3.0" esutils "^2.0.0" -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f" + integrity sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/helper-hoist-variables" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" -"@babel/helper-create-class-features-plugin@^7.3.0", "@babel/helper-create-class-features-plugin@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz#fc3d690af6554cc9efc607364a82d48f58736dba" - integrity sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA== +"@babel/helper-create-class-features-plugin@^7.3.0", "@babel/helper-create-class-features-plugin@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.0.tgz#30fd090e059d021995c1762a5b76798fa0b51d82" + integrity sha512-2K8NohdOT7P6Vyp23QH4w2IleP8yG3UJsbRKwA4YP6H8fErcLkFuuEEqbF2/BYBKSNci/FWJiqm6R3VhM/QHgw== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.4" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" -"@babel/helper-define-map@^7.1.0", "@babel/helper-define-map@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" - integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== +"@babel/helper-create-class-features-plugin@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.4.tgz#092711a7a3ad8ea34de3e541644c2ce6af1f6f0c" + integrity sha512-uFpzw6L2omjibjxa8VGZsJUPL5wJH0zzGKpoz0ccBkzIa6C8kWNUbiBmQ0rgOKWlHJ6qzmfa6lTiGchiV8SC+g== dependencies: "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.4.4" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.3.4" + "@babel/helper-split-export-declaration" "^7.0.0" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-define-map@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9" + integrity sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.0" lodash "^4.17.11" "@babel/helper-explode-assignable-expression@^7.1.0": @@ -174,12 +224,19 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6" + integrity sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw== + dependencies: + "@babel/types" "^7.4.0" "@babel/helper-member-expression-to-functions@^7.0.0": version "7.0.0" @@ -195,17 +252,17 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" - integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== +"@babel/helper-module-transforms@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" + integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.4.4" - lodash "^4.17.11" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.10" "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" @@ -219,12 +276,12 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" - integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== dependencies: - lodash "^4.17.11" + lodash "^4.17.10" "@babel/helper-remap-async-to-generator@^7.1.0": version "7.1.0" @@ -237,15 +294,25 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" - integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.3.4.tgz#a795208e9b911a6eeb08e5891faacf06e7013e13" + integrity sha512-pvObL9WVf2ADs+ePg0jrqlhHoxRXlOa+SHRHzAXIz2xkYuOHfGl+fKxPMaS4Fq+uje8JQPobnertBBvyrWnQ1A== dependencies: "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" + +"@babel/helper-replace-supers@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" + integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" "@babel/helper-simple-access@^7.1.0": version "7.1.0" @@ -255,12 +322,19 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== + dependencies: + "@babel/types" "^7.4.0" "@babel/helper-wrap-function@^7.1.0": version "7.2.0" @@ -272,14 +346,23 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.2.0", "@babel/helpers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" - integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== +"@babel/helpers@^7.2.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.3.1.tgz#949eec9ea4b45d3210feb7dc1c22db664c9e44b9" + integrity sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA== + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.3.0" + +"@babel/helpers@^7.4.0": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.2.tgz#3bdfa46a552ca77ef5a0f8551be5f0845ae989be" + integrity sha512-gQR1eQeroDzFBikhrCccm5Gs2xBjZ57DNjGbqTaHo911IpmSxflOQWMAHPw/TXk8L3isv7s9lYzUkexOeTQUYg== dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" "@babel/highlight@^7.0.0": version "7.0.0" @@ -290,10 +373,15 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.3", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" - integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.3", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" + integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== + +"@babel/parser@^7.4.0": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" + integrity sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -312,12 +400,20 @@ "@babel/helper-create-class-features-plugin" "^7.3.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-proposal-class-properties@^7.3.0", "@babel/plugin-proposal-class-properties@^7.3.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz#93a6486eed86d53452ab9bab35e368e9461198ce" - integrity sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg== +"@babel/plugin-proposal-class-properties@^7.3.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" + integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-class-properties@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.4.tgz#410f5173b3dc45939f9ab30ca26684d72901405e" + integrity sha512-lUf8D3HLs4yYlAo8zjuneLvfxN7qfKv1Yzbj5vjqaqMJxgJA3Ipwp4VUJ+OrOdz53Wbww6ahwB8UhB2HQyLotA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.4" + "@babel/helper-create-class-features-plugin" "^7.3.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-decorators@7.3.0": @@ -345,10 +441,18 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.3.1", "@babel/plugin-proposal-object-rest-spread@^7.3.2", "@babel/plugin-proposal-object-rest-spread@^7.3.4", "@babel/plugin-proposal-object-rest-spread@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" - integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== +"@babel/plugin-proposal-object-rest-spread@^7.3.1", "@babel/plugin-proposal-object-rest-spread@^7.3.2", "@babel/plugin-proposal-object-rest-spread@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.0.tgz#e4960575205eadf2a1ab4e0c79f9504d5b82a97f" + integrity sha512-uTNi8pPYyUH2eWHyYWWSYJKwKg34hhgl4/dbejEjL+64OhbHjTX7wEVWMQl82tEmdDsGeu77+s8HHLS627h6OQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.4.tgz#47f73cf7f2a721aad5c0261205405c642e424654" + integrity sha512-j7VQmbbkA+qrzNqbKHrBsW3ddFnOeva6wzSe/zB7T+xaxGc+RCpwo44wCmRixAIGRoIpmVgvzFzNJqQcO3/9RA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -361,13 +465,22 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -"@babel/plugin-proposal-unicode-property-regex@^7.2.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" - integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" + integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz#202d91ee977d760ef83f4f416b280d568be84623" + integrity sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" + "@babel/helper-regex" "^7.0.0" regexpu-core "^4.5.4" "@babel/plugin-syntax-async-generators@^7.2.0": @@ -391,6 +504,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-flow@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0.tgz#70638aeaad9ee426bc532e51523cff8ff02f6f17" + integrity sha512-zGcuZWiWWDa5qTZ6iAnpG0fnX/GOu49pGR5PFvkQ9GmKNaSphXQnlNXh/LG20sqWtNrx/eB6krzfEzcwvUyeFA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" @@ -405,10 +525,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-jsx@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== +"@babel/plugin-syntax-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" + integrity sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -440,10 +560,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.2.0", "@babel/plugin-transform-async-to-generator@^7.4.0", "@babel/plugin-transform-async-to-generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" - integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== +"@babel/plugin-transform-async-to-generator@^7.2.0", "@babel/plugin-transform-async-to-generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" + integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-async-to-generator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.3.4.tgz#4e45408d3c3da231c0e7b823f407a53a7eb3048c" + integrity sha512-Y7nCzv2fw/jEZ9f678MuKdMo99MFDJMT/PvD9LisrR5JDFcJH6vYeH6RnjVt3p5tceyGRvTtEN0VOlU+rgHZjA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -456,10 +585,18 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" - integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== +"@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz#164df3bb41e3deb954c4ca32ffa9fcaa56d30bcb" + integrity sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-block-scoping@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.3.4.tgz#5c22c339de234076eee96c8783b2fed61202c5c4" + integrity sha512-blRr2O8IOZLAOJklXLV4WhcEzpYafYQKSGT3+R26lWG41u/FODJuBggehtOwilVAcFu393v3OFj+HmaE6tVjhA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.11" @@ -478,18 +615,32 @@ "@babel/helper-split-export-declaration" "^7.0.0" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.2.0", "@babel/plugin-transform-classes@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" - integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== +"@babel/plugin-transform-classes@^7.2.0", "@babel/plugin-transform-classes@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.0.tgz#e3428d3c8a3d01f33b10c529b998ba1707043d4d" + integrity sha512-XGg1Mhbw4LDmrO9rSTNe+uI79tQPdGs0YASlxgweYRLZqo/EQktjaOV4tchL/UZbM0F+/94uOipmdNGoaGOEYg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.4.4" + "@babel/helper-define-map" "^7.4.0" "@babel/helper-function-name" "^7.1.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.4" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" + globals "^11.1.0" + +"@babel/plugin-transform-classes@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.3.4.tgz#dc173cb999c6c5297e0b5f2277fdaaec3739d0cc" + integrity sha512-J9fAvCFBkXEvBimgYxCjvaVDzL6thk0j0dBvCeZmIUDBwyt+nv6HfbImsSrWsYXfDNDivyANgJlFXDUWRTZBuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.3.4" + "@babel/helper-split-export-declaration" "^7.0.0" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.2.0": @@ -506,21 +657,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.2.0", "@babel/plugin-transform-destructuring@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" - integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" + integrity sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.2.0", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" - integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== +"@babel/plugin-transform-destructuring@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.0.tgz#acbb9b2418d290107db333f4d6cd8aa6aea00343" + integrity sha512-HySkoatyYTY3ZwLI8GGvkRWCFrjAGXUHur5sMecmCIdIharnlcWWivOqDJI76vvmVZfzwb6G08NREsrY96RhGQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" + integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" "@babel/plugin-transform-duplicate-keys@^7.2.0": version "7.2.0" @@ -546,24 +704,31 @@ "@babel/plugin-syntax-flow" "^7.2.0" "@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz#d267a081f49a8705fc9146de0768c6b58dccd8f7" - integrity sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q== + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.1.6.tgz#4b7be62604d39e63cfe23b1d00d63e9fb7e763ba" + integrity sha512-0tyFAAjJmnRlr8MVJV39ASn1hv+PbdVP71hf7aAseqLfQ0o9QXk9htbMbq7/ZYXnUIp6gDw0lUUP0+PQMbbtmg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-syntax-flow" "^7.0.0" -"@babel/plugin-transform-for-of@^7.2.0", "@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== +"@babel/plugin-transform-for-of@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" + integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.2.0", "@babel/plugin-transform-function-name@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== +"@babel/plugin-transform-for-of@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.0.tgz#56c8c36677f5d4a16b80b12f7b768de064aaeb5f" + integrity sha512-vWdfCEYLlYSxbsKj5lGtzA49K3KANtb8qCPQ1em07txJzsBwY+cKJzBHizj5fl3CCx7vt+WPdgDLTHmydkbQSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" + integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -575,36 +740,46 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-member-expression-literals@^7.2.0": +"@babel/plugin-transform-modules-amd@^7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== dependencies: + "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.2.0": +"@babel/plugin-transform-modules-commonjs@^7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" + integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" -"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" - integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== +"@babel/plugin-transform-modules-commonjs@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.0.tgz#3b8ec61714d3b75d20c5ccfa157f2c2e087fd4ca" + integrity sha512-iWKAooAkipG7g1IY0eah7SumzfnIT3WNhT4uYB2kIsvHnNSB6MDYVa5qyICSwaTBDBY2c4SnJ3JtEa6ltJd6Jw== dependencies: - "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" -"@babel/plugin-transform-modules-systemjs@^7.2.0", "@babel/plugin-transform-modules-systemjs@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" - integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== +"@babel/plugin-transform-modules-systemjs@^7.2.0", "@babel/plugin-transform-modules-systemjs@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz#c2495e55528135797bc816f5d50f851698c586a1" + integrity sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-systemjs@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.3.4.tgz#813b34cd9acb6ba70a84939f3680be0eb2e58861" + integrity sha512-VZ4+jlGOF36S7TjKs8g4ojp4MEI+ebCQZdswWb/T9I4X84j8OtFAyjXjt/M16iIm5RIZn0UMQgg/VgIwo/87vw== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-hoist-variables" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-modules-umd@^7.2.0": @@ -615,17 +790,31 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz#5611d96d987dfc4a3a81c4383bb173361037d68d" - integrity sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz#140b52985b2d6ef0cb092ef3b29502b990f9cd50" + integrity sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw== dependencies: regexp-tree "^0.1.0" -"@babel/plugin-transform-new-target@^7.0.0", "@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e" + integrity sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ== + dependencies: + regexp-tree "^0.1.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz#67658a1d944edb53c8d4fa3004473a0dd7838150" + integrity sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -637,20 +826,22 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" -"@babel/plugin-transform-parameters@^7.2.0", "@babel/plugin-transform-parameters@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== +"@babel/plugin-transform-parameters@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" + integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== dependencies: - "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-call-delegate" "^7.1.0" "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== +"@babel/plugin-transform-parameters@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.0.tgz#a1309426fac4eecd2a9439a4c8c35124a11a48a9" + integrity sha512-Xqv6d1X+doyiuCGDoVJFtlZx0onAX0tnc3dY8w71pv/O0dODAbusVv2Ale3cGOwfiyi895ivOBhYa9DhAM8dUA== dependencies: + "@babel/helper-call-delegate" "^7.4.0" + "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-react-constant-elements@7.2.0", "@babel/plugin-transform-react-constant-elements@^7.0.0", "@babel/plugin-transform-react-constant-elements@^7.2.0": @@ -661,51 +852,65 @@ "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-react-display-name@7.2.0", "@babel/plugin-transform-react-display-name@^7.0.0": +"@babel/plugin-transform-react-display-name@7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz#93759e6c023782e52c2da3b75eca60d4f10533ee" + integrity sha512-BX8xKuQTO0HzINxT6j/GiCwoJB0AOMs0HmLbEnAvcte8U8rSkNa/eSCAY+l1OA4JnCVq2jw2p6U8QQryy2fTPg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" - integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0.tgz#a84bb70fea302d915ea81d9809e628266bb0bc11" + integrity sha512-pymy+AK12WO4safW1HmBpwagUQRl9cevNX+82AIAtU1pIdugqcH+nuYP03Ja6B+N4gliAaKWAegIBL/ymALPHA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/plugin-syntax-jsx" "^7.0.0" "@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" - integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0.tgz#28e00584f9598c0dd279f6280eee213fa0121c3c" + integrity sha512-OSeEpFJEH5dw/TtxTg4nijl4nHBbhqbKL94Xo/Y17WKIf2qJWeIk/QeXACF19lG1vMezkxqruwnTjVizaW7u7w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/plugin-syntax-jsx" "^7.0.0" "@babel/plugin-transform-react-jsx@^7.0.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" - integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz#524379e4eca5363cd10c4446ba163f093da75f3e" + integrity sha512-0TMP21hXsSUjIQJmu/r7RiVxeFrXRcMUigbKu0BLegJK9PkYodHstaszcig7zxXfaBji2LYUdtqIkHs+hgYkJQ== dependencies: - "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-builder-react-jsx" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/plugin-syntax-jsx" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz#5b4da4df79391895fca9e28f99e87e22cfc02072" - integrity sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g== +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-regenerator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.3.4.tgz#1601655c362f5b38eead6a52631f5106b29fa46a" + integrity sha512-hvJg8EReQvXT6G9H2MvNPXkv9zK36Vxa1+csAVTpE1J3j0zlHplw76uudEbJxgvqZzAq9Yh45FLD4pk5mKRFQA== dependencies: regenerator-transform "^0.13.4" -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== +"@babel/plugin-transform-regenerator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.0.tgz#0780e27ee458cc3fdbad18294d703e972ae1f6d1" + integrity sha512-SZ+CgL4F0wm4npojPU6swo/cK4FcbLgxLd4cWpHaNXY/NJ2dpahODCqBbAwb2rDmVszVb3SSjnk9/vik3AYdBw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + regenerator-transform "^0.13.4" "@babel/plugin-transform-runtime@7.2.0": version "7.2.0" @@ -718,9 +923,9 @@ semver "^5.5.1" "@babel/plugin-transform-runtime@^7.3.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.4.tgz#a50f5d16e9c3a4ac18a1a9f9803c107c380bce08" - integrity sha512-aMVojEjPszvau3NRg+TIH14ynZLvPewH4xhlCW1w6A3rkxTS1m4uwzRclYR9oS+rl/dr+kT+pzbfHuAWP/lc7Q== + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.3.4.tgz#57805ac8c1798d102ecd75c03b024a5b3ea9b431" + integrity sha512-PaoARuztAdd5MgeVjAxnIDAIUet5KpogqaefQvPOmPYCxYoaPhautxDh3aO8a4xHsKgT/b9gSxR0BKK1MIewPA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -749,10 +954,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.2.0", "@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -764,24 +969,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typescript@^7.1.0", "@babel/plugin-transform-typescript@^7.3.2": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.4.tgz#93e9c3f2a546e6d3da1e9cc990e30791b807aa9f" - integrity sha512-rwDvjaMTx09WC0rXGBRlYSSkEHOKRrecY6hEr3SVIPKII8DVWXtapNAfAyMC0dovuO+zYArcAuKeu3q9DNRfzA== +"@babel/plugin-transform-typescript@^7.1.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.0.tgz#0389ec53a34e80f99f708c4ca311181449a68eb1" + integrity sha512-U7/+zKnRZg04ggM/Bm+xmu2B/PrwyDQTT/V89FXWYWNMxBDwSx56u6jtk9SEbfLFbZaEI72L+5LPvQjeZgFCrQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" -"@babel/plugin-transform-unicode-regex@^7.2.0", "@babel/plugin-transform-unicode-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" - integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== +"@babel/plugin-transform-typescript@^7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.3.2.tgz#59a7227163e55738842f043d9e5bd7c040447d96" + integrity sha512-Pvco0x0ZSCnexJnshMfaibQ5hnK8aUHSvjCQhC1JR8eeg+iBwt0AtCO7gWxJ358zZevuf9wPSO5rv+WJcbHPXQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" + "@babel/plugin-syntax-typescript" "^7.2.0" + +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" + integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" -"@babel/polyfill@7.2.5": +"@babel/polyfill@7.2.5", "@babel/polyfill@^7.2.5": version "7.2.5" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.2.5.tgz#6c54b964f71ad27edddc567d065e57e87ed7fa7d" integrity sha512-8Y/t3MWThtMLYr0YNC/Q76tqN1w30+b0uQMeFUYauG2UGTR19zyUtFrAzT23zNtBxPp+LbE5E/nwV/q/r3y6ug== @@ -789,10 +1002,10 @@ core-js "^2.5.7" regenerator-runtime "^0.12.0" -"@babel/polyfill@^7.0.0", "@babel/polyfill@^7.2.5": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.4.tgz#78801cf3dbe657844eeabf31c1cae3828051e893" - integrity sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg== +"@babel/polyfill@^7.0.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.3.tgz#332dc6f57b718017c3a8b37b4eea8aa6eeac1187" + integrity sha512-rkv8WIvJshA5Ev8iNMGgz5WZkRtgtiPexiT7w5qevGTuT7ZBfM3de9ox1y9JR5/OXb/sWGBbWlHNa7vQKqku3Q== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.2" @@ -846,59 +1059,105 @@ js-levenshtein "^1.1.3" semver "^5.3.0" -"@babel/preset-env@^7.3.4", "@babel/preset-env@^7.4.1", "@babel/preset-env@^7.4.3": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.4.tgz#b6f6825bfb27b3e1394ca3de4f926482722c1d6f" - integrity sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw== +"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.3.1": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.2.tgz#2f5ba1de2daefa9dcca653848f96c7ce2e406676" + integrity sha512-OEz6VOZaI9LW08CWVS3d9g/0jZA6YCn1gsKIy/fut7yZCJti5Lm1/Hi+uo/U+ODm7g4I6gULrCP+/+laT8xAsA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0" "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-object-rest-spread" "^7.4.0" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.0" "@babel/plugin-syntax-async-generators" "^7.2.0" "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-async-to-generator" "^7.4.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.4.4" - "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-block-scoping" "^7.4.0" + "@babel/plugin-transform-classes" "^7.4.0" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-destructuring" "^7.4.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" "@babel/plugin-transform-duplicate-keys" "^7.2.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-for-of" "^7.4.0" + "@babel/plugin-transform-function-name" "^7.2.0" "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.4.4" - "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-commonjs" "^7.4.0" + "@babel/plugin-transform-modules-systemjs" "^7.4.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.4" - "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.2" + "@babel/plugin-transform-new-target" "^7.4.0" "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.4" - "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.0" + "@babel/plugin-transform-regenerator" "^7.4.0" "@babel/plugin-transform-shorthand-properties" "^7.2.0" "@babel/plugin-transform-spread" "^7.2.0" "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-template-literals" "^7.2.0" "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.4.4" - browserslist "^4.5.2" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + "@babel/types" "^7.4.0" + browserslist "^4.4.2" core-js-compat "^3.0.0" invariant "^2.2.2" js-levenshtein "^1.1.3" - semver "^5.5.0" + semver "^5.3.0" + +"@babel/preset-env@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1" + integrity sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.3.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.3.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.3.4" + "@babel/plugin-transform-classes" "^7.3.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.3.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.3.4" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" "@babel/preset-flow@^7.0.0": version "7.0.0" @@ -936,21 +1195,30 @@ "@babel/plugin-transform-typescript" "^7.3.2" "@babel/register@^7.0.0": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.4.4.tgz#370a68ba36f08f015a8b35d4864176c6b65d7a23" - integrity sha512-sn51H88GRa00+ZoMqCVgOphmswG4b7mhf9VOB0LUBAieykq2GnRFerlN+JQkO/ntT7wz4jaHNSRPg9IdMPEUkA== + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0.tgz#fa634bae1bfa429f60615b754fc1f1d745edd827" + integrity sha512-f/+CRmaCe7rVEvcvPvxeA8j5aJhHC3aJie7YuqcMDhUOuyWLA7J/aNrTaHIzoWPEhpHA54mec4Mm8fv8KBlv3g== dependencies: - core-js "^3.0.0" - find-cache-dir "^2.0.0" - lodash "^4.17.11" + core-js "^2.5.7" + find-cache-dir "^1.0.0" + home-or-tmp "^3.0.0" + lodash "^4.17.10" mkdirp "^0.5.1" pirates "^4.0.0" source-map-support "^0.5.9" +"@babel/runtime-corejs2@^7.3.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.3.4.tgz#63f8bbc77622da202e9ea6f8f6e3bf28991832d9" + integrity sha512-QwPuQE65kNxjsNKk34Rfgen2R5fk0J2So99SD45uXBp34QOfyz11SqVgJ4xvyCpnCIieSQ0X0hSSc9z/ymlJJw== + dependencies: + core-js "^2.5.7" + regenerator-runtime "^0.12.0" + "@babel/runtime-corejs2@^7.4.2": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.4.4.tgz#4d4519a4c85e9d98fdff59f5371758a34ae07923" - integrity sha512-hE7oVwVsRws84u5/nkaWWdN2J4SXEGuXKjrAsP0E4nkYImjSbpdHfGTS2nvFc82aDGIuG6OzhAQMpIzTHuZeKA== + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.4.3.tgz#40271fc260e570fb356da984e42e5990bd275860" + integrity sha512-anTLTF7IK8Hd5f73zpPzt875I27UaaTWARJlfMGgnmQhvEe1uNHQRKBUbXL0Gc0VEYiVzsHsTPso5XdK8NGvFg== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.2" @@ -970,53 +1238,92 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.3": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.4.tgz#dc2e34982eb236803aa27a07fea6857af1b9171d" - integrity sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.5.tgz#4170907641cf1f61508f563ece3725150cc6fe39" + integrity sha512-xKnPpXG/pvK1B90JkwwxSGii90rQGKtzcMt2gI5G6+M0REXaq6rOHsGC2ay6/d0Uje7zzvSzjEzfR3ENhFlrfA== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@^7.2.0", "@babel/runtime@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" + integrity sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA== dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0", "@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== +"@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" + integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + +"@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" + integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.3.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.3.4" + "@babel/types" "^7.3.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.2.2", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" - integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== +"@babel/traverse@^7.2.2", "@babel/traverse@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.0.tgz#14006967dd1d2b3494cdd650c686db9daf0ddada" + integrity sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" + "@babel/generator" "^7.4.0" "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" - integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" + integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== dependencies: esutils "^2.0.2" lodash "^4.17.11" to-fast-properties "^2.0.0" -"@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== +"@babel/types@^7.1.6", "@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" "@elastic/charts@^3.11.2": version "3.11.4" @@ -1344,6 +1651,14 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.2.tgz#63985d3d8b02530e0869962f4da09142ee8e200e" integrity sha512-n/VQ4mbfr81aqkx/XmVicOLjviMuy02eenSdJY33SVA7S2J42EU0P1H0mOogfYedb3wXA0d/LVtBrgTSm04WEA== +"@gimenete/type-writer@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@gimenete/type-writer/-/type-writer-0.1.3.tgz#2d4f26118b18d71f5b34ca24fdd6d1fd455c05b6" + integrity sha512-vhpvVfM/fYqb1aAnkgOvtDKoOgU3ZYIvDnKSDAFSoBvallmGURMlHOE0/VG/gqunUZVXGCFBGHxI8swjBh+sIA== + dependencies: + camelcase "^5.0.0" + prettier "^1.13.7" + "@graphql-modules/epoxy@0.1.9": version "0.1.9" resolved "https://registry.yarnpkg.com/@graphql-modules/epoxy/-/epoxy-0.1.9.tgz#291879d517ba4473ea334edbb137a2cc6aed384c" @@ -1388,165 +1703,29 @@ resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== -"@jest/console@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" - integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== - dependencies: - "@jest/source-map" "^24.3.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/core@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.7.1.tgz#6707f50db238d0c5988860680e2e414df0032024" - integrity sha512-ivlZ8HX/FOASfHcb5DJpSPFps8ydfUYzLZfgFFqjkLijYysnIEOieg72YRhO4ZUB32xu40hsSMmaw+IGYeKONA== - dependencies: - "@jest/console" "^24.7.1" - "@jest/reporters" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-changed-files "^24.7.0" - jest-config "^24.7.1" - jest-haste-map "^24.7.1" - jest-message-util "^24.7.1" - jest-regex-util "^24.3.0" - jest-resolve-dependencies "^24.7.1" - jest-runner "^24.7.1" - jest-runtime "^24.7.1" - jest-snapshot "^24.7.1" - jest-util "^24.7.1" - jest-validate "^24.7.0" - jest-watcher "^24.7.1" - micromatch "^3.1.10" - p-each-series "^1.0.0" - pirates "^4.0.1" - realpath-native "^1.1.0" - rimraf "^2.5.4" - strip-ansi "^5.0.0" - -"@jest/environment@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.7.1.tgz#9b9196bc737561f67ac07817d4c5ece772e33135" - integrity sha512-wmcTTYc4/KqA+U5h1zQd5FXXynfa7VGP2NfF+c6QeGJ7c+2nStgh65RQWNX62SC716dTtqheTRrZl0j+54oGHw== - dependencies: - "@jest/fake-timers" "^24.7.1" - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - jest-mock "^24.7.0" - -"@jest/fake-timers@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.7.1.tgz#56e5d09bdec09ee81050eaff2794b26c71d19db2" - integrity sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA== - dependencies: - "@jest/types" "^24.7.0" - jest-message-util "^24.7.1" - jest-mock "^24.7.0" - -"@jest/reporters@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.7.1.tgz#38ac0b096cd691bbbe3051ddc25988d42e37773a" - integrity sha512-bO+WYNwHLNhrjB9EbPL4kX/mCCG4ZhhfWmO3m4FSpbgr7N83MFejayz30kKjgqr7smLyeaRFCBQMbXpUgnhAJw== - dependencies: - "@jest/environment" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - istanbul-api "^2.1.1" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-source-maps "^3.0.1" - jest-haste-map "^24.7.1" - jest-resolve "^24.7.1" - jest-runtime "^24.7.1" - jest-util "^24.7.1" - jest-worker "^24.6.0" - node-notifier "^5.2.1" - slash "^2.0.0" - source-map "^0.6.0" - string-length "^2.0.0" - -"@jest/source-map@^24.3.0": - version "24.3.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" - integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.7.1.tgz#19eacdb29a114300aed24db651e5d975f08b6bbe" - integrity sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg== - dependencies: - "@jest/console" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-sequencer@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.7.1.tgz#9c18e428e1ad945fa74f6233a9d35745ca0e63e0" - integrity sha512-84HQkCpVZI/G1zq53gHJvSmhUer4aMYp9tTaffW28Ih5OxfCg8hGr3nTSbL1OhVDRrFZwvF+/R9gY6JRkDUpUA== - dependencies: - "@jest/test-result" "^24.7.1" - jest-haste-map "^24.7.1" - jest-runner "^24.7.1" - jest-runtime "^24.7.1" - -"@jest/transform@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.7.1.tgz#872318f125bcfab2de11f53b465ab1aa780789c2" - integrity sha512-EsOUqP9ULuJ66IkZQhI5LufCHlTbi7hrcllRMUEV/tOgqBVQi93+9qEvkX0n8mYpVXQ8VjwmICeRgg58mrtIEw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.7.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.7.1" - jest-regex-util "^24.3.0" - jest-util "^24.7.1" - micromatch "^3.1.10" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - -"@jest/types@^24.7.0": - version "24.7.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.7.0.tgz#c4ec8d1828cdf23234d9b4ee31f5482a3f04f48b" - integrity sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA== +"@jest/types@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.5.0.tgz#feee214a4d0167b0ca447284e95a57aa10b3ee95" + integrity sha512-kN7RFzNMf2R8UDadPOl6ReyI+MT8xfqRuAnuVL+i4gwjv/zubdDK+EDeLHYwq1j0CSSR2W/MmgaRlMZJzXdmVA== dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-lib-coverage" "^1.1.0" "@types/yargs" "^12.0.9" -"@jimp/bmp@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.6.4.tgz#0f4b94486e979d82c83e1e87cd00b756afb26e49" - integrity sha512-dhKM7Cjw4XoOefx3/we2+vWyTP6hQPpM7mEsziGjtsrK2f/e3/+hhHbEsQNgO9BOA1FPJRXAOiYHts9IlMH1mg== +"@jimp/bmp@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.6.0.tgz#6eb3ad441ed3f1418a32a89a4244285914b2a15c" + integrity sha512-zZOcVT1zK/1QL5a7qirkzPPgDKB1ianER7pBdpR2J71vx/g8MnrPbL3h/jEVPxjdci2Hph/VWhc/oLBtTbqO8w== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" bmp-js "^0.1.0" core-js "^2.5.7" -"@jimp/core@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.6.4.tgz#19ab5f4ff0db4f602b36b159c714e37ebfb5672f" - integrity sha512-nyiAXI8/uU54fGO53KrRB8pdn1s+IODZ+rj0jG2owsNJlTlagFrsZAy8IVTUCOiiXjh9TbwFo7D5XMrmi4KUww== +"@jimp/core@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.6.0.tgz#a366988f6b339db9a8e2ce532fa90f017ea7f02f" + integrity sha512-ngAkyCLtX7buc2QyFy0ql/j4R2wGYQVsVhW2G3Y0GVAAklRIFIUYpyNKrqs228xA8f2O6XStbDStFlYkt7uNeg== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" any-base "^1.1.0" buffer "^5.2.0" core-js "^2.5.7" @@ -1559,228 +1738,228 @@ tinycolor2 "^1.4.1" "@jimp/custom@^0.6.0": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.6.4.tgz#eb1abbda83f13149e50e71f0c5fc78d873fb485b" - integrity sha512-sdBHrBoVr1+PFx4dlUAgXvvu4dG0esQobhg7qhpSLRje1ScavIgE2iXdJKpycgzrqwAOL8vW4/E5w2/rONlaoQ== + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.6.0.tgz#acccc248701c20007ea6f4972a1aeb55e2c2d7fb" + integrity sha512-+YZIWhf03Rfbi+VPbHomKInu3tcntF/aij/JrIJd1QZq13f8m3mRNxakXupiL18KH0C8BPNDk8RiwFX+HaOw3A== dependencies: - "@jimp/core" "^0.6.4" + "@jimp/core" "^0.6.0" core-js "^2.5.7" -"@jimp/gif@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.6.4.tgz#cbe8c27ceffd28112ec045b3f8a74724b8d3cdd0" - integrity sha512-14mLoyG0UrYJsGNRoXBFvSJdFtBD0BSBwQ1zCNeW+HpQqdl+Kh5E1Pz4nqT2KNylJe1jypyR51Q2yndgcfGVyg== +"@jimp/gif@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.6.0.tgz#f4cd1d6671465790282d50117f8e00748aff1037" + integrity sha512-aWQ02P0ymTN1eh0BVsY+84wMdb/QeiVpCNQZl9y50cRnpuMM8TTmF/ZdCEBDiTRFcwXzHsqBXcLwEcYp3X2lTw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" omggif "^1.0.9" -"@jimp/jpeg@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.6.4.tgz#613e040514b1876a802f7943399be2b304bdb461" - integrity sha512-NrFla9fZC/Bhw1Aa9vJ6cBOqpB5ylEPb9jD+yZ0fzcAw5HwILguS//oXv9EWLApIY1XsOMFFe0XWpY653rv8hw== +"@jimp/jpeg@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.6.0.tgz#9061f495f19a7f9039e39380faef8a6004b57c36" + integrity sha512-quYb+lM4h57jQvr2q9dEIkc0laTljws4dunIdFhJRfa5UlNL5mHInk8h5MxyALo0mZdT07TAcxiDHw5QXZ28JQ== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" jpeg-js "^0.3.4" -"@jimp/plugin-blit@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.6.4.tgz#f8d7b2fa635fbef79d11f7476ff40e8aed00c026" - integrity sha512-suVznd4XozkQIuECX0u8kMl+cAQpZN3WcbWXUcJaVxRi+VBvHIetG1Qs5qGLzuEg9627+kE7ppv0UgZ5mkE6lg== +"@jimp/plugin-blit@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.6.0.tgz#fe8495dfdefff72da9923682626d668c1126ad75" + integrity sha512-LjiCa+8OT2fgmvBpZt0ogurg/eu5kB8ZFWDRwHPcf8i+058sZC20dar/qrjVd5Knssq4ynjb5oAHsGuJq16Rqw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-blur@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.6.4.tgz#dd5d64454cae865ea8e4c6133b75708e93f31d89" - integrity sha512-M2fDMYUUtEKVNnCJZk5J0KSMzzISobmWfnG88RdHXJCkOn98kdawQFwTsYOfJJfCM8jWfhIxwZLFhC/2lkTN2w== +"@jimp/plugin-blur@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.6.0.tgz#6537943782775c1a3d656c6a17c6bbe64fe16f65" + integrity sha512-/vjGcEiHda6OLTCYqXPFkfSTbL+RatZoGcp1vewcWqChUccn9QVINTlxB7nEI/3Nb/i7KdhOPNEQh1k6q6QXsw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-color@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.6.4.tgz#d5ce139a0e665437ef9d5df7642be66f33735645" - integrity sha512-6Nfr2l9KSb6zH2fij8G6fQOw85TTkyRaBlqMvDmsQp/I1IlaDbXzA2C2Eh9jkQYZQDPu61B1MkmlEhJp/TUx6Q== +"@jimp/plugin-color@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.6.0.tgz#a2f36d8484e50ad7c8f5a0d484bfc4f5d536dfb0" + integrity sha512-mvDeAwN8ZpDkOaABMJ0w9zUzo9OOtu1qvvPkSirXDTMiXt1nsbfz8BoeoD7nU2MFhQj5MiGjH65UDnsH5ZzYuw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" tinycolor2 "^1.4.1" -"@jimp/plugin-contain@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.6.4.tgz#ee2cc03a066cc1ec9dcb2a5c6cdbbfb80af42d05" - integrity sha512-qI1MxU1noS6NbEPu/bDDeP405aMviuIsfpOz8J3En8IwIwrJV22qt6QIHmF+eyng8CYgivwIPjEPzFzLR566Nw== +"@jimp/plugin-contain@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.6.0.tgz#174c94777db264dcb0796f515b84d0497428959f" + integrity sha512-gPHnoQkDztMbvnTVo01BaMoM/hhDJdeJ7FRToD4p4Qvdor4V0I6NXtjOeUPXfD94miTgh/UTyJDqeG4GZzi4sA== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-cover@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.6.4.tgz#1d341438552ffc673c2e8b68b4419b9aaf844657" - integrity sha512-z6eafPonj3LJY8cTEfRkXmOfCDi1+f0tbYaNvmiu+OrWJ3Ojw2hMt+BVVvJ8pKe1dWIFkCjxOjyjZWj1gEkaLw== +"@jimp/plugin-cover@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.6.1.tgz#ac4e1d49e3d47e018b0a699156ca183b536befb9" + integrity sha512-mYDchAeP9gcBCgi7vX2cYBNygY1s/YaEKEUvSh2H5+DJfxtp/eynW+bInypCfbQJArZZX+26F5GufWnkB8BOnw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-crop@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.6.4.tgz#3447611790703cd7d51a0127b2cf77906711f9ec" - integrity sha512-w9TR+pn+GeWbznscGe2HRkPxInge0whAF3TLPWhPwBVjZChTT8dSDXsUpUlxQqvI4SfzuKp8z3/0SBqYDCzxxA== +"@jimp/plugin-crop@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.6.1.tgz#69c85db28fb7a168eca14c43ae7d5225ce0bddb1" + integrity sha512-rnxkgLvm1oC7yCg8mOIUqLNjAzzRC0eVTD3hfYq3LzDMe2LfpU208WhtVw0IjSJ2N7OSrRztJcw+jkVF8nUJJg== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-displace@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.6.4.tgz#7d641e402aade5d13d8eea93dc94fac39027da97" - integrity sha512-MEvtBXOAio/3iGJkKBrTtFs3Q38ez2Wy/wTD0Ruas+L8fjJR7l4mDgV+zjRr57CqB5mpY+L48VEoa2/gNXh9cg== +"@jimp/plugin-displace@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.6.0.tgz#d96c66fc54283a9865a2e8044adebd54f093b366" + integrity sha512-kkva5Fy3r7J7QmiqYQ5c9NeUKKkN7+KSfCGsZ6tkRHK4REMIXhQO/OnJN8XG6RReV29O6QykdyeTXDiHUDiROw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-dither@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.6.4.tgz#3feea3cd3ef59f951759c9ac0bafdd4abee50d7b" - integrity sha512-w+AGLcIMUeJZ4CI0FvFomahgKLcW+ICsLidUNOqyLzceluPAfug4X7vDhQ41pNkzKg0M1+Q1j0aWV8bdyF+LhA== +"@jimp/plugin-dither@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.6.0.tgz#c7470480fd6d23a67188c2270ac3e9494a051d61" + integrity sha512-ILSG7bl3SOqmcIa9C4nBvs0h0E0ObnMbeKWUZiNuz6i0OAlbxryiIfU4j0UVQD5XqT9ksC5mviVNrvOMw4SZLw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-flip@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.6.4.tgz#3ac31f01a4e1dc07caa9ff8c6a34097fb719de19" - integrity sha512-ukINMegMUM9KYjyDCiyYKYdSsbhNRLHDwOJN0xVRalmOKqNaZmjNbiMbaVxKlYt6sHW76RhSMOekw9f6GQB9tQ== +"@jimp/plugin-flip@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.6.0.tgz#cdfbc6059e156912a50c41cb5f617a4693f793d2" + integrity sha512-MXGGwABjERvfqVadEzJuVAmbsEQfjxXD0O/mMBegU1Qh7/JmnKAVplQCnojsMPxUdao/FKZjQqOnB/j4LLJtOQ== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-gaussian@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.6.4.tgz#17d51465dc973cb97ce8d433f2c0c565070377a9" - integrity sha512-C1P6ohzIddpNb7CX5X+ygbp+ow8Fpt64ZLoIgdjYPs/42HxKluvY62fVfMhY6m5zUGKIMbg0uYeAtz/9LRJPyw== +"@jimp/plugin-gaussian@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.6.0.tgz#fc97468e67dccd9872d1fb177e4bbc5e8e2944ec" + integrity sha512-RUsBCyj6Ukxgn/TU8v6c6WRbSFqKM0iknLVqDkKIuiOyJB7ougv66fqomh/i/h3ihIkEnf50BuO0c3ovrczfvw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-invert@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.6.4.tgz#38c8a6fa5d62f0c2a097041d09595decb10f7d36" - integrity sha512-sleGz1jXaNEsP/5Ayqw8oez/6KesWcyCqovIuK4Z4kDmMc2ncuhsXIJQXDWtIF4tTQVzNEgrxUDNA4bi9xpCUA== +"@jimp/plugin-invert@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.6.0.tgz#da4879a41cc0c12110c2bf5e63524b07819c3524" + integrity sha512-zTCqK8el6eqcNKAxw0y57gHBFgxygI5iM8dQDPyqsvVWO71i8XII7ubnJhEvPPN7vhIKlOSnS9XXglezvJoX4Q== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-mask@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.6.4.tgz#47bb907a70c457f51439f96e2dc0fa73dd2b8ea2" - integrity sha512-3D4FbRxnpO9nzwa6cF8AImgO1aVReYbfRRO4I4bku4/iZ+kuU3fBLV+SRhB4c7di3ejG5u+rGsIfaNc94iYYvw== +"@jimp/plugin-mask@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.6.0.tgz#845b40bb00c66eec15c12c5b2ed970d0837985c2" + integrity sha512-zkZVqAA7lxWhkn5EbPjBQ6tPluYIGfLMSX4kD1gksj+MVJJnVAd459AVuEXCvkUvv4wG5AlH8m6ve5NZj9vvxw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-normalize@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.6.4.tgz#6f49eb866b605c947c05fd9ca6ea3934f57137e4" - integrity sha512-nOFMwOaVkOKArHkD/T6/1HKAPj3jlW6l0JduVDn1A5eIPCtlnyhlE9zdjgi5Q9IBR/gRjwW6tTzBKuJenS51kg== +"@jimp/plugin-normalize@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.6.0.tgz#b1769aef2c89cbde1879c6b43d15b535f2b284c8" + integrity sha512-7bNGT+S0rw9gvmxpkNsA19JSqBZYFrAn9QhEmoN4HIimdKtJaoLJh/GnxrPuOBLuv1IPJntoTOOWvOmfrQ6/ww== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-print@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.6.4.tgz#6642e2a5dea7fa6fb70c8655f82a770ae0faa0d9" - integrity sha512-3z5DLVCKg0NfZhHATEaYH/4XanIboPP1pOUoxIUeF++qOnGiGgH2giFJlRprHmx2l3E3DukR1v8pt54PGvfrFw== +"@jimp/plugin-print@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.6.1.tgz#6465c8d387eadf41d457f9ee3898ca871138cff0" + integrity sha512-gZOrYEOFtohRYsGJNh9fQkBgpiKjDfNXpiXmwdolqBF39pPxRvo9ivTIJ7sHCLpDL+SnQRdR0EHiJ08BFt5Yow== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" load-bmfont "^1.4.0" -"@jimp/plugin-resize@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.6.4.tgz#cf6b253b4f40a6f9678509b391bf5a8d261951c8" - integrity sha512-fk2+KheUNClrOWj6aDNWj1r4byVQb6Qxy4aT1UHX5GXPHDA+nhlej7ghaYdzeWZYodeM3lpasYtByu1XE2qScQ== +"@jimp/plugin-resize@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.6.0.tgz#d66be57b9bb950e66a6f686c97fbab76bc705af4" + integrity sha512-m0AA/mPkJG++RuftBFDUMRenqgIN/uSh88Kqs33VURYaabApni4ML3QslE1TCJtl2Lnu1eosxYlbzODjHx49eg== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-rotate@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.6.4.tgz#3075538a8f644d78d07ea3f126ee3c85a37302bc" - integrity sha512-44VgV5D4xQIYInJAVevdW9J3SOhGKyz0OEr2ciA8Q3ktonKx0O5Q1g2kbruiqxFSkK/u2CKPLeKXZzYCFrmJGQ== +"@jimp/plugin-rotate@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.6.1.tgz#1e9b3e58b51e0498bd94d52fff793ddd2a77c81f" + integrity sha512-+YYjO4Y664k0IfsPJVz4Er3pX+C8vYDWD9L2am01Jls4LT7GtUZbgIKuqwl8qXX0ENc/aF9UssuWIYVVzEoapw== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" -"@jimp/plugin-scale@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.6.4.tgz#062305d129ab80d0e49df021ab96202b0594a3dc" - integrity sha512-RAQRaDiCHmEz+A8QS5d/Z38EnlNsQizz3Mu3NsjA8uFtJsv1yMKWXZSQuzniofZw8tlMV6oI3VdM0eQVE07/5w== +"@jimp/plugin-scale@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.6.0.tgz#751d0d9ae44aaf9f9b4934bc2a4dd34122cd2894" + integrity sha512-le/ttYwYioNPRoMlMaoJMCTv+m8d1v0peo/3J8E6Rf9ok7Bw3agkvjL9ILnsmr8jXj1YLrBSPKRs5nJ6ziM/qA== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" "@jimp/plugins@^0.6.0": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.6.4.tgz#341eeadab17ab1a1bac99b788acf2a43369f119d" - integrity sha512-NpO/87CKnF4Q9r8gMl6w+jPKOM/C089qExkViD9cPvcFZEnyVOu7ucGzcMmTcabWOU62iQTOkRViPYr6XaK0LQ== - dependencies: - "@jimp/plugin-blit" "^0.6.4" - "@jimp/plugin-blur" "^0.6.4" - "@jimp/plugin-color" "^0.6.4" - "@jimp/plugin-contain" "^0.6.4" - "@jimp/plugin-cover" "^0.6.4" - "@jimp/plugin-crop" "^0.6.4" - "@jimp/plugin-displace" "^0.6.4" - "@jimp/plugin-dither" "^0.6.4" - "@jimp/plugin-flip" "^0.6.4" - "@jimp/plugin-gaussian" "^0.6.4" - "@jimp/plugin-invert" "^0.6.4" - "@jimp/plugin-mask" "^0.6.4" - "@jimp/plugin-normalize" "^0.6.4" - "@jimp/plugin-print" "^0.6.4" - "@jimp/plugin-resize" "^0.6.4" - "@jimp/plugin-rotate" "^0.6.4" - "@jimp/plugin-scale" "^0.6.4" + version "0.6.1" + resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.6.1.tgz#3e4898a2eab765b4f830be7081ab4c883d77c176" + integrity sha512-gCgYxsQn3z5qifM8G4RfP6vQFKfwK/waVIE3I/mUY9QHZrf94sLuhcws+72hTLQ3It3m3QKaA1kSXrD9nkRdUw== + dependencies: + "@jimp/plugin-blit" "^0.6.0" + "@jimp/plugin-blur" "^0.6.0" + "@jimp/plugin-color" "^0.6.0" + "@jimp/plugin-contain" "^0.6.0" + "@jimp/plugin-cover" "^0.6.1" + "@jimp/plugin-crop" "^0.6.1" + "@jimp/plugin-displace" "^0.6.0" + "@jimp/plugin-dither" "^0.6.0" + "@jimp/plugin-flip" "^0.6.0" + "@jimp/plugin-gaussian" "^0.6.0" + "@jimp/plugin-invert" "^0.6.0" + "@jimp/plugin-mask" "^0.6.0" + "@jimp/plugin-normalize" "^0.6.0" + "@jimp/plugin-print" "^0.6.1" + "@jimp/plugin-resize" "^0.6.0" + "@jimp/plugin-rotate" "^0.6.1" + "@jimp/plugin-scale" "^0.6.0" core-js "^2.5.7" timm "^1.6.1" -"@jimp/png@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.6.4.tgz#2a74b14d1c968d1f09e684803d6e170950728b55" - integrity sha512-qv3oo6ll3XWVIToBwVC1wQX0MFKwpxbe2o+1ld9B4ZDavqvAHzalzcmTd/iyooI85CVDAcC3RRDo66oiizGZCQ== +"@jimp/png@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.6.0.tgz#3eb8a4cd1ff71dc63b1aad5789cf83a3a1508ca1" + integrity sha512-DBtMyQyrJxuKI7/1dVqLek+rCMM8U6BSOTHgo05wU7lhJKTB6fn2tbYfsnHQKzd9ld1M2qKuC+O1GTVdB2yl6w== dependencies: - "@jimp/utils" "^0.6.4" + "@jimp/utils" "^0.6.0" core-js "^2.5.7" pngjs "^3.3.3" -"@jimp/tiff@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.6.4.tgz#c999751b977f01817d785327732ed4e40a4ecc9a" - integrity sha512-8/vD4qleexmhPdppiu6fSstj/n/kGNTn8iIlf1emiqOuMN2PL9q5GOPDWU0xWdGNyJMMIDXJPgUFUkKfqXdg7w== +"@jimp/tiff@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.6.0.tgz#ea65bee43a8ffe972ed9631dabcb9e030acdb004" + integrity sha512-PV95CquEsolFziq0zZrAEJIzZSKwMK89TvkOXTPDi/xesgdXGC2rtG1IZFpC9L4UX5hi/M5GaeJa49xULX6Nqw== dependencies: core-js "^2.5.7" utif "^2.0.1" "@jimp/types@^0.6.0": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.6.4.tgz#242fce9a914875e0b48b6ebac2ab55e95714cdf8" - integrity sha512-/EMbipQDg5U6DnBAgcSiydlMBRYoKhnaK7MJRImeTzhDJ6xfgNOF7lYq66o0kmaezKdG/cIwZ1CLecn2y3D8SQ== - dependencies: - "@jimp/bmp" "^0.6.4" - "@jimp/gif" "^0.6.4" - "@jimp/jpeg" "^0.6.4" - "@jimp/png" "^0.6.4" - "@jimp/tiff" "^0.6.4" + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.6.0.tgz#9e9b942fafed4f364f1b999c9f15399b84da7756" + integrity sha512-j4tm82huEWpLrwave/2NYnMTY6us/6K9Js6Vd/CHoM/ki8M71tMXEVzc8tly92wtnEzQ9+FEk0Ue6pYo68m/5A== + dependencies: + "@jimp/bmp" "^0.6.0" + "@jimp/gif" "^0.6.0" + "@jimp/jpeg" "^0.6.0" + "@jimp/png" "^0.6.0" + "@jimp/tiff" "^0.6.0" core-js "^2.5.7" timm "^1.6.1" -"@jimp/utils@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.6.4.tgz#4a17103829c8487384539f1c2b1db257bbd30c0b" - integrity sha512-EFQurCyEnZLSM2Q1BYDTUmsOJPSOYEQd18Fvq8bGo8hnBHoGLWLWWyNi2l4cYhtpKmIXyhvQqa6/WaEpKPzvqA== +"@jimp/utils@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.6.0.tgz#330ae46adee1cb622fa534fc56fd8a574c9c2d84" + integrity sha512-z5iYEfqc45vlYweROneNkjv32en6jS7lPL/eMLIvaEcQAHaoza20Dw8fUoJ0Ht9S92kR74xeTunAZq+gK2w67Q== dependencies: core-js "^2.5.7" @@ -1911,17 +2090,12 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - "@octokit/app@^2.2.2": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@octokit/app/-/app-2.2.4.tgz#5104696b7acde1a8310fd8f14106fb2805b2900a" - integrity sha512-f/DCK0d3o0qv/RXQUirQEhN91uUS8QRRxPg7vYvEei0TZh+M6SYGy8ZAa4e0gN9zo7T8K0rD99jwE64nV5lzyA== + version "2.2.2" + resolved "https://registry.yarnpkg.com/@octokit/app/-/app-2.2.2.tgz#a1b8248f64159eeccbe4000d888fdae4163c4ad8" + integrity sha512-nUwS8jW107ROGuI0Tq4Ga+Zno6CovwaS+Oen6BOKJmoFMLqqB3oXeGZ6InkidtdmUNiYhMtNq2lydb0WVLT8Zg== dependencies: - "@octokit/request" "^3.0.0" + "@octokit/request" "^2.1.2" "@types/lru-cache" "^5.1.0" jsonwebtoken "^8.3.0" lru-cache "^5.1.1" @@ -1936,29 +2110,7 @@ universal-user-agent "^2.0.1" url-template "^2.0.8" -"@octokit/endpoint@^4.0.0": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-4.2.2.tgz#4ff11382bad89c7e01030a1e62d5e9d13c2402b0" - integrity sha512-5IZjkUNhx5q0IRN7Juwf5A+Lu2qAso7ULST7C1P2mbGHePuCOk936Stcl/5GdJpB3ovD8M6/Lv3xra6Mn0IKNQ== - dependencies: - deepmerge "3.2.0" - is-plain-object "^3.0.0" - universal-user-agent "^2.0.1" - url-template "^2.0.8" - -"@octokit/request@3.0.1", "@octokit/request@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-3.0.1.tgz#21e888c6dce80566ec69477360bab79f2f14861f" - integrity sha512-aH61OVkMKMofGW/go2x4mJ44X4U/JF8xsiFFictwkZYtz0psE8OPKpsP2TZBZaJoCg2wmeTyEgqGfY+veg0hGQ== - dependencies: - "@octokit/endpoint" "^4.0.0" - deprecation "^1.0.1" - is-plain-object "^3.0.0" - node-fetch "^2.3.0" - once "^1.4.0" - universal-user-agent "^2.0.1" - -"@octokit/request@^2.4.2": +"@octokit/request@2.4.2", "@octokit/request@^2.1.2", "@octokit/request@^2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@octokit/request/-/request-2.4.2.tgz#87c36e820dd1e43b1629f4f35c95b00cd456320b" integrity sha512-lxVlYYvwGbKSHXfbPk5vxEA8w4zHOH1wobado4a9EfsyD3Cbhuhus1w0Ye9Ro0eMubGO8kNy5d+xNFisM3Tvaw== @@ -1971,10 +2123,11 @@ universal-user-agent "^2.0.1" "@octokit/rest@^15.10.0": - version "15.18.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.1.tgz#ec7fb0f8775ef64dc095fae6635411d3fbff9b62" - integrity sha512-g2tecjp2TEtYV8bKAFvfQtu+W29HM7ektmWmw8zrMy9/XCKDEYRErR2YvvhN9+IxkLC4O3lDqYP4b6WgsL6Utw== + version "15.10.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.10.0.tgz#9baf7430e55edf1a1024c35ae72ed2f5fc6e90e9" + integrity sha512-xZ4ejCZoqvKrIN3tQOKZlJ6nDQxaOdLcjRsamDnbckU7V5YTn2xheIqFXnQ2vLvxqVwyI8+2dfsODYbHxtwtSw== dependencies: + "@gimenete/type-writer" "^0.1.3" before-after-hook "^1.1.0" btoa-lite "^1.0.0" debug "^3.1.0" @@ -1982,15 +2135,14 @@ https-proxy-agent "^2.2.0" lodash "^4.17.4" node-fetch "^2.1.1" - universal-user-agent "^2.0.0" url-template "^2.0.8" "@octokit/rest@^16.23.2": - version "16.25.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.25.1.tgz#60a3171018dbc4feb23d1bf9805a06aad106d53e" - integrity sha512-a1Byzjj07OMQNUQDP5Ng/rChaI7aq6TNMY1ZFf8+zCVEEtYzCgcmrFG9BDerFbLPPKGQ5TAeRRFyLujUUN1HIg== + version "16.23.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.23.2.tgz#975e84610427c4ab6c41bec77c24aed9b7563db4" + integrity sha512-ZxiZMaCuqBG/IsbgNRVfGwYsvBb5DjHuMGjJgOrinT+/b+1j1U7PiGyRkHDJdjTGA6N/PsMC2lP2ZybX9579iA== dependencies: - "@octokit/request" "3.0.1" + "@octokit/request" "2.4.2" atob-lite "^2.0.0" before-after-hook "^1.4.0" btoa-lite "^1.0.0" @@ -2038,71 +2190,67 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== -"@sinonjs/commons@^1", "@sinonjs/commons@^1.0.2", "@sinonjs/commons@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78" - integrity sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw== +"@sinonjs/commons@^1.0.2", "@sinonjs/commons@^1.2.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.3.0.tgz#50a2754016b6f30a994ceda6d9a0a8c36adda849" + integrity sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA== dependencies: type-detect "4.0.8" -"@sinonjs/formatio@^3.1.0", "@sinonjs/formatio@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" - integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== +"@sinonjs/formatio@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.1.0.tgz#6ac9d1eb1821984d84c4996726e45d1646d8cce5" + integrity sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg== dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^3.1.0" + "@sinonjs/samsam" "^2 || ^3" -"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.1.tgz#e88c53fbd9d91ad9f0f2b0140c16c7c107fe0d07" - integrity sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw== +"@sinonjs/samsam@^2 || ^3", "@sinonjs/samsam@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.0.2.tgz#304fb33bd5585a0b2df8a4c801fcb47fa84d8e43" + integrity sha512-m08g4CS3J6lwRQk1pj1EO+KEVWbrbXsmi9Pw0ySmrIbcVxVaedoFgLvFsV8wHLwh01EpROVz3KvVcD1Jmks9FQ== dependencies: "@sinonjs/commons" "^1.0.2" array-from "^2.1.1" - lodash "^4.17.11" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + lodash.get "^4.4.2" "@slack/client@^4.8.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@slack/client/-/client-4.12.0.tgz#ec14c84a572cd9afed398bbcf7241c5a83e94c57" - integrity sha512-ltbdkcIWk2eIptCCT/oPmeCGlG8xb3kXfwuPTtvNujioLMo2xXqiPdfl7xK+AeUfnvj3fJLYbpTPuBTscuhgzw== + version "4.8.0" + resolved "https://registry.yarnpkg.com/@slack/client/-/client-4.8.0.tgz#265606f1cebae1d72f3fdd2cdf7cf1510783dde4" + integrity sha512-c4PKsRMtTp3QVYg+6cNqqxbU/50gnYfMlZgPCGUuMDMm9mkx50y0PEuERcVyLIe5j61imrhQx9DoNIfybEhTTw== dependencies: "@types/form-data" "^2.2.1" "@types/is-stream" "^1.1.0" + "@types/loglevel" "^1.5.3" "@types/node" ">=6.0.0" - "@types/p-cancelable" "^1.0.0" - "@types/p-queue" "^2.3.2" - "@types/p-retry" "^3.0.0" - "@types/retry" "^0.12.0" + "@types/p-cancelable" "^0.3.0" + "@types/p-queue" "^2.3.1" + "@types/p-retry" "^1.0.1" + "@types/retry" "^0.10.2" "@types/ws" "^5.1.1" axios "^0.18.0" - eventemitter3 "^3.1.0" + eventemitter3 "^3.0.0" finity "^0.5.4" - form-data "^2.3.3" + form-data "^2.3.1" is-stream "^1.1.0" - object.entries "^1.1.0" + loglevel "^1.6.1" + object.entries "^1.0.4" object.getownpropertydescriptors "^2.0.3" - object.values "^1.1.0" - p-cancelable "~1.0.0" - p-queue "^2.4.2" - p-retry "^3.0.1" + object.values "^1.0.4" + p-cancelable "^0.3.0" + p-queue "^2.3.0" + p-retry "^2.0.0" retry "^0.12.0" ws "^5.2.0" "@storybook/addon-actions@^5.0.5": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.0.11.tgz#7ca6d6ce9400b9b97f2699935edade88905767c3" - integrity sha512-1aJ/UDBYAyuqq4wkEYKNv/xwy2BZS61Cl8+c8le5af3Rk/y2HVRuBHPoKptFkS0nACE/XvPSvLPUIHZDLUkkMw== - dependencies: - "@storybook/addons" "5.0.11" - "@storybook/components" "5.0.11" - "@storybook/core-events" "5.0.11" - "@storybook/theming" "5.0.11" + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.0.5.tgz#9179d08262c326c865021f5ecd173708c82edc87" + integrity sha512-m7uNuniFXmMdVSYEajlQ6us465NtLXoIj9cfYGX9wwzxb5tB2EG1oBUxVF5Q6JHC/HlRCsieYViHA+rprVLpJw== + dependencies: + "@storybook/addons" "5.0.5" + "@storybook/components" "5.0.5" + "@storybook/core-events" "5.0.5" + "@storybook/theming" "5.0.5" core-js "^2.6.5" fast-deep-equal "^2.0.1" global "^4.3.2" @@ -2122,14 +2270,14 @@ global "^4.3.2" "@storybook/addon-info@^5.0.5": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/addon-info/-/addon-info-5.0.11.tgz#d051fdf2b9e6c15b0bc4ef2a23200f35f1e1397d" - integrity sha512-lAz0zranutGXtoBbKLIGA4nOlb9YfSDu24A3uR6Q743LTo/SWUiZW14E+JkBkNI/oReev8DyvMSL26t8Z9RlfA== - dependencies: - "@storybook/addons" "5.0.11" - "@storybook/client-logger" "5.0.11" - "@storybook/components" "5.0.11" - "@storybook/theming" "5.0.11" + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-info/-/addon-info-5.0.5.tgz#6b2e4ed0d92481a0e8c21c64d4124e354fd75cfd" + integrity sha512-myWiFGgHXBeIt5K1Znq7UyjPjhxfjT/33g3Jrwp9EBT6rCY0evYuQiUjAxKzXCDMfU+d5IvqobzvdaiqETpDxQ== + dependencies: + "@storybook/addons" "5.0.5" + "@storybook/client-logger" "5.0.5" + "@storybook/components" "5.0.5" + "@storybook/theming" "5.0.5" core-js "^2.6.5" global "^4.3.2" marksy "^6.1.0" @@ -2143,14 +2291,14 @@ util-deprecate "^1.0.2" "@storybook/addon-knobs@^5.0.5": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.0.11.tgz#1f093560ceec78f4906e0575ded0ac03b4494b09" - integrity sha512-9/Q88GhzISxue1wxvbfVa1e8kBA1V6ny1eXWwKN1TRIfBRk4fzmIQtgKMf2R9kQ1VJCzzPHs1sHEpjjvSGbMFw== - dependencies: - "@storybook/addons" "5.0.11" - "@storybook/components" "5.0.11" - "@storybook/core-events" "5.0.11" - "@storybook/theming" "5.0.11" + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.0.5.tgz#965d3afc86bd2373ad4514529ec0f4e590c7db45" + integrity sha512-LbtWoCd6oBQP4pSLZ3ZGdZ5hfWSni4M2BXTy2MRoH4cNYRyHFeVthtGCqLAywnO8Gg7ei24/1uVyS4J8ezTcRg== + dependencies: + "@storybook/addons" "5.0.5" + "@storybook/components" "5.0.5" + "@storybook/core-events" "5.0.5" + "@storybook/theming" "5.0.5" copy-to-clipboard "^3.0.8" core-js "^2.6.5" escape-html "^1.0.3" @@ -2165,20 +2313,20 @@ util-deprecate "^1.0.2" "@storybook/addon-options@^5.0.5": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/addon-options/-/addon-options-5.0.11.tgz#fea3b1b92e64c2321efa52fac67772043126cc66" - integrity sha512-vfeuKm25y8yfiqmYbL4T98BXXzbUPOldrVmAQevYF2pqaoLnBpFneMqgSEJwV0m25kHBR6rWRj9HT6BdDDpWfg== + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-options/-/addon-options-5.0.5.tgz#359ccd9dbc215491a6aea6c09fd2ad43b602c534" + integrity sha512-fi99hBTkNVOAAAaJLKkK2xtjMPwwZgfJsXZzwj5b10SIlNP7ojMIBh9lVis9uuHHTTZMOm7VW3N+CHtI+TCzjA== dependencies: - "@storybook/addons" "5.0.11" + "@storybook/addons" "5.0.5" core-js "^2.6.5" util-deprecate "^1.0.2" "@storybook/addon-storyshots@^5.0.5": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/addon-storyshots/-/addon-storyshots-5.0.11.tgz#006335e7949c6e03b81f6570c050dc5bb912d102" - integrity sha512-75G+LMdCJWnLnKNtzwe0xYIf5lg+2v8NHLiHHE4MtFtCDWoP/IlDKS5wqiziHMmtqbFB402HsCuS5u0ArYbw1Q== + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-storyshots/-/addon-storyshots-5.0.5.tgz#af0786076a0ad2e37cd5c7d717ebd55a2d133e1d" + integrity sha512-NvqSctlzhzPWdCq03GecwolxpJsVUGnCAlgU21TBsBmSCS9DPDYpv/yw0gj9x8DDG6O+ZmrzCURe3haAAMjbvQ== dependencies: - "@storybook/addons" "5.0.11" + "@storybook/addons" "5.0.5" core-js "^2.6.5" glob "^7.1.3" global "^4.3.2" @@ -2186,44 +2334,44 @@ read-pkg-up "^4.0.0" regenerator-runtime "^0.12.1" -"@storybook/addons@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.0.11.tgz#86de70747e0a692d9dd8ea431daa1147d8785697" - integrity sha512-zw3vjYa2EfFQKKZd8/o44eVy5xaZpFEBY/4mGMBBTQb57H0X1VTzE4VxHrk7fGPJMdmrPfXbYEiQtfHyO56y+w== +"@storybook/addons@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.0.5.tgz#5f979a5575c58b8a2dcb78c01795aa8321826e2b" + integrity sha512-AsEdBCN8R03lwXUT4HjPn4yEER/oGGfbjza0ZLhUJ9JO3dcOuHk69a7ENOsM3BoJANRJuSxbfPwTNPe44Q8Vaw== dependencies: - "@storybook/channels" "5.0.11" - "@storybook/client-logger" "5.0.11" + "@storybook/channels" "5.0.5" + "@storybook/client-logger" "5.0.5" core-js "^2.6.5" global "^4.3.2" util-deprecate "^1.0.2" -"@storybook/channel-postmessage@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.0.11.tgz#0f63ddfc699936c96a054b002e1b544bc4540f95" - integrity sha512-Vm9GLSDrMchyhoxZqNUuKlnIaMHNLV3QBjVGhHox/WvSq1An4wlqlJnjrO3YvbX1I1wcFjlUwQp1x9VJBL7sGw== +"@storybook/channel-postmessage@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.0.5.tgz#d55f99ad29d79c1fd2881777d0a41857fb603304" + integrity sha512-ERxuRvjyaKhnkgYTnCcc6RnF2X3lPoxoW3h4w8gcxNOq6kcjtcrV6ehDTS2z1g8P/l+ljbkc3ywBdjGmUyll5A== dependencies: - "@storybook/channels" "5.0.11" - "@storybook/client-logger" "5.0.11" + "@storybook/channels" "5.0.5" + "@storybook/client-logger" "5.0.5" core-js "^2.6.5" global "^4.3.2" telejson "^2.1.0" -"@storybook/channels@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.0.11.tgz#fae33809ed14187e7962bb10b813085c6838538c" - integrity sha512-50kaqBZSkB91c5iXtZ8gGQuj3oOAshGXYukvyw9CsQMdcXtw46hX5DNvdBH7E1UCNtbtk91pS0W0YMbP3avmIQ== +"@storybook/channels@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.0.5.tgz#76a7a0ead489a544dc6827e09e8ef66fa5415a78" + integrity sha512-PKSGev6fRzquBpeqk473P7M+2GmTveO4v2LFkFyUOQkxKyyGJzbLkfrptgy1SNBpqmPRkiIxGIrab7iN9QUbEg== dependencies: core-js "^2.6.5" -"@storybook/client-api@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.0.11.tgz#b0b0ab3ce77320752a4966d17e3eb709ffe554b2" - integrity sha512-HA93c11qTCcU0FyrhS3n851aGAO3LUiPUg/Hmp6Uq+4TIqLoKBtLHsrE6V6KTMg1ej9bYm1V5u7QryMfR+VgkA== +"@storybook/client-api@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.0.5.tgz#d6ff7d58d91d0eb3c39eaf7fac6c1a1107854f0c" + integrity sha512-6gljT9I+YMC/Ks8Vc7PmMHDD1ViMh3kjbuLSF+NqGubgPts/pvDHtisQkxei0wWVJEppjvIT/qe5AMYNmFeU0g== dependencies: - "@storybook/addons" "5.0.11" - "@storybook/client-logger" "5.0.11" - "@storybook/core-events" "5.0.11" - "@storybook/router" "5.0.11" + "@storybook/addons" "5.0.5" + "@storybook/client-logger" "5.0.5" + "@storybook/core-events" "5.0.5" + "@storybook/router" "5.0.5" common-tags "^1.8.0" core-js "^2.6.5" eventemitter3 "^3.1.0" @@ -2235,23 +2383,23 @@ memoizerific "^1.11.3" qs "^6.5.2" -"@storybook/client-logger@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.0.11.tgz#1211421355188f418cc421893f760a2feaf22d27" - integrity sha512-UWEdAlihpASAx770jg3JSDPG8ZkH6aiRCpLMwG7PFbfIpi+ZMRUj9SgxTQvj+/FFmzLR+LNBqfGeT8VHF317/g== +"@storybook/client-logger@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.0.5.tgz#35af9420325cc7dcd5952593351620670db0903d" + integrity sha512-7J0FfwgYcMw6WsEfE0174C8O0yalN73Aqqo6At3SyYHwy6/UiIPFs2X78MzahIqOqywXEWjCIPoGghmpukuCmw== dependencies: core-js "^2.6.5" -"@storybook/components@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.0.11.tgz#0cf3aad5df92bae9d896a4d6cc376d4445bbe27f" - integrity sha512-s0m+jU08z+YE6QVVYXT63uG2RG3z4KYLE1jwGveoh0vW3vmilHofNx67LBq6HvN+Oq4z1FgfOrZeiZX6zypDNw== +"@storybook/components@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.0.5.tgz#4e00d7da857c0e6f424ed514ef3eb25e3ce9acb2" + integrity sha512-/zFLWF67r/jkT824jTVb2l15y6CYTxnCcW4vS2RPJAURGjC8szyfHHly8ydtcmgdgiGeGDBxUe8ltsMYV5Q0hw== dependencies: - "@storybook/addons" "5.0.11" - "@storybook/client-logger" "5.0.11" - "@storybook/core-events" "5.0.11" - "@storybook/router" "5.0.11" - "@storybook/theming" "5.0.11" + "@storybook/addons" "5.0.5" + "@storybook/client-logger" "5.0.5" + "@storybook/core-events" "5.0.5" + "@storybook/router" "5.0.5" + "@storybook/theming" "5.0.5" core-js "^2.6.5" global "^4.3.2" immer "^1.12.0" @@ -2273,32 +2421,32 @@ recompose "^0.30.0" render-fragment "^0.1.1" -"@storybook/core-events@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.0.11.tgz#c7f10df6de6eb9a92cb4fe30b77e956f11b971e6" - integrity sha512-hwtazXO9hkoI5vtUm6koJ30+8FzbFuPO35AkAMAue+/OLZWJX3wzQ9gBKR4jOtRcWRRJsaBykltW/VH7b+NoPQ== +"@storybook/core-events@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.0.5.tgz#831fa76523194a79f23c986ab57393cbbf49d091" + integrity sha512-N6E1uhvCHpqixCkLjPEwN7aIMaWt2RZvnW0TW46BnX4W3OOwpSB6xWKM1k8TDDntGAsFwaqB7AuiATBy9VHXOg== dependencies: core-js "^2.6.5" -"@storybook/core@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.0.11.tgz#e941cf18ef62ee962607d1fb24c57b9cafc88cfd" - integrity sha512-im9PDPTCyz2YctMVau/GHLYuj0xAEnwh570oW3eg9pftjsyTq2zAnh+s93iX65XyRWNzKeHgnoEaxJtmdA4tug== +"@storybook/core@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.0.5.tgz#81c22ad20a0265f558b10191d8d03f35944146ec" + integrity sha512-1J1wVka45dSp7f68+qZd0vyu9JnNjl24Lz9qKRoh9JiNxZIURuaBxmvJ7Sgh4Dsn9g+7zI0147IHEJ2MZw9AjA== dependencies: "@babel/plugin-proposal-class-properties" "^7.3.0" "@babel/plugin-proposal-object-rest-spread" "^7.3.2" "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-transform-react-constant-elements" "^7.2.0" - "@babel/preset-env" "^7.4.1" - "@storybook/addons" "5.0.11" - "@storybook/channel-postmessage" "5.0.11" - "@storybook/client-api" "5.0.11" - "@storybook/client-logger" "5.0.11" - "@storybook/core-events" "5.0.11" - "@storybook/node-logger" "5.0.11" - "@storybook/router" "5.0.11" - "@storybook/theming" "5.0.11" - "@storybook/ui" "5.0.11" + "@babel/preset-env" "^7.3.1" + "@storybook/addons" "5.0.5" + "@storybook/channel-postmessage" "5.0.5" + "@storybook/client-api" "5.0.5" + "@storybook/client-logger" "5.0.5" + "@storybook/core-events" "5.0.5" + "@storybook/node-logger" "5.0.5" + "@storybook/router" "5.0.5" + "@storybook/theming" "5.0.5" + "@storybook/ui" "5.0.5" airbnb-js-shims "^1 || ^2" autoprefixer "^9.4.7" babel-plugin-add-react-displayname "^0.0.5" @@ -2354,10 +2502,10 @@ webpack-dev-middleware "^3.5.1" webpack-hot-middleware "^2.24.3" -"@storybook/node-logger@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.0.11.tgz#7c97e667295ce7d75af1a14878e83c0cd475c2ba" - integrity sha512-wmWo+CcEw0bEwT+cC20ofVW+jwVN7m5TYQSX7ujfpi8Ug9t2yHNM7Qn26p2g97mBM9CXsyW1HCeLEwsE+SfTGQ== +"@storybook/node-logger@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.0.5.tgz#4f25f3d833e79fd130b06c0c10dbd1b194d5eb70" + integrity sha512-81GWAUgL1Pb+q9AaySv8hOys5l8WuusKD/CnwrD/4Ee7o5lKrsBrxJVReDUoJ7+D4J+VbGt2C2eBiNrHzEVDyg== dependencies: chalk "^2.4.2" core-js "^2.6.5" @@ -2366,16 +2514,16 @@ regenerator-runtime "^0.12.1" "@storybook/react@^5.0.5": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-5.0.11.tgz#e131437a59d1f2fac7fbad4ab0c28a54d8a96398" - integrity sha512-HOKtOvGAOpwZyKXEEjNg3Exhf1E946H+Wcmfgp3hD7BOdxiWbXvkE3kwdBHb+cnQri0rJaADnYiXB/p8MkxfzQ== + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-5.0.5.tgz#f5a3e4ae510e30185fd02d3d35c08560d8ae64ab" + integrity sha512-K3/orHX2nNGboU/+x26G/yy1T5w+HqQ7+UWzAU1XNXa+nanTyG3wJ/HOCS/vzYOnbIr11DLD0bO9lepf9vUrzw== dependencies: "@babel/plugin-transform-react-constant-elements" "^7.2.0" "@babel/preset-flow" "^7.0.0" "@babel/preset-react" "^7.0.0" - "@storybook/core" "5.0.11" - "@storybook/node-logger" "5.0.11" - "@storybook/theming" "5.0.11" + "@storybook/core" "5.0.5" + "@storybook/node-logger" "5.0.5" + "@storybook/theming" "5.0.5" "@svgr/webpack" "^4.0.3" babel-plugin-named-asset-import "^0.3.0" babel-plugin-react-docgen "^2.0.2" @@ -2391,26 +2539,26 @@ semver "^5.6.0" webpack "^4.29.0" -"@storybook/router@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.0.11.tgz#e742ec567f623877bdb45b5b26551cb9380c1bf2" - integrity sha512-g5K65FknSwhlaNoMEKMKFVA+V4vS95xUTg1PoAQeW+noVdCr2nBhFSHiaQyz35AkKDYvOFr1nTxuL2kfVfD7dQ== +"@storybook/router@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.0.5.tgz#15de31277e57c833cf581fa11db85e9ff869556c" + integrity sha512-XdWdbvPBT0skJD5bAZxH0oRGHuBlS6t5ukLR5i0kedjxxtfzStYgEVCtUGRdx6wGzyAKLtZWyElQ7t2JyVKltA== dependencies: "@reach/router" "^1.2.1" - "@storybook/theming" "5.0.11" + "@storybook/theming" "5.0.5" core-js "^2.6.5" global "^4.3.2" memoizerific "^1.11.3" qs "^6.5.2" -"@storybook/theming@5.0.11", "@storybook/theming@^5.0.5": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.0.11.tgz#46e243c36324676c36393c01695bdbd6369e79b4" - integrity sha512-zZoMFirkdGYd4M6HupNYn713GesA/kx0nbhPfyatwnwRV9/LrG7KwkMjVDMrSHRdZei7z1KF7yFhleAOKb8RaQ== +"@storybook/theming@5.0.5", "@storybook/theming@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.0.5.tgz#184939e66dcfaf96975f77f38a530f3cf92c0e78" + integrity sha512-d4by4PUjVAL531y4RIezg3GYEjrsfjYllrZ+shj25grE/l19qNAWB28WsLxXZplfNKsm6GINjj+EOhLEi/0rgg== dependencies: "@emotion/core" "^10.0.7" "@emotion/styled" "^10.0.7" - "@storybook/client-logger" "5.0.11" + "@storybook/client-logger" "5.0.5" common-tags "^1.8.0" core-js "^2.6.5" deep-object-diff "^1.1.0" @@ -2423,17 +2571,17 @@ prop-types "^15.6.2" react-inspector "^2.3.1" -"@storybook/ui@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.0.11.tgz#207f767d96e40513bb3887b428a4d9a81d027051" - integrity sha512-APLI0J/V/dxeNYozNP5iAgVlqsEbr9SeruDI1NREpQYc+a0sAXmblbRIiAXpUuJbRBkEx3r9RIl1TNV2wp6i/w== - dependencies: - "@storybook/addons" "5.0.11" - "@storybook/client-logger" "5.0.11" - "@storybook/components" "5.0.11" - "@storybook/core-events" "5.0.11" - "@storybook/router" "5.0.11" - "@storybook/theming" "5.0.11" +"@storybook/ui@5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.0.5.tgz#0013ab58334c6f86a63663e61c92ca2b50758a0a" + integrity sha512-mkZ8tG3RK9rAgAn3zKdeav28/BFaMJWK50qROzS8kXmTqirGXB9HGG5YXAtw7tszCrIzM8Lv/dDaW2XwzB4CmA== + dependencies: + "@storybook/addons" "5.0.5" + "@storybook/client-logger" "5.0.5" + "@storybook/components" "5.0.5" + "@storybook/core-events" "5.0.5" + "@storybook/router" "5.0.5" + "@storybook/theming" "5.0.5" core-js "^2.6.5" fast-deep-equal "^2.0.1" fuzzy-search "^3.0.1" @@ -2464,110 +2612,110 @@ telejson "^2.1.1" util-deprecate "^1.0.2" -"@svgr/babel-plugin-add-jsx-attribute@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" - integrity sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig== +"@svgr/babel-plugin-add-jsx-attribute@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.0.0.tgz#5acf239cd2747b1a36ec7e708de05d914cb9b948" + integrity sha512-PDvHV2WhSGCSExp+eIMEKxYd1Q0SBvXLb4gAOXbdh0dswHFFgXWzxGjCmx5aln4qGrhkuN81khzYzR/44DYaMA== -"@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc" - integrity sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ== +"@svgr/babel-plugin-remove-jsx-attribute@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.0.3.tgz#32564b5c4d761b51e34492b6a4894196c0f75803" + integrity sha512-fpG7AzzJxz1tc8ITYS1jCAt1cq4ydK2R+sx//BMTJgvOjfk91M5GiqFolP8aYTzLcum92IGNAVFS3zEcucOQEA== -"@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7" - integrity sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w== +"@svgr/babel-plugin-remove-jsx-empty-expression@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.0.0.tgz#0b59338c00671cf8137eb823bd84a3efac686502" + integrity sha512-nBGVl6LzXTdk1c6w3rMWcjq3mYGz+syWc5b3CdqAiEeY/nswYDoW/cnGUKKC8ofD6/LaG+G/IUnfv3jKoHz43A== -"@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165" - integrity sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w== +"@svgr/babel-plugin-replace-jsx-attribute-value@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.0.0.tgz#91785643540c2300f3d89e515b37af9b5ce4e695" + integrity sha512-ejQqpTfORy6TT5w1x/2IQkscgfbtNFjitcFDu63GRz7qfhVTYhMdiJvJ1+Aw9hmv9bO4tXThGQDr1IF5lIvgew== -"@svgr/babel-plugin-svg-dynamic-title@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.2.0.tgz#43f0f689a5347a894160eb51b39a109889a4df20" - integrity sha512-gH2qItapwCUp6CCqbxvzBbc4dh4OyxdYKsW3EOkYexr0XUmQL0ScbdNh6DexkZ01T+sdClniIbnCObsXcnx3sQ== +"@svgr/babel-plugin-svg-dynamic-title@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.0.0.tgz#eb8d50b80ba0a26f9b27c7268e2a803d90f1bc9e" + integrity sha512-OE6GT9WRKWqd0Dk6NJ5TYXTF5OxAyn74+c/D+gTLbCXnK2A0luEXuwMbe5zR5Px4A/jow2OeEBboTENl4vtuQg== -"@svgr/babel-plugin-svg-em-dimensions@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391" - integrity sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w== +"@svgr/babel-plugin-svg-em-dimensions@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.0.0.tgz#0de3972c46ff1960bed765646037a3a7f9e1da3d" + integrity sha512-QeDRGHXfjYEBTXxV0TsjWmepsL9Up5BOOlMFD557x2JrSiVGUn2myNxHIrHiVW0+nnWnaDcrkjg/jUvbJ5nKCg== -"@svgr/babel-plugin-transform-react-native-svg@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717" - integrity sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw== +"@svgr/babel-plugin-transform-react-native-svg@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.0.0.tgz#5e8ecc2a9870ae05fb1e553b1fe9c6b5853a1c66" + integrity sha512-c6eE6ovs14k6dmHKoy26h7iRFhjWNnwYVrDWIPfouVm/gcLIeMw/ME4i91O5LEfaDHs6kTRCcVpbAVbNULZOtw== -"@svgr/babel-plugin-transform-svg-component@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697" - integrity sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw== +"@svgr/babel-plugin-transform-svg-component@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.1.0.tgz#257159e28a21ac20988b1eaa5f59d4724f37fdaa" + integrity sha512-uulxdx2p3nrM2BkrtADQHK8IhEzCxdUILfC/ddvFC8tlFWuKiA3ych8C6q0ulyQHq34/3hzz+3rmUbhWF9redg== -"@svgr/babel-preset@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.2.0.tgz#c9fc236445a02a8cd4e750085e51c181de00d6c5" - integrity sha512-iLetHpRCQXfK47voAs5/uxd736cCyocEdorisjAveZo8ShxJ/ivSZgstBmucI1c8HyMF5tOrilJLoFbhpkPiKw== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^4.2.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^4.2.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.2.0" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.2.0" - "@svgr/babel-plugin-svg-dynamic-title" "^4.2.0" - "@svgr/babel-plugin-svg-em-dimensions" "^4.2.0" - "@svgr/babel-plugin-transform-react-native-svg" "^4.2.0" - "@svgr/babel-plugin-transform-svg-component" "^4.2.0" - -"@svgr/core@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.2.0.tgz#f32ef8b9d05312aaa775896ec30ae46a6521e248" - integrity sha512-nvzXaf2VavqjMCTTfsZfjL4o9035KedALkMzk82qOlHOwBb8JT+9+zYDgBl0oOunbVF94WTLnvGunEg0csNP3Q== +"@svgr/babel-preset@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.1.0.tgz#f6fa8ad90064b85dd7a3566a70b7006e789e8385" + integrity sha512-Nat5aJ3VO3LE8KfMyIbd3sGWnaWPiFCeWIdEV+lalga0To/tpmzsnPDdnrR9fNYhvSSLJbwhU/lrLYt9wXY0ZQ== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^4.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^4.0.3" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "^4.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "^4.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "^4.0.0" + "@svgr/babel-plugin-transform-svg-component" "^4.1.0" + +"@svgr/core@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.1.0.tgz#4f8ad24fb4ab25c787c12a6bbb511c6430558f83" + integrity sha512-ahv3lvOKuUAcs0KbQ4Jr5fT5pGHhye4ew8jZVS4lw8IQdWrbG/o3rkpgxCPREBk7PShmEoGQpteeXVwp2yExuQ== dependencies: - "@svgr/plugin-jsx" "^4.2.0" - camelcase "^5.3.1" - cosmiconfig "^5.2.0" + "@svgr/plugin-jsx" "^4.1.0" + camelcase "^5.0.0" + cosmiconfig "^5.0.7" -"@svgr/hast-util-to-babel-ast@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.2.0.tgz#dd743435a5f3a8e84a1da067f27b5fae3d7b6b63" - integrity sha512-IvAeb7gqrGB5TH9EGyBsPrMRH/QCzIuAkLySKvH2TLfLb2uqk98qtJamordRQTpHH3e6TORfBXoTo7L7Opo/Ow== +"@svgr/hast-util-to-babel-ast@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.1.0.tgz#a1eb0f47059769896f759f47995b636fce5d9fa4" + integrity sha512-tdkEZHmigYYiVhIEzycAMKN5aUSpddUnjr6v7bPwaNTFuSyqGUrpCg1JlIGi7PUaaJVHbn6whGQMGUpKOwT5nw== dependencies: - "@babel/types" "^7.4.0" + "@babel/types" "^7.1.6" -"@svgr/plugin-jsx@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.2.0.tgz#15a91562c9b5f90640ea0bdcb2ad59d692ee7ae9" - integrity sha512-AM1YokmZITgveY9bulLVquqNmwiFo2Px2HL+IlnTCR01YvWDfRL5QKdnF7VjRaS5MNP938mmqvL0/8oz3zQMkg== +"@svgr/plugin-jsx@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.1.0.tgz#4045e9cc0589374a6c182a1217c80e6734b5cbec" + integrity sha512-xwu+9TGziuN7cu7p+vhCw2EJIfv8iDNMzn2dR0C7fBYc8q+SRtYTcg4Uyn8ZWh6DM+IZOlVrS02VEMT0FQzXSA== dependencies: - "@babel/core" "^7.4.3" - "@svgr/babel-preset" "^4.2.0" - "@svgr/hast-util-to-babel-ast" "^4.2.0" + "@babel/core" "^7.1.6" + "@svgr/babel-preset" "^4.1.0" + "@svgr/hast-util-to-babel-ast" "^4.1.0" rehype-parse "^6.0.0" - unified "^7.1.0" - vfile "^4.0.0" + unified "^7.0.2" + vfile "^3.0.1" -"@svgr/plugin-svgo@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.2.0.tgz#2a594a2d3312955e75fd87dc77ae51f377c809f3" - integrity sha512-zUEKgkT172YzHh3mb2B2q92xCnOAMVjRx+o0waZ1U50XqKLrVQ/8dDqTAtnmapdLsGurv8PSwenjLCUpj6hcvw== +"@svgr/plugin-svgo@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.0.3.tgz#a07ea0a736c26fa3a5440fe8e222e2e887764cab" + integrity sha512-MgL1CrlxvNe+1tQjPUc2bIJtsdJOIE5arbHlPgW+XVWGjMZTUcyNNP8R7/IjM2Iyrc98UJY+WYiiWHrinnY9ZQ== dependencies: - cosmiconfig "^5.2.0" + cosmiconfig "^5.0.7" merge-deep "^3.0.2" - svgo "^1.2.1" + svgo "^1.1.1" "@svgr/webpack@^4.0.3": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.2.0.tgz#b7cdef42ae671a27ed4cfe118a0f2da7f4e9ebed" - integrity sha512-sm3UUJHmRlqEg8w8bjUT+FAMf5lkgCydxotEapinpd10kzrpQP++Qd+bmuepE3hsIUU68BO24vgQALQ92qBZEw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.1.0.tgz#20c88f32f731c7b1d4711045b2b993887d731c28" + integrity sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ== dependencies: - "@babel/core" "^7.4.3" + "@babel/core" "^7.1.6" "@babel/plugin-transform-react-constant-elements" "^7.0.0" - "@babel/preset-env" "^7.4.3" + "@babel/preset-env" "^7.1.6" "@babel/preset-react" "^7.0.0" - "@svgr/core" "^4.2.0" - "@svgr/plugin-jsx" "^4.2.0" - "@svgr/plugin-svgo" "^4.2.0" - loader-utils "^1.2.3" + "@svgr/core" "^4.1.0" + "@svgr/plugin-jsx" "^4.1.0" + "@svgr/plugin-svgo" "^4.0.3" + loader-utils "^1.1.0" "@turf/bbox@6.x": version "6.0.1" @@ -2630,12 +2778,7 @@ dependencies: "@types/angular" "*" -"@types/angular@*": - version "1.6.54" - resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.54.tgz#f9d5a03e4da7b021a6dabe5d63e899ed4567a5bd" - integrity sha512-xA1FuozWXeRQ7FClUbvk8ePL+dydBeDoCWRPFTHU5+8uvVtIIfLGiHA8CMkwsbddFCYnTDVbLxG85a/HBx7LtA== - -"@types/angular@1.6.50": +"@types/angular@*", "@types/angular@1.6.50": version "1.6.50" resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.50.tgz#8b6599088d80f68ef0cad7d3a2062248ebe72b3d" integrity sha512-D3KB0PdaxdwtA44yOpK+NtptTscKWgUzXmf8fiLaaVxnX+b7QQ+dUMsyeVDweCQ6VX4PMwkd6x2hJ0X+ISIsoQ== @@ -2645,15 +2788,20 @@ resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.33.tgz#2728669427cdd74a99e53c9f457ca2866a37c52d" integrity sha512-VQgHxyPMTj3hIlq9SY1mctqx+Jj8kpQfoLvDlVSDNOyuYs8JYfkuY3OW/4+dO657yPmNhHpePRx0/Tje5ImNVQ== +"@types/async@2.0.49": + version "2.0.49" + resolved "https://registry.yarnpkg.com/@types/async/-/async-2.0.49.tgz#92e33d13f74c895cb9a7f38ba97db8431ed14bc0" + integrity sha512-Benr3i5odUkvpFkOpzGqrltGdbSs+EVCkEBGXbuR7uT0VzhXKIkhem6PDzHdx5EonA+rfbB3QvP6aDOw5+zp5Q== + "@types/babel-types@*", "@types/babel-types@^7.0.0": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.7.tgz#667eb1640e8039436028055737d2b9986ee336e3" - integrity sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ== + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.4.tgz#bfd5b0d0d1ba13e351dff65b6e52783b816826c8" + integrity sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw== "@types/babel__core@^7.1.0": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.1.tgz#ce9a9e5d92b7031421e1d0d74ae59f572ba48be6" - integrity sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.0.tgz#710f2487dda4dcfd010ca6abb2b4dc7394365c51" + integrity sha512-wJTeJRt7BToFx3USrCDs2BhEi4ijBInTQjOIukj6a/5tEkwpFMVZ+1ppgmE+Q/FQyc5P/VWUbx7I9NELrKruHA== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2676,43 +2824,31 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": +"@types/babel__traverse@*": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== dependencies: "@babel/types" "^7.3.0" -"@types/babylon@6.16.3": +"@types/babylon@6.16.3", "@types/babylon@^6.16.2": version "6.16.3" resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb" integrity sha512-lyJ8sW1PbY3uwuvpOBZ9zMYKshMnQpXmeDHh8dj9j2nJm/xrW0FgB5gLSYOArj5X0IfaXnmhFoJnhS4KbqIMug== dependencies: "@types/babel-types" "*" -"@types/babylon@^6.16.2": - version "6.16.5" - resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4" - integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w== - dependencies: - "@types/babel-types" "*" - "@types/base64-js@^1.2.5": version "1.2.5" resolved "https://registry.yarnpkg.com/@types/base64-js/-/base64-js-1.2.5.tgz#582b2476169a6cba460a214d476c744441d873d5" integrity sha1-WCskdhaabLpGCiFNR2x0REHYc9U= "@types/bluebird@^3.1.1": - version "3.5.26" - resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.26.tgz#a38c438ae84fa02431d6892edf86e46edcbca291" - integrity sha512-aj2mrBLn5ky0GmAg6IPXrQjnN0iB/ulozuJ+oZdrHRAzRbXjGmu4UXsNCjFvPbSaaPZmniocdOzsM392qLOlmQ== + version "3.5.20" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.20.tgz#f6363172add6f4eabb8cada53ca9af2781e8d6a1" + integrity sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA== -"@types/boom@*", "@types/boom@^7.2.0": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@types/boom/-/boom-7.2.1.tgz#a21e21ba08cc49d17b26baef98e1a77ee4d6cdb0" - integrity sha512-kOiap+kSa4DPoookJXQGQyKy1rjZ55tgfKAh9F0m1NUdukkcwVzpSnXPMH42a5L+U++ugdQlh/xFJu/WAdr1aw== - -"@types/boom@7.2.0": +"@types/boom@*", "@types/boom@7.2.0", "@types/boom@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/boom/-/boom-7.2.0.tgz#19c36cbb5811a7493f0f2e37f31d42b28df1abc1" integrity sha512-HonbGsHFbskh9zRAzA6tabcw18mCOsSEOL2ibGAuVqk6e7nElcRmWO5L4UfIHpDbWBWw+eZYFdsQ1+MEGgpcVA== @@ -2723,21 +2859,19 @@ integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== "@types/catbox@*": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@types/catbox/-/catbox-10.0.6.tgz#8a4c91261cf0afca03351bb82a95b2d6cf43a5d0" - integrity sha512-qS0VHlL6eBUUoUeBnI/ASCffoniS62zdV6IUtLSIjGKmRhZNawotaOMsTYivZOTZVktfe9koAJkD9XFac7tEEg== + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/catbox/-/catbox-10.0.1.tgz#266679017749041fe9873fee1131dd2aaa04a07e" + integrity sha512-ECuJ+f5gGHiLeiE4RlE/xdqv/0JVDToegPV1aTb10tQStYa0Ycq2OJfQukDv3IFaw3B+CMV46jHc5bXe6QXEQg== "@types/chance@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/chance/-/chance-1.0.2.tgz#e6a766b5ca4103860bf7e0d689a04731918b4fb8" - integrity sha512-3SHPmCuwejJBdC+eZH7/dhI3Id5DJjbDqoySEb/JwlMZwBCh+/fSq6WiFsJzfUbLlJgYtAlKlRAmccpDcWnpyQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/chance/-/chance-1.0.1.tgz#c10703020369602c40dd9428cc6e1437027116df" + integrity sha512-jtV6Bv/j+xk4gcXeLlESwNc/m/I/dIZA0xrt29g0uKcjyPob8iisj/5z0ARE+Ldfx4MxjNFNECG0z++J7zJgqg== "@types/cheerio@*", "@types/cheerio@^0.22.10": - version "0.22.11" - resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.11.tgz#61c0facf9636d14ba5f77fc65ed8913aa845d717" - integrity sha512-x0X3kPbholdJZng9wDMhb2swvUi3UYRNAuWAmIPIWlfgAJZp//cql/qblE7181Mg7SjWVwq6ldCPCLn5AY/e7w== - dependencies: - "@types/node" "*" + version "0.22.10" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.10.tgz#780d552467824be4a241b29510a7873a7432c4a6" + integrity sha512-fOM/Jhv51iyugY7KOBZz2ThfT1gwvsGCfWxpLpZDgkGjpEO4Le9cld07OdskikLjDUQJ43dzDaVRSFwQlpdqVg== "@types/chroma-js@^1.4.1": version "1.4.1" @@ -2752,9 +2886,9 @@ "@types/node" "*" "@types/classnames@^2.2.3": - version "2.2.7" - resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.7.tgz#fb68cc9be8487e6ea5b13700e759bfbab7e0fefd" - integrity sha512-rzOhiQ55WzAiFgXRtitP/ZUT8iVNyllEpylJ5zHzR4vArUvMB39GTk+Zon/uAM0JxEFAWnwsxC2gH8s+tZ3Myg== + version "2.2.3" + resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.3.tgz#3f0ff6873da793870e20a260cada55982f38a9e5" + integrity sha512-x15/Io+JdzrkM9gnX6SWUs/EmqQzd65TD9tcZIAQ1VIdb93XErNuYmB7Yho8JUCE189ipUSESsWvGvYXRRIvYA== "@types/cmd-shim@^2.0.0": version "2.0.0" @@ -2769,9 +2903,9 @@ "@types/color-name" "*" "@types/color-name@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.0.tgz#926f76f7e66f49cc59ad880bb15b030abbf0b66d" + integrity sha512-gZ/Rb+MFXF0pXSEQxdRoPMm5jeO3TycjOdvbpbcpHX/B+n9AqaHFe5q6Ga9CsZ7ir/UgIWPfrBzUzn3F19VH/w== "@types/color@^3.0.0": version "3.0.0" @@ -2781,16 +2915,14 @@ "@types/color-convert" "*" "@types/cookiejar@*": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.1.tgz#90b68446364baf9efd8e8349bb36bd3852b75b80" - integrity sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.0.tgz#4b7daf2c51696cfc70b942c11690528229d1a1ce" + integrity sha512-EIjmpvnHj+T4nMcKwHwxZKUfDmphIKJc2qnEMhSoOvr1lYEQpuRKRz8orWr//krYIIArS/KGGLfL2YGVUYXmIA== "@types/cp-file@*": - version "6.1.2" - resolved "https://registry.yarnpkg.com/@types/cp-file/-/cp-file-6.1.2.tgz#3c579201715ca6177d34f3e14f2b29861c470c4c" - integrity sha512-wvqCNhHt+GMfEglZ83cQ+8dEv5Oh8DwEq6IBBBL7+hWISR+82l/bSmssCo5zGHg7HpW6+kjZwDby9zGkCStN5w== - dependencies: - cp-file "*" + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/cp-file/-/cp-file-4.2.0.tgz#2b12186b50dad407b11021284627bdf4adb87a87" + integrity sha512-nkd9c0L2aWfsDFrkpxfGJ5bCKeiAv6lccbH9vxKeWYw9YuyqskjtRTrBEBAiea9R08OSiboQ4ssmwAVJMHmHHA== "@types/cpy@^5.1.0": version "5.1.0" @@ -2801,19 +2933,19 @@ "@types/glob" "*" "@types/d3-array@^1.2.1": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-1.2.7.tgz#34dc654d34fc058c41c31dbca1ed68071a8fcc17" - integrity sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-1.2.1.tgz#e489605208d46a1c9d980d2e5772fa9c75d9ec65" + integrity sha512-YBaAfimGdWE4nDuoGVKsH89/dkz2hWZ0i8qC+xxqmqi+XJ/aXiRF0jPtzXmN7VdkpVjy1xuDmM5/m1FNuB6VWA== "@types/d3-path@*": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.8.tgz#48e6945a8ff43ee0a1ce85c8cfa2337de85c7c79" - integrity sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA== + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.7.tgz#a0736fceed688a695f48265a82ff7a3369414b81" + integrity sha512-U8dFRG+8WhkLJr2sxZ9Cw/5WeRgBnNqMxGdA1+Z0+ZG6tK0s75OQ4OXnxeyfKuh6E4wQPY8OAKr1+iNDx01BEQ== "@types/d3-scale@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-2.1.1.tgz#405e58771ec6ae7b8f7b4178ee1887620759e8f7" - integrity sha512-kNTkbZQ+N/Ip8oX9PByXfDLoCSaZYm+VUOasbmsa6KD850/ziMdYepg/8kLg2plHzoLANdMqPoYQbvExevLUHg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-2.0.1.tgz#f94cd991c50422b2e68d8f43be3f9fffdb1ae7be" + integrity sha512-D5ZWv8ToLvqacE7XkdMNHMiiVDULdDxT7FMMGU0YJC3/nVzBmApjyTyxracUWOQyY3KK7YhZ05on8pOcNi0dfQ== dependencies: "@types/d3-time" "*" @@ -2825,14 +2957,14 @@ "@types/d3-path" "*" "@types/d3-time-format@^2.1.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.1.1.tgz#dd2c79ec4575f1355484ab6b10407824668eba42" - integrity sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.1.0.tgz#011e0fb7937be34a9a8f580ae1e2f2f1336a8a22" + integrity sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA== "@types/d3-time@*", "@types/d3-time@^1.0.7": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.0.10.tgz#d338c7feac93a98a32aac875d1100f92c7b61f4f" - integrity sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.0.8.tgz#6c083127b330b3c2fc65cd0f3a6e9cbd9607b28c" + integrity sha512-/UCphyyw97YAq4zKsuXH33R3UNB4jDSza0fLvMubWr/ONh9IePi1NbgFP222blhiCe724ebJs8U87+aDuAq/jA== "@types/d3@^3.5.41": version "3.5.41" @@ -2849,7 +2981,14 @@ resolved "https://registry.yarnpkg.com/@types/deepmerge/-/deepmerge-2.1.0.tgz#22f175e5cb55874fe818caa6fd50a1d98fc3d748" integrity sha512-/0Ct/q5g+SgaACZ+A0ylY3071nEBN7QDnTWiCtaB3fx24UpoAQXf25yNVloOYVUis7jytM1F1WC78+EOwXkQJQ== -"@types/del@^3.0.0", "@types/del@^3.0.1": +"@types/del@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/del/-/del-3.0.0.tgz#1c8cd8b6e38da3b572352ca8eaf5527931426288" + integrity sha512-18mSs54BvzV8+TTQxt0ancig6tsuPZySnhp3cQkWFFDmDMavU4pmWwR+bHHqRBWODYqpzIzVkqKLuk/fP6yypQ== + dependencies: + "@types/glob" "*" + +"@types/del@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/del/-/del-3.0.1.tgz#4712da8c119873cbbf533ad8dbf1baac5940ac5d" integrity sha512-y6qRq6raBuu965clKgx6FHuiPu3oHdtmzMPXi8Uahsjdq1L6DL5fS/aY5/s71YwM7k6K1QIWvem5vNwlnNGIkQ== @@ -2862,14 +3001,14 @@ integrity sha512-sq+kwx8zA9BSugT9N+Jr8/uWjbHMZ+N/meJEzRyT3gmLq/WMtx/iSIpvdpmBUi/cvXl6Kzpvve8G2ESkabFwmg== "@types/elasticsearch@^5.0.30": - version "5.0.32" - resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.32.tgz#8fef870ede8ce2db140f9e25fdf0aa8cc908d3d9" - integrity sha512-BlX/ji/JAaJ5ogIbHOHNN/8JQbBsVchDOzLh5T6ti3vYvceLY5IJRgppXRBG0NWf9YVCtzmS8WrXxV7ADF8cWg== + version "5.0.30" + resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.30.tgz#3c52f7119e3a20a47e2feb8e2b4cc54030a54e23" + integrity sha512-swxiNcLOtnHhJhAE5HcUL3WsKLHr8rEQ+fwpaJ0x4dfEE3oK2kGUoyz4wCcQfvulcMm2lShyxZ+2E4BQJzsAlg== "@types/enzyme@^3.1.12": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.9.1.tgz#3a0ce07e30066dbc26cd3474c8e680af2d249e26" - integrity sha512-CasnOP73BFE3/5JvGkod+oQtGOD1+CVWz9BV2iAqDFJ+sofL5gTiizSr8ZM3lpDY27ptC8yjAdrUCdv8diKKqw== + version "3.1.18" + resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.18.tgz#4b984b9a3eb9fd025c4d77e0f53d3301c3c31ef9" + integrity sha512-AXxcTvIEBDzcCLpLZxdSHUOvBuyAzxtsi/DGzVdAxqQRqplG9+8xxVErAJYwF+aI48/LtL2BjU6DdD+phc7IfQ== dependencies: "@types/cheerio" "*" "@types/react" "*" @@ -2888,9 +3027,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" + integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA== "@types/execa@^0.9.0": version "0.9.0" @@ -2933,19 +3072,19 @@ resolved "https://registry.yarnpkg.com/@types/git-url-parse/-/git-url-parse-9.0.0.tgz#aac1315a44fa4ed5a52c3820f6c3c2fb79cbd12d" integrity sha512-kA2RxBT/r/ZuDDKwMl+vFWn1Z0lfm1/Ik6Qb91wnSzyzCDa/fkM8gIOq6ruB7xfr37n6Mj5dyivileUVKsidlg== -"@types/glob@*", "@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== +"@types/glob@*", "@types/glob@^5.0.35": + version "5.0.35" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a" + integrity sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg== dependencies: "@types/events" "*" "@types/minimatch" "*" "@types/node" "*" -"@types/glob@^5.0.35": - version "5.0.36" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.36.tgz#0c80a9c8664fc7d19781de229f287077fd622cb2" - integrity sha512-KEzSKuP2+3oOjYYjujue6Z3Yqis5HKA1BsIC+jZ1v3lrRNdsqyNNtX0rQf6LSuI4DJJ2z5UV//zBZCcvM0xikg== +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== dependencies: "@types/events" "*" "@types/minimatch" "*" @@ -2984,9 +3123,9 @@ "@types/hapi" "*" "@types/hapi@*", "@types/hapi@^17.0.18": - version "17.8.6" - resolved "https://registry.yarnpkg.com/@types/hapi/-/hapi-17.8.6.tgz#bf9132c2dd56b6344dd3f60eb86806d197f0e90b" - integrity sha512-8xfvwsfZmQCSognkNDMAkyNlnQwfpGdIP1Y7h/EMgcEzrVHB6lmuDHc8TEMhOJ6lt40TKGBA1e9z9htb/KSbOA== + version "17.0.18" + resolved "https://registry.yarnpkg.com/@types/hapi/-/hapi-17.0.18.tgz#f855fe18766aa2592a3a689c3e6eabe72989ff1a" + integrity sha512-sRoDjz1iVOCxTqq+EepzDQI773k2PjboHpvMpp524278grosStxZ5+oooVjNLJZj1iZIbiLeeR5/ZeIRgVXsCg== dependencies: "@types/boom" "*" "@types/catbox" "*" @@ -3002,11 +3141,16 @@ resolved "https://registry.yarnpkg.com/@types/has-ansi/-/has-ansi-3.0.0.tgz#636403dc4e0b2649421c4158e5c404416f3f0330" integrity sha512-H3vFOwfLlFEC0MOOrcSkus8PCnMCzz4N0EqUbdJZCdDhBTfkAu86aRYA+MTxjKW6jCpUvxcn4715US8g+28BMA== -"@types/history@*", "@types/history@^4.6.2": +"@types/history@*": version "4.7.2" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.2.tgz#0e670ea254d559241b6eeb3894f8754991e73220" integrity sha512-ui3WwXmjTaY73fOQ3/m3nnajU/Orhi6cEu5rzX+BrAAJxa3eITXZ5ch9suPqtM03OWhAHhPSyBGCN4UKoxO20Q== +"@types/history@^4.6.2": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0" + integrity sha512-eVAb52MJ4lfPLiO9VvTgv8KaZDEIqCwhv+lXOMLlt4C1YHTShgmMULEg0RrCbnqfYd6QKfHsMp0MiX0vWISpSw== + "@types/hoek@^4.1.3": version "4.1.3" resolved "https://registry.yarnpkg.com/@types/hoek/-/hoek-4.1.3.tgz#d1982d48fb0d2a0e5d7e9d91838264d8e428d337" @@ -3018,9 +3162,9 @@ integrity sha1-+8r1ltIP8u14+PURxdapQ7URAdY= "@types/indent-string@^3.0.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/indent-string/-/indent-string-3.2.0.tgz#ce0016b6527a582e98122d593000772a965db665" - integrity sha512-9iJXKl51MSjBOO8AWJyDtegBy4PkcgwIQCNYmHA63qtYlaISD6sEcB4jZ8APOdBacZJ8fZwxZpN7iwYlyE6eGw== + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/indent-string/-/indent-string-3.0.0.tgz#9ebb391ceda548926f5819ad16405349641b999f" + integrity sha1-nrs5HO2lSJJvWBmtFkBTSWQbmZ8= "@types/intl-relativeformat@^2.1.0": version "2.1.0" @@ -3046,10 +3190,10 @@ dependencies: "@types/node" "*" -"@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== +"@types/istanbul-lib-coverage@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#2cc2ca41051498382b43157c8227fea60363f94a" + integrity sha512-ohkhb9LehJy+PA40rDtGAji61NCgdtKLAlFoYp4cnuuQEswwdK3vz9SOIkkyc3wrk8dzjphQApNs56yyXLStaQ== "@types/jest-diff@*": version "20.0.1" @@ -3057,9 +3201,9 @@ integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== "@types/jest@^24.0.9": - version "24.0.12" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.12.tgz#0553dd0a5ac744e7dc4e8700da6d3baedbde3e8f" - integrity sha512-60sjqMhat7i7XntZckcSGV8iREJyXXI6yFHZkSZvCPUeOnEJ/VP1rU/WpEWQ56mvoh8NhC+sfKAuJRTyGtCOow== + version "24.0.9" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.9.tgz#74ce9cf337f25e189aa18f76ab3d65e8669b55f2" + integrity sha512-k3OOeevcBYLR5pdsOv5g3OP94h3mrJmLPHFEPWgbbVy2tGv0TZ/TlygiC848ogXhK8NL0I5up7YYtwpCp8xCJA== dependencies: "@types/jest-diff" "*" @@ -3068,32 +3212,25 @@ resolved "https://registry.yarnpkg.com/@types/jju/-/jju-1.4.1.tgz#0a39f5f8e84fec46150a7b9ca985c3f89ad98e9f" integrity sha512-LFt+YA7Lv2IZROMwokZKiPNORAV5N3huMs3IKnzlE430HWhWYZ8b+78HiwJXJJP1V2IEjinyJURuRJfGoaFSIA== -"@types/joi@*": - version "14.3.3" - resolved "https://registry.yarnpkg.com/@types/joi/-/joi-14.3.3.tgz#f251aa8150fc0b6a7ce9feab21802a28473de335" - integrity sha512-6gAT/UkIzYb7zZulAbcof3lFxpiD5EI6xBeTvkL1wYN12pnFQ+y/+xl9BvnVgxkmaIDN89xWhGZLD9CvuOtZ9g== - -"@types/joi@^13.4.2": - version "13.6.3" - resolved "https://registry.yarnpkg.com/@types/joi/-/joi-13.6.3.tgz#79364839a9cc2c6d4d915ef8822e1f703e28648f" - integrity sha512-n5tDa0/3MUtHsA2fVH+emDfGQkPramIpWaOvWS+7C/Yq7bn2j979RAIy9pbl4F4hSE5lwjgBXhJN019DP+3ofg== +"@types/joi@*", "@types/joi@^13.4.2": + version "13.6.1" + resolved "https://registry.yarnpkg.com/@types/joi/-/joi-13.6.1.tgz#325486a397504f8e22c8c551dc8b0e1d41d5d5ae" + integrity sha512-JxZ0NP8NuB0BJOXi1KvAA6rySLTPmhOy4n2gzSFq/IFM3LNFm0h+2Vn/bPPgEYlWqzS2NPeLgKqfm75baX+Hog== "@types/jquery@^3.3.6": - version "3.3.29" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.29.tgz#680a2219ce3c9250483722fccf5570d1e2d08abd" - integrity sha512-FhJvBninYD36v3k6c+bVk1DSZwh7B5Dpb/Pyk3HKVsiohn0nhbefZZ+3JXbWQhFyt0MxSl2jRDdGQPHeOHFXrQ== - dependencies: - "@types/sizzle" "*" + version "3.3.6" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.6.tgz#5932ead926307ca21e5b36808257f7c926b06565" + integrity sha512-403D4wN95Mtzt2EoQHARf5oe/jEPhzBOBNrunk+ydQGW8WmkQ/E8rViRAEB1qEt/vssfGfNVD6ujP4FVeegrLg== "@types/js-yaml@^3.11.1": - version "3.12.1" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656" - integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== + version "3.11.2" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.2.tgz#699ad86054cc20043c30d66a6fcde30bbf5d3d5e" + integrity sha512-JRDtMPEqXrzfuYAdqbxLot1GvAr/QvicIZAnOAigZaj8xVMhuSJTg/xsv9E1TvyL+wujYhRLx9ZsQ0oFOSmwyA== "@types/json-schema@*": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" - integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-6.0.1.tgz#a761975746f1c1b2579c62e3a4b5e88f986f7e2e" + integrity sha512-vuL/tG01yKO//gmCmnV3OZhx2hs538t+7FpQq//sUV1sF6xiKi5V8F60dvAxe/HkC4+QaMCHqrm/akqlppTAkQ== "@types/json-stable-stringify@^1.0.32": version "1.0.32" @@ -3120,34 +3257,49 @@ "@types/node" "*" "@types/lodash.clonedeep@^4.5.4": - version "4.5.6" - resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.6.tgz#3b6c40a0affe0799a2ce823b440a6cf33571d32b" - integrity sha512-cE1jYr2dEg1wBImvXlNtp0xDoS79rfEdGozQVgliDZj1uERH4k+rmEMTudP9b4VQ8O6nRb5gPqft0QzEQGMQgA== + version "4.5.4" + resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.4.tgz#2515c5f08bc95afebfb597711871b0497f5d7da7" + integrity sha512-+rCVPIZOJaub++wU/lmyp/SxiKlqXQaXI5LryzjuHBKFj51ApVt38Xxk9psLWNGMuR/obEQNTH0l/yDfG4ANNQ== dependencies: "@types/lodash" "*" "@types/lodash.clonedeepwith@^4.5.3": - version "4.5.6" - resolved "https://registry.yarnpkg.com/@types/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.6.tgz#a5edd6c167b70396537ce6293dd8c0383d7b75e4" - integrity sha512-lroYwAgCFPkHyxi9548a+uQMelP60AaA74CBqfn9Li27+ukUZritx+JVYJ0W54PKBaBauXzTRHEvGzYrPsPZtQ== + version "4.5.3" + resolved "https://registry.yarnpkg.com/@types/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.3.tgz#8057f074de743bdcff59fdbf26cd04c674a186cc" + integrity sha512-DNOO/Vec+yrzxxYwRXhVxTE4cOE1Xkf1xUzHhz3atoQ2URYKjvO5m9S7UxUcpn48rXkt9PxOT6cOyJCMIfjLNg== dependencies: "@types/lodash" "*" -"@types/lodash@*", "@types/lodash@^4.14.110", "@types/lodash@^4.14.116": - version "4.14.123" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.123.tgz#39be5d211478c8dd3bdae98ee75bb7efe4abfe4d" - integrity sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q== +"@types/lodash@*": + version "4.14.104" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.104.tgz#53ee2357fa2e6e68379341d92eb2ecea4b11bb80" + integrity sha512-ufQcVg4daO8xQ5kopxRHanqFdL4AI7ondQkV+2f+7mz3gvp0LkBx2zBRC6hfs3T87mzQFmf5Fck7Fi145Ul6NQ== "@types/lodash@^3.10.1": version "3.10.2" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-3.10.2.tgz#c1fbda1562ef5603c8192fe1fe65b017849d5873" integrity sha512-TmlYodTNhMzVzv3CK/9sXGzh31jWsRKHE3faczhVgYFCdXIRQRCOPD+0NDlR+SvJlCj914yP3q3aAupt53p2Ug== +"@types/lodash@^4.14.110": + version "4.14.117" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.117.tgz#695a7f514182771a1e0f4345d189052ee33c8778" + integrity sha512-xyf2m6tRbz8qQKcxYZa7PA4SllYcay+eh25DN3jmNYY6gSTL7Htc/bttVdkqj2wfJGbeWlQiX8pIyJpKU+tubw== + +"@types/lodash@^4.14.116": + version "4.14.119" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.119.tgz#be847e5f4bc3e35e46d041c394ead8b603ad8b39" + integrity sha512-Z3TNyBL8Vd/M9D9Ms2S3LmFq2sSMzahodD6rCS9V2N44HUMINb75jNkSuwAx7eo2ufqTdfOdtGQpNbieUjPQmw== + "@types/log-symbols@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/log-symbols/-/log-symbols-2.0.0.tgz#7919e2ec3c8d13879bfdcab310dd7a3f7fc9466d" integrity sha512-YJhbp0sz3egFFKl3BcCNPQKzuGFOP4PACcsifhK6ROGnJUW9ViYLuLybQ9GQZm7Zejy3tkGuiXYMq3GiyGkU4g== +"@types/loglevel@^1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/loglevel/-/loglevel-1.5.3.tgz#adfce55383edc5998a2170ad581b3e23d6adb5b8" + integrity sha512-TzzIZihV+y9kxSg5xJMkyIkaoGkXi50isZTtGHObNHRqAAwjGNjSCNPI7AUAv0tZUKTq9f2cdkCUd/2JVZUTrA== + "@types/lru-cache@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" @@ -3159,9 +3311,9 @@ integrity sha512-+UzPmwHSEEyv7aGlNkVpuFxp/BirXgl8NnPGCtmyx2KXIzAapoW3IqSVk87/Z3PUk8vEL8Pe1HXEMJbNBOQgtg== "@types/memoize-one@^4.1.0": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@types/memoize-one/-/memoize-one-4.1.1.tgz#41dd138a4335b5041f7d8fc038f9d593d88b3369" - integrity sha512-+9djKUUn8hOyktLCfCy4hLaIPgDNovaU36fsnZe9trFHr6ddlbIn2q0SEsnkCkNR+pBWEU440Molz/+Mpyf+gQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/@types/memoize-one/-/memoize-one-4.1.0.tgz#62119f26055b3193ae43ca1882c5b29b88b71ece" + integrity sha512-cmSgi6JMX/yBwgpVm4GooNWIH+vEeJoa8FAa6ExOhpJbC0Juq32/uYKiKb3VPSqrEA0aOnjvwZanla3O1WZMbw== "@types/mime-db@*": version "1.27.0" @@ -3190,11 +3342,6 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-2.0.29.tgz#5002e14f75e2d71e564281df0431c8c1b4a2a36a" integrity sha1-UALhT3Xi1x5WQoHfBDHIwbSio2o= -"@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= - "@types/mkdirp@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" @@ -3208,16 +3355,16 @@ integrity sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw== "@types/moment-timezone@^0.5.8": - version "0.5.12" - resolved "https://registry.yarnpkg.com/@types/moment-timezone/-/moment-timezone-0.5.12.tgz#0fb680c03db194fe8ff4551eaeb1eec8d3d80e9f" - integrity sha512-hnHH2+Efg2vExr/dSz+IX860nSiyk9Sk4pJF2EmS11lRpMcNXeB4KBW5xcgw2QPsb9amTXdsVNEe5IoJXiT0uw== + version "0.5.8" + resolved "https://registry.yarnpkg.com/@types/moment-timezone/-/moment-timezone-0.5.8.tgz#92aba9bc238cabf69a27a1a4f52e0ebb8f10f896" + integrity sha512-FpC+fLd/Hmxxcl4cxeb5HTyCmEvl3b4TeX8w9J+0frdzH+UCEkexKe4WZ3DTALwLj2/hyujn8tp3zl1YdgLrxQ== dependencies: moment ">=2.14.0" "@types/mustache@^0.8.31": - version "0.8.32" - resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-0.8.32.tgz#7db3b81f2bf450bd38805f596d20eca97c4ed595" - integrity sha512-RTVWV485OOf4+nO2+feurk0chzHkSjkjALiejpHltyuMf/13fGymbbNNFrSKdSSUg1TIwzszXdWsVirxgqYiFA== + version "0.8.31" + resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-0.8.31.tgz#7c86cbf74f7733f9e3bdc28817623927eb386616" + integrity sha512-72flCZJkEJHPwhmpHgg4a0ZBLssMhg5NB0yltRblRlZMo4py3B/u/d7icevc4EeN9MPQUo/dPtuVOoVy9ih6cQ== "@types/ncp@^2.0.1": version "2.0.1" @@ -3227,16 +3374,16 @@ "@types/node" "*" "@types/nock@^9.3.0": - version "9.3.1" - resolved "https://registry.yarnpkg.com/@types/nock/-/nock-9.3.1.tgz#7d761a43a10aebc7ec6bae29d89afc6cbffa5d30" - integrity sha512-eOVHXS5RnWOjTVhu3deCM/ruy9E6JCgeix2g7wpFiekQh3AaEAK1cz43tZDukKmtSmQnwvSySq7ubijCA32I7Q== + version "9.3.0" + resolved "https://registry.yarnpkg.com/@types/nock/-/nock-9.3.0.tgz#9d34358fdcc08afd07144e0784ac9e951d412dd4" + integrity sha512-ZHf/X8rTQ5Tb1rHjxIJYqm55uO265agE3G7NoSXVa2ep+EcJXgB2fsme+zBvK7MhrxTwkC/xkB6THyv50u0MGw== dependencies: "@types/node" "*" "@types/node-fetch@^2.1.4": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.3.3.tgz#eb9c2a0ce8e9424ebe0c0cbe6f1e8ea7576c1310" - integrity sha512-MIplfRxrDTsIbOLGyFqNWTmxho5Fs710Kul35tEcaqkx9He86mGbSCDvILL0LCMfmm+oJ8tDg51crE9+pJGgiQ== + version "2.1.4" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.1.4.tgz#093d1beae11541aef25999d70aa09286fd025b1a" + integrity sha512-tR1ekaXUGpmzOcDXWU9BW73YfA2/VW1DF1FH+wlJ82BbCSnWTbdX+JkqWQXWKIGsFPnPsYadbXfNgz28g+ccWg== dependencies: "@types/node" "*" @@ -3261,49 +3408,47 @@ integrity sha512-0JKYQRatHdzijO/ni7JV5eHUJWaMRpGvwiABk8U5iAk5Corm0yLNEfYGNkZWYc+wCyCKKpg0+TsZIvP8AymIYA== "@types/opn@^5.1.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@types/opn/-/opn-5.5.0.tgz#f7b80ae1269b76d621290befb568c87e7511e3ac" - integrity sha512-rfEmrSa/x0vArY1aFnVTBAmy6b2I0oNHONL59qR+vnsHfD5xacM40O4PSiVisERq/GmROjmS3Xo/ptp8fx823g== + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/opn/-/opn-5.1.0.tgz#bff7bc371677f4bdbb37884400e03fd81f743927" + integrity sha512-TNPrB7Y1xl06zDI0aGyqkgxjhIev3oJ+cdqlZ52MTAHauWpEL/gIUdHebIfRHFZk9IqSBpE2ci1DT48iZH81yg== dependencies: - opn "*" + "@types/node" "*" "@types/ora@^1.3.2": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/ora/-/ora-1.3.5.tgz#1a08bf64902c1473d3d47de58549a49e07140f1c" - integrity sha512-CZe3oXbO1XylJT1feg+/aCzNt6tfR4XO+IkLetc85O/yaZRw271cZtS8LL/2mknd+PoR5IKAjFLzo4KWZXxung== + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/ora/-/ora-1.3.2.tgz#ded29aeec023deaa1e56b99cb51234954f35a7cd" + integrity sha512-YZjIN90YKxkQjmDZHr1CQP1Z20qUU3TLC10k+SnDqoRv0CNUxREwaaDc3aCRNcOfjCjktdoP2Z8Cxqf4wHjO2w== dependencies: "@types/node" "*" -"@types/p-cancelable@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/p-cancelable/-/p-cancelable-1.0.1.tgz#4f0ce8aa3ee0007c2768b9b3e6e22af20a6eecbd" - integrity sha512-MGdhuVx7X2yJe4dgOnDQcZQAYgiC/QK1O5HUPgTMTxWYiOlyWEO5DWmPBlXQBU1F6/JM7aSgYBDrpt7kurC6dw== - dependencies: - p-cancelable "*" +"@types/p-cancelable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@types/p-cancelable/-/p-cancelable-0.3.0.tgz#3e4fcc54a3dfd81d0f5b93546bb68d0df50553bb" + integrity sha512-sP+9Ivnpil7cdmvr5O+145aXm65YX8Y+Lrul1ojdYz6yaE05Dqonn6Z9v5eqJCQ0UeSGcTRtepMlZDh9ywdKgw== -"@types/p-queue@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/p-queue/-/p-queue-2.3.2.tgz#16bc5fece69ef85efaf2bce8b13f3ebe39c5a1c8" - integrity sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ== +"@types/p-queue@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/p-queue/-/p-queue-2.3.1.tgz#2fb251e46e884e31c4bd1bf58f0e188972353ff4" + integrity sha512-JyO7uMAtkcMMULmsTQ4t/lCC8nxirTtweGG1xAFNNIAoC1RemmeIxq8PiKghuEy99XdbS6Lwx4zpbXUjfeSSAA== -"@types/p-retry@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/p-retry/-/p-retry-3.0.1.tgz#44403f405b7b60d108df8ab37d8db81af1ea80f2" - integrity sha512-LkZCWg4JxFdQR/nGNZcMiyKAbNG3DKBRS6nn6Hg4dLS82zxkdBJJcvf4zXFvDCEI+e4dZdQX6wreqs9RDGMRfw== +"@types/p-retry@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/p-retry/-/p-retry-1.0.1.tgz#2302bc3da425014208c8a9b68293d37325124785" + integrity sha512-HgQPG9kkUb4EpTeUv2taH2nBZsVUb5aOTSw3X2YozcTG1ttmGcLaLKx1MbAz1evVfUEDTCAPmdz2HiFztIyWrw== dependencies: - p-retry "*" + "@types/retry" "*" "@types/papaparse@^4.5.5": - version "4.5.9" - resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-4.5.9.tgz#ff887bd362f57cd0c87320d2de38ac232bb55e81" - integrity sha512-8Pmxp2IEd/y58tOIsiZkCbAkcKI7InYVpwZFVKJyweCVnqnVahKXVjfSo6gvxUVykQsJvtWB+s6Kc60znVfQVw== + version "4.5.6" + resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-4.5.6.tgz#05e4d1b97dd25065235777c49bd43685f066bf5f" + integrity sha512-k+n8uR0yJtexBSzwNmxrOkgTlPImFWU3J1Ye7DjkqZIOXyypUxuWvo6xlOfTfYbgPDebrdYmysiuSb6UMvP6FQ== dependencies: "@types/node" "*" "@types/pngjs@^3.3.1": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@types/pngjs/-/pngjs-3.3.2.tgz#8ed3bd655ab3a92ea32ada7a21f618e63b93b1d4" - integrity sha512-/SBsv93rVnjByzcau24rBwb+N7BHFp2LateaXz1e7m7M0Wzck/ymXTNdWVrCtkuMbwTHAnfdc3X/I/5szsTEAA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/pngjs/-/pngjs-3.3.1.tgz#47d97bd29dd6372856050e9e5e366517dd1ba2d8" + integrity sha512-kcYYpvggAVtJmVp8ojGWkYGi1Q2lJS787f16IOfd7/fUJ0yUasn9XnxIRWQ/gY8eID8MV9h4IgpJU3j/UNJ6QQ== dependencies: "@types/node" "*" @@ -3317,15 +3462,22 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.13.2.tgz#ffe96278e712a8d4e467e367a338b05e22872646" integrity sha512-k6MCN8WuDiCj6O+UJsVMbrreZxkbrhQbO02oDj6yuRu8UAkp0MDdEcDKif8/gBKuJbT84kkO+VHQAqXkumEklg== -"@types/prop-types@*", "@types/prop-types@^15.5.3": - version "15.7.1" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.1.tgz#f1a11e7babb0c3cad68100be381d1e064c68f1f6" - integrity sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg== +"@types/prop-types@*": + version "15.5.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3" + integrity sha512-mOrlCEdwX3seT3n0AXNt4KNPAZZxcsABUHwBgFXOt+nvFUXkxCAO6UBJHPrDxWEa2KDMil86355fjo8jbZ+K0Q== + dependencies: + "@types/react" "*" + +"@types/prop-types@^15.5.3": + version "15.5.9" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.9.tgz#f2d14df87b0739041bc53a7d75e3d77d726a3ec0" + integrity sha512-Nha5b+jmBI271jdTMwrHiNXM+DvThjHOfyZtMX9kj/c/LUj2xiLHsG/1L3tJ8DjAoQN48cHwUwtqBotjyXaSdQ== "@types/proper-lockfile@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/proper-lockfile/-/proper-lockfile-3.0.1.tgz#dd770a2abce3adbcce3bd1ed892ce2f5f17fbc86" - integrity sha512-ODOjqxmaNs0Zkij+BJovsNJRSX7BJrr681o8ZnNTNIcTermvVFzLpz/XFtfg3vNrlPVTJY1l4e9h2LvHoxC1lg== + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/proper-lockfile/-/proper-lockfile-3.0.0.tgz#dcc7cc3714857a4ae6583331d2687e89dc5c94d2" + integrity sha512-+tfnsA3KNPDm7Sj9x5omRgvS6ALc+edjTZXYeR3kVEm+qmsrF+59yJUWZDreV/O0+EQ6t0YSWlzxfdV58UOEVg== "@types/puppeteer-core@^1.9.0": version "1.9.0" @@ -3335,9 +3487,9 @@ "@types/puppeteer" "*" "@types/puppeteer@*": - version "1.12.4" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-1.12.4.tgz#8388efdb0b30a54a7e7c4831ca0d709191d77ff1" - integrity sha512-aaGbJaJ9TuF9vZfTeoh876sBa+rYJWPwtsmHmYr28pGr42ewJnkDTq2aeSKEmS39SqUdkwLj73y/d7rBSp7mDQ== + version "1.11.1" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-1.11.1.tgz#f2fe2e08917af2b4dc4b03bd2b838c05cb9d8410" + integrity sha512-IvrvZfWjITUH7q4WrM25ul9xlIeLM3Oh+hV2FL7xQQSroVf8mX3lMZaN7XEsw6Bdfp99Qm7I4GcD+ak5+wIEfA== dependencies: "@types/node" "*" @@ -3346,17 +3498,24 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== -"@types/react-beautiful-dnd@^10.0.1", "@types/react-beautiful-dnd@^10.1.0": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-10.1.2.tgz#74069f7b1d0cb67b7af99a2584b30e496e545d8b" - integrity sha512-76M5VRbhduUarM9wyMWQm3tLKCVMKTlhG0+W67dteg/HBE+kueIwuyLWzE0m5fmuilvrDXoM5NL890KLnHETZw== +"@types/react-beautiful-dnd@^10.0.1": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-10.0.3.tgz#baa05ebcb6a95cd0d55c9e92263177c0fcaba9f7" + integrity sha512-4h65dOwSC0GrhgmmEGh1p8Fwn6nHtFI3judbDMLDzTkRsPnBx6KwRFveJSMnCULh9gLhPB1ME1bQFEK4j3NgNA== + dependencies: + "@types/react" "*" + +"@types/react-beautiful-dnd@^10.1.0": + version "10.1.1" + resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-10.1.1.tgz#7afae39a4247f30c13b8bbb726ccd1b8cda9d4a5" + integrity sha512-75XELhEIWKTkyd1GdVZFvS1MtJwDs9tM37BbIat8mevcw+uH5dcJzZiwESHIWAzySHawS48nkKCQk/bEDp13Mw== dependencies: "@types/react" "*" "@types/react-dom@^16.8.0": - version "16.8.4" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.8.4.tgz#7fb7ba368857c7aa0f4e4511c4710ca2c5a12a88" - integrity sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA== + version "16.8.2" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.8.2.tgz#9bd7d33f908b243ff0692846ef36c81d4941ad12" + integrity sha512-MX7n1wq3G/De15RGAAqnmidzhr2Y9O/ClxPxyqaNg96pGyeXUYPSvujgzEVpLo9oIP4Wn1UETl+rxTN02KEpBw== dependencies: "@types/react" "*" @@ -3373,26 +3532,26 @@ integrity sha512-FGd6J1GQ7zvl1GZ3BBev83B7nfak8dqoR2PZ+l5MoisKMpd4xOLhZJC1ugpmk3Rz5F85t6HbOg9mYqXW97BsNA== "@types/react-redux@^6.0.6": - version "6.0.14" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-6.0.14.tgz#8ffeb52c4f4d578bf74418d9aff5af7289924e4f" - integrity sha512-bvpWqBOvz2V+EfZ9Qu1d3gFKYCIn/BYoGWAVt1c526tbiI9rtfaBbjutbbapmtEZaEfLuHj3Ljg9qho0SBSwUg== + version "6.0.6" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-6.0.6.tgz#87f1d0a6ea901b93fcaf95fa57641ff64079d277" + integrity sha512-sD/QEn45h+CH0OAhCn6/9COlihZ94bzpP58QzYYCL3tOFta/WBhuvMoyLP8khJLfwQBx1PT70HP/1GnDws9YXQ== dependencies: "@types/react" "*" redux "^4.0.0" "@types/react-router-dom@^4.3.1": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.3.2.tgz#52c17c3682597638f31c17c42620403dc5c2a3f5" - integrity sha512-biesHodFxPgDxku2m08XwPeAfUYBcxAnrQG7pwFikuA3L2e3u2OKAb+Sb16bJuU3L5CTHd+Ivap+ke4mmGsHqQ== + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.3.1.tgz#71fe2918f8f60474a891520def40a63997dafe04" + integrity sha512-GbztJAScOmQ/7RsQfO4cd55RuH1W4g6V1gDW3j4riLlt+8yxYLqqsiMzmyuXBLzdFmDtX/uU2Bpcm0cmudv44A== dependencies: "@types/history" "*" "@types/react" "*" "@types/react-router" "*" "@types/react-router@*": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.4.5.tgz#1166997dc7eef2917b5ebce890ebecb32ee5c1b3" - integrity sha512-12+VOu1+xiC8RPc9yrgHCyLI79VswjtuqeS2gPrMcywH6tkc8rGIUhs4LaL3AJPqo5d+RPnfRpNKiJ7MK2Qhcg== + version "4.0.32" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.32.tgz#501529e3d7aa7d5c738d339367e1a7dd5338b2a7" + integrity sha512-VLQSifCIKCTpfMFrJN/nO5a45LduB6qSMkO9ASbcGdCHiDwJnrLNzk91Q895yG0qWY7RqT2jR16giBRpRG1HQw== dependencies: "@types/history" "*" "@types/react" "*" @@ -3405,17 +3564,17 @@ "@types/react" "*" "@types/react-virtualized@^9.18.7": - version "9.21.1" - resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.1.tgz#c85770f5bb0ccaeb3496d97ff2a2d9028c8ed1fd" - integrity sha512-BwWXk6Vy+YuWbc2jZsmm0fn8bglPUpqUWPH/JUUBfvfKfL2nDvvmCiauyxMCWrxZMVBbkxaUuP82SviaDv0wGw== + version "9.18.7" + resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.18.7.tgz#8703d8904236819facff90b8b320f29233160c90" + integrity sha512-zFLpFJjj5r8MUHf0O5xSWLlv/QYkSkBsYCaYaZbn87d7bb45HP0fZI0IEn9FhvFmt4kgfJhstX2bIkxoOWadYw== dependencies: "@types/prop-types" "*" "@types/react" "*" "@types/react@*", "@types/react@^16.8.0": - version "16.8.15" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.15.tgz#a76515fed5aa3e996603056f54427fec5f2a5122" - integrity sha512-dMhzw1rWK+wwJWvPp5Pk12ksSrm/z/C/+lOQbMZ7YfDQYnJ02bc0wtg4EJD9qrFhuxFrf/ywNgwTboucobJqQg== + version "16.8.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.3.tgz#7b67956f682bea30a5a09b3242c0784ff196c848" + integrity sha512-PjPocAxL9SNLjYMP4dfOShW/rj9FDBJGu3JFRt0zEYf77xfihB6fq8zfDpMrV6s82KnAi7F1OEe5OsQX25Ybdw== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -3427,10 +3586,17 @@ dependencies: "@types/normalize-package-data" "*" -"@types/recompose@^0.30.2", "@types/recompose@^0.30.5": - version "0.30.6" - resolved "https://registry.yarnpkg.com/@types/recompose/-/recompose-0.30.6.tgz#f6ffae2008b84df916ed6633751f9287f344ea3e" - integrity sha512-A9c880h07JMrvVe+PwyjVihrQRyKWp4/GFjfA9YE4NgxdEuQD74gSdDhInhUNctO/dkCcR66rexEXevzBy85cQ== +"@types/recompose@^0.30.2": + version "0.30.2" + resolved "https://registry.yarnpkg.com/@types/recompose/-/recompose-0.30.2.tgz#3bdb7fd37460242ef82f6d6a7428e3c96d3a1b9a" + integrity sha512-O22WmEWoA2z2nbGmX4LqZ9zKzInN+KoyN0Stks9PMhj4GqDDwy2x3Gh0apNhCMzy3HLrCPkb+mH2QxZNtK5grw== + dependencies: + "@types/react" "*" + +"@types/recompose@^0.30.5": + version "0.30.5" + resolved "https://registry.yarnpkg.com/@types/recompose/-/recompose-0.30.5.tgz#09890e3c504546b38193479e610e427ac0888393" + integrity sha512-PEQvFmudB9n0+ZvD8l7lh0olGAWmVAuVwCM4eotzWouH8/Kcr8/EcZyLhYILqoTlqzi6ey/3kbKQzJ/h3KkyXw== dependencies: "@types/react" "*" @@ -3442,9 +3608,9 @@ redux "^3.6.0" "@types/redux-actions@^2.2.1": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@types/redux-actions/-/redux-actions-2.6.0.tgz#3732391d7086e464b3341a190d914a72432dae9d" - integrity sha512-K1LwS+MW7CGzZyOS35xEWvKz0pTyQyfygCgj57qpntbP5SD/F/f1qJwRpJIFmJUpHPwOX/eqWe/8O19bycu8eg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@types/redux-actions/-/redux-actions-2.3.0.tgz#d28d7913ec86ee9e20ecb33a1fed887ecb538149" + integrity sha512-N5gZT7Tg5HGRbQH56D6umLhv1R4koEFjfz5+2TFo/tjAz3Y3Aj+hjQBum3UUO4D53hYO439UlWP5Q+S63vujrQ== "@types/redux@^3.6.31": version "3.6.31" @@ -3461,10 +3627,10 @@ "@types/node" "*" "@types/tough-cookie" "*" -"@types/retry@^0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/retry@*", "@types/retry@^0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.10.2.tgz#bd1740c4ad51966609b058803ee6874577848b37" + integrity sha512-LqJkY4VQ7S09XhI7kA3ON71AxauROhSv74639VsNXC9ish4IWHnIi98if+nP1MxQV3RMPqXSCYgpPsDHjlg9UQ== "@types/rimraf@^2.0.2": version "2.0.2" @@ -3475,9 +3641,9 @@ "@types/node" "*" "@types/selenium-webdriver@^3.0.15": - version "3.0.16" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz#50a4755f8e33edacd9c406729e9b930d2451902a" - integrity sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA== + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.15.tgz#024c24051c3798e9a0cf5cceb1c893140df1bc31" + integrity sha512-5nh8/K2u9p4bk95GGCJB7KBvewaB0TUziZ9DTr+mR2I6RoO4OJVqx7rxK83hs2J1tomwtCGkhiW+Dy8EUnfB+Q== "@types/semver@^5.5.0": version "5.5.0" @@ -3492,19 +3658,9 @@ "@types/node" "*" "@types/sinon@^7.0.0": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.11.tgz#6f28f005a36e779b7db0f1359b9fb9eef72aae88" - integrity sha512-6ee09Ugx6GyEr0opUIakmxIWFNmqYPjkqa3/BuxCBokA0klsOLPgMD5K4q40lH7/yZVuJVzOfQpd7pipwjngkQ== - -"@types/sizzle@*": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" - integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.3.tgz#f8647e883d873962130f906a6114a4e187755696" + integrity sha512-cjmJQLx2B5Hp9SzO7rdSivipo3kBqRqeYkTW17nLST1tn5YLWBjTdnzdmeTJXA1+KrrBLsEuvKQ0fUPGrfazQg== "@types/storybook__addon-actions@^3.4.2": version "3.4.2" @@ -3520,9 +3676,9 @@ "@types/storybook__react" "*" "@types/storybook__addon-knobs@^4.0.4": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/storybook__addon-knobs/-/storybook__addon-knobs-4.0.5.tgz#3984ab2a5934832f5161d85066ac6e65ecbd4581" - integrity sha512-5W9mdCn6J7v22jfh+OQCa0gMOgVo1SjTpxez2AmNA9hWbvkG3LVDhzozTtCnPFR5zZF029yRWAf7HSf/sQkEfQ== + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/storybook__addon-knobs/-/storybook__addon-knobs-4.0.4.tgz#66bd835a086a8d881013a09386da65270713c3a0" + integrity sha512-dN7sRS7pjLHVRY+Cnk7G94kfc7LZQAzEGnqOY0XG9ZdKse25tAKlAyidI7rjxwJ54v1CWswP8p+X4lBznV3cRw== dependencies: "@types/react" "*" "@types/storybook__react" "*" @@ -3556,17 +3712,17 @@ "@types/react" "*" "@types/superagent@*": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.1.tgz#61f0b43d7db93a3c286c124512b7c228183c32fa" - integrity sha512-NetXrraTWPcdGG6IwYJhJ5esUGx8AYNiozbc1ENWEsF6BsD4JmNODJczI6Rm1xFPVp6HZESds9YCfqz4zIsM6A== + version "3.8.4" + resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-3.8.4.tgz#24a5973c7d1a9c024b4bbda742a79267c33fb86a" + integrity sha512-Dnh0Iw6NO55z1beXvlsvUrfk4cd9eL2nuTmUk+rAhSVCk10PGGFbqCCTwbau9D0d2W3DITiXl4z8VCqppGkMPQ== dependencies: "@types/cookiejar" "*" "@types/node" "*" "@types/supertest@^2.0.5": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.7.tgz#46ff6508075cd4519736be060f0d6331a5c8ca7b" - integrity sha512-GibTh4OTkal71btYe2fpZP/rVHIPnnUsYphEaoywVHo+mo2a/LhlOFkIm5wdN0H0DA0Hx8x+tKgCYMD9elHu5w== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.5.tgz#18d082a667eaed22759be98f4923e0061ae70c62" + integrity sha512-orl732spRnz4+Bqwk1OnXkJUX2YhiGvMUyfn8VTGXqMZSk6jrMhBq7IuoSXMyBrpsCV5eSddPiC3S0iIafYxsQ== dependencies: "@types/superagent" "*" @@ -3597,7 +3753,7 @@ resolved "https://registry.yarnpkg.com/@types/type-detect/-/type-detect-4.0.1.tgz#3b0f5ac82ea630090cbf57c57a1bf5a63a29b9b6" integrity sha512-0+S1S9Iq0oJ9w9IaBC5W/z1WsPNDUIAJG+THGmqR4vUAxUPCzIY+dApTvyGsaBUWjafTDL0Dg8Z9+iRuk3/BQA== -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": +"@types/unist@*", "@types/unist@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== @@ -3632,14 +3788,14 @@ "@types/vfile-message" "*" "@types/webpack-env@*": - version "1.13.9" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.9.tgz#a67287861c928ebf4159a908d1fb1a2a34d4097a" - integrity sha512-p8zp5xqkly3g4cCmo2mKOHI9+Z/kObmDj0BmjbDDJQlgDTiEGTbm17MEwTAusV6XceCy+bNw9q/ZHXHyKo3zkg== + version "1.13.6" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.6.tgz#128d1685a7c34d31ed17010fc87d6a12c1de6976" + integrity sha512-5Th3OsZ4gTRdr9Mho83BQ23cex4sRhOR4XTG+m+cJc0FhtUBK9Vn62hBJ+pnQYnSxoPOsKoAPOx6FcphxBC8ng== "@types/wrap-ansi@^2.0.14": - version "2.0.15" - resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-2.0.15.tgz#87affc11a46864cb6853b642e89363633d544aa7" - integrity sha512-kPagHsyqrq5Qg4dSbxFmcX8ea0JYs43PfBcuKK53LT4XTZxbvGnmnY6U6a5QgySb5lEGYiqpg0/HESvTYrlzyQ== + version "2.0.14" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-2.0.14.tgz#5afbdd8374de9ff8ad752cb03ab9f225f7c2ee24" + integrity sha1-Wvvdg3Ten/itdSywOrnyJffC7iQ= "@types/write-pkg@^3.1.0": version "3.1.0" @@ -3654,10 +3810,10 @@ "@types/events" "*" "@types/node" "*" -"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": - version "12.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" - integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== +"@types/yargs@^12.0.9": + version "12.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.10.tgz#17a8ec65cd8e88f51b418ceb271af18d3137df67" + integrity sha512-WsVzTPshvCSbHThUduGGxbmnwcpkgSctHGHTqzWyFg4lYAuV5qXlyFPOsP3OWqCINfmg/8VXP+zJaa4OxEsBQQ== "@types/z-schema@3.16.31": version "3.16.31" @@ -3670,30 +3826,28 @@ integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== "@typescript-eslint/eslint-plugin@^1.6.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.7.0.tgz#570e45dc84fb97852e363f1e00f47e604a0b8bcc" - integrity sha512-NUSz1aTlIzzTjFFVFyzrbo8oFjHg3K/M9MzYByqbMCxeFdErhLAcGITVfXzSz+Yvp5OOpMu3HkIttB0NyKl54Q== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz#a5ff3128c692393fb16efa403ec7c8a5593dab0f" + integrity sha512-U224c29E2lo861TQZs6GSmyC0OYeRNg6bE9UVIiFBxN2MlA0nq2dCrgIVyyRbC05UOcrgf2Wk/CF2gGOPQKUSQ== dependencies: - "@typescript-eslint/parser" "1.7.0" - "@typescript-eslint/typescript-estree" "1.7.0" - eslint-utils "^1.3.1" - regexpp "^2.0.1" + "@typescript-eslint/parser" "1.6.0" + "@typescript-eslint/typescript-estree" "1.6.0" requireindex "^1.2.0" tsutils "^3.7.0" -"@typescript-eslint/parser@1.7.0", "@typescript-eslint/parser@^1.6.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.7.0.tgz#c3ea0d158349ceefbb6da95b5b09924b75357851" - integrity sha512-1QFKxs2V940372srm12ovSE683afqc1jB6zF/f8iKhgLz1yoSjYeGHipasao33VXKI+0a/ob9okeogGdKGvvlg== +"@typescript-eslint/parser@1.6.0", "@typescript-eslint/parser@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.6.0.tgz#f01189c8b90848e3b8e45a6cdad27870529d1804" + integrity sha512-VB9xmSbfafI+/kI4gUK3PfrkGmrJQfh0N4EScT1gZXSZyUxpsBirPL99EWZg9MmPG0pzq/gMtgkk7/rAHj4aQw== dependencies: - "@typescript-eslint/typescript-estree" "1.7.0" + "@typescript-eslint/typescript-estree" "1.6.0" eslint-scope "^4.0.0" eslint-visitor-keys "^1.0.0" -"@typescript-eslint/typescript-estree@1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.7.0.tgz#59ec02f5371964da1cc679dba7b878a417bc8c60" - integrity sha512-K5uedUxVmlYrVkFbyV3htDipvLqTE3QMOUQEHYJaKtgzxj6r7c5Ca/DG1tGgFxX+fsbi9nDIrf4arq7Ib7H/Yw== +"@typescript-eslint/typescript-estree@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.6.0.tgz#6cf43a07fee08b8eb52e4513b428c8cdc9751ef0" + integrity sha512-A4CanUwfaG4oXobD5y7EXbsOHjCwn8tj1RDd820etpPAjH+Icjc2K9e/DQM1Hac5zH2BSy+u6bjvvF2wwREvYA== dependencies: lodash.unescape "4.0.1" semver "5.5.0" @@ -3707,6 +3861,15 @@ "@webassemblyjs/helper-wasm-bytecode" "1.7.10" "@webassemblyjs/wast-parser" "1.7.10" +"@webassemblyjs/ast@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" + integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== + dependencies: + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -3721,6 +3884,11 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz#ee63d729c6311a85863e369a473f9983f984e4d9" integrity sha512-gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ== +"@webassemblyjs/floating-point-hex-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" + integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== + "@webassemblyjs/floating-point-hex-parser@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" @@ -3731,6 +3899,11 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz#bfcb3bbe59775357475790a2ad7b289f09b2f198" integrity sha512-DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw== +"@webassemblyjs/helper-api-error@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" + integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== + "@webassemblyjs/helper-api-error@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" @@ -3741,6 +3914,11 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz#0a8c624c67ad0b214d2e003859921a1988cb151b" integrity sha512-+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA== +"@webassemblyjs/helper-buffer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" + integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== + "@webassemblyjs/helper-buffer@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" @@ -3753,6 +3931,13 @@ dependencies: "@webassemblyjs/wast-printer" "1.7.10" +"@webassemblyjs/helper-code-frame@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" + integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== + dependencies: + "@webassemblyjs/wast-printer" "1.7.11" + "@webassemblyjs/helper-code-frame@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" @@ -3765,6 +3950,11 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz#0915e7713fbbb735620a9d3e4fa3d7951f97ac64" integrity sha512-w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA== +"@webassemblyjs/helper-fsm@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" + integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== + "@webassemblyjs/helper-fsm@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" @@ -3775,6 +3965,11 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz#9beb83f72740f5ac8075313b5cac5e796510f755" integrity sha512-yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ== +"@webassemblyjs/helper-module-context@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" + integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== + "@webassemblyjs/helper-module-context@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" @@ -3788,6 +3983,11 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz#797b1e734bbcfdea8399669cdc58308ef1c7ffc0" integrity sha512-u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg== +"@webassemblyjs/helper-wasm-bytecode@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" + integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== + "@webassemblyjs/helper-wasm-bytecode@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" @@ -3803,6 +4003,16 @@ "@webassemblyjs/helper-wasm-bytecode" "1.7.10" "@webassemblyjs/wasm-gen" "1.7.10" +"@webassemblyjs/helper-wasm-section@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" + integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/helper-wasm-section@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" @@ -3820,6 +4030,13 @@ dependencies: "@xtuc/ieee754" "^1.2.0" +"@webassemblyjs/ieee754@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" + integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + "@webassemblyjs/ieee754@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" @@ -3834,6 +4051,13 @@ dependencies: "@xtuc/long" "4.2.1" +"@webassemblyjs/leb128@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" + integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== + dependencies: + "@xtuc/long" "4.2.1" + "@webassemblyjs/leb128@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" @@ -3846,6 +4070,11 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.10.tgz#b6728f5b6f50364abc155be029f9670e6685605a" integrity sha512-Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ== +"@webassemblyjs/utf8@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" + integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== + "@webassemblyjs/utf8@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" @@ -3865,6 +4094,20 @@ "@webassemblyjs/wasm-parser" "1.7.10" "@webassemblyjs/wast-printer" "1.7.10" +"@webassemblyjs/wasm-edit@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" + integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/helper-wasm-section" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-opt" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wast-printer" "1.7.11" + "@webassemblyjs/wasm-edit@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" @@ -3890,6 +4133,17 @@ "@webassemblyjs/leb128" "1.7.10" "@webassemblyjs/utf8" "1.7.10" +"@webassemblyjs/wasm-gen@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" + integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + "@webassemblyjs/wasm-gen@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" @@ -3911,6 +4165,16 @@ "@webassemblyjs/wasm-gen" "1.7.10" "@webassemblyjs/wasm-parser" "1.7.10" +"@webassemblyjs/wasm-opt@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" + integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wasm-opt@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" @@ -3933,6 +4197,18 @@ "@webassemblyjs/leb128" "1.7.10" "@webassemblyjs/utf8" "1.7.10" +"@webassemblyjs/wasm-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" + integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + "@webassemblyjs/wasm-parser@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" @@ -3957,6 +4233,18 @@ "@webassemblyjs/helper-fsm" "1.7.10" "@xtuc/long" "4.2.1" +"@webassemblyjs/wast-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" + integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/floating-point-hex-parser" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-code-frame" "1.7.11" + "@webassemblyjs/helper-fsm" "1.7.11" + "@xtuc/long" "4.2.1" + "@webassemblyjs/wast-parser@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" @@ -3978,6 +4266,15 @@ "@webassemblyjs/wast-parser" "1.7.10" "@xtuc/long" "4.2.1" +"@webassemblyjs/wast-printer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" + integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + "@xtuc/long" "4.2.1" + "@webassemblyjs/wast-printer@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" @@ -4014,6 +4311,15 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@zeit/check-updates@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@zeit/check-updates/-/check-updates-1.1.0.tgz#d0f65026a36f27cd1fd54c647d8294447c1d2d8b" + integrity sha512-HoAzBs/w1V72BV8t+DVdqb/0Us+sx37En3mVL5u4lPMlZjESDNq5Z/ZnvDTtVg2OkarcES5gTAFzt5vWTvj0Lg== + dependencies: + chalk "2.3.0" + ms "2.1.1" + update-notifier "2.3.0" + JSONStream@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.1.1.tgz#c98bfd88c8f1e1e8694e53c5baa6c8691553e59a" @@ -4022,7 +4328,7 @@ JSONStream@1.1.1: jsonparse "^1.1.0" through ">=2.2.7 <3" -abab@^1.0.4: +abab@^1.0.3, abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= @@ -4050,25 +4356,25 @@ abort-controller@^2.0.3: event-target-shim "^5.0.0" abortcontroller-polyfill@^1.1.9: - version "1.3.0" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.3.0.tgz#de69af32ae926c210b7efbcc29bf644ee4838b00" - integrity sha512-lbWQgf+eRvku3va8poBlDBO12FigTQr9Zb7NIjXrePrhxWVKdCP2wbDl1tLDaYa18PWTom3UEWwdH13S46I+yA== + version "1.1.9" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.1.9.tgz#9fefe359fda2e9e0932dc85e6106453ac393b2da" + integrity sha512-omvG7zOHIs3BphdH62Kh3xy8nlftAsTyp7PDa9EmC3Jz9pa6sZFYk7UhNgu9Y4sIBhj6jF0RgeFZYvPnsP5sBw== accept@3.x.x: - version "3.1.3" - resolved "https://registry.yarnpkg.com/accept/-/accept-3.1.3.tgz#29c3e2b3a8f4eedbc2b690e472b9ebbdc7385e87" - integrity sha512-OgOEAidVEOKPup+Gv2+2wdH2AgVKI9LxsJ4hicdJ6cY0faUuZdZoi56kkXWlHp9qicN1nWQLmW5ZRGk+SBS5xg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/accept/-/accept-3.0.2.tgz#83e41cec7e1149f3fd474880423873db6c6cc9ac" + integrity sha512-bghLXFkCOsC1Y2TZ51etWfKDs6q249SAoHTZVfzWWdlZxoij+mgkj9AmUJWQpDY48TfnrTDIe43Xem4zdMe7mQ== dependencies: boom "7.x.x" - hoek "6.x.x" + hoek "5.x.x" accepts@~1.3.4, accepts@~1.3.5: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + mime-types "~2.1.18" + negotiator "0.6.1" acorn-dynamic-import@^3.0.0: version "3.0.0" @@ -4089,10 +4395,17 @@ acorn-globals@^3.0.0: dependencies: acorn "^4.0.4" -acorn-globals@^4.1.0, acorn-globals@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" - integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== +acorn-globals@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + integrity sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ== + dependencies: + acorn "^5.0.0" + +acorn-globals@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" + integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== dependencies: acorn "^6.0.1" acorn-walk "^6.0.1" @@ -4110,11 +4423,11 @@ acorn-jsx@^5.0.0: integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== acorn-walk@^6.0.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" - integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + version "6.0.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.0.1.tgz#c7827bdbb8e21aa97b609adfa225400d9ae348ba" + integrity sha512-PqVQ8c6a3kyqdsUZlC7nljp3FFuxipBRHKu+7C1h8QygBFlzTaDX5HD383jej3Peed+1aDG8HwkfB1Z1HMNPkw== -acorn@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.5.0, acorn@^5.5.3, acorn@^5.6.2: +acorn@5.X, acorn@^5.0.3, acorn@^5.5.0, acorn@^5.6.2, acorn@^5.7.1: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -4129,21 +4442,26 @@ acorn@^4.0.4, acorn@~4.0.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= -acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.5, acorn@^6.0.7: +acorn@^5.0.0, acorn@^5.1.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" + integrity sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug== + +acorn@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" + integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== + +acorn@^6.0.5, acorn@^6.0.7: version "6.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== -address@1.0.3: +address@1.0.3, address@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" integrity sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg== -address@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.0.tgz#ef8e047847fcd2c5b6f50c16965f924fd99fe709" - integrity sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ== - adm-zip@0.4.11: version "0.4.11" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.11.tgz#2aa54c84c4b01a9d0fb89bb11982a51f13e3d62a" @@ -4161,7 +4479,14 @@ after@0.8.2: resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= -agent-base@4, agent-base@^4.1.0: +agent-base@4: + version "4.2.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" + integrity sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg== + dependencies: + es6-promisify "^5.0.0" + +agent-base@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== @@ -4169,9 +4494,9 @@ agent-base@4, agent-base@^4.1.0: es6-promisify "^5.0.0" agentkeepalive@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" - integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== + version "3.4.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c" + integrity sha512-MPIwsZU9PP9kOrZpyu2042kYA8Fdt/AedQYkYXucHgF9QoD9dXVp0ypuGnHXSR0hTstBxdt85Xkh4JolYfK5wg== dependencies: humanize-ms "^1.2.1" @@ -4184,48 +4509,30 @@ aggregate-error@^1.0.0: indent-string "^3.0.0" "airbnb-js-shims@^1 || ^2": - version "2.2.0" - resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.0.tgz#46e1d9d9516f704ef736de76a3b6d484df9a96d8" - integrity sha512-pcSQf1+Kx7/0ibRmxj6rmMYc5V8SHlKu+rkQ80h0bjSLDaIxHg/3PiiFJi4A9mDc01CoBHoc8Fls2G/W0/+s5g== + version "2.1.1" + resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.1.1.tgz#a509611480db7e6d9db62fe2acfaeb473b6842ac" + integrity sha512-h8UtyB/TCdOwWoEPQJGHgsWwSnTqPrRZbhyZYjAwY9/AbjdjfkKy9L/T3fIFS6MKX8YrpWFRm6xqFSgU+2DRGw== dependencies: array-includes "^3.0.3" array.prototype.flat "^1.2.1" array.prototype.flatmap "^1.2.1" - es5-shim "^4.5.13" - es6-shim "^0.35.5" + es5-shim "^4.5.10" + es6-shim "^0.35.3" function.prototype.name "^1.1.0" - globalthis "^1.0.0" - object.entries "^1.1.0" - object.fromentries "^2.0.0 || ^1.0.0" + object.entries "^1.0.4" + object.fromentries "^1.0.0" object.getownpropertydescriptors "^2.0.3" - object.values "^1.1.0" - promise.allsettled "^1.0.0" + object.values "^1.0.4" promise.prototype.finally "^3.1.0" - string.prototype.matchall "^3.0.1" + string.prototype.matchall "^3.0.0" string.prototype.padend "^3.0.0" string.prototype.padstart "^3.0.0" symbol.prototype.description "^1.0.0" -airbnb-prop-types@^2.12.0: - version "2.13.2" - resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.13.2.tgz#43147a5062dd2a4a5600e748a47b64004cc5f7fc" - integrity sha512-2FN6DlHr6JCSxPPi25EnqGaXC4OC3/B3k1lCd6MMYrZ51/Gf/1qDfaR+JElzWa+Tl7cY2aYOlsYJGFeQyVHIeQ== - dependencies: - array.prototype.find "^2.0.4" - function.prototype.name "^1.1.0" - has "^1.0.3" - is-regex "^1.0.4" - object-is "^1.0.1" - object.assign "^4.1.0" - object.entries "^1.1.0" - prop-types "^15.7.2" - prop-types-exact "^1.2.0" - react-is "^16.8.6" - ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" + integrity sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk= ajv-keywords@^1.0.0: version "1.5.1" @@ -4233,9 +4540,9 @@ ajv-keywords@^1.0.0: integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw= ajv-keywords@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" - integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= ajv@^4.7.0, ajv@^4.9.1: version "4.11.8" @@ -4245,7 +4552,7 @@ ajv@^4.7.0, ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.0.0: +ajv@^5.0.0, ajv@^5.1.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= @@ -4255,10 +4562,20 @@ ajv@^5.0.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== +ajv@^6.1.0, ajv@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" + integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.9.1: + version "6.9.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.2.tgz#4927adb83e7f48e5a32b45729744c71ec39c9c7b" + integrity sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -4280,11 +4597,11 @@ amdefine@>=0.0.4: integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ammo@3.x.x: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ammo/-/ammo-3.0.3.tgz#502aafa9d8bfca264143e226e5f322716e746b0c" - integrity sha512-vo76VJ44MkUBZL/BzpGXaKzMfroF4ZR6+haRuw9p+eSWfoNaH2AxVc8xmiEPC08jhzJSeM6w7/iMUGet8b4oBQ== + version "3.0.1" + resolved "https://registry.yarnpkg.com/ammo/-/ammo-3.0.1.tgz#c79ceeac36fb4e55085ea3fe0c2f42bfa5f7c914" + integrity sha512-4UqoM8xQjwkQ78oiU4NbBK0UgYqeKMAKmwE4ec7Rz3rGU8ZEBFxzgF2sUYKOAlqIXExBDYLN6y1ShF5yQ4hwLQ== dependencies: - hoek "6.x.x" + hoek "5.x.x" angular-aria@1.6.6: version "1.6.6" @@ -4334,9 +4651,9 @@ angular-ui-ace@0.2.3: integrity sha1-PLkDQoEAYho2f8f2QUQOl6QqJtA= angular@>=1.0.6: - version "1.7.8" - resolved "https://registry.yarnpkg.com/angular/-/angular-1.7.8.tgz#b77ede272ce1b261e3be30c1451a0b346905a3c9" - integrity sha512-wtef/y4COxM7ZVhddd7JtAAhyYObq9YXKar9tsW7558BImeVYteJiTxCKeJOL45lJ/+7B4wrAC49j8gTFYEthg== + version "1.6.9" + resolved "https://registry.yarnpkg.com/angular/-/angular-1.6.9.tgz#bc812932e18909038412d594a5990f4bb66c0619" + integrity sha512-6igWH2GIsxV+J38wNWCh8oyjaZsrIPIDO35twloIUyjlF2Yit6UyLAWujHP05ma/LFxTsx4NtYibRoMNBXPR1A== "angular@npm:@elastic/angular@1.6.9-kibana.0": version "1.6.9-kibana.0" @@ -4369,10 +4686,15 @@ ansi-colors@^1.0.1: dependencies: ansi-wrap "^0.1.0" -ansi-colors@^3.0.0, ansi-colors@^3.0.5: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +ansi-colors@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.1.tgz#9638047e4213f3428a11944a7d4b31cba0a3ff95" + integrity sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ== + +ansi-colors@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.0.5.tgz#cb9dc64993b64fd6945485f797fc3853137d9a7b" + integrity sha512-VVjWpkfaphxUBFarydrQ3n26zX5nIK7hcbT3/ielrvwDDyBBjuh2vuSw1P9zkPq0cfqvdw7lkYHnu+OLSfIBsg== ansi-cyan@^0.1.1: version "0.1.1" @@ -4381,12 +4703,17 @@ ansi-cyan@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-escapes@^1.1.0: +ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== + +ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -4432,7 +4759,12 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +ansi-regex@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" + integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== + +ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -4447,13 +4779,20 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.0.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" +ansi-styles@^3.1.0, ansi-styles@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + integrity sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug== + dependencies: + color-convert "^1.9.0" + ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -4521,117 +4860,128 @@ apollo-cache-inmemory@1.2.7: apollo-utilities "^1.0.18" graphql-anywhere "^4.1.16" -apollo-cache@1.2.1, apollo-cache@^1.1.14: - version "1.2.1" - resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.2.1.tgz#aae71eb4a11f1f7322adc343f84b1a39b0693644" - integrity sha512-nzFmep/oKlbzUuDyz6fS6aYhRmfpcHWqNkkA9Bbxwk18RD6LXC4eZkuE0gXRX0IibVBHNjYVK+Szi0Yied4SpQ== +apollo-cache@^1.1.14: + version "1.1.14" + resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.1.14.tgz#c7d54cdbc7f544161f78fa5e4bae56650e22f7ad" + integrity sha512-Zmo9nVqpWFogki2QyulX6Xx6KYXMyYWX74grwgsYYUOukl4pIAdtYyK8e874o0QDgzSOq5AYPXjtfkoVpqhCRw== dependencies: - apollo-utilities "^1.2.1" - tslib "^1.9.3" + apollo-utilities "^1.0.18" apollo-client@^2.3.8: - version "2.5.1" - resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.5.1.tgz#36126ed1d32edd79c3713c6684546a3bea80e6d1" - integrity sha512-MNcQKiqLHdGmNJ0rZ0NXaHrToXapJgS/5kPk0FygXt+/FmDCdzqcujI7OPxEC6e9Yw5S/8dIvOXcRNuOMElHkA== + version "2.3.8" + resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.3.8.tgz#0384a7210eb601ab88b1c13750da076fc9255b95" + integrity sha512-X5wsBD1be1P/mScGsH5H+2hIE8d78WAfqOvFvBpP+C+jzJ9387uHLyFmYYMLRRqDQ3ihjI4iSID7KEOW2gyCcQ== dependencies: "@types/zen-observable" "^0.8.0" - apollo-cache "1.2.1" + apollo-cache "^1.1.14" apollo-link "^1.0.0" apollo-link-dedup "^1.0.0" - apollo-utilities "1.2.1" + apollo-utilities "^1.0.18" symbol-observable "^1.0.2" - ts-invariant "^0.2.1" - tslib "^1.9.3" zen-observable "^0.8.0" + optionalDependencies: + "@types/async" "2.0.49" apollo-link-dedup@^1.0.0: - version "1.0.18" - resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.18.tgz#635cb5659b082e7f270f7649c4b0f71021f7bb4b" - integrity sha512-1rr54wyMTuqUmbWvcXbwduIcaCDcuIgU6MqQ599nAMuTrbSOXthGfoAD8BDTxBGQ9roVlM7ABP0VZVEWRoHWSg== + version "1.0.9" + resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.9.tgz#3c4e4af88ef027cbddfdb857c043fd0574051dad" + integrity sha512-RbuEKpmSHVMtoREMPh2wUFTeh65q+0XPVeqgaOP/rGEAfvLyOMvX0vT2nVaejMohoMxuUnfZwpldXaDFWnlVbg== dependencies: - apollo-link "^1.2.11" - tslib "^1.9.3" + apollo-link "^1.2.2" apollo-link-error@^1.1.7: - version "1.1.10" - resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.10.tgz#ce57f0793f0923b598655de5bf5e028d4cf4fba6" - integrity sha512-itG5UV7mQqaalmRkuRsF0cUS4zW2ja8XCbxkMZnIEeN24X3yoJi5hpJeAaEkXf0KgYNsR0+rmtCQNruWyxDnZQ== + version "1.1.8" + resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.8.tgz#3a957b22b843cf6c307d516709cdc42371c9aafe" + integrity sha512-5hbMIBaINWOsZapWgTF8H2X0q3NjrQD/y4HlqDnUeLmT12OqejLasNh+EFE6q37/l28UHQu1/AuyRn15J7gvCA== dependencies: - apollo-link "^1.2.11" - apollo-link-http-common "^0.2.13" + apollo-link "^1.2.9" + apollo-link-http-common "^0.2.11" tslib "^1.9.3" -apollo-link-http-common@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.13.tgz#c688f6baaffdc7b269b2db7ae89dae7c58b5b350" - integrity sha512-Uyg1ECQpTTA691Fwx5e6Rc/6CPSu4TB4pQRTGIpwZ4l5JDOQ+812Wvi/e3IInmzOZpwx5YrrOfXrtN8BrsDXoA== +apollo-link-http-common@^0.2.11: + version "0.2.11" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.11.tgz#d4e494ed1e45ea0e0c0ed60f3df64541d0de682d" + integrity sha512-FjtzEDiG6blH/2MR4fpVNoxdZUFmddP0sez34qnoLaYz6ABFbTDlmRE/dVN79nPExM4Spfs/DtW7KRqyjJ3tOg== dependencies: - apollo-link "^1.2.11" + apollo-link "^1.2.9" ts-invariant "^0.3.2" tslib "^1.9.3" +apollo-link-http-common@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.4.tgz#877603f7904dc8f70242cac61808b1f8d034b2c3" + integrity sha512-4j6o6WoXuSPen9xh4NBaX8/vL98X1xY2cYzUEK1F8SzvHe2oFONfxJBTekwU8hnvapcuq8Qh9Uct+gelu8T10g== + dependencies: + apollo-link "^1.2.2" + apollo-link-http@^1.5.4: - version "1.5.14" - resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.14.tgz#ed6292248d1819ccd16523e346d35203a1b31109" - integrity sha512-XEoPXmGpxFG3wioovgAlPXIarWaW4oWzt8YzjTYZ87R4R7d1A3wKR/KcvkdMV1m5G7YSAHcNkDLe/8hF2nH6cg== + version "1.5.4" + resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.4.tgz#b80b7b4b342c655b6a5614624b076a36be368f43" + integrity sha512-e9Ng3HfnW00Mh3TI6DhNRfozmzQOtKgdi+qUAsHBOEcTP0PTAmb+9XpeyEEOueLyO0GXhB92HUCIhzrWMXgwyg== dependencies: - apollo-link "^1.2.11" - apollo-link-http-common "^0.2.13" - tslib "^1.9.3" + apollo-link "^1.2.2" + apollo-link-http-common "^0.2.4" apollo-link-schema@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/apollo-link-schema/-/apollo-link-schema-1.2.2.tgz#9938340c8044f6f5de4c6957f2dab75ed361b35a" - integrity sha512-tOXhs3w15qSM9I/kqijiB+9kzJndbszhF+uXmiJ88P6H0ptncrr/9+3EYlnuYoqdEtiVWNj61K83E+7jc8xcYQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/apollo-link-schema/-/apollo-link-schema-1.1.0.tgz#033fda26ffdbfc809d04892de554867f50e2af8e" + integrity sha512-sqWjse5RfrMAhrXecv0WdSLLdF1R5lI4YpbfkioIeJAkB7VB2o+mgA/+onATYKp214MSjloCDWzkvnVpRPFoBw== dependencies: - apollo-link "^1.2.11" - tslib "^1.9.3" + apollo-link "^1.2.2" apollo-link-state@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/apollo-link-state/-/apollo-link-state-0.4.2.tgz#ac00e9be9b0ca89eae0be6ba31fe904b80bbe2e8" - integrity sha512-xMPcAfuiPVYXaLwC6oJFIZrKgV3GmdO31Ag2eufRoXpvT0AfJZjdaPB4450Nu9TslHRePN9A3quxNueILlQxlw== + version "0.4.1" + resolved "https://registry.yarnpkg.com/apollo-link-state/-/apollo-link-state-0.4.1.tgz#65e9e0e12c67936b8c4b12b8438434f393104579" + integrity sha512-69/til4ENfl/Fvf7br2xSsLSBcxcXPbOHVNkzLLejvUZickl93HLO4/fO+uvoBi4dCYRgN17Zr8FwI41ueRx0g== dependencies: apollo-utilities "^1.0.8" graphql-anywhere "^4.1.0-alpha.0" -apollo-link@^1.0.0, apollo-link@^1.2.11, apollo-link@^1.2.2, apollo-link@^1.2.3: - version "1.2.11" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.11.tgz#493293b747ad3237114ccd22e9f559e5e24a194d" - integrity sha512-PQvRCg13VduLy3X/0L79M6uOpTh5iHdxnxYuo8yL7sJlWybKRJwsv4IcRBJpMFbChOOaHY7Og9wgPo6DLKDKDA== +apollo-link@^1.0.0, apollo-link@^1.2.2, apollo-link@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.3.tgz#9bd8d5fe1d88d31dc91dae9ecc22474d451fb70d" + integrity sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw== + dependencies: + apollo-utilities "^1.0.0" + zen-observable-ts "^0.8.10" + +apollo-link@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.9.tgz#40a8f0b90716ce3fd6beb27b7eae1108b92e0054" + integrity sha512-ZLUwthOFZq4lxchQ2jeBfVqS/UDdcVmmh8aUw6Ar9awZH4r+RgkcDeu2ooFLUfodWE3mZr7wIZuYsBas/MaNVA== dependencies: apollo-utilities "^1.2.1" ts-invariant "^0.3.2" tslib "^1.9.3" - zen-observable-ts "^0.8.18" + zen-observable-ts "^0.8.16" -apollo-server-core@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.4.0.tgz#4faff7f110bfdd6c3f47008302ae24140f94c592" - integrity sha512-BP1Vh39krgEjkQxbjTdBURUjLHbFq1zeOChDJgaRsMxGtlhzuLWwwC6lLdPatN8jEPbeHq8Tndp9QZ3iQZOKKA== +apollo-server-core@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.3.6.tgz#08636243c2de56fa8c267d68dd602cb1fbd323e3" + integrity sha1-CGNiQ8LeVvqMJn1o3WAssfvTI+M= dependencies: apollo-cache-control "^0.1.0" apollo-tracing "^0.1.0" graphql-extensions "^0.0.x" apollo-server-errors@^2.0.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.2.1.tgz#f68a3f845929768057da7e1c6d30517db5872205" - integrity sha512-wY/YE3iJVMYC+WYIf8QODBjIP4jhI+oc7kiYo9mrz7LdYPKAgxr/he+NteGcqn/0Ea9K5/ZFTGJDbEstSMeP8g== + version "2.0.2" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.0.2.tgz#e9cbb1b74d2cd78aed23cd886ca2d0c186323b2b" + integrity sha512-zyWDqAVDCkj9espVsoUpZr9PwDznM8UW6fBfhV+i1br//s2AQb07N6ektZ9pRIEvkhykDZW+8tQbDwAO0vUROg== apollo-server-hapi@^1.3.6: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-hapi/-/apollo-server-hapi-1.4.0.tgz#df63dcac17120490cde756370bdb5ea965141bc3" - integrity sha512-wChLPugWVcJM6gcSUuoHV6rO5pJUMrjkO5KcvPy4JXgpAbIGewpQvqJO8mk1y3C48WEhTOlgiFPquzGTnk6yFg== + version "1.3.6" + resolved "https://registry.yarnpkg.com/apollo-server-hapi/-/apollo-server-hapi-1.3.6.tgz#44dea128b64c1c10fdd35ac8307896a57ba1f4a8" + integrity sha1-RN6hKLZMHBD901rIMHiWpXuh9Kg= dependencies: - apollo-server-core "^1.4.0" - apollo-server-module-graphiql "^1.4.0" + apollo-server-core "^1.3.6" + apollo-server-module-graphiql "^1.3.4" boom "^7.1.0" -apollo-server-module-graphiql@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.4.0.tgz#c559efa285578820709f1769bb85d3b3eed3d8ec" - integrity sha512-GmkOcb5he2x5gat+TuiTvabnBf1m4jzdecal3XbXBh/Jg+kx4hcvO3TTDFQ9CuTprtzdcVyA11iqG7iOMOt7vA== +apollo-server-module-graphiql@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.3.4.tgz#50399b7c51b7267d0c841529f5173e5fc7304de4" + integrity sha1-UDmbfFG3Jn0MhBUp9Rc+X8cwTeQ= apollo-tracing@^0.1.0: version "0.1.4" @@ -4640,7 +4990,21 @@ apollo-tracing@^0.1.0: dependencies: graphql-extensions "~0.0.9" -apollo-utilities@1.2.1, apollo-utilities@^1.0.1, apollo-utilities@^1.0.18, apollo-utilities@^1.0.8, apollo-utilities@^1.2.1: +apollo-utilities@^1.0.0, apollo-utilities@^1.0.1, apollo-utilities@^1.0.18, apollo-utilities@^1.0.8: + version "1.0.18" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.18.tgz#e4ee91534283fde2b744a26caaea120fe6a94f67" + integrity sha512-hHrmsoMYzzzfUlTOPpxr0qRpTLotMkBIQ93Ub7ki2SWdLfYYKrp6/KB8YOUkbCwXxSFvYSV24ccuwUEqZIaHIA== + dependencies: + fast-json-stable-stringify "^2.0.0" + +apollo-utilities@^1.0.26: + version "1.0.26" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.26.tgz#589c66bf4d16223531351cf667a230c787def1da" + integrity sha512-URw7o3phymliqYCYatcird2YRPUU2eWCNvip64U9gQrX56mEfK4m99yBIDCMTpmcvOFsKLii1sIEZsHIs/bvnw== + dependencies: + fast-json-stable-stringify "^2.0.0" + +apollo-utilities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.2.1.tgz#1c3a1ebf5607d7c8efe7636daaf58e7463b41b3c" integrity sha512-Zv8Udp9XTSFiN8oyXOjf6PMHepD4yxxReLsl6dPUy5Ths7jti3nmlBzZUOxuTWRwZn0MoclqL7RQ5UEJN8MAxg== @@ -4674,9 +5038,9 @@ aproba@^1.0.3, aproba@^1.1.1: integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== arch@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" - integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.0.tgz#3613aa46149064b3c1f0607919bf1d4786e82889" + integrity sha1-NhOqRhSQZLPB8GB5Gb8dR4boKIk= archiver-utils@^2.0.0: version "2.0.0" @@ -4715,25 +5079,27 @@ archy@^1.0.0: integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= dependencies: delegates "^1.0.0" readable-stream "^2.0.6" -arg@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" - integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w== - -argparse@^1.0.2, argparse@^1.0.7, argparse@~1.0.2, argparse@~1.0.9: +argparse@^1.0.2, argparse@~1.0.2, argparse@~1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + integrity sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY= + dependencies: + sprintf-js "~1.0.2" + argparse@~0.1.15: version "0.1.16" resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c" @@ -4742,15 +5108,16 @@ argparse@~0.1.15: underscore "~1.7.0" underscore.string "~2.4.0" -args@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/args/-/args-4.0.0.tgz#5ca24cdba43d4b17111c56616f5f2e9d91933954" - integrity sha512-4b7lVF58nlo7sNtq8s2OueroOY/UHn0Nt/NVjsx9zn28u6yDVb9bQ/uy/5jKtHCbUDil4MlMyDLF5+OHEgnTug== +args@3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/args/-/args-3.0.8.tgz#2f425ab639c69d74ff728f3d7c6e93b97b91af7c" + integrity sha512-yZ9pTP1UzoR04R2iusf2H3UG70O7mo55O5DjOS/MPKMTvxAFZenVCgi+JP8Q/dI+18qiM/m4r8En9j5/WlsBjQ== dependencies: - camelcase "5.0.0" - chalk "2.3.2" - leven "2.1.0" + camelcase "4.1.0" + chalk "2.1.0" mri "1.1.0" + pkginfo "0.4.1" + string-similarity "1.2.0" argv-split@^2.0.1: version "2.0.1" @@ -4815,11 +5182,6 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= -array-filter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" - integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= - array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" @@ -4832,7 +5194,7 @@ array-find-index@^1.0.1: array-find@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" + resolved "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" integrity sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg= array-flatten@1.1.1: @@ -4841,9 +5203,9 @@ array-flatten@1.1.1: integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY= array-from@^2.1.1: version "2.1.1" @@ -4888,7 +5250,7 @@ array-slice@^1.0.0: resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -4910,14 +5272,6 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.find@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" - integrity sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - array.prototype.flat@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz#812db8f02cad24d3fab65dd67eabe3b8903494a4" @@ -5023,10 +5377,10 @@ ast-types@0.11.3: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.3.tgz#c20757fe72ee71278ea0ff3d87e5c2ca30d9edf8" integrity sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA== -ast-types@0.11.7: - version "0.11.7" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.7.tgz#f318bf44e339db6a320be0009ded64ec1471f46c" - integrity sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw== +ast-types@0.11.6: + version "0.11.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.6.tgz#4e2266c2658829aef3b40cc33ad599c4e9eb89ef" + integrity sha512-nHiuV14upVGl7MWwFUYbzJ6YlfwWS084CU9EA8HajfYQjMSli5TQi3UTRygGF58LFWVkXxS1rbgRhROEqlQkXg== ast-types@0.9.6: version "0.9.6" @@ -5044,9 +5398,9 @@ astral-regex@^1.0.0: integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== async-each@^1.0.0, async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async-foreach@^0.1.3: version "0.1.3" @@ -5112,20 +5466,27 @@ async@1.x, async@^1.4.0, async@^1.4.2, async@^1.5.2, async@~1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@2.6.1: +async@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.4.0.tgz#4990200f18ea5b837c2cc4f8c031a6985c385611" + integrity sha1-SZAgDxjqW4N8LMT4wDGmmFw4VhE= + dependencies: + lodash "^4.14.0" + +async@^2.0.0, async@^2.1.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== + dependencies: + lodash "^4.14.0" + +async@^2.5.0, async@^2.6.0, async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== dependencies: lodash "^4.17.10" -async@^2.0.0, async@^2.1.4, async@^2.5.0, async@^2.6.0, async@^2.6.1, async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== - dependencies: - lodash "^4.17.11" - async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -5180,13 +5541,25 @@ autoprefixer@6.5.4: postcss "^5.2.6" postcss-value-parser "^3.2.3" -autoprefixer@^9.1.0, autoprefixer@^9.4.7: - version "9.5.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.5.1.tgz#243b1267b67e7e947f28919d786b50d3bb0fb357" - integrity sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ== +autoprefixer@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.1.0.tgz#566a70d1148046b96b31efa08090f1999ffb6d8c" + integrity sha512-BbAIdxNdptG/x4DiGGfpkDVYyqu4nUyNdBB0Utr49Gn3+0RERV1MdHik2FSbbWwhMAuk1KrfVJHe7nEMheGdBA== + dependencies: + browserslist "^4.0.1" + caniuse-lite "^1.0.30000872" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.2" + postcss-value-parser "^3.2.3" + +autoprefixer@^9.4.7: + version "9.5.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.5.0.tgz#7e51d0355c11596e6cf9a0afc9a44e86d1596c70" + integrity sha512-hMKcyHsZn5+qL6AUeP3c8OyuteZ4VaUlg+fWbyl8z7PqsKHF/Bf8/px3K6AT8aMzDkBo8Bc11245MM+itDBOxQ== dependencies: - browserslist "^4.5.4" - caniuse-lite "^1.0.30000957" + browserslist "^4.4.2" + caniuse-lite "^1.0.30000947" normalize-range "^0.1.2" num2fraction "^1.2.2" postcss "^7.0.14" @@ -5207,6 +5580,11 @@ aws4@^1.2.1, aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= + axios@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" @@ -5223,11 +5601,9 @@ axobject-query@^2.0.2: ast-types-flow "0.0.7" b64@4.x.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/b64/-/b64-4.1.2.tgz#7015372ba8101f7fb18da070717a93c28c8580d8" - integrity sha512-+GUspBxlH3CJaxMUGUE1EBoWM6RKgWiYwUDal0qdf8m3ArnXNN1KzKVo5HOnE/FSq4HHyWf3TlHLsZI8PKQgrQ== - dependencies: - hoek "6.x.x" + version "4.0.0" + resolved "https://registry.yarnpkg.com/b64/-/b64-4.0.0.tgz#c37f587f0a383c7019e821120e8c3f58f0d22772" + integrity sha512-EhmUQodKB0sdzPPrbIWbGqA5cQeTWxYrAgNeeT1rLZWtD3tbNTnphz8J4vkXI3cPgBNlXBjzEbzDzq0Nwi4f9A== babel-code-frame@^6.26.0: version "6.26.0" @@ -5299,16 +5675,13 @@ babel-helper-to-multiple-sequence-expressions@^0.5.0: resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz#a3f924e3561882d42fcf48907aa98f7979a4588d" integrity sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA== -babel-jest@^24.1.0, babel-jest@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.7.1.tgz#73902c9ff15a7dfbdc9994b0b17fcefd96042178" - integrity sha512-GPnLqfk8Mtt0i4OemjWkChi73A3ALs4w2/QbG64uAj8b5mmwzxc7jbJVRZt8NJkxi6FopVHog9S3xX6UJKb2qg== +babel-jest@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.1.0.tgz#441e23ef75ded3bd547e300ac3194cef87b55190" + integrity sha512-MLcagnVrO9ybQGLEfZUqnOzv36iQzU7Bj4elm39vCukumLVSfoX+tRy3/jW7lUKc7XdpRmB/jech6L/UCsSZjw== dependencies: - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/babel__core" "^7.1.0" babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.6.0" + babel-preset-jest "^24.1.0" chalk "^2.4.2" slash "^2.0.0" @@ -5330,9 +5703,9 @@ babel-messages@^6.23.0: babel-runtime "^6.22.0" babel-plugin-add-module-exports@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.2.tgz#96cd610d089af664f016467fc4567c099cce2d9c" - integrity sha512-4paN7RivvU3Rzju1vGSHWPjO8Y0rI6droWvSFKI6dvEQ4mvoV0zGojnlzVRfI6N8zISo6VERXt3coIuVmzuvNg== + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.0.tgz#72b5424d941a336c6a35357f373d8b8366263031" + integrity sha512-m0sMxPL4FaN2K69GQgaRJa4Ny15qKSdoknIcpN+gz+NaJlAW9pge/povs13tPYsKDboflrEQC+/3kfIsONBTaw== optionalDependencies: chokidar "^2.0.4" @@ -5383,33 +5756,31 @@ babel-plugin-emotion@^9.2.11: touch "^2.0.1" babel-plugin-inline-react-svg@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-inline-react-svg/-/babel-plugin-inline-react-svg-1.1.0.tgz#b39519c78249b3fcf895b541c38b485a2b11b0be" - integrity sha512-Y/tBMi7Jh7Jh+DGcSNsY9/RW33nvcR067HFK0Dp+03jpidil1sJAffBdajK72xn3tbwMsgFLJubxW5xpQLJytA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-inline-react-svg/-/babel-plugin-inline-react-svg-1.0.1.tgz#1457edae1035a12b3c5026ef28a1239edc71d2a2" + integrity sha512-vTsG/L2cUN4XRJdJ1scYXMSBlgAxkZm/tgo1Lo/FulbPADztEtVOPUNuNDeEoRHZCz9RC0ZHXdVSJ/GaqahF/Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/parser" "^7.0.0" lodash.isplainobject "^4.0.6" - resolve "^1.10.0" + resolve "^1.8.1" svgo "^0.7.2" babel-plugin-istanbul@^5.1.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz#841d16b9a58eeb407a0ddce622ba02fe87a752ba" - integrity sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ== + version "5.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz#7981590f1956d75d67630ba46f0c22493588c893" + integrity sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ== dependencies: find-up "^3.0.0" - istanbul-lib-instrument "^3.3.0" - test-exclude "^5.2.3" + istanbul-lib-instrument "^3.0.0" + test-exclude "^5.0.0" -babel-plugin-jest-hoist@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" - integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== - dependencies: - "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.1.0.tgz#dfecc491fb15e2668abbd690a697a8fd1411a7f8" + integrity sha512-gljYrZz8w1b6fJzKcsfKsipSru2DU2DmQ39aB6nV3xQ0DDv3zpIzKGortA5gknrhNnPN8DweaEgrnZdmbGmhnw== -babel-plugin-macros@2.5.0: +babel-plugin-macros@2.5.0, babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.4.5: version "2.5.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.5.0.tgz#01f4d3b50ed567a67b80a30b9da066e94f4097b6" integrity sha512-BWw0lD0kVZAXRD3Od1kMrdmfudqzDzYv2qrN3l2ISR1HVp1EgLKfbOrYV9xmY5k3qx3RIu5uPAUZZZHpo0o5Iw== @@ -5417,15 +5788,6 @@ babel-plugin-macros@2.5.0: cosmiconfig "^5.0.5" resolve "^1.8.1" -babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.4.5: - version "2.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.5.1.tgz#4a119ac2c2e19b458c259b9accd7ee34fd57ec6f" - integrity sha512-xN3KhAxPzsJ6OQTktCanNpIFnnMsCV+t8OloKxIL72D6+SUZYFn9qfklPgef5HyyDtzYZqqb+fs1S12+gQY82Q== - dependencies: - "@babel/runtime" "^7.4.2" - cosmiconfig "^5.2.0" - resolve "^1.10.0" - babel-plugin-minify-builtins@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz#31eb82ed1a0d0efdc31312f93b6e4741ce82c36b" @@ -5506,9 +5868,9 @@ babel-plugin-mock-imports@^1.0.1: integrity sha512-Nu4unCGKeqOfLlfnLPnv/pEHancdAGTqFqyArZ27gsKIiKxeZvMr87IHB8BxhMu3Bfc8fA8bx7hWt32aZbEwpQ== babel-plugin-named-asset-import@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz#20978ed446b8e1bf4a2f42d0a94c0ece85f75f4f" - integrity sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ== + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.1.tgz#5ec13ec446d0a1e5bb6c57a1f94c9cdedb0c50d6" + integrity sha512-vzZlo+yEB5YHqI6CRRTDojeT43J3Wf3C/MVkZW5UlbSeIIVUYRKtxaFT2L/VTv9mbIyatCW39+9g/SZolvwRUQ== babel-plugin-react-docgen@^2.0.2: version "2.0.2" @@ -5615,13 +5977,13 @@ babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-jest@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" - integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== +babel-preset-jest@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.1.0.tgz#83bc564fdcd4903641af65ec63f2f5de6b04132e" + integrity sha512-FfNLDxFWsNX9lUmtwY7NheGlANnagvxq8LZdl5PKnVG3umP+S/g0XbVBfwtA4Ai3Ri/IMkWabBz3Tyk9wdspcw== dependencies: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.6.0" + babel-plugin-jest-hoist "^24.1.0" "babel-preset-minify@^0.5.0 || 0.6.0-alpha.5": version "0.5.0" @@ -5771,9 +6133,9 @@ backport@4.4.1: yargs "^12.0.1" bail@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.3.tgz#63cfb9ddbac829b02a3128cd53224be78e6c21a3" - integrity sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.2.tgz#f7d6c1731630a9f9f0d4d35ed1f962e2074a1764" + integrity sha1-99bBcxYwqfnw1NNe0fli4gdKF2Q= balanced-match@^1.0.0: version "1.0.0" @@ -5790,7 +6152,12 @@ base64-js@0.0.8: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= -base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.2.1: +base64-js@^1.0.2, base64-js@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + integrity sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw== + +base64-js@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== @@ -5842,7 +6209,12 @@ beeper@^1.0.0: resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= -before-after-hook@^1.1.0, before-after-hook@^1.4.0: +before-after-hook@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.1.0.tgz#83165e15a59460d13702cb8febd6a1807896db5a" + integrity sha512-VOMDtYPwLbIncTxNoSzRyvaMxtXmLWLUqr8k5AfC1BzLk34HvBXaQX8snOwQZ4c0aX8aSERqtJSiI9/m2u5kuA== + +before-after-hook@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== @@ -5887,19 +6259,14 @@ bin-version@^2.0.0: find-versions "^2.0.0" binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= -binaryextensions@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.2.tgz#c83c3d74233ba7674e4f313cb2a2b70f54e94b7c" - integrity sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg== +binaryextensions@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" + integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA== bit-twiddle@^1.0.0: version "1.0.2" @@ -5907,12 +6274,11 @@ bit-twiddle@^1.0.0: integrity sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4= bl@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" + integrity sha1-ysMo977kVzDUBLaSID/LWQ4XLV4= dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" + readable-stream "^2.0.5" blob@0.0.5: version "0.0.5" @@ -5931,12 +6297,12 @@ bluebird@3.4.6: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" integrity sha1-AdqNgh2HgT0ViWfnQ9X+bGLPjA8= -bluebird@3.5.1: +bluebird@3.5.1, bluebird@^3.3.0, bluebird@^3.3.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== -bluebird@3.5.3: +bluebird@3.5.3, bluebird@^3.3.5: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== @@ -5946,10 +6312,10 @@ bluebird@^2.10.0: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE= -bluebird@^3.3.0, bluebird@^3.3.1, bluebird@^3.3.5, bluebird@^3.5.1, bluebird@^3.5.3: - version "3.5.4" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" - integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== +bluebird@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" + integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg== bmp-js@^0.1.0: version "0.1.0" @@ -5978,20 +6344,20 @@ body-parser@1.18.3: type-is "~1.6.16" body-parser@^1.16.1: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= dependencies: - bytes "3.1.0" + bytes "3.0.0" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" body@^5.1.0: version "5.1.0" @@ -6034,25 +6400,34 @@ boom@3.1.1: dependencies: hoek "3.x.x" +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== + dependencies: + hoek "4.x.x" + boom@7.x.x, boom@^7.1.0, boom@^7.2.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-7.3.0.tgz#733a6d956d33b0b1999da3fe6c12996950d017b9" - integrity sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A== + version "7.2.2" + resolved "https://registry.yarnpkg.com/boom/-/boom-7.2.2.tgz#ac92101451aa5cea901aed07d881dd32b4f08345" + integrity sha512-IFUbOa8PS7xqmhIjpeStwT3d09hGkNYQ6aj2iELSTxcVs2u0aKn1NzhkdUQSzsRg1FVkj3uit3I6mXQCBixw+A== dependencies: hoek "6.x.x" bounce@1.x.x: - version "1.2.3" - resolved "https://registry.yarnpkg.com/bounce/-/bounce-1.2.3.tgz#2b286d36eb21d5f08fe672dd8cd37a109baad121" - integrity sha512-3G7B8CyBnip5EahCZJjnvQ1HLyArC6P5e+xcolo13BVI9ogFaDOsNMAE7FIWliHtIkYI8/nTRCvCY9tZa3Mu4g== + version "1.2.0" + resolved "https://registry.yarnpkg.com/bounce/-/bounce-1.2.0.tgz#e3bac68c73fd256e38096551efc09f504873c8c8" + integrity sha512-8syCGe8B2/WC53118/F/tFy5aW00j+eaGPXmAUP7iBhxc+EBZZxS1vKelWyBCH6IqojgS2t1gF0glH30qAJKEw== dependencies: boom "7.x.x" - hoek "6.x.x" - -bourne@1.x.x: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bourne/-/bourne-1.1.2.tgz#e290b5bd7166635632eaf8ef12b006b2d4a75b83" - integrity sha512-b2dgVkTZhkQirNMohgC00rWfpVqEi9y5tKM1k3JvoNx05ODtfQoPPd4js9CYFQoY0IM8LAmnJulEuWv74zjUOg== + hoek "5.x.x" boxen@1.3.0, boxen@^1.2.1, boxen@^1.2.2: version "1.3.0" @@ -6081,9 +6456,9 @@ boxen@^2.1.0: widest-line "^2.0.0" brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + integrity sha1-wHshHHyVLsH479Uad+8NHTmQopI= dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -6116,7 +6491,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.1, braces@^2.3.2: +braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -6133,13 +6508,13 @@ braces@^2.3.1, braces@^2.3.2: to-regex "^3.0.1" brfs@^1.3.0, brfs@^1.4.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" - integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ== + version "1.4.3" + resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.4.3.tgz#db675d6f5e923e6df087fca5859c9090aaed3216" + integrity sha1-22ddb16SPm3wh/ylhZyQkKrtMhY= dependencies: quote-stream "^1.0.1" resolve "^1.1.5" - static-module "^2.2.0" + static-module "^1.1.0" through2 "^2.0.0" brorand@^1.0.1: @@ -6155,26 +6530,33 @@ brotli@^1.2.0: base64-js "^1.1.2" browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= -browser-resolve@^1.11.3, browser-resolve@^1.8.1: +browser-resolve@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" +browser-resolve@^1.8.1: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + integrity sha1-j/CbCixCFxihBRwmCzLkj0QpOM4= + dependencies: + resolve "1.1.7" + browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" + integrity sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg== dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -6184,23 +6566,22 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: safe-buffer "^5.0.1" browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + integrity sha1-mYgkSHS/XtTijalWZtzWasj8Njo= dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" evp_bytestokey "^1.0.0" browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + integrity sha1-2qJ3cXRwki7S/hhZQRihdUOXId0= dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" - safe-buffer "^5.1.2" browserify-optional@^1.0.0: version "1.0.1" @@ -6239,7 +6620,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@4.4.1: +browserslist@4.4.1, browserslist@^4.0.1, browserslist@^4.3.4: version "4.4.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A== @@ -6248,14 +6629,23 @@ browserslist@4.4.1: electron-to-chromium "^1.3.103" node-releases "^1.1.3" -browserslist@^4.3.4, browserslist@^4.5.2, browserslist@^4.5.4: - version "4.5.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.6.tgz#ea42e8581ca2513fa7f371d4dd66da763938163d" - integrity sha512-o/hPOtbU9oX507lIqon+UvPYqpx3mHc8cV3QemSBTXwkG8gSQSK6UKvXcE/DcleU3+A59XTUHyCvZ5qGy8xVAg== +browserslist@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.2.tgz#6ea8a74d6464bb0bd549105f659b41197d8f0ba2" + integrity sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg== + dependencies: + caniuse-lite "^1.0.30000939" + electron-to-chromium "^1.3.113" + node-releases "^1.1.8" + +browserslist@^4.5.1: + version "4.5.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.2.tgz#36ad281f040af684555a23c780f5c2081c752df0" + integrity sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ== dependencies: - caniuse-lite "^1.0.30000963" - electron-to-chromium "^1.3.127" - node-releases "^1.1.17" + caniuse-lite "^1.0.30000951" + electron-to-chromium "^1.3.116" + node-releases "^1.1.11" browserslist@~1.4.0: version "1.4.0" @@ -6329,6 +6719,15 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= +buffer@^3.0.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" + integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs= + dependencies: + base64-js "0.0.8" + ieee754 "^1.1.4" + isarray "^1.0.0" + buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" @@ -6338,7 +6737,15 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.0.3, buffer@^5.1.0, buffer@^5.2.0, buffer@^5.2.1: +buffer@^5.0.3: + version "5.0.8" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.8.tgz#84daa52e7cf2fa8ce4195bc5cf0f7809e0930b24" + integrity sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +buffer@^5.1.0, buffer@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== @@ -6364,6 +6771,11 @@ bufrw@^1.2.1: error "^7.0.0" xtend "^4.0.0" +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -6382,12 +6794,7 @@ bytes@1: bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cac@^3.0.3: version "3.0.4" @@ -6403,9 +6810,9 @@ cac@^3.0.3: text-table "^0.2.0" cac@^4.3.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/cac/-/cac-4.4.4.tgz#dec5f3f6aae29ce988d7654e1fb3c6e8077924b1" - integrity sha1-3sXz9qrinOmI12VOH7PG6Ad5JLE= + version "4.4.1" + resolved "https://registry.yarnpkg.com/cac/-/cac-4.4.1.tgz#c6867f731c4be7b0c270689d1689400b914c7788" + integrity sha512-Ab4JHxgvSNI6niHz5M3JCYRXnzERhY314HDwkndOh7FmIyOX7xY+iUqsl0nE17wjt8+kdvxw+b1HDtmFMiVPNA== dependencies: chalk "^2.0.1" minimost "^1.0.0" @@ -6434,23 +6841,23 @@ cacache@^10.0.4: y18n "^4.0.0" cacache@^11.0.2: - version "11.3.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" - integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + version "11.3.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f" + integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA== dependencies: - bluebird "^3.5.3" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.3" - graceful-fs "^4.1.15" - lru-cache "^5.1.1" + bluebird "^3.5.1" + chownr "^1.0.1" + figgy-pudding "^3.1.0" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.3" mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" rimraf "^2.6.2" - ssri "^6.0.1" - unique-filename "^1.1.1" + ssri "^6.0.0" + unique-filename "^1.1.0" y18n "^4.0.0" cache-base@^1.0.1: @@ -6497,12 +6904,12 @@ call-me-maybe@^1.0.1: integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= call@5.x.x: - version "5.0.3" - resolved "https://registry.yarnpkg.com/call/-/call-5.0.3.tgz#5dc82c698141c2d45c51a9c3c7e0697f43ac46a2" - integrity sha512-eX16KHiAYXugbFu6VifstSdwH6aMuWWb4s0qvpq1nR1b+Sf+u68jjttg8ixDBEldPqBi30bDU35OJQWKeTLKxg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/call/-/call-5.0.1.tgz#ac1b5c106d9edc2a17af2a4a4f74dd4f0c06e910" + integrity sha512-ollfFPSshiuYLp7AsrmpkQJ/PxCi6AzV81rCjBwWhyF2QGyUY/vPDMzoh4aUcWyucheRglG2LaS5qkIEfLRh6A== dependencies: boom "7.x.x" - hoek "6.x.x" + hoek "5.x.x" caller-callsite@^2.0.0: version "2.0.0" @@ -6541,9 +6948,9 @@ callsites@^2.0.0: integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + version "3.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" + integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== camel-case@3.0.x, camel-case@^3.0.0: version "3.0.0" @@ -6569,10 +6976,19 @@ camelcase-keys@^3.0.0: camelcase "^3.0.0" map-obj "^1.0.0" -camelcase@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + +camelcase@4.1.0, camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= camelcase@^1.0.2: version "1.2.1" @@ -6589,42 +7005,47 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= -camelcase@^4.0.0, camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" - integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= +camelcase@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" + integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== caniuse-db@^1.0.30000539, caniuse-db@^1.0.30000597: - version "1.0.30000966" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000966.tgz#9f8c14c371a149243300d6f98519f696c9311dd3" - integrity sha512-PDXDry9EACH5Ld4s1JZMKR9BOnhO5qX/2Saqq9SeQhOSJbauFDwUzSefVyDuXN3trnR9MOicR9apPKcb1sihEA== - -caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30000957, caniuse-lite@^1.0.30000963: - version "1.0.30000966" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000966.tgz#f3c6fefacfbfbfb981df6dfa68f2aae7bff41b64" - integrity sha512-qqLQ/uYrpZmFhPY96VuBkMEo8NhVFBZ9y/Bh+KnvGzGJ5I8hvpIaWlF2pw5gqe4PLAL+ZjsPgMOvoXSpX21Keg== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + version "1.0.30000813" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000813.tgz#e0a1c603f8880ad787b2a35652b2733f32a5e29a" + integrity sha1-4KHGA/iICteHsqNWUrJzPzKl4po= + +caniuse-lite@^1.0.30000872, caniuse-lite@^1.0.30000929: + version "1.0.30000932" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000932.tgz#d01763e9ce77810962ca7391ff827b5949ce4272" + integrity sha512-4bghJFItvzz8m0T3lLZbacmEY9X1Z2AtIzTr7s7byqZIOumASfr4ynDx7rtm0J85nDmx8vsgR6vnaSoeU8Oh0A== + +caniuse-lite@^1.0.30000939: + version "1.0.30000943" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000943.tgz#00b25bd5808edc2ed1cfb53533a6a6ff6ca014ee" + integrity sha512-nJMjU4UaesbOHTcmz6VS+qaog++Fdepg4KAya5DL/AZrL/aaAZDGOOQ0AECtsJa09r4cJBdHZMive5mw8lnQ5A== + +caniuse-lite@^1.0.30000947, caniuse-lite@^1.0.30000951: + version "1.0.30000954" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000954.tgz#227c2743e40f07c71e6683b6ca9491bfd5755b8e" + integrity sha512-Wopmc0eVSSG1d9/O4JTn0OmGhUfhEHNkHhoCjUrGSImvHI+2YQWkOI1RRNTUFNSHbSAD8J41jbdZrPP4r32cbQ== + +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= dependencies: - rsvp "^4.8.4" + rsvp "^3.3.3" capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + integrity sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0= cardinal@~0.4.2: version "0.4.4" @@ -6645,22 +7066,22 @@ caseless@~0.12.0: integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= catbox-memory@3.x.x: - version "3.1.4" - resolved "https://registry.yarnpkg.com/catbox-memory/-/catbox-memory-3.1.4.tgz#114fd6da3b2630a5db2ff246db9ff2226148c2b0" - integrity sha512-1tDnll066au0HXBSDHS/YQ34MQ2omBsmnA9g/jseyq/M3m7UPrajVtPDZK/rXgikSC1dfjo9Pa+kQ1qcyG2d3g== + version "3.1.2" + resolved "https://registry.yarnpkg.com/catbox-memory/-/catbox-memory-3.1.2.tgz#4aeec1bc994419c0f7e60087f172aaedd9b4911c" + integrity sha512-lhWtutLVhsq3Mucxk2McxBPPibJ34WcHuWFz3xqub9u9Ve/IQYpZv3ijLhQXfQped9DXozURiaq9O3aZpP91eg== dependencies: big-time "2.x.x" boom "7.x.x" - hoek "6.x.x" + hoek "5.x.x" catbox@10.x.x: - version "10.0.6" - resolved "https://registry.yarnpkg.com/catbox/-/catbox-10.0.6.tgz#d8d8dc3c36c965560539f94245904b229a8af428" - integrity sha512-gQWCnF/jbHcfwGbQ4FQxyRiAwLRipqWTTXjpq7rTqqdcsnZosFa0L3LsCZcPTF33QIeMMkS7QmFBHt6QdzGPvg== + version "10.0.3" + resolved "https://registry.yarnpkg.com/catbox/-/catbox-10.0.3.tgz#1f6f6436dfab30cdd23f753877bcb4afe980414b" + integrity sha512-qwus6RnVctHXYwfxvvDwvlMWHwCjQdIpQQbtyHnRF0JpwmxbQJ/UIZi9y8O6DpphKCdfO9gpxgb2ne9ZDx39BQ== dependencies: boom "7.x.x" - hoek "6.x.x" - joi "14.x.x" + hoek "5.x.x" + joi "13.x.x" caw@^2.0.0: version "2.0.1" @@ -6713,6 +7134,24 @@ chai@^4.0.1, chai@^4.1.2: pathval "^1.1.0" type-detect "^4.0.5" +chalk@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + integrity sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ== + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chalk@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + chalk@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" @@ -6722,16 +7161,7 @@ chalk@2.3.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.0.tgz#a060a297a6b57e15b61ca63ce84995daa0fe6e52" - integrity sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@2.4.1: +chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== @@ -6740,7 +7170,7 @@ chalk@2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.2.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2, chalk@~2.4.1: +chalk@2.4.2, chalk@^2.2.0, chalk@^2.3.2, chalk@^2.4.2, chalk@~2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -6760,6 +7190,15 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + integrity sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g== + dependencies: + ansi-styles "^3.2.0" + escape-string-regexp "^1.0.5" + supports-color "^5.2.0" + chalk@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" @@ -6811,14 +7250,14 @@ change-emitter@^0.1.2: integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= character-entities-legacy@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz#7c6defb81648498222c9855309953d05f4d63a9c" - integrity sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz#f40779df1a101872bb510a3d295e1fccf147202f" + integrity sha1-9Ad53xoQGHK7UQo9KV4fzPFHIC8= character-entities@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.2.tgz#58c8f371c0774ef0ba9b2aca5f00d8f100e6e363" - integrity sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.1.tgz#f76871be5ef66ddb7f8f8e3478ecc374c27d6dca" + integrity sha1-92hxvl72bdt/j440eOzDdMJ9bco= character-parser@^2.1.1: version "2.2.0" @@ -6828,15 +7267,20 @@ character-parser@^2.1.1: is-regex "^1.0.3" character-reference-invalid@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz#21e421ad3d84055952dab4a43a04e73cd425d3ed" - integrity sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz#942835f750e4ec61a308e60c2ef8cc1011202efc" + integrity sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw= chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= +chardet@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029" + integrity sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -6877,12 +7321,12 @@ cheerio@0.22.0: lodash.some "^4.4.0" cheerio@^1.0.0-rc.2: - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" - integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== + version "1.0.0-rc.2" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" + integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= dependencies: css-select "~1.2.0" - dom-serializer "~0.1.1" + dom-serializer "~0.1.0" entities "~1.1.1" htmlparser2 "^3.9.1" lodash "^4.15.0" @@ -6913,10 +7357,10 @@ chokidar@1.6.0: optionalDependencies: fsevents "^1.0.0" -chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4, chokidar@^2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" - integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== +chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4: + version "2.1.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" + integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg== dependencies: anymatch "^2.0.0" async-each "^1.0.1" @@ -6928,19 +7372,24 @@ chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4, chokidar@^2.1.5: normalize-path "^3.0.0" path-is-absolute "^1.0.0" readdirp "^2.2.1" - upath "^1.1.1" + upath "^1.1.0" optionalDependencies: fsevents "^1.2.7" -chownr@^1.0.1, chownr@^1.1.1: +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= + +chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== chroma-js@^1.3.6: - version "1.4.1" - resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-1.4.1.tgz#eb2d9c4d1ff24616be84b35119f4d26f8205f134" - integrity sha512-jTwQiT859RTFN/vIf7s+Vl/Z2LcMrvMv3WUFmd/4u76AdlFC0NTNgqEEFPcRiHmAswPsMiQEDZLM8vX8qXpZNQ== + version "1.3.7" + resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-1.3.7.tgz#38db1b46c99b002b77aa5e6b6744589388f28425" + integrity sha512-ARq0P94NObL8hdQbgc+E33X9OHiNzdHO7epe3nC/KgxNRxkQcFpzNqnGeFjvOY2GxfVhbia686NXD2jByb1o0g== chrome-trace-event@^1.0.0: version "1.0.0" @@ -6960,10 +7409,10 @@ chromedriver@^74.0.0: request "^2.88.0" tcp-port-used "^1.0.1" -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" + integrity sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA== ci-info@^2.0.0: version "2.0.0" @@ -7003,21 +7452,22 @@ class-extend@^0.1.0: object-assign "^2.0.0" class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + version "0.3.5" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.5.tgz#17e793103750f9627b2176ea34cfd1b565903c80" + integrity sha1-F+eTEDdQ+WJ7IXbqNM/RtWWQPIA= dependencies: arr-union "^3.1.0" define-property "^0.2.5" isobject "^3.0.0" + lazy-cache "^2.0.2" static-extend "^0.1.1" -classnames@2.2.5: +classnames@2.2.5, classnames@2.x, classnames@^2.2.4: version "2.2.5" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" integrity sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0= -classnames@2.x, classnames@^2.2.3, classnames@^2.2.4, classnames@^2.2.5, classnames@^2.2.6: +classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== @@ -7039,14 +7489,14 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= -cli-cursor@^1.0.1: +cli-cursor@^1.0.1, cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= dependencies: restore-cursor "^1.0.1" -cli-cursor@^2.0.0, cli-cursor@^2.1.0: +cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= @@ -7058,17 +7508,22 @@ cli-list@^0.2.0: resolved "https://registry.yarnpkg.com/cli-list/-/cli-list-0.2.0.tgz#7e673ee0dd39a611a486476e53f3c6b3941cb582" integrity sha1-fmc+4N05phGkhkduU/PGs5QctYI= -cli-spinners@^1.0.1, cli-spinners@^1.1.0: +cli-spinners@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" + integrity sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw= + +cli-spinners@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" + integrity sha1-8YR7FohE2RemceudFH499JfJDQY= + +cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== -cli-spinners@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.1.0.tgz#22c34b4d51f573240885b201efda4e4ec9fff3c7" - integrity sha512-8B00fJOEh1HPrx4fo5eW16XmE1PcL1tGpGrxy63CXGP9nHdPBN63X75hA1zhvQuhVztJWLqV58Roj2qlNM7cAA== - -cli-table3@0.5.1: +cli-table3@0.5.1, cli-table3@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== @@ -7183,9 +7638,9 @@ clone-deep@^2.0.1: shallow-clone "^1.0.0" clone-regexp@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.1.tgz#051805cd33173375d82118fc0918606da39fd60f" - integrity sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw== + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.0.tgz#eae0a2413f55c0942f818c229fefce845d7f3b1c" + integrity sha1-6uCiQT9VwJQvgYwin+/OhF1/Oxw= dependencies: is-regexp "^1.0.0" is-supported-regexp-flag "^1.0.0" @@ -7239,6 +7694,11 @@ cmd-shim@^2.0.2: graceful-fs "^4.1.2" mkdirp "~0.5.0" +co@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" + integrity sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g= + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -7276,9 +7736,9 @@ coffeescript@~1.10.0: integrity sha1-56qDAZF+9iGzXYo580jc3R234z4= collapse-white-space@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.4.tgz#ce05cf49e54c3277ae573036a26851ba430a0091" - integrity sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.3.tgz#4b906f670e5a963a87b76b0e1689643341b6023c" + integrity sha1-S5BvZw5aljqHt2sOFolkM0G2Ajw= collection-visit@^1.0.0: version "1.0.0" @@ -7288,7 +7748,14 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.8.2, color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.8.2, color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== + dependencies: + color-name "^1.1.1" + +color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -7300,12 +7767,20 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0: +color-name@^1.0.0, color-name@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.4.0, color-string@^1.5.2: +color-string@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.2.tgz#26e45814bc3c9a7cbd6751648a41434514a773a9" + integrity sha1-JuRYFLw8mny9Z1FkikFDRRSnc6k= + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-string@^1.5.2: version "1.5.3" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== @@ -7344,7 +7819,12 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.0, colors@^1.1.2, colors@^1.2.1: +colors@^1.1.0, colors@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" + integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== + +colors@^1.1.2: version "1.3.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== @@ -7360,9 +7840,9 @@ colors@~1.2.1: integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== colorspace@1.1.x: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5" - integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972" + integrity sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw== dependencies: color "3.0.x" text-hex "1.0.x" @@ -7381,41 +7861,38 @@ combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined dependencies: delayed-stream "~1.0.0" -combokeys@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/combokeys/-/combokeys-3.0.1.tgz#fc8ca5c3f5f2d2b03a458544cb88b14ab5f53f86" - integrity sha512-5nAfaLZ3oO3kA+/xdoL7t197UJTz2WWidyH3BBeU6hqHtvyFERICd0y3DQFrQkJFTKBrtUDck/xCLLoFpnjaCw== +combokeys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/combokeys/-/combokeys-3.0.0.tgz#955c59a3959af40d26846ab6fc3c682448e7572e" + integrity sha1-lVxZo5Wa9A0mhGq2/DxoJEjnVy4= comma-separated-tokens@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.6.tgz#3cd3d8adc725ab473843db338bcdfd4a7bb087bf" - integrity sha512-f20oA7jsrrmERTS70r3tmRSxR8IJV2MTN7qe6hzgX+3ARfXrdMJFvGWvWQK0xpcBurg9j9eO2MiqzZ8Y+/UPCA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.5.tgz#b13793131d9ea2d2431cf5b507ddec258f0ce0db" + integrity sha512-Cg90/fcK93n0ecgYTAz1jaA3zvnQ0ExlmKY1rdbyHqAx6BHxwoJc+J7HDu0iuQ7ixEs1qaa+WyQ6oeuBpYP1iA== + dependencies: + trim "0.0.1" commander@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" integrity sha1-+mihT2qUXVTbvlDYzbMyDp47GgY= -commander@2, commander@^2.11.0, commander@^2.12.2, commander@^2.19.0, commander@^2.7.1, commander@^2.8.1, commander@^2.9.0, commander@~2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@2, commander@2.19.0, commander@^2.11.0, commander@^2.12.2, commander@^2.19.0, commander@^2.9.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== commander@2.12.2: version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" integrity sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA== -commander@2.17.x: +commander@2.17.x, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@2.19.0, commander@~2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - commander@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" @@ -7435,6 +7912,16 @@ commander@2.9.0, commander@~2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@^2.7.1: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +commander@^2.8.1: + version "2.18.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" + integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== + commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" @@ -7455,7 +7942,7 @@ compare-versions@3.1.0: resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.1.0.tgz#43310256a5c555aaed4193c04d8f154cf9c6efd5" integrity sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ== -compare-versions@^3.4.0: +compare-versions@^3.2.1: version "3.4.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== @@ -7465,16 +7952,11 @@ component-bind@1.0.0: resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= -component-emitter@1.2.1: +component-emitter@1.2.1, component-emitter@^1.2.0, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= -component-emitter@^1.2.0, component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" @@ -7490,24 +7972,24 @@ compress-commons@^1.2.0: normalize-path "^2.0.0" readable-stream "^2.0.0" -compressible@~2.0.16: - version "2.0.17" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" - integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== +compressible@~2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" + integrity sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k= dependencies: - mime-db ">= 1.40.0 < 2" + mime-db ">= 1.33.0 < 2" -compression@^1.6.2, compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== +compression@^1.5.2, compression@^1.6.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" + integrity sha1-qv+81qr4VLROuygDU9WtFlH1mmk= dependencies: - accepts "~1.3.5" + accepts "~1.3.4" bytes "3.0.0" - compressible "~2.0.16" + compressible "~2.0.13" debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" + on-headers "~1.0.1" + safe-buffer "5.1.1" vary "~1.1.2" concat-map@0.0.1: @@ -7533,7 +8015,7 @@ concat-stream@1.5.1: readable-stream "~2.0.0" typedarray "~0.0.5" -concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@~1.6.0: +concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -7543,7 +8025,16 @@ concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^ readable-stream "^2.2.2" typedarray "^0.0.6" -conf@^1.1.2, conf@^1.4.0: +concat-stream@^1.4.7, concat-stream@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +conf@^1.1.2, conf@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/conf/-/conf-1.4.0.tgz#1ea66c9d7a9b601674a5bb9d2b8dc3c726625e67" integrity sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg== @@ -7554,7 +8045,15 @@ conf@^1.1.2, conf@^1.4.0: pkg-up "^2.0.0" write-file-atomic "^2.3.0" -config-chain@^1.1.11, config-chain@^1.1.12: +config-chain@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" + integrity sha1-q6CXR9++TD5w52am5BWG4YWfxvI= + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +config-chain@^1.1.12: version "1.1.12" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== @@ -7576,7 +8075,19 @@ configstore@^1.0.0: write-file-atomic "^1.1.2" xdg-basedir "^2.0.0" -configstore@^3.0.0, configstore@^3.1.2: +configstore@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + integrity sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +configstore@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== @@ -7588,10 +8099,10 @@ configstore@^3.0.0, configstore@^3.1.2: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + integrity sha1-sGhzk0vF40T+9hGhlqb6rgruAVo= connect@^3.6.0: version "3.6.6" @@ -7639,9 +8150,9 @@ constants-browserify@^1.0.0: integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= "constate-latest@npm:constate@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/constate/-/constate-1.1.1.tgz#444f27fb8178ce8a0f5483c06b5153927eed5409" - integrity sha512-5NSP5HuZoIcRjpWdLgKLk3kXkJWoD6qV9Dv6XsZz9Dk17E4jDEdi6pTtStv5TDC06+4fXW3Qq4VVUD0pWaaccA== + version "1.0.0" + resolved "https://registry.yarnpkg.com/constate/-/constate-1.0.0.tgz#93fa87108e364a05e93b3597e22d53adaf86776d" + integrity sha512-b1Pip712fAQ1el4pndiYeVMXAzlbrD8+Z8ik79TOQc3ZJNjxKGawT0gCPpANsNbT4eHszDZ/8472hvL1rowUhQ== constate@^0.9.0: version "0.9.0" @@ -7665,15 +8176,20 @@ content-disposition@0.5.3: dependencies: safe-buffer "5.1.2" +content-type-parser@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ== + content-type@1.0.4, content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== content@4.x.x: - version "4.0.6" - resolved "https://registry.yarnpkg.com/content/-/content-4.0.6.tgz#76ffd96c5cbccf64fe3923cbb9c48b8bc04b273e" - integrity sha512-lR9ND3dXiMdmsE84K6l02rMdgiBVmtYWu1Vr/gfSGHcIcznBj2QxmSdUgDuNFOA+G9yrb1IIWkZ7aKtB6hDGyA== + version "4.0.5" + resolved "https://registry.yarnpkg.com/content/-/content-4.0.5.tgz#bc547deabc889ab69bce17faf3585c29f4c41bf2" + integrity sha512-wDP6CTWDpwCf791fNxlCCkZGRkrNzSEU/8ju9Hnr3Uc5mF/gFR5W+fcoGm6zUSlVPdSXYn5pCbySADKj7YM4Cg== dependencies: boom "7.x.x" @@ -7690,7 +8206,12 @@ contra@1.9.1: atoa "1.0.0" ticky "1.0.0" -convert-source-map@1.X, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@1.X, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= + +convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -7717,9 +8238,9 @@ cookie@0.3.1: integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= cookiejar@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.1.tgz#41ad57b1b555951ec171412a81942b1e8200d34a" + integrity sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o= copy-concurrently@^1.0.0: version "1.0.5" @@ -7739,13 +8260,27 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= copy-to-clipboard@^3.0.8: - version "3.1.0" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.1.0.tgz#0a28141899e6bd217b9dc13fd1689b3b38820b44" - integrity sha512-+RNyDq266tv5aGhfRsL6lxgj8Y6sCvTrVJnFUVvuxuqkcSMaLISt1wd4JkdQSphbcLTIQ9kEpTULNnoCXAFdng== + version "3.0.8" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz#f4e82f4a8830dce4666b7eb8ded0c9bcc313aba9" + integrity sha512-c3GdeY8qxCHGezVb1EFQfHYK/8NZRemgcTIzPq7PuxjHAf/raKibn2QdhHPb/y6q74PMgH6yizaDZlRmw6QyKw== + dependencies: + toggle-selection "^1.0.3" + +copy-webpack-plugin@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz#d53444a8fea2912d806e78937390ddd7e632ee5c" + integrity sha512-zmC33E8FFSq3AbflTvqvPvBo621H36Afsxlui91d+QyZxPIuXghfnTsa1CuqiAaCPgJoSUWfTFbKJnadZpKEbQ== dependencies: - toggle-selection "^1.0.6" + cacache "^10.0.4" + find-cache-dir "^1.0.0" + globby "^7.1.1" + is-glob "^4.0.0" + loader-utils "^1.1.0" + minimatch "^3.0.4" + p-limit "^1.0.0" + serialize-javascript "^1.4.0" -copy-webpack-plugin@^4.5.2, copy-webpack-plugin@^4.6.0: +copy-webpack-plugin@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae" integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA== @@ -7760,36 +8295,41 @@ copy-webpack-plugin@^4.5.2, copy-webpack-plugin@^4.6.0: serialize-javascript "^1.4.0" core-js-compat@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0" - integrity sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g== + version "3.0.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.0.tgz#cd9810b8000742535a4a43773866185e310bd4f7" + integrity sha512-W/Ppz34uUme3LmXWjMgFlYyGnbo1hd9JvA0LNQ4EmieqVjg2GPYbj3H6tcdP2QGPGWdRKUqZVbVKLNIFVs/HiA== dependencies: - browserslist "^4.5.4" - core-js "3.0.1" - core-js-pure "3.0.1" - semver "^6.0.0" + browserslist "^4.5.1" + core-js "3.0.0" + core-js-pure "3.0.0" + semver "^5.6.0" -core-js-pure@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe" - integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g== +core-js-pure@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.0.tgz#a5679adb4875427c8c0488afc93e6f5b7125859b" + integrity sha512-yPiS3fQd842RZDgo/TAKGgS0f3p2nxssF1H65DIZvZv0Od5CygP8puHXn3IQiM/39VAvgCbdaMQpresrbGgt9g== -core-js@2.5.3, core-js@^2.4.0, core-js@^2.5.1: +core-js@2.5.3, core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.1: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= -core-js@3.0.1, core-js@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" - integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew== +core-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.0.tgz#a8dbfa978d29bfc263bfb66c556d0ca924c28957" + integrity sha512-WBmxlgH2122EzEJ6GH8o9L/FeoUKxxxZ6q6VUxoTlsE4EvbTWKJb447eyVxTEuq0LpXjlq/kCB2qgBvsYRkLvQ== core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.2.0, core-js@^2.5.0, core-js@^2.5.3, core-js@^2.5.7, core-js@^2.6.5: +core-js@^2.5.3, core-js@^2.5.7: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== + +core-js@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== @@ -7809,7 +8349,17 @@ cosmiconfig@^4.0.0: parse-json "^4.0.0" require-from-string "^2.0.1" -cosmiconfig@^5.0.5, cosmiconfig@^5.2.0: +cosmiconfig@^5.0.5: + version "5.0.7" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04" + integrity sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + +cosmiconfig@^5.0.7: version "5.2.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8" integrity sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g== @@ -7819,36 +8369,26 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.2.0: js-yaml "^3.13.0" parse-json "^4.0.0" -cp-file@*: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" - integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== - dependencies: - graceful-fs "^4.1.2" - make-dir "^3.0.0" - nested-error-stacks "^2.0.0" - p-event "^4.1.0" - -cp-file@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" - integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== +cp-file@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.0.0.tgz#f38477ece100b403fcf780fd34d030486beb693e" + integrity sha512-OtHMgPugkgwHlbph25wlMKd358lZNhX1Y2viUpPoFmlBPlEiPIRhztYWha11grbGPnlM+urp5saVmwsChCIOEg== dependencies: graceful-fs "^4.1.2" - make-dir "^2.0.0" + make-dir "^1.0.0" nested-error-stacks "^2.0.0" - pify "^4.0.1" + pify "^3.0.0" safe-buffer "^5.0.1" cpy@^7.0.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-7.2.0.tgz#6f0f39ec720712628b4702c32263816f4720a364" - integrity sha512-CUYi9WYd7vdtEcq1NKqiS/yY2WdaDCNOBA/AoTQHVJzlpJMqctB8py9JrHgGIft6TgO5m8ZidI4l1ZD+RMr/wA== + version "7.0.1" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-7.0.1.tgz#d817e4d81bd7f0f25ff812796c5f1392dc0fb485" + integrity sha512-Zo52tXKLJcgy/baacn6KaNoRAakkl2wb+R4u6qJ4wlD0uchncwRQcIk66PlGlkzuToCJO6A6PWX27Tdwc8LU2g== dependencies: arrify "^1.0.1" - cp-file "^6.1.0" - globby "^9.2.0" - nested-error-stacks "^2.1.0" + cp-file "^6.0.0" + globby "^8.0.1" + nested-error-stacks "^2.0.0" crc32-stream@^2.0.0: version "2.0.0" @@ -7866,9 +8406,9 @@ crc@^3.4.4: buffer "^5.1.0" create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + integrity sha1-iIxyNZbN92EvZJgjPuvXo1MBc30= dependencies: bn.js "^4.1.0" elliptic "^6.0.0" @@ -7894,20 +8434,19 @@ create-error-class@^3.0.0, create-error-class@^3.0.1: capture-stack-trace "^1.0.0" create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + integrity sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0= dependencies: cipher-base "^1.0.1" inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" + ripemd160 "^2.0.0" sha.js "^2.4.0" create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + integrity sha1-rLniIaThe9sHbpBlfEK5PjcmzwY= dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -7916,7 +8455,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-react-class@^15.5.1, create-react-class@^15.5.2: +create-react-class@^15.5.1: version "15.6.3" resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg== @@ -7925,6 +8464,15 @@ create-react-class@^15.5.1, create-react-class@^15.5.2: loose-envify "^1.3.1" object-assign "^4.1.1" +create-react-class@^15.5.2: + version "15.6.2" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a" + integrity sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co= + dependencies: + fbjs "^0.8.9" + loose-envify "^1.3.1" + object-assign "^4.1.1" + create-react-context@<=0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca" @@ -7947,9 +8495,9 @@ create-react-context@^0.2.1: gud "^1.0.0" cronstrue@^1.51.0: - version "1.66.0" - resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-1.66.0.tgz#e145e1dad4f1aac778d9b557a5586fd64c5b63ac" - integrity sha512-qmxOg+PXakt05fesp6X7WGIqsH6aDxfkvGkazsbcJNeeTt8iyQho2ogtVfOsD8phV8oDEeTGVl1FF6Ae3RZhJA== + version "1.51.0" + resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-1.51.0.tgz#7a63153d61d940344049037628da38a60784c8e2" + integrity sha512-fSRAz/MV0TRjeNZKAsovmH/MSsly7+8np4XsfsrjOOz7sjxLrE9SmedRYAs3nPAtLLC5UsMpvenjXYRz463bMA== cross-fetch@2.2.2: version "2.2.2" @@ -8025,6 +8573,13 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" +cryptiles@3.x.x: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.4.tgz#769a68c95612b56faadfcebf57ac86479cbe8322" + integrity sha512-8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw== + dependencies: + boom "5.x.x" + cryptiles@4.x.x: version "4.1.3" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-4.1.3.tgz#2461d3390ea0b82c643a6ba79f0ed491b0934c25" @@ -8072,7 +8627,12 @@ cson@~3.0.2: requirefresh "^2.0.0" safefs "^4.0.0" -css-box-model@^1.0.0, css-box-model@^1.1.1: +css-box-model@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.0.0.tgz#60142814f2b25be00c4aac65ea1a55a531b18922" + integrity sha512-MGipbCM6/HGmsOwN6Enq1OvNKy8H5Q1XKoyBszxwv2efly7ZVg+HcFILX8O6S0xfj27l1+6P7FyCjcQ90m5HBQ== + +css-box-model@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.1.1.tgz#c9fd8e7a8b1d59d41d6812fd1765433f671b2ee0" integrity sha512-ZxbuLFeAPEDb0wPbGfT7783Vb00MVAkvOlMKwr0kA2PD5EGxk6P3MAhedvVuyVJCWb54bb+6HQ7pdPYENf8AZw== @@ -8163,21 +8723,21 @@ css-select@^2.0.0: nth-check "^1.0.2" css-selector-tokenizer@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" - integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA== + version "0.7.0" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + integrity sha1-5piEdK6MlTR3v15+/s/OzNnPTIY= dependencies: cssesc "^0.1.0" fastparse "^1.1.1" regexpu-core "^1.0.0" css-to-react-native@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.0.tgz#bf80d24ec4a08e430306ef429c0586e6ed5485f7" - integrity sha512-IhR7bNIrCFwbJbKZOAjNDZdwpsbjTN6f1agXeELHDqg1wHPA8c2QLruttKOW7hgMGetkfraRJCIEMrptifBfVw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.0.4.tgz#cf4cc407558b3474d4ba8be1a2cd3b6ce713101b" + integrity sha1-z0zEB1WLNHTUuovhos07bOcTEBs= dependencies: - camelize "^1.0.0" css-color-keywords "^1.0.0" + fbjs "^0.8.5" postcss-value-parser "^3.3.0" css-tree@1.0.0-alpha.28: @@ -8251,22 +8811,34 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: - version "0.3.6" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" - integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs= -cssstyle@^1.0.0, cssstyle@^1.1.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" - integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= dependencies: cssom "0.3.x" -csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.7: - version "2.6.4" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.4.tgz#d585a6062096e324e7187f80e04f92bd0f00e37f" - integrity sha512-lAJUJP3M6HxFXbqtGRc0iZrdyeN+WzOWeY0q/VnFzI+kqVrYIzC7bWlKqCW7oCIdzoPkvfp82EVvrTlQ8zsWQg== +cssstyle@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" + integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== + dependencies: + cssom "0.3.x" + +csstype@^2.2.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.2.tgz#3043d5e065454579afc7478a18de41909c8a2f01" + integrity sha512-Rl7PvTae0pflc1YtxtKbiSqq20Ts6vpIYOD5WBafl4y123DyHUeLrRdQP66sQW8/6gmX8jrYJLXwNeMqYVJcow== + +csstype@^2.5.2, csstype@^2.5.7: + version "2.6.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.3.tgz#b701e5968245bf9b08d54ac83d00b624e622a9fa" + integrity sha512-rINUZXOkcBmoHWEyu7JdHu5JMzkGRoMX4ov9830WNgxf5UYxcBUO0QTKAqeJ5EZfSdlrcJYkC8WwfVW7JYi4yg== cuint@^0.2.2: version "0.2.2" @@ -8317,17 +8889,34 @@ d3-cloud@1.2.1: dependencies: d3-dispatch "0.2.x" -d3-collection@1, d3-collection@^1.0.3, d3-collection@^1.0.7: +d3-collection@1, d3-collection@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== -d3-color@1, d3-color@^1.0.3, d3-color@^1.2.3: +d3-collection@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2" + integrity sha1-NC39EoN8kJdPM/HMCnha6lcNzcI= + +d3-color@1, d3-color@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.2.3.tgz#6c67bb2af6df3cc8d79efcc4d3a3e83e28c8048f" integrity sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw== -d3-contour@^1.1.0, d3-contour@^1.3.2: +d3-color@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b" + integrity sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs= + +d3-contour@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.1.2.tgz#21f5456fcf57645922d69a27a58e782c91f842b3" + integrity sha512-po2Gxab58NQMAaVLj1ruASkmHlB8JebFFhm2cDVs2JFjTv9AYZpRQEWMycLoP7JH530dBDl90HI30g5EnpTJfA== + dependencies: + d3-array "^1.1.1" + +d3-contour@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== @@ -8354,44 +8943,63 @@ d3-dsv@^1.0.10: rw "1" d3-force@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" - integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.0.tgz#60713f7efe8764f53e685d69433c06914dc4ea4c" + integrity sha512-PFLcDnRVANHMudbQlIB87gcfQorEsDIAvRpZ2bNddfM/WxdsEkyrEaOIPoydhH1I1V4HPjNLGOMLXCA0AuGQ9w== dependencies: d3-collection "1" d3-dispatch "1" d3-quadtree "1" d3-timer "1" -d3-format@1, d3-format@^1.2.0, d3-format@^1.3.2: +d3-format@1, d3-format@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.3.2.tgz#6a96b5e31bcb98122a30863f7d92365c00603562" integrity sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ== -d3-geo@^1.11.3, d3-geo@^1.6.4: +d3-format@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.2.1.tgz#4e19ecdb081a341dafaf5f555ee956bcfdbf167f" + integrity sha512-U4zRVLDXW61bmqoo+OJ/V687e1T5nVd3TAKAJKgtpZ/P1JsMgyod0y9br+mlQOryTAACdiXI3wCjuERHFNp91w== + +d3-geo@^1.10.0, d3-geo@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.11.3.tgz#5bb08388f45e4b281491faa72d3abd43215dbd1c" integrity sha512-n30yN9qSKREvV2fxcrhmHUdXP9TNH7ZZj3C/qnaoU0cVf/Ea85+yT7HY7i8ySPwkwjCNYtmKqQFTvLFngfkItQ== dependencies: d3-array "1" -d3-hexbin@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/d3-hexbin/-/d3-hexbin-0.2.2.tgz#9c5837dacfd471ab05337a9e91ef10bfc4f98831" - integrity sha1-nFg32s/UcasFM3qeke8Qv8T5iDE= +d3-geo@^1.6.4: + version "1.9.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.9.1.tgz#157e3b0f917379d0f73bebfff3be537f49fa7356" + integrity sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA== + dependencies: + d3-array "1" + +d3-hierarchy@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz#a1c845c42f84a206bcf1c01c01098ea4ddaa7a26" + integrity sha1-ochFxC+Eoga88cAcAQmOpN2qeiY= -d3-hierarchy@^1.1.4, d3-hierarchy@^1.1.8: +d3-hierarchy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz#7a6317bd3ed24e324641b6f1e76e978836b008cc" integrity sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w== -d3-interpolate@1, d3-interpolate@^1.1.4, d3-interpolate@^1.3.2: +d3-interpolate@1, d3-interpolate@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.3.2.tgz#417d3ebdeb4bc4efcc8fd4361c55e4040211fd68" integrity sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w== dependencies: d3-color "1" +d3-interpolate@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6" + integrity sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A== + dependencies: + d3-color "1" + d3-path@1, d3-path@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.7.tgz#8de7cd693a75ac0b5480d3abaccd94793e58aae8" @@ -8457,7 +9065,21 @@ d3-scale@^2.1.2, d3-scale@^2.2.2: d3-time "1" d3-time-format "2" -d3-shape@^1.1.0, d3-shape@^1.2.0, d3-shape@^1.2.2, d3-shape@^1.3.4: +d3-shape@^1.1.0, d3-shape@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777" + integrity sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c= + dependencies: + d3-path "1" + +d3-shape@^1.2.2: + version "1.3.4" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.4.tgz#358e76014645321eecc7c364e188f8ae3d2a07d4" + integrity sha512-izaz4fOpOnY3CD17hkZWNxbaN70sIGagLR/5jb6RS96Y+6VqX+q1BQf1av6QSBRdfULi3Gb8Js4CzG4+KAPjMg== + dependencies: + d3-path "1" + +d3-shape@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.5.tgz#e81aea5940f59f0a79cfccac012232a8987c6033" integrity sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg== @@ -8482,9 +9104,9 @@ d3-timer@1, d3-timer@^1.0.9: integrity sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg== d3-voronoi@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" - integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== + version "1.1.2" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c" + integrity sha1-Fodmfo8TotFYyAwUgMWinLDYlzw= d3@3.5.6: version "3.5.6" @@ -8520,13 +9142,13 @@ dashify@^0.1.0: resolved "https://registry.yarnpkg.com/dashify/-/dashify-0.1.0.tgz#107daf9cca5e326e30a8b39ffa5048b6684922ea" integrity sha1-EH2vnMpeMm4wqLOf+lBItmhJIuo= -data-urls@^1.0.0, data-urls@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== +data-urls@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.1.tgz#d416ac3896918f29ca84d81085bc3705834da579" + integrity sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg== dependencies: abab "^2.0.0" - whatwg-mimetype "^2.2.0" + whatwg-mimetype "^2.1.0" whatwg-url "^7.0.0" dataloader@^1.4.0: @@ -8535,9 +9157,9 @@ dataloader@^1.4.0: integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== date-fns@^1.27.2: - version "1.30.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + version "1.29.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" + integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== date-format@^1.2.0: version "1.2.0" @@ -8590,7 +9212,7 @@ debug@2.6.0: dependencies: ms "0.7.2" -debug@2.6.9, debug@^2.0.0, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.0.0, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -8604,7 +9226,7 @@ debug@3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" -debug@3.X, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: +debug@3.X, debug@^3.1.0, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -8635,6 +9257,13 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== + dependencies: + xregexp "4.0.0" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -8761,12 +9390,12 @@ deepmerge@3.2.0: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.2.0.tgz#58ef463a57c08d376547f8869fdc5bcee957f44e" integrity sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow== -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== dependencies: - execa "^1.0.0" + execa "^0.10.0" ip-regex "^2.1.0" default-require-extensions@^2.0.0: @@ -8817,7 +9446,7 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^2.2.2: +del@^2.0.2, del@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= @@ -8842,19 +9471,6 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" -del@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -8884,7 +9500,7 @@ depd@1.1.1: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= -depd@~1.1.2: +depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= @@ -8949,10 +9565,10 @@ detect-newline@2.X, detect-newline@^2.1.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= -detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== +detect-node@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + integrity sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc= detect-port-alt@1.1.6: version "1.1.6" @@ -8962,18 +9578,18 @@ detect-port-alt@1.1.6: address "^1.0.1" debug "^2.6.0" -detect-port@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.2.3.tgz#15bf49820d02deb84bfee0a74876b32d791bf610" - integrity sha512-IDbrX6PxqnYy8jV4wSHBaJlErYKTJvW8OQb9F7xivl1iQLqiUYHGa+nZ61Do6+N5uuOn/pReXKNqI9rUn04vug== +detect-port@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.2.2.tgz#57a44533632d8bc74ad255676866ca43f96c7469" + integrity sha512-06H99JMCwgbYbA+codm97aBhFLAjABftetp+v+Z88Pvvlkawp2N+1bP/9J24+mihrvk9yBvUYTyIj3NixG1CsA== dependencies: address "^1.0.1" debug "^2.6.0" detect-port@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + version "1.2.3" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.2.3.tgz#15bf49820d02deb84bfee0a74876b32d791bf610" + integrity sha512-IDbrX6PxqnYy8jV4wSHBaJlErYKTJvW8OQb9F7xivl1iQLqiUYHGa+nZ61Do6+N5uuOn/pReXKNqI9rUn04vug== dependencies: address "^1.0.1" debug "^2.6.0" @@ -9007,10 +9623,10 @@ diagnostics@^1.1.1: enabled "1.0.x" kuler "1.0.x" -diff-sequences@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" - integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== +diff-sequences@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.0.0.tgz#cdf8e27ed20d8b8d3caccb4e0c0d8fe31a173013" + integrity sha512-46OkIuVGBBnrC0soO/4LHu5LHGHx0uhP65OVz8XOrAJpqiCB2aVIuESvjI1F9oqebuvY8lekS1pt6TN7vt7qsw== diff@1.4.0: version "1.4.0" @@ -9027,21 +9643,26 @@ diff@^2.1.2: resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" integrity sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k= -diff@^3.2.0, diff@^3.5.0: +diff@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + integrity sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA== + +diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + integrity sha1-tYNXOScM/ias9jIJn97SoH8gnl4= dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@2.0.0: +dir-glob@2.0.0, dir-glob@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== @@ -9049,13 +9670,6 @@ dir-glob@2.0.0: arrify "^1.0.1" path-type "^3.0.0" -dir-glob@^2.0.0, dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" - discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" @@ -9108,14 +9722,19 @@ doctypes@^1.1.0: resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= -dom-converter@^0.2: +dom-converter@~0.2: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" -"dom-helpers@^2.4.0 || ^3.0.0", dom-helpers@^3.4.0: +"dom-helpers@^2.4.0 || ^3.0.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6" + integrity sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg== + +dom-helpers@^3.3.1: version "3.4.0" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== @@ -9132,7 +9751,7 @@ dom-serialize@^2.2.0: extend "^3.0.0" void-elements "^2.0.0" -dom-serializer@0, dom-serializer@~0.1.0, dom-serializer@~0.1.1: +dom-serializer@0, dom-serializer@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== @@ -9140,15 +9759,25 @@ dom-serializer@0, dom-serializer@~0.1.0, dom-serializer@~0.1.1: domelementtype "^1.3.0" entities "^1.1.1" -dom-testing-library@^3.19.0: - version "3.19.4" - resolved "https://registry.yarnpkg.com/dom-testing-library/-/dom-testing-library-3.19.4.tgz#f5b737f59ee9749a4568fa353f1f59be97c888c3" - integrity sha512-GJOx8CLpnkvM3takILOsld/itUUc9+7Qh6caN1Spj6+9jIgNPY36fsvoH7sEgYokC0lBRdttO7G7fIFYCXlmcA== +dom-testing-library@^3.13.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/dom-testing-library/-/dom-testing-library-3.17.1.tgz#3291bc3cf68c555ba5e663697ee77d604aaa122b" + integrity sha512-SbkaRfQvuLjnv+xFgSo/cmKoN9tjBL6Rh1f3nQH9jnjUe5q+keRwacYSi3uSpcB4D1K768iavCayKH3ZN9ea+g== + dependencies: + "@babel/runtime" "^7.3.4" + "@sheerun/mutationobserver-shim" "^0.3.2" + pretty-format "^24.0.0" + wait-for-expect "^1.1.0" + +dom-testing-library@^3.18.2: + version "3.18.2" + resolved "https://registry.yarnpkg.com/dom-testing-library/-/dom-testing-library-3.18.2.tgz#07d65166743ad3299b7bee5b488e9622c31241bc" + integrity sha512-+nYUgGhHarrCY8kLVmyHlgM+IGwBXXrYsWIJB6vpAx2ne9WFgKfwMGcOkkTKQhuAro0sP6RIuRGfm5NF3+ccmQ== dependencies: - "@babel/runtime" "^7.4.3" + "@babel/runtime" "^7.3.4" "@sheerun/mutationobserver-shim" "^0.3.2" - pretty-format "^24.7.0" - wait-for-expect "^1.1.1" + pretty-format "^24.5.0" + wait-for-expect "^1.1.0" dom-walk@^0.1.0: version "0.1.1" @@ -9165,6 +9794,11 @@ domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== +domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0" + integrity sha512-WpwuBlZ2lQRFa4H/4w49deb9rJLot9KmqrKKjMc9qBl7CID+DdC2swoa34ccRl+anL2B6bLp6TjFdIdnzekMBQ== + domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" @@ -9172,6 +9806,13 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +domhandler@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" + integrity sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ= + dependencies: + domelementtype "1" + domhandler@^2.3.0, domhandler@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" @@ -9179,6 +9820,13 @@ domhandler@^2.3.0, domhandler@^2.4.2: dependencies: domelementtype "1" +domutils@1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" + integrity sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU= + dependencies: + domelementtype "1" + domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" @@ -9233,7 +9881,12 @@ dotenv@2.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" integrity sha1-vXWcNXqqcDZeAclrewvsCKbg2Uk= -dotenv@^6.0.0, dotenv@^6.2.0: +dotenv@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.1.0.tgz#9853b6ca98292acb7dec67a95018fa40bccff42c" + integrity sha512-/veDn2ztgRlB7gKmE3i9f6CmDIyXAy6d5nBq+whO9SLX+Zs1sXEgFLPi+aSuWqUuusMfbi84fT8j34fs1HaYUw== + +dotenv@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== @@ -9247,9 +9900,9 @@ downgrade-root@^1.0.0: is-root "^1.0.0" download-git-repo@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/download-git-repo/-/download-git-repo-1.1.0.tgz#7dc88a82ced064b1372a0002f8a3aebf10eb1d3c" - integrity sha512-yXcCvhkPKmq5M2cQXss6Qbig+LZnzRIT40XCYm/QCRnJaPG867StB1qnsBLxOGrPH1YEIRWW2gJq7LLMyw+NmA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/download-git-repo/-/download-git-repo-1.0.2.tgz#0b93a62057e41e2f21b1a06c95e7b26362b108ff" + integrity sha512-PwAUr0/w74AGB7bukOycXyLnDlt9Lfb3JzsliAWyZCHa/TvbuMYQvH1er2DWXHE4EuI/NjAzRXw+89Waynapgw== dependencies: download "^5.0.3" git-clone "^0.1.0" @@ -9281,14 +9934,14 @@ dragula@3.7.0: contra "1.9.1" crossvent "1.5.4" -duplexer2@0.0.2: +duplexer2@0.0.2, duplexer2@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= dependencies: readable-stream "~1.1.9" -duplexer2@^0.1.4, duplexer2@~0.1.4: +duplexer2@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= @@ -9305,10 +9958,20 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= -duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.5.3, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== +duplexify@^3.2.0, duplexify@^3.5.3: + version "3.5.4" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" + integrity sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + integrity sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ== dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -9332,9 +9995,9 @@ eachr@^3.2.0: typechecker "^4.3.0" earcut@^2.0.0, earcut@^2.1.3: - version "2.1.5" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.1.5.tgz#829280a9a3a0f5fee0529f0a47c3e4eff09b21e4" - integrity sha512-QFWC7ywTVLtvRAJTVp8ugsuuGQ5mVqNmJ1cRYeLrSHgP3nycr2RHTJob9OtM0v8ujuoKN0NY1a93J/omeTL1PA== + version "2.1.3" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.1.3.tgz#ca579545f351941af7c3d0df49c9f7d34af99b0c" + integrity sha512-AxdCdWUk1zzK/NuZ7e1ljj6IGC+VAdC3Qb7QQDsXpfNrc5IM8tL9nNXUmEGE6jRHTfZ10zhzRhtDmWVsR5pd3A== ecc-jsbn@~0.1.1: version "0.1.2" @@ -9344,27 +10007,19 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== +ecdsa-sig-formatter@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" + integrity sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM= dependencies: safe-buffer "^5.0.1" -editions@^1.1.1: +editions@^1.1.1, editions@^1.3.3, editions@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== -editions@^2.1.0, editions@^2.1.2, editions@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/editions/-/editions-2.1.3.tgz#727ccf3ec2c7b12dcc652c71000f16c4824d6f7d" - integrity sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw== - dependencies: - errlop "^1.1.1" - semver "^5.6.0" - -editorconfig@^0.15.3: +editorconfig@^0.15.2: version "0.15.3" resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== @@ -9379,7 +10034,12 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^2.2.4, ejs@^2.3.1, ejs@^2.6.1: +ejs@^2.2.4, ejs@^2.3.1: + version "2.5.7" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" + integrity sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo= + +ejs@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== @@ -9389,7 +10049,16 @@ elasticsearch-browser@^15.5.0: resolved "https://registry.yarnpkg.com/elasticsearch-browser/-/elasticsearch-browser-15.5.0.tgz#84c0b441063635edad089dadf01966d93f5be46c" integrity sha512-BqnbbUs2sO+2X6ePgUUJxDUy+CK4Xx9t9VlxptMbieaP4I0K8tpoKb3o6rY1j8idZi6chWrlYQiif/g+GN6B4g== -elasticsearch@^15.2.0, elasticsearch@^15.5.0: +elasticsearch@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.2.0.tgz#234362b5aa743d9c0a925566569ea7813b8f2569" + integrity sha512-jOFcBoEh3Sn3gjUTozInODZTLriJtfppAUC7jnQCUE+OUj8o7GoAyC+L4h/L3ZxmXNFbQCunqVR+nmSofHdo9A== + dependencies: + agentkeepalive "^3.4.1" + chalk "^1.0.0" + lodash "^4.17.10" + +elasticsearch@^15.5.0: version "15.5.0" resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.5.0.tgz#62d9f238cf9e10b81c50a2303aa470c1f7da6b37" integrity sha512-ZGKKaDkOFAap61ObBNkAxhYXCcAbRfkI4NVoSeLGnTD6/cItvY2j9LII/VV8/zclGe1x5m6DsVp47E4ze4aAeQ== @@ -9398,27 +10067,37 @@ elasticsearch@^15.2.0, elasticsearch@^15.5.0: chalk "^1.0.0" lodash "^4.17.10" -electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.127: - version "1.3.130" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.130.tgz#27f84e823bd80a5090e2baeca4fefbaf476cf7af" - integrity sha512-UY2DI+gsnqGtQJqO8wXN0DnpJY+29FwJafACj0h18ZShn5besKnrRq6+lXWUbKzdxw92QQcnTqRLgNByOKXcUg== +electron-to-chromium@^1.3.103: + version "1.3.108" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.108.tgz#2e79a6fcaa4b3e7c75abf871505bda8e268c910e" + integrity sha512-/QI4hMpAh48a1Sea6PALGv+kuVne9A2EWGd8HrWHMdYhIzGtbhVVHh6heL5fAzGaDnZuPyrlWJRl8WPm4RyiQQ== + +electron-to-chromium@^1.3.113: + version "1.3.114" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.114.tgz#1862887589db93f832057c81878c56c404960aa6" + integrity sha512-EQEFDVId4dqTrV9wvDmu/Po8Re9nN1sJm9KZECKRf3HC39DUYAEHQ8s7s9HsnhO9iFwl/Gpke9dvm6VwQTss5w== + +electron-to-chromium@^1.3.116: + version "1.3.119" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.119.tgz#9a7770da667252aeb81f667853f67c2b26e00197" + integrity sha512-3mtqcAWa4HgG+Djh/oNXlPH0cOH6MmtwxN1nHSaReb9P0Vn51qYPqYwLeoSuAX9loU1wrOBhFbiX3CkeIxPfgg== elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= -element-resize-detector@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.1.15.tgz#48eba1a2eaa26969a4c998d972171128c971d8d2" - integrity sha512-16/5avDegXlUxytGgaumhjyQoM6hpp5j3+L79sYq5hlXfTNRy5WMMuTVWkZU3egp/CokCmTmvf18P3KeB57Iog== +element-resize-detector@^1.1.12: + version "1.1.14" + resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.1.14.tgz#af064a0a618a820ad570a95c5eec5b77be0128c1" + integrity sha1-rwZKCmGKggrVcKlcXuxbd74BKME= dependencies: batch-processor "^1.0.0" elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + integrity sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8= dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -9544,7 +10223,7 @@ enhanced-resolve@^4.1.0: enhanced-resolve@~0.9.0: version "0.9.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" integrity sha1-TW5omzcl+GCQknzMhs2fFjW4ni4= dependencies: graceful-fs "^4.1.2" @@ -9572,28 +10251,27 @@ env-variable@0.0.x: integrity sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA== enzyme-adapter-react-16@^1.9.0: - version "1.12.1" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.12.1.tgz#6a2d74c80559d35ac0a91ca162fa45f4186290cf" - integrity sha512-GB61gvY97XvrA6qljExGY+lgI6BBwz+ASLaRKct9VQ3ozu0EraqcNn3CcrUckSGIqFGa1+CxO5gj5is5t3lwrw== + version "1.9.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.9.1.tgz#6d49a3a31c3a0fccf527610f31b837e0f307128a" + integrity sha512-Egzogv1y77DUxdnq/CyHxLHaNxmSSKDDSDNNB/EiAXCZVFXdFibaNy2uUuRQ1n24T2m6KH/1Rw16XDRq+1yVEg== dependencies: - enzyme-adapter-utils "^1.11.0" + enzyme-adapter-utils "^1.10.0" + function.prototype.name "^1.1.0" object.assign "^4.1.0" object.values "^1.1.0" - prop-types "^15.7.2" - react-is "^16.8.6" + prop-types "^15.6.2" + react-is "^16.7.0" react-test-renderer "^16.0.0-0" - semver "^5.6.0" -enzyme-adapter-utils@^1.10.0, enzyme-adapter-utils@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.11.0.tgz#6ffff782b1b57dd46c72a845a91fc4103956a117" - integrity sha512-0VZeoE9MNx+QjTfsjmO1Mo+lMfunucYB4wt5ficU85WB/LoetTJrbuujmHP3PJx6pSoaAuLA+Mq877x4LoxdNg== +enzyme-adapter-utils@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.10.0.tgz#5836169f68b9e8733cb5b69cad5da2a49e34f550" + integrity sha512-VnIXJDYVTzKGbdW+lgK8MQmYHJquTQZiGzu/AseCZ7eHtOMAj4Rtvk8ZRopodkfPves0EXaHkXBDkVhPa3t0jA== dependencies: - airbnb-prop-types "^2.12.0" function.prototype.name "^1.1.0" object.assign "^4.1.0" object.fromentries "^2.0.0" - prop-types "^15.7.2" + prop-types "^15.6.2" semver "^5.6.0" enzyme-to-json@^3.3.4: @@ -9604,19 +10282,17 @@ enzyme-to-json@^3.3.4: lodash "^4.17.4" enzyme@^3.7.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.9.0.tgz#2b491f06ca966eb56b6510068c7894a7e0be3909" - integrity sha512-JqxI2BRFHbmiP7/UFqvsjxTirWoM1HfeaJrmVSZ9a1EADKkZgdPcAuISPMpoUiHlac9J4dYt81MC5BBIrbJGMg== + version "3.8.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.8.0.tgz#646d2d5d0798cb98fdec39afcee8a53237b47ad5" + integrity sha512-bfsWo5nHyZm1O1vnIsbwdfhU989jk+squU9NKvB+Puwo5j6/Wg9pN5CO0YJelm98Dao3NPjkDZk+vvgwpMwYxw== dependencies: array.prototype.flat "^1.2.1" cheerio "^1.0.0-rc.2" function.prototype.name "^1.1.0" has "^1.0.3" - html-element-map "^1.0.0" is-boolean-object "^1.0.0" is-callable "^1.1.4" is-number-object "^1.0.3" - is-regex "^1.0.4" is-string "^1.0.4" is-subset "^0.1.1" lodash.escape "^4.0.1" @@ -9635,13 +10311,6 @@ err-code@^0.1.0: resolved "https://registry.yarnpkg.com/err-code/-/err-code-0.1.2.tgz#122a92b3342b9899da02b5ac994d30f95d4763ee" integrity sha1-EiqSszQrmJnaArWsmU0w+V1HY+4= -errlop@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.1.1.tgz#d9ae4c76c3e64956c5d79e6e035d6343bfd62250" - integrity sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw== - dependencies: - editions "^2.1.2" - errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -9650,9 +10319,9 @@ errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: prr "~1.0.1" error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= dependencies: is-arrayish "^0.2.1" @@ -9664,7 +10333,7 @@ error@7.0.2, error@^7.0.0, error@^7.0.2: string-template "~0.2.1" xtend "~4.0.0" -es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0, es-abstract@^1.9.0: +es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.5.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -9676,7 +10345,29 @@ es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13 is-regex "^1.0.4" object-keys "^1.0.12" -es-to-primitive@^1.2.0: +es-abstract@^1.4.3, es-abstract@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" + integrity sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ== + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1, es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== @@ -9685,19 +10376,27 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.50" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" - integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.40" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.40.tgz#ab3d2179b943008c5e9ef241beb25ef41424c774" + integrity sha512-S9Fh3oya5OOvYSNGvPZJ+vyrs6VYpe1IXPowVe3N1OhaiwVaGlwfn3Zf5P5klYcWOA0toIwYQW8XEv/QqhdHvQ== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + +es5-ext@^0.10.45, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" + integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" - next-tick "^1.0.0" + next-tick "1" -es5-shim@^4.5.13: - version "4.5.13" - resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.13.tgz#5d88062de049f8969f83783f4a4884395f21d28b" - integrity sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw== +es5-shim@^4.5.10: + version "4.5.12" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.12.tgz#508c13dda1c87dd3df1b50e69e7b96b82149b649" + integrity sha512-MjoCAHE6P2Dirme70Cxd9i2Ng8rhXiaVSsxDWdSwimfLERJL/ypR2ed2rTYkeeYrMk8gq281dzKLiGcdrmc8qg== es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" @@ -9721,9 +10420,9 @@ es6-map@^0.1.3: event-emitter "~0.3.5" es6-promise@^4.0.3, es6-promise@~4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" - integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== es6-promisify@^5.0.0: version "5.0.0" @@ -9743,10 +10442,10 @@ es6-set@~0.1.5: es6-symbol "3.1.1" event-emitter "~0.3.5" -es6-shim@^0.35.5: - version "0.35.5" - resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.5.tgz#46f59dc0a84a1c5029e8ff1166ca0a902077a9ab" - integrity sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg== +es6-shim@^0.35.3: + version "0.35.4" + resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.4.tgz#8d5a4109756383d3f0323421089c423acf8378f1" + integrity sha512-oJidbXjN/VWXZJs41E9JEqWzcFbjt43JupimIoVX82Thzt5qy1CiYezdhRmWkj3KOuwJ106IG/ZZrcFC6fgIUQ== es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" @@ -9801,10 +10500,10 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.11.0, escodegen@^1.8.1, escodegen@^1.9.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" - integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== +escodegen@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" + integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -9813,6 +10512,28 @@ escodegen@^1.11.0, escodegen@^1.8.1, escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" +escodegen@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + integrity sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.5.6" + +escodegen@~0.0.24: + version "0.0.28" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-0.0.28.tgz#0e4ff1715f328775d6cab51ac44a406cd7abffd3" + integrity sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M= + dependencies: + esprima "~1.0.2" + estraverse "~1.3.0" + optionalDependencies: + source-map ">= 0.1.2" + escodegen@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.2.0.tgz#09de7967791cc958b7f89a2ddb6d23451af327e1" @@ -9824,17 +10545,16 @@ escodegen@~1.2.0: optionalDependencies: source-map "~0.1.30" -escodegen@~1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" - integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== +escodegen@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.3.3.tgz#f024016f5a88e046fd12005055e939802e6c5f23" + integrity sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM= dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" + esprima "~1.1.1" + estraverse "~1.5.0" + esutils "~1.0.0" optionalDependencies: - source-map "~0.6.1" + source-map "~0.1.33" escope@^3.6.0: version "3.6.0" @@ -9847,9 +10567,9 @@ escope@^3.6.0: estraverse "^4.1.1" eslint-config-prettier@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.2.0.tgz#70b946b629cd0e3e98233fd9ecde4cb9778de96c" - integrity sha512-y0uWc/FRfrHhpPZCYflWC8aE0KRJRY04rdZVfl8cL3sEZmOYyaBdhdlQPjKZBnuRMyLVK+JUZr7HaZFClQiH4w== + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.1.0.tgz#181364895899fff9fd3605fecb5c4f20e7d5f395" + integrity sha512-zILwX9/Ocz4SV2vX7ox85AsrAgXV3f2o2gpIicdMIOra48WYqgUnWNH/cR/iHtmD2Vb3dLSC3LiEJnS05Gkw7w== dependencies: get-stdin "^6.0.0" @@ -9877,10 +10597,10 @@ eslint-import-resolver-webpack@^0.10.1: resolve "^1.4.0" semver "^5.3.0" -eslint-module-utils@^2.3.0, eslint-module-utils@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" - integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== +eslint-module-utils@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49" + integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w== dependencies: debug "^2.6.8" pkg-dir "^2.0.0" @@ -9900,26 +10620,25 @@ eslint-plugin-ban@^1.2.0: requireindex "~1.2.0" eslint-plugin-import@^2.16.0: - version "2.17.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz#d227d5c6dc67eca71eb590d2bb62fb38d86e9fcb" - integrity sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g== + version "2.16.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz#97ac3e75d0791c4fac0e15ef388510217be7f66f" + integrity sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A== dependencies: - array-includes "^3.0.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.0" + eslint-module-utils "^2.3.0" has "^1.0.3" lodash "^4.17.11" minimatch "^3.0.4" read-pkg-up "^2.0.0" - resolve "^1.10.0" + resolve "^1.9.0" eslint-plugin-jest@^22.4.1: - version "22.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.5.1.tgz#a31dfe9f9513c6af7c17ece4c65535a1370f060b" - integrity sha512-c3WjZR/HBoi4GedJRwo2OGHa8Pzo1EbSVwQ2HFzJ+4t2OoYM7Alx646EH/aaxZ+9eGcPiq0FT0UGkRuFFx2FHg== + version "22.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz#a5fd6f7a2a41388d16f527073b778013c5189a9c" + integrity sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg== eslint-plugin-jsx-a11y@^6.2.1: version "6.2.1" @@ -9965,17 +10684,17 @@ eslint-plugin-react-hooks@^1.6.0: integrity sha512-lHBVRIaz5ibnIgNG07JNiAuBUeKhEf8l4etNx5vfAEwqQ5tcuK3jV9yjmopPgQDagQb7HwIuQVsE3IVcGrRnag== eslint-plugin-react@^7.12.4: - version "7.13.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.13.0.tgz#bc13fd7101de67996ea51b33873cd9dc2b7e5758" - integrity sha512-uA5LrHylu8lW/eAH3bEQe9YdzpPaFd9yAJTwTi/i/BKTD7j6aQMKVAdGM/ML72zD6womuSK7EiGtMKuK06lWjQ== + version "7.12.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz#b1ecf26479d61aee650da612e425c53a99f48c8c" + integrity sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ== dependencies: array-includes "^3.0.3" doctrine "^2.1.0" has "^1.0.3" - jsx-ast-utils "^2.1.0" + jsx-ast-utils "^2.0.1" object.fromentries "^2.0.0" - prop-types "^15.7.2" - resolve "^1.10.1" + prop-types "^15.6.2" + resolve "^1.9.0" eslint-rule-composer@^0.3.0: version "0.3.0" @@ -9990,7 +10709,15 @@ eslint-scope@3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^4.0.0, eslint-scope@^4.0.3: +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -10090,9 +10817,9 @@ eslint@^5.16.0: text-table "^0.2.0" esm@^3.0.84: - version "3.2.22" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.22.tgz#5062c2e22fee3ccfee4e8f20da768330da90d6e3" - integrity sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA== + version "3.2.3" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.3.tgz#a5453468d030bdc5ec539f5ce5d9e95731f956d2" + integrity sha512-qkokqXI9pblukGvc0gG1FHMwKWjriIyCgDKbpzgtlis5tQ21dIFPL5s7ffcSVdE+k9Zw7R5ZC/dl0z/Ib5m1Pw== espree@^3.1.6: version "3.5.4" @@ -10121,21 +10848,31 @@ esprima@^3.1.3, esprima@~3.1.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esprima@^4.0.0, esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + integrity sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== -esprima@~1.0.4: +esprima@~1.0.2, esprima@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0= +esprima@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.1.1.tgz#5b6f1547f4d102e670e140c509be6771d6aeb549" + integrity sha1-W28VR/TRAuZw4UDFCb5ncdautUk= + esprima@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.2.0.tgz#4292c1d68e4173d815fa2290dc7afc96d81fcd83" integrity sha1-QpLB1o5Bc9gV+iKQ3Hr8ltgfzYM= +esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" @@ -10160,6 +10897,11 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estraverse@~1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.3.2.tgz#37c2b893ef13d723f276d878d60d8535152a6c42" + integrity sha1-N8K4k+8T1yPydth41g2FNRUqbEI= + estraverse@~1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" @@ -10198,21 +10940,21 @@ eventemitter2@~0.4.13: resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas= +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= + eventemitter3@^3.0.0, eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== -events@^1.0.2: +events@^1.0.0, events@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= -events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== - eventsource@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" @@ -10228,10 +10970,12 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + integrity sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg== + dependencies: + merge "^1.1.3" execa@^0.1.1: version "0.1.1" @@ -10242,6 +10986,19 @@ execa@^0.1.1: object-assign "^4.0.1" strip-eof "^1.0.0" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" @@ -10329,9 +11086,9 @@ exit-hook@^1.0.0: integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= exit-hook@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.0.tgz#f5502f92179018e867f2d8ee4428392da7f3894e" - integrity sha512-YFH+2oGdldRH5GqGpnaiKbBxWHMmuXHmKTMtUC58kWSOrnTf95rKITVSFTTtas14DWvWpih429+ffAvFetPwNA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.1.0.tgz#2be08d8d01220050878577bfa017e104a6c3bcf3" + integrity sha512-JCSm9Znc/KW6hoKYHOIqLxM2Z88+AQcabo07rJHZSyXcQIq6HsXkSWRVZRp13RFkGVIDcz1DRIbKR5cnU1uzCA== exit@^0.1.2, exit@~0.1.1: version "0.1.2" @@ -10389,17 +11146,21 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -expect@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.7.1.tgz#d91defbab4e627470a152feaf35b3c31aa1c7c14" - integrity sha512-mGfvMTPduksV3xoI0xur56pQsg2vJjNf5+a+bXOjqCkiCBbmCayrBbHS/75y9K430cfqyocPr2ZjiNiRx4SRKw== +expect.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/expect.js/-/expect.js-0.2.0.tgz#1028533d2c1c363f74a6796ff57ec0520ded2be1" + integrity sha1-EChTPSwcNj90pnlv9X7AUg3tK+E= + +expect@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.1.0.tgz#88e73301c4c785cde5f16da130ab407bdaf8c0f2" + integrity sha512-lVcAPhaYkQcIyMS+F8RVwzbm1jro20IG8OkvxQ6f1JfqhVZyyudCwYogQ7wnktlf14iF3ii7ArIUO/mqvrW9Gw== dependencies: - "@jest/types" "^24.7.0" ansi-styles "^3.2.0" - jest-get-type "^24.3.0" - jest-matcher-utils "^24.7.0" - jest-message-util "^24.7.1" - jest-regex-util "^24.3.0" + jest-get-type "^24.0.0" + jest-matcher-utils "^24.0.0" + jest-message-util "^24.0.0" + jest-regex-util "^24.0.0" expiry-js@0.1.7: version "0.1.7" @@ -10411,7 +11172,7 @@ expose-loader@^0.7.5: resolved "https://registry.yarnpkg.com/expose-loader/-/expose-loader-0.7.5.tgz#e29ea2d9aeeed3254a3faa1b35f502db9f9c3f6f" integrity sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw== -express@^4.16.3, express@^4.16.4: +express@^4.16.2, express@^4.16.3: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== @@ -10469,7 +11230,12 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.0, extend@~3.0.2: +extend@^3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= + +extend@~3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -10484,6 +11250,15 @@ external-editor@^1.1.0: tmp "^0.0.29" external-editor@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + integrity sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +external-editor@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== @@ -10492,7 +11267,16 @@ external-editor@^2.0.4: iconv-lite "^0.4.17" tmp "^0.0.33" -external-editor@^3.0.0, external-editor@^3.0.3: +external-editor@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.0.tgz#dc35c48c6f98a30ca27a20e9687d7f3c77704bb6" + integrity sha512-mpkfj0FEdxrIhOC04zk85X7StNtr0yXnG7zCb+8ikO8OJi2jsHh5YGoknNTyXgsbHOf1WOOcVU3kPFWT2WgCkQ== + dependencies: + chardet "^0.5.0" + iconv-lite "^0.4.22" + tmp "^0.0.33" + +external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== @@ -10508,6 +11292,20 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extglob@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.3.tgz#55e019d0c95bf873949c737b7e5172dba84ebb29" + integrity sha512-AyptZexgu7qppEPq59DtN/XJGZDrLcVxSHai+4hdgMMS9EpF4GBvygcWWApno8lL9qSjVpYt7Raao28qzJX1ww== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -10577,19 +11375,18 @@ falafel@^2.1.0: object-keys "^1.0.6" fancy-log@^1.1.0, fancy-log@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + version "1.3.2" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + integrity sha1-9BEl49hPLn2JpD0G2VjI94vha+E= dependencies: ansi-gray "^0.1.1" color-support "^1.1.3" - parse-node-version "^1.0.0" time-stamp "^1.0.0" fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + integrity sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8= fast-deep-equal@^2.0.1: version "2.0.1" @@ -10601,22 +11398,20 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^2.0.2, fast-glob@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" - integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== +fast-glob@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.0.4.tgz#a4b9f49e36175f5ef1a3456f580226a6e7abcc9e" + integrity sha512-JAh0y6ScChRmATdQIsN416LK+bAFiGczD9A4zWBMPcTgkpj9SEOC7DEzpfbqoDKzieZw40dIAKx3PofGxukFqw== dependencies: "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" + glob-parent "3.1.0" + merge2 "1.2.1" + micromatch "3.1.5" fast-json-patch@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-2.1.0.tgz#e348c330a5b2481b14f5fffd707aebfef8b7bef6" - integrity sha512-PipOsAKamRw7+CXtKiieehyjUeDVPJ5J7b2kdJYerEf6TSUQoD2ijpVyZ88KQm5YXziff4h762bz3+vzf56khg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-2.0.7.tgz#55864b08b1e50381d2f37fd472bb2e18fe54a733" + integrity sha512-DQeoEyPYxdTtfmB3yDlxkLyKTdbJ6ABfFGcMynDqjvGhPYLto/pZyb/dG2Nyd/n9CArjEWN9ZST++AFmgzgbGw== dependencies: deep-equal "^1.0.1" @@ -10636,16 +11431,9 @@ fast-safe-stringify@^2.0.4: integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg== fastparse@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" - integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== - -fault@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.2.tgz#c3d0fec202f172a3a4d414042ad2bb5e2a3ffbaa" - integrity sha512-o2eo/X2syzzERAtN5LcGbiVQ0WwZSlN3qLtadwAz3X8Bu+XWD16dja/KMsjZLiQr+BLGPDnHGkc4yUJf1Xpkpw== - dependencies: - format "^0.2.2" + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + integrity sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg= faye-websocket@^0.10.0, faye-websocket@~0.10.0: version "0.10.0" @@ -10668,10 +11456,23 @@ fb-watchman@2.0.0, fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@^0.8.0, fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.9: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= +fbjs@^0.8.0, fbjs@^0.8.1, fbjs@^0.8.16: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +fbjs@^0.8.4, fbjs@^0.8.5, fbjs@^0.8.9: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + integrity sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s= dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -10679,7 +11480,7 @@ fbjs@^0.8.0, fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.9: object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.18" + ua-parser-js "^0.7.9" fd-slicer@~1.0.1: version "1.0.1" @@ -10710,7 +11511,7 @@ fetch-mock@7.3.0: path-to-regexp "^2.2.1" whatwg-url "^6.5.0" -figgy-pudding@^3.5.1: +figgy-pudding@^3.1.0, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== @@ -10789,9 +11590,9 @@ file-system-cache@^1.0.5: ramda "^0.21.0" file-type@^10.9.0: - version "10.11.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890" - integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw== + version "10.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.9.0.tgz#f6c12c7cb9e6b8aeefd6917555fd4f9eadf31891" + integrity sha512-9C5qtGR/fNibHC5gzuMmmgnjH3QDDLKMa8lYe9CiZVmAnI4aUaoMh40QyUPzzs0RYo837SOBKh7TYwle4G8E4w== file-type@^3.8.0: version "3.9.0" @@ -10824,9 +11625,9 @@ filename-reserved-regex@^2.0.0: integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= filenamify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" - integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== + version "2.0.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.0.0.tgz#bd162262c0b6e94bfbcdcf19a3bbb3764f785695" + integrity sha1-vRYiYsC26Uv7zc8Zo7uzdk94VpU= dependencies: filename-reserved-regex "^2.0.0" strip-outer "^1.0.0" @@ -10840,6 +11641,11 @@ fileset@^2.0.3: glob "^7.0.3" minimatch "^3.0.3" +filesize@3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa" + integrity sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw== + filesize@3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" @@ -10854,13 +11660,13 @@ fill-keys@^1.0.2: merge-descriptors "~1.0.0" fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^3.0.0" + randomatic "^1.1.3" repeat-element "^1.1.2" repeat-string "^1.5.2" @@ -10915,12 +11721,12 @@ find-cache-dir@^1.0.0: pkg-dir "^2.0.0" find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== dependencies: commondir "^1.0.1" - make-dir "^2.0.0" + make-dir "^1.0.0" pkg-dir "^3.0.0" find-index@^0.1.1: @@ -10981,9 +11787,9 @@ findup-sync@~0.3.0: glob "~5.0.0" fined@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" - integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + integrity sha1-s33IRLdqL15wgeiE98CuNE8VNHY= dependencies: expand-tilde "^2.0.2" is-plain-object "^2.0.3" @@ -11009,18 +11815,18 @@ first-chunk-stream@^2.0.0: readable-stream "^2.0.2" flagged-respawn@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" - integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + version "1.0.0" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" + integrity sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c= flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= dependencies: circular-json "^0.3.1" + del "^2.0.2" graceful-fs "^4.1.2" - rimraf "~2.6.2" write "^0.2.1" flat-cache@^2.0.1: @@ -11037,39 +11843,47 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== -flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" + inherits "^2.0.1" + readable-stream "^2.0.4" -focus-lock@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.3.tgz#ef0e82ebac0023f841039d60bf329725d6438028" - integrity sha512-EU6ePgEauhWrzJEN5RtG1d1ayrWXhEnfzTjnieHj+jG9tNHDEhKTAnCn1TN3gs9h6XWCDH6cpeX1VXY/lzLwZg== +flush-write-stream@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" + integrity sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +focus-lock@^0.5.2: + version "0.5.4" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.5.4.tgz#537644d61b9e90fd97075aa680b8add1de24e819" + integrity sha512-A9ngdb0NyI6UygBQ0eD+p8SpLWTkdEDn67I3EGUUcDUfxH694mLA/xBWwhWhoj/2YLtsv2EoQdAx9UOKs8d/ZQ== focus-trap-react@^3.0.4, focus-trap-react@^3.1.1: - version "3.1.4" - resolved "https://registry.yarnpkg.com/focus-trap-react/-/focus-trap-react-3.1.4.tgz#e95f4aece5c493be4d3653dfccd5036d11ad24d5" - integrity sha512-uqMKMg9Xlny0LKHW0HqA7ncLafW57SxgeedjE7/Xt+NB7sdOBUG4eD/9sMsq1O0+7zD3palpniTs2n0PDLc3uA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/focus-trap-react/-/focus-trap-react-3.1.2.tgz#4dd021ccd028bbd3321147d132cdf7585d6d1394" + integrity sha512-MoQmONoy9gRPyrC5DGezkcOMGgx7MtIOAQDHe098UtL2sA2vmucJwEmQisb+8LRXNYFHxuw5zJ1oLFeKu4Mteg== dependencies: focus-trap "^2.0.1" focus-trap@^2.0.1: - version "2.4.6" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-2.4.6.tgz#332b475b317cec6a4a129f5307ce7ebc0da90b40" - integrity sha512-vWZTPtBU6pBoyWZDRZJHkXsyP2ZCZBHE3DRVXnSVdQKH/mcDtu9S5Kz8CUDyIqpfZfLEyI9rjKJLnc4Y40BRBg== + version "2.4.5" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-2.4.5.tgz#91c9c9ffb907f8f4446d80202dda9c12c2853ddb" + integrity sha512-jkz7Dh6Pb4ox+z24GhVABDE7lFT19z7KVrpYGH5qqI6KK3Y2IcXhBx844W6ZXYahD+jOEUcGz49dLakXg2sjOQ== dependencies: tabbable "^1.0.3" -follow-redirects@^1.0.0, follow-redirects@^1.3.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" - integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== +follow-redirects@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.4.1.tgz#d8120f4518190f55aac65bb6fc7b85fcd666d6aa" + integrity sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg== dependencies: - debug "^3.2.6" + debug "^3.1.0" font-awesome@4.4.0: version "4.4.0" @@ -11077,9 +11891,9 @@ font-awesome@4.4.0: integrity sha1-n+Q/gs9ycmuty9snBEB6rayhfak= fontkit@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fontkit/-/fontkit-1.8.0.tgz#deb9351619e90ddc91707b6156a9f14c8ab11554" - integrity sha512-EFDRCca7khfQWYu1iFhsqeABpi87f03MBdkT93ZE6YhqCdMzb5Eojb6c4dlJikGv5liuhByyzA7ikpIPTSBWbQ== + version "1.7.7" + resolved "https://registry.yarnpkg.com/fontkit/-/fontkit-1.7.7.tgz#ebaf2d8f3fedf302ae3c64b4beeaddc247fcdbb1" + integrity sha1-668tjz/t8wKuPGS0vurdwkf827E= dependencies: babel-runtime "^6.11.6" brfs "^1.4.0" @@ -11093,12 +11907,12 @@ fontkit@^1.0.0: unicode-properties "^1.0.0" unicode-trie "^0.3.0" -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +for-each@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" + integrity sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ= dependencies: - is-callable "^1.1.3" + is-function "~1.0.0" for-in@^0.1.3: version "0.1.8" @@ -11144,7 +11958,7 @@ form-data-to-object@^0.2.0: resolved "https://registry.yarnpkg.com/form-data-to-object/-/form-data-to-object-0.2.0.tgz#f7a8e68ddd910a1100a65e25ac6a484143ff8168" integrity sha1-96jmjd2RChEApl4lrGpIQUP/gWg= -form-data@^2.3.1, form-data@^2.3.3, form-data@~2.3.2: +form-data@^2.3.1, form-data@~2.3.1, form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== @@ -11162,15 +11976,10 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -format@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= - -formidable@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" - integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== +formidable@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9" + integrity sha1-lriIb3w8NQi5Mta9cMTTqI818ak= formsy-react@^1.1.5: version "1.1.5" @@ -11185,7 +11994,12 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= -fp-ts@^1.0.0, fp-ts@^1.14.2: +fp-ts@^1.0.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.12.0.tgz#d333310e4ac104cdcb6bea47908e381bb09978e7" + integrity sha512-fWwnAgVlTsV26Ruo9nx+fxNHIm6l1puE1VJ/C0XJ3nRQJJJIgRHYw6sigB3MuNFZL1o4fpGlhwFhcbxHK0RsOA== + +fp-ts@^1.14.2: version "1.17.2" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.17.2.tgz#d8ab44a535ea53aad0623b289c15fad7e1f00e54" integrity sha512-8Ldcoj8IkYuOqINRcGeSI3JoatMM1A6rg2n4tn5jgaV7nwcX45UNOkFMhMpboEz4b+C+HKcc2tqOUmdu/hIBNw== @@ -11234,10 +12048,10 @@ fs-exists-sync@^0.1.0: resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= -fs-extra@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" - integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== +fs-extra@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -11316,13 +12130,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0, fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== +fsevents@^1.0.0, fsevents@^1.2.3, fsevents@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" + nan "^2.9.2" + node-pre-gyp "^0.10.0" fstream@^1.0.0, fstream@^1.0.2: version "1.0.11" @@ -11540,11 +12354,11 @@ getopts@^2.2.4: integrity sha512-Rz7DGyomZjrenu9Jx4qmzdlvJgvrEFHXHvjK0FcZtcTC1U5FmES7OdZHUwMuSnEE6QvBvwse1JODKj7TgbSEjQ== getos@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.1.tgz#967a813cceafee0156b0483f7cffa5b3eff029c5" - integrity sha512-oUP1rnEhAr97rkitiszGP9EgDVYnmchgFzfqRzSkgtfv7ai6tEi7Ko8GgjNXts7VLWEqrTWyhsOKLe5C5b/Zkg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.0.tgz#db3aa4df15a3295557ce5e81aa9e3e5cdfaa6567" + integrity sha512-i9vrxtDu5DlLVFcrbqUqGWYlZN/zZ4pGMICCAcZoYsX3JA54nYp8r5EThw5K+m2q3wszkx4Th746JstspB0H4Q== dependencies: - async "2.6.1" + async "2.4.0" getpass@^0.1.1: version "0.1.7" @@ -11623,14 +12437,7 @@ glob-base@^0.3.0: glob-parent "^2.0.0" is-glob "^2.0.0" -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.1.0: +glob-parent@3.1.0, glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= @@ -11638,6 +12445,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + glob-stream@^3.1.5: version "3.1.18" resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" @@ -11672,9 +12486,9 @@ glob-to-regexp@^0.3.0: integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= glob-to-regexp@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + version "0.4.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.0.tgz#49bd677b1671022bd10921c3788f23cdebf9c7e6" + integrity sha512-fyPCII4vn9Gvjq2U/oDAfP433aiE64cyP/CJjRJcpVGjqqNdioUYn9+r0cSzT1XPwmGAHuTT7iv+rQT8u/YHKQ== glob-watcher@^0.0.6: version "0.0.6" @@ -11743,7 +12557,7 @@ glob@^5.0.14, glob@^5.0.15, glob@~5.0.0, glob@~5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.1: +glob@^6.0.1, glob@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= @@ -11782,6 +12596,11 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +global-modules-path@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" + integrity sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag== + global-modules@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -11837,25 +12656,16 @@ global@^4.3.1, global@^4.3.2, global@~4.3.0: process "~0.5.1" globals@^11.1.0, globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== globals@^9.18.0, globals@^9.2.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globalthis@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.0.tgz#c5fb98213a9b4595f59cf3e7074f141b4169daae" - integrity sha512-vcCAZTJ3r5Qcu5l8/2oyVdoFwxKgfYnMTR2vwWeux/NAVZK3PwcMaWkdUIn4GJbmKuRK7xcvDsLuK+CKcXyodg== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - object-keys "^1.0.12" - -globby@8.0.2, globby@^8.0.1: +globby@8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== @@ -11915,19 +12725,18 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== +globby@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" + integrity sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw== dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" + array-union "^1.0.1" + dir-glob "^2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" globule@^1.0.0: version "1.2.1" @@ -11948,9 +12757,9 @@ globule@~0.1.0: minimatch "~0.2.11" glogg@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" - integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + integrity sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U= dependencies: sparkles "^1.0.0" @@ -12083,10 +12892,10 @@ got@^8.3.1, got@^8.3.2: url-parse-lax "^3.0.0" url-to-options "^1.0.1" -graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= graceful-fs@^3.0.0: version "3.0.11" @@ -12095,6 +12904,11 @@ graceful-fs@^3.0.0: dependencies: natives "^1.1.0" +graceful-fs@^4.1.0, graceful-fs@^4.1.15, graceful-fs@^4.1.9: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + graceful-fs@~1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" @@ -12105,13 +12919,19 @@ graceful-fs@~1.2.0: resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= -graphql-anywhere@^4.1.0-alpha.0, graphql-anywhere@^4.1.16: - version "4.2.1" - resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-4.2.1.tgz#1f7c3a3d9004dbe81b1c553d7fd1ef2e16e14a85" - integrity sha512-4zlzTFzixGXtIYjX7BiXQOGhQ5yQVohj/EKNxUHUTAR7lHnCmrXU17gGtZ+108l9TkoHNfc33ieJ9U8trnHE1w== +graphql-anywhere@^4.1.0-alpha.0: + version "4.1.16" + resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-4.1.16.tgz#82bb59643e30183cfb7b485ed4262a7b39d8a6c1" + integrity sha512-DNQGxrh2p8w4vQwHIW1Sw65ZDbOr6ktQCeol6itH3LeWy1a3IoZ67jxrhgrHM+Upg8oiazvteSr64VRxJ8n5+g== dependencies: - apollo-utilities "^1.2.1" - tslib "^1.9.3" + apollo-utilities "^1.0.18" + +graphql-anywhere@^4.1.16: + version "4.1.23" + resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-4.1.23.tgz#4275b161432b7c60a36970a1d9840d8c5cc2516e" + integrity sha512-8wtmwxWmLzAy52Z4WAw9UiYZ4ViiNXM+2DMOSlg2F7WsVstD0v75uOjCLJQUvbld5kHrgzTxter/THFVkGL+Yw== + dependencies: + apollo-utilities "^1.0.26" graphql-code-generator@^0.13.0: version "0.13.0" @@ -12204,9 +13024,9 @@ graphql-extensions@^0.0.x, graphql-extensions@~0.0.9: source-map-support "^0.5.1" graphql-fields@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/graphql-fields/-/graphql-fields-1.3.0.tgz#902ae2fd525eb04ddede7565d447db54dfc56b54" - integrity sha512-juRLzsYgbcJ/YuwExYObDPXn725YyCiVqxx6JlUm4HI5Ytm2RKp6MScaTVieMKtJI+Z6JmNgzInMTNuw0/DbZg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/graphql-fields/-/graphql-fields-1.2.1.tgz#3777112af0bd6f55cc3c7b8f6d7748ab7a1b23bb" + integrity sha512-ufg/dxb78IjQUblNfiaEMkZWD1CwcZjdK0nTEW0dBQyNArxKZI7N+zohZdIdqVJcihPWJod1yymx4NM+1bZjTw== graphql-import@0.7.1, graphql-import@^0.7.1: version "0.7.1" @@ -12223,16 +13043,11 @@ graphql-request@^1.5.0: dependencies: cross-fetch "2.2.2" -graphql-tag@2.10.0: +graphql-tag@2.10.0, graphql-tag@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.0.tgz#87da024be863e357551b2b8700e496ee2d4353ae" integrity sha512-9FD6cw976TLLf9WYIUPCaaTpniawIjHWZSwIRZSjrfufJamcXbVVYfN2TWvJYbw0Xf2JjYbl1/f2+wDnBVw3/w== -graphql-tag@^2.9.2: - version "2.10.1" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.1.tgz#10aa41f1cd8fae5373eaf11f1f67260a3cad5e02" - integrity sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg== - graphql-tools@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.2.tgz#9da22974cc6bf6524ed4f4af35556fd15aa6516d" @@ -12274,9 +13089,9 @@ graphql@^0.13.2: iterall "^1.2.1" grid-index@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" - integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + version "1.0.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.0.0.tgz#ad2c5d54ce5b35437faff1d70a9aeb3d1d261110" + integrity sha1-rSxdVM5bNUN/r/HXCprrPR0mERA= grouped-queue@^0.3.0, grouped-queue@^0.3.3: version "0.3.3" @@ -12300,18 +13115,7 @@ grunt-babel@^8.0.0: resolved "https://registry.yarnpkg.com/grunt-babel/-/grunt-babel-8.0.0.tgz#92ef63aafadf938c488dc2f926ac9846e0c93d1b" integrity sha512-WuiZFvGzcyzlEoPIcY1snI234ydDWeWWV5bpnB7PZsOLHcDsxWKnrR1rMWEUsbdVPPjvIirwFNsuo4CbJmsdFQ== -grunt-cli@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.3.2.tgz#60f12d12c1b5aae94ae3469c6b5fe24e960014e8" - integrity sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ== - dependencies: - grunt-known-options "~1.1.0" - interpret "~1.1.0" - liftoff "~2.5.0" - nopt "~4.0.1" - v8flags "~3.1.1" - -grunt-cli@~1.2.0: +grunt-cli@^1.2.0, grunt-cli@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8" integrity sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg= @@ -12355,9 +13159,9 @@ grunt-karma@2.0.0: lodash "^3.10.1" grunt-known-options@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d" - integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.0.tgz#a4274eeb32fa765da5a7a3b1712617ce3b144149" + integrity sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk= grunt-legacy-log-utils@~2.0.0: version "2.0.1" @@ -12509,9 +13313,9 @@ gulp-util@^3.0.0: vinyl "^0.5.0" gulp-zip@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-4.2.0.tgz#e25e738c41ad0795ad853d1d8aeb1744d2a4ca82" - integrity sha512-I+697f6jf+PncdTrqfuwoauxgnLG1yHRg3vlmvDgmJuEnlEHy4meBktJ/oHgfyg4tp6X25wuZqUOraVeVg97wQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-4.1.0.tgz#dab178bd99afa190923f1eb78abaf0db47817704" + integrity sha1-2rF4vZmvoZCSPx63irrw20eBdwQ= dependencies: get-stream "^3.0.0" plugin-error "^0.1.2" @@ -12554,19 +13358,19 @@ gzip-size@5.0.0: pify "^3.0.0" h2o2@^8.1.2: - version "8.2.0" - resolved "https://registry.yarnpkg.com/h2o2/-/h2o2-8.2.0.tgz#ead6a855f40cf8fbe67986751b5e2ff8a87aa643" - integrity sha512-TwWWSk1tMg03VkSKQTrTSXWKogmpYts5Uj5W6GN9CedFJY5EtL5vz2nndd9s5qxxSMP6Wj8jyGrj/6qV9d4KDg== + version "8.1.2" + resolved "https://registry.yarnpkg.com/h2o2/-/h2o2-8.1.2.tgz#25e6f69f453175c9ca1e3618741c5ebe1b5000c1" + integrity sha1-Jeb2n0UxdcnKHjYYdBxevhtQAME= dependencies: boom "7.x.x" hoek "5.x.x" joi "13.x.x" wreck "14.x.x" -handle-thing@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ= handlebars@4.0.11: version "4.0.11" @@ -12579,7 +13383,7 @@ handlebars@4.0.11: optionalDependencies: uglify-js "^2.6" -handlebars@4.0.12: +handlebars@4.0.12, handlebars@^4.0.1: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== @@ -12601,7 +13405,7 @@ handlebars@4.0.14: optionalDependencies: uglify-js "^3.1.4" -handlebars@^4.0.1, handlebars@^4.0.14, handlebars@^4.1.2: +handlebars@^4.0.14: version "4.1.2" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== @@ -12612,20 +13416,31 @@ handlebars@^4.0.1, handlebars@^4.0.14, handlebars@^4.1.2: optionalDependencies: uglify-js "^3.1.4" +handlebars@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" + integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + hapi-auth-cookie@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/hapi-auth-cookie/-/hapi-auth-cookie-9.1.0.tgz#6593d5d37c34b8fcdf0c47624510395f7bc793e2" - integrity sha512-AFrFj6p7IHd/as0iQTIedc7HNUvqSN6OkurM1mk2smnVvTsXu5qr69jtsTMCMJE+gAL/mNI4Oq/AFOEdLGR0MQ== + version "9.0.0" + resolved "https://registry.yarnpkg.com/hapi-auth-cookie/-/hapi-auth-cookie-9.0.0.tgz#3b0af443334e2bd92490ddb17bed16e3e9edfd01" + integrity sha512-N71Mt7Jk0+7WLnuvfSv0DoGzgpn7TqOd+/AB73RfHpLvzYoskJ9AlFV3Op60DB01RJNaABZtdcH1l4HM3DMbog== dependencies: boom "7.x.x" bounce "1.x.x" - hoek "6.x.x" - joi "14.x.x" + hoek "5.x.x" + joi "13.x.x" hapi@^17.5.3: - version "17.8.5" - resolved "https://registry.yarnpkg.com/hapi/-/hapi-17.8.5.tgz#31bc23dfd45c9cbc8b417ea2eaecd14694aa150e" - integrity sha512-+RnMWK/HI3VCvzfy0vO28YycMX19OiY8h9tYaDzjjOJ1eTh/HY2URvhFNkcqxZ1R1uoUdiB+pnjGi9e+vkaPEw== + version "17.6.0" + resolved "https://registry.yarnpkg.com/hapi/-/hapi-17.6.0.tgz#158a2276253a8de727be678c4daeb1f73929e588" + integrity sha512-GSHjE1hJExluAukrT/QuYSk96irmbYBDd3wOgywiHsPoR2QeKgDnIttD+dB6NbADEmSdb9MS5gTUIVq0uHTdkA== dependencies: accept "3.x.x" ammo "3.x.x" @@ -12635,12 +13450,11 @@ hapi@^17.5.3: catbox "10.x.x" catbox-memory "3.x.x" heavy "6.x.x" - hoek "6.x.x" - joi "14.x.x" + hoek "5.x.x" + joi "13.x.x" mimos "4.x.x" podium "3.x.x" shot "4.x.x" - somever "2.x.x" statehood "6.x.x" subtext "6.x.x" teamwork "3.x.x" @@ -12664,6 +13478,14 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + har-validator@~5.1.0: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" @@ -12710,6 +13532,11 @@ has-flag@^1.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -12775,6 +13602,13 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + integrity sha1-hGFzP1OLCDfJNh45qauelwTcLyg= + dependencies: + function-bind "^1.0.2" + has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -12782,6 +13616,13 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + integrity sha1-ZuodhW206KVHDK32/OI65SRO8uE= + dependencies: + inherits "^2.0.1" + hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" @@ -12791,12 +13632,12 @@ hash-base@^3.0.0: safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== dependencies: inherits "^2.0.3" - minimalistic-assert "^1.0.1" + minimalistic-assert "^1.0.0" hast-util-from-parse5@^5.0.0: version "5.0.0" @@ -12834,6 +13675,16 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + he@1.2.x, he@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -12853,25 +13704,20 @@ header-case@^1.0.0: upper-case "^1.1.3" heavy@6.x.x: - version "6.1.2" - resolved "https://registry.yarnpkg.com/heavy/-/heavy-6.1.2.tgz#e5d56f18170a37b01d4381bc07fece5edc68520b" - integrity sha512-cJp884bqhiebNcEHydW0g6V1MUGYOXRPw9c7MFiHQnuGxtbWuSZpsbojwb2kxb3AA1/Rfs8CNiV9MMOF8pFRDg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/heavy/-/heavy-6.1.0.tgz#1bbfa43dc61dd4b543ede3ff87db8306b7967274" + integrity sha512-TKS9DC9NOTGulHQI31Lx+bmeWmNOstbJbGMiN3pX6bF+Zc2GKSpbbym4oasNnB6yPGkqJ9TQXXYDGohqNSJRxA== dependencies: boom "7.x.x" - hoek "6.x.x" - joi "14.x.x" + hoek "5.x.x" + joi "13.x.x" highlight.js@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.0.0.tgz#f5f8d564c97ab374a046f5598077ae6adddbe620" integrity sha1-9fjVZMl6s3SgRvVZgHeuat3b5iA= -highlight.js@^9.12.0: - version "9.15.6" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.6.tgz#72d4d8d779ec066af9a17cb14360c3def0aa57c4" - integrity sha512-zozTAWM1D6sozHo8kqhfYgsac+B+q0PmsjXeyDrYIHHcBN0zTVT66+s2GW1GZv7DbyaROdLXKdabwS/WqPyIdQ== - -highlight.js@~9.12.0: +highlight.js@^9.12.0, highlight.js@~9.12.0: version "9.12.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" integrity sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4= @@ -12881,7 +13727,7 @@ history-extra@^4.0.2: resolved "https://registry.yarnpkg.com/history-extra/-/history-extra-4.0.2.tgz#67b512c196e0a521be1d8ac83513f00ca761d9f3" integrity sha512-Nia8vzQHyQcxKQUt5/vxZegurkG2K23TplaWLk1V6EWTuNdZMJUJ78anwGkBcHuLBia8TFUct/R/QDlgRUA42A== -history@4.7.2: +history@4.7.2, history@^4.7.2: version "4.7.2" resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" integrity sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA== @@ -12902,18 +13748,6 @@ history@^3.0.0: query-string "^4.2.2" warning "^3.0.0" -history@^4.7.2: - version "4.9.0" - resolved "https://registry.yarnpkg.com/history/-/history-4.9.0.tgz#84587c2068039ead8af769e9d6a6860a14fa1bca" - integrity sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^2.2.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^0.4.0" - hjson@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hjson/-/hjson-3.1.0.tgz#dd468d0a74fe227b79afd85b0df677433a633501" @@ -12938,7 +13772,7 @@ hoek@3.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-3.0.4.tgz#268adff66bb6695c69b4789a88b1e0847c3f3123" integrity sha1-Jorf9mu2aVxptHiaiLHghHw/MSM= -hoek@4.2.1: +hoek@4.2.1, hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== @@ -12949,26 +13783,36 @@ hoek@5.x.x, hoek@^5.0.4: integrity sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w== hoek@6.x.x: - version "6.1.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c" - integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ== + version "6.0.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.0.3.tgz#7884360426d927865a0a1251fc9c59313af5b798" + integrity sha512-TU6RyZ/XaQCTWRLrdqZZtZqwxUVr6PDMfi6MlWNURZ7A6czanQqX4pFE1mdOUQR9FdPCsZ0UzL8jI/izZ+eBSQ== + +hoist-non-react-statics@^2.3.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz#d2ca2dfc19c5a91c5a6615ce8e564ef0347e2a40" + integrity sha512-6Bl6XsDT1ntE0lHbIhr4Kp2PGcleGZ66qu5Jqk8lc0Xc/IeG6gVLmwUGs/K0Us+L8VWoKgj0uWdPMataOsm31w== hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0, hoist-non-react-statics@^2.5.5: version "2.5.5" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== dependencies: react-is "^16.7.0" +home-or-tmp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" + integrity sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs= + homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= dependencies: parse-passwd "^1.0.0" @@ -12978,9 +13822,9 @@ hooker@~0.2.3: integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk= hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + integrity sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== hpack.js@^2.1.6: version "2.1.6" @@ -12992,21 +13836,14 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-element-map@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.0.1.tgz#3c4fcb4874ebddfe4283b51c8994e7713782b592" - integrity sha512-BZSfdEm6n706/lBfXKWa4frZRZcT5k1cOusw95ijZsHlI+GdgY0v95h6IzO3iIDf2ROwq570YTwqNPqHcNMozw== - dependencies: - array-filter "^1.0.0" - -html-encoding-sniffer@^1.0.2: +html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" -html-entities@^1.2.0, html-entities@^1.2.1: +html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= @@ -13047,9 +13884,9 @@ html-to-react@^1.3.4: ramda "^0.26" html-webpack-plugin@^4.0.0-beta.2: - version "4.0.0-beta.5" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz#2c53083c1151bfec20479b1f8aaf0039e77b5513" - integrity sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ== + version "4.0.0-beta.4" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.4.tgz#4a996abc66ccccad2816998741dad2589858716c" + integrity sha512-5JDvn5zoNxcfnbuciyBbHTtUkOXfoVdO4g0Ma2ibVHruEvtx2g5wFgRjl/bAHrnF4EzGlCFn168cOnmMGg9NtA== dependencies: html-minifier "^3.5.20" loader-utils "^1.1.0" @@ -13065,7 +13902,7 @@ html@1.0.0, html@^1.0.0: dependencies: concat-stream "^1.4.7" -htmlparser2@^3.10.0, htmlparser2@^3.3.0, htmlparser2@^3.9.1: +htmlparser2@^3.10.0, htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -13077,6 +13914,16 @@ htmlparser2@^3.10.0, htmlparser2@^3.3.0, htmlparser2@^3.9.1: inherits "^2.0.1" readable-stream "^3.1.1" +htmlparser2@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" + integrity sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4= + dependencies: + domelementtype "1" + domhandler "2.1" + domutils "1.1" + readable-stream "1.0" + http-cache-semantics@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" @@ -13087,7 +13934,7 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.6.2: +http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= @@ -13097,7 +13944,7 @@ http-errors@1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: +http-errors@1.6.3, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= @@ -13107,21 +13954,10 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-parser-js@>=0.4.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" - integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== + version "0.4.11" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.11.tgz#5b720849c650903c27e521633d94696ee95f3529" + integrity sha512-QCR5O2AjjMW8Mo4HyI1ctFcv+O99j/0g367V3YoVnrNw5hkDvAWZD0lWGcc+F4yN3V55USPCVix4efb75HxFfA== http-proxy-agent@^2.1.0: version "2.1.0" @@ -13131,24 +13967,23 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" -http-proxy-middleware@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== +http-proxy-middleware@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + integrity sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q== dependencies: - http-proxy "^1.17.0" + http-proxy "^1.16.2" is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" + lodash "^4.17.5" + micromatch "^3.1.9" -http-proxy@^1.13.0, http-proxy@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" - integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== +http-proxy@^1.13.0, http-proxy@^1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= dependencies: - eventemitter3 "^3.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" + eventemitter3 "1.x.x" + requires-port "1.x.x" http-signature@~1.1.0: version "1.1.1" @@ -13205,7 +14040,7 @@ icalendar@0.7.1: resolved "https://registry.yarnpkg.com/icalendar/-/icalendar-0.7.1.tgz#d0d3486795f8f1c5cf4f8cafac081b4b4e7a32ae" integrity sha1-0NNIZ5X48cXPT4yvrAgbS056Mq4= -iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4, iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.22, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -13244,14 +14079,19 @@ icss-utils@^4.1.0: postcss "^7.0.14" idx@^2.5.2: - version "2.5.5" - resolved "https://registry.yarnpkg.com/idx/-/idx-2.5.5.tgz#609a011b7c9e092380f30908389d64ecd1102f70" - integrity sha512-pp6pulm8tbJag/Z3PXTq+PMfjlWTavze4hp/ajH9hQdNql62kuTHhzn9AP0buQ4n80zJlgaBeruWvGcA5DUdIw== + version "2.5.2" + resolved "https://registry.yarnpkg.com/idx/-/idx-2.5.2.tgz#4b405c2e6d68d04136e0a368a7ab35b9caa0595f" + integrity sha512-MLoGF4lQU5q/RqJJjRsuid52emu7tPVtSSZaYXsqRvSjvXdBEmIwk2urvbNvPBRU9Ox9I4WYnxiz2GjhU34Lrw== + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + integrity sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q= -ieee754@^1.1.12, ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.6: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== iferr@^0.1.5: version "0.1.5" @@ -13270,7 +14110,7 @@ ignore@^3.1.2, ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.3, ignore@^4.0.6: +ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== @@ -13399,15 +14239,15 @@ indexof@0.0.1: integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inert@^5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/inert/-/inert-5.1.3.tgz#6adeb32b055b308d9ede9b9626607c7029ac7c67" - integrity sha512-xLtqTOcJe+/RBaXkH0ZFai91SFj1a27ZXjFLLyiezLGhZCkBvMA+YGe6hNVVA678mb4EudKW35q1hATkxfUvMA== + version "5.1.0" + resolved "https://registry.yarnpkg.com/inert/-/inert-5.1.0.tgz#e9f130dc3047ccd9ffaa64b157b4c1114611035d" + integrity sha512-5rJZbezGEkBN4QrP/HEEwsQ0N+7YzqDZrvBZrE7B0CrNY6I4XKI434aL3UNLCmbI4HzPGQs7Ae/4h1tiTMJ6Wg== dependencies: ammo "3.x.x" boom "7.x.x" bounce "1.x.x" - hoek "6.x.x" - joi "14.x.x" + hoek "5.x.x" + joi "13.x.x" lru-cache "4.1.x" infinity-agent@^2.0.0: @@ -13424,9 +14264,9 @@ inflight@^1.0.4: wrappy "1" inherit@^2.2.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/inherit/-/inherit-2.2.7.tgz#4e238e289bc7adddf8ff5053d0f26a2fcda94b9f" - integrity sha512-dxJmC1j0Q32NFAjvbd6g3lXYLZ49HgzotgbSMwMkoiTXGhC9412Oc24g7A7M9cPPkw/vDsF2cSII+2zJwocUtQ== + version "2.2.6" + resolved "https://registry.yarnpkg.com/inherit/-/inherit-2.2.6.tgz#f1614b06c8544e8128e4229c86347db73ad9788d" + integrity sha1-8WFLBshUToEo5CKchjR9tzrZeI0= inherits@1: version "1.0.2" @@ -13546,16 +14386,73 @@ inquirer@^3.2.3: lodash "^4.3.0" mute-stream "0.0.7" run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" + integrity sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.0.0.tgz#e8c20303ddc15bbfc2c12a6213710ccd9e1413d8" + integrity sha512-tISQWRwtcAgrz+SHPhTH7d3e73k31gsOy6i1csonLc0u1dVK/wYvuOnFeiWqC5OXFIYbmrIFInef31wbT8MEJg== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" string-width "^2.1.0" strip-ansi "^4.0.0" through "^2.3.6" -inquirer@^6.0.0, inquirer@^6.2.0, inquirer@^6.2.2, inquirer@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" - integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== +inquirer@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -13568,7 +14465,7 @@ inquirer@^6.0.0, inquirer@^6.2.0, inquirer@^6.2.2, inquirer@^6.3.1: run-async "^2.2.0" rxjs "^6.4.0" string-width "^2.1.0" - strip-ansi "^5.1.0" + strip-ansi "^5.0.0" through "^2.3.6" insane@2.5.0: @@ -13580,53 +14477,48 @@ insane@2.5.0: he "^0.5.0" insight@^0.10.1: - version "0.10.3" - resolved "https://registry.yarnpkg.com/insight/-/insight-0.10.3.tgz#e7fa6593fd11323d227154cc8ce5f8bff638bf02" - integrity sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw== + version "0.10.1" + resolved "https://registry.yarnpkg.com/insight/-/insight-0.10.1.tgz#a0ecf668484a95d66e9be59644964e719cc83380" + integrity sha512-kLGeYQkh18f8KuC68QKdi0iwUcIaayJVB/STpX7x452/7pAUm1yfG4giJwcxbrTh0zNYtc8kBR+6maLMOzglOQ== dependencies: - async "^2.6.2" - chalk "^2.4.2" - conf "^1.4.0" - inquirer "^6.3.1" + async "^2.1.4" + chalk "^2.3.0" + conf "^1.3.1" + inquirer "^5.0.0" lodash.debounce "^4.0.8" - os-name "^3.1.0" - request "^2.88.0" - tough-cookie "^3.0.1" - uuid "^3.3.2" + os-name "^2.0.1" + request "^2.74.0" + tough-cookie "^2.0.0" + uuid "^3.0.0" -internal-ip@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" -interpret@^1.0.0, interpret@^1.1.0, interpret@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== - -interpret@~1.1.0: +interpret@^1.0.0, interpret@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= +interpret@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + intl-format-cache@^2.0.5, intl-format-cache@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.1.0.tgz#04a369fecbfad6da6005bae1f14333332dcf9316" integrity sha1-BKNp/sv61tpgBbrh8UMzMy3PkxY= -intl-messageformat-parser@1.4.0: +intl-messageformat-parser@1.4.0, intl-messageformat-parser@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz#b43d45a97468cadbe44331d74bb1e8dea44fc075" integrity sha1-tD1FqXRoytvkQzHXS7Ho3qRPwHU= -intl-messageformat-parser@^1.4.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.5.1.tgz#b15a93dc8d4ba77ff60fd0443ed4794403b1e132" - integrity sha512-G9/w2k2MRG2OvzVc/zOfBQbZJT590TiUI6/4wUshvzV1Q9rA5DDC2mWFz5UtiWT4Z7U3nunaba3FWri77KXCnA== - intl-messageformat@^2.0.0, intl-messageformat@^2.1.0, intl-messageformat@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-2.2.0.tgz#345bcd46de630b7683330c2e52177ff5eab484fc" @@ -13662,7 +14554,14 @@ into-stream@^5.1.0: from2 "^2.3.0" p-is-promise "^2.0.0" -invariant@^2.1.0, invariant@^2.1.1, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: +invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + integrity sha1-nh9WrArNtr8wMwbzOL47IErmA2A= + dependencies: + loose-envify "^1.0.0" + +invariant@^2.1.0, invariant@^2.1.1, invariant@^2.2.3, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -13680,9 +14579,9 @@ invert-kv@^2.0.0: integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== io-ts@^1.4.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.8.5.tgz#2e102f7f518abe17b0f7e7ede0db54a4c4ddc188" - integrity sha512-4HzDeg7mTygFjFIKh7ajBSanoVaFryYSFI0ocdwndSWl3eWQXhg3wVR0WI+Li5Vq11TIsoIngQszVbN4dy//9A== + version "1.4.2" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.4.2.tgz#d3cb1ef7d7ba68d59af85d839a728aad7f4b1c28" + integrity sha512-U4uw8jjj8jYZip7zHgBj40GW0DpYdVi1i0J3anezp2ytYHDg7+cKc7iIFlIyCh+NLwMxzwu6OQ/b9S61KUjPGg== dependencies: fp-ts "^1.0.0" @@ -13696,20 +14595,24 @@ ip@1.1.5, ip@^1.1.0, ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.9.0, ipaddr.js@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" - integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + +ipaddr.js@^1.5.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" + integrity sha1-+kt5+kf9Pe9eOxWYJRYcClGclCc= iron@5.x.x: - version "5.0.6" - resolved "https://registry.yarnpkg.com/iron/-/iron-5.0.6.tgz#7121d4a6e3ac2f65e4d02971646fea1995434744" - integrity sha512-zYUMOSkEXGBdwlV/AXF9zJC0aLuTJUKHkGeYS5I2g225M5i6SrxQyGJGhPgOR8BK1omL6N5i6TcwfsXbP8/Exw== + version "5.0.4" + resolved "https://registry.yarnpkg.com/iron/-/iron-5.0.4.tgz#003ed822f656f07c2b62762815f5de3947326867" + integrity sha512-7iQ5/xFMIYaNt9g2oiNiWdhrOTdRUMFaWENUd0KghxwPUhrIH8DUY8FEyLNTTzf75jaII+jMexLdY/2HfV61RQ== dependencies: - b64 "4.x.x" boom "7.x.x" cryptiles "4.x.x" - hoek "6.x.x" + hoek "5.x.x" irregular-plurals@^1.0.0: version "1.4.0" @@ -13739,14 +14642,14 @@ is-accessor-descriptor@^1.0.0: kind-of "^6.0.0" is-alphabetical@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.2.tgz#1fa6e49213cb7885b75d15862fb3f3d96c884f41" - integrity sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08" + integrity sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg= is-alphanumerical@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz#1138e9ae5040158dc6ff76b820acd6b7a181fd40" - integrity sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz#dfb4aa4d1085e33bdb61c2dee9c80e9c6c19f53b" + integrity sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts= dependencies: is-alphabetical "^1.0.0" is-decimal "^1.0.0" @@ -13757,9 +14660,9 @@ is-arrayish@^0.2.1: integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.1.tgz#c2dfc386abaa0c3e33c48db3fe87059e69065efd" + integrity sha1-wt/DhquqDD4zxI2z/ocFnmkGXv0= is-binary-path@^1.0.0: version "1.0.1" @@ -13769,11 +14672,11 @@ is-binary-path@^1.0.0: binary-extensions "^1.0.0" is-binary-path@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.0.0.tgz#0e61cea6974b24dda8bcc8366ce58a69265d1a36" + integrity sha1-DmHOppdLJN2ovMg2bOWKaSZdGjY= dependencies: - binary-extensions "^2.0.0" + binary-extensions "^1.0.0" is-boolean-object@^1.0.0: version "1.0.0" @@ -13790,17 +14693,24 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= + dependencies: + builtin-modules "^1.0.0" + is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + integrity sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg== dependencies: - ci-info "^1.5.0" + ci-info "^1.0.0" is-ci@^2.0.0: version "2.0.0" @@ -13829,9 +14739,9 @@ is-date-object@^1.0.1: integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= is-decimal@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.2.tgz#894662d6a8709d307f3a276ca4339c8fa5dff0ff" - integrity sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.1.tgz#f5fb6a94996ad9e8e3761fbfbd091f1fca8c4e82" + integrity sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI= is-descriptor@^0.1.0: version "0.1.6" @@ -13927,17 +14837,17 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-function@^1.0.1: +is-function@^1.0.1, is-function@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.0.0.tgz#038c31b774709641bda678b1f06a4e3227c10b3e" + integrity sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g== -is-glob@4.0.0: +is-glob@4.0.0, is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= @@ -13958,17 +14868,10 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - is-hexadecimal@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz#b6e710d7d07bb66b98cb8cece5c9b4921deeb835" - integrity sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A== + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz#6e084bbc92061fbb0971ec58b6ce6d404e24da69" + integrity sha1-bghLvJIGH7sJcexYts5tQE4k2mk= is-installed-globally@^0.1.0: version "0.1.0" @@ -14069,30 +14972,32 @@ is-observable@^1.1.0: dependencies: symbol-observable "^1.1.0" +is-odd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + integrity sha1-O4qTLrAos3dcObsJ6RdnrM22kIg= + dependencies: + is-number "^3.0.0" + +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + integrity sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ== + dependencies: + is-number "^4.0.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= -is-path-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.1.0.tgz#2e0c7e463ff5b7a0eb60852d851a6809347a124c" - integrity sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw== - is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + integrity sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw= dependencies: is-path-inside "^1.0.0" -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -14100,10 +15005,10 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-path-inside@^2.0.0, is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== +is-path-inside@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.0.0.tgz#28f249020fe6906671fe31a76118f2cd490441fd" + integrity sha512-OmUXvSq+P7aI/aRbl1dzwdlyLn8vW7Nr2/11S7y/dcLLgnQ89hgYJp7tfc+A5SRid3rNCLpruOp2CAV68/iOcA== dependencies: path-is-inside "^1.0.2" @@ -14119,13 +15024,6 @@ is-plain-object@2.0.4, is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain- dependencies: isobject "^3.0.1" -is-plain-object@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== - dependencies: - isobject "^4.0.0" - is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -14220,9 +15118,9 @@ is-subset@^0.1.1: integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= is-supported-regexp-flag@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" - integrity sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz#8b520c85fae7a253382d4b02652e045576e13bb8" + integrity sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g= is-symbol@^1.0.2: version "1.0.2" @@ -14273,19 +15171,24 @@ is-valid-path@0.1.1: is-invalid-path "^0.1.0" is-whitespace-character@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz#ede53b4c6f6fb3874533751ec9280d01928d03ed" - integrity sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz#9ae0176f3282b65457a1992cdb084f8a5f833e3b" + integrity sha1-muAXbzKCtlRXoZks2whPil+DPjs= -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" + integrity sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk= + +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-word-character@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.2.tgz#46a5dac3f2a1840898b91e576cd40d493f3ae553" - integrity sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.1.tgz#5a03fa1ea91ace8a6eb0c7cd770eb86d65c8befb" + integrity sha1-WgP6HqkazopusMfNdw64bWXIvvs= is-wsl@^1.1.0: version "1.1.0" @@ -14317,16 +15220,14 @@ isarray@2.0.1: integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= isbinaryfile@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" - integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== - dependencies: - buffer-alloc "^1.2.0" + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE= isemail@3.x.x: - version "3.2.0" - resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" - integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg== + version "3.1.4" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.1.4.tgz#76e2187ff7bee59d57522c6fd1c3f09a331933cf" + integrity sha512-yE/W5osEWuAGSLVixV9pAexhkbZzglmuhO2CxdHu7IBh7uzuZogQ4bk0lE26HoZ6HD4ZYfKRKilkNuCnuJIBJw== dependencies: punycode "2.x.x" @@ -14352,11 +15253,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" @@ -14370,22 +15266,22 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.6.tgz#d61702a9d1c66ad89d92e66d401e16b0bda4a35f" - integrity sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA== +istanbul-api@^2.0.8: + version "2.1.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.1.tgz#194b773f6d9cbc99a9258446848b0f988951c4d0" + integrity sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw== dependencies: - async "^2.6.2" - compare-versions "^3.4.0" + async "^2.6.1" + compare-versions "^3.2.1" fileset "^2.0.3" - istanbul-lib-coverage "^2.0.5" - istanbul-lib-hook "^2.0.7" - istanbul-lib-instrument "^3.3.0" - istanbul-lib-report "^2.0.8" - istanbul-lib-source-maps "^3.0.6" - istanbul-reports "^2.2.4" - js-yaml "^3.13.1" - make-dir "^2.1.0" + istanbul-lib-coverage "^2.0.3" + istanbul-lib-hook "^2.0.3" + istanbul-lib-instrument "^3.1.0" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.2" + istanbul-reports "^2.1.1" + js-yaml "^3.12.0" + make-dir "^1.3.0" minimatch "^3.0.4" once "^1.4.0" @@ -14399,75 +15295,75 @@ istanbul-instrumenter-loader@3.0.1: loader-utils "^1.1.0" schema-utils "^0.3.0" -istanbul-lib-coverage@^1.2.1: +istanbul-lib-coverage@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba" + integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw== -istanbul-lib-hook@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz#c95695f383d4f8f60df1f04252a9550e15b5b133" - integrity sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA== +istanbul-lib-hook@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz#e0e581e461c611be5d0e5ef31c5f0109759916fb" + integrity sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA== dependencies: append-transform "^1.0.0" istanbul-lib-instrument@^1.7.3: - version "1.10.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" - integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== + version "1.10.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" + integrity sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ== dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" - istanbul-lib-coverage "^1.2.1" + istanbul-lib-coverage "^1.2.0" semver "^5.3.0" -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== +istanbul-lib-instrument@^3.0.0, istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971" + integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA== dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.3" + semver "^5.5.0" -istanbul-lib-report@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== +istanbul-lib-report@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz#bfd324ee0c04f59119cb4f07dab157d09f24d7e4" + integrity sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA== dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" + istanbul-lib-coverage "^2.0.3" + make-dir "^1.3.0" + supports-color "^6.0.0" -istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== +istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz#f1e817229a9146e8424a28e5d69ba220fda34156" + integrity sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ== dependencies: debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" + istanbul-lib-coverage "^2.0.3" + make-dir "^1.3.0" + rimraf "^2.6.2" source-map "^0.6.1" -istanbul-reports@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.4.tgz#4e0d0ddf0f0ad5b49a314069d31b4f06afe49ad3" - integrity sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w== +istanbul-reports@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9" + integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw== dependencies: - handlebars "^4.1.2" + handlebars "^4.1.0" istanbul@^0.4.0: version "0.4.5" @@ -14490,13 +15386,13 @@ istanbul@^0.4.0: wordwrap "^1.0.0" istextorbinary@^2.1.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.5.1.tgz#14a33824cf6b9d5d7743eac1be2bd2c310d0ccbd" - integrity sha512-pv/JNPWnfpwGjPx7JrtWTwsWsxkrK3fNzcEVnt92YKEIErps4Fsk49+qzCe9iQF2hjqK8Naqf8P9kzoeCuQI1g== + version "2.2.1" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53" + integrity sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw== dependencies: - binaryextensions "^2.1.2" - editions "^2.1.3" - textextensions "^2.4.0" + binaryextensions "2" + editions "^1.3.3" + textextensions "2" isurl@^1.0.0-alpha5: version "1.0.0" @@ -14507,9 +15403,9 @@ isurl@^1.0.0-alpha5: is-object "^1.0.1" items@2.x.x: - version "2.1.2" - resolved "https://registry.yarnpkg.com/items/-/items-2.1.2.tgz#0849354595805d586dac98e7e6e85556ea838558" - integrity sha512-kezcEqgB97BGeZZYtX/MA8AG410ptURstvnz5RAgyFZ8wQFPMxHY8GpTq+/ZHKT3frSlIthUq7EvLt9xn3TvXg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/items/-/items-2.1.1.tgz#8bd16d9c83b19529de5aea321acaada78364a198" + integrity sha1-i9FtnIOxlSneWuoyGsqtp4NkoZg= iterall@^1.1.3, iterall@^1.2.1: version "1.2.2" @@ -14530,9 +15426,9 @@ jade@0.26.3: mkdirp "0.3.0" jaeger-client@^3.5.3: - version "3.14.4" - resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.14.4.tgz#4230a45d3658950d7d12af82499bc92287c967c5" - integrity sha512-+AEI0z3ppLkqOKxUvN6n+qmjDj7O8R+Qr3lO9AXRtuEKxX4p0bfMwqcFiTQPr80twVVdF3wCrZVkcpJysZUL5w== + version "3.13.0" + resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.13.0.tgz#c5b228242d65389a13eb24eeb56a55409d72c94e" + integrity sha512-ykrXLxcmSHSdDXqK6/DY+IObekfj4kbONC3QPu/ln7sbY5bsA+Yu4LYVlW9/vLm0lxLlsz52mSyC+sjiqM8xCw== dependencies: node-int64 "^0.4.0" opentracing "^0.13.0" @@ -14565,56 +15461,78 @@ javascript-typescript-langserver@^2.11.3: vscode-languageserver "^5.0.0" vscode-languageserver-types "^3.0.3" -jest-changed-files@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.7.0.tgz#39d723a11b16ed7b373ac83adc76a69464b0c4fa" - integrity sha512-33BgewurnwSfJrW7T5/ZAXGE44o7swLslwh8aUckzq2e17/2Os1V0QU506ZNik3hjs8MgnEMKNkcud442NCDTw== +jest-changed-files@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.0.0.tgz#c02c09a8cc9ca93f513166bc773741bd39898ff7" + integrity sha512-nnuU510R9U+UX0WNb5XFEcsrMqriSiRLeO9KWDFgPrpToaQm60prfQYpxsXigdClpvNot5bekDY440x9dNGnsQ== dependencies: - "@jest/types" "^24.7.0" execa "^1.0.0" throat "^4.0.0" -jest-cli@^24.1.0, jest-cli@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.7.1.tgz#6093a539073b6f4953145abeeb9709cd621044f1" - integrity sha512-32OBoSCVPzcTslGFl6yVCMzB2SqX3IrWwZCY5mZYkb0D2WsogmU3eV2o8z7+gRQa4o4sZPX/k7GU+II7CxM6WQ== +jest-cli@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.1.0.tgz#f7cc98995f36e7210cce3cbb12974cbf60940843" + integrity sha512-U/iyWPwOI0T1CIxVLtk/2uviOTJ/OiSWJSe8qt6X1VkbbgP+nrtLJlmT9lPBe4lK78VNFJtrJ7pttcNv/s7yCw== dependencies: - "@jest/core" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" + ansi-escapes "^3.0.0" chalk "^2.0.1" exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.15" import-local "^2.0.0" is-ci "^2.0.0" - jest-config "^24.7.1" - jest-util "^24.7.1" - jest-validate "^24.7.0" + istanbul-api "^2.0.8" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-source-maps "^3.0.1" + jest-changed-files "^24.0.0" + jest-config "^24.1.0" + jest-environment-jsdom "^24.0.0" + jest-get-type "^24.0.0" + jest-haste-map "^24.0.0" + jest-message-util "^24.0.0" + jest-regex-util "^24.0.0" + jest-resolve-dependencies "^24.1.0" + jest-runner "^24.1.0" + jest-runtime "^24.1.0" + jest-snapshot "^24.1.0" + jest-util "^24.0.0" + jest-validate "^24.0.0" + jest-watcher "^24.0.0" + jest-worker "^24.0.0" + micromatch "^3.1.10" + node-notifier "^5.2.1" + p-each-series "^1.0.0" + pirates "^4.0.0" prompts "^2.0.1" - realpath-native "^1.1.0" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^2.0.0" + string-length "^2.0.0" + strip-ansi "^5.0.0" + which "^1.2.12" yargs "^12.0.2" -jest-config@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.7.1.tgz#6c1dd4db82a89710a3cf66bdba97827c9a1cf052" - integrity sha512-8FlJNLI+X+MU37j7j8RE4DnJkvAghXmBWdArVzypW6WxfGuxiL/CCkzBg0gHtXhD2rxla3IMOSUAHylSKYJ83g== +jest-config@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.1.0.tgz#6ea6881cfdd299bc86cc144ee36d937c97c3850c" + integrity sha512-FbbRzRqtFC6eGjG5VwsbW4E5dW3zqJKLWYiZWhB0/4E5fgsMw8GODLbGSrY5t17kKOtCWb/Z7nsIThRoDpuVyg== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.7.1" - "@jest/types" "^24.7.0" - babel-jest "^24.7.1" + babel-jest "^24.1.0" chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^24.7.1" - jest-environment-node "^24.7.1" - jest-get-type "^24.3.0" - jest-jasmine2 "^24.7.1" - jest-regex-util "^24.3.0" - jest-resolve "^24.7.1" - jest-util "^24.7.1" - jest-validate "^24.7.0" + jest-environment-jsdom "^24.0.0" + jest-environment-node "^24.0.0" + jest-get-type "^24.0.0" + jest-jasmine2 "^24.1.0" + jest-regex-util "^24.0.0" + jest-resolve "^24.1.0" + jest-util "^24.0.0" + jest-validate "^24.0.0" micromatch "^3.1.10" - pretty-format "^24.7.0" - realpath-native "^1.1.0" + pretty-format "^24.0.0" + realpath-native "^1.0.2" jest-diff@^23.6.0: version "23.6.0" @@ -14626,27 +15544,27 @@ jest-diff@^23.6.0: jest-get-type "^22.1.0" pretty-format "^23.6.0" -jest-diff@^24.0.0, jest-diff@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.7.0.tgz#5d862899be46249754806f66e5729c07fcb3580f" - integrity sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg== +jest-diff@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.0.0.tgz#a3e5f573dbac482f7d9513ac9cfa21644d3d6b34" + integrity sha512-XY5wMpRaTsuMoU+1/B2zQSKQ9RdE9gsLkGydx3nvApeyPijLA8GtEvIcPwISRCer+VDf9W1mStTYYq6fPt8ryA== dependencies: chalk "^2.0.1" - diff-sequences "^24.3.0" - jest-get-type "^24.3.0" - pretty-format "^24.7.0" + diff-sequences "^24.0.0" + jest-get-type "^24.0.0" + pretty-format "^24.0.0" -jest-docblock@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" - integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== +jest-docblock@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.0.0.tgz#54d77a188743e37f62181a91a01eb9222289f94e" + integrity sha512-KfAKZ4SN7CFOZpWg4i7g7MSlY0M+mq7K0aMqENaG2vHuhC9fc3vkpU/iNN9sOus7v3h3Y48uEjqz3+Gdn2iptA== dependencies: detect-newline "^2.1.0" jest-dom@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/jest-dom/-/jest-dom-3.1.4.tgz#914490e8baf997da16f71dc913ff0a77bd2a2ff7" - integrity sha512-ruIRHoRVnqPRt/HSS2aFukfhTpjEoq1I6PkYptKK5U2EeRm1eeOXG7BFiaMncTaGu4COSoCF84oLHj02+J5VDg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/jest-dom/-/jest-dom-3.1.3.tgz#9490de549c02366fe586f23bdafffd8374bd1d65" + integrity sha512-V9LdySiA74/spcAKEG3FRMRKnisKlcYr3EeCNYI4n7CWNE7uYg5WoBUHeGXirjWjRYLLZ5vx8rUaR/6x6o75oQ== dependencies: chalk "^2.4.1" css "^2.2.3" @@ -14657,97 +15575,81 @@ jest-dom@^3.1.3: pretty-format "^24.0.0" redent "^2.0.0" -jest-each@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.7.1.tgz#fcc7dda4147c28430ad9fb6dc7211cd17ab54e74" - integrity sha512-4fsS8fEfLa3lfnI1Jw6NxjhyRTgfpuOVTeUZZFyVYqeTa4hPhr2YkToUhouuLTrL2eMGOfpbdMyRx0GQ/VooKA== +jest-each@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.0.0.tgz#10987a06b21c7ffbfb7706c89d24c52ed864be55" + integrity sha512-gFcbY4Cu55yxExXMkjrnLXov3bWO3dbPAW7HXb31h/DNWdNc/6X8MtxGff8nh3/MjkF9DpVqnj0KsPKuPK0cpA== dependencies: - "@jest/types" "^24.7.0" chalk "^2.0.1" - jest-get-type "^24.3.0" - jest-util "^24.7.1" - pretty-format "^24.7.0" - -jest-environment-jsdom@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.7.1.tgz#a40e004b4458ebeb8a98082df135fd501b9fbbd6" - integrity sha512-Gnhb+RqE2JuQGb3kJsLF8vfqjt3PHKSstq4Xc8ic+ax7QKo4Z0RWGucU3YV+DwKR3T9SYc+3YCUQEJs8r7+Jxg== - dependencies: - "@jest/environment" "^24.7.1" - "@jest/fake-timers" "^24.7.1" - "@jest/types" "^24.7.0" - jest-mock "^24.7.0" - jest-util "^24.7.1" + jest-get-type "^24.0.0" + jest-util "^24.0.0" + pretty-format "^24.0.0" + +jest-environment-jsdom@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0.tgz#5affa0654d6e44cd798003daa1a8701dbd6e4d11" + integrity sha512-1YNp7xtxajTRaxbylDc2pWvFnfDTH5BJJGyVzyGAKNt/lEULohwEV9zFqTgG4bXRcq7xzdd+sGFws+LxThXXOw== + dependencies: + jest-mock "^24.0.0" + jest-util "^24.0.0" jsdom "^11.5.1" -jest-environment-node@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.7.1.tgz#fa2c047a31522a48038d26ee4f7c8fd9c1ecfe12" - integrity sha512-GJJQt1p9/C6aj6yNZMvovZuxTUd+BEJprETdvTKSb4kHcw4mFj8777USQV0FJoJ4V3djpOwA5eWyPwfq//PFBA== +jest-environment-node@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.0.0.tgz#330948980656ed8773ce2e04eb597ed91e3c7190" + integrity sha512-62fOFcaEdU0VLaq8JL90TqwI7hLn0cOKOl8vY2n477vRkCJRojiRRtJVRzzCcgFvs6gqU97DNqX5R0BrBP6Rxg== dependencies: - "@jest/environment" "^24.7.1" - "@jest/fake-timers" "^24.7.1" - "@jest/types" "^24.7.0" - jest-mock "^24.7.0" - jest-util "^24.7.1" + jest-mock "^24.0.0" + jest-util "^24.0.0" jest-get-type@^22.1.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== -jest-get-type@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.3.0.tgz#582cfd1a4f91b5cdad1d43d2932f816d543c65da" - integrity sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow== +jest-get-type@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.0.0.tgz#36e72930b78e33da59a4f63d44d332188278940b" + integrity sha512-z6/Eyf6s9ZDGz7eOvl+fzpuJmN9i0KyTt1no37/dHu8galssxz5ZEgnc1KaV8R31q1khxyhB4ui/X5ZjjPk77w== -jest-haste-map@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.7.1.tgz#772e215cd84080d4bbcb759cfb668ad649a21471" - integrity sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw== +jest-haste-map@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0.tgz#e9ef51b2c9257384b4d6beb83bd48c65b37b5e6e" + integrity sha512-CcViJyUo41IQqttLxXVdI41YErkzBKbE6cS6dRAploCeutePYfUimWd3C9rQEWhX0YBOQzvNsC0O9nYxK2nnxQ== dependencies: - "@jest/types" "^24.7.0" - anymatch "^2.0.0" fb-watchman "^2.0.0" graceful-fs "^4.1.15" invariant "^2.2.4" - jest-serializer "^24.4.0" - jest-util "^24.7.1" - jest-worker "^24.6.0" + jest-serializer "^24.0.0" + jest-util "^24.0.0" + jest-worker "^24.0.0" micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" + sane "^3.0.0" -jest-jasmine2@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.7.1.tgz#01398686dabe46553716303993f3be62e5d9d818" - integrity sha512-Y/9AOJDV1XS44wNwCaThq4Pw3gBPiOv/s6NcbOAkVRRUEPu+36L2xoPsqQXsDrxoBerqeyslpn2TpCI8Zr6J2w== +jest-jasmine2@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.1.0.tgz#8377324b967037c440f0a549ee0bbd9912055db6" + integrity sha512-H+o76SdSNyCh9fM5K8upK45YTo/DiFx5w2YAzblQebSQmukDcoVBVeXynyr7DDnxh+0NTHYRCLwJVf3tC518wg== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" chalk "^2.0.1" co "^4.6.0" - expect "^24.7.1" + expect "^24.1.0" is-generator-fn "^2.0.0" - jest-each "^24.7.1" - jest-matcher-utils "^24.7.0" - jest-message-util "^24.7.1" - jest-runtime "^24.7.1" - jest-snapshot "^24.7.1" - jest-util "^24.7.1" - pretty-format "^24.7.0" + jest-each "^24.0.0" + jest-matcher-utils "^24.0.0" + jest-message-util "^24.0.0" + jest-snapshot "^24.1.0" + jest-util "^24.0.0" + pretty-format "^24.0.0" throat "^4.0.0" -jest-leak-detector@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.7.0.tgz#323ff93ed69be12e898f5b040952f08a94288ff9" - integrity sha512-zV0qHKZGXtmPVVzT99CVEcHE9XDf+8LwiE0Ob7jjezERiGVljmqKFWpV2IkG+rkFIEUHFEkMiICu7wnoPM/RoQ== +jest-leak-detector@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.0.0.tgz#78280119fd05ee98317daee62cddb3aa537a31c6" + integrity sha512-ZYHJYFeibxfsDSKowjDP332pStuiFT2xfc5R67Rjm/l+HFJWJgNIOCOlQGeXLCtyUn3A23+VVDdiCcnB6dTTrg== dependencies: - pretty-format "^24.7.0" + pretty-format "^24.0.0" jest-matcher-utils@^23.6.0: version "23.6.0" @@ -14758,15 +15660,15 @@ jest-matcher-utils@^23.6.0: jest-get-type "^22.1.0" pretty-format "^23.6.0" -jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz#bbee1ff37bc8b2e4afcaabc91617c1526af4bcd4" - integrity sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg== +jest-matcher-utils@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.0.0.tgz#fc9c41cfc49b2c3ec14e576f53d519c37729d579" + integrity sha512-LQTDmO+aWRz1Tf9HJg+HlPHhDh1E1c65kVwRFo5mwCVp5aQDzlkz4+vCvXhOKFjitV2f0kMdHxnODrXVoi+rlA== dependencies: chalk "^2.0.1" - jest-diff "^24.7.0" - jest-get-type "^24.3.0" - pretty-format "^24.7.0" + jest-diff "^24.0.0" + jest-get-type "^24.0.0" + pretty-format "^24.0.0" jest-message-util@^23.4.0: version "23.4.0" @@ -14779,50 +15681,39 @@ jest-message-util@^23.4.0: slash "^1.0.0" stack-utils "^1.0.1" -jest-message-util@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.7.1.tgz#f1dc3a6c195647096a99d0f1dadbc447ae547018" - integrity sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg== +jest-message-util@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.0.0.tgz#a07a141433b2c992dbaec68d4cbfe470ba289619" + integrity sha512-J9ROJIwz/IeC+eV1XSwnRK4oAwPuhmxEyYx1+K5UI+pIYwFZDSrfZaiWTdq0d2xYFw4Xiu+0KQWsdsQpgJMf3Q== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/stack-utils" "^1.0.1" chalk "^2.0.1" micromatch "^3.1.10" slash "^2.0.0" stack-utils "^1.0.1" -jest-mock@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.7.0.tgz#e49ce7262c12d7f5897b0d8af77f6db8e538023b" - integrity sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng== - dependencies: - "@jest/types" "^24.7.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== +jest-mock@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.0.0.tgz#9a4b53e01d66a0e780f7d857462d063e024c617d" + integrity sha512-sQp0Hu5fcf5NZEh1U9eIW2qD0BwJZjb63Yqd98PQJFvf/zzUTBoUAwv/Dc/HFeNHIw1f3hl/48vNn+j3STaI7A== jest-raw-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/jest-raw-loader/-/jest-raw-loader-1.0.1.tgz#ce9f56d54650f157c4a7d16d224ba5d613bcd626" integrity sha1-zp9W1UZQ8VfEp9FtIkul1hO81iY= -jest-regex-util@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" - integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== +jest-regex-util@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.0.0.tgz#4feee8ec4a358f5bee0a654e94eb26163cb9089a" + integrity sha512-Jv/uOTCuC+PY7WpJl2mpoI+WbY2ut73qwwO9ByJJNwOCwr1qWhEW2Lyi2S9ZewUdJqeVpEBisdEVZSI+Zxo58Q== -jest-resolve-dependencies@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.7.1.tgz#cf93bbef26999488a96a2b2012f9fe7375aa378f" - integrity sha512-2Eyh5LJB2liNzfk4eo7bD1ZyBbqEJIyyrFtZG555cSWW9xVHxII2NuOkSl1yUYTAYCAmM2f2aIT5A7HzNmubyg== +jest-resolve-dependencies@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.1.0.tgz#78f738a2ec59ff4d00751d9da56f176e3f589f6c" + integrity sha512-2VwPsjd3kRPu7qe2cpytAgowCObk5AKeizfXuuiwgm1a9sijJDZe8Kh1sFj6FKvSaNEfCPlBVkZEJa2482m/Uw== dependencies: - "@jest/types" "^24.7.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.7.1" + jest-regex-util "^24.0.0" + jest-snapshot "^24.1.0" jest-resolve@^23.6.0: version "23.6.0" @@ -14833,77 +15724,69 @@ jest-resolve@^23.6.0: chalk "^2.0.1" realpath-native "^1.0.0" -jest-resolve@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.7.1.tgz#e4150198299298380a75a9fd55043fa3b9b17fde" - integrity sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw== +jest-resolve@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.1.0.tgz#42ff0169b0ea47bfdbd0c52a0067ca7d022c7688" + integrity sha512-TPiAIVp3TG6zAxH28u/6eogbwrvZjBMWroSLBDkwkHKrqxB/RIdwkWDye4uqPlZIXWIaHtifY3L0/eO5Z0f2wg== dependencies: - "@jest/types" "^24.7.0" browser-resolve "^1.11.3" chalk "^2.0.1" - jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-runner@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.7.1.tgz#41c8a02a06aa23ea82d8bffd69d7fa98d32f85bf" - integrity sha512-aNFc9liWU/xt+G9pobdKZ4qTeG/wnJrJna3VqunziDNsWT3EBpmxXZRBMKCsNMyfy+A/XHiV+tsMLufdsNdgCw== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" + realpath-native "^1.0.0" + +jest-runner@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.1.0.tgz#3686a2bb89ce62800da23d7fdc3da2c32792943b" + integrity sha512-CDGOkT3AIFl16BLL/OdbtYgYvbAprwJ+ExKuLZmGSCSldwsuU2dEGauqkpvd9nphVdAnJUcP12e/EIlnTX0QXg== + dependencies: chalk "^2.4.2" exit "^0.1.2" graceful-fs "^4.1.15" - jest-config "^24.7.1" - jest-docblock "^24.3.0" - jest-haste-map "^24.7.1" - jest-jasmine2 "^24.7.1" - jest-leak-detector "^24.7.0" - jest-message-util "^24.7.1" - jest-resolve "^24.7.1" - jest-runtime "^24.7.1" - jest-util "^24.7.1" - jest-worker "^24.6.0" + jest-config "^24.1.0" + jest-docblock "^24.0.0" + jest-haste-map "^24.0.0" + jest-jasmine2 "^24.1.0" + jest-leak-detector "^24.0.0" + jest-message-util "^24.0.0" + jest-runtime "^24.1.0" + jest-util "^24.0.0" + jest-worker "^24.0.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.7.1.tgz#2ffd70b22dd03a5988c0ab9465c85cdf5d25c597" - integrity sha512-0VAbyBy7tll3R+82IPJpf6QZkokzXPIS71aDeqh+WzPRXRCNz6StQ45otFariPdJ4FmXpDiArdhZrzNAC3sj6A== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.7.1" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/yargs" "^12.0.2" +jest-runtime@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.1.0.tgz#7c157a2e776609e8cf552f956a5a19ec9c985214" + integrity sha512-59/BY6OCuTXxGeDhEMU7+N33dpMQyXq7MLK07cNSIY/QYt2QZgJ7Tjx+rykBI0skAoigFl0A5tmT8UdwX92YuQ== + dependencies: + "@babel/core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" chalk "^2.0.1" + convert-source-map "^1.4.0" exit "^0.1.2" + fast-json-stable-stringify "^2.0.0" glob "^7.1.3" graceful-fs "^4.1.15" - jest-config "^24.7.1" - jest-haste-map "^24.7.1" - jest-message-util "^24.7.1" - jest-mock "^24.7.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.7.1" - jest-snapshot "^24.7.1" - jest-util "^24.7.1" - jest-validate "^24.7.0" - realpath-native "^1.1.0" + jest-config "^24.1.0" + jest-haste-map "^24.0.0" + jest-message-util "^24.0.0" + jest-regex-util "^24.0.0" + jest-resolve "^24.1.0" + jest-snapshot "^24.1.0" + jest-util "^24.0.0" + jest-validate "^24.0.0" + micromatch "^3.1.10" + realpath-native "^1.0.0" slash "^2.0.0" strip-bom "^3.0.0" + write-file-atomic "2.4.1" yargs "^12.0.2" -jest-serializer@^24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" - integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== +jest-serializer@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0.tgz#522c44a332cdd194d8c0531eb06a1ee5afb4256b" + integrity sha512-9FKxQyrFgHtx3ozU+1a8v938ILBE7S8Ko3uiAVjT8Yfi2o91j/fj81jacCQZ/Ihjiff/VsUCXVgQ+iF1XdImOw== -jest-snapshot@^23.6.0: +jest-snapshot@>=20.0.3: version "23.6.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== @@ -14919,30 +15802,28 @@ jest-snapshot@^23.6.0: pretty-format "^23.6.0" semver "^5.5.0" -jest-snapshot@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.7.1.tgz#bd5a35f74aedff070975e9e9c90024f082099568" - integrity sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA== +jest-snapshot@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.1.0.tgz#85e22f810357aa5994ab61f236617dc2205f2f5b" + integrity sha512-th6TDfFqEmXvuViacU1ikD7xFb7lQsPn2rJl7OEmnfIVpnrx3QNY2t3PE88meeg0u/mQ0nkyvmC05PBqO4USFA== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^24.7.0" chalk "^2.0.1" - expect "^24.7.1" - jest-diff "^24.7.0" - jest-matcher-utils "^24.7.0" - jest-message-util "^24.7.1" - jest-resolve "^24.7.1" + jest-diff "^24.0.0" + jest-matcher-utils "^24.0.0" + jest-message-util "^24.0.0" + jest-resolve "^24.1.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^24.7.0" + pretty-format "^24.0.0" semver "^5.5.0" jest-specific-snapshot@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jest-specific-snapshot/-/jest-specific-snapshot-1.1.0.tgz#3eaa12a79105ebe73453e2e174c4c0014445d890" - integrity sha512-RXfqUh64epirdCkLvrM6hOEu7emxQWHUJ2+gh9IplJJ88hGCjWQh8ODwEfbQPSJ4lXVccX7Nw7HZ2QKBvOspUg== + version "1.0.0" + resolved "https://registry.yarnpkg.com/jest-specific-snapshot/-/jest-specific-snapshot-1.0.0.tgz#157c79e2534a6fea820fd475f5d17740c8f90833" + integrity sha512-EjCK8Ob8eneeQCdBuO06J1v1C1jklKK7VvCOG/iwQx+8byZ7iCY8+d9M7xlUJiu76ubycXtSkIrPrL+nqjJsjA== dependencies: - jest-snapshot "^23.6.0" + jest-snapshot ">=20.0.3" jest-styled-components@^6.2.2: version "6.3.1" @@ -14951,64 +15832,56 @@ jest-styled-components@^6.2.2: dependencies: css "^2.2.4" -jest-util@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.7.1.tgz#b4043df57b32a23be27c75a2763d8faf242038ff" - integrity sha512-/KilOue2n2rZ5AnEBYoxOXkeTu6vi7cjgQ8MXEkih0oeAXT6JkS3fr7/j8+engCjciOU1Nq5loMSKe0A1oeX0A== +jest-util@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.0.0.tgz#fd38fcafd6dedbd0af2944d7a227c0d91b68f7d6" + integrity sha512-QxsALc4wguYS7cfjdQSOr5HTkmjzkHgmZvIDkcmPfl1ib8PNV8QUWLwbKefCudWS0PRKioV+VbQ0oCUPC691fQ== dependencies: - "@jest/console" "^24.7.1" - "@jest/fake-timers" "^24.7.1" - "@jest/source-map" "^24.3.0" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" callsites "^3.0.0" chalk "^2.0.1" graceful-fs "^4.1.15" is-ci "^2.0.0" + jest-message-util "^24.0.0" mkdirp "^0.5.1" slash "^2.0.0" source-map "^0.6.0" -jest-validate@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.7.0.tgz#70007076f338528ee1b1c8a8258b1b0bb982508d" - integrity sha512-cgai/gts9B2chz1rqVdmLhzYxQbgQurh1PEQSvSgPZ8KGa1AqXsqC45W5wKEwzxKrWqypuQrQxnF4+G9VejJJA== +jest-validate@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.0.0.tgz#aa8571a46983a6538328fef20406b4a496b6c020" + integrity sha512-vMrKrTOP4BBFIeOWsjpsDgVXATxCspC9S1gqvbJ3Tnn/b9ACsJmteYeVx9830UMV28Cob1RX55x96Qq3Tfad4g== dependencies: - "@jest/types" "^24.7.0" camelcase "^5.0.0" chalk "^2.0.1" - jest-get-type "^24.3.0" + jest-get-type "^24.0.0" leven "^2.1.0" - pretty-format "^24.7.0" + pretty-format "^24.0.0" -jest-watcher@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.7.1.tgz#e161363d7f3f4e1ef3d389b7b3a0aad247b673f5" - integrity sha512-Wd6TepHLRHVKLNPacEsBwlp9raeBIO+01xrN24Dek4ggTS8HHnOzYSFnvp+6MtkkJ3KfMzy220KTi95e2rRkrw== +jest-watcher@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.0.0.tgz#20d44244d10b0b7312410aefd256c1c1eef68890" + integrity sha512-GxkW2QrZ4YxmW1GUWER05McjVDunBlKMFfExu+VsGmXJmpej1saTEKvONdx5RJBlVdpPI5x6E3+EDQSIGgl53g== dependencies: - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/yargs" "^12.0.9" ansi-escapes "^3.0.0" chalk "^2.0.1" - jest-util "^24.7.1" + jest-util "^24.0.0" string-length "^2.0.0" -jest-worker@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" - integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== +jest-worker@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0.tgz#3d3483b077bf04f412f47654a27bba7e947f8b6d" + integrity sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg== dependencies: merge-stream "^1.0.1" supports-color "^6.1.0" jest@^24.1.0: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.7.1.tgz#0d94331cf510c75893ee32f87d7321d5bf8f2501" - integrity sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA== + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.1.0.tgz#b1e1135caefcf2397950ecf7f90e395fde866fd2" + integrity sha512-+q91L65kypqklvlRFfXfdzUKyngQLOcwGhXQaLmVHv+d09LkNXuBuGxlofTFW42XMzu3giIcChchTsCNUjQ78A== dependencies: import-local "^2.0.0" - jest-cli "^24.7.1" + jest-cli "^24.1.0" jimp@0.6.0: version "0.6.0" @@ -15031,7 +15904,7 @@ jju@~1.4.0: resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= -joi@13.x.x, joi@^13.4.0, joi@^13.5.2: +joi@13.x.x, joi@^13.5.2: version "13.7.0" resolved "https://registry.yarnpkg.com/joi/-/joi-13.7.0.tgz#cfd85ebfe67e8a1900432400b4d03bbd93fb879f" integrity sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q== @@ -15040,61 +15913,71 @@ joi@13.x.x, joi@^13.4.0, joi@^13.5.2: isemail "3.x.x" topo "3.x.x" -joi@14.x.x: - version "14.3.1" - resolved "https://registry.yarnpkg.com/joi/-/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c" - integrity sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ== +joi@^13.4.0: + version "13.4.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-13.4.0.tgz#afc359ee3d8bc5f9b9ba6cdc31b46d44af14cecc" + integrity sha512-JuK4GjEu6j7zr9FuVe2MAseZ6si/8/HaY0qMAejfDFHp7jcH4OKE937mIHM5VT4xDS0q7lpQbszbxKV9rm0yUg== dependencies: - hoek "6.x.x" + hoek "5.x.x" isemail "3.x.x" topo "3.x.x" jpeg-js@^0.3.4: - version "0.3.5" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.5.tgz#6fbd6cd0e49627c5a0341796c9e50c70a2aa3673" - integrity sha512-hvaExqwmQDS8O9qnZAVDXGWU43Tbu1V0wMZmjROjT11jloSgGICZpscG+P6Nyi1BVAvyu2ARRx8qmEW30sxgdQ== + version "0.3.4" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.4.tgz#dc2ba501ee3d58b7bb893c5d1fab47294917e7e7" + integrity sha512-6IzjQxvnlT8UlklNmDXIJMWxijULjqGrzgqc0OG7YadZdvm7KPQ1j0ehmQQHckgEWOfgpptzcnWgESovxudpTA== + +jquery@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== -jquery@^3.2.1, jquery@^3.4.1: +jquery@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== -js-base64@^2.1.8, js-base64@^2.1.9: - version "2.5.1" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" - integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== +js-base64@^2.1.8: + version "2.4.5" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92" + integrity sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ== + +js-base64@^2.1.9: + version "2.4.3" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" + integrity sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw== js-beautify@^1.8.9: - version "1.10.0" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.0.tgz#9753a13c858d96828658cd18ae3ca0e5783ea672" - integrity sha512-OMwf/tPDpE/BLlYKqZOhqWsd3/z2N3KOlyn1wsCRGFwViE8LOQTcDtathQvHvZc+q+zWmcNAbwKSC+iJoMaH2Q== + version "1.9.1" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.9.1.tgz#6f9ef915f5d8d92b9f907606fce63795884c8040" + integrity sha512-oxxvVZdOdUfzk8IOLBF2XUZvl2GoBEfA+b0of4u2EBY/46NlXasi8JdFvazA5lCrf9/lQhTjyVy2QCUW7iq0MQ== dependencies: config-chain "^1.1.12" - editorconfig "^0.15.3" + editorconfig "^0.15.2" glob "^7.1.3" - mkdirp "~0.5.1" + mkdirp "~0.5.0" nopt "~4.0.1" js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + version "1.1.3" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" + integrity sha512-/812MXr9RBtMObviZ8gQBhHO8MOrGj8HlEE+4ccMTElNA/6I3u39u+bhny55Lk921yn44nSZFy9naNLElL5wgQ== js-stringify@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - js-yaml@3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.4.1.tgz#7183990c62f646369eaa04675b2d5f1e71d62b8b" @@ -15103,10 +15986,26 @@ js-yaml@3.4.1: argparse "~1.0.2" esprima "~2.2.0" -js-yaml@3.x, js-yaml@^3.10.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@3.x: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" + integrity sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.13.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" + integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -15150,66 +16049,64 @@ jsbn@~0.1.0: integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + version "11.5.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.5.1.tgz#5df753b8d0bca20142ce21f4f6c039f99a992929" + integrity sha512-89ztIZ03aYK9f1uUrLXLsZndRge/JnZjzjpaN+lrse3coqz+8PR/dX4WLHpbF5fIKTXhDjFODOJw2328lPJ90g== dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" + abab "^1.0.3" + acorn "^5.1.2" + acorn-globals "^4.0.0" array-equal "^1.0.0" + browser-process-hrtime "^0.1.2" + content-type-parser "^1.0.1" cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" + cssstyle ">= 0.2.37 < 0.3.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.1" + left-pad "^1.2.0" + nwmatcher "^1.4.3" + parse5 "^3.0.2" + pn "^1.0.0" + request "^2.83.0" + request-promise-native "^1.0.3" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.3" webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^6.3.0" + xml-name-validator "^2.0.1" jsdom@^12.0.0: - version "12.2.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-12.2.0.tgz#7cf3f5b5eafd47f8f09ca52315d367ff6e95de23" - integrity sha512-QPOggIJ8fquWPLaYYMoh+zqUmdphDtu1ju0QGTitZT1Yd8I5qenPpXM1etzUegu3MjVp8XPzgZxdn8Yj7e40ig== + version "12.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-12.0.0.tgz#043ffaac60605d87adf77a1ec3eb7686918b6b64" + integrity sha512-42RgZYXWwyClG0pN6Au7TExAQqRvzbtJhlcIvu58cJj4yr1bIbqZkgxHqn1btxKu80axZXPZLvldeTzg2auKow== dependencies: abab "^2.0.0" - acorn "^6.0.2" - acorn-globals "^4.3.0" + acorn "^5.7.1" + acorn-globals "^4.1.0" array-equal "^1.0.0" - cssom "^0.3.4" - cssstyle "^1.1.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" data-urls "^1.0.1" domexception "^1.0.1" escodegen "^1.11.0" html-encoding-sniffer "^1.0.2" - nwsapi "^2.0.9" + nwsapi "^2.0.8" parse5 "5.1.0" pn "^1.1.0" request "^2.88.0" request-promise-native "^1.0.5" - saxes "^3.1.3" + sax "^1.2.4" symbol-tree "^3.2.2" tough-cookie "^2.4.3" w3c-hr-time "^1.0.1" webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.2.0" + whatwg-encoding "^1.0.4" + whatwg-mimetype "^2.1.0" whatwg-url "^7.0.0" - ws "^6.1.0" + ws "^6.0.0" xml-name-validator "^3.0.0" jsesc@^1.3.0: @@ -15218,9 +16115,9 @@ jsesc@^1.3.0: integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= jsesc@~0.5.0: version "0.5.0" @@ -15232,7 +16129,12 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" + integrity sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw== + +json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -15335,11 +16237,11 @@ jsonpointer@^4.0.0: integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk= jsonwebtoken@^8.3.0: - version "8.5.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + version "8.3.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz#056c90eee9a65ed6e6c72ddb0a1d325109aaf643" + integrity sha512-oge/hvlmeJCH+iIz1DwcO7vKPkNGJHhgkspk8OH3VKlw+mbi42WtD4ig1+VXRln765vxptAv+xT26Fd3cteqag== dependencies: - jws "^3.2.2" + jws "^3.1.5" lodash.includes "^4.3.0" lodash.isboolean "^3.0.3" lodash.isinteger "^4.0.4" @@ -15348,7 +16250,6 @@ jsonwebtoken@^8.3.0: lodash.isstring "^4.0.1" lodash.once "^4.0.0" ms "^2.1.1" - semver "^5.6.0" jsprim@^1.2.2: version "1.4.1" @@ -15387,17 +16288,17 @@ jsts@1.1.2: resolved "https://registry.yarnpkg.com/jsts/-/jsts-1.1.2.tgz#d205d2cc8393081d9e484ae36282110695edc230" integrity sha1-0gXSzIOTCB2eSErjYoIRBpXtwjA= -jsx-ast-utils@^2.0.1, jsx-ast-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz#0ee4e2c971fb9601c67b5641b71be80faecf0b36" - integrity sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA== +jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + integrity sha1-6AGxs5mF4g//yHtA43SAgOLcrH8= dependencies: array-includes "^3.0.3" jszip@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.1.tgz#c5d32df7274042282b157efb16e522b43435e01a" - integrity sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.0.tgz#1c179e8692777490ca4e9b8f3ced08f9b820da2c" + integrity sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ== dependencies: lie "~3.3.0" pako "~1.0.2" @@ -15414,21 +16315,21 @@ just-reduce-object@^1.0.3: resolved "https://registry.yarnpkg.com/just-reduce-object/-/just-reduce-object-1.1.0.tgz#d29d172264f8511c74462de30d72d5838b6967e6" integrity sha512-nGyg7N9FEZsyrGQNilkyVLxKPsf96iel5v0DrozQ19ML+96HntyS/53bOP68iK/kZUGvsL3FKygV8nQYYhgTFw== -jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" - integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== +jwa@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" + integrity sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw== dependencies: buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" + ecdsa-sig-formatter "1.0.10" safe-buffer "^5.0.1" -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== +jws@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f" + integrity sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ== dependencies: - jwa "^1.4.1" + jwa "^1.1.5" safe-buffer "^5.0.1" karma-chrome-launcher@2.1.1: @@ -15538,7 +16439,7 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" -killable@^1.0.1: +killable@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== @@ -15555,7 +16456,7 @@ kind-of@^2.0.1: dependencies: is-buffer "^1.0.2" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= @@ -15569,7 +16470,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: +kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== @@ -15587,9 +16488,9 @@ klaw@^1.0.0: graceful-fs "^4.1.9" kleur@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + version "3.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.2.tgz#83c7ec858a41098b613d5998a7b653962b504f68" + integrity sha512-3h7B2WRT5LNXOtQiAaWonilegHcPSf9nLVXlSTci8lu1dZUuui61+EsPEZqSVxY7rXYmB2DVKMQILxaO5WL61Q== known-css-properties@^0.3.0: version "0.3.0" @@ -15602,16 +16503,17 @@ konva@^2.6.0: integrity sha512-LCOoavICTD9PYoAqtWo8sbxYtCiXdgEeY7vj/Sq8b2bwFmrQr9Ak0RkD4/jxAf5fcUQRL5e1zPLyfRpVndp20A== kopy@^8.2.0: - version "8.3.1" - resolved "https://registry.yarnpkg.com/kopy/-/kopy-8.3.1.tgz#1f5ed132541fa01bc93af847fdf4d7addbba764d" - integrity sha512-J7pIymW+xeeCmxO90SXvcmpJGRDQNg0uLr4uurUugfh58uZ2Tcys905h7Pv3y+y3yEZmARrXqMXmsrA4ZTu50g== + version "8.2.5" + resolved "https://registry.yarnpkg.com/kopy/-/kopy-8.2.5.tgz#6c95f312e981ab917680d7e5de3cdf29a1bf221f" + integrity sha512-+U+LMXZtpRjU5JSGNsXeUG3k/Xvf+7NBQTdP7PxzUNBzLNkyoWxbDkvRchNFh3ANcucJKX/s6+cGxmmPUBBtww== dependencies: inquirer "^3.2.3" is-binary-path "^2.0.0" jstransformer "^1.0.0" jstransformer-ejs "^0.0.3" - majo "^0.5.1" - micromatch "^3.1.10" + majo "^0.4.1" + minimatch "^3.0.4" + multimatch "^2.1.0" path-exists "^3.0.0" kuler@1.0.x: @@ -15645,6 +16547,13 @@ lazy-cache@^1.0.3: resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= +lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= + dependencies: + set-getter "^0.1.0" + lazy-universal-dotenv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-2.0.0.tgz#e015ad9f77be9ef811956d53ea9519b1c0ab0214" @@ -15711,10 +16620,10 @@ leaflet@1.0.3: resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.0.3.tgz#1f401b98b45c8192134c6c8d69686253805007c8" integrity sha1-H0AbmLRcgZITTGyNaWhiU4BQB8g= -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== +left-pad@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" + integrity sha1-0wpzxrggHY99jnlWupYWCHpo4O4= less-loader@4.1.0: version "4.1.0" @@ -15739,7 +16648,7 @@ less@^2.7.3: request "2.81.0" source-map "^0.5.3" -leven@2.1.0, leven@^2.1.0: +leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= @@ -15775,7 +16684,7 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" -liftoff@^2.1.0, liftoff@~2.5.0: +liftoff@^2.1.0: version "2.5.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= @@ -15799,9 +16708,9 @@ linebreak@^0.3.0: unicode-trie "^0.3.0" linkify-it@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db" - integrity sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" + integrity sha1-2UpGSPmxwXnWT6lykSaL22zpQ08= dependencies: uc.micro "^1.0.1" @@ -15810,10 +16719,10 @@ listr-silent-renderer@^1.1.1: resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== +listr-update-renderer@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7" + integrity sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc= dependencies: chalk "^1.1.3" cli-truncate "^0.2.1" @@ -15821,33 +16730,40 @@ listr-update-renderer@^0.5.0: figures "^1.7.0" indent-string "^3.0.0" log-symbols "^1.0.2" - log-update "^2.3.0" + log-update "^1.0.2" strip-ansi "^3.0.1" -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== +listr-verbose-renderer@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" + integrity sha1-ggb0z21S3cWCfl/RSYng6WWTOjU= dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" + chalk "^1.1.3" + cli-cursor "^1.0.2" date-fns "^1.27.2" - figures "^2.0.0" + figures "^1.7.0" listr@^0.14.1: - version "0.14.3" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + version "0.14.1" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d" + integrity sha512-MSMUUVN1f8aRnPi4034RkOqdiUlpYW+FqwFE3aL0uYNPRavkt2S2SsSpDDofn8BDpqv2RNnsdOcCHWsChcq77A== dependencies: "@samverschueren/stream-to-observable" "^0.3.0" + cli-truncate "^0.2.1" + figures "^1.7.0" + indent-string "^2.1.0" is-observable "^1.1.0" is-promise "^2.1.0" is-stream "^1.1.0" listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" - rxjs "^6.3.3" + listr-update-renderer "^0.4.0" + listr-verbose-renderer "^0.4.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + ora "^0.2.3" + p-map "^1.1.1" + rxjs "^6.1.0" + strip-ansi "^3.0.1" livereload-js@^2.3.0: version "2.4.0" @@ -15920,12 +16836,17 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -loader-runner@^2.3.0, loader-runner@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + integrity sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI= + +loader-runner@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" + integrity sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw== -loader-utils@1.1.0: +loader-utils@1.1.0, loader-utils@^1.0.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= @@ -15934,7 +16855,7 @@ loader-utils@1.1.0: emojis-list "^2.0.0" json5 "^0.5.0" -loader-utils@1.2.3, loader-utils@^1.0.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.0.4, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@1.2.3, loader-utils@^1.0.4, loader-utils@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -15964,11 +16885,21 @@ locutus@^2.0.5: resolved "https://registry.yarnpkg.com/locutus/-/locutus-2.0.10.tgz#f903619466a98a4ab76e8b87a5854b55a743b917" integrity sha512-AZg2kCqrquMJ5FehDsBidV0qHl98NrsYtseUClzjAQ3HFnsDBJTCwGVplSQ82t9/QfgahqvTjaKcZqZkHmS0wQ== -lodash-es@^4.17.11, lodash-es@^4.17.4, lodash-es@^4.2.1: +lodash-es@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" integrity sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q== +lodash-es@^4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" + integrity sha1-3MHXVS4VCgZABzupyzHXDwMpUOc= + +lodash-es@^4.17.5, lodash-es@^4.2.1: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.10.tgz#62cd7104cdf5dd87f235a837f0ede0e8e5117e05" + integrity sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg== + lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" @@ -16057,7 +16988,7 @@ lodash.clone@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= -lodash.clonedeep@^4.5.0: +lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= @@ -16217,7 +17148,7 @@ lodash.merge@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== -lodash.mergewith@^4.6.1: +lodash.mergewith@^4.6.0, lodash.mergewith@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== @@ -16365,16 +17296,16 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= +lodash@>4.17.4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.1, lodash@~4.17.10, lodash@~4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + lodash@^3.10.0, lodash@^3.10.1, lodash@^3.3.1, lodash@^3.8.0, lodash@~3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.1, lodash@~4.17.10, lodash@~4.17.5: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - "lodash@npm:@elastic/lodash@3.10.1-kibana1": version "3.10.1-kibana1" resolved "https://registry.yarnpkg.com/@elastic/lodash/-/lodash-3.10.1-kibana1.tgz#9baa52c296ec06a52461f8516bb94172ef53a7fe" @@ -16412,14 +17343,13 @@ log-symbols@^2.1.0, log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= +log-update@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" + integrity sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE= dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" + ansi-escapes "^1.0.0" + cli-cursor "^1.0.2" log4js@^3.0.0: version "3.0.6" @@ -16443,7 +17373,7 @@ logform@^1.9.1: ms "^2.1.1" triple-beam "^1.2.0" -loglevel@^1.6.1: +loglevel@^1.4.1, loglevel@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= @@ -16457,14 +17387,14 @@ loglevelnext@^1.0.1: object.assign "^4.1.0" lolex@^2.3.2: - version "2.7.5" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" - integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== + version "2.6.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.6.0.tgz#cf9166f3c9dece3cdeb5d6b01fce50f14a1203e3" + integrity sha512-e1UtIo1pbrIqEXib/yMjHciyqkng5lc0rrIbytgjmRgDR9+2ceNIAcwOWSgylRjoEP9VdVguCSRwnNmlbnOUwA== -lolex@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.0.1.tgz#4a99c2251579d693c6a083446dae0e5c3844d3fa" - integrity sha512-UHuOBZ5jjsKuzbB/gRNNW8Vg8f00Emgskdq2kvZxgBJCS0aqquAuXai/SkWORlKeZEiNQWZjFZOqIUcH9LqKCw== +lolex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-3.0.0.tgz#f04ee1a8aa13f60f1abd7b0e8f4213ec72ec193e" + integrity sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ== long@^2.4.0: version "2.4.0" @@ -16476,13 +17406,20 @@ longest@^1.0.1: resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" +loose-envify@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + integrity sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg= + dependencies: + js-tokens "^3.0.0" + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -16514,11 +17451,10 @@ lowercase-keys@^1.0.0: integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lowlight@~1.9.1: - version "1.9.2" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.9.2.tgz#0b9127e3cec2c3021b7795dd81005c709a42fdd1" - integrity sha512-Ek18ElVCf/wF/jEm1b92gTnigh94CtBNWiZ2ad+vTgW7cTmQxUY3I98BjHK68gZAJEWmybGBZgx9qv3QxLQB/Q== + version "1.9.1" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.9.1.tgz#ed7c3dffc36f8c1f263735c0fe0c907847c11250" + integrity sha512-CpDhyVhI+xHjruiGvH2F/Fr5q5aTn5A6Oyh7MI+4oI8G0A1E7p9a3Zqv9Hzx9WByK8gAiNifEueAXz+cA2xdEA== dependencies: - fault "^1.0.2" highlight.js "~9.12.0" lru-cache@2, lru-cache@^2.6.5: @@ -16534,7 +17470,15 @@ lru-cache@4.1.1: pseudomap "^1.0.2" yallist "^2.1.2" -lru-cache@4.1.x, lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.3, lru-cache@^4.1.5: +lru-cache@4.1.x, lru-cache@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" + integrity sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +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== @@ -16542,6 +17486,14 @@ lru-cache@4.1.x, lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^4.1.1, lru-cache@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -16566,59 +17518,43 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= +macos-release@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-1.1.0.tgz#831945e29365b470aa8724b0ab36c8f8959d10fb" + integrity sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA== + macos-release@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.2.0.tgz#ab58d55dd4714f0a05ad4b0e90f4370fef5cdea8" integrity sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA== -magic-string@^0.22.4: - version "0.22.5" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" - integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== - dependencies: - vlq "^0.2.2" - -majo@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/majo/-/majo-0.5.1.tgz#c1948544c24d29835beed10ef4574cff22a76dad" - integrity sha1-wZSFRMJNKYNb7tEO9FdM/yKnba0= +majo@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/majo/-/majo-0.4.1.tgz#5e6eeb9b63bda77e59d396b9c9ce4189ce6100bc" + integrity sha512-+Ys9ffqdJP9IAE8V8J6xSpemt1i6aleHhpk9R+K0GBkUKd6PE/oOW7GR9FFB5jHodxmX0lWeOezBc5OSoywDhw== dependencies: fs-extra "^3.0.1" globby "^6.1.0" + ware "^1.3.0" -make-dir@^1.0.0: +make-dir@^1.0.0, make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" - integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== - dependencies: - semver "^6.0.0" - make-error@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== make-iterator@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" - integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.0.tgz#57bef5dc85d23923ba23767324d8e8f8f3d9694b" + integrity sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs= dependencies: - kind-of "^6.0.2" + kind-of "^3.1.0" makeerror@1.0.x: version "1.0.11" @@ -16633,9 +17569,9 @@ mamacro@^0.0.3: integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + version "0.1.2" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" + integrity sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ== dependencies: p-defer "^1.0.0" @@ -16649,6 +17585,11 @@ map-obj@^1.0.0, map-obj@^1.0.1: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + map-or-similar@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" @@ -16692,9 +17633,9 @@ mapbox-gl@0.52.0: vt-pbf "^3.0.1" markdown-escapes@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.2.tgz#e639cbde7b99c841c0bacc8a07982873b46d2122" - integrity sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.1.tgz#1994df2d3af4811de59a6714934c2b2292734518" + integrity sha1-GZTfLTr0gR3lmmcUk0wrIpJzRRg= markdown-it@^8.4.1: version "8.4.2" @@ -16708,9 +17649,9 @@ markdown-it@^8.4.1: uc.micro "^1.0.5" markdown-to-jsx@^6.9.1: - version "6.9.4" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.9.4.tgz#ed1e6925e643f7a0ee2fed90f28d16b4402aad09" - integrity sha512-Fvx2ZhiknGmcLsWVjIq6MmiN9gcCot8w+jzwN2mLXZcQsJGRN3Zes5Sp5M9YNIzUy/sDyuOTjimFdtAcvvmAPQ== + version "6.9.3" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.9.3.tgz#31719e3c54517ba9805db81d53701b89f5d2ed7e" + integrity sha512-iXteiv317VZd1vk/PBH5MWMD4r0XWekoWCHRVVadBcnCtxavhtfV1UaEaQgq9KyckTv31L60ASh5ZVVrOh37Qg== dependencies: prop-types "^15.6.2" unquote "^1.1.0" @@ -16730,23 +17671,17 @@ marksy@^6.1.0: marked "^0.3.12" material-colors@^1.2.1: - version "1.2.6" - resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" - integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== - -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + version "1.2.5" + resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.5.tgz#5292593e6754cb1bcc2b98030e4e0d6a3afc9ea1" + integrity sha1-UpJZPmdUyxvMK5gDDk4Najr8nqE= md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + integrity sha1-6b296UogpawYsENA/Fdk1bCdkB0= dependencies: hash-base "^3.0.0" inherits "^2.0.1" - safe-buffer "^5.1.2" mdast-add-list-metadata@1.0.1: version "1.0.1" @@ -16803,23 +17738,28 @@ mem@^1.1.0: mimic-fn "^1.0.0" mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + version "4.0.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA== dependencies: map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" + mimic-fn "^1.0.0" + p-is-promise "^1.1.0" memoize-one@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.1.0.tgz#a2387c58c03fff27ca390c31b764a79addf3f906" - integrity sha512-2GApq0yI/b22J2j9rhbrAlsHb0Qcz+7yWxeLG8h+95sl1XPUgeLimQSOdur4Vw7cUhrBHwaUZxWFZueojqNRzA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.0.2.tgz#3fb8db695aa14ab9c0f1644e1585a8806adc1aee" + integrity sha512-ucx2DmXTeZTsS4GPPUZCbULAN7kdPT1G+H49Y34JjbQ5ESc6OGhVxKvb1iKhr9v19ZB9OtnHwNnhUnNR/7Wteg== -memoize-one@^5.0.0, memoize-one@^5.0.1: - version "5.0.4" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.4.tgz#005928aced5c43d890a4dfab18ca908b0ec92cbc" - integrity sha512-P0z5IeAH6qHHGkJIXWw0xC2HNEgkx/9uWWBQw64FJj3/ol14VYdfVGWWr0fXfjhhv3TKVIqUq65os6O4GUNksA== +memoize-one@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.1.tgz#35a709ffb6e5f0cb79f9679a96f09ec3a35addfa" + integrity sha512-S3plzyksLOSF4pkf1Xlb7mA8ZRKZlgp3ebg7rULbfwPT8Ww7uZz5CbLgRKaR92GeXpsNiFbfCRWf/uOrCYIbRg== + +memoize-one@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.2.tgz#6aba5276856d72fb44ead3efab86432f94ba203d" + integrity sha512-o7lldN4fs/axqctc03NF+PMhd2veRrWeJ2n2GjEzUPBD4F9rmNg4A+bQCACIzwjHJEXuYv4aFFMaH35KZfHUrw== memoizee@0.4.X: version "0.4.14" @@ -16844,7 +17784,7 @@ memoizerific@^1.11.3: memory-fs@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" integrity sha1-8rslNovBIeORwlIN6Slpyu4KApA= memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: @@ -16885,13 +17825,6 @@ merge-descriptors@1.0.1, merge-descriptors@~1.0.0: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-source-map@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" - integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= - dependencies: - source-map "^0.5.6" - merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" @@ -16899,17 +17832,17 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" -merge2@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" - integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== +merge2@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.1.tgz#271d2516ff52d4af7f7b710b8bf3e16e183fef66" + integrity sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg== -merge@^1.2.0: +merge@^1.1.3, merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== -methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: +methods@^1.1.1, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= @@ -16921,18 +17854,17 @@ micro-compress@1.0.0: dependencies: compression "^1.6.2" -micro@9.3.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/micro/-/micro-9.3.1.tgz#0c37eba0171554b1beccda5215ff8ea4e7aa59d6" - integrity sha512-83uimpPJqfwkfKvJl2WWontBlV3hmzrIgyJ+L2uhDXKNk7Ll+/ezK3zBz7TljubpKPqjM0JdT2Ker4MTPmhjgA== +micro@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/micro/-/micro-9.1.0.tgz#f2effba306639076e994c007c327dfc36a5185e9" + integrity sha512-0Ap4bXS9MyInYSLBe/5u+qEBY3VgcOTQlAt5wGc3DN/Rk4IH+PdRI47x3/xWBxQWt0ISRgmE4+U72sfm4ksthg== dependencies: - arg "2.0.0" - chalk "2.4.0" content-type "1.0.4" is-stream "1.1.0" + mri "1.1.0" raw-body "2.3.2" -micromatch@3.1.10, micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@3.1.10, micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -16951,6 +17883,25 @@ micromatch@3.1.10, micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, mic snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" + integrity sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.0" + define-property "^1.0.0" + extend-shallow "^2.0.1" + extglob "^2.0.2" + fragment-cache "^0.2.1" + kind-of "^6.0.0" + nanomatch "^1.2.5" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" @@ -16978,16 +17929,21 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.40.0, mime-db@1.x.x, "mime-db@>= 1.40.0 < 2": - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== +mime-db@1.x.x, "mime-db@>= 1.33.0 < 2", mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== +mime-db@~1.38.0: + version "1.38.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" + integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== + mime-types@2.1.18: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" @@ -16995,12 +17951,19 @@ mime-types@2.1.18: dependencies: mime-db "~1.33.0" -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.7: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.21" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" + integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== + dependencies: + mime-db "~1.37.0" + +mime-types@~2.1.7: + version "2.1.22" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" + integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== dependencies: - mime-db "1.40.0" + mime-db "~1.38.0" mime@1.4.1: version "1.4.1" @@ -17013,20 +17976,15 @@ mime@^1.2.11, mime@^1.3.4, mime@^1.4.1: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.0.3, mime@^2.2.2, mime@^2.3.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78" - integrity sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg== + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + integrity sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -17038,11 +17996,11 @@ mimic-response@^2.0.0: integrity sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ== mimos@4.x.x: - version "4.0.2" - resolved "https://registry.yarnpkg.com/mimos/-/mimos-4.0.2.tgz#f2762d7c60118ce51c2231afa090bc335d21d0f8" - integrity sha512-5XBsDqBqzSN88XPPH/TFpOalWOjHJM5Z2d3AMx/30iq+qXvYKd/8MPhqBwZDOLtoaIWInR3nLzMQcxfGK9djXA== + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimos/-/mimos-4.0.0.tgz#76e3d27128431cb6482fd15b20475719ad626a5a" + integrity sha512-JvlvRLqGIlk+AYypWrbrDmhsM+6JVx/xBM5S3AMwTBz1trPCEoPN/swO2L4Wu653fL7oJdgk8DMQyG/Gq3JkZg== dependencies: - hoek "6.x.x" + hoek "5.x.x" mime-db "1.x.x" min-document@^2.19.0: @@ -17070,10 +18028,10 @@ mini-css-extract-plugin@^0.5.0: schema-utils "^1.0.0" webpack-sources "^1.1.0" -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + integrity sha1-cCvi3aazf0g2vLP121ZkG2Sh09M= minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" @@ -17141,14 +18099,22 @@ minimist@~0.0.1: integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= minimost@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimost/-/minimost-1.2.0.tgz#a37f91d60395fc003180d208ca9e0316bcc4e3a2" - integrity sha512-/+eWyOtXw41WIUV9rBgrXna11bxbqymebSeW2arsfp/MCGCwe+2czzsOueEtLZgH4xb4QXhje5H9MLCsCPibLA== + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimost/-/minimost-1.0.0.tgz#1d07954aa0268873408b95552fbffc5977dfc78b" + integrity sha1-HQeVSqAmiHNAi5VVL7/8WXffx4s= dependencies: - "@types/minimist" "^1.2.0" + camelcase-keys "^4.0.0" minimist "^1.2.0" -minipass@^2.2.1, minipass@^2.2.4, minipass@^2.3.4: +minipass@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.0.tgz#2e11b1c46df7fe7f1afbe9a490280add21ffe384" + integrity sha512-jWC2Eg+Np4bxah7llu1IrUNSJQxtLz/J+pOjTM0nFpJXGAaV18XBWhUn031Q1tAA/TJtA1jgwnOe9S2PQa4Lbg== + dependencies: + safe-buffer "^5.1.1" + yallist "^3.0.0" + +minipass@^2.2.4, minipass@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -17156,13 +18122,20 @@ minipass@^2.2.1, minipass@^2.2.4, minipass@^2.3.4: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.0, minizlib@^1.1.1: +minizlib@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== dependencies: minipass "^2.2.1" +minizlib@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" + integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== + dependencies: + minipass "^2.2.1" + mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" @@ -17196,9 +18169,9 @@ mississippi@^3.0.0: through2 "^2.0.0" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" + integrity sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -17292,21 +18265,26 @@ moment-duration-format@^1.3.0: integrity sha1-VBdxtfh6BJzGVUBHXTrZZnN9aQg= moment-timezone@^0.5.14: - version "0.5.25" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.25.tgz#a11bfa2f74e088327f2cd4c08b3e7bdf55957810" - integrity sha512-DgEaTyN/z0HFaVcVbSyVCUU6HeFdnNC3vE4c9cgu2dgMTvjBUBdBzWfasTBmAW45u5OIMeCJtU8yNjM22DHucw== + version "0.5.14" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.14.tgz#4eb38ff9538b80108ba467a458f3ed4268ccfcb1" + integrity sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE= dependencies: moment ">= 2.9.0" -moment@2.22.2: +moment@2.22.2, moment@>=2.14.0: version "2.22.2" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= -"moment@>= 2.9.0", moment@>=2.14.0, moment@^2.10.6, moment@^2.13.0, moment@^2.20.1: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== +"moment@>= 2.9.0", moment@^2.13.0, moment@^2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" + integrity sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg== + +moment@^2.10.6: + version "2.21.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" + integrity sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ== monaco-editor@^0.14.3: version "0.14.3" @@ -17380,7 +18358,7 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -multimatch@^2.0.0: +multimatch@^2.0.0, multimatch@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= @@ -17415,16 +18393,11 @@ murmurhash3js@3.0.1: resolved "https://registry.yarnpkg.com/murmurhash3js/-/murmurhash3js-3.0.1.tgz#3e983e5b47c2a06f43a713174e7e435ca044b998" integrity sha1-Ppg+W0fCoG9DpxMXTn5DXKBEuZg= -mustache@2.3.0: +mustache@2.3.0, mustache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" integrity sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA= -mustache@^2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" - integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== - mutation-observer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/mutation-observer/-/mutation-observer-1.0.3.tgz#42e9222b101bca82e5ba9d5a7acf4a14c0f263d0" @@ -17454,21 +18427,44 @@ mz@^2.6.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.11.1, nan@^2.12.1, nan@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" - integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== +nan@^2.10.0, nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== + +nan@^2.11.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" + integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== + +nanomatch@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" + integrity sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + is-odd "^1.0.0" + kind-of "^5.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + integrity sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" + is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" @@ -17503,20 +18499,25 @@ nearley@^2.7.10: semver "^5.4.1" needle@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.1.tgz#d272f2f4034afb9c4c9ab1379aabc17fc85c9388" - integrity sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg== + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== dependencies: - debug "^4.1.0" + debug "^2.1.2" iconv-lite "^0.4.4" sax "^1.2.4" -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= + +neo-async@^2.5.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" + integrity sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw== -neo-async@^2.5.0, neo-async@^2.6.0: +neo-async@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== @@ -17528,10 +18529,12 @@ nested-error-stacks@^1.0.0: dependencies: inherits "~2.0.1" -nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" - integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== +nested-error-stacks@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.0.0.tgz#98b2ffaefb4610fa3936f1e71435d30700de2840" + integrity sha1-mLL/rvtGEPo5NvHnFDXTBwDeKEA= + dependencies: + inherits "~2.0.1" nested-object-assign@^1.0.1: version "1.0.3" @@ -17546,44 +18549,39 @@ newtype-ts@^0.2.4: fp-ts "^1.0.0" monocle-ts "^1.0.0" -next-tick@1, next-tick@^1.0.0: +next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= -ngreact@0.5.1: +ngreact@0.5.1, ngreact@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/ngreact/-/ngreact-0.5.1.tgz#2dcccc1541771796689d13e51bb8d5010af41c57" integrity sha512-u/jOWS0KF/twS09O+yuBgNNEEytEhrmSfLTewAuglDSfEYru6a4I8tUnU4fs9/WvlRWbvJTk7WEnwbGamM+Kvg== -ngreact@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/ngreact/-/ngreact-0.5.2.tgz#d48180b578b186ad70861a3de9ba508b3f22b2ae" - integrity sha512-FCQGtTkDrnI3ywhvK9wUf7C6SYfqKDdRW+cPvy358GFe3AnA4rfvWisDVUQyf5YwNr439ito9xUuuEv80QXhSQ== - nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + integrity sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA== nigel@3.x.x: - version "3.0.4" - resolved "https://registry.yarnpkg.com/nigel/-/nigel-3.0.4.tgz#edcd82f2e9387fe34ba21e3127ae4891547c7945" - integrity sha512-3SZCCS/duVDGxFpTROHEieC+itDo4UqL9JNUyQJv3rljudQbK6aqus5B4470OxhESPJLN93Qqxg16rH7DUjbfQ== + version "3.0.1" + resolved "https://registry.yarnpkg.com/nigel/-/nigel-3.0.1.tgz#48a08859d65177312f1c25af7252c1e07bb07c2a" + integrity sha512-kCVtUG9JyD//tsYrZY+/Y+2gUrANVSba8y23QkM5Znx0FOxlnl9Z4OVPBODmstKWTOvigfTO+Va1VPOu3eWSOQ== dependencies: - hoek "6.x.x" + hoek "5.x.x" vise "3.x.x" -nise@^1.4.10: - version "1.4.10" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.10.tgz#ae46a09a26436fae91a38a60919356ae6db143b6" - integrity sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA== +nise@^1.4.7: + version "1.4.8" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.8.tgz#ce91c31e86cf9b2c4cac49d7fcd7f56779bfd6b0" + integrity sha512-kGASVhuL4tlAV0tvA34yJYZIVihrUt/5bDwpp4tTluigxUr2bBlJeDXmivb6NuEdFkqvdv/Ybb9dm16PSKUhtw== dependencies: "@sinonjs/formatio" "^3.1.0" - "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" lolex "^2.3.2" path-to-regexp "^1.7.0" + text-encoding "^0.6.4" no-case@^2.2.0, no-case@^2.3.2: version "2.3.2" @@ -17644,15 +18642,20 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.0.0, node-fetch@^2.1.1, node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.3.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.5.0.tgz#8028c49fc1191bba56a07adc6e2a954644a48501" - integrity sha512-YuZKluhWGJwCcUu4RlZstdAxr8bFfOVHakc1mplwHkk8J+tqM1Y5yraYvIUpeX8aY7+crCwiELJq7Vl0o0LWXw== +node-fetch@^2.0.0, node-fetch@^2.1.1, node-fetch@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.1.tgz#1fe551e0ded6c45b3b3b937d0fb46f76df718d1e" + integrity sha512-ObXBpNCD3A/vYQiQtEWl7DuqjAXjfptYFuGHLdPl5U19/6kJuZV+8uMHLrkj3wJrJoyfg4nhgyFixZdaZoAiEQ== -node-forge@0.7.5: - version "0.7.5" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" - integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== +node-fetch@^2.2.0, node-fetch@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== + +node-forge@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300" + integrity sha1-naYR6giYL0uUIGs760zJZl8gwwA= node-gyp@^3.8.0: version "3.8.0" @@ -17678,9 +18681,9 @@ node-int64@^0.4.0: integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= "node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -17689,7 +18692,7 @@ node-int64@^0.4.0: constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^3.0.0" + events "^1.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" path-browserify "0.0.0" @@ -17703,7 +18706,7 @@ node-int64@^0.4.0: timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.11.0" + util "^0.10.3" vm-browserify "0.0.4" node-modules-regexp@^1.0.0: @@ -17712,20 +18715,19 @@ node-modules-regexp@^1.0.0: integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-notifier@^5.2.1: - version "5.4.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" - integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== dependencies: growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" + semver "^5.4.1" shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" - integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -17738,10 +18740,10 @@ node-pre-gyp@^0.11.0: semver "^5.3.0" tar "^4" -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== +node-pre-gyp@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" + integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -17754,17 +18756,31 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.17, node-releases@^1.1.3: - version "1.1.17" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.17.tgz#71ea4631f0a97d5cd4f65f7d04ecf9072eac711a" - integrity sha512-/SCjetyta1m7YXLgtACZGDYJdCSIBAWorDWkGCGZlydP2Ll7J48l7j/JxNYZ+xsgSPbWfdulVS/aY+GdjUsQ7Q== +node-releases@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.11.tgz#9a0841a4b0d92b7d5141ed179e764f42ad22724a" + integrity sha512-8v1j5KfP+s5WOTa1spNUAOfreajQPN12JXbRR0oDE+YrJBQCXBnNqUDj27EKpPLOoSiU3tKi3xGPB+JaOdUEQQ== + dependencies: + semver "^5.3.0" + +node-releases@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.3.tgz#aad9ce0dcb98129c753f772c0aa01360fb90fbd2" + integrity sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ== + dependencies: + semver "^5.3.0" + +node-releases@^1.1.8: + version "1.1.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.10.tgz#5dbeb6bc7f4e9c85b899e2e7adcc0635c9b2adf7" + integrity sha512-KbUPCpfoBvb3oBkej9+nrU0/7xPlVhmhhUJ1PZqwIP5/1dJkRWKWD3OONjo6M2J7tSCBtDCumLwwqeI+DWWaLQ== dependencies: semver "^5.3.0" node-sass@^4.9.4: - version "4.12.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" - integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ== + version "4.9.4" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.4.tgz#349bd7f1c89422ffe7e1e4b60f2055a69fbc5512" + integrity sha512-MXyurANsUoE4/6KmfMkwGcBzAnJQ5xJBGW7Ei6ea8KnUKuzHr/SguVBIi3uaUAHtZCPUYkvlJ3Ef5T5VAwVpaA== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -17773,10 +18789,12 @@ node-sass@^4.9.4: get-stdin "^4.0.1" glob "^7.0.3" in-publish "^2.0.0" - lodash "^4.17.11" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" meow "^3.7.0" mkdirp "^0.5.1" - nan "^2.13.2" + nan "^2.10.0" node-gyp "^3.8.0" npmlog "^4.0.0" request "^2.88.0" @@ -17789,10 +18807,10 @@ node-status-codes@^1.0.0: resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" integrity sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8= -node-version@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.1.3.tgz#1081c87cce6d2dbbd61d0e51e28c287782678496" - integrity sha512-rEwE51JWn0yN3Wl5BXeGn5d52OGbSXzWiiXRjAQeuyvcGKyvuSILW2rb3G7Xh+nexzLwhTpek6Ehxd6IjvHePg== +node-version@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.1.0.tgz#f437d7ba407e65e2c4eaef8887b1718ba523d4f0" + integrity sha512-t1V2RFiaTavaW3jtQO0A2nok6k7/Gghuvx2rjvICuT0B0dYaObBQ4U0xHL+ZTPFZodt1LMYG2Vi2nypfz4/AJg== node-version@^1.0.0: version "1.2.0" @@ -17807,9 +18825,9 @@ nodegit-promise@~4.0.0: asap "~2.0.3" nodemailer@^4.6.4: - version "4.7.0" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.7.0.tgz#4420e06abfffd77d0618f184ea49047db84f4ad8" - integrity sha512-IludxDypFpYw4xpzKdMAozBSkzKHmNBvGanUREjJItgJ2NYcK/s8+PggVhj7c2yGFQykKsnnmv1+Aqo0ZfjHmw== + version "4.6.4" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.6.4.tgz#f0d72d0c6a6ec5f4369fa8f4bf5127a31baa2014" + integrity sha512-SD4uuX7NMzZ5f5m1XHDd13J4UC3SmdJk8DsmU1g6Nrs5h3x9LcXr6EBPZIqXRJ3LrF7RdklzGhZRF/TuylTcLg== "nopt@2 || 3", nopt@3.x, nopt@~3.0.6: version "3.0.6" @@ -17841,12 +18859,12 @@ nopt@~1.0.10: abbrev "1" normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" - resolve "^1.10.0" + is-builtin-module "^1.0.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" @@ -17882,16 +18900,16 @@ normalize-url@^3.3.0: integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== now-and-later@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" - integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + version "2.0.0" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" + integrity sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4= dependencies: once "^1.3.2" npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + integrity sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow== npm-conf@^1.1.0, npm-conf@^1.1.3: version "1.1.3" @@ -17910,9 +18928,9 @@ npm-keyword@^5.0.0: registry-url "^3.0.3" npm-packlist@^1.1.6: - version "1.4.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" - integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + integrity sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -17977,12 +18995,17 @@ numeral@^2.0.6: resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" integrity sha1-StCAk21EPCVhrtnyGX7//iX05QY= -nwsapi@^2.0.7, nwsapi@^2.0.9: - version "2.1.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" - integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== +nwmatcher@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" + integrity sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw== -oauth-sign@~0.8.1: +nwsapi@^2.0.8: + version "2.0.9" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" + integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= @@ -18031,20 +19054,30 @@ object-inspect@^1.6.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== -object-inspect@~1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" - integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== +object-inspect@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.4.0.tgz#f5157c116c1455b243b06ee97703392c5ad89fec" + integrity sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w= object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY= -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" + integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg== + +object-keys@^1.0.6: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + integrity sha1-xUYBd4rVYPEULODgG8yotW0TQm0= + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= object-path-immutable@^0.5.3: version "0.5.3" @@ -18083,7 +19116,7 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" -object.entries@^1.0.4, object.entries@^1.1.0: +object.entries@^1.0.4: version "1.1.0" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== @@ -18093,7 +19126,17 @@ object.entries@^1.0.4, object.entries@^1.1.0: function-bind "^1.1.1" has "^1.0.3" -object.fromentries@^2.0.0, "object.fromentries@^2.0.0 || ^1.0.0": +object.fromentries@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-1.0.0.tgz#e90ec27445ec6e37f48be9af9077d9aa8bef0d40" + integrity sha512-F7XUm84lg0uNXNzrRAC5q8KJe0yYaxgLU9hTSqWYM6Rfnh0YjP24EG3xq7ncj2Wu1AdfueNHKCOlamIonG4UHQ== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.11.0" + function-bind "^1.1.1" + has "^1.0.1" + +object.fromentries@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== @@ -18151,10 +19194,10 @@ object.values@^1.0.4, object.values@^1.1.0: function-bind "^1.1.1" has "^1.0.3" -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + integrity sha1-EEEktsYCxnlogaBCVB0220OlJk4= octokit-pagination-methods@^1.1.0: version "1.1.0" @@ -18173,10 +19216,10 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: version "1.4.0" @@ -18199,7 +19242,7 @@ one-time@0.0.4: onetime@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= onetime@^2.0.0: @@ -18221,43 +19264,29 @@ opentracing@^0.13.0: opentracing@^0.14.0: version "0.14.3" - resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.3.tgz#23e3ad029fa66a653926adbe57e834469f8550aa" - integrity sha1-I+OtAp+mamU5Jq2+V+g0Rp+FUKo= - -opn@*: - version "6.0.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-6.0.0.tgz#3c5b0db676d5f97da1233d1ed42d182bc5a27d2d" - integrity sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ== - dependencies: - is-wsl "^1.1.0" + resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.3.tgz#23e3ad029fa66a653926adbe57e834469f8550aa" + integrity sha1-I+OtAp+mamU5Jq2+V+g0Rp+FUKo= -opn@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" - integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== +opn@5.2.0, opn@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" + integrity sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ== dependencies: is-wsl "^1.1.0" -opn@5.4.0: +opn@5.4.0, opn@^5.3.0, opn@^5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw== dependencies: is-wsl "^1.1.0" -opn@^5.3.0, opn@^5.4.0, opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - oppsy@2.x.x, oppsy@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/oppsy/-/oppsy-2.0.1.tgz#91da3b4cc5cc6527dae3f04d67c7db87e4e4448c" - integrity sha512-6cIrRlZiQE4q+PadDP08N6RLQgQr2KmAbDvRFET3aL5A4bZnecNmSxa9ENe+TAE29XRX+KgaxaqC+B2+Lc51Yw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/oppsy/-/oppsy-2.0.0.tgz#3a194517adc24c3c61cdc56f35f4537e93a35e34" + integrity sha1-OhlFF63CTDxhzcVvNfRTfpOjXjQ= dependencies: - hoek "6.x.x" + hoek "5.x.x" optimist@^0.6.1, optimist@~0.6.1: version "0.6.1" @@ -18286,7 +19315,7 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ora@3.0.0: +ora@3.0.0, ora@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" integrity sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg== @@ -18298,6 +19327,16 @@ ora@3.0.0: strip-ansi "^4.0.0" wcwidth "^1.0.1" +ora@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" + integrity sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q= + dependencies: + chalk "^1.1.1" + cli-cursor "^1.0.2" + cli-spinners "^0.1.2" + object-assign "^4.0.1" + ora@^1.3.0, ora@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" @@ -18308,18 +19347,6 @@ ora@^1.3.0, ora@^1.4.0: cli-spinners "^1.0.1" log-symbols "^2.1.0" -ora@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== - dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - orchestrator@^0.3.0: version "0.3.8" resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" @@ -18375,15 +19402,23 @@ os-locale@^2.0.0: mem "^1.1.0" os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + version "3.0.1" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw== dependencies: - execa "^1.0.0" + execa "^0.10.0" lcid "^2.0.0" mem "^4.0.0" -os-name@^3.0.0, os-name@^3.1.0: +os-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-2.0.1.tgz#b9a386361c17ae3a21736ef0599405c9a8c5dc5e" + integrity sha1-uaOGNhwXrjohc27wWZQFyajF3F4= + dependencies: + macos-release "^1.0.0" + win-release "^1.0.0" + +os-name@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== @@ -18401,7 +19436,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.0, osenv@^0.1.4: +osenv@0, osenv@^0.1.0: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -18409,6 +19444,14 @@ osenv@0, osenv@^0.1.0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + integrity sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + output-file-sync@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" @@ -18425,11 +19468,6 @@ p-any@^1.0.0: dependencies: p-some "^2.0.0" -p-cancelable@*: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" - integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== - p-cancelable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" @@ -18440,11 +19478,6 @@ p-cancelable@^0.4.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== -p-cancelable@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.0.0.tgz#07e9c6d22c31f9c6784cb4f1e1454a79b6d9e2d6" - integrity sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA== - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -18457,13 +19490,6 @@ p-each-series@^1.0.0: dependencies: p-reduce "^1.0.0" -p-event@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.1.0.tgz#e92bb866d7e8e5b732293b1c8269d38e9982bf8e" - integrity sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA== - dependencies: - p-timeout "^2.0.1" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -18487,9 +19513,9 @@ p-limit@^1.0.0, p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== dependencies: p-try "^2.0.0" @@ -18512,12 +19538,7 @@ p-map@^1.1.1: resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-queue@^2.4.2: +p-queue@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-2.4.2.tgz#03609826682b743be9a22dba25051bd46724fc34" integrity sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng== @@ -18527,18 +19548,10 @@ p-reduce@^1.0.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= -p-retry@*: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.1.0.tgz#9ce7cef2069e84bf590df3b8ec18d740109338d6" - integrity sha512-oepllyG9gX1qH4Sm20YAKxg1GA7L7puhvGnTfimi31P07zSIj7SDV6YtuAx9nbJF51DES+2CIIRkXs8GKqWJxA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.12.0" - -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== +p-retry@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-2.0.0.tgz#b97f1f4d6d81a3c065b2b40107b811e995c1bfba" + integrity sha512-ZbCuzAmiwJ45q4evp/IG9D+5MUllGSUeCWwPt3j/tdYSi1KPkSD+46uqmAA1LhccDhOXv8kYZKNb8x78VflzfA== dependencies: retry "^0.12.0" @@ -18569,9 +19582,9 @@ p-try@^1.0.0: integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== package-json@^1.0.0: version "1.2.0" @@ -18611,15 +19624,20 @@ pako@^0.2.5: resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= -pako@^1.0.5, pako@~1.0.2, pako@~1.0.5: +pako@^1.0.5, pako@~1.0.2: version "1.0.10" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== + papaparse@^4.6.0: - version "4.6.3" - resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-4.6.3.tgz#742e5eaaa97fa6c7e1358d2934d8f18f44aee781" - integrity sha512-LRq7BrHC2kHPBYSD50aKuw/B/dGcg29omyJbKWY3KsYUZU69RKwaBHu13jGmCYBtOc4odsLCrFyk6imfyNubJQ== + version "4.6.0" + resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-4.6.0.tgz#4e3b8d6bf9f7900da437912794ec292207526867" + integrity sha512-ylm8pmgyz9rkS3Ng/ru5tHUF3JxWwKYP0aZZWZ8eCGdSxoqgYiDUXLNQei73mUJOjHw8QNu5ZNCsLoDpkMA6sg== parallel-transform@^1.1.0: version "1.1.0" @@ -18638,23 +19656,22 @@ param-case@2.1.x, param-case@^2.1.0: no-case "^2.2.0" parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + version "1.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" + integrity sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA== dependencies: callsites "^3.0.0" parse-asn1@^5.0.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" - integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + integrity sha1-N8T5t+06tlx0gXtfJICTf7+XxxI= dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" parse-bmfont-ascii@^1.0.3: version "1.0.6" @@ -18674,7 +19691,19 @@ parse-bmfont-xml@^1.1.4: xml-parse-from-string "^1.0.0" xml2js "^0.4.5" -parse-entities@^1.1.0, parse-entities@^1.1.2: +parse-entities@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.1.tgz#8112d88471319f27abae4d64964b122fe4e1b890" + integrity sha1-gRLYhHExnyerrk1klksSL+ThuJA= + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-entities@^1.1.2: version "1.2.1" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.1.tgz#2c761ced065ba7dc68148580b5a225e4918cdd69" integrity sha512-NBWYLQm1KSoDKk7GAHyioLTvCZ5QjdH/ASBBQTD3iLiAWJXS5bg1jEWI8nIJ+vgVvsceBVBcDGRWSo0KVQBvvg== @@ -18716,12 +19745,12 @@ parse-glob@^3.0.4: is-glob "^2.0.0" parse-headers@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34" - integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" + integrity sha1-aug6eqJanZtwCswoaYzR8e1+lTY= dependencies: - for-each "^0.3.3" - string.prototype.trim "^1.1.2" + for-each "^0.3.2" + trim "0.0.1" parse-help@^1.0.0: version "1.0.0" @@ -18745,11 +19774,6 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -18773,17 +19797,12 @@ parse-url@^5.0.0: parse-path "^4.0.0" protocols "^1.4.0" -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== - parse5@5.1.0, parse5@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== -parse5@^3.0.1: +parse5@^3.0.1, parse5@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== @@ -18805,9 +19824,9 @@ parseuri@0.0.5: better-assert "~1.0.0" parseurl@~1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascal-case@^2.0.0: version "2.0.1" @@ -18879,7 +19898,12 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5, path-parse@^1.0.6: +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= + +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -18942,17 +19966,17 @@ pathval@^1.1.0: integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= pbf@^3.0.5: - version "3.2.0" - resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.0.tgz#e76f9f5114e395c25077ad6fe463b3507d6877fc" - integrity sha512-98Eh7rsJNJF/Im6XYMLaOW3cLnNyedlOd6hu3iWMD5I7FZGgpw8yN3vQBrmLbLodu7G784Irb9Qsv2yFrxSAGw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.1.0.tgz#f70004badcb281761eabb1e76c92f179f08189e9" + integrity sha512-/hYJmIsTmh7fMkHAWWXJ5b8IKLWdjdlAFb3IHkRBn1XUhIYBChVGfVwmHEAV3UfXTxsP/AKfYTXTS/dCPxJd5w== dependencies: - ieee754 "^1.1.12" - resolve-protobuf-schema "^2.1.0" + ieee754 "^1.1.6" + resolve-protobuf-schema "^2.0.0" pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.0.14" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" + integrity sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -19015,14 +20039,14 @@ performance-now@^2.1.0: integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pez@4.x.x: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pez/-/pez-4.0.5.tgz#a975c49deff330d298d82851b39f81c2710556df" - integrity sha512-HvL8uiFIlkXbx/qw4B8jKDCWzo7Pnnd65Uvanf9OOCtb20MRcb9gtTVBf9NCnhETif1/nzbDHIjAWC/sUp7LIQ== + version "4.0.2" + resolved "https://registry.yarnpkg.com/pez/-/pez-4.0.2.tgz#0a7c81b64968e90b0e9562b398f390939e9c4b53" + integrity sha512-HuPxmGxHsEFPWhdkwBs2gIrHhFqktIxMtudISTFN95RQ85ZZAOl8Ki6u3nnN/X8OUaGlIGldk/l8p2IR4/i76w== dependencies: b64 "4.x.x" boom "7.x.x" content "4.x.x" - hoek "6.x.x" + hoek "5.x.x" nigel "3.x.x" phin@^2.9.1: @@ -19030,7 +20054,7 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -pify@4.0.1, pify@^4.0.1: +pify@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== @@ -19057,7 +20081,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.0, pirates@^4.0.1: +pirates@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== @@ -19099,6 +20123,11 @@ pkg-up@^1.0.0: dependencies: find-up "^1.0.0" +pkginfo@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" + integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= + platform@^1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" @@ -19142,7 +20171,7 @@ pluralize@^1.2.1: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU= -pn@^1.1.0: +pn@^1.0.0, pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== @@ -19152,28 +20181,28 @@ png-js@>=0.1.0: resolved "https://registry.yarnpkg.com/png-js/-/png-js-0.1.1.tgz#1cc7c212303acabe74263ec3ac78009580242d93" integrity sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM= -pngjs@3.3.1: +pngjs@3.3.1, pngjs@^3.0.0: version "3.3.1" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.1.tgz#8e14e6679ee7424b544334c3b2d21cea6d8c209a" integrity sha512-ggXCTsqHRIsGMkHlCEhbHhUmNTA2r1lpkE0NL4Q9S8spkXbm4vE9TVmPso2AGYn90Gltdz8W5CyzhcIGg2Gejg== -pngjs@^3.0.0, pngjs@^3.3.3, pngjs@^3.4.0: +pngjs@^3.3.3, pngjs@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== podium@3.x.x: - version "3.2.0" - resolved "https://registry.yarnpkg.com/podium/-/podium-3.2.0.tgz#2a7c579ddd5408f412d014c9ffac080c41d83477" - integrity sha512-rbwvxwVkI6gRRlxZQ1zUeafrpGxZ7QPHIheinehAvGATvGIPfWRkaTeWedc5P4YjXJXEV8ZbBxPtglNylF9hjw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/podium/-/podium-3.1.2.tgz#b701429739cf6bdde6b3015ae6b48d400817ce9e" + integrity sha512-18VrjJAduIdPv7d9zWsfmKxTj3cQTYC5Pv5gtKxcWujYBpGbV+mhNSPYhlHW5xeWoazYyKfB9FEsPT12r5rY1A== dependencies: - hoek "6.x.x" - joi "14.x.x" + hoek "5.x.x" + joi "13.x.x" polished@^1.9.2: - version "1.9.3" - resolved "https://registry.yarnpkg.com/polished/-/polished-1.9.3.tgz#d61b8a0c4624efe31e2583ff24a358932b6b75e1" - integrity sha512-4NmSD7fMFlM8roNxs7YXPv7UFRbYzb0gufR5zBxJLRzY54+zFsavxBo6zsQzP9ep6Hh3pC2pTyrpSTBEaB6IkQ== + version "1.9.2" + resolved "https://registry.yarnpkg.com/polished/-/polished-1.9.2.tgz#d705cac66f3a3ed1bd38aad863e2c1e269baf6b6" + integrity sha512-mPocQrVUSiqQdHNZFGL1iHJmsR/etiv05Nf2oZUbya+GMsQkZVEBl5wonN+Sr/e9zQBEhT6yrMjxAUJ06eyocQ== polished@^2.3.3: version "2.3.3" @@ -19182,15 +20211,20 @@ polished@^2.3.3: dependencies: "@babel/runtime" "^7.2.0" -popper.js@^1.14.3, popper.js@^1.14.4: +popper.js@^1.14.3: version "1.15.0" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2" integrity sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA== -portfinder@^1.0.20: - version "1.0.20" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" - integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== +popper.js@^1.14.4: + version "1.14.7" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.7.tgz#e31ec06cfac6a97a53280c3e55e4e0c860e7738e" + integrity sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ== + +portfinder@^1.0.9: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + integrity sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek= dependencies: async "^1.5.2" debug "^2.2.0" @@ -19309,7 +20343,12 @@ postcss-url@^8.0.0: postcss "^7.0.2" xxhashjs "^0.2.1" -postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: +postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + integrity sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU= + +postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== @@ -19324,7 +20363,16 @@ postcss@^5.2.6: source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.1, postcss@^6.0.23: +postcss@^6.0.1: + version "6.0.19" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.19.tgz#76a78386f670b9d9494a655bf23ac012effd1555" + integrity sha512-f13HRz0HtVwVaEuW6J6cOUCBLFtymhgyLPV7t4QEk2UD3twRI9IluDcQNdzQdBpiixkXj2OmzejhhTbSbDxNTg== + dependencies: + chalk "^2.3.1" + source-map "^0.6.1" + supports-color "^5.2.0" + +postcss@^6.0.23: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -19333,7 +20381,16 @@ postcss@^6.0.1, postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.0, postcss@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55" + integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.5.0" + +postcss@^7.0.14, postcss@^7.0.6: version "7.0.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== @@ -19342,6 +20399,15 @@ postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.2.tgz#7b5a109de356804e27f95a960bef0e4d5bc9bb18" + integrity sha512-fmaUY5370keLUTx+CnwRxtGiuFTcNBLQBqr1oE3WZ/euIYmGAo0OAgOhVJ3ByDnVmOR3PK+0V9VebzfjRIUcqw== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + potpack@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.1.tgz#d1b1afd89e4c8f7762865ec30bd112ab767e2ebf" @@ -19379,10 +20445,10 @@ prettier@1.14.3: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.3.tgz#90238dd4c0684b7edce5f83b0fb7328e48bd0895" integrity sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg== -prettier@^1.14.3: - version "1.17.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.0.tgz#53b303676eed22cc14a9f0cec09b477b3026c008" - integrity sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw== +prettier@^1.13.7, prettier@^1.14.3: + version "1.15.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.15.2.tgz#d31abe22afa4351efa14c7f8b94b58bb7452205e" + integrity sha512-YgPLFFA0CdKL4Eg2IHtUSjzj/BWgszDHiNQAe0VAIBse34148whfdzLagRL+QiKS+YfK5ftB6X4v/MBw8yCoug== pretty-bytes@^4.0.2: version "4.0.2" @@ -19405,12 +20471,20 @@ pretty-format@^23.6.0: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -pretty-format@^24.0.0, pretty-format@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.7.0.tgz#d23106bc2edcd776079c2daa5da02bcb12ed0c10" - integrity sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA== +pretty-format@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0.tgz#cb6599fd73ac088e37ed682f61291e4678f48591" + integrity sha512-LszZaKG665djUcqg5ZQq+XzezHLKrxsA86ZABTozp+oNhkdqa+tG2dX4qa6ERl5c/sRDrAa3lHmwnvKoP+OG/g== dependencies: - "@jest/types" "^24.7.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + +pretty-format@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.5.0.tgz#cc69a0281a62cd7242633fc135d6930cd889822d" + integrity sha512-/3RuSghukCf8Riu5Ncve0iI+BzVkbRU5EeUoArKARZobREycuH5O4waxvaNIloEXdb0qwgmEAed5vTpX1HNROQ== + dependencies: + "@jest/types" "^24.5.0" ansi-regex "^4.0.0" ansi-styles "^3.2.0" react-is "^16.8.4" @@ -19457,7 +20531,12 @@ progress@^1.1.8: resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= -progress@^2.0.0, progress@^2.0.1: +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= + +progress@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -19472,15 +20551,6 @@ promise-polyfill@^6.0.1: resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.1.0.tgz#dfa96943ea9c121fca4de9b5868cb39d3472e057" integrity sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc= -promise.allsettled@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.0.tgz#a718290c5695c346f372297187e788b4e8c731f4" - integrity sha512-a5EYfJtZucSSziPrZYNBj5+C+oBik9i0cztXpGwotyXJbnLFPOPMksGMDYnY3YZTd45e3tPYH/5VdjjSF8kDYg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.13.0" - function-bind "^1.1.1" - promise.prototype.finally@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" @@ -19505,22 +20575,13 @@ promisify-node@~0.3.0: nodegit-promise "~4.0.0" prompts@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" - integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== + version "2.0.3" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.3.tgz#c5ccb324010b2e8f74752aadceeb57134c1d2522" + integrity sha512-H8oWEoRZpybm6NV4to9/1limhttEo13xK62pNvn2JzY0MA03p7s0OjtmhXyon3uJmxiJJVSuUwEJFFssI3eBiQ== dependencies: kleur "^3.0.2" sisteransi "^1.0.0" -prop-types-exact@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" - integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA== - dependencies: - has "^1.0.3" - object.assign "^4.1.0" - reflect.ownkeys "^0.2.0" - prop-types@15.5.8: version "15.5.8" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.8.tgz#6b7b2e141083be38c8595aa51fc55775c7199394" @@ -19528,7 +20589,7 @@ prop-types@15.5.8: dependencies: fbjs "^0.8.9" -prop-types@15.6.1: +prop-types@15.6.1, prop-types@15.x, prop-types@^15.5.6, prop-types@^15.6.1: version "15.6.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" integrity sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ== @@ -19537,7 +20598,24 @@ prop-types@15.6.1: loose-envify "^1.3.1" object-assign "^4.1.1" -prop-types@15.x, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8: + version "15.6.0" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" + integrity sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY= + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +prop-types@^15.5.7: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -19583,12 +20661,12 @@ protocols@^1.1.0, protocols@^1.4.0: integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== proxy-addr@~2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" - integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== dependencies: forwarded "~0.1.2" - ipaddr.js "1.9.0" + ipaddr.js "1.8.0" proxy-from-env@1.0.0, proxy-from-env@^1.0.0: version "1.0.0" @@ -19614,22 +20692,21 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24, psl@^1.1.28: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== +psl@^1.1.24: + version "1.1.29" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + integrity sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY= dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" - safe-buffer "^5.1.2" pug-attrs@^2.0.3: version "2.0.3" @@ -19774,7 +20851,7 @@ pumpify@1.3.x: inherits "^2.0.3" pump "^2.0.0" -pumpify@^1.3.3, pumpify@^1.3.5: +pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== @@ -19783,12 +20860,21 @@ pumpify@^1.3.3, pumpify@^1.3.5: inherits "^2.0.3" pump "^2.0.0" +pumpify@^1.3.5: + version "1.4.0" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb" + integrity sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA== + dependencies: + duplexify "^3.5.3" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1: +punycode@2.x.x, punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -19799,9 +20885,9 @@ punycode@^1.2.4, punycode@^1.4.1: integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= puppeteer-core@^1.13.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-1.15.0.tgz#c8ccf246493349e5d898041f205fbeec4ed845ab" - integrity sha512-AH82x8Tx0/JkubeF6U12y8SuVB5vFgsw8lt/Ox5MhXaAktREFiotCTq324U2nPtJUnh2A8yJciDnzAmhbHidqQ== + version "1.13.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-1.13.0.tgz#f8001851e924e6e9ef6e9fae1778c3ab87c3f307" + integrity sha512-8MypjWVHu2EEdtN2HxhCsTtIYdJgiCcbGpHoosv265fzanfOICC2/DadLZq6/Qc/OKsovQmjkO+2vKMrV3BRfA== dependencies: debug "^4.1.0" extract-zip "^1.6.6" @@ -19822,16 +20908,16 @@ qjobs@^1.1.4: resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -qs@6.5.2, qs@~6.5.2: +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== + +qs@6.5.2, qs@^6.4.0, qs@^6.5.1, qs@^6.5.2, qs@~6.5.1, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -qs@6.7.0, qs@^6.4.0, qs@^6.5.1, qs@^6.5.2: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -19869,17 +20955,22 @@ querystring@0.2.0, querystring@^0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -querystringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" - integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== +querystringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" + integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== + +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= quickselect@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-1.1.1.tgz#852e412ce418f237ad5b660d70cffac647ae94c2" integrity sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ== -quote-stream@^1.0.1, quote-stream@~1.0.2: +quote-stream@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= @@ -19888,12 +20979,27 @@ quote-stream@^1.0.1, quote-stream@~1.0.2: minimist "^1.1.3" through2 "^2.0.0" +quote-stream@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-0.0.0.tgz#cde29e94c409b16e19dc7098b89b6658f9721d3b" + integrity sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs= + dependencies: + minimist "0.0.8" + through2 "~0.4.1" + raf-schd@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.0.tgz#9855756c5045ff4ed4516e14a47719387c3c907b" integrity sha512-m7zq0JkIrECzw9mO5Zcq6jN4KayE34yoIS9hJoiZNXyOAT06PPA8PrR+WtJIeFW09YjUfNkMMN9lrmAt6BURCA== -raf@^3.1.0, raf@^3.3.0, raf@^3.4.0: +raf@^3.1.0, raf@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" + integrity sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw== + dependencies: + performance-now "^2.1.0" + +raf@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== @@ -19928,19 +21034,18 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" + is-number "^3.0.0" + kind-of "^4.0.0" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== dependencies: safe-buffer "^5.1.0" @@ -19977,16 +21082,6 @@ raw-body@2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" @@ -20018,7 +21113,7 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-ace@^5.5.0, react-ace@^5.9.0: +react-ace@^5.5.0: version "5.10.0" resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-5.10.0.tgz#e328b37ac52759f700be5afdb86ada2f5ec84c5e" integrity sha512-aEK/XZCowP8IXq91e2DYqOtGhabk1bbjt+fyeW0UBcIkzDzP/RX/MeJKeyW7wsZcwElACVwyy9nnwXBTqgky3A== @@ -20028,6 +21123,16 @@ react-ace@^5.5.0, react-ace@^5.9.0: lodash.isequal "^4.1.1" prop-types "^15.5.8" +react-ace@^5.9.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-5.9.0.tgz#427a1cc4869b960a6f9748aa7eb169a9269fc336" + integrity sha512-r6Tuce6seG05g9kT2Tio6DWohy06knG7e5u9OfhvMquZL+Cyu4eqPf60K1Vi2RXlS3+FWrdG8Rinwu4+oQjjgw== + dependencies: + brace "^0.11.0" + lodash.get "^4.4.2" + lodash.isequal "^4.1.1" + prop-types "^15.5.8" + react-addons-create-fragment@^15.5.3: version "15.6.2" resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz#a394de7c2c7becd6b5475ba1b97ac472ce7c74f8" @@ -20046,18 +21151,31 @@ react-addons-shallow-compare@15.6.2: object-assign "^4.1.0" react-apollo@^2.1.4: - version "2.5.5" - resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-2.5.5.tgz#0f27079a8fa9d9ceea8b29a5977eb42885f88fb9" - integrity sha512-zoJYlkI3i7+f1ejCbFtWU2GLCxjrmB3Es6RANyEZcbl0yetf5TI6ofMjBzILTvwoqp6tiQHH/8q66vQF0KcLmQ== + version "2.1.8" + resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-2.1.8.tgz#ebac0d9bee0f0906df3ce29207f94df337009887" + integrity sha512-HBz9WDhvaqNxahKvBvW915a9MYSbarJ2Nrwh2pCeDctFiZ/bhixX1xJE/Ea0aU6gU5tGDEl+aWjxzx852FXHoA== dependencies: - apollo-utilities "^1.2.1" - hoist-non-react-statics "^3.3.0" - lodash.isequal "^4.5.0" - prop-types "^15.7.2" - ts-invariant "^0.4.0" - tslib "^1.9.3" + fbjs "^0.8.16" + hoist-non-react-statics "^2.5.0" + invariant "^2.2.2" + lodash "^4.17.10" + prop-types "^15.6.0" + +react-beautiful-dnd@^10.0.1: + version "10.0.4" + resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-10.0.4.tgz#56913a77706ad2d1b002041d9cb1ac3849a4ae89" + integrity sha512-j2Ra/mW48tXz1Mk6bNBuiENpRBt8wQcPbJgHSswmLDonUE8JPwVikaONoMavdowoMKQJoOJ9IwPTo82d/8aKKg== + dependencies: + "@babel/runtime-corejs2" "^7.3.0" + css-box-model "^1.1.1" + memoize-one "^5.0.0" + prop-types "^15.6.1" + raf-schd "^4.0.0" + react-redux "^5.0.7" + redux "^4.0.1" + tiny-invariant "^1.0.3" -react-beautiful-dnd@^10.0.1, react-beautiful-dnd@^10.1.0: +react-beautiful-dnd@^10.1.0: version "10.1.1" resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-10.1.1.tgz#d753088d77d7632e77cf8a8935fafcffa38f574b" integrity sha512-TdE06Shfp56wm28EzjgC56EEMgGI5PDHejJ2bxuAZvZr8CVsbksklsJC06Hxf0MSL7FHbflL/RpkJck9isuxHg== @@ -20095,29 +21213,40 @@ react-clientside-effect@^1.2.0: shallowequal "^1.1.0" react-clipboard.js@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/react-clipboard.js/-/react-clipboard.js-1.1.4.tgz#d284ba6666fc2d7ae873533e4db111bf8394b12d" - integrity sha512-IyxhQn9HX3g3YmXgEU0ZN698fO0JDKmYk3Jldw7VLbX6J33wyteZB3fp6HSQavwVH9fvguptlgHPyUCKNUcD0Q== + version "1.1.3" + resolved "https://registry.yarnpkg.com/react-clipboard.js/-/react-clipboard.js-1.1.3.tgz#86feeb49364553ecd15aea91c75aa142532a60e0" + integrity sha512-97IKPinjiuFIBrCXqhNvKCBJFrSS1mmV5LVALE9djkweau26UWpR5VueYB3Eo3b2vfPtbyt0QUw06YOGdC0rpw== dependencies: clipboard "^1.6.1" prop-types "^15.5.0" -react-color@^2.13.8, react-color@^2.17.0: - version "2.17.3" - resolved "https://registry.yarnpkg.com/react-color/-/react-color-2.17.3.tgz#b8556d744f95193468c7061d2aa19180118d4a48" - integrity sha512-1dtO8LqAVotPIChlmo6kLtFS1FP89ll8/OiA8EcFRDR+ntcK+0ukJgByuIQHRtzvigf26dV5HklnxDIvhON9VQ== +react-color@^2.13.8: + version "2.14.1" + resolved "https://registry.yarnpkg.com/react-color/-/react-color-2.14.1.tgz#db8ad4f45d81e74896fc2e1c99508927c6d084e0" + integrity sha512-ssv2ArSZdhTbIs29hyfw8JW+s3G4BCx/ILkwCajWZzrcx/2ZQfRpsaLVt38LAPbxe50LLszlmGtRerA14JzzRw== + dependencies: + lodash "^4.0.1" + material-colors "^1.2.1" + prop-types "^15.5.10" + reactcss "^1.2.0" + tinycolor2 "^1.4.1" + +react-color@^2.17.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/react-color/-/react-color-2.17.0.tgz#e14b8a11f4e89163f65a34c8b43faf93f7f02aaa" + integrity sha512-kJfE5tSaFe6GzalXOHksVjqwCPAsTl+nzS9/BWfP7j3EXbQ4IiLAF9sZGNzk3uq7HfofGYgjmcUgh0JP7xAQ0w== dependencies: "@icons/material" "^0.2.4" - lodash "^4.17.11" + lodash ">4.17.4" material-colors "^1.2.1" prop-types "^15.5.10" reactcss "^1.2.0" tinycolor2 "^1.4.1" react-datetime@^2.14.0: - version "2.16.3" - resolved "https://registry.yarnpkg.com/react-datetime/-/react-datetime-2.16.3.tgz#7f9ac7d4014a939c11c761d0c22d1fb506cb505e" - integrity sha512-amWfb5iGEiyqjLmqCLlPpu2oN415jK8wX1qoTq7qn6EYiU7qQgbNHglww014PT4O/3G5eo/3kbJu/M/IxxTyGw== + version "2.15.0" + resolved "https://registry.yarnpkg.com/react-datetime/-/react-datetime-2.15.0.tgz#a8f7da6c58b6b45dbeea32d4e8485db17614e12c" + integrity sha512-RP5OqXVfrhdoFALJzMU8tKxRFaIZzJZqZEpf5oK7pvwG80a/bET/TdJ7jT7W9lyAf1nKNo6zyYkvHW3ZJ/ypvg== dependencies: create-react-class "^15.5.2" object-assign "^3.0.0" @@ -20164,9 +21293,9 @@ react-docgen-typescript-loader@^3.1.0: react-docgen-typescript "^1.12.3" react-docgen-typescript@^1.12.3: - version "1.12.4" - resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-1.12.4.tgz#9ec8080e9ef41067ff17153bf42b3b2d49ae5503" - integrity sha512-OSmUfmdtcz4kLRWPiR8uUdE8ta+s5DV0uXOz1YsWaAUf3Ty64use7DYWK97zH8ZOlD4slq5zUfGc+UbfGLqfEQ== + version "1.12.3" + resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-1.12.3.tgz#fe62a5ce82e93573e316366e53adfe8273121c70" + integrity sha512-s1XswWs4ykNdWKsPyfM4qptV5dT8nnjnVi2IcjoS/vGlRNYrc0TkW0scVOrinHZ+ndKhPqA4iVNrdwhxZBzJcg== react-docgen@^3.0.0: version "3.0.0" @@ -20181,7 +21310,27 @@ react-docgen@^3.0.0: node-dir "^0.1.10" recast "^0.16.0" -react-dom@^16.2.0, react-dom@^16.8.0, react-dom@^16.8.1, react-dom@^16.8.3: +react-dom@^16.2.0, react-dom@^16.8.0: + version "16.8.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.2.tgz#7c8a69545dd554d45d66442230ba04a6a0a3c3d3" + integrity sha512-cPGfgFfwi+VCZjk73buu14pYkYBR1b/SRMSYqkLDdhSEHnSwcuYTPu6/Bh6ZphJFIk80XLvbSe2azfcRzNF+Xg== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.2" + +react-dom@^16.8.1: + version "16.8.5" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.5.tgz#b3e37d152b49e07faaa8de41fdf562be3463335e" + integrity sha512-VIEIvZLpFafsfu4kgmftP5L8j7P1f0YThfVTrANMhZUFMDOsA6e0kfR6wxw/8xxKs4NB59TZYbxNdPCDW34x4w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.5" + +react-dom@^16.8.3: version "16.8.6" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f" integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA== @@ -20191,10 +21340,18 @@ react-dom@^16.2.0, react-dom@^16.8.0, react-dom@^16.8.1, react-dom@^16.8.3: prop-types "^15.6.2" scheduler "^0.13.6" -react-draggable@3.x, "react-draggable@^2.2.6 || ^3.0.3", react-draggable@^3.1.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-3.3.0.tgz#2ed7ea3f92e7d742d747f9e6324860606cd4d997" - integrity sha512-U7/jD0tAW4T0S7DCPK0kkKLyL0z61sC/eqU+NUfDjnq+JtBKaYKDHpsK2wazctiA4alEzCXUnzkREoxppOySVw== +react-draggable@3.x, "react-draggable@^2.2.6 || ^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-3.0.5.tgz#c031e0ed4313531f9409d6cd84c8ebcec0ddfe2d" + integrity sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg== + dependencies: + classnames "^2.2.5" + prop-types "^15.6.0" + +react-draggable@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-3.2.1.tgz#45d09a9a227988dc85674b23ab3c75b6e820dae5" + integrity sha512-r+3Bs9InID2lyIEbR8UIRVtpn4jgu1ArFEZgIy8vibJjijLSdNLX7rH9U68BBVD4RD9v44RXbaK4EHLyKXzNQw== dependencies: classnames "^2.2.5" prop-types "^15.6.0" @@ -20216,9 +21373,9 @@ react-element-to-jsx-string@^14.0.2: stringify-object "3.2.2" react-error-overlay@^5.1.4: - version "5.1.5" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.5.tgz#884530fd055476c764eaa8ab13b8ecf1f57bbf2c" - integrity sha512-O9JRum1Zq/qCPFH5qVEvDDrVun8Jv9vbHtZXCR1EuRj9sKg1xJTlHxBzU6AkCzpvxRLuiY4OKImy3cDLQ+UTdg== + version "5.1.4" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.4.tgz#88dfb88857c18ceb3b9f95076f850d7121776991" + integrity sha512-fp+U98OMZcnduQ+NSEiQa4s/XMsbp+5KlydmkbESOw4P69iWZ68ZMFM5a2BuE0FgqPBKApJyRuYHR95jM8lAmg== react-fast-compare@^2.0.2, react-fast-compare@^2.0.4: version "2.0.4" @@ -20226,12 +21383,12 @@ react-fast-compare@^2.0.2, react-fast-compare@^2.0.4: integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== react-focus-lock@^1.17.7: - version "1.19.1" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-1.19.1.tgz#2f3429793edaefe2d077121f973ce5a3c7a0651a" - integrity sha512-TPpfiack1/nF4uttySfpxPk4rGZTLXlaZl7ncZg/ELAk24Iq2B1UUaUioID8H8dneUXqznT83JTNDHDj+kwryw== + version "1.17.7" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-1.17.7.tgz#ea7fd05d88d0e32833cad241f9333c124c35ba9a" + integrity sha512-zDCqkIhuuHCCmWzJghAz6EM6ROx8/sHhQJWjmO6oteQRHX+xTCE5FWIu3zLB5UiUa5eLd66tTh4Fs8YDp0G+6Q== dependencies: "@babel/runtime" "^7.0.0" - focus-lock "^0.6.3" + focus-lock "^0.5.2" prop-types "^15.6.2" react-clientside-effect "^1.2.0" @@ -20286,7 +21443,15 @@ react-input-range@^1.3.0: autobind-decorator "^1.3.4" prop-types "^15.5.8" -react-inspector@^2.3.0, react-inspector@^2.3.1: +react-inspector@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-2.3.0.tgz#fc9c1d38ab687fc0d190dcaf133ae40158968fc8" + integrity sha512-aIcbWb0fKFhEMB+RadoOYawlr1JoMMfrQ1oRgPUG/f/e4zERVJ6nYcIaQmrQmdHCZ63BOqe2cEkoeY0kyLBzNg== + dependencies: + babel-runtime "^6.26.0" + is-dom "^1.0.9" + +react-inspector@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-2.3.1.tgz#f0eb7f520669b545b441af9d38ec6d706e5f649c" integrity sha512-tUUK7t3KWgZEIUktOYko5Ic/oYwvjEvQUFAGC1UeMeDaQ5za2yZFtItJa2RTwBJB//NxPr000WQK6sEbqC6y0Q== @@ -20306,10 +21471,25 @@ react-intl@^2.8.0: intl-relativeformat "^2.1.0" invariant "^2.1.1" -react-is@^16.3.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" - integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== +react-is@^16.3.1: + version "16.4.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e" + integrity sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ== + +react-is@^16.7.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa" + integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g== + +react-is@^16.8.1, react-is@^16.8.2: + version "16.8.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.2.tgz#09891d324cad1cb0c1f2d91f70a71a4bee34df0f" + integrity sha512-D+NxhSR2HUCjYky1q1DwpNUD44cDpUXzSmmFyC3ug1bClcU/iDNy0YNn1iwme28fn+NFhpA13IndOd42CrFb+Q== + +react-is@^16.8.4: + version "16.8.5" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.5.tgz#c54ac229dd66b5afe0de5acbe47647c3da692ff8" + integrity sha512-sudt2uq5P/2TznPV4Wtdi+Lnq3yaYW8LfvPKLM9BKD8jJNBkxMVyB0C9/GmVhLw7Jbdmndk/73n7XQGeN9A3QQ== react-is@~16.3.0: version "16.3.2" @@ -20355,13 +21535,13 @@ react-markdown@^3.4.1: xtend "^4.0.1" react-markdown@^4.0.6: - version "4.0.8" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-4.0.8.tgz#e3621b5becaac82a651008d7bc8390d3e4e438c0" - integrity sha512-Z6oa648rufvzyO0KwYJ/9p9AsdYGIluqK6OlpJ35ouJ8HPF0Ko1WDNdyymjDSHxNrkb7HDyEcIDJCQs8NlET5A== + version "4.0.6" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-4.0.6.tgz#927d44421735cd90b7634bb221e9d7d8656e01e9" + integrity sha512-E1d/q+OBk5eumId42oYqVrJRB/+whrZdk+YHqUBCCNeWxqeV+Qzt+yLTsft9+4HRDj89Od7eAbUPQBYq8ZwShQ== dependencies: html-to-react "^1.3.4" mdast-add-list-metadata "1.0.1" - prop-types "^15.7.2" + prop-types "^15.6.1" remark-parse "^5.0.0" unified "^6.1.5" unist-util-visit "^1.3.0" @@ -20377,6 +21557,16 @@ react-modal@^3.8.1: react-lifecycles-compat "^3.0.0" warning "^3.0.0" +react-motion@^0.4.8: + version "0.4.8" + resolved "https://registry.yarnpkg.com/react-motion/-/react-motion-0.4.8.tgz#23bb2dd27c2d8e00d229e45572d105efcf40a35e" + integrity sha1-I7st0nwtjgDSKeRVctEF789Ao14= + dependencies: + create-react-class "^15.5.2" + performance-now "^0.2.0" + prop-types "^15.5.8" + raf "^3.1.0" + react-motion@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/react-motion/-/react-motion-0.5.2.tgz#0dd3a69e411316567927917c6626551ba0607316" @@ -20387,16 +21577,16 @@ react-motion@^0.5.2: raf "^3.1.0" react-onclickoutside@^6.5.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.8.0.tgz#9f91b5b3ed59f4d9e43fd71620dc200773a4d569" - integrity sha512-5Q4Rn7QLEoh7WIe66KFvYIpWJ49GeHoygP1/EtJyZjXKgrWH19Tf0Ty3lWyQzrEEDyLOwUvvmBFSE3dcDdvagA== + version "6.7.1" + resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.7.1.tgz#6a5b5b8b4eae6b776259712c89c8a2b36b17be93" + integrity sha512-p84kBqGaMoa7VYT0vZ/aOYRfJB+gw34yjpda1Z5KeLflg70HipZOT+MXQenEhdkPAABuE2Astq4zEPdMqUQxcg== react-popper-tooltip@^2.8.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.8.2.tgz#4803446362a815b1406e39526ddeb299ed2fb414" - integrity sha512-k0T5y42Lhru4+7/YqB20YoHtlemlKE/6hT8nWtQzvoyBw/eKCahK6+udW4iZ6KwRYM/vocih14d0OPkMccqhWA== + version "2.8.1" + resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.8.1.tgz#bbaec88b729e3b7e9f26521857e7f908bccdecf3" + integrity sha512-eL0PT5yz9H9lkG934TMh7czZWwDlqFady7CcJKMP5RcmBxTFBY4U7k71FEyxNaHd07nhMhUwbk0/Fgf2yw3LEg== dependencies: - "@babel/runtime" "^7.4.3" + "@babel/runtime" "^7.3.4" react-popper "^1.3.3" react-popper@^1.3.3: @@ -20438,17 +21628,16 @@ react-redux-request@^1.5.6: prop-types "^15.6.1" react-redux@^5.0.6, react-redux@^5.0.7: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.1.tgz#88e368682c7fa80e34e055cd7ac56f5936b0f52f" - integrity sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg== + version "5.0.7" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" + integrity sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg== dependencies: - "@babel/runtime" "^7.1.2" - hoist-non-react-statics "^3.1.0" - invariant "^2.2.4" + hoist-non-react-statics "^2.5.0" + invariant "^2.0.0" + lodash "^4.17.5" + lodash-es "^4.17.5" loose-envify "^1.1.0" - prop-types "^15.6.1" - react-is "^16.6.0" - react-lifecycles-compat "^3.0.0" + prop-types "^15.6.0" react-resizable@1.x: version "1.7.5" @@ -20510,7 +21699,20 @@ react-router@^3.2.0: prop-types "^15.5.6" warning "^3.0.0" -react-router@^4.2.0, react-router@^4.3.1: +react-router@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.2.0.tgz#61f7b3e3770daeb24062dae3eedef1b054155986" + integrity sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg== + dependencies: + history "^4.7.2" + hoist-non-react-statics "^2.3.0" + invariant "^2.2.2" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.5.4" + warning "^3.0.0" + +react-router@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== @@ -20524,18 +21726,18 @@ react-router@^4.2.0, react-router@^4.3.1: warning "^4.0.1" react-select@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-1.3.0.tgz#1828ad5bf7f3e42a835c7e2d8cb13b5c20714876" - integrity sha512-g/QAU1HZrzSfxkwMAo/wzi6/ezdWye302RGZevsATec07hI/iSxcpB1hejFIp7V63DJ8mwuign6KmB3VjdlinQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-1.2.1.tgz#a2fe58a569eb14dcaa6543816260b97e538120d1" + integrity sha512-vaCgT2bEl+uTyE/uKOEgzE5Dc/wLtzhnBvoHCeuLoJWc4WuadN6WQDhoL42DW+TziniZK2Gaqe/wUXydI3NSaQ== dependencies: classnames "^2.2.4" prop-types "^15.5.8" react-input-autosize "^2.1.2" react-select@^2.3.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-2.4.3.tgz#62efdf76d7e33e9bde22d907a0cc8abd0aeab656" - integrity sha512-cmxNaiHpviRYkojeW9rGEUJ4jpX7QTmPe2wcscwA4d1lStzw/cJtr4ft5H2O/YhfpkrcwaLghu3XmEYdXhBo8Q== + version "2.4.2" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-2.4.2.tgz#27da80e3880e92b081be607207bebdf63bcf4f3a" + integrity sha512-5xFOQ6JJktkY5NTaHrc6x9mKwIjhNIiBkGic1j71uyY+ulFpRFra6f4WKLd9fuCylk4WjLpO5zDhdF4CAcwFzA== dependencies: classnames "^2.2.5" emotion "^9.1.2" @@ -20546,11 +21748,11 @@ react-select@^2.3.0: react-transition-group "^2.2.1" react-shortcuts@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/react-shortcuts/-/react-shortcuts-2.0.1.tgz#6de302244ce33ac9f9273dbeec540a8f81808f91" - integrity sha512-Io51aosqU29ERe7uPDqvmZYVV1r8IrOCM3Vc46wkPqbLo84uqPphHfqijM0BkOnJMmwOfj8o5OIUZbTtoRBbDA== + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-shortcuts/-/react-shortcuts-2.0.0.tgz#871b033a071a8537422b1529d691c38432823bae" + integrity sha512-MlYxLHQ6zwgo9OiQgIvHoeZtPTQGI4NLXtVAAU77gK/H1euLCreqSk0sYKQ9TFDbuj769UqKw2VF7W1Xq7WWbA== dependencies: - combokeys "^3.0.1" + combokeys "^3.0.0" events "^1.0.2" invariant "^2.1.0" just-reduce-object "^1.0.3" @@ -20558,14 +21760,13 @@ react-shortcuts@^2.0.0: prop-types "^15.5.8" react-sizeme@^2.3.6: - version "2.6.7" - resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.6.7.tgz#231339ce8821ac2c26424c791e0027f89dae3e90" - integrity sha512-xCjPoBP5jmeW58TxIkcviMZqabZis7tTvDFWf0/Wa5XCgVWQTIe74NQBes2N1Kmp64GRLkpm60BaP0kk+v8aCQ== + version "2.3.6" + resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.3.6.tgz#d60ea2634acc3fd827a3c7738d41eea0992fa678" + integrity sha512-d3+9Kiz+5kLxyvGd44ZqxDPopNjLaSUP/qNgB5rv0O5qB8ZIjAHSeIXVHlfddJ6B841Q928V3jXm+UYyX2iUlA== dependencies: - element-resize-detector "^1.1.15" - invariant "^2.2.4" - shallowequal "^1.1.0" - throttle-debounce "^2.1.0" + element-resize-detector "^1.1.12" + invariant "^2.2.2" + lodash "^4.17.4" react-spring@^8.0.8: version "8.0.19" @@ -20603,45 +21804,52 @@ react-syntax-highlighter@^8.0.1: refractor "^2.4.1" react-test-renderer@^16.0.0-0, react-test-renderer@^16.8.0: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.6.tgz#188d8029b8c39c786f998aa3efd3ffe7642d5ba1" - integrity sha512-H2srzU5IWYT6cZXof6AhUcx/wEyJddQ8l7cLM/F7gDXYyPr4oq+vCIxJYXVGhId1J706sqziAjuOEjyNkfgoEw== + version "16.8.2" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.2.tgz#3ce0bf12aa211116612fda01a886d6163c9c459b" + integrity sha512-gsd4NoOaYrZD2R8zi+CBV9wTGMsGhE2bRe4wvenGy0WcLJgdPscRZDDz+kmLjY+/5XpYC8yRR/v4CScgYfGyoQ== dependencies: object-assign "^4.1.1" prop-types "^15.6.2" - react-is "^16.8.6" - scheduler "^0.13.6" + react-is "^16.8.2" + scheduler "^0.13.2" -react-testing-library@^6.0.0, react-testing-library@^6.0.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/react-testing-library/-/react-testing-library-6.1.2.tgz#f6bba6eeecedac736eb00b22b4c70bae04535a4f" - integrity sha512-z69lhRDGe7u/NOjDCeFRoe1cB5ckJ4656n0tj/Fdcr6OoBUu7q9DBw0ftR7v5i3GRpdSWelnvl+feZFOyXyxwg== +react-testing-library@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/react-testing-library/-/react-testing-library-6.0.0.tgz#81edfcfae8a795525f48685be9bf561df45bb35d" + integrity sha512-h0h+YLe4KWptK6HxOMnoNN4ngu3W8isrwDmHjPC5gxc+nOZOCurOvbKVYCvvuAw91jdO7VZSm/5KR7TxKnz0qA== + dependencies: + "@babel/runtime" "^7.3.1" + dom-testing-library "^3.13.1" + +react-testing-library@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/react-testing-library/-/react-testing-library-6.0.3.tgz#8b5d276a353c17ce4f7486015bb7a1c8827c442c" + integrity sha512-tN0A6nywSOoL8kriqru3rSdw31PxuquL7xnW6xBI0aTNw0VO3kZQtaEa0npUH9dX0MIsSunB0nbElRrc4VtAzw== dependencies: "@babel/runtime" "^7.4.2" - dom-testing-library "^3.19.0" + dom-testing-library "^3.18.2" react-textarea-autosize@^7.0.4: - version "7.1.0" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz#3132cb77e65d94417558d37c0bfe415a5afd3445" - integrity sha512-c2FlR/fP0qbxmlrW96SdrbgP/v0XZMTupqB90zybvmDVDutytUgPl7beU35klwcTeMepUIQEpQUn3P3bdshGPg== + version "7.0.4" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.0.4.tgz#4e4be649b544a88713e7b5043f76950f35d3d503" + integrity sha512-1cC8pFSrIVH92aE+UKxGQ2Gqq43qdIcMscJKScEFeBNemn6gHa+NwKqdXkHxxg5H6uuvW+cPpJPTes6zh90M+A== dependencies: - "@babel/runtime" "^7.1.2" prop-types "^15.6.0" react-transition-group@^2.2.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" - integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== + version "2.7.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.7.1.tgz#1fe6d54e811e8f9dfd329aa836b39d9cd16587cb" + integrity sha512-b0VJTzNRnXxRpCuxng6QJbAzmmrhBn1BZJfPPnHbH2PIo8msdkajqwtfdyGm/OypPXZNfAHKEqeN15wjMXrRJQ== dependencies: - dom-helpers "^3.4.0" + dom-helpers "^3.3.1" loose-envify "^1.4.0" prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" react-virtualized@^9.18.5: - version "9.21.0" - resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.21.0.tgz#8267c40ffb48db35b242a36dea85edcf280a6506" - integrity sha512-duKD2HvO33mqld4EtQKm9H9H0p+xce1c++2D5xn59Ma7P8VT7CprfAe5hwjd1OGkyhqzOZiTMlTal7LxjH5yBQ== + version "9.20.1" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.20.1.tgz#02dc08fe9070386b8c48e2ac56bce7af0208d22d" + integrity sha512-xIWxBsyNAjceqD3hsE0nw5TcDVxKbIepsHhvS2XneHmNz0KlKxdLdGBmGZBM9ZesEmbZ5EO0Sw70TB1MeCmpbQ== dependencies: babel-runtime "^6.26.0" classnames "^2.2.3" @@ -20674,9 +21882,9 @@ react-vis@1.10.2: react-motion "^0.5.2" react-vis@^1.8.1: - version "1.11.7" - resolved "https://registry.yarnpkg.com/react-vis/-/react-vis-1.11.7.tgz#909902af00158895d14da1adfe1d0dc0045228ff" - integrity sha512-vJqS12l/6RHeSq8DVl4PzX0j8iPgbT8H8PtgTRsimKsBNcPjPseO4RICw1FUPrwj8MPrrna34LBtzyC4ATd5Ow== + version "1.8.2" + resolved "https://registry.yarnpkg.com/react-vis/-/react-vis-1.8.2.tgz#0e0aebc427e50856a01b666569ffad0411ef050f" + integrity sha512-rY22CBemGujB0BnymwBTPy6sdcxLUIj+qO0U2p42Y6dCCjOcfgL82OBM4MXVPU/O6uw8jHOgfX1pdbNgNLsg7Q== dependencies: d3-array "^1.2.0" d3-collection "^1.0.3" @@ -20684,7 +21892,6 @@ react-vis@^1.8.1: d3-contour "^1.1.0" d3-format "^1.2.0" d3-geo "^1.6.4" - d3-hexbin "^0.2.2" d3-hierarchy "^1.1.4" d3-interpolate "^1.1.4" d3-sankey "^0.7.1" @@ -20693,11 +21900,30 @@ react-vis@^1.8.1: d3-voronoi "^1.1.2" deep-equal "^1.0.1" global "^4.3.1" - hoek "4.2.1" prop-types "^15.5.8" - react-motion "^0.5.2" + react-motion "^0.4.8" + +react@^16.2.0, react@^16.6.0, react@^16.8.0: + version "16.8.2" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.2.tgz#83064596feaa98d9c2857c4deae1848b542c9c0c" + integrity sha512-aB2ctx9uQ9vo09HVknqv3DGRpI7OIGJhCx3Bt0QqoRluEjHSaObJl+nG12GDdYH6sTgE7YiPJ6ZUyMx9kICdXw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.2" + +react@^16.8.1: + version "16.8.5" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.5.tgz#49be3b655489d74504ad994016407e8a0445de66" + integrity sha512-daCb9TD6FZGvJ3sg8da1tRAtIuw29PbKZW++NN4wqkbEvxL+bZpaaYb4xuftW/SpXmgacf1skXl/ddX6CdOlDw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.5" -react@^16.2.0, react@^16.6.0, react@^16.8.0, react@^16.8.1, react@^16.8.3: +react@^16.8.3: version "16.8.6" resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== @@ -20812,7 +22038,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -20825,7 +22051,7 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@>=1.0.33-1 <1.1.0-0": +readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17, readable-stream@~1.0.27-1: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= @@ -20835,16 +22061,16 @@ read-pkg@^3.0.0: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^3.0.6, readable-stream@^3.1.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" - integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== +readable-stream@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" + integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.1.9: +readable-stream@~1.1.0, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= @@ -20894,7 +22120,14 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" -realpath-native@^1.0.0, realpath-native@^1.1.0: +realpath-native@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" + integrity sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ== + dependencies: + util.promisify "^1.0.0" + +realpath-native@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== @@ -20912,11 +22145,11 @@ recast@^0.14.7: source-map "~0.6.1" recast@^0.16.0: - version "0.16.2" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.16.2.tgz#3796ebad5fe49ed85473b479cd6df554ad725dc2" - integrity sha512-O/7qXi51DPjRVdbrpNzoBQH5dnAPQNbfoOFyRiUwreTMJfIHYOEBzwuH+c0+/BTSJ3CQyKs6ILSWXhESH6Op3A== + version "0.16.0" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.16.0.tgz#1eb1881cae1f8834b9290caa987349430d5e8526" + integrity sha512-cm2jw4gCBatvs404ZJrxmGirSgWswW+S1U3SQTPHKNqdlUMg+V3J2XAOUvdAAgD7Hg2th2nxZ4wmYUekHI2Qmg== dependencies: - ast-types "0.11.7" + ast-types "0.11.6" esprima "~4.0.0" private "~0.1.5" source-map "~0.6.1" @@ -20991,9 +22224,9 @@ redeyed@~0.4.0: esprima "~1.0.4" reduce-reducers@^0.1.0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.1.5.tgz#ff77ca8068ff41007319b8b4b91533c7e0e54576" - integrity sha512-uoVmQnZQ+BtKKDKpBdbBri5SLNyIK9ULZGOA504++VbHcwouWE+fJDIo8AuESPF9/EYSkI0v05LDEQK6stCbTA== + version "0.1.2" + resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.1.2.tgz#fa1b4718bc5292a71ddd1e5d839c9bea9770f14b" + integrity sha1-+htHGLxSkqcd3R5dg5yb6pdw8Us= reduce-reducers@^0.4.3: version "0.4.3" @@ -21011,9 +22244,9 @@ redux-actions@2.2.1: reduce-reducers "^0.1.0" redux-observable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-1.1.0.tgz#323a8fe53e89fdb519be2807b55f08e21c13e6f1" - integrity sha512-G0nxgmTZwTK3Z3KoQIL8VQu9n0YCUwEP3wc3zxKQ8zAZm+iYkoZvBqAnBJfLi4EsD1E64KR4s4jFH/dFXpV9Og== + version "1.0.0" + resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-1.0.0.tgz#780ff2455493eedcef806616fe286b454fd15d91" + integrity sha512-6bXnpqWTBeLaLQjXHyN1giXq4nLxCmv+SUkdmiwBgvmVxvDbdmydvL1Z7DGo0WItyzI/kqXQKiucUuTxnrPRkA== redux-saga@^0.16.0: version "0.16.2" @@ -21050,7 +22283,7 @@ redux@3.7.2, redux@^3.6.0: loose-envify "^1.1.0" symbol-observable "^1.0.3" -redux@4.0.0: +redux@4.0.0, redux@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.0.tgz#aa698a92b729315d22b34a0553d7e6533555cc03" integrity sha512-NnnHF0h0WVE/hXyrB6OlX67LYRuaf/rJcbWvnHHEPCF/Xa/AZpwhs/20WyqzQae5x4SD2F9nPObgBh2rxAgLiA== @@ -21058,7 +22291,7 @@ redux@4.0.0: loose-envify "^1.1.0" symbol-observable "^1.2.0" -redux@^4.0.0, redux@^4.0.1: +redux@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg== @@ -21066,20 +22299,22 @@ redux@^4.0.0, redux@^4.0.1: loose-envify "^1.4.0" symbol-observable "^1.2.0" -reflect.ownkeys@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" - integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= - refractor@^2.4.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.9.0.tgz#0a381aadb51513e4e6ec1ed410b5104dd65e2489" - integrity sha512-lCnCYvXpqd8hC7ksuvo516rz5q4NwzBbq0X5qjH5pxRfcQKiQxKZ8JctrSQmrR/7pcV2TRrs9TT+Whmq/wtluQ== + version "2.8.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.8.0.tgz#29d7b2254e823edd2e3e476af286af1c11472bfa" + integrity sha512-w+jG49/1MX60GeE9u8lyx1KYMBRdAHjOIfgcDJ0wq2ogOnEmab0MgIj+AtPq6kelw0mr1l9U0i2rFvLlOCkxiw== dependencies: hastscript "^5.0.0" parse-entities "^1.1.2" prismjs "~1.16.0" +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" @@ -21087,7 +22322,12 @@ regenerate-unicode-properties@^8.0.2: dependencies: regenerate "^1.4.0" -regenerate@^1.2.1, regenerate@^1.4.0: +regenerate@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== + +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -21112,6 +22352,13 @@ regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== + dependencies: + private "^0.1.6" + regenerator-transform@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" @@ -21126,7 +22373,14 @@ regex-cache@^0.4.2: dependencies: is-equal-shallow "^0.1.3" -regex-not@^1.0.0, regex-not@^1.0.2: +regex-not@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + integrity sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k= + dependencies: + extend-shallow "^2.0.1" + +regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== @@ -21135,9 +22389,13 @@ regex-not@^1.0.0, regex-not@^1.0.2: safe-regex "^1.1.0" regexp-tree@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.6.tgz#84900fa12fdf428a2ac25f04300382a7c0148479" - integrity sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w== + version "0.1.1" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.1.tgz#27b455f9b138ca2e84c090e9aff1ffe2a04d97fa" + integrity sha512-HwRjOquc9QOwKTgbxvZTcddS5mlNlwePMQ3NFL8broajMLD5CXDAqas8Y5yxJH5QtZp5iRor3YCILd5pz71Cgw== + dependencies: + cli-table3 "^0.5.0" + colors "^1.1.2" + yargs "^12.0.5" regexp.prototype.flags@^1.2.0: version "1.2.0" @@ -21160,6 +22418,18 @@ regexpu-core@^1.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" + integrity sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.4.0" + regjsparser "^0.3.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + regexpu-core@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" @@ -21172,7 +22442,7 @@ regexpu-core@^4.5.4: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" -registry-auth-token@3.3.2: +registry-auth-token@^3.0.1, registry-auth-token@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== @@ -21180,15 +22450,7 @@ registry-auth-token@3.3.2: rc "^1.1.6" safe-buffer "^5.0.1" -registry-auth-token@^3.0.1, registry-auth-token@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@3.1.0, registry-url@^3.0.0, registry-url@^3.0.3, registry-url@^3.1.0: +registry-url@^3.0.0, registry-url@^3.0.3, registry-url@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= @@ -21200,6 +22462,11 @@ regjsgen@^0.2.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" + integrity sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA== + regjsgen@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" @@ -21212,6 +22479,13 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +regjsparser@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" + integrity sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA== + dependencies: + jsesc "~0.5.0" + regjsparser@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" @@ -21302,20 +22576,20 @@ render-fragment@^0.1.1: integrity sha512-+DnAcalJYR8GE5VRuQGGu78Q0GDe8EXnkuk4DF8gbAhIeS6LRt4j+aaggLLj4PtQVfXNC61McXvXI58WqmRleQ== renderkid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" - integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.2.tgz#12d310f255360c07ad8fde253f6c9e9de372d2aa" + integrity sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg== dependencies: css-select "^1.1.0" - dom-converter "^0.2" - htmlparser2 "^3.3.0" + dom-converter "~0.2" + htmlparser2 "~3.3.0" strip-ansi "^3.0.0" utila "^0.4.0" repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= repeat-string@^0.2.2: version "0.2.2" @@ -21351,21 +22625,21 @@ replace-ext@1.0.0, replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= -request-promise-core@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" - integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= dependencies: - lodash "^4.17.11" + lodash "^4.13.1" -request-promise-native@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" - integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== +request-promise-native@^1.0.3, request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= dependencies: - request-promise-core "1.1.2" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" request@2.81.0: version "2.81.0" @@ -21395,7 +22669,7 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@2.88.0, request@^2.87.0, request@^2.88.0: +request@2.88.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -21421,6 +22695,60 @@ request@2.88.0, request@^2.87.0, request@^2.88.0: tunnel-agent "^0.6.0" uuid "^3.3.2" +request@^2.74.0, request@^2.83.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + integrity sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@^2.87.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -21436,11 +22764,6 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - require-uncached@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -21450,18 +22773,18 @@ require-uncached@^1.0.2: resolve-from "^1.0.0" requirefresh@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/requirefresh/-/requirefresh-2.2.0.tgz#68298ae66af9da3d6843375adf8351dd29d73789" - integrity sha512-gXQWrZkXNZZ6qVEh6PQvoASxLY3r6AR4jH8fFjZ+BfPJpDV6RTI82J4A3tkAn2wikU7rxfzU3sIPj94zEV6xPA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/requirefresh/-/requirefresh-2.1.0.tgz#742dccc20f3a96918d66c6f1597dc8ffebc4f6f5" + integrity sha1-dC3Mwg86lpGNZsbxWX3I/+vE9vU= dependencies: - editions "^2.1.3" + editions "^1.1.1" requireindex@^1.2.0, requireindex@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== -requires-port@^1.0.0: +requires-port@1.x.x, requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= @@ -21476,7 +22799,12 @@ reselect@3.0.1, reselect@^3.0.1: resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= -resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: +resize-observer-polyfill@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69" + integrity sha512-M2AelyJDVR/oLnToJLtuDJRBBWUGUvvGigj1411hXhAdyFWqMaqHp7TixW3FpiLuVaikIcR1QL+zqoJoZlOgpg== + +resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== @@ -21523,7 +22851,7 @@ resolve-pathname@^2.2.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" integrity sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg== -resolve-protobuf-schema@^2.1.0: +resolve-protobuf-schema@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== @@ -21540,20 +22868,34 @@ resolve@1.1.7, resolve@1.1.x, resolve@~1.1.0, resolve@~1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.8.1: +resolve@1.8.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" -resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== +resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== + dependencies: + path-parse "^1.0.5" + +resolve@^1.10.0, resolve@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: path-parse "^1.0.6" +resolve@^1.5.0, resolve@^1.7.1: + version "1.7.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== + dependencies: + path-parse "^1.0.5" + responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -21606,12 +22948,12 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@2.6.3, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== +rimraf@2, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: - glob "^7.1.3" + glob "^7.0.5" rimraf@2.4.3: version "2.4.3" @@ -21620,17 +22962,24 @@ rimraf@2.4.3: dependencies: glob "^5.0.14" +rimraf@2.6.3, rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + integrity sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc= dependencies: - hash-base "^3.0.0" + hash-base "^2.0.0" inherits "^2.0.1" rison-node@0.3.1: @@ -21687,10 +23036,10 @@ rst-selector-parser@^2.2.3: lodash.flattendeep "^4.4.0" nearley "^2.7.10" -rsvp@^4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" - integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== rsync@0.4.0: version "0.4.0" @@ -21754,17 +23103,31 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= -rxjs@^5.5.0: +rxjs@^5.5.0, rxjs@^5.5.2: version "5.5.12" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== dependencies: symbol-observable "1.0.1" -rxjs@^6.1.0, rxjs@^6.2.1, rxjs@^6.3.3, rxjs@^6.4.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.1.tgz#f7a005a9386361921b8524f38f54cbf80e5d08f4" - integrity sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg== +rxjs@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.1.0.tgz#833447de4e4f6427b9cec3e5eb9f56415cd28315" + integrity sha512-lMZdl6xbHJCSb5lmnb6nOhsoBVCyoDC5LDJQK9WWyq+tsI7KnlDIZ0r0AZAlBpRPLbwQA9kzSBAZwNIZEZ+hcw== + dependencies: + tslib "^1.9.0" + +rxjs@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.1.tgz#246cebec189a6cbc143a3ef9f62d6f4c91813ca1" + integrity sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g== + dependencies: + tslib "^1.9.0" + +rxjs@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== dependencies: tslib "^1.9.0" @@ -21808,25 +23171,27 @@ safefs@^4.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== +sane@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" + integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== dependencies: - "@cnakazawa/watch" "^1.0.3" anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" + capture-exit "^1.2.0" + exec-sh "^0.2.0" execa "^1.0.0" fb-watchman "^2.0.0" micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" sao@^0.22.12: - version "0.22.17" - resolved "https://registry.yarnpkg.com/sao/-/sao-0.22.17.tgz#f678ab240cd1695260491fba9f3a864cd1fc02e9" - integrity sha512-H8sdfmgIS3WXhwvZ9Umu+L9MZl6+brlg2OGHKsdkukBZNrTVc07lDzKDIci0urVJzEGS4FqCBPOa62PcPLaWhA== + version "0.22.12" + resolved "https://registry.yarnpkg.com/sao/-/sao-0.22.12.tgz#fe13bb32bb0d32892c188024f77c5ac26c19eaf9" + integrity sha512-ybJxqUg2wvmnBZ6LBNV2L3ermzjP4RFpti0MSXX3VI+Weaw5wBhgB0umvgeWkyObKhsuP1TmZ22XGfi6v+o1LQ== dependencies: boxen "^1.2.2" cac "^4.3.4" @@ -21848,7 +23213,7 @@ sao@^0.22.12: tildify "^1.2.0" update-notifier "^2.2.0" user-home "^2.0.0" - yarn-install "^1.0.0" + yarn-install "^0.5.1" sass-graph@^2.2.4: version "2.2.4" @@ -21861,9 +23226,9 @@ sass-graph@^2.2.4: yargs "^7.0.0" sass-lint@^1.12.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.13.1.tgz#5fd2b2792e9215272335eb0f0dc607f61e8acc8f" - integrity sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q== + version "1.12.1" + resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.12.1.tgz#630f69c216aa206b8232fb2aa907bdf3336b6d83" + integrity sha1-Yw9pwhaqIGuCMvsqqQe98zNrbYM= dependencies: commander "^2.8.1" eslint "^2.7.0" @@ -21902,17 +23267,18 @@ sass-resources-loader@^2.0.0: glob "^7.1.1" loader-utils "^1.0.4" -sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: +sax@>=0.6.0, sax@^1.2.1, sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^3.1.3: - version "3.1.9" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.9.tgz#c1c197cd54956d88c09f960254b999e192d7058b" - integrity sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw== +scheduler@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.2.tgz#969eaee2764a51d2e97b20a60963b2546beff8fa" + integrity sha512-qK5P8tHS7vdEMCW5IPyt8v9MJOHqTrOUgPXib7tqm9vh834ibBX5BNhwkplX/0iOzHW5sXyluehYfS9yrkz9+w== dependencies: - xmlchars "^1.3.1" + loose-envify "^1.1.0" + object-assign "^4.1.1" scheduler@^0.13.3, scheduler@^0.13.6: version "0.13.6" @@ -21922,6 +23288,14 @@ scheduler@^0.13.3, scheduler@^0.13.6: loose-envify "^1.1.0" object-assign "^4.1.1" +scheduler@^0.13.5: + version "0.13.5" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.5.tgz#b7226625167041298af3b98088a9dbbf6d7733a8" + integrity sha512-K98vjkQX9OIt/riLhp6F+XtDPtMQhqNcf045vsh+pcuvHq+PHy1xCrH3pq1P40m6yR46lpVvVhKdEOtnimuUJw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" @@ -21993,12 +23367,12 @@ selenium-webdriver@^4.0.0-alpha.1: tmp "0.0.30" xml2js "^0.4.17" -selfsigned@^1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" - integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== +selfsigned@^1.9.1: + version "1.10.2" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.2.tgz#b4449580d99929b65b10a48389301a6592088758" + integrity sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g= dependencies: - node-forge "0.7.5" + node-forge "0.7.1" semaphore-async-await@^1.5.1: version "1.5.1" @@ -22024,17 +23398,17 @@ semver-truncate@^1.0.0: dependencies: semver "^5.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== +"semver@2 || 3 || 4 || 5", semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== semver@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.0.tgz#85f2cf8550465c4df000cf7d86f6b054106ab9e5" integrity sha1-hfLPhVBGXE3wAM99hvawVBBqueU= -semver@5.5.0: +semver@5.5.0, semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== @@ -22044,10 +23418,15 @@ semver@^4.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= -semver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" - integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== +semver@^5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== + +semver@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== semver@~5.3.0: version "5.3.0" @@ -22087,9 +23466,9 @@ sequencify@~0.0.7: integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw= serialize-javascript@^1.4.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" - integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== serve-favicon@^2.5.0: version "2.5.0" @@ -22102,7 +23481,7 @@ serve-favicon@^2.5.0: parseurl "~1.3.2" safe-buffer "5.1.1" -serve-index@^1.9.1: +serve-index@^1.7.2: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= @@ -22126,38 +23505,45 @@ serve-static@1.13.2: send "0.16.2" serve@^6.3.1: - version "6.5.8" - resolved "https://registry.yarnpkg.com/serve/-/serve-6.5.8.tgz#fd7ad6b9c10ba12084053030cc1a8b636c0a10a7" - integrity sha512-GZYlJz7f6E7Xq6xbg1rTSvQQV9x4v/yYB/sum6egzSBLa/mdk1PViDSX2JvL0Me83sxu3JpEpQELfakDKbGcrw== + version "6.5.2" + resolved "https://registry.yarnpkg.com/serve/-/serve-6.5.2.tgz#b6030a82c3f5597813f231f75abc29536bb098f9" + integrity sha512-Dt1qGg2fb8kF7Ry921zLm7xMX2wd0RzS68aYPUItfXw86fj86ovqo0gkeAkuyqf34BOGRndEx9s+LCEMFrq+qg== dependencies: - args "4.0.0" + "@zeit/check-updates" "1.1.0" + args "3.0.8" basic-auth "2.0.0" bluebird "3.5.1" boxen "1.3.0" - chalk "2.4.1" + chalk "2.3.2" clipboardy "1.2.3" dargs "5.1.0" - detect-port "1.2.3" - filesize "3.6.1" - fs-extra "6.0.1" + detect-port "1.2.2" + filesize "3.6.0" + fs-extra "5.0.0" handlebars "4.0.11" ip "1.1.5" - micro "9.3.1" + micro "9.1.0" micro-compress "1.0.0" mime-types "2.1.18" - node-version "1.1.3" + node-version "1.1.0" openssl-self-signed-certificate "1.1.6" - opn "5.3.0" + opn "5.2.0" path-is-inside "1.0.2" path-type "3.0.0" send "0.16.2" - update-check "1.5.1" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y= + dependencies: + to-object-path "^0.3.0" + set-immediate-shim@^1.0.0, set-immediate-shim@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" @@ -22198,15 +23584,10 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + version "2.4.10" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b" + integrity sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -22241,13 +23622,16 @@ shallowequal@^1.0.2, shallowequal@^1.1.0: integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== sharkdown@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/sharkdown/-/sharkdown-0.1.1.tgz#64484bd0f08f347f8319e9ff947a670f6b48b1b2" - integrity sha512-exwooSpmo5s45lrexgz6Q0rFQM574wYIX3iDZ7RLLqOb7IAoQZu9nxlZODU972g19sR69OIpKP2cpHTzU+PHIg== + version "0.1.0" + resolved "https://registry.yarnpkg.com/sharkdown/-/sharkdown-0.1.0.tgz#61d4fe529e75d02442127cc9234362265099214f" + integrity sha1-YdT+Up510CRCEnzJI0NiJlCZIU8= dependencies: cardinal "~0.4.2" + expect.js "~0.2.0" minimist "0.0.5" split "~0.2.10" + stream-spigot "~2.1.2" + through "~2.3.4" shebang-command@^1.2.0: version "1.2.0" @@ -22300,12 +23684,12 @@ shellwords@^0.1.1: integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== shot@4.x.x: - version "4.0.7" - resolved "https://registry.yarnpkg.com/shot/-/shot-4.0.7.tgz#b05d2858634fedc18ece99e8f638fab7c9f9d4c4" - integrity sha512-RKaKAGKxJ11EjJl0cf2fYVSsd4KB5Cncb9J0v7w+0iIaXpxNqFWTYNDNhBX7f0XSyDrjOH9a4OWZ9Gp/ZML+ew== + version "4.0.5" + resolved "https://registry.yarnpkg.com/shot/-/shot-4.0.5.tgz#c7e7455d11d60f6b6cd3c43e15a3b431c17e5566" + integrity sha1-x+dFXRHWD2ts08Q+FaO0McF+VWY= dependencies: - hoek "6.x.x" - joi "14.x.x" + hoek "5.x.x" + joi "13.x.x" sigmund@^1.0.1, sigmund@~1.0.0: version "1.0.1" @@ -22323,11 +23707,11 @@ simple-git@1.37.0: integrity sha1-pdUi3U6XxgkfZXdmwooyNzgjPw8= simple-git@^1.91.0: - version "1.110.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.110.0.tgz#54eb179089d055a7783d32399246cebc9d9933e9" - integrity sha512-UYY0rQkknk0P5eb+KW+03F4TevZ9ou0H+LoGaj7iiVgpnZH4wdj/HTViy/1tNNkmIPcmtxuBqXWiYt2YwlRKOQ== + version "1.92.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.92.0.tgz#6061468eb7d19f0141078fc742e62457e910f547" + integrity sha1-YGFGjrfRnwFBB4/HQuYkV+kQ9Uc= dependencies: - debug "^4.0.1" + debug "^3.1.0" simple-swizzle@^0.2.2: version "0.2.2" @@ -22350,16 +23734,16 @@ simplify-js@^1.2.1: integrity sha512-0IkEqs+5c5vROkHaifGfbqHf5tYDcsTBy6oJPRbFCSwp2uzEr+PpH3dNP7wD8O3d7zdUCjLVq1/xHkwA/JjlFA== sinon@^7.2.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.2.tgz#82dba3a6d85f6d2181e1eca2c10d8657c2161f28" - integrity sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA== + version "7.2.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.2.2.tgz#388ecabd42fa93c592bfc71d35a70894d5a0ca07" + integrity sha512-WLagdMHiEsrRmee3jr6IIDntOF4kbI6N2pfbi8wkv50qaUQcBglkzkjtoOEbeJ2vf1EsrHhLI+5Ny8//WHdMoA== dependencies: - "@sinonjs/commons" "^1.4.0" - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/samsam" "^3.3.1" + "@sinonjs/commons" "^1.2.0" + "@sinonjs/formatio" "^3.1.0" + "@sinonjs/samsam" "^3.0.2" diff "^3.5.0" - lolex "^4.0.1" - nise "^1.4.10" + lolex "^3.0.0" + nise "^1.4.7" supports-color "^5.5.0" sisteransi@^1.0.0: @@ -22420,9 +23804,9 @@ snapdragon-util@^3.0.1: kind-of "^3.2.0" snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + version "0.8.1" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + integrity sha1-4StUh/re0+PeoKyR6UAL91tAE3A= dependencies: base "^0.11.1" debug "^2.2.0" @@ -22431,7 +23815,7 @@ snapdragon@^0.8.1: map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" - use "^3.1.0" + use "^2.0.0" sntp@1.x.x: version "1.0.9" @@ -22440,6 +23824,13 @@ sntp@1.x.x: dependencies: hoek "2.x.x" +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== + dependencies: + hoek "4.x.x" + socket.io-adapter@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" @@ -22506,14 +23897,6 @@ sockjs@0.3.19: faye-websocket "^0.10.0" uuid "^3.0.1" -somever@2.x.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/somever/-/somever-2.0.0.tgz#7bdbed3bee8ece2c7c8a2e7d9a1c022bd98d6c89" - integrity sha512-9JaIPP+HxwYGqCDqqK3tRaTqdtQHoK6Qy3IrXhIt2q5x8fs8RcfU7BMWlFTCOgFazK8p88zIv1tHQXvAwtXMyw== - dependencies: - bounce "1.x.x" - hoek "6.x.x" - sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -22530,9 +23913,9 @@ sort-on@^3.0.0: dot-prop "^4.1.1" source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + integrity sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A== source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.2" @@ -22545,10 +23928,34 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.1, source-map-support@^0.5.6, source-map-support@^0.5.9, source-map-support@~0.5.10: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== +source-map-support@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + integrity sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.6, source-map-support@~0.5.6: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.9: + version "0.5.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" + integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.5.10: + version "0.5.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" + integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -22558,6 +23965,11 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= +"source-map@>= 0.1.2", source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@^0.4.2, source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" @@ -22565,22 +23977,17 @@ source-map@^0.4.2, source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - source-map@^0.7.2: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@~0.1.30: +source-map@~0.1.30, source-map@~0.1.33: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= @@ -22595,14 +24002,16 @@ source-map@~0.2.0: amdefine ">=0.0.4" space-separated-tokens@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.3.tgz#bc6500e116d13285a94b59b58c44c7f045fe6124" - integrity sha512-/M5RAdBuQlSDPNfA5ube+fkHbHyY08pMuADLmsAQURzo56w90r681oiOoz3o3ZQyWdSeNucpTFjL+Ggd5qui3w== + version "1.1.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.2.tgz#e95ab9d19ae841e200808cd96bc7bd0adbbb3412" + integrity sha512-G3jprCEw+xFEs0ORweLmblJ3XLymGGr6hxZYTYZjIlvDti9vOBUjRQa1Rzjt012aRrocKstHwdNi+F7HguPsEA== + dependencies: + trim "0.0.1" sparkles@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" - integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + integrity sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM= spawn-promise@^0.1.8: version "0.1.8" @@ -22635,25 +24044,24 @@ spdx-correct@^2.0.3: spdx-expression-parse "^2.0.1" spdx-license-ids "^2.0.1" -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + integrity sha1-SzBz2TP/UfORLwOsVRlJikFQ20A= dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" + spdx-license-ids "^1.0.2" spdx-exceptions@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz#9d21ac4da4bdb71d060fb74e5a67531d032cbba6" integrity sha1-nSGsTaS9tx0GD7dOWmdTHQMsu6Y= -spdx-exceptions@^2.0.0, spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== +spdx-exceptions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + integrity sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg== -spdx-expression-parse@^1.0.0: +spdx-expression-parse@^1.0.0, spdx-expression-parse@~1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" integrity sha1-m98vIOH0DtRH++JzJmGR/O1RYmw= @@ -22666,15 +24074,7 @@ spdx-expression-parse@^2.0.1: spdx-exceptions "^2.0.0" spdx-license-ids "^2.0.1" -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^1.0.0: +spdx-license-ids@^1.0.0, spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" integrity sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc= @@ -22684,11 +24084,6 @@ spdx-license-ids@^2.0.1: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-2.0.1.tgz#02017bcc3534ee4ffef6d58d20e7d3e9a1c3c8ec" integrity sha1-AgF7zDU07k/+9tWNIOfT6aHDyOw= -spdx-license-ids@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" - integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== - spdx-ranges@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-1.0.1.tgz#0f4eec7b8ea48ed202e374bb8942e8d18dc0113e" @@ -22703,35 +24098,37 @@ spdx-satisfies@^0.1.3: spdx-expression-parse "^1.0.0" spdx@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/spdx/-/spdx-0.5.2.tgz#76a428b9b97e7904ef83e62a4af0d06fdb50c265" - integrity sha512-WQbfCQT2uKLsDllnO9ItpcGUiiF1O/ZvBGCyqFZRg122HgiZubpwpZiM7BkmH19HC3XR3Z+DFMGJNzXSPebG8A== + version "0.5.1" + resolved "https://registry.yarnpkg.com/spdx/-/spdx-0.5.1.tgz#d36c275088b48d75a9046cd44a838ce4b5339998" + integrity sha1-02wnUIi0jXWpBGzUSoOM5LUzmZg= dependencies: spdx-exceptions "^1.0.0" spdx-license-ids "^1.0.0" -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== +spdy-transport@^2.0.18: + version "2.0.20" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" + integrity sha1-c15yBUxIayNU/onnAiVgBKOazk0= dependencies: - debug "^4.1.0" - detect-node "^2.0.4" + debug "^2.6.8" + detect-node "^2.0.3" hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" -spdy@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52" - integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q== +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw= dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" + debug "^2.6.8" + handle-thing "^1.2.5" http-deceiver "^1.2.7" + safe-buffer "^5.0.1" select-hose "^2.0.0" - spdy-transport "^3.0.0" + spdy-transport "^2.0.18" split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -22748,9 +24145,9 @@ split@~0.2.10: through "2" sprintf-js@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + version "1.1.1" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" + integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw= sprintf-js@~1.0.2: version "1.0.3" @@ -22763,9 +24160,9 @@ squel@^5.12.2: integrity sha512-pIM8SjlUJlN2G6xz3we+lCp2aNQgxauGqKXJDi8y2n0hqJlSot0IUEdHh7/zGFFuRYnypbDiOhSWLZzT1BXnlQ== sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + version "1.15.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" + integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -22784,7 +24181,7 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" -ssri@^6.0.1: +ssri@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== @@ -22802,34 +24199,33 @@ stack-trace@0.0.x: integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + integrity sha1-1PM6tU6OOHeLDKXP07OvsS22hiA= state-toggle@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.1.tgz#c3cb0974f40a6a0f8e905b96789eb41afa1cde3a" - integrity sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og== + version "1.0.0" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.0.tgz#d20f9a616bb4f0c3b98b91922d25b640aa2bc425" + integrity sha1-0g+aYWu08MO5i5GSLSW2QKorxCU= statehood@6.x.x: - version "6.0.9" - resolved "https://registry.yarnpkg.com/statehood/-/statehood-6.0.9.tgz#b347ae19818aec7fc26645fe1ec6a61928a57a3c" - integrity sha512-jbFg1+MYEqfC7ABAoWZoeF4cQUtp3LUvMDUGExL76cMmleBHG7I6xlZFsE8hRi7nEySIvutHmVlLmBe9+2R5LQ== + version "6.0.6" + resolved "https://registry.yarnpkg.com/statehood/-/statehood-6.0.6.tgz#0dbd7c50774d3f61a24e42b0673093bbc81fa5f0" + integrity sha512-jR45n5ZMAkasw0xoE9j9TuLmJv4Sa3AkXe+6yIFT6a07kXYHgSbuD2OVGECdZGFxTmvNqLwL1iRIgvq6O6rq+A== dependencies: boom "7.x.x" bounce "1.x.x" - bourne "1.x.x" cryptiles "4.x.x" - hoek "6.x.x" + hoek "5.x.x" iron "5.x.x" - joi "14.x.x" + joi "13.x.x" -static-eval@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" - integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== +static-eval@~0.2.0: + version "0.2.4" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-0.2.4.tgz#b7d34d838937b969f9641ca07d48f8ede263ea7b" + integrity sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns= dependencies: - escodegen "^1.8.1" + escodegen "~0.0.24" static-extend@^0.1.1: version "0.1.2" @@ -22839,25 +24235,22 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -static-module@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf" - integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ== +static-module@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-1.5.0.tgz#27da9883c41a8cd09236f842f0c1ebc6edf63d86" + integrity sha1-J9qYg8QajNCSNvhC8MHrxu32PYY= dependencies: concat-stream "~1.6.0" - convert-source-map "^1.5.1" - duplexer2 "~0.1.4" - escodegen "~1.9.0" + duplexer2 "~0.0.2" + escodegen "~1.3.2" falafel "^2.1.0" - has "^1.0.1" - magic-string "^0.22.4" - merge-source-map "1.0.4" - object-inspect "~1.4.0" - quote-stream "~1.0.2" - readable-stream "~2.3.3" + has "^1.0.0" + object-inspect "~0.4.0" + quote-stream "~0.0.0" + readable-stream "~1.0.27-1" shallow-copy "~0.0.1" - static-eval "^2.0.0" - through2 "~2.0.3" + static-eval "~0.2.0" + through2 "~0.4.1" stats-lite@^2.2.0: version "2.2.0" @@ -22866,7 +24259,12 @@ stats-lite@^2.2.0: dependencies: isnumber "~1.0.0" -"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2": +"statuses@>= 1.3.1 < 2", statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -22876,35 +24274,30 @@ statuses@~1.3.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== - stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + integrity sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s= dependencies: readable-stream "^2.0.1" -stealthy-require@^1.1.1: +stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= dependencies: inherits "~2.0.1" readable-stream "^2.0.2" stream-consume@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" - integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg== + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + integrity sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8= stream-each@^1.1.0: version "1.2.3" @@ -22915,13 +24308,13 @@ stream-each@^1.1.0: stream-shift "^1.0.0" stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + version "2.8.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" + integrity sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.3.6" + readable-stream "^2.3.3" to-arraybuffer "^1.0.0" xtend "^4.0.0" @@ -22930,6 +24323,13 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= +stream-spigot@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/stream-spigot/-/stream-spigot-2.1.2.tgz#7de145e819f8dd0db45090d13dcf73a8ed3cc035" + integrity sha1-feFF6Bn43Q20UJDRPc9zqO08wDU= + dependencies: + readable-stream "~1.1.0" + stream-stream@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/stream-stream/-/stream-stream-1.2.6.tgz#a9ae071c64c11b8584f52973f7715e37e5144c43" @@ -22973,6 +24373,13 @@ string-replace-loader@^2.1.1: loader-utils "^1.1.0" schema-utils "^0.4.5" +string-similarity@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-1.2.0.tgz#d75153cb383846318b7a39a8d9292bb4db4e9c30" + integrity sha1-11FTyzg4RjGLejmo2SkrtNtOnDA= + dependencies: + lodash "^4.13.1" + string-similarity@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-2.0.0.tgz#c16d8fc7e7c8dce706742c87adc482dbdb7030bb" @@ -22992,7 +24399,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -23001,20 +24408,20 @@ string-width@^1.0.1, string-width@^1.0.2: strip-ansi "^4.0.0" string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + version "3.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.0.0.tgz#5a1690a57cc78211fffd9bf24bbe24d090604eb1" + integrity sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew== dependencies: emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" + strip-ansi "^5.0.0" -string.prototype.matchall@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-3.0.1.tgz#5a9e0b64bcbeb336aa4814820237c2006985646d" - integrity sha512-NSiU0ILQr9PQ1SZmM1X327U5LsM+KfDTassJfqN1al1+0iNpKzmQ4BfXOJwRnTEqv8nKJ67mFpqRoPaGWwvy5A== +string.prototype.matchall@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-3.0.0.tgz#66f4d8dd5c6c6cea4dffb55ec5f3184a8dd0dd59" + integrity sha512-/g0YW/cEfXASRHAaLR7VZbTUlxgP14fmCsfSRFG2gvlG2S1q9rBpjYnEy/EIIzY+bjzs2nTfAHJYXmQ+zTnXSQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.1.2" es-abstract "^1.12.0" function-bind "^1.1.1" has-symbols "^1.0.0" @@ -23052,7 +24459,14 @@ string_decoder@0.10, string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.0.tgz#384f322ee8a848e500effde99901bba849c5d403" + integrity sha512-8zQpRF6juocE69ae7CSPmYEGJe4VCXwP6S6dxUWI7i53Gwv54/ec41fiUA+X7BPGGv7fRSQJjBQVa0gomGaOgg== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== @@ -23080,7 +24494,12 @@ stringstream@~0.0.4: resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== -strip-ansi@5.0.0: +stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= + +strip-ansi@5.0.0, strip-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== @@ -23108,7 +24527,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -23183,9 +24602,9 @@ strip-json-comments@~1.0.1: integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= strip-outer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.0.tgz#aac0ba60d2e90c5d4f275fd8869fd9a2d310ffb8" + integrity sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g= dependencies: escape-string-regexp "^1.0.2" @@ -23235,19 +24654,18 @@ stylis-rule-sheet@^0.0.10: integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== stylis@^3.5.0: - version "3.5.4" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" - integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + version "3.5.1" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.1.tgz#fd341d59f57f9aeb412bc14c9d8a8670b438e03b" + integrity sha512-yM4PyeHuwhIOUHNJxi1/Mbq8kVLv4AkyE7IYLP/LK0lIFcr3tRa2H1iZlBYKIxOlf+/jruBTe8DdKSyQX9w4OA== subtext@6.x.x: - version "6.0.12" - resolved "https://registry.yarnpkg.com/subtext/-/subtext-6.0.12.tgz#ac09be3eac1eca3396933adeadd65fc781f64fc1" - integrity sha512-yT1wCDWVgqvL9BIkWzWqgj5spUSYo/Enu09iUV8t2ZvHcr2tKGTGg2kc9tUpVEsdhp1ihsZeTAiDqh0TQciTPQ== + version "6.0.7" + resolved "https://registry.yarnpkg.com/subtext/-/subtext-6.0.7.tgz#8e40a67901a734d598142665c90e398369b885f9" + integrity sha512-IcJUvRjeR+NB437Iq+LORFNJW4L6Knqkj3oQrBrkdhIaS2VKJvx/9aYEq7vi+PEx5/OuehOL/40SkSZotLi/MA== dependencies: boom "7.x.x" - bourne "1.x.x" content "4.x.x" - hoek "6.x.x" + hoek "5.x.x" pez "4.x.x" wreck "14.x.x" @@ -23266,25 +24684,25 @@ sudo-block@^1.1.0: is-root "^1.0.0" suffix@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/suffix/-/suffix-0.1.1.tgz#cc58231646a0ef1102f79478ef3a9248fd9c842f" - integrity sha1-zFgjFkag7xEC95R47zqSSP2chC8= + version "0.1.0" + resolved "https://registry.yarnpkg.com/suffix/-/suffix-0.1.0.tgz#3e46966de56af17600385e58db8ec659dd797907" + integrity sha1-PkaWbeVq8XYAOF5Y247GWd15eQc= -superagent@^3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" - integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== +superagent@3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.2.tgz#e4a11b9d047f7d3efeb3bbe536d9ec0021d16403" + integrity sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ== dependencies: component-emitter "^1.2.0" cookiejar "^2.1.0" debug "^3.1.0" extend "^3.0.0" form-data "^2.3.1" - formidable "^1.2.0" + formidable "^1.1.1" methods "^1.1.1" mime "^1.4.1" qs "^6.5.1" - readable-stream "^2.3.5" + readable-stream "^2.0.5" supercluster@^5.0.0: version "5.0.0" @@ -23302,12 +24720,12 @@ supertest-as-promised@^4.0.2: methods "^1.1.1" supertest@^3.1.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.4.2.tgz#bad7de2e43d60d27c8caeb8ab34a67c8a5f71aad" - integrity sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.1.0.tgz#f9ebaf488e60f2176021ec580bdd23ad269e7bc6" + integrity sha512-O44AMnmJqx294uJQjfUmEyYOg7d9mylNFsMw/Wkz4evKd1njyPrtCN+U6ZIC7sKtfEVQhfTqFFijlXx8KP/Czw== dependencies: - methods "^1.1.2" - superagent "^3.8.3" + methods "~1.1.2" + superagent "3.8.2" supports-color@1.2.0: version "1.2.0" @@ -23338,14 +24756,35 @@ supports-color@^3.1.0, supports-color@^3.1.2, supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: +supports-color@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= + dependencies: + has-flag "^2.0.0" + +supports-color@^5.1.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.2.0, supports-color@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" + integrity sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: +supports-color@^6.0.0, supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== @@ -23380,10 +24819,10 @@ svgo@^0.7.2: sax "~1.2.1" whet.extend "~0.9.9" -svgo@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316" - integrity sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA== +svgo@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.0.tgz#305a8fc0f4f9710828c65039bb93d5793225ffc3" + integrity sha512-xBfxJxfk4UeVN8asec9jNxHiv3UAMv/ujwBWGYvQhhMb2u3YTGKkiybPcLFDLq7GLLWE9wa73e0/m8L5nTzQbw== dependencies: chalk "^2.4.1" coa "^2.0.2" @@ -23392,7 +24831,7 @@ svgo@^1.2.1: css-tree "1.0.0-alpha.28" css-url-regex "^1.1.0" csso "^3.5.1" - js-yaml "^3.13.1" + js-yaml "^3.12.0" mkdirp "~0.5.1" object.values "^1.1.0" sax "~1.2.4" @@ -23418,7 +24857,7 @@ symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4, sy resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -symbol-tree@^3.2.2: +symbol-tree@^3.2.1, symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= @@ -23435,7 +24874,12 @@ tabbable@1.1.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-1.1.0.tgz#2c9a9c9f09db5bb0659f587d532548dd6ef2067b" integrity sha512-35UF7YrX08Wj5+CFFwO5akQYE4UFICvOY/xQ7Dgduhxb5QW7IS/d0DeLO9DnRzwVyfyiz6vRPj3MYhPt/Zopiw== -tabbable@^1.0.3, tabbable@^1.1.0: +tabbable@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-1.1.2.tgz#b171680aea6e0a3e9281ff23532e2e5de11c0d94" + integrity sha512-77oqsKEPrxIwgRcXUwipkj9W5ItO97L6eUT1Ar7vh+El16Zm4M6V+YU1cbipHEa6q0Yjw8O3Hoh8oRgatV5s7A== + +tabbable@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-1.1.3.tgz#0e4ee376f3631e42d7977a074dbd2b3827843081" integrity sha512-nOWwx35/JuDI4ONuF0ZTo6lYvI0fY0tZCH1ErzY2EXfu4az50ZyiUX8X073FLiZtmWUVlkRnuXsehjJgCw9tYg== @@ -23484,13 +24928,13 @@ taketalk@^1.0.0: tapable@^0.1.8: version "0.1.10" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + resolved "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" integrity sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q= tapable@^1.0.0, tapable@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" + integrity sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA== tar-fs@^1.16.2, tar-fs@^1.16.3: version "1.16.3" @@ -23502,7 +24946,17 @@ tar-fs@^1.16.2, tar-fs@^1.16.3: pump "^1.0.0" tar-stream "^1.1.2" -tar-stream@^1.1.2, tar-stream@^1.5.0, tar-stream@^1.5.2: +tar-stream@^1.1.2, tar-stream@^1.5.2: + version "1.5.5" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" + integrity sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg== + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + +tar-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== @@ -23559,9 +25013,9 @@ tcp-port-used@^1.0.1: is2 "2.0.1" teamwork@3.x.x: - version "3.2.0" - resolved "https://registry.yarnpkg.com/teamwork/-/teamwork-3.2.0.tgz#27916edab815459c1a4686252eb18fb5925f49fa" - integrity sha512-xAmJ8PIVjRZMXAHgUuOP8ITsv0SedyWAit2UWiNImXgg/F+BxrsG46ZegElNBM0Dwp+iMfbigg/Ll/M2oDRYww== + version "3.0.1" + resolved "https://registry.yarnpkg.com/teamwork/-/teamwork-3.0.1.tgz#ff38c7161f41f8070b7813716eb6154036ece196" + integrity sha512-hEkJIpDOfOYe9NYaLFk00zQbzZeKNCY8T2pRH3I13Y1mJwxaSQ6NEsjY5rCp+11ezCiZpWGoGFTbOuhg4qKevQ== telejson@^2.1.0, telejson@^2.1.1: version "2.1.1" @@ -23605,7 +25059,21 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.2.1: +terser-webpack-plugin@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" + integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.8.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser-webpack-plugin@^1.2.1: version "1.2.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== @@ -23628,15 +25096,29 @@ terser@^3.16.1: source-map "~0.6.1" source-map-support "~0.5.10" -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== +terser@^3.8.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0" + integrity sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ== dependencies: - glob "^7.1.3" + commander "~2.17.1" + source-map "~0.6.1" + source-map-support "~0.5.6" + +test-exclude@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" + integrity sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA== + dependencies: + arrify "^1.0.1" minimatch "^3.0.4" read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" + require-main-filename "^1.0.1" + +text-encoding@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" + integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= text-hex@1.0.x: version "1.0.0" @@ -23648,10 +25130,10 @@ text-table@0.2.0, text-table@^0.2.0, text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -textextensions@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.4.0.tgz#6a143a985464384cc2cff11aea448cd5b018e72b" - integrity sha512-qftQXnX1DzpSV8EddtHIT0eDDEiBF8ywhFYR2lI9xrGtxqKN+CvLXhACeCIGbCpQfxxERbrkZEFb8cZcDKbVZA== +textextensions@2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" + integrity sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA== thenify-all@^1.0.0: version "1.6.0" @@ -23690,15 +25172,10 @@ throat@^4.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= -throttle-debounce@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5" - integrity sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg== - -through2-filter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" - integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= dependencies: through2 "~2.0.0" xtend "~4.0.0" @@ -23711,12 +25188,12 @@ through2-map@^3.0.0: through2 "~2.0.0" xtend "^4.0.0" -through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== +through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= dependencies: - readable-stream "~2.3.6" + readable-stream "^2.1.5" xtend "~4.0.1" through2@^0.6.1: @@ -23727,15 +25204,23 @@ through2@^0.6.1: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.6: +through2@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s= + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@~2.3.4, through@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= thunky@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" - integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== + version "1.0.2" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" + integrity sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E= ticky@1.0.0: version "1.0.0" @@ -23765,9 +25250,9 @@ timed-out@^4.0.0, timed-out@^4.0.1: integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae" + integrity sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw== dependencies: setimmediate "^1.0.4" @@ -23785,9 +25270,9 @@ timm@^1.6.1: integrity sha512-hqDTYi/bWuDxL2i6T3v6nrvkAQ/1Bc060GSkVEQZp02zTSTB4CHSKsOkliequCftQaNRcjRqUZmpGWs5FfhrNg== tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + version "2.0.2" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" + integrity sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow== tiny-inflate@^1.0.0, tiny-inflate@^1.0.2: version "1.0.2" @@ -23799,7 +25284,7 @@ tiny-invariant@^0.0.3: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-0.0.3.tgz#4c7283c950e290889e9e94f64d3586ec9156cf44" integrity sha512-SA2YwvDrCITM9fTvHTHRpq9W6L2fBsClbqm3maT5PZux4Z73SPPDYwJMtnoWh6WMgmCkJij/LaOlWiqJqFMK8g== -tiny-invariant@^1.0.2, tiny-invariant@^1.0.3, tiny-invariant@^1.0.4: +tiny-invariant@^1.0.3, tiny-invariant@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.4.tgz#346b5415fd93cb696b0c4e8a96697ff590f92463" integrity sha512-lMhRd/djQJ3MoaHEBrw8e2/uM4rs9YMNk0iOr8rHQ0QdbM7D4l0gFl3szKdeixrlyfm9Zqi4dxHCM2qVG8ND5g== @@ -23816,11 +25301,6 @@ tiny-lr@^1.1.1: object-assign "^4.1.0" qs "^6.4.0" -tiny-warning@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.2.tgz#1dfae771ee1a04396bdfde27a3adcebc6b648b28" - integrity sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q== - tinycolor2@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.3.0.tgz#3f38e6424de4566122d550eb1acc80cad37a7184" @@ -23957,7 +25437,16 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" -to-regex@^3.0.1, to-regex@^3.0.2: +to-regex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + integrity sha1-FTWL7kosg712N3uh3ASdDxiDeq4= + dependencies: + define-property "^0.2.5" + extend-shallow "^2.0.1" + regex-not "^1.0.0" + +to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== @@ -23974,27 +25463,22 @@ to-through@^2.0.0: dependencies: through2 "^2.0.3" -toggle-selection@^1.0.6: +toggle-selection@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - token-stream@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo= topo@3.x.x: - version "3.0.3" - resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c" - integrity sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ== + version "3.0.0" + resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.0.tgz#37e48c330efeac784538e0acd3e62ca5e231fe7a" + integrity sha512-Tlu1fGlR90iCdIPURqPiufqAlCZYzLjHYVVbcFWDMcX7+tK8hdZWAfsMrD/pBul9jqHHwFjNdf1WaxA9vTRRhw== dependencies: - hoek "6.x.x" + hoek "5.x.x" topojson-client@3.0.0, topojson-client@^3.0.0: version "3.0.0" @@ -24010,39 +25494,22 @@ touch@^2.0.1: dependencies: nopt "~1.0.10" -tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.4.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== +tough-cookie@>=2.3.3, tough-cookie@^2.0.0, tough-cookie@^2.3.3, tough-cookie@^2.4.3, tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" + psl "^1.1.24" + punycode "^1.4.1" -tough-cookie@~2.3.0: +tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== dependencies: punycode "^1.4.1" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tr46@^1.0.1: +tr46@^1.0.0, tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= @@ -24055,9 +25522,9 @@ traverse@0.6.6: integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= tree-kill@^1.1.0, tree-kill@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" - integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" + integrity sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg== treeify@^1.0.1: version "1.1.0" @@ -24082,9 +25549,9 @@ trim-right@^1.0.1: integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= trim-trailing-lines@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz#e0ec0810fd3c3f1730516b45f49083caaf2774d9" - integrity sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz#7aefbb7808df9d669f6da2e438cac8c46ada7684" + integrity sha1-eu+7eAjfnWafbaLkOMrIxGradoQ= trim@0.0.1: version "0.0.1" @@ -24097,16 +25564,16 @@ triple-beam@^1.2.0, triple-beam@^1.3.0: integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== trough@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.3.tgz#e29bd1614c6458d44869fc28b255ab7857ef7c24" - integrity sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.1.tgz#a9fd8b0394b0ae8fff82e0633a0a36ccad5b5f86" + integrity sha1-qf2LA5Swro//guBjOgo2zK1bX4Y= "true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + version "1.0.2" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + integrity sha1-fskRMJJHZsf1c74wIMNPj9/QDWI= dependencies: - glob "^7.1.2" + glob "^6.0.4" trunc-html@1.0.2: version "1.0.2" @@ -24135,16 +25602,9 @@ ts-invariant@^0.2.1: tslib "^1.9.3" ts-invariant@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.3.3.tgz#b5742b1885ecf9e29c31a750307480f045ec0b16" - integrity sha512-UReOKsrJFGC9tUblgSRWo+BsVNbEd77Cl6WiV/XpMlkifXwNIJbknViCucHvVZkXSC/mcWeRnIGdY7uprcwvdQ== - dependencies: - tslib "^1.9.3" - -ts-invariant@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.1.tgz#2612cb76626cf7c6debf59e6d284d0abd9caae07" - integrity sha512-fdL8AZinDiVKMsOI0cOWHLprS85LWy2p/eVSctVe6fpZF9BAvO59sQYMEWQ37yybBtlKU2zkmILYmy1jrOf6+g== + version "0.3.2" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.3.2.tgz#89a2ffeb70879b777258df1df1c59383c35209b0" + integrity sha512-QsY8BCaRnHiB5T6iE4DPlJMAKEG3gzMiUco9FEt1jUXQf0XP6zi0idT0i0rMTu8A326JqNSDsmlkA9dRSh1TRg== dependencies: tslib "^1.9.3" @@ -24159,9 +25619,9 @@ tslib@1.9.3, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.2, tslib@^1.9.3: integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== tsutils@^3.7.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.10.0.tgz#6f1c95c94606e098592b0dff06590cf9659227d6" - integrity sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q== + version "3.9.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.9.1.tgz#2a40dc742943c71eca6d5c1994fcf999956be387" + integrity sha512-hrxVtLtPqQr//p8/msPT1X1UYXUjizqSit5d9AQ5k38TcV38NyecL5xODNxa73cLe/5sdiJ+w1FqzDhRBA/anA== dependencies: tslib "^1.8.1" @@ -24622,9 +26082,9 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= twig@^1.10.5: - version "1.13.2" - resolved "https://registry.yarnpkg.com/twig/-/twig-1.13.2.tgz#d349895a5f762b52fab71c7a373cf3153819cd7b" - integrity sha512-F7o4sDD2DaIj2II8VrbmDXnompOO6ESNQSh97rtJuif00v5FoUWTlkJE1ZlfeFNAwSCU9rexWsB1+3oF8jmU/Q== + version "1.12.0" + resolved "https://registry.yarnpkg.com/twig/-/twig-1.12.0.tgz#04450bf18ee05532ff70098f10b07227f956b8cf" + integrity sha512-zm5OQXb8bQDGQUPytFgjqMKHhqcz/s6pU6Nwsy+rKPhsoOOVwYeHnziiDGFzeTDiFd28M8EVkEO8we6ikcrGjQ== dependencies: locutus "^2.0.5" minimatch "3.0.x" @@ -24662,20 +26122,20 @@ type-detect@^1.0.0: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" integrity sha1-diIXzAbbJY7EiQihKY6LlRIejqI= -type-is@~1.6.16, type-is@~1.6.17: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== dependencies: media-typer "0.3.0" - mime-types "~2.1.24" + mime-types "~2.1.18" typechecker@^4.3.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.7.0.tgz#5249f427358f45b7250c4924fd4d01ed9ba435e9" - integrity sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ== + version "4.5.0" + resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.5.0.tgz#c382920097812364bbaf4595b0ab6588244117a6" + integrity sha512-bqPE/ck3bVIaXP7gMKTKSHrypT32lpYTpiqzPYeYzdSQnmaGvaGhy7TnN/M/+5R+2rs/kKcp9ZLPRp/Q9Yj+4w== dependencies: - editions "^2.1.0" + editions "^1.3.4" typed-styles@^0.0.7: version "0.0.7" @@ -24700,9 +26160,9 @@ typescript-fsa@^2.0.0, typescript-fsa@^2.5.0: integrity sha1-G67AG16PXzTDImedEycBbp4pT68= typescript@^3.3.3333, typescript@~3.0.3, typescript@~3.3.3333, typescript@~3.4.3: - version "3.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" - integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== + version "3.3.3333" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6" + integrity sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw== typings-tester@^0.3.2: version "0.3.2" @@ -24711,15 +26171,15 @@ typings-tester@^0.3.2: dependencies: commander "^2.12.2" -ua-parser-js@^0.7.18: +ua-parser-js@^0.7.18, ua-parser-js@^0.7.9: version "0.7.19" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" + integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== uglify-es@^3.3.4: version "3.3.9" @@ -24729,12 +26189,12 @@ uglify-es@^3.3.4: commander "~2.13.0" source-map "~0.6.1" -uglify-js@3.4.x: - version "3.4.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" - integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== +uglify-js@3.4.x, uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: - commander "~2.19.0" + commander "~2.17.1" source-map "~0.6.1" uglify-js@^2.6, uglify-js@^2.6.1: @@ -24747,14 +26207,6 @@ uglify-js@^2.6, uglify-js@^2.6.1: optionalDependencies: uglify-to-browserify "~1.0.0" -uglify-js@^3.1.4: - version "3.5.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.10.tgz#652bef39f86d9dbfd6674407ee05a5e2d372cf2d" - integrity sha512-/GTF0nosyPLbdJBd+AwYiZ+Hu5z8KXWnO0WCGt1BQ/u9Iamhejykqmz5o1OHJ53+VAk6xVxychonnApDjuqGsw== - dependencies: - commander "~2.20.0" - source-map "~0.6.1" - uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" @@ -24785,12 +26237,12 @@ ultron@~1.1.0: integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== unbzip2-stream@^1.0.9: - version "1.3.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a" - integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg== + version "1.2.5" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47" + integrity sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og== dependencies: - buffer "^5.2.1" - through "^2.3.8" + buffer "^3.0.1" + through "^2.3.6" unc-path-regex@^0.1.2: version "0.1.2" @@ -24803,9 +26255,9 @@ underscore.string@~2.4.0: integrity sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs= underscore.string@~3.3.4: - version "3.3.5" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" - integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== + version "3.3.4" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" + integrity sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s= dependencies: sprintf-js "^1.0.3" util-deprecate "^1.0.2" @@ -24816,9 +26268,9 @@ underscore@~1.7.0: integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk= unherit@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.1.tgz#132748da3e88eab767e08fabfbb89c5e9d28628c" - integrity sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g== + version "1.1.0" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.0.tgz#6b9aaedfbf73df1756ad9e316dd981885840cd7d" + integrity sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0= dependencies: inherits "^2.0.1" xtend "^4.0.1" @@ -24836,6 +26288,11 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== + unicode-match-property-value-ecmascript@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" @@ -24850,9 +26307,9 @@ unicode-properties@^1.0.0: unicode-trie "^0.3.0" unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== unicode-trie@^0.3.0: version "0.3.1" @@ -24863,18 +26320,19 @@ unicode-trie@^0.3.0: tiny-inflate "^1.0.0" unified@^6.1.5: - version "6.2.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba" - integrity sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA== + version "6.1.6" + resolved "https://registry.yarnpkg.com/unified/-/unified-6.1.6.tgz#5ea7f807a0898f1f8acdeefe5f25faa010cc42b1" + integrity sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w== dependencies: bail "^1.0.0" extend "^3.0.0" is-plain-obj "^1.1.0" trough "^1.0.0" vfile "^2.0.0" + x-is-function "^1.0.4" x-is-string "^0.1.0" -unified@^7.1.0: +unified@^7.0.2: version "7.1.0" resolved "https://registry.yarnpkg.com/unified/-/unified-7.1.0.tgz#5032f1c1ee3364bd09da12e27fdd4a7553c7be13" integrity sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw== @@ -24908,7 +26366,7 @@ uniq@^1.0.1: resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= -unique-filename@^1.1.0, unique-filename@^1.1.1: +unique-filename@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== @@ -24928,12 +26386,12 @@ unique-stream@^1.0.0: integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs= unique-stream@^2.0.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" - integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + integrity sha1-WqADz76Uxf+GbE59ZouxxNuts2k= dependencies: - json-stable-stringify-without-jsonify "^1.0.1" - through2-filter "^3.0.0" + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" unique-string@^1.0.0: version "1.0.0" @@ -24942,48 +26400,34 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -unist-util-is@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.2.tgz#1193fa8f2bfbbb82150633f3a8d2eb9a1c1d55db" - integrity sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw== +unist-util-is@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b" + integrity sha1-DDEmKeP5YMZukx6BLT2A53AQlHs= unist-util-remove-position@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz#86b5dad104d0bbfbeb1db5f5c92f3570575c12cb" - integrity sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q== + version "1.1.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz#5a85c1555fc1ba0c101b86707d15e50fa4c871bb" + integrity sha1-WoXBVV/BugwQG4ZwfRXlD6TIcbs= dependencies: unist-util-visit "^1.1.0" unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" - integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== - -unist-util-stringify-position@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.0.tgz#4c452c0dbcbc509f7bcd366e9a8afd646f9d51ae" - integrity sha512-Uz5negUTrf9zm2ZT2Z9kdOL7Mr7FJLyq3ByqagUi7QZRVK1HnspVazvSqwHt73jj7APHtpuJ4K110Jm8O6/elw== - dependencies: - "@types/unist" "^2.0.2" + version "1.1.1" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz#3ccbdc53679eed6ecf3777dd7f5e3229c1b6aa3c" + integrity sha1-PMvcU2ee7W7PN3fdf14yKcG2qjw= unist-util-visit-parents@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06" integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q== -unist-util-visit-parents@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz#63fffc8929027bee04bfef7d2cce474f71cb6217" - integrity sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA== - dependencies: - unist-util-is "^2.1.2" - unist-util-visit@^1.1.0, unist-util-visit@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.0.tgz#1cb763647186dc26f5e1df5db6bd1e48b3cc2fb1" - integrity sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.3.0.tgz#41ca7c82981fd1ce6c762aac397fc24e35711444" + integrity sha512-9ntYcxPFtl44gnwXrQKZ5bMqXMY0ZHzUpqMFiU4zcc8mmf/jzYm8GhYgezuUlX4cJIM1zIDYaO6fG/fI+L6iiQ== dependencies: - unist-util-visit-parents "^2.0.0" + unist-util-is "^2.1.1" universal-user-agent@^2.0.0, universal-user-agent@^2.0.1: version "2.0.3" @@ -24993,9 +26437,9 @@ universal-user-agent@^2.0.0, universal-user-agent@^2.0.1: os-name "^3.0.0" universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + integrity sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= unlazy-loader@^0.1.3: version "0.1.3" @@ -25051,18 +26495,25 @@ unzip-response@^2.0.1: resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= -upath@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== +upath@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== -update-check@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.1.tgz#24fc52266273cb8684d2f1bf9687c0e52dcf709f" - integrity sha512-M3rjq5KwSrWZrm2GVPIQIF+NXpIn5I9mIV67gGoydptQvzRjLp9ZbM6ctFJeNuaWSm5+mNP7aInELjSiLcIw6A== +update-notifier@2.3.0, update-notifier@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" + integrity sha1-TognpruRUUCrCTVZ1wFOPruDdFE= dependencies: - registry-auth-token "3.3.2" - registry-url "3.1.0" + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" update-notifier@^0.5.0: version "0.5.0" @@ -25077,7 +26528,7 @@ update-notifier@^0.5.0: semver-diff "^2.0.0" string-length "^1.0.0" -update-notifier@^2.2.0, update-notifier@^2.5.0: +update-notifier@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== @@ -25141,11 +26592,11 @@ url-parse-lax@^3.0.0: prepend-http "^2.0.0" url-parse@^1.4.3: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + version "1.4.4" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" + integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg== dependencies: - querystringify "^2.1.1" + querystringify "^2.0.0" requires-port "^1.0.0" url-pattern@^1.0.3: @@ -25171,10 +26622,14 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +use@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + integrity sha1-riig1y+TvyJCKhii43mZMRLeyOg= + dependencies: + define-property "^0.2.5" + isobject "^3.0.0" + lazy-cache "^2.0.2" user-home@^1.1.1: version "1.1.1" @@ -25221,27 +26676,13 @@ util.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" -util@0.10.3: +util@0.10.3, util@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - utila@^0.4.0, utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -25262,7 +26703,12 @@ uuid@^2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: +uuid@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + integrity sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g== + +uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== @@ -25279,13 +26725,6 @@ v8flags@^2.0.2: dependencies: user-home "^1.1.1" -v8flags@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.2.tgz#fc5cd0c227428181e6c29b2992e4f8f1da5e0c9f" - integrity sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw== - dependencies: - homedir-polyfill "^1.0.1" - val-loader@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/val-loader/-/val-loader-1.1.1.tgz#32ba8ed5c3607504134977251db2966499e15ef7" @@ -25300,12 +26739,12 @@ valid-url@1.0.9: integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + integrity sha1-KAS6vnEq0zeUWaz74kdGqywwP7w= dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" validate-npm-package-name@2.2.2: version "2.2.2" @@ -25335,9 +26774,9 @@ vary@~1.1.2: integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= vega-canvas@^1.0.1, vega-canvas@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vega-canvas/-/vega-canvas-1.2.1.tgz#ee0586e2a1f096f6a5d1710df61ef501562c2bd4" - integrity sha512-k/S3EPeJ37D7fYDhv4sEg7fNWVpLheQY7flfLyAmJU7aSwCMgw8cZJi0CKHchJeculssfH+41NCqvRB1QtaJnw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/vega-canvas/-/vega-canvas-1.1.0.tgz#99ce74d4510a46fc9ed1a8721014da725898ec9f" + integrity sha512-0RBwjnrFf4VRhNm5ICY+o1/q6mynli+VheOXKGML9mElRsplZgzd/pv9NnNRNigU+M66Kr7zUpskoakh8EhW9Q== vega-crossfilter@^3.0.0: version "3.0.1" @@ -25374,11 +26813,11 @@ vega-event-selector@^2.0.0: integrity sha512-EZeStM/7LNfJiRuop0lvhOR52Q1l9i/EIYUnm/XddhjR+UqhPkeCmZcffMTr41z3aGm/zciVLlKanUWNT+jQ1A== vega-expression@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/vega-expression/-/vega-expression-2.6.0.tgz#9955887b53b05da8e1d101c41a7ddce414edfb6d" - integrity sha512-c2FFrIfKtlTtLCR3BnZDm6O2ey7u+5YRukLnNobRe+hoiqeH86C2+FkjXotE63cYGj39R5OS+SK+VBSDz3bmVw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/vega-expression/-/vega-expression-2.4.0.tgz#02eb789623bf24c959b7b8756bf2cacb10bd54a6" + integrity sha512-Ti2rqnXscu281omgAukd37yDcw2AjETshB8tWcTOciFPUkfLQKwL6d1UIuIq4RkWuKDTU9Htd2UCpvFDu+O1eQ== dependencies: - vega-util "^1.8.0" + vega-util "^1.7.0" vega-force@^3.0.0: version "3.0.0" @@ -25482,11 +26921,11 @@ vega-parser@^3.8.0, vega-parser@^3.9.0: vega-util "^1.7.0" vega-projection@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vega-projection/-/vega-projection-1.2.1.tgz#f3425238fadab0b875f2ce92e5bba9dfc983f367" - integrity sha512-7ouWSDdBV8kBQFA26RHUtp39DDO7g3NcEJlhhBywvCQ0nEtqZinERW3bIOxVxZ5H1OKkmhBrxQUPHok2AC06aA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/vega-projection/-/vega-projection-1.2.0.tgz#812c955251dab495fda83d9406ba72d9833a2014" + integrity sha1-gSyVUlHatJX9qD2UBrpy2YM6IBQ= dependencies: - d3-geo "^1.11.3" + d3-geo "^1.10.0" vega-runtime@^3.1.1, vega-runtime@^3.2.0: version "3.2.0" @@ -25530,17 +26969,18 @@ vega-spec-injector@^0.0.2: integrity sha512-wOMMqmpssn0/ZFPW7wl1v26vbseRX7zHPWzEyS9TwNXTRCu1TcjIBIR+X23lCWocxhoBqFxmqyn8UowMhlGtAg== vega-statistics@^1.2.1, vega-statistics@^1.2.2, vega-statistics@^1.2.3: - version "1.3.1" - resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.3.1.tgz#0b30d612bec5b94ad99a7cae8abf59b436fdac94" - integrity sha512-4GlQAlQKn2He9AhyM8brx0d9YKHPGwRzL0JPhgL9FmXOsi+2F7tJk+4P6UwhKHinRA/iroEQqtwzu6oFgZP0Gw== + version "1.2.3" + resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.2.3.tgz#4a7ca4c5fd9cc00c3700cb9cde336995439a55fa" + integrity sha512-Acs6kswwO7lJYiG7KXxSI+Hr+PDKF+EMX/KmCOmyn8JB1W9fWIhTMBCNKf27r8XuAboBd0fQixuIx9L1Scdo+g== dependencies: - d3-array "^2.0.3" + d3-array "^2.0.2" vega-tooltip@^0.9.14: - version "0.9.16" - resolved "https://registry.yarnpkg.com/vega-tooltip/-/vega-tooltip-0.9.16.tgz#1a2c01aa53ce8fbe9478ded50c3e556e72c7ae66" - integrity sha512-XJtP8G9EFK8Ynytydy0RLbCodBrf+QGbrKsneP/dt44oaTG6Orw9iBgh6hCz+m2UiRKlx6iCb4EjF8kDz1VcWw== + version "0.9.14" + resolved "https://registry.yarnpkg.com/vega-tooltip/-/vega-tooltip-0.9.14.tgz#c10bcacf69bf60a02c598ec46b905f94f28c54ac" + integrity sha512-rs/U6MxkccghrHJbtXzHMKq/OnUHqeGEpnF6Ssu6j3Hnx6aZ+Tmq6zdJwYZ0DTY+Xn1ey/SgV/a7G3/ILyUcmQ== dependencies: + json-stringify-safe "^5.0.1" vega-util "^1.7.0" vega-transforms@^2.3.0: @@ -25553,24 +26993,17 @@ vega-transforms@^2.3.0: vega-statistics "^1.2.3" vega-util "^1.7.0" -vega-typings@*: - version "0.6.2" - resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-0.6.2.tgz#2951bf7a4208a5aca3aa8e1316c4df81e759b02b" - integrity sha512-k1VBtlj+Ls8cgl1zvdUD6iX7YGsxkHSWmeG0C8DGOxKU7Q3imOCb7uUytexVjVKuWqwCrMnmNTYspelgLBMO+Q== - dependencies: - vega-util "^1.10.0" - -vega-typings@^0.3.17: +vega-typings@*, vega-typings@^0.3.17: version "0.3.53" resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-0.3.53.tgz#a70b9730ebe1e4c557019ccccc5fd98035b0aab0" integrity sha512-XQRd66eL62ll6tHENQIJHtdwXemqXoB4KnVVbGUwGJIHjQkHHluCbkoWVRvPYuRd+OLM1RXVc+EBxA015hJ1SQ== dependencies: vega-util "^1.7.0" -vega-util@^1.10.0, vega-util@^1.7.0, vega-util@^1.8.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.10.0.tgz#edfd8c04f1d269f903976c228820153902c270d4" - integrity sha512-fTGnTG7FhtTG9tiYDL3k5s8YHqB71Ml5+aC9B7eaBygeB8GKXBrcbTXLOzoCRxT3Jr5cRhr99PMBu0AkqmhBog== +vega-util@^1.7.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.7.1.tgz#0b95bbe6058895c332596c215247507caa68ab61" + integrity sha512-jdzigLdaXH0rClqkr/qHY//xvmLyxQyZL4Wxb3mew29QpITrMk/USV6v/399h29xVt1+hJuw1vpLoJqAq6WerA== vega-view-transforms@^2.0.3: version "2.0.3" @@ -25629,23 +27062,15 @@ verror@1.10.0: extsprintf "^1.2.0" vfile-location@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.4.tgz#2a5e7297dd0d9e2da4381464d04acc6b834d3e55" - integrity sha512-KRL5uXQPoUKu+NGvQVL4XLORw45W62v4U4gxJ3vRlDfI9QsT4ZN1PNXn/zQpKUulqGDpYuT0XDfp5q9O87/y/w== + version "2.0.2" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.2.tgz#d3675c59c877498e492b4756ff65e4af1a752255" + integrity sha1-02dcWch3SY5JK0dW/2Xkrxp1IlU= vfile-message@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" - integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA== - dependencies: - unist-util-stringify-position "^1.1.1" - -vfile-message@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.0.tgz#750bbb86fe545988a67e899b329bbcabb73edef6" - integrity sha512-YS6qg6UpBfIeiO+6XlhPOuJaoLvt1Y9g2cmlwqhBOOU0XRV8j5RLeoz72t6PWLvNXq3EBG1fQ05wNPrUoz0deQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.0.0.tgz#a6adb0474ea400fa25d929f1d673abea6a17e359" + integrity sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw== dependencies: - "@types/unist" "^2.0.2" unist-util-stringify-position "^1.1.1" vfile@^2.0.0: @@ -25658,7 +27083,7 @@ vfile@^2.0.0: unist-util-stringify-position "^1.0.0" vfile-message "^1.0.0" -vfile@^3.0.0: +vfile@^3.0.0, vfile@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803" integrity sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ== @@ -25668,17 +27093,6 @@ vfile@^3.0.0: unist-util-stringify-position "^1.0.0" vfile-message "^1.0.0" -vfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.0.0.tgz#ebf3b48af9fcde524d5e08d5f75812058a5f78ad" - integrity sha512-WMNeHy5djSl895BqE86D7WqA0Ie5fAIeGCa7V1EqiXyJg5LaGch2SUaZueok5abYQGH6mXEAsZ45jkoILIOlyA== - dependencies: - "@types/unist" "^2.0.2" - is-buffer "^2.0.0" - replace-ext "1.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - vinyl-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" @@ -25787,26 +27201,21 @@ vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.1.0: replace-ext "^1.0.0" vise@3.x.x: - version "3.0.2" - resolved "https://registry.yarnpkg.com/vise/-/vise-3.0.2.tgz#9a8b7450f783aa776faa327fe47d7bfddb227266" - integrity sha512-X52VtdRQbSBXdjcazRiY3eRgV3vTQ0B+7Wh8uC9cVv7lKfML5m9+9NHlbcgCY0R9EAqD1v/v7o9mhGh2A3ANFg== + version "3.0.0" + resolved "https://registry.yarnpkg.com/vise/-/vise-3.0.0.tgz#76ad14ab31669c50fbb0817bc0e72fedcbb3bf4c" + integrity sha512-kBFZLmiL1Vm3rHXphkhvvAcsjgeQXRrOFCbJb0I50YZZP4HGRNH+xGzK3matIMcpbsfr3I02u9odj4oCD0TWgA== dependencies: - hoek "6.x.x" + hoek "5.x.x" vision@^5.3.3: - version "5.4.4" - resolved "https://registry.yarnpkg.com/vision/-/vision-5.4.4.tgz#981b2d811a6061cc14cf2d5d05ad3bbc3ee59572" - integrity sha512-jFeH7pU/ODYmTOpY5jutMKU/fDr+P621WYEnWgqwDikxutBWJ+koxlgGnkZQoKY6JlYdY4Awo+rPN3DNdTeDKg== + version "5.4.0" + resolved "https://registry.yarnpkg.com/vision/-/vision-5.4.0.tgz#fc620deb95227881ea8b8d8a044dc1d1fd40e584" + integrity sha512-f8kbjvo/dUbR4ZDF0pHPuOjQFg/6zOMlP1Tb9gK2ukCa7Ksd24174DCzubtov6AxIDhZhO5RYQeeDlF8ujlKWQ== dependencies: boom "7.x.x" - hoek "6.x.x" + hoek "5.x.x" items "2.x.x" - joi "14.x.x" - -vlq@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== + joi "13.x.x" vm-browserify@0.0.4: version "0.0.4" @@ -25885,25 +27294,32 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" -wait-for-expect@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-1.1.1.tgz#9cd10e07d52810af9e0aaf509872e38f3c3d81ae" - integrity sha512-vd9JOqqEcBbCDhARWhW85ecjaEcfBLuXgVBqatfS3iw6oU4kzAcs+sCNjF+TC9YHPImCW7ypsuQc+htscIAQCw== +wait-for-expect@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-1.1.0.tgz#6607375c3f79d32add35cd2c87ce13f351a3d453" + integrity sha512-vQDokqxyMyknfX3luCDn16bSaRcOyH6gGuUXMIbxBLeTo6nWuEWYqMTT9a+44FmW8c2m6TRWBdNvBBjA1hwEKg== walk@2.3.x: - version "2.3.14" - resolved "https://registry.yarnpkg.com/walk/-/walk-2.3.14.tgz#60ec8631cfd23276ae1e7363ce11d626452e1ef3" - integrity sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg== + version "2.3.9" + resolved "https://registry.yarnpkg.com/walk/-/walk-2.3.9.tgz#31b4db6678f2ae01c39ea9fb8725a9031e558a7b" + integrity sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins= dependencies: foreachasync "^3.0.0" -walker@^1.0.7, walker@~1.0.5: +walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" +ware@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" + integrity sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q= + dependencies: + wrap-fn "^0.1.0" + warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" @@ -25911,13 +27327,28 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" -warning@^4.0.1, warning@^4.0.2: +warning@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.2.tgz#aa6876480872116fa3e11d434b0d0d8d91e44607" + integrity sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug== + dependencies: + loose-envify "^1.0.0" + +warning@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -25927,10 +27358,10 @@ watchpack@^1.5.0: graceful-fs "^4.1.2" neo-async "^2.5.0" -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" + integrity sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4= dependencies: minimalistic-assert "^1.0.0" @@ -25946,32 +27377,41 @@ web-namespaces@^1.1.2: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.2.tgz#c8dc267ab639505276bae19e129dbd6ae72b22b4" integrity sha512-II+n2ms4mPxK+RnIxRPOw3zwF2jRscdJIUE9BfkKHm4FYEg9+biIoTMnaZF5MpemE3T+VhMLrhbyD4ilkPCSbg== -webidl-conversions@^4.0.2: +webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-cli@^3.1.2: - version "3.3.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.1.tgz#98b0499c7138ba9ece8898bd99c4f007db59909d" - integrity sha512-c2inFU7SM0IttEgF7fK6AaUsbBnORRzminvbyRKS+NlbQHVZdCtzKBlavRL5359bFsywXGRAItA5di/IruC8mg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" + integrity sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ== dependencies: chalk "^2.4.1" cross-spawn "^6.0.5" enhanced-resolve "^4.1.0" - findup-sync "^2.0.0" - global-modules "^1.0.0" + global-modules-path "^2.3.0" import-local "^2.0.0" interpret "^1.1.0" loader-utils "^1.1.0" supports-color "^5.5.0" v8-compile-cache "^2.0.2" - yargs "^12.0.5" + yargs "^12.0.2" -webpack-dev-middleware@^3.5.1, webpack-dev-middleware@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.6.2.tgz#f37a27ad7c09cd7dc67cd97655413abaa1f55942" - integrity sha512-A47I5SX60IkHrMmZUlB0ZKSWi29TZTcPz7cha1Z75yYOsgWh/1AcPmQEbC8ZIbU3A1ytSv1PMU0PyPz2Lmz2jg== +webpack-dev-middleware@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" + integrity sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA== + dependencies: + memory-fs "~0.4.1" + mime "^2.3.1" + range-parser "^1.0.3" + webpack-log "^2.0.0" + +webpack-dev-middleware@^3.5.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.6.1.tgz#91f2531218a633a99189f7de36045a331a4b9cd4" + integrity sha512-XQmemun8QJexMEvNFbD2BIg4eSKrmSIMrTfnl2nql2Sc6OGAYFyb8rwuYrCjl/IiEYYuyTEiimMscu7EXji/Dw== dependencies: memory-fs "^0.4.1" mime "^2.3.1" @@ -25979,45 +27419,43 @@ webpack-dev-middleware@^3.5.1, webpack-dev-middleware@^3.6.2: webpack-log "^2.0.0" webpack-dev-server@^3.1.10: - version "3.3.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.3.1.tgz#7046e49ded5c1255a82c5d942bcdda552b72a62d" - integrity sha512-jY09LikOyGZrxVTXK0mgIq9y2IhCoJ05848dKZqX1gAGLU1YDqgpOT71+W53JH/wI4v6ky4hm+KvSyW14JEs5A== + version "3.1.10" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz#507411bee727ee8d2fdffdc621b66a64ab3dea2b" + integrity sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" - chokidar "^2.1.5" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.0" - express "^4.16.4" - html-entities "^1.2.1" - http-proxy-middleware "^0.19.1" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^3.1.0" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "~0.18.0" import-local "^2.0.0" - internal-ip "^4.2.0" + internal-ip "^3.0.1" ip "^1.1.5" - killable "^1.0.1" - loglevel "^1.6.1" - opn "^5.5.0" - portfinder "^1.0.20" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" schema-utils "^1.0.0" - selfsigned "^1.10.4" - semver "^6.0.0" - serve-index "^1.9.1" + selfsigned "^1.9.1" + serve-index "^1.7.2" sockjs "0.3.19" sockjs-client "1.3.0" - spdy "^4.0.0" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.6.2" + spdy "^3.4.1" + strip-ansi "^3.0.0" + supports-color "^5.1.0" + webpack-dev-middleware "3.4.0" webpack-log "^2.0.0" - yargs "12.0.5" + yargs "12.0.2" webpack-hot-middleware@^2.24.3: - version "2.24.4" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.24.4.tgz#0ae1eeca000c6ffdcb22eb574d0e6d7717672b0f" - integrity sha512-YFA4j2tg9WPkcQKcyHMZn6787QngWf/ahXvAJRZ1ripySa+4ihjzDcYBsfC4ihOucTd02IJ12v+VTGMsEGxq0w== + version "2.24.3" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.24.3.tgz#5bb76259a8fc0d97463ab517640ba91d3382d4a6" + integrity sha512-pPlmcdoR2Fn6UhYjAhp1g/IJy1Yc9hD+T6O9mjRcWV2pFbBjIFoJXhP0CoD0xPOhWJuWXuZXGBga9ybbOdzXpg== dependencies: ansi-html "0.0.7" html-entities "^1.2.0" @@ -26049,7 +27487,15 @@ webpack-merge@4.1.4: dependencies: lodash "^4.17.5" -webpack-sources@^1.1.0, webpack-sources@^1.3.0: +webpack-sources@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + integrity sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== @@ -26087,10 +27533,40 @@ webpack@4.23.1: watchpack "^1.5.0" webpack-sources "^1.3.0" -webpack@^4.23.1, webpack@^4.29.0: - version "4.30.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.30.0.tgz#aca76ef75630a22c49fcc235b39b4c57591d33a9" - integrity sha512-4hgvO2YbAFUhyTdlR4FNyt2+YaYBYHavyzjCMbZzgglo02rlKi/pcsEzwCuCpsn1ryzIl1cq/u8ArIKu8JBYMg== +webpack@^4.23.1: + version "4.25.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.25.1.tgz#4f459fbaea0f93440dc86c89f771bb3a837cfb6d" + integrity sha512-T0GU/3NRtO4tMfNzsvpdhUr8HnzA4LTdP2zd+e5zd6CdOH5vNKHnAlO+DvzccfhPdzqRrALOFcjYxx7K5DWmvA== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/wasm-edit" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.4" + tapable "^1.1.0" + uglifyjs-webpack-plugin "^1.2.4" + watchpack "^1.5.0" + webpack-sources "^1.3.0" + +webpack@^4.29.0: + version "4.29.6" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.6.tgz#66bf0ec8beee4d469f8b598d3988ff9d8d90e955" + integrity sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw== dependencies: "@webassemblyjs/ast" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5" @@ -26135,12 +27611,19 @@ wgs84@0.0.0: resolved "https://registry.yarnpkg.com/wgs84/-/wgs84-0.0.0.tgz#34fdc555917b6e57cf2a282ed043710c049cdc76" integrity sha1-NP3FVZF7blfPKigu0ENxDASc3HY= -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== +whatwg-encoding@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== + dependencies: + iconv-lite "0.4.19" + +whatwg-encoding@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz#63fb016b7435b795d9025632c086a5209dbd2621" + integrity sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg== dependencies: - iconv-lite "0.4.24" + iconv-lite "0.4.23" whatwg-fetch@2.0.4: version "2.0.4" @@ -26152,12 +27635,21 @@ whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-mimetype@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz#a3d58ef10b76009b042d03e25591ece89b88d171" + integrity sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw== + +whatwg-url@^6.3.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" + integrity sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.0" + webidl-conversions "^4.0.1" -whatwg-url@^6.4.1, whatwg-url@^6.5.0: +whatwg-url@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== @@ -26190,27 +27682,41 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.1.1, which@^1.2.1, which@^1.2.14, which@^1.2.8, which@^1.2.9, which@^1.3.0, which@^1.3.1, which@~1.3.0: +which@1, which@^1.2.9, which@^1.3.1, which@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" +which@^1.1.1, which@^1.2.1, which@^1.2.12, which@^1.2.14, which@^1.2.8, which@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== dependencies: - string-width "^1.0.2 || 2" + string-width "^1.0.2" widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + integrity sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM= dependencies: string-width "^2.1.1" +win-release@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" + integrity sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk= + dependencies: + semver "^5.0.1" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" @@ -26229,9 +27735,9 @@ windows-release@^3.1.0: execa "^1.0.0" winston-transport@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66" - integrity sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A== + version "4.2.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.2.0.tgz#a20be89edf2ea2ca39ba25f3e50344d73e6520e5" + integrity sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg== dependencies: readable-stream "^2.3.6" triple-beam "^1.2.0" @@ -26275,9 +27781,9 @@ wordwrap@~0.0.2: integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= worker-farm@^1.5.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== dependencies: errno "~0.1.7" @@ -26305,19 +27811,25 @@ wrap-ansi@^3.0.1: string-width "^2.1.1" strip-ansi "^4.0.0" +wrap-fn@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" + integrity sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU= + dependencies: + co "3.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= wreck@14.x.x, wreck@^14.0.2: - version "14.2.0" - resolved "https://registry.yarnpkg.com/wreck/-/wreck-14.2.0.tgz#0064a5b930fc675f57830c1fd28342da1a70b0fc" - integrity sha512-NFFft3SMgqrJbXEVfYifh+QDWFxni+98/I7ut7rLbz3F0XOypluHsdo3mdEYssGSirMobM3fGlqhyikbWKDn2Q== + version "14.1.0" + resolved "https://registry.yarnpkg.com/wreck/-/wreck-14.1.0.tgz#b13e526b6a8318e5ebc6969c0b21075c06337067" + integrity sha512-y/iwFhwdGoM8Hk1t1I4LbuLhM3curVD8STd5NcFI0c/4b4cQAMLcnCRxXX9sLQAggDC8dXYSaQNsT64hga6lvA== dependencies: boom "7.x.x" - bourne "1.x.x" - hoek "6.x.x" + hoek "5.x.x" write-file-atomic@2.4.1: version "2.4.1" @@ -26338,9 +27850,9 @@ write-file-atomic@^1.1.2: slide "^1.1.5" write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" - integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -26359,9 +27871,9 @@ write-json-file@^2.2.0: write-file-atomic "^2.0.0" write-pkg@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21" - integrity sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.1.0.tgz#030a9994cc9993d25b4e75a9f1a1923607291ce9" + integrity sha1-AwqZlMyZk9JbTnWp8aGSNgcpHOk= dependencies: sort-keys "^2.0.0" write-json-file "^2.2.0" @@ -26387,10 +27899,17 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" +ws@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.0.tgz#119a9dbf92c54e190ec18d10e871d55c95cf9373" + integrity sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg== + dependencies: + async-limiter "~1.0.0" + ws@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + version "6.2.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.0.tgz#13806d9913b2a5f3cbb9ba47b563c002cbc7c526" + integrity sha512-deZYUNlt2O4buFCa3t5bKLf8A7FPP/TVjwOeVNpw818Ma5nk4MLXls2eoEGS39o8119QIYxTrTDoPQ5B/gTD6w== dependencies: async-limiter "~1.0.0" @@ -26403,6 +27922,11 @@ ws@~3.3.1: safe-buffer "~5.1.0" ultron "~1.1.0" +x-is-function@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/x-is-function/-/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e" + integrity sha1-XSlNw9Joy90GJYDgxd93o5HR+h4= + x-is-string@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" @@ -26421,9 +27945,9 @@ xdg-basedir@^3.0.0: integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= xhr@^2.0.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" - integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.1.tgz#ba982cced205ae5eec387169ac9dc77ca4853d38" + integrity sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A== dependencies: global "~4.3.0" is-function "^1.0.1" @@ -26438,6 +27962,11 @@ xml-crypto@^0.10.1: xmldom "=0.1.19" xpath.js ">=0.0.3" +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -26461,21 +27990,11 @@ xmlbuilder@8.2.2: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" integrity sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M= -xmlbuilder@9.0.4: +xmlbuilder@9.0.4, xmlbuilder@~9.0.1: version "9.0.4" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f" integrity sha1-UZy0ymhtAFqEINNJbz8MruzKWA8= -xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - -xmlchars@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-1.3.1.tgz#1dda035f833dbb4f86a0c28eaa6ca769214793cf" - integrity sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw== - xmldom@=0.1.19: version "0.1.19" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.19.tgz#631fc07776efd84118bf25171b37ed4d075a0abc" @@ -26501,11 +28020,23 @@ xregexp@3.2.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-3.2.0.tgz#cb3601987bfe2695b584000c18f1c4a8c322878e" integrity sha1-yzYBmHv+JpW1hAAMGPHEqMMih44= +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== + "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + xxhashjs@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" @@ -26529,9 +28060,16 @@ yallist@^2.1.2: integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= + +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" yargs-parser@^11.1.1: version "11.1.1" @@ -26563,13 +28101,13 @@ yargs-parser@^9.0.2: dependencies: camelcase "^4.1.0" -yargs@12.0.5, yargs@^12.0.1, yargs@^12.0.2, yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== +yargs@12.0.2, yargs@^12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== dependencies: cliui "^4.0.0" - decamelize "^1.2.0" + decamelize "^2.0.0" find-up "^3.0.0" get-caller-file "^1.0.1" os-locale "^3.0.0" @@ -26579,7 +28117,7 @@ yargs@12.0.5, yargs@^12.0.1, yargs@^12.0.2, yargs@^12.0.5: string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" + yargs-parser "^10.1.0" yargs@4.8.1: version "4.8.1" @@ -26619,6 +28157,42 @@ yargs@^11.0.0: y18n "^3.2.1" yargs-parser "^9.0.2" +yargs@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2" + integrity sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ== + dependencies: + cliui "^4.0.0" + decamelize "^2.0.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" + +yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" @@ -26655,10 +28229,10 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yarn-install@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yarn-install/-/yarn-install-1.0.0.tgz#57f45050b82efd57182b3973c54aa05cb5d25230" - integrity sha1-V/RQULgu/VcYKzlzxUqgXLXSUjA= +yarn-install@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/yarn-install/-/yarn-install-0.5.1.tgz#f3c55e8646b6ac8da360b2f8e31afe5c4a067340" + integrity sha512-v0E5rDOoRRGyrbwxIOqPfX/x5kiV4ba7bvzT0wVfOhyZZr7PKP57F3h1hLHa66jYpU7zd4GLTVvjVL/Y1aE/gg== dependencies: cac "^3.0.3" chalk "^1.1.3" @@ -26679,7 +28253,7 @@ yauzl@2.7.0: buffer-crc32 "~0.2.3" fd-slicer "~1.0.1" -yauzl@^2.10.0, yauzl@^2.4.2: +yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= @@ -26687,10 +28261,18 @@ yauzl@^2.10.0, yauzl@^2.4.2: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +yauzl@^2.4.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.1.tgz#a81981ea70a57946133883f029c5821a89359a7f" + integrity sha1-qBmB6nCleUYTOIPwKcWCGok1mn8= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.0.1" + yazl@^2.1.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" - integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== + version "2.4.3" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.3.tgz#ec26e5cc87d5601b9df8432dbdd3cd2e5173a071" + integrity sha1-7CblzIfVYBud+EMtvdPNLlFzoHE= dependencies: buffer-crc32 "~0.2.3" @@ -26707,15 +28289,14 @@ yeoman-character@^1.0.0: supports-color "^3.1.2" yeoman-doctor@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yeoman-doctor/-/yeoman-doctor-3.0.3.tgz#d19b1ef07d1d56d5fd992949a4be83ea4bf7e63d" - integrity sha512-L/1PUIReI8cOzAWgmBY64VBCLeH2IEpgtnF3X97BUU6SraQFczeXXIzh6n5idG4jfzMfWRF1lS4zf6wdg7hAbw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/yeoman-doctor/-/yeoman-doctor-3.0.2.tgz#b9ad20422ba84b3ef03c1d4afa73cc90fa48fe51" + integrity sha512-/KbouQdKgnqxG6K3Tc8VBPAQLPbruQ7KkbinwR+ah507oOFobHnGs8kqj8oMfafY6rXInHdh7nC5YzicCR4Z0g== dependencies: ansi-styles "^3.2.0" bin-version-check "^3.0.0" chalk "^2.3.0" each-async "^1.1.1" - global-tunnel-ng "^2.5.3" latest-version "^3.1.0" log-symbols "^2.1.0" object-values "^1.0.0" @@ -26860,18 +28441,25 @@ z-schema@~3.18.3: optionalDependencies: commander "^2.7.1" -zen-observable-ts@^0.8.18: - version "0.8.18" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.18.tgz#ade44b1060cc4a800627856ec10b9c67f5f639c8" - integrity sha512-q7d05s75Rn1j39U5Oapg3HI2wzriVwERVo4N7uFGpIYuHB9ff02P/E92P9B8T7QVC93jCMHpbXH7X0eVR5LA7A== +zen-observable-ts@^0.8.10: + version "0.8.10" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.10.tgz#18e2ce1c89fe026e9621fd83cc05168228fce829" + integrity sha512-5vqMtRggU/2GhePC9OU4sYEWOdvmayp2k3gjPf4F0mXwB3CSbbNznfDUvDJx9O2ZTa1EIXdJhPchQveFKwNXPQ== + dependencies: + zen-observable "^0.8.0" + +zen-observable-ts@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.16.tgz#969367299074fe17422fe2f46ee417e9a30cf3fa" + integrity sha512-pQl75N7qwgybKVsh6WFO+WwPRijeQ52Gn1vSf4uvPFXald9CbVQXLa5QrOPEJhdZiC+CD4quqOVqSG+Ptz5XLA== dependencies: tslib "^1.9.3" zen-observable "^0.8.0" zen-observable@^0.8.0: - version "0.8.14" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.14.tgz#d33058359d335bc0db1f0af66158b32872af3bf7" - integrity sha512-kQz39uonEjEESwh+qCi83kcC3rZJGh4mrZW7xjkSQYXkq//JZHTtKo+6yuVloTgMtzsIWOJrjIrKvk/dqm0L5g== + version "0.8.8" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.8.tgz#1ea93995bf098754a58215a1e0a7309e5749ec42" + integrity sha512-HnhhyNnwTFzS48nihkCZIJGsWGFcYUz+XPDlPK5W84Ifji8SksC6m7sQWOf8zdCGhzQ4tDYuMYGu5B0N1dXTtg== zip-stream@^2.0.1: version "2.0.1" From 0835f38c1f44c44f08e6e0da937d8c9bd970ea70 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 3 May 2019 15:24:56 -0400 Subject: [PATCH 16/51] [Watcher] Support for adding actions to threshold watch (#35175) * initial support for adding actions via threshold watch * added validation; support for email and slack action types * added support for index action * added support for webhook action * added support for pagerduty action * added support for jira action * cleanup * remove extra spacers * Add SCSS file and tweak actions dropdown position. * address review comments * adjust logic that determines if actions are enabled/disabled * addressing pr feedback * fix linting error --- .../translations/translations/zh-CN.json | 3 - .../watcher/common/constants/action_types.ts | 2 - .../__tests__/get_action_type.js | 11 - .../watcher/common/types/action_types.ts | 84 +++++++ x-pack/plugins/watcher/plugin_definition.js | 1 + x-pack/plugins/watcher/public/_hacks.scss | 4 - x-pack/plugins/watcher/public/index.scss | 16 ++ x-pack/plugins/watcher/public/lib/api.ts | 16 ++ .../documentation_links.ts | 9 +- .../watcher/public/models/action/action.js | 10 +- .../public/models/action/base_action.js | 8 +- .../public/models/action/email_action.js | 74 ++++-- .../public/models/action/hipchat.action.js | 69 ------ .../public/models/action/index.action.js | 88 ------- .../public/models/action/index_action.js | 81 +++++++ .../public/models/action/jira.action.js | 70 ------ .../public/models/action/jira_action.js | 106 ++++++++ .../public/models/action/logging_action.js | 35 ++- .../public/models/action/pagerduty.action.js | 80 ------- .../public/models/action/pagerduty_action.js | 80 +++++++ .../public/models/action/slack_action.js | 89 +++---- .../public/models/action/webhook.action.js | 91 ------- .../public/models/action/webhook_action.js | 116 +++++++++ .../models/execute_details/execute_details.js | 30 +-- .../plugins/watcher/public/models/index.d.ts | 8 + .../watcher/public/models/watch/base_watch.js | 46 +--- .../watcher/public/models/watch/json_watch.js | 2 +- .../public/models/watch/threshold_watch.js | 2 +- .../components/json_watch_edit/index.ts} | 2 +- .../{ => json_watch_edit}/json_watch_edit.tsx | 13 +- .../json_watch_edit_form.tsx | 73 ++++-- .../json_watch_edit_simulate.tsx | 17 +- .../json_watch_edit_simulate_results.tsx | 11 +- .../action_fields/email_action_fields.tsx | 117 +++++++++ .../action_fields/index.ts | 13 + .../action_fields/index_action_fields.tsx | 55 +++++ .../action_fields/jira_action_fields.tsx | 119 +++++++++ .../action_fields/logging_action_fields.tsx | 55 +++++ .../action_fields/pagerduty_action_fields.tsx | 60 +++++ .../action_fields/slack_action_fields.tsx | 74 ++++++ .../action_fields/webhook_action_fields.tsx | 163 +++++++++++++ .../components/threshold_watch_edit/index.ts} | 3 +- .../threshold_watch_action_accordion.tsx | 226 ++++++++++++++++++ .../threshold_watch_action_dropdown.tsx | 100 ++++++++ .../threshold_watch_action_panel.tsx | 51 ++++ .../threshold_watch_edit.tsx | 41 +++- .../watch_visualization.tsx | 9 +- .../watch_edit/components/watch_edit.tsx | 5 +- .../{components => }/watch_context.ts | 0 .../sections/watch_edit/watch_edit_actions.ts | 54 +++-- .../action_defaults_service.factory.js | 22 -- .../action_defaults_service.js | 19 -- .../action_defaults/actions/email_action.js | 33 --- .../action_defaults/actions/logging_action.js | 30 --- .../action_defaults/actions/slack_action.js | 30 --- .../services/action_defaults/registry.js | 11 - .../settings/settings_service.factory.js | 14 -- .../services/settings/settings_service.js | 23 -- .../watcher/server/models/action/action.js | 8 + .../server/models/action/index_action.js | 97 ++++++++ .../server/models/action/jira_action.js | 139 +++++++++++ .../server/models/action/pagerduty_action.js | 99 ++++++++ .../server/models/action/webhook_action.js | 148 ++++++++++++ .../models/settings/__tests__/settings.js | 6 +- .../server/models/settings/settings.js | 4 +- 65 files changed, 2313 insertions(+), 862 deletions(-) create mode 100644 x-pack/plugins/watcher/common/types/action_types.ts delete mode 100644 x-pack/plugins/watcher/public/_hacks.scss create mode 100644 x-pack/plugins/watcher/public/index.scss delete mode 100644 x-pack/plugins/watcher/public/models/action/hipchat.action.js delete mode 100644 x-pack/plugins/watcher/public/models/action/index.action.js create mode 100644 x-pack/plugins/watcher/public/models/action/index_action.js delete mode 100644 x-pack/plugins/watcher/public/models/action/jira.action.js create mode 100644 x-pack/plugins/watcher/public/models/action/jira_action.js delete mode 100644 x-pack/plugins/watcher/public/models/action/pagerduty.action.js create mode 100644 x-pack/plugins/watcher/public/models/action/pagerduty_action.js delete mode 100644 x-pack/plugins/watcher/public/models/action/webhook.action.js create mode 100644 x-pack/plugins/watcher/public/models/action/webhook_action.js rename x-pack/plugins/watcher/public/{services/settings/index.js => sections/watch_edit/components/json_watch_edit/index.ts} (82%) rename x-pack/plugins/watcher/public/sections/watch_edit/components/{ => json_watch_edit}/json_watch_edit.tsx (89%) rename x-pack/plugins/watcher/public/sections/watch_edit/components/{ => json_watch_edit}/json_watch_edit_form.tsx (70%) rename x-pack/plugins/watcher/public/sections/watch_edit/components/{ => json_watch_edit}/json_watch_edit_simulate.tsx (96%) rename x-pack/plugins/watcher/public/sections/watch_edit/components/{ => json_watch_edit}/json_watch_edit_simulate_results.tsx (94%) create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index.ts create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index_action_fields.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/jira_action_fields.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/logging_action_fields.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/pagerduty_action_fields.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx rename x-pack/plugins/watcher/public/{services/action_defaults/index.js => sections/watch_edit/components/threshold_watch_edit/index.ts} (78%) create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_dropdown.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_panel.tsx rename x-pack/plugins/watcher/public/sections/watch_edit/components/{ => threshold_watch_edit}/threshold_watch_edit.tsx (95%) rename x-pack/plugins/watcher/public/sections/watch_edit/components/{ => threshold_watch_edit}/watch_visualization.tsx (96%) rename x-pack/plugins/watcher/public/sections/watch_edit/{components => }/watch_context.ts (100%) delete mode 100644 x-pack/plugins/watcher/public/services/action_defaults/action_defaults_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/action_defaults/action_defaults_service.js delete mode 100644 x-pack/plugins/watcher/public/services/action_defaults/actions/email_action.js delete mode 100644 x-pack/plugins/watcher/public/services/action_defaults/actions/logging_action.js delete mode 100644 x-pack/plugins/watcher/public/services/action_defaults/actions/slack_action.js delete mode 100644 x-pack/plugins/watcher/public/services/action_defaults/registry.js delete mode 100644 x-pack/plugins/watcher/public/services/settings/settings_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/settings/settings_service.js create mode 100644 x-pack/plugins/watcher/server/models/action/index_action.js create mode 100644 x-pack/plugins/watcher/server/models/action/jira_action.js create mode 100644 x-pack/plugins/watcher/server/models/action/pagerduty_action.js create mode 100644 x-pack/plugins/watcher/server/models/action/webhook_action.js diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 60f276b7f02210..bba8f1610ffe65 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7723,7 +7723,6 @@ "xpack.watcher.models.baseWatch.watchStatusJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {watchStatusJson} 属性", "xpack.watcher.models.emailAction.actionJsonEmailPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonEmail} 属性", "xpack.watcher.models.emailAction.actionJsonEmailToPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonEmailTo} 属性", - "xpack.watcher.models.emailAction.description": "“{subject}” 将发送至 {toList}", "xpack.watcher.models.emailAction.selectMessageText": "从您的服务器发送电子邮件。", "xpack.watcher.models.emailAction.simulateButtonLabel": "立即试发电子邮件", "xpack.watcher.models.emailAction.simulateFailMessage": "无法将电子邮件发至 {toList}。", @@ -7734,7 +7733,6 @@ "xpack.watcher.models.jsonWatch.typeName": "高级监视", "xpack.watcher.models.loggingAction.actionJsonLoggingPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonLogging} 属性", "xpack.watcher.models.loggingAction.actionJsonLoggingTextPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonLoggingText} 属性", - "xpack.watcher.models.loggingAction.description": "记录消息“{text}”", "xpack.watcher.models.loggingAction.selectMessageText": "向日志添加新项。", "xpack.watcher.models.loggingAction.simulateButtonLabel": "立即记录示例消息", "xpack.watcher.models.loggingAction.simulateFailMessage": "无法记录示例消息。", @@ -7746,7 +7744,6 @@ "xpack.watcher.models.monitoringWatch.upstreamJsonCalledBadRequestMessage": "为监测监视而调用的 {upstreamJson}", "xpack.watcher.models.slackAction.actionJsonSlackMessagePropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonSlackMessage} 属性", "xpack.watcher.models.slackAction.actionJsonSlackPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonSlack} 属性", - "xpack.watcher.models.slackAction.description": "Slack 消息将发至 {toList}", "xpack.watcher.models.slackAction.selectMessageText": "向 slack 用户或渠道发送消息。", "xpack.watcher.models.slackAction.simulateButtonLabel": "立即发送示例消息", "xpack.watcher.models.slackAction.simulateFailMessage": "无法将示例 Slack 消息发至 {toList}。", diff --git a/x-pack/plugins/watcher/common/constants/action_types.ts b/x-pack/plugins/watcher/common/constants/action_types.ts index 3bb0d5748347cc..72f1c9d4bf1029 100644 --- a/x-pack/plugins/watcher/common/constants/action_types.ts +++ b/x-pack/plugins/watcher/common/constants/action_types.ts @@ -13,8 +13,6 @@ export const ACTION_TYPES: { [key: string]: string } = { LOGGING: 'logging', - HIPCHAT: 'hipchat', - SLACK: 'slack', JIRA: 'jira', diff --git a/x-pack/plugins/watcher/common/lib/get_action_type/__tests__/get_action_type.js b/x-pack/plugins/watcher/common/lib/get_action_type/__tests__/get_action_type.js index 7b2fd7bd840629..c342c45b0c6c27 100644 --- a/x-pack/plugins/watcher/common/lib/get_action_type/__tests__/get_action_type.js +++ b/x-pack/plugins/watcher/common/lib/get_action_type/__tests__/get_action_type.js @@ -56,17 +56,6 @@ describe('get_action_type', () => { expect(type).to.be(ACTION_TYPES.LOGGING); }); - it(`correctly calculates ACTION_TYPES.HIPCHAT`, () => { - const actionJson = { - hipchat: { - 'foo': 'bar' - } - }; - const type = getActionType(actionJson); - - expect(type).to.be(ACTION_TYPES.HIPCHAT); - }); - it(`correctly calculates ACTION_TYPES.SLACK`, () => { const actionJson = { slack: { diff --git a/x-pack/plugins/watcher/common/types/action_types.ts b/x-pack/plugins/watcher/common/types/action_types.ts new file mode 100644 index 00000000000000..253ab31f69523b --- /dev/null +++ b/x-pack/plugins/watcher/common/types/action_types.ts @@ -0,0 +1,84 @@ +/* + * 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. + */ + +type EmailActionType = 'email'; +type LoggingActionType = 'logging'; +type WebhookActionType = 'webhook'; +type IndexActionType = 'index'; +type SlackActionType = 'slack'; +type JiraActionType = 'jira'; +type PagerDutyActionType = 'pagerduty'; + +export interface BaseAction { + id: string; + typeName: string; + isNew: boolean; + simulateMessage: string; + simulateFailMessage: string; + simulatePrompt: string; + selectMessage: string; + validate: () => { [key: string]: string[] }; + isEnabled: boolean; +} + +export interface EmailAction extends BaseAction { + type: EmailActionType; + iconClass: 'email'; + to: string[]; + subject?: string; + body: string; +} + +export interface LoggingAction extends BaseAction { + type: LoggingActionType; + iconClass: 'loggingApp'; + text: string; +} + +export interface IndexAction extends BaseAction { + type: IndexActionType; + iconClass: 'indexOpen'; + index: string; +} + +export interface PagerDutyAction extends BaseAction { + type: PagerDutyActionType; + iconClass: 'apps'; + description: string; +} + +export interface WebhookAction extends BaseAction { + type: WebhookActionType; + iconClass: 'logoWebhook'; + method?: 'head' | 'get' | 'post' | 'put' | 'delete'; + host: string; + port: number; + path?: string; + body?: string; +} + +export interface SlackAction extends BaseAction { + type: SlackActionType; + iconClass: 'logoSlack'; + text?: string; + to?: string[]; +} + +export interface JiraAction extends BaseAction { + type: JiraActionType; + iconClass: 'apps'; + projectKey: string; + issueType: string; + summary: string; +} + +export type ActionType = + | EmailAction + | LoggingAction + | IndexAction + | SlackAction + | JiraAction + | PagerDutyAction; diff --git a/x-pack/plugins/watcher/plugin_definition.js b/x-pack/plugins/watcher/plugin_definition.js index a03341edb6f6e3..36f5f4865e6d4b 100644 --- a/x-pack/plugins/watcher/plugin_definition.js +++ b/x-pack/plugins/watcher/plugin_definition.js @@ -21,6 +21,7 @@ export const pluginDefinition = { publicDir: resolve(__dirname, 'public'), require: ['kibana', 'elasticsearch', 'xpack_main'], uiExports: { + styleSheetPaths: resolve(__dirname, 'public/index.scss'), managementSections: ['plugins/watcher'], home: ['plugins/watcher/register_feature'], }, diff --git a/x-pack/plugins/watcher/public/_hacks.scss b/x-pack/plugins/watcher/public/_hacks.scss deleted file mode 100644 index 3b42e2d3a76424..00000000000000 --- a/x-pack/plugins/watcher/public/_hacks.scss +++ /dev/null @@ -1,4 +0,0 @@ -.mgtWatcher__list { - display: flex; - flex-grow: 1; -} \ No newline at end of file diff --git a/x-pack/plugins/watcher/public/index.scss b/x-pack/plugins/watcher/public/index.scss new file mode 100644 index 00000000000000..ba4ed2516625a1 --- /dev/null +++ b/x-pack/plugins/watcher/public/index.scss @@ -0,0 +1,16 @@ +// Import the EUI global scope so we can use EUI constants +@import 'src/legacy/ui/public/styles/_styling_constants'; + +// Watcher plugin styles + +// Prefix all styles with "watcher" to avoid conflicts. +// Examples +// watcherChart +// watcherChart__legend +// watcherChart__legend--small +// watcherChart__legend-isLoading + +.watcherThresholdWatchActionDropdownContainer { + justify-content: flex-end; + flex-direction: row; +} diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index 642f57ae020fc6..9c9c81d77314fc 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -3,6 +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 { Settings } from 'plugins/watcher/models/settings'; import { Watch } from 'plugins/watcher/models/watch'; import { WatchHistoryItem } from 'plugins/watcher/models/watch_history_item'; import { WatchStatus } from 'plugins/watcher/models/watch_status'; @@ -157,6 +158,7 @@ export const loadIndexPatterns = async () => { }); return savedObjects; }; + export const getWatchVisualizationData = async (watchModel: BaseWatch, visualizeOptions: any) => { const response = await getHttpClient().post(`${basePath}/watch/visualize`, { watch: watchModel.upstreamJson, @@ -164,3 +166,17 @@ export const getWatchVisualizationData = async (watchModel: BaseWatch, visualize }); return response.data; }; + +export const loadSettings = () => { + return useRequest({ + path: `${basePath}/settings`, + method: 'get', + processData: (data: { + actionTypes: { + [key: string]: { + enabled: boolean; + }; + }; + }) => Settings.fromUpstreamJson(data), + }); +}; diff --git a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts index c5bd1c2f53c824..32e6cb2887956c 100644 --- a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts +++ b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts @@ -5,9 +5,16 @@ */ import { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } from 'ui/documentation_links'; +import { ACTION_TYPES } from '../../../common/constants'; const esBase = `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/reference/${DOC_LINK_VERSION}`; +const esStackBase = `${ELASTIC_WEBSITE_URL}guide/en/elastic-stack-overview/${DOC_LINK_VERSION}`; export const putWatchApiUrl = `${esBase}/watcher-api-put-watch.html`; export const executeWatchApiUrl = `${esBase}/watcher-api-execute-watch.html#watcher-api-execute-watch-action-mode`; -export const watchNotificationSettingsUrl = `${esBase}/notification-settings.html#slack-notification-settings`; + +export const watchActionsConfigurationMap = { + [ACTION_TYPES.SLACK]: `${esStackBase}/actions-slack.html#configuring-slack`, + [ACTION_TYPES.PAGERDUTY]: `${esStackBase}/actions-pagerduty.html#configuring-pagerduty`, + [ACTION_TYPES.JIRA]: `${esStackBase}/actions-jira.html#configuring-jira`, +}; diff --git a/x-pack/plugins/watcher/public/models/action/action.js b/x-pack/plugins/watcher/public/models/action/action.js index f3cdfeef7fab7e..051c2fc6868aaa 100644 --- a/x-pack/plugins/watcher/public/models/action/action.js +++ b/x-pack/plugins/watcher/public/models/action/action.js @@ -9,11 +9,10 @@ import { ACTION_TYPES } from 'plugins/watcher/../common/constants'; import { EmailAction } from './email_action'; import { LoggingAction } from './logging_action'; import { SlackAction } from './slack_action'; -import { WebhookAction } from './webhook.action'; -import { IndexAction } from './index.action'; -import { HipchatAction } from './hipchat.action'; -import { PagerDutyAction } from './pagerduty.action'; -import { JiraAction } from './jira.action'; +import { WebhookAction } from './webhook_action'; +import { IndexAction } from './index_action'; +import { PagerDutyAction } from './pagerduty_action'; +import { JiraAction } from './jira_action'; import { UnknownAction } from './unknown_action'; const ActionTypes = {}; @@ -22,7 +21,6 @@ set(ActionTypes, ACTION_TYPES.LOGGING, LoggingAction); set(ActionTypes, ACTION_TYPES.SLACK, SlackAction); set(ActionTypes, ACTION_TYPES.WEBHOOK, WebhookAction); set(ActionTypes, ACTION_TYPES.INDEX, IndexAction); -set(ActionTypes, ACTION_TYPES.HIPCHAT, HipchatAction); set(ActionTypes, ACTION_TYPES.PAGERDUTY, PagerDutyAction); set(ActionTypes, ACTION_TYPES.JIRA, JiraAction); diff --git a/x-pack/plugins/watcher/public/models/action/base_action.js b/x-pack/plugins/watcher/public/models/action/base_action.js index 50d37dcde2edc3..3b358b9560376f 100644 --- a/x-pack/plugins/watcher/public/models/action/base_action.js +++ b/x-pack/plugins/watcher/public/models/action/base_action.js @@ -11,6 +11,7 @@ export class BaseAction { constructor(props = {}) { this.id = get(props, 'id'); this.type = get(props, 'type'); + this.isNew = get(props, 'isNew', false); } get upstreamJson() { @@ -47,15 +48,10 @@ export class BaseAction { return this.constructor.simulatePrompt; } - get template() { - return this.constructor.template; - } - static typeName = i18n.translate('xpack.watcher.models.baseAction.typeName', { defaultMessage: 'Action', }); - static iconClass = 'fa-cog'; - static template = ''; + static iconClass = 'apps'; static selectMessage = i18n.translate('xpack.watcher.models.baseAction.selectMessageText', { defaultMessage: 'Perform an action.', }); diff --git a/x-pack/plugins/watcher/public/models/action/email_action.js b/x-pack/plugins/watcher/public/models/action/email_action.js index 31fe6a9405e0b0..bca78e580a7746 100644 --- a/x-pack/plugins/watcher/public/models/action/email_action.js +++ b/x-pack/plugins/watcher/public/models/action/email_action.js @@ -7,15 +7,50 @@ import { get, isArray } from 'lodash'; import { BaseAction } from './base_action'; import { i18n } from '@kbn/i18n'; +import chrome from 'ui/chrome'; export class EmailAction extends BaseAction { constructor(props = {}) { super(props); - const toArray = get(props, 'to', []); - this.to = isArray(toArray) ? toArray : [ toArray ]; - this.subject = get(props, 'subject', ''); - this.body = get(props, 'body', ''); + const uiSettings = chrome.getUiSettingsClient(); + const defaultToEmail = uiSettings.get('xPack:defaultAdminEmail') || undefined; + const toArray = get(props, 'to', defaultToEmail); + this.to = isArray(toArray) ? toArray : toArray && [ toArray ]; + + const defaultSubject = i18n.translate('xpack.watcher.models.emailAction.defaultSubjectText', { + defaultMessage: 'Watch [{context}] has exceeded the threshold', + values: { + context: '{{ctx.metadata.name}}', + } + }); + this.subject = get(props, 'subject', props.ignoreDefaults ? null : defaultSubject); + + this.body = get(props, 'body'); + } + + validate() { + const errors = { + to: [], + body: [], + }; + + if (!this.to || !this.to.length) { + errors.to.push( + i18n.translate('xpack.watcher.watchActions.email.emailRecipientIsRequiredValidationMessage', { + defaultMessage: '"To" email address is required.', + }) + ); + } + if (!this.body) { + errors.body.push( + i18n.translate('xpack.watcher.watchActions.email.emailBodyIsRequiredValidationMessage', { + defaultMessage: 'Email body is required.', + }) + ); + } + + return errors; } get upstreamJson() { @@ -26,29 +61,21 @@ export class EmailAction extends BaseAction { subject: this.subject, body: this.body, email: { - to: this.to.length ? this.to : undefined, + to: this.to && this.to.length > 0 ? this.to : undefined, + subject: this.subject, + body: { + text: this.body, + }, } }); return result; } - get description() { - const toList = this.to.join(', '); - const subject = this.subject || ''; - return i18n.translate('xpack.watcher.models.emailAction.description', { - defaultMessage: '"{subject}" will be sent to {toList}', - values: { - subject, - toList - } - }); - } - get simulateMessage() { const toList = this.to.join(', '); return i18n.translate('xpack.watcher.models.emailAction.simulateMessage', { - defaultMessage: 'Sample e-mail sent to {toList}', + defaultMessage: 'Sample email sent to {toList}', values: { toList } @@ -58,7 +85,7 @@ export class EmailAction extends BaseAction { get simulateFailMessage() { const toList = this.to.join(', '); return i18n.translate('xpack.watcher.models.emailAction.simulateFailMessage', { - defaultMessage: 'Failed to send e-mail to {toList}.', + defaultMessage: 'Failed to send email to {toList}.', values: { toList } @@ -70,14 +97,13 @@ export class EmailAction extends BaseAction { } static typeName = i18n.translate('xpack.watcher.models.emailAction.typeName', { - defaultMessage: 'E-mail', + defaultMessage: 'Email', }); - static iconClass = 'kuiIcon fa-envelope-o'; - static template = ''; + static iconClass = 'email'; static selectMessage = i18n.translate('xpack.watcher.models.emailAction.selectMessageText', { - defaultMessage: 'Send out an e-mail from your server.', + defaultMessage: 'Send out an email from your server.', }); static simulatePrompt = i18n.translate('xpack.watcher.models.emailAction.simulateButtonLabel', { - defaultMessage: 'Test fire an e-mail now' + defaultMessage: 'Test fire an email now' }); } diff --git a/x-pack/plugins/watcher/public/models/action/hipchat.action.js b/x-pack/plugins/watcher/public/models/action/hipchat.action.js deleted file mode 100644 index bf4eb0d0393422..00000000000000 --- a/x-pack/plugins/watcher/public/models/action/hipchat.action.js +++ /dev/null @@ -1,69 +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 { get } from 'lodash'; -import { BaseAction } from './base_action'; -import { i18n } from '@kbn/i18n'; - -const requiredFields = ['message']; -const optionalFields = ['account', 'proxy']; - -const allFields = [...requiredFields, ...optionalFields]; - -export class HipchatAction extends BaseAction { - constructor(props = {}) { - super(props); - - this.fields = {}; - allFields.forEach((field) => { - this.fields[field] = get(props, field); - }); - } - - get upstreamJson() { - // Add all required fields to the request body - let result = requiredFields.reduce((acc, field) => { - acc[field] = this.fields[field]; - return acc; - }, super.upstreamJson); - - // If optional fields have been set, add them to the body - result = optionalFields.reduce((acc, field) => { - if (this[field]) { - acc[field] = this.fields[field]; - } - return acc; - }, result); - - return result; - } - - get description() { - return i18n.translate('xpack.watcher.models.hipchatAction.description', { - defaultMessage: '{body} will be sent through Hipchat', - values: { - body: this.fields.message && this.fields.message.body || '' - } - }); - } - - get simulateMessage() { - return i18n.translate('xpack.watcher.models.hipchatAction.simulateMessage', { - defaultMessage: 'Hipchat message has been sent.', - }); - } - - get simulateFailMessage() { - return i18n.translate('xpack.watcher.models.hipchatAction.simulateFailMessage', { - defaultMessage: 'Failed to send Hipchat message.', - }); - } - - static fromUpstreamJson(upstreamAction) { - return new HipchatAction(upstreamAction); - } -} diff --git a/x-pack/plugins/watcher/public/models/action/index.action.js b/x-pack/plugins/watcher/public/models/action/index.action.js deleted file mode 100644 index b4a311501df8c4..00000000000000 --- a/x-pack/plugins/watcher/public/models/action/index.action.js +++ /dev/null @@ -1,88 +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 { get } from 'lodash'; -import { BaseAction } from './base_action'; -import { i18n } from '@kbn/i18n'; - -const requiredFields = ['host', 'port']; -const optionalFields = [ - 'scheme', - 'path', - 'method', - 'headers', - 'params', - 'auth', - 'body', - 'proxy', - 'connection_timeout', - 'read_timeout', - 'url' -]; - -const allFields = [...requiredFields, ...optionalFields]; - -export class IndexAction extends BaseAction { - constructor(props = {}) { - super(props); - - this.fields = {}; - allFields.forEach((field) => { - this.fields[field] = get(props, field); - }); - } - - get upstreamJson() { - // Add all required fields to the request body - let result = requiredFields.reduce((acc, field) => { - acc[field] = this.fields[field]; - return acc; - }, super.upstreamJson); - - // If optional fields have been set, add them to the body - result = optionalFields.reduce((acc, field) => { - if (this[field]) { - acc[field] = this.fields[field]; - } - return acc; - }, result); - - return result; - } - - get description() { - return i18n.translate('xpack.watcher.models.indexAction.description', { - defaultMessage: 'The {index} will be indexed as {docType}', - values: { - index: this.fields.index, - docType: this.fields.doc_type, - } - }); - } - - get simulateMessage() { - return i18n.translate('xpack.watcher.models.indexAction.simulateMessage', { - defaultMessage: 'Index {index} has been indexed.', - values: { - index: this.index, - } - }); - } - - get simulateFailMessage() { - return i18n.translate('xpack.watcher.models.indexAction.simulateFailMessage', { - defaultMessage: 'Failed to index {index}.', - values: { - index: this.index - } - }); - } - - static fromUpstreamJson(upstreamAction) { - return new IndexAction(upstreamAction); - } -} diff --git a/x-pack/plugins/watcher/public/models/action/index_action.js b/x-pack/plugins/watcher/public/models/action/index_action.js new file mode 100644 index 00000000000000..c254f2a63586a4 --- /dev/null +++ b/x-pack/plugins/watcher/public/models/action/index_action.js @@ -0,0 +1,81 @@ +/* + * 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 { get } from 'lodash'; +import { BaseAction } from './base_action'; +import { i18n } from '@kbn/i18n'; + +export class IndexAction extends BaseAction { + constructor(props = {}) { + super(props); + + this.index = get(props, 'index'); + } + + validate() { + const errors = { + index: [], + }; + if (!this.index) { + errors.index.push( + i18n.translate('xpack.watcher.watchActions.index.indexIsRequiredValidationMessage', { + defaultMessage: 'Index name is required.', + }) + ); + } + return errors; + } + + + get upstreamJson() { + const result = super.upstreamJson; + + Object.assign(result, { + index: this.index, + index: { + index: this.index, + } + }); + + return result; + } + + get simulateMessage() { + const index = this.index || ''; + return i18n.translate('xpack.watcher.models.indexAction.simulateMessage', { + defaultMessage: 'Index {index} has been indexed.', + values: { + index, + } + }); + } + + get simulateFailMessage() { + const index = this.index || ''; + return i18n.translate('xpack.watcher.models.indexAction.simulateFailMessage', { + defaultMessage: 'Failed to index {index}.', + values: { + index, + } + }); + } + + static fromUpstreamJson(upstreamAction) { + return new IndexAction(upstreamAction); + } + + static typeName = i18n.translate('xpack.watcher.models.indexAction.typeName', { + defaultMessage: 'Index', + }); + static iconClass = 'indexOpen'; + static selectMessage = i18n.translate('xpack.watcher.models.indexAction.selectMessageText', { + defaultMessage: 'Index data into Elasticsearch.', + }); + static simulatePrompt = i18n.translate('xpack.watcher.models.indexAction.simulateButtonLabel', { + defaultMessage: 'Index data now', + }); +} diff --git a/x-pack/plugins/watcher/public/models/action/jira.action.js b/x-pack/plugins/watcher/public/models/action/jira.action.js deleted file mode 100644 index e5b8c1a2ab7d9f..00000000000000 --- a/x-pack/plugins/watcher/public/models/action/jira.action.js +++ /dev/null @@ -1,70 +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 { get } from 'lodash'; -import { BaseAction } from './base_action'; -import { i18n } from '@kbn/i18n'; - -const requiredFields = ['fields']; -const optionalFields = ['account', 'proxy']; - -const allFields = [...requiredFields, ...optionalFields]; - -export class JiraAction extends BaseAction { - constructor(props = {}) { - super(props); - - this.fields = {}; - allFields.forEach((field) => { - this.fields[field] = get(props, field); - }); - } - - get upstreamJson() { - // Add all required fields to the request body - let result = requiredFields.reduce((acc, field) => { - acc[field] = this.fields[field]; - return acc; - }, super.upstreamJson); - - // If optional fields have been set, add them to the body - result = optionalFields.reduce((acc, field) => { - if (this[field]) { - acc[field] = this.fields[field]; - } - return acc; - }, result); - - return result; - } - - get description() { - return i18n.translate('xpack.watcher.models.jiraAction.description', { - defaultMessage: '{issueName} will be created in Jira', - values: { - issueName: get(this.fields, 'fields.issue.issuetype.name', ''), - } - }); - } - - get simulateMessage() { - return i18n.translate('xpack.watcher.models.jiraAction.simulateMessage', { - defaultMessage: 'Jira issue has been created.', - }); - } - - get simulateFailMessage() { - return i18n.translate('xpack.watcher.models.jiraAction.simulateFailMessage', { - defaultMessage: 'Failed to create Jira issue.', - }); - } - - static fromUpstreamJson(upstreamAction) { - return new JiraAction(upstreamAction); - } -} - diff --git a/x-pack/plugins/watcher/public/models/action/jira_action.js b/x-pack/plugins/watcher/public/models/action/jira_action.js new file mode 100644 index 00000000000000..0dc90560b65c49 --- /dev/null +++ b/x-pack/plugins/watcher/public/models/action/jira_action.js @@ -0,0 +1,106 @@ +/* + * 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 { get } from 'lodash'; +import { BaseAction } from './base_action'; +import { i18n } from '@kbn/i18n'; + +export class JiraAction extends BaseAction { + constructor(props = {}) { + super(props); + + const defaultSummary = i18n.translate('xpack.watcher.models.jiraAction.defaultSummaryText', { + defaultMessage: 'Watch [{context}] has exceeded the threshold', + values: { + context: '{{ctx.metadata.name}}', + } + }); + + this.summary = get(props, 'summary', props.ignoreDefaults ? null : defaultSummary); + this.projectKey = get(props, 'projectKey'); + this.issueType = get(props, 'issueType'); + } + + validate() { + const errors = { + projectKey: [], + issueType: [], + summary: [], + }; + if (!this.projectKey) { + errors.projectKey.push( + i18n.translate('xpack.watcher.watchActions.jira.projectKeyIsRequiredValidationMessage', { + defaultMessage: 'Jira project key is required.', + }) + ); + } + if (!this.issueType) { + errors.issueType.push( + i18n.translate('xpack.watcher.watchActions.jira.issueTypeNameIsRequiredValidationMessage', { + defaultMessage: 'Jira issue type is required.', + }) + ); + } + if (!this.summary) { + errors.summary.push( + i18n.translate('xpack.watcher.watchActions.jira.summaryIsRequiredValidationMessage', { + defaultMessage: 'Jira summary is required.', + }) + ); + } + return errors; + } + + get upstreamJson() { + const result = super.upstreamJson; + + Object.assign(result, { + projectKey: this.projectKey, + issueType: this.issueType, + summary: this.summary, + jira: { + fields: { + project: { + key: this.projectKey, + }, + issuetype: { + name: this.issueType, + }, + summary: this.summary, + }, + } + }); + + return result; + } + + get simulateMessage() { + return i18n.translate('xpack.watcher.models.jiraAction.simulateMessage', { + defaultMessage: 'Jira issue has been created.', + }); + } + + get simulateFailMessage() { + return i18n.translate('xpack.watcher.models.jiraAction.simulateFailMessage', { + defaultMessage: 'Failed to create Jira issue.', + }); + } + + static fromUpstreamJson(upstreamAction) { + return new JiraAction(upstreamAction); + } + + static typeName = i18n.translate('xpack.watcher.models.jiraAction.typeName', { + defaultMessage: 'Jira', + }); + static iconClass = 'apps'; + static selectMessage = i18n.translate('xpack.watcher.models.jiraAction.selectMessageText', { + defaultMessage: 'Create issues in Atlassian’s Jira Software.', + }); + static simulatePrompt = i18n.translate('xpack.watcher.models.jiraAction.simulateButtonLabel', { + defaultMessage: 'Create a sample Jira issue now' + }); +} diff --git a/x-pack/plugins/watcher/public/models/action/logging_action.js b/x-pack/plugins/watcher/public/models/action/logging_action.js index 603784053e717f..07aae9470a5df8 100644 --- a/x-pack/plugins/watcher/public/models/action/logging_action.js +++ b/x-pack/plugins/watcher/public/models/action/logging_action.js @@ -12,7 +12,27 @@ export class LoggingAction extends BaseAction { constructor(props = {}) { super(props); - this.text = get(props, 'text', ''); + const defaultText = i18n.translate('xpack.watcher.models.loggingAction.defaultText', { + defaultMessage: 'Watch [{context}] has exceeded the threshold', + values: { + context: '{{ctx.metadata.name}}', + } + }); + this.text = get(props, 'text', props.ignoreDefaults ? null : defaultText); + } + + validate() { + const errors = { + text: [], + }; + if (!this.text) { + errors.text.push( + i18n.translate('xpack.watcher.watchActions.logging.logTextIsRequiredValidationMessage', { + defaultMessage: 'Log text is required.', + }) + ); + } + return errors; } get upstreamJson() { @@ -29,16 +49,6 @@ export class LoggingAction extends BaseAction { return result; } - get description() { - const text = this.text || ''; - return i18n.translate('xpack.watcher.models.loggingAction.description', { - defaultMessage: 'Log message \'{text}\'', - values: { - text - } - }); - } - get simulateMessage() { return i18n.translate('xpack.watcher.models.loggingAction.simulateMessage', { defaultMessage: 'Sample message logged', @@ -58,11 +68,10 @@ export class LoggingAction extends BaseAction { static typeName = i18n.translate('xpack.watcher.models.loggingAction.typeName', { defaultMessage: 'Logging', }); - static iconClass = 'kuiIcon fa-file-text-o'; + static iconClass = 'loggingApp'; static selectMessage = i18n.translate('xpack.watcher.models.loggingAction.selectMessageText', { defaultMessage: 'Add a new item to the logs.', }); - static template = ''; static simulatePrompt = i18n.translate('xpack.watcher.models.loggingAction.simulateButtonLabel', { defaultMessage: 'Log a sample message now', }); diff --git a/x-pack/plugins/watcher/public/models/action/pagerduty.action.js b/x-pack/plugins/watcher/public/models/action/pagerduty.action.js deleted file mode 100644 index d8a497cb3236fe..00000000000000 --- a/x-pack/plugins/watcher/public/models/action/pagerduty.action.js +++ /dev/null @@ -1,80 +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 { get } from 'lodash'; -import { BaseAction } from './base_action'; -import { i18n } from '@kbn/i18n'; - -const requiredFields = ['description', 'type']; -const optionalFields = [ - 'event_type', - 'incident_key', - 'client', - 'client_url', - 'attach_payload', - 'contexts', - 'proxy', - 'href', - 'src', -]; - -const allFields = [...requiredFields, ...optionalFields]; - -export class PagerDutyAction extends BaseAction { - constructor(props = {}) { - super(props); - - this.fields = {}; - allFields.forEach((field) => { - this.fields[field] = get(props, field); - }); - } - - get upstreamJson() { - // Add all required fields to the request body - let result = requiredFields.reduce((acc, field) => { - acc[field] = this.fields[field]; - return acc; - }, super.upstreamJson); - - // If optional fields have been set, add them to the body - result = optionalFields.reduce((acc, field) => { - if (this.fields[field]) { - acc[field] = this.fields[field]; - } - return acc; - }, result); - - return result; - } - - get description() { - return i18n.translate('xpack.watcher.models.pagerDutyAction.description', { - defaultMessage: '{description} will be sent to PagerDuty', - values: { - description: this.fields.description, - } - }); - } - - get simulateMessage() { - return i18n.translate('xpack.watcher.models.pagerDutyAction.simulateMessage', { - defaultMessage: 'PagerDuty event has been sent.', - }); - } - - get simulateFailMessage() { - return i18n.translate('xpack.watcher.models.pagerDutyAction.simulateFailMessage', { - defaultMessage: 'Failed to send Hipchat event.', - }); - } - - static fromUpstreamJson(upstreamAction) { - return new PagerDutyAction(upstreamAction); - } -} - diff --git a/x-pack/plugins/watcher/public/models/action/pagerduty_action.js b/x-pack/plugins/watcher/public/models/action/pagerduty_action.js new file mode 100644 index 00000000000000..55008997209840 --- /dev/null +++ b/x-pack/plugins/watcher/public/models/action/pagerduty_action.js @@ -0,0 +1,80 @@ +/* + * 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 { get } from 'lodash'; +import { BaseAction } from './base_action'; +import { i18n } from '@kbn/i18n'; + +export class PagerDutyAction extends BaseAction { + constructor(props = {}) { + super(props); + + const defaultDescription = i18n.translate('xpack.watcher.models.pagerdutyAction.defaultDescriptionText', { + defaultMessage: 'Watch [{context}] has exceeded the threshold', + values: { + context: '{{ctx.metadata.name}}', + } + }); + this.description = get(props, 'description', props.ignoreDefaults ? null : defaultDescription); + } + + validate() { + const errors = { + description: [], + }; + + if (!this.description) { + errors.description.push( + i18n.translate('xpack.watcher.watchActions.pagerduty.descriptionIsRequiredValidationMessage', { + defaultMessage: 'PagerDuty description is required.', + }) + ); + } + return errors; + } + + get upstreamJson() { + const result = super.upstreamJson; + + Object.assign(result, { + description: this.description, + pagerduty: { + description: this.description, + } + }); + + return result; + } + + get simulateMessage() { + return i18n.translate('xpack.watcher.models.pagerDutyAction.simulateMessage', { + defaultMessage: 'PagerDuty event has been sent.', + }); + } + + get simulateFailMessage() { + return i18n.translate('xpack.watcher.models.pagerDutyAction.simulateFailMessage', { + defaultMessage: 'Failed to send PagerDuty event.', + }); + } + + static fromUpstreamJson(upstreamAction) { + return new PagerDutyAction(upstreamAction); + } + + static typeName = i18n.translate('xpack.watcher.models.pagerDutyAction.typeName', { + defaultMessage: 'PagerDuty', + }); + static iconClass = 'apps'; + static selectMessage = i18n.translate('xpack.watcher.models.pagerDutyAction.selectMessageText', { + defaultMessage: 'Create events in PagerDuty.', + }); + static simulatePrompt = i18n.translate('xpack.watcher.models.pagerDutyAction.simulateButtonLabel', { + defaultMessage: 'Test fire a PagerDuty event' + }); +} + diff --git a/x-pack/plugins/watcher/public/models/action/slack_action.js b/x-pack/plugins/watcher/public/models/action/slack_action.js index 5072d1ab744bdb..ec11e5c10c8181 100644 --- a/x-pack/plugins/watcher/public/models/action/slack_action.js +++ b/x-pack/plugins/watcher/public/models/action/slack_action.js @@ -4,99 +4,71 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; import { get, isArray } from 'lodash'; import { BaseAction } from './base_action'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiCode, EuiLink } from '@elastic/eui'; -import { watchNotificationSettingsUrl } from '../../lib/documentation_links'; export class SlackAction extends BaseAction { constructor(props = {}) { super(props); - const toArray = get(props, 'to', []); - this.to = isArray(toArray) ? toArray : [ toArray ]; - this.text = props.text; + const toArray = get(props, 'to'); + this.to = isArray(toArray) ? toArray : toArray && [ toArray ]; + + const defaultText = i18n.translate('xpack.watcher.models.slackAction.defaultText', { + defaultMessage: 'Watch [{context}] has exceeded the threshold', + values: { + context: '{{ctx.metadata.name}}', + } + }); + this.text = get(props, 'text', props.ignoreDefaults ? null : defaultText); } validate() { - const errors = []; - - if (!this.to.length) { - const message = ( - message_defaults, - link: ( - - - - ) - }} - /> - ); - errors.push({ - message - }); - } - - return { errors: errors.length ? errors : null }; + // Currently no validation required + const errors = { + to: [], + text: [], + }; + return errors; } get upstreamJson() { const result = super.upstreamJson; - const message = this.text || this.to.length + const to = this.to && this.to.length > 0 ? this.to : undefined; + const message = this.text || to ? { text: this.text, - to: this.to.length ? this.to : undefined + to, } - : undefined; + : {}; Object.assign(result, { - to: this.to, + to, text: this.text, slack: { message - } + }, }); return result; } - get description() { - const toList = this.to.join(', '); - return i18n.translate('xpack.watcher.models.slackAction.description', { - defaultMessage: 'Slack message will be sent to {toList}', - values: { - toList - } - }); - } - get simulateMessage() { - const toList = this.to.join(', '); + const toList = this.to && this.to.join(', '); return i18n.translate('xpack.watcher.models.slackAction.simulateMessage', { - defaultMessage: 'Sample Slack message sent to {toList}.', + defaultMessage: 'Sample Slack message sent {toList}.', values: { - toList + toList: toList ? `to ${toList}` : '', } }); } get simulateFailMessage() { - const toList = this.to.join(', '); + const toList = this.to && this.to.join(', '); return i18n.translate('xpack.watcher.models.slackAction.simulateFailMessage', { - defaultMessage: 'Failed to send sample Slack message to {toList}.', + defaultMessage: 'Failed to send sample Slack message {toList}.', values: { - toList + toList: toList ? `to ${toList}` : '', } }); } @@ -108,10 +80,9 @@ export class SlackAction extends BaseAction { static typeName = i18n.translate('xpack.watcher.models.slackAction.TypeName', { defaultMessage: 'Slack' }); - static iconClass = 'kuiIcon fa-slack'; - static template = ''; + static iconClass = 'logoSlack'; static selectMessage = i18n.translate('xpack.watcher.models.slackAction.selectMessageText', { - defaultMessage: 'Send a message to a slack user or channel.' + defaultMessage: 'Send a message to a Slack user or channel.' }); static simulatePrompt = i18n.translate('xpack.watcher.models.slackAction.simulateButtonLabel', { defaultMessage: 'Send a sample message now' diff --git a/x-pack/plugins/watcher/public/models/action/webhook.action.js b/x-pack/plugins/watcher/public/models/action/webhook.action.js deleted file mode 100644 index 8c530c99135385..00000000000000 --- a/x-pack/plugins/watcher/public/models/action/webhook.action.js +++ /dev/null @@ -1,91 +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 { get } from 'lodash'; -import { BaseAction } from './base_action'; -import { i18n } from '@kbn/i18n'; - -const requiredFields = ['host', 'port']; -const optionalFields = [ - 'scheme', - 'path', - 'method', - 'headers', - 'params', - 'auth', - 'body', - 'proxy', - 'connection_timeout', - 'read_timeout', - 'url' -]; - -const allFields = [...requiredFields, ...optionalFields]; - -export class WebhookAction extends BaseAction { - constructor(props = {}) { - super(props); - - this.fields = {}; - allFields.forEach((field) => { - this.fields[field] = get(props, field); - }); - - const { url, host, port, path } = this.fields; - this.fullPath = url ? url : host + port + path; - } - - get upstreamJson() { - // Add all required fields to the request body - let result = requiredFields.reduce((acc, field) => { - acc[field] = this.fields[field]; - return acc; - }, super.upstreamJson); - - // If optional fields have been set, add them to the body - result = optionalFields.reduce((acc, field) => { - if (this[field]) { - acc[field] = this.fields[field]; - } - return acc; - }, result); - - return result; - } - - get description() { - return i18n.translate('xpack.watcher.models.webhookAction.description', { - defaultMessage: 'Webhook will trigger a {method} request on {fullPath}', - values: { - method: this.method, - fullPath: this.fullPath - } - }); - } - - get simulateMessage() { - return i18n.translate('xpack.watcher.models.webhookAction.simulateMessage', { - defaultMessage: 'Sample request sent to {fullPath}', - values: { - fullPath: this.fullPath - } - }); - } - - get simulateFailMessage() { - return i18n.translate('xpack.watcher.models.webhookAction.simulateFailMessage', { - defaultMessage: 'Failed to send request to {fullPath}.', - values: { - fullPath: this.fullPath - } - }); - } - - static fromUpstreamJson(upstreamAction) { - return new WebhookAction(upstreamAction); - } -} diff --git a/x-pack/plugins/watcher/public/models/action/webhook_action.js b/x-pack/plugins/watcher/public/models/action/webhook_action.js new file mode 100644 index 00000000000000..c675cbb847cde5 --- /dev/null +++ b/x-pack/plugins/watcher/public/models/action/webhook_action.js @@ -0,0 +1,116 @@ +/* + * 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 { get } from 'lodash'; +import { BaseAction } from './base_action'; +import { i18n } from '@kbn/i18n'; + +export class WebhookAction extends BaseAction { + constructor(props = {}) { + super(props); + + const defaultJson = JSON.stringify({ message: 'Watch [{{ctx.metadata.name}}] has exceeded the threshold' }, null, 2); + this.body = get(props, 'body', props.ignoreDefaults ? null : defaultJson); + + this.method = get(props, 'method'); + this.host = get(props, 'host'); + this.port = get(props, 'port'); + this.path = get(props, 'path'); + this.contentType = get(props, 'contentType'); + + this.fullPath = `${this.host}:${this.port}${this.path}`; + } + + validate() { + const errors = { + host: [], + port: [], + body: [], + }; + + if (!this.host) { + errors.host.push( + i18n.translate('xpack.watcher.watchActions.webhook.hostIsRequiredValidationMessage', { + defaultMessage: 'Webhook host is required.', + }) + ); + } + if (!this.port) { + errors.port.push( + i18n.translate('xpack.watcher.watchActions.webhook.portIsRequiredValidationMessage', { + defaultMessage: 'Webhook port is required.', + }) + ); + } + if (this.contentType === 'application/json' && typeof this.body === 'string' && this.body !== '') { + try { + const parsedJson = JSON.parse(this.body); + if (parsedJson && typeof parsedJson !== 'object') { + errors.body.push(i18n.translate('xpack.watcher.watchActions.webhook.bodyParseValidationMessage', { + defaultMessage: 'Invalid JSON', + })); + } + } catch (e) { + errors.body.push(i18n.translate('xpack.watcher.watchActions.webhook.bodyParseValidationMessage', { + defaultMessage: 'Invalid JSON', + })); + } + } + return errors; + } + + get upstreamJson() { + const result = super.upstreamJson; + + Object.assign(result, { + method: this.method, + host: this.host, + port: this.port, + path: this.path, + body: this.body, + webhook: { + host: this.host, + port: this.port, + } + }); + + return result; + } + + get simulateMessage() { + return i18n.translate('xpack.watcher.models.webhookAction.simulateMessage', { + defaultMessage: 'Sample request sent to {fullPath}', + values: { + fullPath: this.fullPath + } + }); + } + + get simulateFailMessage() { + return i18n.translate('xpack.watcher.models.webhookAction.simulateFailMessage', { + defaultMessage: 'Failed to send request to {fullPath}.', + values: { + fullPath: this.fullPath + } + }); + } + + static fromUpstreamJson(upstreamAction) { + return new WebhookAction(upstreamAction); + } + + static typeName = i18n.translate('xpack.watcher.models.webhookAction.typeName', { + defaultMessage: 'Webhook', + }); + static iconClass = 'logoWebhook'; + static selectMessage = i18n.translate('xpack.watcher.models.webhookAction.selectMessageText', { + defaultMessage: 'Send a request to any web service.', + }); + static simulatePrompt = i18n.translate('xpack.watcher.models.webhookAction.simulateButtonLabel', { + defaultMessage: 'Send request now', + }); +} diff --git a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js index 68cc4e45c9a87f..ffe4780a70602a 100644 --- a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js +++ b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TIME_UNITS } from '../../../common/constants'; -import moment from 'moment'; import { i18n } from '@kbn/i18n'; export class ExecuteDetails { @@ -47,30 +45,18 @@ export class ExecuteDetails { return errors; } - formatTime(timeUnit, value) { - let timeValue = moment(); - switch (timeUnit) { - case TIME_UNITS.SECOND: - timeValue = timeValue.add(value, 'seconds'); - break; - case TIME_UNITS.MINUTE: - timeValue = timeValue.add(value, 'minutes'); - break; - case TIME_UNITS.HOUR: - timeValue = timeValue.add(value, 'hours'); - break; - case TIME_UNITS.MILLISECOND: - timeValue = timeValue.add(value, 'milliseconds'); - break; + formatTime(timeUnit, timeValue) { + const now = 'now'; + if (timeValue === 0) { + return now; } - return timeValue.format(); + return `${now}+${timeValue}${timeUnit}`; } get upstreamJson() { - const hasTriggerTime = this.triggeredTimeValue !== ''; - const hasScheduleTime = this.scheduledTimeValue !== ''; - const triggeredTime = hasTriggerTime ? this.formatTime(this.triggeredTimeUnit, this.triggeredTimeValue) : undefined; - const scheduledTime = hasScheduleTime ? this.formatTime(this.scheduledTimeUnit, this.scheduledTimeValue) : undefined; + const triggeredTime = this.triggeredTimeValue ? this.formatTime(this.triggeredTimeUnit, this.triggeredTimeValue) : undefined; + const scheduledTime = this.scheduledTimeValue ? this.formatTime(this.scheduledTimeUnit, this.scheduledTimeValue) : undefined; + return { triggerData: { triggeredTime, diff --git a/x-pack/plugins/watcher/public/models/index.d.ts b/x-pack/plugins/watcher/public/models/index.d.ts index 12fbeaec4d1497..43941df4ee7128 100644 --- a/x-pack/plugins/watcher/public/models/index.d.ts +++ b/x-pack/plugins/watcher/public/models/index.d.ts @@ -30,10 +30,18 @@ declare module 'plugins/watcher/models/watch_history_item' { declare module 'plugins/watcher/models/watch_status' { export const WatchStatus: any; } + +declare module 'plugins/watcher/models/settings' { + export const Settings: any; +} +declare module 'plugins/watcher/models/action' { + export const Action: any; +} // TODO: Remove once typescript definitions are in EUI declare module '@elastic/eui' { export const EuiCodeEditor: React.SFC; export const EuiDescribedFormGroup: React.SFC; + export const EuiSuperSelect: React.SFC; } declare module 'ui/time_buckets' { diff --git a/x-pack/plugins/watcher/public/models/watch/base_watch.js b/x-pack/plugins/watcher/public/models/watch/base_watch.js index 94d8079387101b..5596e50a137fce 100644 --- a/x-pack/plugins/watcher/public/models/watch/base_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/base_watch.js @@ -5,7 +5,7 @@ */ import { getSearchValue } from 'plugins/watcher/lib/get_search_value'; -import { get, isEqual, remove, map, merge } from 'lodash'; +import { get, isEqual, remove, map } from 'lodash'; import { Action } from '../action'; import { WatchStatus } from '../watch_status'; import { WatchErrors } from '../watch_errors'; @@ -55,11 +55,7 @@ export class BaseWatch { } const id = createActionId(this.actions, type); - const props = merge( - {}, - defaults, - { id, type } - ); + const props = { id, type, ...defaults }; const action = new ActionType(props); this.addAction(action); @@ -135,44 +131,6 @@ export class BaseWatch { return isEqual(cleanWatch, cleanOtherWatch); } - /** - * Client validation of the Watch. - * Currently we are *only* validating the Watch "Actions" - */ - validate() { - - // Get the errors from each watch action - const actionsErrors = this.actions.reduce((actionsErrors, action) => { - if (action.validate) { - const { errors } = action.validate(); - if (!errors) { - return actionsErrors; - } - return [...actionsErrors, ...errors]; - } - return actionsErrors; - }, []); - - if (!actionsErrors.length) { - return { warning: null }; - } - - // Concatenate their message - const warningMessage = actionsErrors.reduce((message, error) => ( - !!message - ? `${message}, ${error.message}` - : error.message - ), ''); - - // We are not doing any *blocking* validation in the client, - // so we return the errors as a _warning_ - return { - warning: { - message: warningMessage, - } - }; - } - static typeName = i18n.translate('xpack.watcher.models.baseWatch.typeName', { defaultMessage: 'Watch', }); diff --git a/x-pack/plugins/watcher/public/models/watch/json_watch.js b/x-pack/plugins/watcher/public/models/watch/json_watch.js index e051bc63412e43..64527c8cd54dda 100644 --- a/x-pack/plugins/watcher/public/models/watch/json_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/json_watch.js @@ -23,7 +23,7 @@ export class JsonWatch extends BaseWatch { } validate() { - const validationResult = super.validate(); + const validationResult = {}; const idRegex = /^[A-Za-z0-9\-\_]+$/; const errors = { id: [], diff --git a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js index fb27f657017084..2df526e74a36ad 100644 --- a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js @@ -95,7 +95,7 @@ export class ThresholdWatch extends BaseWatch { return `${staticPart} ${dynamicPartText}`; } validate() { - const validationResult = super.validate(); + const validationResult = {}; const errors = { name: [], index: [], diff --git a/x-pack/plugins/watcher/public/services/settings/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/index.ts similarity index 82% rename from x-pack/plugins/watcher/public/services/settings/index.js rename to x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/index.ts index 608ed2fbd69022..21716f9e544e7d 100644 --- a/x-pack/plugins/watcher/public/services/settings/index.js +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import './settings_service.factory'; +export { JsonWatchEdit } from './json_watch_edit'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx similarity index 89% rename from x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit.tsx rename to x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx index 161cd355c715a0..dbf929c7967795 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx @@ -18,12 +18,12 @@ import { import { i18n } from '@kbn/i18n'; import { injectI18n } from '@kbn/i18n/react'; import { ExecuteDetails } from 'plugins/watcher/models/execute_details/execute_details'; -import { getActionType } from '../../../../common/lib/get_action_type'; -import { BaseWatch, ExecutedWatchDetails } from '../../../../common/types/watch_types'; -import { ACTION_MODES, TIME_UNITS } from '../../../../common/constants'; +import { getActionType } from '../../../../../common/lib/get_action_type'; +import { BaseWatch, ExecutedWatchDetails } from '../../../../../common/types/watch_types'; +import { ACTION_MODES, TIME_UNITS } from '../../../../../common/constants'; import { JsonWatchEditForm } from './json_watch_edit_form'; import { JsonWatchEditSimulate } from './json_watch_edit_simulate'; -import { WatchContext } from './watch_context'; +import { WatchContext } from '../../watch_context'; interface WatchAction { actionId: string; @@ -111,7 +111,10 @@ const JsonWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { onClick={() => { setSelectedTab(tab.id); setExecuteDetails( - new ExecuteDetails({ ...executeDetails, actionModes: getActionModes(watchActions) }) + new ExecuteDetails({ + ...executeDetails, + actionModes: getActionModes(watchActions), + }) ); }} isSelected={tab.id === selectedTab} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx similarity index 70% rename from x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx rename to x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx index b270c6dfb28260..488c541daa9345 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx @@ -18,20 +18,39 @@ import { EuiLink, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ConfirmWatchesModal } from '../../../components/confirm_watches_modal'; -import { ErrableFormRow } from '../../../components/form_errors'; -import { putWatchApiUrl } from '../../../lib/documentation_links'; -import { onWatchSave, saveWatch } from '../watch_edit_actions'; -import { WatchContext } from './watch_context'; -import { LicenseServiceContext } from '../../../license_service_context'; +import { ConfirmWatchesModal } from '../../../../components/confirm_watches_modal'; +import { ErrableFormRow } from '../../../../components/form_errors'; +import { putWatchApiUrl } from '../../../../lib/documentation_links'; +import { onWatchSave, saveWatch } from '../../watch_edit_actions'; +import { WatchContext } from '../../watch_context'; +import { LicenseServiceContext } from '../../../../license_service_context'; export const JsonWatchEditForm = () => { const { watch, setWatchProperty } = useContext(WatchContext); - // hooks - const [modal, setModal] = useState<{ title: string; message: string } | null>(null); + const licenseService = useContext(LicenseServiceContext); + const { errors } = watch.validate(); const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); - const licenseService = useContext(LicenseServiceContext); + + const [validationResult, setValidationResult] = useState<{ + type: string; + title: string; + message: string; + } | null>(null); + + const hasActionErrors = !!validationResult && validationResult.type === 'error'; + + const invalidActionMessage = i18n.translate( + 'xpack.watcher.sections.watchEdit.json.form.actionValidationErrorMessage', + { + defaultMessage: 'Invalid watch actions', + } + ); + + const jsonErrors = { + ...errors, + json: hasActionErrors ? [...errors.json, invalidActionMessage] : [...errors.json], + }; if (errors.json.length === 0) { setWatchProperty('watch', JSON.parse(watch.watchString)); @@ -39,16 +58,21 @@ export const JsonWatchEditForm = () => { return ( - { - if (isConfirmed) { - saveWatch(watch, licenseService); - } - setModal(null); - }} - /> - + {validationResult && validationResult.type === 'warning' && ( + { + if (isConfirmed) { + saveWatch(watch, licenseService); + } + setValidationResult(null); + }} + /> + )} + { } errorKey="json" - isShowingErrors={hasErrors} + isShowingErrors={hasErrors || hasActionErrors} fullWidth - errors={errors} + errors={jsonErrors} > { )} value={watch.watchString} onChange={(json: string) => { + if (validationResult && validationResult.type === 'error') { + setValidationResult(null); + } setWatchProperty('watchString', json); }} /> @@ -144,8 +171,8 @@ export const JsonWatchEditForm = () => { isDisabled={hasErrors} onClick={async () => { const savedWatch = await onWatchSave(watch, licenseService); - if (savedWatch && savedWatch.error) { - return setModal(savedWatch.error); + if (savedWatch && savedWatch.validationError) { + return setValidationResult(savedWatch.validationError); } }} > diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx similarity index 96% rename from x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx rename to x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx index cc12c842aff544..7d6c917efc8c1c 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx @@ -27,13 +27,16 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { ExecuteDetails } from 'plugins/watcher/models/execute_details/execute_details'; import { WatchHistoryItem } from 'plugins/watcher/models/watch_history_item'; import { toastNotifications } from 'ui/notify'; -import { ACTION_MODES, TIME_UNITS } from '../../../../common/constants'; -import { ExecutedWatchDetails, ExecutedWatchResults } from '../../../../common/types/watch_types'; -import { ErrableFormRow } from '../../../components/form_errors'; -import { executeWatch } from '../../../lib/api'; -import { executeWatchApiUrl } from '../../../lib/documentation_links'; -import { WatchContext } from '../../../sections/watch_edit/components/watch_context'; -import { timeUnits } from '../time_units'; +import { ACTION_MODES, TIME_UNITS } from '../../../../../common/constants'; +import { + ExecutedWatchDetails, + ExecutedWatchResults, +} from '../../../../../common/types/watch_types'; +import { ErrableFormRow } from '../../../../components/form_errors'; +import { executeWatch } from '../../../../lib/api'; +import { executeWatchApiUrl } from '../../../../lib/documentation_links'; +import { WatchContext } from '../../watch_context'; +import { timeUnits } from '../../time_units'; import { JsonWatchEditSimulateResults } from './json_watch_edit_simulate_results'; export const JsonWatchEditSimulate = ({ diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx similarity index 94% rename from x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx rename to x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx index ce7c0d194bf539..a5a4bbc6e06a80 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit_simulate_results.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx @@ -18,10 +18,13 @@ import { EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { WATCH_STATES } from '../../../../common/constants'; -import { ExecutedWatchDetails, ExecutedWatchResults } from '../../../../common/types/watch_types'; -import { getTypeFromAction } from '../watch_edit_actions'; -import { WatchContext } from './watch_context'; +import { WATCH_STATES } from '../../../../../common/constants'; +import { + ExecutedWatchDetails, + ExecutedWatchResults, +} from '../../../../../common/types/watch_types'; +import { getTypeFromAction } from '../../watch_edit_actions'; +import { WatchContext } from '../../watch_context'; const WATCH_ICON_COLORS = { [WATCH_STATES.DISABLED]: 'subdued', diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx new file mode 100644 index 00000000000000..7eec71dbd9474f --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx @@ -0,0 +1,117 @@ +/* + * 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 React, { Fragment } from 'react'; + +import { EuiComboBox, EuiFieldText, EuiFormRow, EuiTextArea } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ErrableFormRow } from '../../../../../components/form_errors'; +import { EmailAction } from '../../../../../../common/types/action_types'; + +interface Props { + action: EmailAction; + editAction: (changedProperty: { key: string; value: any }) => void; + errors: { [key: string]: string[] }; + hasErrors: boolean; +} + +export const EmailActionFields: React.FunctionComponent = ({ + action, + editAction, + errors, + hasErrors, +}) => { + const { to, subject, body } = action; + const toOptions = to ? to.map(label => ({ label })) : []; + + return ( + + + { + const newOptions = [...toOptions, { label: searchValue }]; + editAction({ key: 'to', value: newOptions.map(newOption => newOption.label) }); + }} + onChange={(selectedOptions: Array<{ label: string }>) => { + editAction({ + key: 'to', + value: selectedOptions.map(selectedOption => selectedOption.label), + }); + }} + onBlur={() => { + if (!to) { + editAction({ + key: 'to', + value: [], + }); + } + }} + /> + + + + { + editAction({ key: 'subject', value: e.target.value }); + }} + /> + + + + { + editAction({ key: 'body', value: e.target.value }); + }} + onBlur={() => { + if (!body) { + editAction({ key: 'body', value: '' }); + } + }} + /> + + + ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index.ts b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index.ts new file mode 100644 index 00000000000000..b425c0b5e073d0 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index.ts @@ -0,0 +1,13 @@ +/* + * 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. + */ + +export { EmailActionFields } from './email_action_fields'; +export { IndexActionFields } from './index_action_fields'; +export { JiraActionFields } from './jira_action_fields'; +export { LoggingActionFields } from './logging_action_fields'; +export { PagerDutyActionFields } from './pagerduty_action_fields'; +export { SlackActionFields } from './slack_action_fields'; +export { WebhookActionFields } from './webhook_action_fields'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index_action_fields.tsx new file mode 100644 index 00000000000000..b4e65609efffcf --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index_action_fields.tsx @@ -0,0 +1,55 @@ +/* + * 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 React from 'react'; +import { EuiFieldText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ErrableFormRow } from '../../../../../components/form_errors'; +import { IndexAction } from '../../../../../../common/types/action_types'; + +interface Props { + action: IndexAction; + editAction: (changedProperty: { key: string; value: string }) => void; + errors: { [key: string]: string[] }; + hasErrors: boolean; +} + +export const IndexActionFields: React.FunctionComponent = ({ + action, + editAction, + errors, + hasErrors, +}) => { + const { index } = action; + return ( + + ) => { + editAction({ key: 'index', value: e.target.value }); + }} + onBlur={() => { + if (!index) { + editAction({ key: 'index', value: '' }); + } + }} + /> + + ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/jira_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/jira_action_fields.tsx new file mode 100644 index 00000000000000..ec746d0cb2ecb8 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/jira_action_fields.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment } from 'react'; + +import { EuiFieldText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ErrableFormRow } from '../../../../../components/form_errors'; +import { JiraAction } from '../../../../../../common/types/action_types'; + +interface Props { + action: JiraAction; + editAction: (changedProperty: { key: string; value: any }) => void; + errors: { [key: string]: string[] }; + hasErrors: boolean; + children: React.ReactNode; +} + +export const JiraActionFields: React.FunctionComponent = ({ + action, + editAction, + errors, + hasErrors, + children, +}) => { + const { projectKey, issueType, summary } = action; + + return ( + + {children} + + + { + editAction({ key: 'projectKey', value: e.target.value }); + }} + onBlur={() => { + if (!projectKey) { + editAction({ key: 'projectKey', value: '' }); + } + }} + /> + + + + { + editAction({ key: 'issueType', value: e.target.value }); + }} + onBlur={() => { + if (!issueType) { + editAction({ key: 'issueType', value: '' }); + } + }} + /> + + + + { + editAction({ key: 'summary', value: e.target.value }); + }} + onBlur={() => { + if (!summary) { + editAction({ key: 'summary', value: '' }); + } + }} + /> + + + ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/logging_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/logging_action_fields.tsx new file mode 100644 index 00000000000000..923d3e8f627d50 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/logging_action_fields.tsx @@ -0,0 +1,55 @@ +/* + * 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 React from 'react'; +import { EuiFieldText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ErrableFormRow } from '../../../../../components/form_errors'; +import { LoggingAction } from '../../../../../../common/types/action_types'; + +interface Props { + action: LoggingAction; + editAction: (changedProperty: { key: string; value: string }) => void; + errors: { [key: string]: string[] }; + hasErrors: boolean; +} + +export const LoggingActionFields: React.FunctionComponent = ({ + action, + editAction, + errors, + hasErrors, +}) => { + const { text } = action; + return ( + + ) => { + editAction({ key: 'text', value: e.target.value }); + }} + onBlur={() => { + if (!text) { + editAction({ key: 'text', value: '' }); + } + }} + /> + + ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/pagerduty_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/pagerduty_action_fields.tsx new file mode 100644 index 00000000000000..826c7a2c3989a5 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/pagerduty_action_fields.tsx @@ -0,0 +1,60 @@ +/* + * 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 React, { Fragment } from 'react'; +import { EuiFieldText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ErrableFormRow } from '../../../../../components/form_errors'; +import { PagerDutyAction } from '../../../../../../common/types/action_types'; + +interface Props { + action: PagerDutyAction; + editAction: (changedProperty: { key: string; value: string }) => void; + errors: { [key: string]: string[] }; + hasErrors: boolean; + children: React.ReactNode; +} + +export const PagerDutyActionFields: React.FunctionComponent = ({ + errors, + hasErrors, + action, + editAction, + children, +}) => { + const { description } = action; + return ( + + {children} + + ) => { + editAction({ key: 'description', value: e.target.value }); + }} + onBlur={() => { + if (!description) { + editAction({ key: 'description', value: '' }); + } + }} + /> + + + ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx new file mode 100644 index 00000000000000..e1ac3e01c2c268 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx @@ -0,0 +1,74 @@ +/* + * 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 React, { Fragment } from 'react'; +import { EuiComboBox, EuiTextArea, EuiFormRow } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { SlackAction } from '../../../../../../common/types/action_types'; + +interface Props { + action: SlackAction; + editAction: (changedProperty: { key: string; value: any }) => void; + children: React.ReactNode; +} + +export const SlackActionFields: React.FunctionComponent = ({ + action, + editAction, + children, +}) => { + const { text, to } = action; + const toOptions = to ? to.map(label => ({ label })) : []; + + return ( + + {children} + + { + const newOptions = [...toOptions, { label: searchValue }]; + editAction({ key: 'to', value: newOptions.map(newOption => newOption.label) }); + }} + onChange={(selectedOptions: Array<{ label: string }>) => { + editAction({ + key: 'to', + value: selectedOptions.map(selectedOption => selectedOption.label), + }); + }} + /> + + + + { + editAction({ key: 'text', value: e.target.value }); + }} + /> + + + ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx new file mode 100644 index 00000000000000..905071f142194a --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx @@ -0,0 +1,163 @@ +/* + * 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 React, { Fragment, useEffect } from 'react'; + +import { EuiCodeEditor, EuiFieldNumber, EuiFieldText, EuiFormRow, EuiSelect } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ErrableFormRow } from '../../../../../components/form_errors'; +import { WebhookAction } from '../../../../../../common/types/action_types'; + +interface Props { + action: WebhookAction; + editAction: (changedProperty: { key: string; value: any }) => void; + errors: { [key: string]: string[] }; + hasErrors: boolean; +} + +const HTTP_VERBS = ['head', 'get', 'post', 'put', 'delete']; + +export const WebhookActionFields: React.FunctionComponent = ({ + action, + editAction, + errors, + hasErrors, +}) => { + const { method, host, port, path, body } = action; + + useEffect(() => { + editAction({ key: 'contentType', value: 'application/json' }); // set content-type for threshold watch to json by default + }, []); + + return ( + + + ({ text: verb.toUpperCase(), value: verb }))} + onChange={e => { + editAction({ key: 'method', value: e.target.value }); + }} + /> + + + + { + editAction({ key: 'host', value: e.target.value }); + }} + onBlur={() => { + if (!host) { + editAction({ key: 'host', value: '' }); + } + }} + /> + + + + { + editAction({ key: 'port', value: parseInt(e.target.value, 10) }); + }} + onBlur={() => { + if (!port) { + editAction({ key: 'port', value: '' }); + } + }} + /> + + + + { + editAction({ key: 'path', value: e.target.value }); + }} + /> + + + + { + editAction({ key: 'body', value: json }); + }} + /> + + + ); +}; diff --git a/x-pack/plugins/watcher/public/services/action_defaults/index.js b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/index.ts similarity index 78% rename from x-pack/plugins/watcher/public/services/action_defaults/index.js rename to x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/index.ts index a3ccc4d8d67b0a..5db19694770119 100644 --- a/x-pack/plugins/watcher/public/services/action_defaults/index.js +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/index.ts @@ -4,5 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import './action_defaults_service.factory'; -import './registry'; +export { ThresholdWatchEdit } from './threshold_watch_edit'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx new file mode 100644 index 00000000000000..0aebf7200847fa --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx @@ -0,0 +1,226 @@ +/* + * 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 React, { Fragment, useContext } from 'react'; + +import { + EuiAccordion, + EuiButton, + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiTitle, + EuiForm, + EuiCallOut, + EuiLink, + EuiText, + EuiSpacer, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { ExecuteDetails } from 'plugins/watcher/models/execute_details/execute_details'; +import { Action } from 'plugins/watcher/models/action'; +import { toastNotifications } from 'ui/notify'; +import { WatchHistoryItem } from 'plugins/watcher/models/watch_history_item'; +import { ThresholdWatch } from 'plugins/watcher/models/watch/threshold_watch'; +import { ActionType } from '../../../../../common/types/action_types'; +import { ACTION_TYPES, ACTION_MODES } from '../../../../../common/constants'; +import { WatchContext } from '../../watch_context'; +import { + WebhookActionFields, + LoggingActionFields, + IndexActionFields, + SlackActionFields, + EmailActionFields, + PagerDutyActionFields, + JiraActionFields, +} from './action_fields'; +import { executeWatch } from '../../../../lib/api'; +import { watchActionsConfigurationMap } from '../../../../lib/documentation_links'; + +const actionFieldsComponentMap = { + [ACTION_TYPES.LOGGING]: LoggingActionFields, + [ACTION_TYPES.SLACK]: SlackActionFields, + [ACTION_TYPES.EMAIL]: EmailActionFields, + [ACTION_TYPES.INDEX]: IndexActionFields, + [ACTION_TYPES.WEBHOOK]: WebhookActionFields, + [ACTION_TYPES.PAGERDUTY]: PagerDutyActionFields, + [ACTION_TYPES.JIRA]: JiraActionFields, +}; + +interface Props { + settings: { + actionTypes: { + [key: string]: { + enabled: boolean; + }; + }; + } | null; + actionErrors: { + [key: string]: { + [key: string]: string[]; + }; + }; +} + +export const WatchActionsAccordion: React.FunctionComponent = ({ + settings, + actionErrors, +}) => { + const { watch, setWatchProperty } = useContext(WatchContext); + const { actions } = watch; + + if (actions && actions.length >= 1) { + return actions.map((action: any) => { + const FieldsComponent = actionFieldsComponentMap[action.type]; + const errors = actionErrors[action.id]; + const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); + + return ( + + + + + + +
{action.typeName}
+
+
+
+ } + extraAction={ + { + const updatedActions = actions.filter( + (actionItem: ActionType) => actionItem.id !== action.id + ); + setWatchProperty('actions', updatedActions); + }} + /> + } + paddingSize="l" + > + + { + const updatedActions = actions.map((actionItem: ActionType) => { + if (actionItem.id === action.id) { + const ActionTypes = Action.getActionTypes(); + const ActionTypeModel = ActionTypes[action.type]; + const { key, value } = changedProperty; + return new ActionTypeModel({ ...action, [key]: value }); + } + return actionItem; + }); + setWatchProperty('actions', updatedActions); + }} + > + {settings && settings.actionTypes[action.type].enabled === false ? ( + + + +

+ + + + ), + }} + /> +

+
+
+ +
+ ) : null} +
+ + { + const selectedWatchAction = watch.actions.filter( + (watchAction: any) => watchAction.id === action.id + ); + const executeDetails = new ExecuteDetails({ + ignoreCondition: true, + recordExecution: false, + actionModes: { + [action.id]: ACTION_MODES.FORCE_EXECUTE, + }, + }); + const newExecuteWatch = new ThresholdWatch({ + ...watch, + actions: selectedWatchAction, + }); + try { + const executedWatch = await executeWatch(executeDetails, newExecuteWatch); + const executeResults = WatchHistoryItem.fromUpstreamJson( + executedWatch.watchHistoryItem + ); + const actionStatuses = executeResults.watchStatus.actionStatuses; + const actionStatus = actionStatuses.find( + (actionItem: ActionType) => actionItem.id === action.id + ); + + if (actionStatus.lastExecutionSuccessful === false) { + const message = actionStatus.lastExecutionReason || action.simulateFailMessage; + return toastNotifications.addDanger(message); + } + toastNotifications.addSuccess(action.simulateMessage); + } catch (e) { + toastNotifications.addDanger(e.data.message); + } + }} + > + {action.simulatePrompt} + +
+ + ); + }); + } + return null; +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_dropdown.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_dropdown.tsx new file mode 100644 index 00000000000000..a9f1849945d6d6 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_dropdown.tsx @@ -0,0 +1,100 @@ +/* + * 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 { + EuiSpacer, + EuiSuperSelect, + EuiText, + EuiFlexItem, + EuiIcon, + EuiFlexGroup, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { useContext } from 'react'; +import { Action } from 'plugins/watcher/models/action'; +import { ACTION_TYPES } from '../../../../../common/constants'; +import { WatchContext } from '../../watch_context'; + +const EMPTY_FIRST_OPTION_VALUE = 'empty-first-option'; + +const disabledMessage = i18n.translate( + 'xpack.watcher.sections.watchEdit.actions.disabledOptionLabel', + { + defaultMessage: 'Disabled. Configure elasticsearch.yml.', + } +); + +const firstActionOption = { + inputDisplay: i18n.translate('xpack.watcher.sections.watchEdit.actions.emptyFirstOptionLabel', { + defaultMessage: 'Add an action', + }), + value: EMPTY_FIRST_OPTION_VALUE, +}; + +interface Props { + settings: { + actionTypes: { + [key: string]: { + enabled: boolean; + }; + }; + } | null; + isLoading: boolean; +} + +export const WatchActionsDropdown: React.FunctionComponent = ({ settings, isLoading }) => { + const { addAction } = useContext(WatchContext); + + const allActionTypes = Action.getActionTypes() as Record; + + const actions = Object.entries(allActionTypes).map( + ([type, { typeName, iconClass, selectMessage }]) => ({ + type, + typeName, + iconClass, + selectMessage, + isEnabled: settings ? settings.actionTypes[type].enabled : true, + }) + ); + + const actionOptions = actions + ? actions.map((action: any) => { + const isActionDisabled = action.type === ACTION_TYPES.EMAIL && !action.isEnabled; // Currently can only fully verify email action + const description = isActionDisabled ? disabledMessage : action.selectMessage; + return { + value: action.type, + inputDisplay: action.typeName, + disabled: isActionDisabled && !action.isEnabled, + dropdownDisplay: ( + + + + + + {action.typeName} + + +

{description}

+
+
+
+ ), + }; + }) + : []; + const actionOptionsWithEmptyValue = [firstActionOption, ...actionOptions]; + return ( + { + addAction({ type: value, defaults: { isNew: true } }); + }} + itemLayoutAlign="top" + hasDividers + isLoading={isLoading} + /> + ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_panel.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_panel.tsx new file mode 100644 index 00000000000000..b9cec2313d4de2 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_panel.tsx @@ -0,0 +1,51 @@ +/* + * 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 { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { Fragment, useContext } from 'react'; +import { loadSettings } from '../../../../lib/api'; +import { WatchActionsDropdown } from './threshold_watch_action_dropdown'; +import { WatchActionsAccordion } from './threshold_watch_action_accordion'; +import { WatchContext } from '../../watch_context'; + +interface Props { + actionErrors: { + [key: string]: { + [key: string]: string[]; + }; + }; +} + +export const WatchActionsPanel: React.FunctionComponent = ({ actionErrors }) => { + const { watch } = useContext(WatchContext); + + const { data: settings, isLoading } = loadSettings(); + + return ( + + + + +

+ {i18n.translate('xpack.watcher.sections.watchEdit.actions.title', { + defaultMessage: + 'Will perform {watchActionsCount, plural, one{# action} other {# actions}} once met', + values: { + watchActionsCount: watch.actions.length, + }, + })} +

+
+
+ + + +
+ + +
+ ); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx similarity index 95% rename from x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx rename to x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index 876c77d1f2b8f9..f85c53192b60f3 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -26,17 +26,19 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; -import { ConfirmWatchesModal } from '../../../components/confirm_watches_modal'; -import { ErrableFormRow } from '../../../components/form_errors'; -import { fetchFields, getMatchingIndices, loadIndexPatterns } from '../../../lib/api'; -import { aggTypes } from '../../../models/watch/agg_types'; -import { groupByTypes } from '../../../models/watch/group_by_types'; -import { comparators } from '../../../models/watch/comparators'; -import { timeUnits } from '../time_units'; -import { onWatchSave, saveWatch } from '../watch_edit_actions'; -import { WatchContext } from './watch_context'; + +import { ConfirmWatchesModal } from '../../../../components/confirm_watches_modal'; +import { ErrableFormRow } from '../../../../components/form_errors'; +import { fetchFields, getMatchingIndices, loadIndexPatterns } from '../../../../lib/api'; +import { aggTypes } from '../../../../models/watch/agg_types'; +import { groupByTypes } from '../../../../models/watch/group_by_types'; +import { comparators } from '../../../../models/watch/comparators'; +import { timeUnits } from '../../time_units'; +import { onWatchSave, saveWatch } from '../../watch_edit_actions'; +import { WatchContext } from '../../watch_context'; import { WatchVisualization } from './watch_visualization'; -import { LicenseServiceContext } from '../../../license_service_context'; +import { WatchActionsPanel } from './threshold_watch_action_panel'; +import { LicenseServiceContext } from '../../../../license_service_context'; const firstFieldOption = { text: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel', { defaultMessage: 'Select a field', @@ -149,6 +151,16 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit }, []); const { errors } = watch.validate(); const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); + const actionErrors = watch.actions.reduce((acc: any, action: any) => { + const actionValidationErrors = action.validate(); + acc[action.id] = actionValidationErrors; + return acc; + }, {}); + const hasActionErrors = !!Object.keys(actionErrors).find(actionError => { + return !!Object.keys(actionErrors[actionError]).find((actionErrorKey: string) => { + return actionErrors[actionError][actionErrorKey].length >= 1; + }); + }); const expressionErrorMessage = i18n.translate( 'xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage', { @@ -789,6 +801,9 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit
{hasErrors ? null : } + + + ) : null} @@ -796,11 +811,11 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit { const savedWatch = await onWatchSave(watch, licenseService); - if (savedWatch && savedWatch.error) { - return setModal(savedWatch.error); + if (savedWatch && savedWatch.validationError) { + return setModal(savedWatch.validationError); } }} > diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx similarity index 96% rename from x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx rename to x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx index 5daab470254e3e..9150749d15105f 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_visualization.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx @@ -27,10 +27,11 @@ import moment from 'moment-timezone'; import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLoadingChart, EuiSpacer } from '@elastic/eui'; import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; import { VisualizeOptions } from 'plugins/watcher/models/visualize_options'; -import { getWatchVisualizationData } from '../../../lib/api'; -import { WatchContext } from './watch_context'; -import { aggTypes } from '../../../models/watch/agg_types'; -import { comparators } from '../../../models/watch/comparators'; +import { getWatchVisualizationData } from '../../../../lib/api'; +import { WatchContext } from '../../watch_context'; +import { aggTypes } from '../../../../models/watch/agg_types'; +import { comparators } from '../../../../models/watch/comparators'; + const getChartTheme = () => { const isDarkTheme = chrome.getUiSettingsClient().get('theme:darkMode'); const baseTheme = isDarkTheme ? DARK_THEME : LIGHT_THEME; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx index dd7ba812d40f26..57370de0aefc4f 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -20,7 +20,7 @@ import { loadWatch } from '../../../lib/api'; import { listBreadcrumb, editBreadcrumb, createBreadcrumb } from '../../../lib/breadcrumbs'; import { JsonWatchEdit } from './json_watch_edit'; import { ThresholdWatchEdit } from './threshold_watch_edit'; -import { WatchContext } from './watch_context'; +import { WatchContext } from '../watch_context'; const getTitle = (watch: BaseWatch) => { if (watch.isNew) { @@ -66,8 +66,9 @@ const watchReducer = (state: any, action: any) => { } case 'addAction': + const { type, defaults } = payload; const newWatch = new (Watch.getWatchTypes())[watch.type](watch); - newWatch.addAction(payload); + newWatch.createAction(type, defaults); return { ...state, watch: newWatch, diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_context.ts b/x-pack/plugins/watcher/public/sections/watch_edit/watch_context.ts similarity index 100% rename from x-pack/plugins/watcher/public/sections/watch_edit/components/watch_context.ts rename to x-pack/plugins/watcher/public/sections/watch_edit/watch_context.ts diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts index 4f086fed8a4bba..a36c1c2717970f 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts +++ b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts @@ -6,7 +6,8 @@ import { i18n } from '@kbn/i18n'; import { toastNotifications } from 'ui/notify'; -import { ACTION_TYPES } from '../../../common/constants'; +import { get } from 'lodash'; +import { ACTION_TYPES, WATCH_TYPES } from '../../../common/constants'; import { BaseWatch } from '../../../common/types/watch_types'; import { createWatch, loadWatch } from '../../lib/api'; import { goToWatchList } from '../../lib/navigation'; @@ -32,6 +33,15 @@ function getPropsFromAction(type: string, action: { [key: string]: any }) { // Slack action has its props inside the "message" object return action[type].message; } + + if (type === ACTION_TYPES.JIRA) { + // Jira action has its required props inside the "fields" object + const jiraAction: { projectKey?: string; issueType?: string; summary?: string } = {}; + jiraAction.projectKey = get(action[type], 'fields.project.key'); + jiraAction.issueType = get(action[type], 'fields.issuetype.name'); + jiraAction.summary = get(action[type], 'fields.summary'); + return jiraAction; + } return action[type]; } @@ -49,7 +59,7 @@ function createActionsForWatch(watchInstance: BaseWatch) { Object.keys(watchInstance.watch.actions).forEach(k => { action = watchInstance.watch.actions[k]; type = getTypeFromAction(action); - actionProps = getPropsFromAction(type, action); + actionProps = { ...getPropsFromAction(type, action), ignoreDefaults: true }; watchInstance.createAction(type, actionProps); }); return watchInstance; @@ -75,21 +85,30 @@ export async function saveWatch(watch: BaseWatch, licenseService: any) { } export async function validateActionsAndSaveWatch(watch: BaseWatch, licenseService: any) { - const { warning } = watch.validate(); - if (warning) { - return { - error: { - title: i18n.translate( - 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.errorValidationTitleText', - { - defaultMessage: 'Save watch?', - } - ), - message: warning.message, - }, - }; + if (watch.type === WATCH_TYPES.JSON) { + const actionsErrors = watch.actions.reduce((actionsErrorsAcc: any, action: any) => { + if (action.validate) { + const errors = action.validate(); + const errorKeys = Object.keys(errors); + const hasErrors = !!errorKeys.find(errorKey => errors[errorKey].length >= 1); + if (!hasErrors) { + return actionsErrorsAcc; + } + const newErrors = errorKeys.map(errorKey => errors[errorKey]).flat(); + return [...actionsErrorsAcc, ...newErrors]; + } + return actionsErrorsAcc; + }, []); + if (actionsErrors.length > 0) { + return { + validationError: { + type: 'error', + message: actionsErrors, + }, + }; + } + return saveWatch(watch, licenseService); } - // client validation passed, make request to create watch return saveWatch(watch, licenseService); } @@ -103,7 +122,8 @@ export async function onWatchSave(watch: BaseWatch, licenseService: any): Promis const existingWatch = await loadWatch(watchData.id); if (existingWatch) { return { - error: { + validationError: { + type: 'warning', title: i18n.translate( 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.existingWatchTitleText', { diff --git a/x-pack/plugins/watcher/public/services/action_defaults/action_defaults_service.factory.js b/x-pack/plugins/watcher/public/services/action_defaults/action_defaults_service.factory.js deleted file mode 100644 index c7df96105afb6f..00000000000000 --- a/x-pack/plugins/watcher/public/services/action_defaults/action_defaults_service.factory.js +++ /dev/null @@ -1,22 +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 { uiModules } from 'ui/modules'; -import { XpackWatcherActionDefaultsService } from './action_defaults_service'; -import { ActionDefaultsRegistryProvider } from './registry'; - -import './actions/email_action'; -import './actions/logging_action'; -import './actions/slack_action'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherActionDefaultsService', ($injector) => { - const config = $injector.get('config'); - const Private = $injector.get('Private'); - const registry = Private(ActionDefaultsRegistryProvider); - - return new XpackWatcherActionDefaultsService(config, registry); - }); diff --git a/x-pack/plugins/watcher/public/services/action_defaults/action_defaults_service.js b/x-pack/plugins/watcher/public/services/action_defaults/action_defaults_service.js deleted file mode 100644 index c261ba43db930c..00000000000000 --- a/x-pack/plugins/watcher/public/services/action_defaults/action_defaults_service.js +++ /dev/null @@ -1,19 +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. - */ - -export class XpackWatcherActionDefaultsService { - constructor(config, registry) { - this.config = config; - this.registry = registry; - } - - getDefaults = (watchType, actionType) => { - const reg = this.registry; - const match = reg.find(registryEntry => registryEntry.watchType === watchType && registryEntry.actionType === actionType); - - return match ? match.getDefaults(this.config, watchType) : {}; - } -} diff --git a/x-pack/plugins/watcher/public/services/action_defaults/actions/email_action.js b/x-pack/plugins/watcher/public/services/action_defaults/actions/email_action.js deleted file mode 100644 index e6a7ff9ebe4618..00000000000000 --- a/x-pack/plugins/watcher/public/services/action_defaults/actions/email_action.js +++ /dev/null @@ -1,33 +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 { merge } from 'lodash'; -import { ACTION_TYPES, WATCH_TYPES } from 'plugins/watcher/../common/constants'; -import { ActionDefaultsRegistryProvider } from '../registry'; - -const DEFAULT_ADMIN_EMAIL_CONFIG_KEY = 'xPack:defaultAdminEmail'; -const actionType = ACTION_TYPES.EMAIL; - -function getActionDefaults(config) { - return { - to: config.get(DEFAULT_ADMIN_EMAIL_CONFIG_KEY) - }; -} - -ActionDefaultsRegistryProvider.register(() => { - return { - actionType, - watchType: WATCH_TYPES.THRESHOLD, - getDefaults: (config) => { - const actionDefaults = getActionDefaults(config); - const actionWatchComboDefaults = { - subject: 'Watch [{{ctx.metadata.name}}] has exceeded the threshold' - }; - - return merge(actionDefaults, actionWatchComboDefaults); - } - }; -}); diff --git a/x-pack/plugins/watcher/public/services/action_defaults/actions/logging_action.js b/x-pack/plugins/watcher/public/services/action_defaults/actions/logging_action.js deleted file mode 100644 index 8f1ac0bf3f580b..00000000000000 --- a/x-pack/plugins/watcher/public/services/action_defaults/actions/logging_action.js +++ /dev/null @@ -1,30 +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 { merge } from 'lodash'; -import { ACTION_TYPES, WATCH_TYPES } from 'plugins/watcher/../common/constants'; -import { ActionDefaultsRegistryProvider } from '../registry'; - -const actionType = ACTION_TYPES.LOGGING; - -function getActionDefaults() { - return {}; -} - -ActionDefaultsRegistryProvider.register(() => { - return { - actionType, - watchType: WATCH_TYPES.THRESHOLD, - getDefaults: (config) => { - const actionDefaults = getActionDefaults(config); - const actionWatchComboDefaults = { - text: 'Watch [{{ctx.metadata.name}}] has exceeded the threshold' - }; - - return merge(actionDefaults, actionWatchComboDefaults); - } - }; -}); diff --git a/x-pack/plugins/watcher/public/services/action_defaults/actions/slack_action.js b/x-pack/plugins/watcher/public/services/action_defaults/actions/slack_action.js deleted file mode 100644 index ed2e9a5b809c87..00000000000000 --- a/x-pack/plugins/watcher/public/services/action_defaults/actions/slack_action.js +++ /dev/null @@ -1,30 +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 { merge } from 'lodash'; -import { ACTION_TYPES, WATCH_TYPES } from 'plugins/watcher/../common/constants'; -import { ActionDefaultsRegistryProvider } from '../registry'; - -const actionType = ACTION_TYPES.SLACK; - -function getActionDefaults() { - return {}; -} - -ActionDefaultsRegistryProvider.register(() => { - return { - actionType, - watchType: WATCH_TYPES.THRESHOLD, - getDefaults: (config) => { - const actionDefaults = getActionDefaults(config); - const actionWatchComboDefaults = { - text: 'Watch [{{ctx.metadata.name}}] has exceeded the threshold' - }; - - return merge(actionDefaults, actionWatchComboDefaults); - } - }; -}); diff --git a/x-pack/plugins/watcher/public/services/action_defaults/registry.js b/x-pack/plugins/watcher/public/services/action_defaults/registry.js deleted file mode 100644 index 475d692b58604d..00000000000000 --- a/x-pack/plugins/watcher/public/services/action_defaults/registry.js +++ /dev/null @@ -1,11 +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 { uiRegistry } from 'ui/registry/_registry'; - -export const ActionDefaultsRegistryProvider = uiRegistry({ - name: 'actionDefaultsRegistry' -}); diff --git a/x-pack/plugins/watcher/public/services/settings/settings_service.factory.js b/x-pack/plugins/watcher/public/services/settings/settings_service.factory.js deleted file mode 100644 index 8ff8a4a99ce297..00000000000000 --- a/x-pack/plugins/watcher/public/services/settings/settings_service.factory.js +++ /dev/null @@ -1,14 +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 { uiModules } from 'ui/modules'; -import { SettingsService } from './settings_service'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherSettingsService', ($injector) => { - const $http = $injector.get('$http'); - return new SettingsService($http); - }); diff --git a/x-pack/plugins/watcher/public/services/settings/settings_service.js b/x-pack/plugins/watcher/public/services/settings/settings_service.js deleted file mode 100644 index f8ecd33cd662f4..00000000000000 --- a/x-pack/plugins/watcher/public/services/settings/settings_service.js +++ /dev/null @@ -1,23 +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 chrome from 'ui/chrome'; -import { ROUTES } from '../../../common/constants'; -import { Settings } from 'plugins/watcher/models/settings'; - -export class SettingsService { - constructor($http) { - this.$http = $http; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - getSettings() { - return this.$http.get(`${this.basePath}/settings`) - .then(response => { - return Settings.fromUpstreamJson(response.data); - }); - } -} diff --git a/x-pack/plugins/watcher/server/models/action/action.js b/x-pack/plugins/watcher/server/models/action/action.js index 65c3f2b44c26c1..c25cbfd0256d8d 100644 --- a/x-pack/plugins/watcher/server/models/action/action.js +++ b/x-pack/plugins/watcher/server/models/action/action.js @@ -11,6 +11,10 @@ import { ACTION_TYPES } from '../../../common/constants'; import { LoggingAction } from './logging_action'; import { EmailAction } from './email_action'; import { SlackAction } from './slack_action'; +import { IndexAction } from './index_action'; +import { WebhookAction } from './webhook_action'; +import { PagerDutyAction } from './pagerduty_action'; +import { JiraAction } from './jira_action'; import { UnknownAction } from './unknown_action'; import { i18n } from '@kbn/i18n'; @@ -18,6 +22,10 @@ const ActionTypes = {}; set(ActionTypes, ACTION_TYPES.LOGGING, LoggingAction); set(ActionTypes, ACTION_TYPES.EMAIL, EmailAction); set(ActionTypes, ACTION_TYPES.SLACK, SlackAction); +set(ActionTypes, ACTION_TYPES.INDEX, IndexAction); +set(ActionTypes, ACTION_TYPES.WEBHOOK, WebhookAction); +set(ActionTypes, ACTION_TYPES.PAGERDUTY, PagerDutyAction); +set(ActionTypes, ACTION_TYPES.JIRA, JiraAction); set(ActionTypes, ACTION_TYPES.UNKNOWN, UnknownAction); export class Action { diff --git a/x-pack/plugins/watcher/server/models/action/index_action.js b/x-pack/plugins/watcher/server/models/action/index_action.js new file mode 100644 index 00000000000000..692737456faa13 --- /dev/null +++ b/x-pack/plugins/watcher/server/models/action/index_action.js @@ -0,0 +1,97 @@ +/* + * 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 { BaseAction } from './base_action'; +import { ACTION_TYPES, ERROR_CODES } from '../../../common/constants'; +import { i18n } from '@kbn/i18n'; + +export class IndexAction extends BaseAction { + constructor(props, errors) { + props.type = ACTION_TYPES.INDEX; + super(props, errors); + + this.index = props.index; + } + + // To Kibana + get downstreamJson() { + const result = super.downstreamJson; + Object.assign(result, { + index: this.index + }); + + return result; + } + + // From Kibana + static fromDownstreamJson(json) { + const props = super.getPropsFromDownstreamJson(json); + const { errors } = this.validateJson(json); + + Object.assign(props, { + index: json.index + }); + + const action = new IndexAction(props, errors); + return { action, errors }; + } + + // To Elasticsearch + get upstreamJson() { + const result = super.upstreamJson; + + result[this.id] = { + index: this.index, + }; + return result; + } + + // From Elasticsearch + static fromUpstreamJson(json) { + const props = super.getPropsFromUpstreamJson(json); + const { errors } = this.validateJson(json.actionJson); + + Object.assign(props, { + index: json.actionJson.index.index + }); + + const action = new IndexAction(props, errors); + return { action, errors }; + } + + static validateJson(json) { + const errors = []; + + if (!json.index) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.indexAction.actionJsonIndexPropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonIndex} property', + values: { + actionJsonIndex: 'actionJson.index' + } + }), + }); + + json.index = {}; + } + + if (!json.index.index) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.loggingAction.actionJsonIndexNamePropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonIndexName} property', + values: { + actionJsonIndexName: 'actionJson.index.index' + } + }), + }); + } + + return { errors: errors.length ? errors : null }; + } + +} diff --git a/x-pack/plugins/watcher/server/models/action/jira_action.js b/x-pack/plugins/watcher/server/models/action/jira_action.js new file mode 100644 index 00000000000000..4e8d80599cea79 --- /dev/null +++ b/x-pack/plugins/watcher/server/models/action/jira_action.js @@ -0,0 +1,139 @@ +/* + * 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 { BaseAction } from './base_action'; +import { ACTION_TYPES, ERROR_CODES } from '../../../common/constants'; +import { i18n } from '@kbn/i18n'; + +export class JiraAction extends BaseAction { + constructor(props, errors) { + props.type = ACTION_TYPES.JIRA; + super(props, errors); + + this.projectKey = props.projectKey; + this.issueType = props.issueType; + this.summary = props.summary; + } + + // To Kibana + get downstreamJson() { + const result = super.downstreamJson; + Object.assign(result, { + projectKey: this.projectKey, + issueType: this.issueType, + summary: this.summary, + }); + + return result; + } + + // From Kibana + static fromDownstreamJson(json) { + const props = super.getPropsFromDownstreamJson(json); + const { errors } = this.validateJson(json); + + Object.assign(props, { + projectKey: json.projectKey, + issueType: json.issueType, + summary: json.summary, + }); + + const action = new JiraAction(props, errors); + return { action, errors }; + } + + // To Elasticsearch + get upstreamJson() { + const result = super.upstreamJson; + + result[this.id] = { + jira: { + fields: { + project: { + key: this.projectKey, + }, + issuetype: { + name: this.issueType, + }, + summary: this.summary, + }, + } + }; + + return result; + } + + // From Elasticsearch + static fromUpstreamJson(json) { + const props = super.getPropsFromUpstreamJson(json); + const { errors } = this.validateJson(json.actionJson); + + Object.assign(props, { + projectKey: json.actionJson.jira.fields.project.key, + issueType: json.actionJson.jira.fields.issuetype.name, + summary: json.actionJson.jira.fields.summary, + }); + + const action = new JiraAction(props, errors); + return { action, errors }; + } + + static validateJson(json) { + const errors = []; + + if (!json.jira) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.jiraAction.actionJsonJiraPropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonJira} property', + values: { + actionJsonJira: 'actionJson.jira' + } + }), + }); + + json.jira = {}; + } + + if (!json.jira.fields.project.key) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.jiraAction.actionJsonJiraProjectKeyPropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonJiraProjectKey} property', + values: { + actionJsonJiraProjectKey: 'actionJson.jira.fields.project.key' + } + }), + }); + } + + if (!json.jira.fields.issuetype.name) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.jiraAction.actionJsonJiraIssueTypePropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonJiraIssueType} property', + values: { + actionJsonJiraIssueType: 'actionJson.jira.fields.issuetype.name' + } + }), + }); + } + + if (!json.jira.fields.summary) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.jiraAction.actionJsonJiraSummaryPropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonJiraSummary} property', + values: { + actionJsonJiraSummary: 'actionJson.jira.fields.summary' + } + }), + }); + } + + return { errors: errors.length ? errors : null }; + } +} diff --git a/x-pack/plugins/watcher/server/models/action/pagerduty_action.js b/x-pack/plugins/watcher/server/models/action/pagerduty_action.js new file mode 100644 index 00000000000000..6ded2e4f0422bd --- /dev/null +++ b/x-pack/plugins/watcher/server/models/action/pagerduty_action.js @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { BaseAction } from './base_action'; +import { ACTION_TYPES, ERROR_CODES } from '../../../common/constants'; +import { i18n } from '@kbn/i18n'; + +export class PagerDutyAction extends BaseAction { + constructor(props, errors) { + props.type = ACTION_TYPES.PAGERDUTY; + super(props, errors); + + this.description = props.description; + } + + // To Kibana + get downstreamJson() { + const result = super.downstreamJson; + Object.assign(result, { + description: this.description + }); + + return result; + } + + // From Kibana + static fromDownstreamJson(json) { + const props = super.getPropsFromDownstreamJson(json); + const { errors } = this.validateJson(json); + + Object.assign(props, { + description: json.description + }); + + const action = new PagerDutyAction(props, errors); + return { action, errors }; + } + + // To Elasticsearch + get upstreamJson() { + const result = super.upstreamJson; + + result[this.id] = { + pagerduty: { + description: this.description + } + }; + + return result; + } + + // From Elasticsearch + static fromUpstreamJson(json) { + const props = super.getPropsFromUpstreamJson(json); + const { errors } = this.validateJson(json.actionJson); + + Object.assign(props, { + description: json.actionJson.pagerduty.description + }); + + const action = new PagerDutyAction(props, errors); + return { action, errors }; + } + + static validateJson(json) { + const errors = []; + + if (!json.pagerduty) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.pagerDutyAction.actionJsonPagerDutyPropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonPagerDuty} property', + values: { + actionJsonPagerDuty: 'actionJson.pagerduty' + } + }), + }); + + json.pagerduty = {}; + } + + if (!json.pagerduty.description) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.pagerDutyAction.actionJsonPagerDutyDescriptionPropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonPagerDutyText} property', + values: { + actionJsonPagerDutyText: 'actionJson.pagerduty.description' + } + }), + }); + } + + return { errors: errors.length ? errors : null }; + } +} diff --git a/x-pack/plugins/watcher/server/models/action/webhook_action.js b/x-pack/plugins/watcher/server/models/action/webhook_action.js new file mode 100644 index 00000000000000..c9463b0d64725d --- /dev/null +++ b/x-pack/plugins/watcher/server/models/action/webhook_action.js @@ -0,0 +1,148 @@ +/* + * 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 { BaseAction } from './base_action'; +import { ACTION_TYPES, ERROR_CODES } from '../../../common/constants'; +import { i18n } from '@kbn/i18n'; + +export class WebhookAction extends BaseAction { + constructor(props, errors) { + props.type = ACTION_TYPES.WEBHOOK; + super(props, errors); + + this.method = props.method; + this.host = props.host; + this.port = props.port; + this.path = props.path; + this.body = props.body; + this.contentType = props.contentType; + } + + // To Kibana + get downstreamJson() { + const result = super.downstreamJson; + Object.assign(result, { + method: this.method, + host: this.host, + port: this.port, + path: this.path, + body: this.body, + contentType: this.contentType, + }); + return result; + } + + // From Kibana + static fromDownstreamJson(json) { + const props = super.getPropsFromDownstreamJson(json); + const { errors } = this.validateJson(json); + + Object.assign(props, { + method: json.method, + host: json.host, + port: json.port, + path: json.path, + body: json.body, + contentType: json.contentType, + }); + + const action = new WebhookAction(props, errors); + return { action, errors }; + } + + // To Elasticsearch + get upstreamJson() { + const result = super.upstreamJson; + + const optionalFields = {}; + if (this.path) { + optionalFields.path = this.path; + } + if (this.method) { + optionalFields.method = this.method; + } + if (this.body) { + optionalFields.body = this.body; + } + if (this.contentType) { + optionalFields.headers = { + 'Content-Type': this.contentType, + }; + } + + result[this.id] = { + webhook: { + host: this.host, + port: this.port, + ...optionalFields, + } + }; + + return result; + } + + // From Elasticsearch + static fromUpstreamJson(json) { + const props = super.getPropsFromUpstreamJson(json); + const { errors } = this.validateJson(json.actionJson); + + const optionalFields = {}; + + if (json.actionJson.webhook.path) { + optionalFields.path = json.actionJson.webhook.path; + } + if (json.actionJson.webhook.method) { + optionalFields.method = json.actionJson.webhook.method; + } + if (json.actionJson.webhook.body) { + optionalFields.body = json.actionJson.webhook.body; + } + if (json.actionJson.webhook.headers['Content-Type']) { + optionalFields.contentType = json.actionJson.webhook.headers['Content-Type']; + } + + Object.assign(props, { + host: json.actionJson.webhook.host, + port: json.actionJson.webhook.port, + ...optionalFields, + }); + + const action = new WebhookAction(props, errors); + return { action, errors }; + } + + static validateJson(json) { + const errors = []; + + if (!json.webhook.host) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.loggingAction.actionJsonWebhookHostPropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonWebhookHost} property', + values: { + actionJsonWebhookHost: 'actionJson.webhook.host' + } + }), + }); + json.webhook = {}; + } + + if (!json.webhook.port) { + errors.push({ + code: ERROR_CODES.ERR_PROP_MISSING, + message: i18n.translate('xpack.watcher.models.loggingAction.actionJsonWebhookPortPropertyMissingBadRequestMessage', { + defaultMessage: 'json argument must contain an {actionJsonWebhookPort} property', + values: { + actionJsonWebhookPort: 'actionJson.webhook.port' + } + }), + }); + } + + return { errors: errors.length ? errors : null }; + } + +} diff --git a/x-pack/plugins/watcher/server/models/settings/__tests__/settings.js b/x-pack/plugins/watcher/server/models/settings/__tests__/settings.js index 7add7a0e0564ed..9757bc84bc8886 100644 --- a/x-pack/plugins/watcher/server/models/settings/__tests__/settings.js +++ b/x-pack/plugins/watcher/server/models/settings/__tests__/settings.js @@ -19,8 +19,7 @@ describe('settings module', () => { expect(actionTypes.webhook.enabled).to.be(true); expect(actionTypes.index.enabled).to.be(true); expect(actionTypes.logging.enabled).to.be(true); - expect(actionTypes.hipchat.enabled).to.be(false); - expect(actionTypes.slack.enabled).to.be(true); + expect(actionTypes.slack.enabled).to.be(false); expect(actionTypes.jira.enabled).to.be(false); expect(actionTypes.pagerduty.enabled).to.be(false); }); @@ -94,8 +93,7 @@ describe('settings module', () => { expect(json.action_types.webhook.enabled).to.be(true); expect(json.action_types.index.enabled).to.be(true); expect(json.action_types.logging.enabled).to.be(true); - expect(json.action_types.hipchat.enabled).to.be(false); - expect(json.action_types.slack.enabled).to.be(true); + expect(json.action_types.slack.enabled).to.be(false); expect(json.action_types.jira.enabled).to.be(false); expect(json.action_types.pagerduty.enabled).to.be(false); }); diff --git a/x-pack/plugins/watcher/server/models/settings/settings.js b/x-pack/plugins/watcher/server/models/settings/settings.js index 91970573f795fb..95a1db7533f418 100644 --- a/x-pack/plugins/watcher/server/models/settings/settings.js +++ b/x-pack/plugins/watcher/server/models/settings/settings.js @@ -12,7 +12,6 @@ function isEnabledByDefault(actionType) { case ACTION_TYPES.WEBHOOK: case ACTION_TYPES.INDEX: case ACTION_TYPES.LOGGING: - case ACTION_TYPES.SLACK: // https://github.com/elastic/x-pack-elasticsearch/issues/1573 return true; default: return false; @@ -22,8 +21,7 @@ function isEnabledByDefault(actionType) { function requiresAccountInfo(actionType) { switch (actionType) { case ACTION_TYPES.EMAIL: - case ACTION_TYPES.HIPCHAT: - // case ACTION_TYPES.SLACK: // https://github.com/elastic/x-pack-elasticsearch/issues/1573 + case ACTION_TYPES.SLACK: case ACTION_TYPES.JIRA: case ACTION_TYPES.PAGERDUTY: return true; From 4162b6b288acd246525d4e4f36ba83e805e76ce6 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Mon, 6 May 2019 09:11:30 -0400 Subject: [PATCH 17/51] create common watch actions component (#36056) --- .../watcher/public/components/index.ts | 11 +++++ .../public/components/watch_status.tsx | 44 +++++++++++++++++++ .../json_watch_edit/json_watch_edit_form.tsx | 3 +- .../json_watch_edit_simulate_results.tsx | 22 +++------- .../threshold_watch_edit.tsx | 3 +- .../watch_edit/components/watch_edit.tsx | 2 +- .../watch_list/components/watch_list.tsx | 25 ++--------- .../components/watch_action_status.tsx | 24 ---------- .../watch_status/components/watch_detail.tsx | 31 +++---------- .../watch_status/components/watch_history.tsx | 30 ++----------- 10 files changed, 75 insertions(+), 120 deletions(-) create mode 100644 x-pack/plugins/watcher/public/components/index.ts create mode 100644 x-pack/plugins/watcher/public/components/watch_status.tsx delete mode 100644 x-pack/plugins/watcher/public/sections/watch_status/components/watch_action_status.tsx diff --git a/x-pack/plugins/watcher/public/components/index.ts b/x-pack/plugins/watcher/public/components/index.ts new file mode 100644 index 00000000000000..e1226fc5c6c7da --- /dev/null +++ b/x-pack/plugins/watcher/public/components/index.ts @@ -0,0 +1,11 @@ +/* + * 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. + */ + +export { getPageErrorCode, PageError } from './page_error'; +export { ConfirmWatchesModal } from './confirm_watches_modal'; +export { DeleteWatchesModal } from './delete_watches_modal'; +export { ErrableFormRow } from './form_errors'; +export { WatchStatus } from './watch_status'; diff --git a/x-pack/plugins/watcher/public/components/watch_status.tsx b/x-pack/plugins/watcher/public/components/watch_status.tsx new file mode 100644 index 00000000000000..08370cd9f1574b --- /dev/null +++ b/x-pack/plugins/watcher/public/components/watch_status.tsx @@ -0,0 +1,44 @@ +/* + * 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 React from 'react'; +import { EuiIcon, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { ACTION_STATES, WATCH_STATES } from '../../common/constants'; + +function StatusIcon({ status }: { status: string }) { + switch (status) { + case WATCH_STATES.FIRING: + case ACTION_STATES.FIRING: + return ; + case WATCH_STATES.OK: + case ACTION_STATES.OK: + case ACTION_STATES.ACKNOWLEDGED: + return ; + case ACTION_STATES.THROTTLED: + return ; + case WATCH_STATES.DISABLED: + return ; + case WATCH_STATES.CONFIG_ERROR: + case WATCH_STATES.ERROR: + case ACTION_STATES.CONFIG_ERROR: + case ACTION_STATES.ERROR: + return ; + } + return null; +} + +export function WatchStatus({ status }: { status: string }) { + return ( + + + + + + {status} + + + ); +} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx index 488c541daa9345..654f19fbe0f9fa 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx @@ -18,8 +18,7 @@ import { EuiLink, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ConfirmWatchesModal } from '../../../../components/confirm_watches_modal'; -import { ErrableFormRow } from '../../../../components/form_errors'; +import { ConfirmWatchesModal, ErrableFormRow } from '../../../../components'; import { putWatchApiUrl } from '../../../../lib/documentation_links'; import { onWatchSave, saveWatch } from '../../watch_edit_actions'; import { WatchContext } from '../../watch_context'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx index a5a4bbc6e06a80..078a7b97a126a6 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx @@ -12,27 +12,18 @@ import { EuiFlyout, EuiFlyoutBody, EuiFlyoutHeader, - EuiHealth, EuiSpacer, EuiText, EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { WATCH_STATES } from '../../../../../common/constants'; import { ExecutedWatchDetails, ExecutedWatchResults, } from '../../../../../common/types/watch_types'; import { getTypeFromAction } from '../../watch_edit_actions'; import { WatchContext } from '../../watch_context'; - -const WATCH_ICON_COLORS = { - [WATCH_STATES.DISABLED]: 'subdued', - [WATCH_STATES.OK]: 'success', - [WATCH_STATES.FIRING]: 'warning', - [WATCH_STATES.ERROR]: 'danger', - [WATCH_STATES.CONFIG_ERROR]: 'danger', -}; +import { WatchStatus } from '../../../../components/watch_status'; export const JsonWatchEditSimulateResults = ({ executeResults, @@ -106,9 +97,7 @@ export const JsonWatchEditSimulateResults = ({ } ), dataType: 'string', - render: (actionState: string) => { - return {actionState}; - }, + render: (actionState: string) => , }, { field: 'actionReason', @@ -133,12 +122,11 @@ export const JsonWatchEditSimulateResults = ({

{i18n.translate('xpack.watcher.sections.watchEdit.simulateResults.title', { defaultMessage: 'Simulation results', - })}{' '} - - {executeResults.watchStatus.state} - + })}

+ + {actionsTableData && actionsTableData.length > 0 && ( diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index f85c53192b60f3..52c4a97f69718b 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -27,8 +27,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; -import { ConfirmWatchesModal } from '../../../../components/confirm_watches_modal'; -import { ErrableFormRow } from '../../../../components/form_errors'; +import { ConfirmWatchesModal, ErrableFormRow } from '../../../../components'; import { fetchFields, getMatchingIndices, loadIndexPatterns } from '../../../../lib/api'; import { aggTypes } from '../../../../models/watch/agg_types'; import { groupByTypes } from '../../../../models/watch/group_by_types'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx index 57370de0aefc4f..f3a9763b8e77f8 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -15,7 +15,7 @@ import { MANAGEMENT_BREADCRUMB } from 'ui/management'; import { Watch } from 'plugins/watcher/models/watch'; import { WATCH_TYPES } from '../../../../common/constants'; import { BaseWatch } from '../../../../common/types/watch_types'; -import { getPageErrorCode, PageError } from '../../../components/page_error'; +import { getPageErrorCode, PageError } from '../../../components'; import { loadWatch } from '../../../lib/api'; import { listBreadcrumb, editBreadcrumb, createBreadcrumb } from '../../../lib/breadcrumbs'; import { JsonWatchEdit } from './json_watch_edit'; diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 57debfda12971f..1e227110c9d355 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -11,7 +11,6 @@ import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, - EuiIcon, EuiInMemoryTable, EuiLink, EuiPageContent, @@ -26,20 +25,11 @@ import { Moment } from 'moment'; import chrome from 'ui/chrome'; import { MANAGEMENT_BREADCRUMB } from 'ui/management'; -import { REFRESH_INTERVALS, WATCH_STATES } from '../../../../common/constants'; -import { DeleteWatchesModal } from '../../../components/delete_watches_modal'; +import { REFRESH_INTERVALS } from '../../../../common/constants'; import { listBreadcrumb } from '../../../lib/breadcrumbs'; -import { getPageErrorCode, PageError } from '../../../components/page_error'; +import { getPageErrorCode, PageError, DeleteWatchesModal, WatchStatus } from '../../../components'; import { loadWatches } from '../../../lib/api'; -const stateToIcon: { [key: string]: JSX.Element } = { - [WATCH_STATES.OK]: , - [WATCH_STATES.DISABLED]: , - [WATCH_STATES.FIRING]: , - [WATCH_STATES.ERROR]: , - [WATCH_STATES.CONFIG_ERROR]: , -}; - const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { // hooks const [selection, setSelection] = useState([]); @@ -107,16 +97,7 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { defaultMessage: 'State', }), sortable: true, - render: (state: string) => { - return ( - - {stateToIcon[state]} - - {state} - - - ); - }, + render: (state: string) => , }, { field: 'watchStatus.comment', diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_action_status.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_action_status.tsx deleted file mode 100644 index 9c98069ffa3e26..00000000000000 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_action_status.tsx +++ /dev/null @@ -1,24 +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 { InjectedIntl, injectI18n } from '@kbn/i18n/react'; -import React from 'react'; -import { EuiIcon } from '@elastic/eui'; -import { WATCH_STATES } from '../../../../common/constants/watch_states'; - -const WatchActionStatusUi = ({ intl, watchState }: { intl: InjectedIntl; watchState: string }) => { - const stateToIcon: { [key: string]: JSX.Element } = { - [WATCH_STATES.OK]: , - [WATCH_STATES.DISABLED]: , - [WATCH_STATES.FIRING]: , - [WATCH_STATES.ERROR]: , - [WATCH_STATES.CONFIG_ERROR]: , - }; - - return
{stateToIcon[watchState]}
; -}; - -export const WatchActionStatus = injectI18n(WatchActionStatusUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index 18dd9fb65dbb59..accc26cd68d92a 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -6,21 +6,13 @@ import React, { Fragment } from 'react'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; +import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; -import { - EuiFlexGroup, - EuiFlexItem, - EuiInMemoryTable, - EuiSpacer, - EuiText, - EuiTitle, -} from '@elastic/eui'; +import { EuiInMemoryTable, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; import { loadWatchDetail } from '../../../lib/api'; -import { getPageErrorCode } from '../../../components/page_error'; -import { WatchActionStatus } from './watch_action_status'; +import { getPageErrorCode, WatchStatus } from '../../../components'; -const WatchDetailUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }) => { +const WatchDetailUi = ({ watchId }: { watchId: string }) => { const pagination = { initialPageSize: 10, pageSizeOptions: [10, 50, 100], @@ -45,18 +37,7 @@ const WatchDetailUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }), sortable: true, truncateText: true, - render: (state: string) => { - return ( - - - - - - {state} - - - ); - }, + render: (state: string) => , }, ]; @@ -93,7 +74,7 @@ const WatchDetailUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string { - return ( - - - - - - {state} - - - ); - }, + render: (state: string) => , }, { field: 'watchStatus.comment', @@ -220,18 +207,7 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }), sortable: true, truncateText: true, - render: (state: string) => { - return ( - - - - - - {state} - - - ); - }, + render: (state: string) => , }, ]; From 83d2ae717847b4ddde6543cb67108f7f89931246 Mon Sep 17 00:00:00 2001 From: Bill McConaghy Date: Mon, 6 May 2019 10:19:00 -0400 Subject: [PATCH 18/51] switching to LineAnnotation for threshold marking (#36024) * switching to LineAnnotation for threshold marking * setting y domain so threshold line always shows --- .../watch_visualization.tsx | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx index 9150749d15105f..a3e395016d6f37 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx @@ -7,14 +7,15 @@ import React, { Fragment, useContext, useEffect, useState } from 'react'; import '@elastic/charts/dist/style.css'; import { + AnnotationDomainTypes, Axis, - CustomSeriesColorsMap, DARK_THEME, - DataSeriesColorsValues, + getAnnotationId, getAxisId, getSpecId, Chart, LIGHT_THEME, + LineAnnotation, LineSeries, Position, ScaleType, @@ -123,6 +124,15 @@ const WatchVisualizationUi = () => { ); const timezone = getTimezone(); + const actualThreshold = getThreshold(watch); + let maxY = actualThreshold[actualThreshold.length - 1]; + (Object.values(watchVisualizationData) as number[][][]).forEach(data => { + data.forEach(([, y]) => { + if (y > maxY) { + maxY = y; + } + }); + }); const dateFormatter = (d: number) => { return moment(d) .tz(timezone) @@ -130,16 +140,6 @@ const WatchVisualizationUi = () => { }; const aggLabel = aggTypes[watch.aggType].text; - const getCustomColors = (specId: string) => { - const customSeriesColors: CustomSeriesColorsMap = new Map(); - const dataSeriesColorValues: DataSeriesColorsValues = { - colorValues: [], - specId: getSpecId(specId), - }; - customSeriesColors.set(dataSeriesColorValues, '#BD271E'); - return customSeriesColors; - }; - if (isLoading) { return ( @@ -175,7 +175,12 @@ const WatchVisualizationUi = () => { showOverlappingTicks={true} tickFormat={dateFormatter} /> - + {watchVisualizationDataKeys.map((key: string) => { return ( { /> ); })} - {getThreshold(watch).map((value: any, i: number) => { + {actualThreshold.map((value: any, i: number) => { const specId = i === 0 ? 'threshold' : `threshold${i}`; return ( - ); })} From 52bbb7b362e5d8fa6cf9335848fb56f428c548a4 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Mon, 6 May 2019 11:43:30 -0400 Subject: [PATCH 19/51] add support for acknowledging a watch (#36030) --- x-pack/plugins/watcher/public/lib/api.ts | 10 +++ .../watch_status/components/watch_detail.tsx | 84 +++++++++++++++++-- 2 files changed, 88 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index 9c9c81d77314fc..7edd09ed1acd9d 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -180,3 +180,13 @@ export const loadSettings = () => { }) => Settings.fromUpstreamJson(data), }); }; + +export const ackWatchAction = async (watchId: string, actionId: string) => { + const { + data: { watchStatus }, + } = await getHttpClient().put( + `${basePath}/watch/${watchId}/action/${actionId}/acknowledge`, + null + ); + return WatchStatus.fromUpstreamJson(watchStatus); +}; diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index accc26cd68d92a..2874cdf8a83b10 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -4,12 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment } from 'react'; +import React, { Fragment, useState, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; +import { toastNotifications } from 'ui/notify'; -import { EuiInMemoryTable, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; -import { loadWatchDetail } from '../../../lib/api'; +import { + EuiInMemoryTable, + EuiSpacer, + EuiText, + EuiTitle, + EuiButtonEmpty, + EuiToolTip, +} from '@elastic/eui'; +import { loadWatchDetail, ackWatchAction } from '../../../lib/api'; import { getPageErrorCode, WatchStatus } from '../../../components'; const WatchDetailUi = ({ watchId }: { watchId: string }) => { @@ -18,6 +26,20 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { pageSizeOptions: [10, 50, 100], }; + const { error, data: watchDetail, isLoading } = loadWatchDetail(watchId); + + const [actionStatuses, setActionStatuses] = useState([]); + const [isActionStatusLoading, setIsActionStatusLoading] = useState(false); + + useEffect( + () => { + if (watchDetail) { + setActionStatuses(watchDetail.watchStatus.actionStatuses); + } + }, + [watchDetail] + ); + const columns = [ { field: 'id', @@ -39,10 +61,60 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { truncateText: true, render: (state: string) => , }, + { + actions: [ + { + render: (action: any) => { + if (action.isAckable) { + return ( + + { + setIsActionStatusLoading(true); + try { + const watchStatus = await ackWatchAction(watchDetail.id, action.id); + setIsActionStatusLoading(false); + return setActionStatuses(watchStatus.actionStatuses); + } catch (e) { + setIsActionStatusLoading(false); + toastNotifications.addDanger( + i18n.translate( + 'xpack.watcher.sections.watchDetail.watchTable.ackActionErrorMessage', + { + defaultMessage: 'Error acknowledging action {actionId}', + values: { + actionId: action.id, + }, + } + ) + ); + } + }} + > + + + + ); + } + return ; + }, + }, + ], + }, ]; - const { error, data: watchDetail, isLoading } = loadWatchDetail(watchId); - // Another part of the UI will surface the error. if (getPageErrorCode(error)) { return null; @@ -74,7 +146,7 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { Date: Tue, 7 May 2019 20:34:14 -0400 Subject: [PATCH 20/51] add error callout on watch details page (#36139) --- .../watcher/common/constants/pagination.ts | 5 +- .../watch_list/components/watch_list.tsx | 9 +- .../watch_status/components/watch_detail.tsx | 216 ++++++++++++------ .../watch_status/components/watch_history.tsx | 8 +- .../server/models/action/jira_action.js | 11 +- 5 files changed, 165 insertions(+), 84 deletions(-) diff --git a/x-pack/plugins/watcher/common/constants/pagination.ts b/x-pack/plugins/watcher/common/constants/pagination.ts index 8ae9d769831c56..31df84ca60ec0d 100644 --- a/x-pack/plugins/watcher/common/constants/pagination.ts +++ b/x-pack/plugins/watcher/common/constants/pagination.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export const PAGINATION: { [key: string]: number } = { - PAGE_SIZE: 20, +export const PAGINATION: { initialPageSize: number; pageSizeOptions: number[] } = { + initialPageSize: 10, + pageSizeOptions: [10, 50, 100], }; diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 1e227110c9d355..631f56b03e46cc 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -25,7 +25,7 @@ import { Moment } from 'moment'; import chrome from 'ui/chrome'; import { MANAGEMENT_BREADCRUMB } from 'ui/management'; -import { REFRESH_INTERVALS } from '../../../../common/constants'; +import { REFRESH_INTERVALS, PAGINATION } from '../../../../common/constants'; import { listBreadcrumb } from '../../../lib/breadcrumbs'; import { getPageErrorCode, PageError, DeleteWatchesModal, WatchStatus } from '../../../components'; import { loadWatches } from '../../../lib/api'; @@ -160,11 +160,6 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { onSelectionChange: setSelection, }; - const pagination = { - initialPageSize: 10, - pageSizeOptions: [10, 50, 100], - }; - const searchConfig = { box: { incremental: true, @@ -277,7 +272,7 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { itemId="id" columns={columns} search={searchConfig} - pagination={pagination} + pagination={PAGINATION} sorting={true} selection={selectionConfig} isSelectable={true} diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index 2874cdf8a83b10..a8734c50eea674 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -12,35 +12,59 @@ import { toastNotifications } from 'ui/notify'; import { EuiInMemoryTable, EuiSpacer, - EuiText, EuiTitle, EuiButtonEmpty, EuiToolTip, + EuiCallOut, + EuiFlyout, + EuiFlyoutHeader, + EuiFlyoutBody, } from '@elastic/eui'; import { loadWatchDetail, ackWatchAction } from '../../../lib/api'; import { getPageErrorCode, WatchStatus } from '../../../components'; +import { PAGINATION } from '../../../../common/constants'; -const WatchDetailUi = ({ watchId }: { watchId: string }) => { - const pagination = { - initialPageSize: 10, - pageSizeOptions: [10, 50, 100], - }; +interface ActionError { + code: string; + message: string; +} +interface ActionStatus { + id: string; + isAckable: boolean; + state: string; + errors: ActionError[]; +} +const WatchDetailUi = ({ watchId }: { watchId: string }) => { const { error, data: watchDetail, isLoading } = loadWatchDetail(watchId); - const [actionStatuses, setActionStatuses] = useState([]); + const [actionStatuses, setActionStatuses] = useState([]); const [isActionStatusLoading, setIsActionStatusLoading] = useState(false); + const [selectedErrorAction, setSelectedErrorAction] = useState(null); + + const actionErrors = watchDetail && watchDetail.watchErrors.actionErrors; + const hasActionErrors = actionErrors && Object.keys(actionErrors).length > 0; + useEffect( () => { if (watchDetail) { - setActionStatuses(watchDetail.watchStatus.actionStatuses); + const currentActionStatuses = watchDetail.watchStatus.actionStatuses; + const actionStatusesWithErrors = + currentActionStatuses && + currentActionStatuses.map((currentActionStatus: ActionStatus) => { + return { + ...currentActionStatus, + errors: actionErrors ? actionErrors[currentActionStatus.id] : [], + }; + }); + setActionStatuses(actionStatusesWithErrors); } }, [watchDetail] ); - const columns = [ + const baseColumns = [ { field: 'id', name: i18n.translate('xpack.watcher.sections.watchDetail.watchTable.actionHeader', { @@ -48,9 +72,6 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { }), sortable: true, truncateText: true, - render: (action: string) => { - return {action}; - }, }, { field: 'state', @@ -61,59 +82,92 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { truncateText: true, render: (state: string) => , }, - { - actions: [ - { - render: (action: any) => { - if (action.isAckable) { - return ( - - { - setIsActionStatusLoading(true); - try { - const watchStatus = await ackWatchAction(watchDetail.id, action.id); - setIsActionStatusLoading(false); - return setActionStatuses(watchStatus.actionStatuses); - } catch (e) { - setIsActionStatusLoading(false); - toastNotifications.addDanger( - i18n.translate( - 'xpack.watcher.sections.watchDetail.watchTable.ackActionErrorMessage', - { - defaultMessage: 'Error acknowledging action {actionId}', - values: { - actionId: action.id, - }, - } - ) - ); + ]; + + const errorColumn = { + field: 'errors', + name: i18n.translate('xpack.watcher.sections.watchDetail.watchTable.errorsHeader', { + defaultMessage: 'Errors', + }), + render: (errors: ActionError[], action: ActionStatus) => { + if (errors && errors.length > 0) { + return ( + setSelectedErrorAction(action.id)}> + {i18n.translate('xpack.watcher.sections.watchDetail.watchTable.errorsCellText', { + defaultMessage: '{total, number} {total, plural, one {error} other {errors}}', + values: { + total: errors.length, + }, + })} + + ); + } + return ; + }, + }; + + const actionColumn = { + actions: [ + { + available: (action: ActionStatus) => action.isAckable, + render: (action: ActionStatus) => { + return ( + + { + setIsActionStatusLoading(true); + try { + const watchStatus = await ackWatchAction(watchDetail.id, action.id); + const newActionStatusesWithErrors = watchStatus.actionStatuses.map( + (newActionStatus: ActionStatus) => { + return { + ...newActionStatus, + errors: actionErrors ? actionErrors[newActionStatus.id] : [], + }; } - }} - > - - - - ); - } - return ; - }, + ); + setIsActionStatusLoading(false); + return setActionStatuses(newActionStatusesWithErrors); + } catch (e) { + setIsActionStatusLoading(false); + toastNotifications.addDanger( + i18n.translate( + 'xpack.watcher.sections.watchDetail.watchTable.ackActionErrorMessage', + { + defaultMessage: 'Error acknowledging action {actionId}', + values: { + actionId: action.id, + }, + } + ) + ); + } + }} + > + + + + ); }, - ], - }, - ]; + }, + ], + }; + + const columns = hasActionErrors + ? [...baseColumns, errorColumn, actionColumn] + : [...baseColumns, actionColumn]; // Another part of the UI will surface the error. if (getPageErrorCode(error)) { @@ -122,6 +176,40 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { return ( + {selectedErrorAction && ( + setSelectedErrorAction(null)} + > + + +

{selectedErrorAction}

+
+
+ + + {actionErrors[selectedErrorAction].length > 1 ? ( +
    + {actionErrors[selectedErrorAction].map( + (actionError: ActionError, errorIndex: number) => ( +
  • {actionError.message}
  • + ) + )} +
+ ) : ( +

{actionErrors[selectedErrorAction][0].message}

+ )} +
+
+
+ )}

{ items={actionStatuses} itemId="id" columns={columns} - pagination={pagination} + pagination={PAGINATION} sorting={true} loading={isLoading} message={ diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx index 4a365b2ebb1e5e..c1adf17d37ccad 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx @@ -26,6 +26,7 @@ import { EuiTitle, } from '@elastic/eui'; +import { PAGINATION } from '../../../../common/constants'; import { goToWatchList } from '../../../lib/navigation'; import { getPageErrorCode, PageError, WatchStatus, DeleteWatchesModal } from '../../../components'; import { @@ -109,11 +110,6 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string return ; } - const pagination = { - initialPageSize: 10, - pageSizeOptions: [10, 50, 100], - }; - const columns = [ { field: 'startTime', @@ -347,7 +343,7 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string Date: Tue, 7 May 2019 22:20:17 -0400 Subject: [PATCH 21/51] add support for system watch (#36110) --- .../components/monitoring_watch_edit/index.ts | 7 ++ .../monitoring_watch_edit.tsx | 68 +++++++++++++++++++ .../watch_edit/components/watch_edit.tsx | 15 ++-- .../watch_list/components/watch_list.tsx | 10 ++- .../watch_status/components/watch_detail.tsx | 44 +++++++++--- .../watch_status/components/watch_history.tsx | 42 +++++++----- 6 files changed, 153 insertions(+), 33 deletions(-) create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/index.ts create mode 100644 x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/index.ts b/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/index.ts new file mode 100644 index 00000000000000..e984da0d2cd115 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/index.ts @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export { MonitoringWatchEdit } from './monitoring_watch_edit'; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx new file mode 100644 index 00000000000000..1a42ffa8b22189 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx @@ -0,0 +1,68 @@ +/* + * 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 React, { useContext } from 'react'; + +import { + EuiFlexGroup, + EuiFlexItem, + EuiPageContent, + EuiSpacer, + EuiTitle, + EuiCallOut, + EuiText, + EuiLink, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { injectI18n, FormattedMessage } from '@kbn/i18n/react'; +import { WatchContext } from '../../watch_context'; + +const MonitoringWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { + const { watch } = useContext(WatchContext); + + return ( + + + + +

{pageTitle}

+
+
+
+ + + +

+ + + + ), + }} + /> +

+
+
+
+ ); +}; + +export const MonitoringWatchEdit = injectI18n(MonitoringWatchEditUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx index f3a9763b8e77f8..3d64f2fede225c 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -20,6 +20,7 @@ import { loadWatch } from '../../../lib/api'; import { listBreadcrumb, editBreadcrumb, createBreadcrumb } from '../../../lib/breadcrumbs'; import { JsonWatchEdit } from './json_watch_edit'; import { ThresholdWatchEdit } from './threshold_watch_edit'; +import { MonitoringWatchEdit } from './monitoring_watch_edit'; import { WatchContext } from '../watch_context'; const getTitle = (watch: BaseWatch) => { @@ -153,10 +154,16 @@ export const WatchEdit = ({ let EditComponent = null; - if (watch.type === WATCH_TYPES.THRESHOLD) { - EditComponent = ThresholdWatchEdit; - } else { - EditComponent = JsonWatchEdit; + switch (watch.type) { + case WATCH_TYPES.THRESHOLD: + EditComponent = ThresholdWatchEdit; + break; + case WATCH_TYPES.MONITORING: + EditComponent = MonitoringWatchEdit; + break; + case WATCH_TYPES.JSON: + default: + EditComponent = JsonWatchEdit; } return ( diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 631f56b03e46cc..c58d9b40c527bc 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -133,11 +133,10 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { actions: [ { render: (watch: any) => { - const disabled = watch.isSystemWatch; return ( { const selectionConfig = { onSelectionChange: setSelection, + selectable: (watch: any) => !watch.isSystemWatch, + selectableMessage: (selectable: boolean) => + !selectable + ? i18n.translate('xpack.watcher.sections.watchList.watchTable.disabledWatchTooltipText', { + defaultMessage: 'This watch is read-only', + }) + : undefined, }; const searchConfig = { diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index a8734c50eea674..d25f72a1fc9749 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -14,11 +14,14 @@ import { EuiSpacer, EuiTitle, EuiButtonEmpty, + EuiBadge, EuiToolTip, EuiCallOut, EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, + EuiFlexGroup, + EuiFlexItem, } from '@elastic/eui'; import { loadWatchDetail, ackWatchAction } from '../../../lib/api'; import { getPageErrorCode, WatchStatus } from '../../../components'; @@ -210,15 +213,38 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { )} - -

- -

-
+ + + +

+ +

+
+
+ {watchDetail && watchDetail.isSystemWatch && ( + + + } + > + + + + + + )} +
diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx index c1adf17d37ccad..0775a12fefed1a 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx @@ -316,24 +316,30 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string )} /> - - toggleWatchActivation()}>{activationButtonText} - - - { - setWatchesToDelete([watchId]); - }} - color="danger" - disabled={false} - > - - - + {loadedWatch && !loadedWatch.isSystemWatch && ( + + + toggleWatchActivation()}> + {activationButtonText} + + + + { + setWatchesToDelete([watchId]); + }} + color="danger" + disabled={false} + > + + + + + )} From 742e282ce873f7fb1815ebb4e4e9f3224836c42b Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 9 May 2019 15:33:13 -0400 Subject: [PATCH 22/51] upgrade @elastic/charts library (#36357) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7fffad48ce437c..8035a020720b2f 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "@babel/core": "^7.3.4", "@babel/polyfill": "^7.2.5", "@babel/register": "^7.0.0", - "@elastic/charts": "^3.11.2", + "@elastic/charts": "^4.2.0", "@elastic/datemath": "5.0.2", "@elastic/eui": "10.4.0", "@elastic/filesaver": "1.1.2", diff --git a/yarn.lock b/yarn.lock index 2eb838c997408e..d5b919ddcf5980 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1325,10 +1325,10 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" -"@elastic/charts@^3.11.2": - version "3.11.4" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-3.11.4.tgz#174004301cf30cff495f9f10aea5dca9441d677b" - integrity sha512-9wwMO31M/oD50xDs+m7KIW773h0+Ydq2figtnJ9YRQ1V3S/Yr7OVwUWXYIEGKa3ZbaxEMMc8n8uMvPvPwtjOFg== +"@elastic/charts@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-4.2.0.tgz#923ae2e3e1276bb7dbd62ec5b3a7f0190026370e" + integrity sha512-eFdR1SrqB73KEe5zuVHfMeJ0Ef9gpR08pHJbN42XFqhNrLkrxO2CJFNhIyP6BW0Qf2k2ncXhayC2oZ58f7pPaA== dependencies: "@types/d3-shape" "^1.3.1" "@types/luxon" "^1.11.1" From 0e04d0ed6b2c402a34a34f67ce138923ba1d9b82 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 10 May 2019 08:40:20 -0400 Subject: [PATCH 23/51] improve error and loading states (#36356) --- .../watcher/public/components/index.ts | 2 + .../public/components/section_error.tsx | 43 +++ .../public/components/section_loading.tsx | 22 ++ x-pack/plugins/watcher/public/lib/api.ts | 39 +-- .../json_watch_edit_simulate.tsx | 147 ++++----- .../json_watch_edit_simulate_results.tsx | 72 ++++- .../threshold_watch_action_accordion.tsx | 62 ++-- .../watch_edit/components/watch_edit.tsx | 14 +- .../watch_status/components/watch_detail.tsx | 62 ++-- .../watch_status/components/watch_history.tsx | 297 ++++++++++-------- .../watch_status/watch_details_context.ts | 8 + .../sections/watch_status/watch_status.tsx | 51 ++- 12 files changed, 527 insertions(+), 292 deletions(-) create mode 100644 x-pack/plugins/watcher/public/components/section_error.tsx create mode 100644 x-pack/plugins/watcher/public/components/section_loading.tsx create mode 100644 x-pack/plugins/watcher/public/sections/watch_status/watch_details_context.ts diff --git a/x-pack/plugins/watcher/public/components/index.ts b/x-pack/plugins/watcher/public/components/index.ts index e1226fc5c6c7da..8217950a7597f3 100644 --- a/x-pack/plugins/watcher/public/components/index.ts +++ b/x-pack/plugins/watcher/public/components/index.ts @@ -9,3 +9,5 @@ export { ConfirmWatchesModal } from './confirm_watches_modal'; export { DeleteWatchesModal } from './delete_watches_modal'; export { ErrableFormRow } from './form_errors'; export { WatchStatus } from './watch_status'; +export { SectionLoading } from './section_loading'; +export { SectionError } from './section_error'; diff --git a/x-pack/plugins/watcher/public/components/section_error.tsx b/x-pack/plugins/watcher/public/components/section_error.tsx new file mode 100644 index 00000000000000..c375b0657a30fb --- /dev/null +++ b/x-pack/plugins/watcher/public/components/section_error.tsx @@ -0,0 +1,43 @@ +/* + * 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 { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import React, { Fragment } from 'react'; + +interface Props { + title: React.ReactNode; + error: { + data: { + error: string; + cause?: string[]; + message?: string; + }; + }; +} + +export const SectionError: React.FunctionComponent = ({ title, error }) => { + const { + error: errorString, + cause, // wrapEsError() on the server adds a "cause" array + message, + } = error.data; + + return ( + +
{message || errorString}
+ {cause && ( + + +
    + {cause.map((causeMsg, i) => ( +
  • {causeMsg}
  • + ))} +
+
+ )} +
+ ); +}; diff --git a/x-pack/plugins/watcher/public/components/section_loading.tsx b/x-pack/plugins/watcher/public/components/section_loading.tsx new file mode 100644 index 00000000000000..0faf97f8ebb0bd --- /dev/null +++ b/x-pack/plugins/watcher/public/components/section_loading.tsx @@ -0,0 +1,22 @@ +/* + * 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 React from 'react'; + +import { EuiEmptyPrompt, EuiLoadingSpinner, EuiText } from '@elastic/eui'; + +interface Props { + children: React.ReactNode; +} + +export const SectionLoading: React.FunctionComponent = ({ children }) => { + return ( + } + body={{children}} + /> + ); +}; diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index 7edd09ed1acd9d..79673b09b5e767 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -12,7 +12,7 @@ import { __await } from 'tslib'; import chrome from 'ui/chrome'; import { ROUTES } from '../../common/constants'; import { BaseWatch, ExecutedWatchDetails } from '../../common/types/watch_types'; -import { useRequest } from './use_request'; +import { useRequest, sendRequest } from './use_request'; let httpClient: ng.IHttpService; @@ -89,27 +89,17 @@ export const deleteWatches = async (watchIds: string[]) => { }; export const deactivateWatch = async (id: string) => { - const { - data: { watchStatus }, - } = await getHttpClient().put(`${basePath}/watch/${id}/deactivate`, null); - return WatchStatus.fromUpstreamJson(watchStatus); + return sendRequest({ + path: `${basePath}/watch/${id}/deactivate`, + method: 'put', + }); }; export const activateWatch = async (id: string) => { - const { - data: { watchStatus }, - } = await getHttpClient().put(`${basePath}/watch/${id}/activate`, null); - return WatchStatus.fromUpstreamJson(watchStatus); -}; - -export const fetchWatch = async (watchId: string) => { - const body = { - watchId, - }; - const { - data: { results }, - } = await getHttpClient().post(`${basePath}/watches/`, body); - return results; + return sendRequest({ + path: `${basePath}/watch/${id}/activate`, + method: 'put', + }); }; export const loadWatch = async (id: string) => { @@ -143,11 +133,14 @@ export const createWatch = async (watch: BaseWatch) => { }; export const executeWatch = async (executeWatchDetails: ExecutedWatchDetails, watch: BaseWatch) => { - const { data } = await getHttpClient().put(`${basePath}/watch/execute`, { - executeDetails: executeWatchDetails.upstreamJson, - watch: watch.upstreamJson, + return sendRequest({ + path: `${basePath}/watch/execute`, + method: 'put', + body: { + executeDetails: executeWatchDetails.upstreamJson, + watch: watch.upstreamJson, + }, }); - return data; }; export const loadIndexPatterns = async () => { diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx index 7d6c917efc8c1c..112c8829cf7846 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx @@ -26,7 +26,6 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { ExecuteDetails } from 'plugins/watcher/models/execute_details/execute_details'; import { WatchHistoryItem } from 'plugins/watcher/models/watch_history_item'; -import { toastNotifications } from 'ui/notify'; import { ACTION_MODES, TIME_UNITS } from '../../../../../common/constants'; import { ExecutedWatchDetails, @@ -39,6 +38,37 @@ import { WatchContext } from '../../watch_context'; import { timeUnits } from '../../time_units'; import { JsonWatchEditSimulateResults } from './json_watch_edit_simulate_results'; +const actionModeOptions = Object.keys(ACTION_MODES).map(mode => ({ + text: ACTION_MODES[mode], + value: ACTION_MODES[mode], +})); + +const scheduledTimeUnitOptions = [ + { + value: TIME_UNITS.SECOND, + text: timeUnits[TIME_UNITS.SECOND].labelPlural, + }, + { + value: TIME_UNITS.MINUTE, + text: timeUnits[TIME_UNITS.MINUTE].labelPlural, + }, + { + value: TIME_UNITS.HOUR, + text: timeUnits[TIME_UNITS.HOUR].labelPlural, + }, +]; + +const triggeredTimeUnitOptions = [ + { + value: TIME_UNITS.MILLISECOND, + text: timeUnits[TIME_UNITS.MILLISECOND].labelPlural, + }, + { + value: TIME_UNITS.SECOND, + text: timeUnits[TIME_UNITS.SECOND].labelPlural, + }, +]; + export const JsonWatchEditSimulate = ({ executeWatchErrors, hasExecuteWatchErrors, @@ -57,11 +87,25 @@ export const JsonWatchEditSimulate = ({ }>; }) => { const { watch } = useContext(WatchContext); + // hooks const [executeResults, setExecuteResults] = useState(null); + const [isExecuting, setIsExecuting] = useState(false); + const [executeResultsError, setExecuteResultsError] = useState(null); + const { errors: watchErrors } = watch.validate(); const hasWatchJsonError = watchErrors.json.length >= 1; + const { + actionModes, + scheduledTimeValue, + scheduledTimeUnit, + triggeredTimeValue, + triggeredTimeUnit, + alternativeInput, + ignoreCondition, + } = executeDetails; + const columns = [ { field: 'actionId', @@ -85,34 +129,13 @@ export const JsonWatchEditSimulate = ({ }), render: ({}, row: { actionId: string }) => ( { setExecuteDetails( new ExecuteDetails({ ...executeDetails, - actionModes: { ...executeDetails.actionModes, [row.actionId]: e.target.value }, + actionModes: { ...actionModes, [row.actionId]: e.target.value }, }) ); }} @@ -129,13 +152,15 @@ export const JsonWatchEditSimulate = ({ return ( - {executeResults && ( - setExecuteResults(null)} - /> - )} + { + setExecuteResults(null); + setExecuteResultsError(null); + }} + />

{i18n.translate('xpack.watcher.sections.watchEdit.simulate.pageDescription', { @@ -174,7 +199,7 @@ export const JsonWatchEditSimulate = ({ { const value = e.target.value; @@ -189,21 +214,8 @@ export const JsonWatchEditSimulate = ({ { setExecuteDetails( new ExecuteDetails({ @@ -227,7 +239,7 @@ export const JsonWatchEditSimulate = ({ { const value = e.target.value; @@ -242,17 +254,8 @@ export const JsonWatchEditSimulate = ({ { setExecuteDetails( new ExecuteDetails({ @@ -310,7 +313,7 @@ export const JsonWatchEditSimulate = ({ defaultMessage: 'Code editor', } )} - value={executeDetails.alternativeInput} + value={alternativeInput} onChange={(json: string) => { setExecuteDetails( new ExecuteDetails({ @@ -347,7 +350,7 @@ export const JsonWatchEditSimulate = ({ defaultMessage: 'Ignore condition', } )} - checked={executeDetails.ignoreCondition} + checked={ignoreCondition} onChange={e => { setExecuteDetails( new ExecuteDetails({ ...executeDetails, ignoreCondition: e.target.checked }) @@ -406,17 +409,21 @@ export const JsonWatchEditSimulate = ({ iconType="play" fill type="submit" + isLoading={isExecuting} isDisabled={hasExecuteWatchErrors || hasWatchJsonError} onClick={async () => { - try { - const executedWatch = await executeWatch(executeDetails, watch); - const formattedResults = WatchHistoryItem.fromUpstreamJson( - executedWatch.watchHistoryItem - ); - setExecuteResults(formattedResults); - } catch (e) { - return toastNotifications.addDanger(e.data.message); + setIsExecuting(true); + + const { data, error } = await executeWatch(executeDetails, watch); + + setIsExecuting(false); + + if (error) { + return setExecuteResultsError(error); } + + const formattedResults = WatchHistoryItem.fromUpstreamJson(data.watchHistoryItem); + setExecuteResults(formattedResults); }} > {i18n.translate('xpack.watcher.sections.watchEdit.simulate.form.saveButtonLabel', { diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx index 078a7b97a126a6..5cfc61b2f9aee1 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx @@ -17,30 +17,35 @@ import { EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; import { ExecutedWatchDetails, ExecutedWatchResults, } from '../../../../../common/types/watch_types'; import { getTypeFromAction } from '../../watch_edit_actions'; import { WatchContext } from '../../watch_context'; -import { WatchStatus } from '../../../../components/watch_status'; +import { WatchStatus, SectionError } from '../../../../components'; export const JsonWatchEditSimulateResults = ({ executeResults, executeDetails, onCloseFlyout, + error, }: { - executeResults: ExecutedWatchResults; + executeResults: ExecutedWatchResults | null; executeDetails: ExecutedWatchDetails; onCloseFlyout: () => void; + error: any; }) => { const { watch } = useContext(WatchContext); + const { actionModes } = executeDetails; + const getTableData = () => { - const actionStatuses = executeResults.watchStatus && executeResults.watchStatus.actionStatuses; - const actionModes = executeDetails.actionModes; const actions = watch.watch && watch.watch.actions; - if (actions) { + if (executeResults && actions) { + const actionStatuses = + executeResults.watchStatus && executeResults.watchStatus.actionStatuses; return Object.keys(actions).map(actionKey => { const actionStatus = actionStatuses.find(status => status.id === actionKey); return { @@ -110,6 +115,49 @@ export const JsonWatchEditSimulateResults = ({ }, ]; + const flyoutTitle = ( + +

+ {i18n.translate('xpack.watcher.sections.watchEdit.simulateResults.title', { + defaultMessage: 'Simulation results', + })} +

+ + ); + + if (error) { + return ( + { + onCloseFlyout(); + }} + aria-labelledby="simulateResultsFlyOutTitle" + > + {flyoutTitle} + + + } + error={error} + /> + + + ); + } + + if (!executeResults) { + return null; + } + + const { + watchStatus: { state }, + details, + } = executeResults; + return ( { @@ -118,15 +166,9 @@ export const JsonWatchEditSimulateResults = ({ aria-labelledby="simulateResultsFlyOutTitle" > - -

- {i18n.translate('xpack.watcher.sections.watchEdit.simulateResults.title', { - defaultMessage: 'Simulation results', - })} -

-
+ {flyoutTitle} - +
{actionsTableData && actionsTableData.length > 0 && ( @@ -157,9 +199,7 @@ export const JsonWatchEditSimulateResults = ({

- - {JSON.stringify(executeResults.details, null, 2)} - + {JSON.stringify(details, null, 2)}
); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx index 0aebf7200847fa..8bab0ab2c5d9a7 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.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, useContext } from 'react'; +import React, { Fragment, useContext, useState } from 'react'; import { EuiAccordion, @@ -40,6 +40,7 @@ import { } from './action_fields'; import { executeWatch } from '../../../../lib/api'; import { watchActionsConfigurationMap } from '../../../../lib/documentation_links'; +import { SectionError } from '../../../../components'; const actionFieldsComponentMap = { [ACTION_TYPES.LOGGING]: LoggingActionFields, @@ -73,6 +74,9 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ const { watch, setWatchProperty } = useContext(WatchContext); const { actions } = watch; + const [isExecuting, setIsExecuting] = useState(false); + const [executeResultsError, setExecuteResultsError] = useState(null); + if (actions && actions.length >= 1) { return actions.map((action: any) => { const FieldsComponent = actionFieldsComponentMap[action.type]; @@ -119,6 +123,20 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ } paddingSize="l" > + {executeResultsError && ( + + + } + error={executeResultsError} + /> + + + )} = ({ { const selectedWatchAction = watch.actions.filter( (watchAction: any) => watchAction.id === action.id ); + const executeDetails = new ExecuteDetails({ ignoreCondition: true, recordExecution: false, @@ -191,28 +211,34 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ [action.id]: ACTION_MODES.FORCE_EXECUTE, }, }); + const newExecuteWatch = new ThresholdWatch({ ...watch, actions: selectedWatchAction, }); - try { - const executedWatch = await executeWatch(executeDetails, newExecuteWatch); - const executeResults = WatchHistoryItem.fromUpstreamJson( - executedWatch.watchHistoryItem - ); - const actionStatuses = executeResults.watchStatus.actionStatuses; - const actionStatus = actionStatuses.find( - (actionItem: ActionType) => actionItem.id === action.id - ); - - if (actionStatus.lastExecutionSuccessful === false) { - const message = actionStatus.lastExecutionReason || action.simulateFailMessage; - return toastNotifications.addDanger(message); - } - toastNotifications.addSuccess(action.simulateMessage); - } catch (e) { - toastNotifications.addDanger(e.data.message); + + setIsExecuting(true); + setExecuteResultsError(null); + + const { data, error } = await executeWatch(executeDetails, newExecuteWatch); + + setIsExecuting(false); + + if (error) { + return setExecuteResultsError(error); + } + + const formattedResults = WatchHistoryItem.fromUpstreamJson(data.watchHistoryItem); + const actionStatuses = formattedResults.watchStatus.actionStatuses; + const actionStatus = actionStatuses.find( + (actionItem: ActionType) => actionItem.id === action.id + ); + + if (actionStatus.lastExecutionSuccessful === false) { + const message = actionStatus.lastExecutionReason || action.simulateFailMessage; + return toastNotifications.addDanger(message); } + return toastNotifications.addSuccess(action.simulateMessage); }} > {action.simulatePrompt} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx index 3d64f2fede225c..402cce4a8e6a61 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -7,15 +7,16 @@ import React, { useEffect, useReducer } from 'react'; import { isEqual } from 'lodash'; -import { EuiLoadingSpinner, EuiPageContent } from '@elastic/eui'; +import { EuiPageContent } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import chrome from 'ui/chrome'; import { MANAGEMENT_BREADCRUMB } from 'ui/management'; import { Watch } from 'plugins/watcher/models/watch'; +import { FormattedMessage } from '@kbn/i18n/react'; import { WATCH_TYPES } from '../../../../common/constants'; import { BaseWatch } from '../../../../common/types/watch_types'; -import { getPageErrorCode, PageError } from '../../../components'; +import { getPageErrorCode, PageError, SectionLoading } from '../../../components'; import { loadWatch } from '../../../lib/api'; import { listBreadcrumb, editBreadcrumb, createBreadcrumb } from '../../../lib/breadcrumbs'; import { JsonWatchEdit } from './json_watch_edit'; @@ -147,7 +148,14 @@ export const WatchEdit = ({ } if (!watch) { - return ; + return ( + + + + ); } const pageTitle = getTitle(watch); diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index d25f72a1fc9749..b2c98b66d8316b 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment, useState, useEffect } from 'react'; +import React, { Fragment, useState, useEffect, useContext } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; import { toastNotifications } from 'ui/notify'; @@ -23,9 +23,10 @@ import { EuiFlexGroup, EuiFlexItem, } from '@elastic/eui'; -import { loadWatchDetail, ackWatchAction } from '../../../lib/api'; -import { getPageErrorCode, WatchStatus } from '../../../components'; +import { ackWatchAction } from '../../../lib/api'; +import { WatchStatus } from '../../../components'; import { PAGINATION } from '../../../../common/constants'; +import { WatchDetailsContext } from '../watch_details_context'; interface ActionError { code: string; @@ -38,31 +39,35 @@ interface ActionStatus { errors: ActionError[]; } -const WatchDetailUi = ({ watchId }: { watchId: string }) => { - const { error, data: watchDetail, isLoading } = loadWatchDetail(watchId); +const WatchDetailUi = () => { + const { watchDetail } = useContext(WatchDetailsContext); const [actionStatuses, setActionStatuses] = useState([]); const [isActionStatusLoading, setIsActionStatusLoading] = useState(false); const [selectedErrorAction, setSelectedErrorAction] = useState(null); - const actionErrors = watchDetail && watchDetail.watchErrors.actionErrors; + const { + isSystemWatch, + id: watchId, + watchErrors: { actionErrors }, + watchStatus: { actionStatuses: currentActionStatuses }, + } = watchDetail; + const hasActionErrors = actionErrors && Object.keys(actionErrors).length > 0; useEffect( () => { - if (watchDetail) { - const currentActionStatuses = watchDetail.watchStatus.actionStatuses; - const actionStatusesWithErrors = - currentActionStatuses && - currentActionStatuses.map((currentActionStatus: ActionStatus) => { - return { - ...currentActionStatus, - errors: actionErrors ? actionErrors[currentActionStatus.id] : [], - }; - }); - setActionStatuses(actionStatusesWithErrors); - } + const actionStatusesWithErrors = + currentActionStatuses && + currentActionStatuses.map((currentActionStatus: ActionStatus) => { + const errors = actionErrors && actionErrors[currentActionStatus.id]; + return { + ...currentActionStatus, + errors: errors || [], + }; + }); + setActionStatuses(actionStatusesWithErrors); }, [watchDetail] ); @@ -71,7 +76,7 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { { field: 'id', name: i18n.translate('xpack.watcher.sections.watchDetail.watchTable.actionHeader', { - defaultMessage: 'Action', + defaultMessage: 'Name', }), sortable: true, truncateText: true, @@ -93,9 +98,10 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { defaultMessage: 'Errors', }), render: (errors: ActionError[], action: ActionStatus) => { + const { id: actionId } = action; if (errors && errors.length > 0) { return ( - setSelectedErrorAction(action.id)}> + setSelectedErrorAction(actionId)}> {i18n.translate('xpack.watcher.sections.watchDetail.watchTable.errorsCellText', { defaultMessage: '{total, number} {total, plural, one {error} other {errors}}', values: { @@ -114,6 +120,7 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { { available: (action: ActionStatus) => action.isAckable, render: (action: ActionStatus) => { + const { id: actionId } = action; return ( { onClick={async () => { setIsActionStatusLoading(true); try { - const watchStatus = await ackWatchAction(watchDetail.id, action.id); + const watchStatus = await ackWatchAction(watchId, actionId); const newActionStatusesWithErrors = watchStatus.actionStatuses.map( (newActionStatus: ActionStatus) => { + const errors = actionErrors && actionErrors[newActionStatus.id]; return { ...newActionStatus, - errors: actionErrors ? actionErrors[newActionStatus.id] : [], + errors: errors || [], }; } ); @@ -172,11 +180,6 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { ? [...baseColumns, errorColumn, actionColumn] : [...baseColumns, actionColumn]; - // Another part of the UI will surface the error. - if (getPageErrorCode(error)) { - return null; - } - return ( {selectedErrorAction && ( @@ -225,7 +228,7 @@ const WatchDetailUi = ({ watchId }: { watchId: string }) => { - {watchDetail && watchDetail.isSystemWatch && ( + {isSystemWatch && ( { columns={columns} pagination={PAGINATION} sorting={true} - loading={isLoading} message={ } /> diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx index 0775a12fefed1a..4cab6f868846e2 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment, useState } from 'react'; +import React, { Fragment, useState, useContext } from 'react'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; +import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; import { Moment } from 'moment'; import { toastNotifications } from 'ui/notify'; @@ -22,20 +22,19 @@ import { EuiLink, EuiSelect, EuiSpacer, - EuiText, EuiTitle, } from '@elastic/eui'; import { PAGINATION } from '../../../../common/constants'; import { goToWatchList } from '../../../lib/navigation'; -import { getPageErrorCode, PageError, WatchStatus, DeleteWatchesModal } from '../../../components'; +import { WatchStatus, DeleteWatchesModal, SectionError } from '../../../components'; import { activateWatch, deactivateWatch, - loadWatchDetail, loadWatchHistory, loadWatchHistoryDetail, } from '../../../lib/api'; +import { WatchDetailsContext } from '../watch_details_context'; const watchHistoryTimeSpanOptions = [ { @@ -76,24 +75,25 @@ const watchHistoryTimeSpanOptions = [ }, ]; -const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }) => { +const WatchHistoryUi = () => { + const { watchDetail: loadedWatch } = useContext(WatchDetailsContext); + const [isActivated, setIsActivated] = useState(undefined); const [detailWatchId, setDetailWatchId] = useState(undefined); const [watchesToDelete, setWatchesToDelete] = useState([]); + const [isTogglingActivation, setIsTogglingActivation] = useState(false); const [watchHistoryTimeSpan, setWatchHistoryTimeSpan] = useState( watchHistoryTimeSpanOptions[0].value ); - const { error: watchDetailError, data: loadedWatch } = loadWatchDetail(watchId); - - if (loadedWatch && isActivated === undefined) { + if (isActivated === undefined) { // Set initial value for isActivated based on the watch we just loaded. setIsActivated(loadedWatch.watchStatus.isActive); } const { error: historyError, data: history, isLoading } = loadWatchHistory( - watchId, + loadedWatch.id, watchHistoryTimeSpan ); @@ -105,15 +105,38 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string ? JSON.stringify(watchHistoryDetails.details, null, 2) : ''; - const errorCode = getPageErrorCode([watchDetailError, historyError, watchHistoryDetailsError]); - if (errorCode) { - return ; - } + const historySectionTitle = ( + +

+ +

+
+ ); + if (historyError) { + return ( + + {historySectionTitle} + + + } + error={historyError} + /> + + ); + } const columns = [ { field: 'startTime', - name: i18n.translate('xpack.watcher.sections.watchList.watchTable.startTimeHeader', { + name: i18n.translate('xpack.watcher.sections.watchHistory.watchTable.startTimeHeader', { defaultMessage: 'Trigger time', }), sortable: true, @@ -147,9 +170,6 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }), sortable: true, truncateText: true, - render: (comment: string) => { - return {comment}; - }, }, ]; @@ -159,112 +179,145 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string }; const toggleWatchActivation = async () => { - try { - if (isActivated) { - await deactivateWatch(watchId); - } else { - await activateWatch(watchId); - } + const toggleActivation = isActivated ? deactivateWatch : activateWatch; + + setIsTogglingActivation(true); + + const { error } = await toggleActivation(loadedWatch.id); - setIsActivated(!isActivated); - } catch (e) { - if (e.data.statusCode !== 200) { - toastNotifications.addDanger( - i18n.translate( - 'xpack.watcher.sections.watchList.deactivateWatchErrorNotification.descriptionText', + setIsTogglingActivation(false); + + if (error) { + const message = isActivated + ? i18n.translate( + 'xpack.watcher.sections.watchList.toggleActivatationErrorNotification.deactivateDescriptionText', { defaultMessage: "Couldn't deactivate watch", } ) - ); - } + : i18n.translate( + 'xpack.watcher.sections.watchList.toggleActivatationErrorNotification.activateDescriptionText', + { + defaultMessage: "Couldn't activate watch", + } + ); + return toastNotifications.addDanger(message); } + + setIsActivated(!isActivated); }; let flyout; - if (detailWatchId !== undefined && watchHistoryDetails !== undefined) { - const detailColumns = [ - { - field: 'id', - name: i18n.translate('xpack.watcher.sections.watchHistory.watchActionStatusTable.id', { - defaultMessage: 'Name', - }), - sortable: true, - truncateText: true, - render: (id: string) => { - return {id}; - }, - }, - { - field: 'state', - name: i18n.translate('xpack.watcher.sections.watchHistory.watchActionStatusTable.state', { - defaultMessage: 'State', - }), - sortable: true, - truncateText: true, - render: (state: string) => , - }, - ]; - - flyout = ( - setDetailWatchId(undefined)} - aria-labelledby="indexDetailsFlyoutTitle" - maxWidth={600} - > - - -

- -

-
-
- - - -

- -

-
- - - } - /> - - + if (detailWatchId !== undefined) { + if (watchHistoryDetailsError) { + flyout = ( + setDetailWatchId(undefined)} + aria-labelledby="watchHistoryErrorDetailsFlyoutTitle" + maxWidth={600} + > + + +

+ +

+
+
- -

- -

-
+ + + } + error={watchHistoryDetailsError} + /> + +
+ ); + } + if (watchHistoryDetails !== undefined) { + const detailColumns = [ + { + field: 'id', + name: i18n.translate('xpack.watcher.sections.watchHistory.watchActionStatusTable.id', { + defaultMessage: 'Name', + }), + sortable: true, + truncateText: true, + }, + { + field: 'state', + name: i18n.translate('xpack.watcher.sections.watchHistory.watchActionStatusTable.state', { + defaultMessage: 'State', + }), + sortable: true, + truncateText: true, + render: (state: string) => , + }, + ]; - + flyout = ( + setDetailWatchId(undefined)} + aria-labelledby="watchHistoryDetailsFlyoutTitle" + maxWidth={600} + > + + +

+ +

+
+
- {executionDetail} -
-
- ); + + +

+ +

+
+ + } + /> + + +

+ +

+
+ + {executionDetail}} +
+ + ); + } } const activationButtonText = isActivated ? ( @@ -291,16 +344,7 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string watchesToDelete={watchesToDelete} /> - - -

- -

-
-
+ {historySectionTitle} @@ -316,10 +360,13 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string )} /> - {loadedWatch && !loadedWatch.isSystemWatch && ( + {!loadedWatch.isSystemWatch && ( - toggleWatchActivation()}> + toggleWatchActivation()} + isLoading={isTogglingActivation} + > {activationButtonText} @@ -327,7 +374,7 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string { - setWatchesToDelete([watchId]); + setWatchesToDelete([loadedWatch.id]); }} color="danger" disabled={false} @@ -355,7 +402,7 @@ const WatchHistoryUi = ({ intl, watchId }: { intl: InjectedIntl; watchId: string message={ } /> diff --git a/x-pack/plugins/watcher/public/sections/watch_status/watch_details_context.ts b/x-pack/plugins/watcher/public/sections/watch_status/watch_details_context.ts new file mode 100644 index 00000000000000..1d5001c1ad2502 --- /dev/null +++ b/x-pack/plugins/watcher/public/sections/watch_status/watch_details_context.ts @@ -0,0 +1,8 @@ +/* + * 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 React from 'react'; +export const WatchDetailsContext = React.createContext({} as any); diff --git a/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx b/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx index 702f53bd5a4b5e..ed9116ccb58b3e 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx @@ -9,9 +9,13 @@ import { EuiPageContent, EuiSpacer } from '@elastic/eui'; import chrome from 'ui/chrome'; import { MANAGEMENT_BREADCRUMB } from 'ui/management'; +import { FormattedMessage } from '@kbn/i18n/react'; import { WatchDetail } from './components/watch_detail'; import { WatchHistory } from './components/watch_history'; import { listBreadcrumb, statusBreadcrumb } from '../../lib/breadcrumbs'; +import { loadWatchDetail } from '../../lib/api'; +import { WatchDetailsContext } from './watch_details_context'; +import { getPageErrorCode, PageError, SectionLoading } from '../../components'; export const WatchStatus = ({ match: { @@ -24,6 +28,12 @@ export const WatchStatus = ({ }; }; }) => { + const { + error: watchDetailError, + data: watchDetail, + isLoading: isWatchDetailLoading, + } = loadWatchDetail(id); + useEffect( () => { chrome.breadcrumbs.set([MANAGEMENT_BREADCRUMB, listBreadcrumb, statusBreadcrumb]); @@ -31,11 +41,38 @@ export const WatchStatus = ({ [id] ); - return ( - - - - - - ); + const errorCode = getPageErrorCode(watchDetailError); + + if (isWatchDetailLoading) { + return ( + + + + ); + } + + if (errorCode) { + return ( + + + + ); + } + + if (watchDetail) { + return ( + + + + + + + + ); + } + + return null; }; From 531315030f8d5bd1ea600d399623c4b59d1904ff Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Mon, 20 May 2019 10:38:20 -0400 Subject: [PATCH 24/51] fix TS error --- x-pack/plugins/watcher/public/models/index.d.ts | 7 ------- x-pack/typings/@elastic/eui/index.d.ts | 1 + 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/x-pack/plugins/watcher/public/models/index.d.ts b/x-pack/plugins/watcher/public/models/index.d.ts index 43941df4ee7128..d96d8d192e166e 100644 --- a/x-pack/plugins/watcher/public/models/index.d.ts +++ b/x-pack/plugins/watcher/public/models/index.d.ts @@ -37,13 +37,6 @@ declare module 'plugins/watcher/models/settings' { declare module 'plugins/watcher/models/action' { export const Action: any; } -// TODO: Remove once typescript definitions are in EUI -declare module '@elastic/eui' { - export const EuiCodeEditor: React.SFC; - export const EuiDescribedFormGroup: React.SFC; - export const EuiSuperSelect: React.SFC; -} - declare module 'ui/time_buckets' { export const TimeBuckets: any; } diff --git a/x-pack/typings/@elastic/eui/index.d.ts b/x-pack/typings/@elastic/eui/index.d.ts index fccbd4a343f7e3..e1992c77377c3f 100644 --- a/x-pack/typings/@elastic/eui/index.d.ts +++ b/x-pack/typings/@elastic/eui/index.d.ts @@ -11,6 +11,7 @@ declare module '@elastic/eui' { export const EuiCodeEditor: React.SFC; export const Query: any; export const EuiCard: any; + export const EuiSuperSelect: React.SFC; } declare module '@elastic/eui/lib/services/format' { From 84a59051c069155ea10b355f5daf58660178cf06 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 21 May 2019 20:14:31 -0400 Subject: [PATCH 25/51] Improvements to threshold watch (#36688) --- x-pack/plugins/watcher/public/index.scss | 5 + x-pack/plugins/watcher/public/lib/api.ts | 14 +- .../public/models/watch/threshold_watch.js | 25 ++ .../action_fields/webhook_action_fields.tsx | 211 +++++++------ .../threshold_watch_action_dropdown.tsx | 124 ++++---- .../threshold_watch_edit.tsx | 177 ++++++----- .../watch_visualization.tsx | 294 +++++++++++------- 7 files changed, 512 insertions(+), 338 deletions(-) diff --git a/x-pack/plugins/watcher/public/index.scss b/x-pack/plugins/watcher/public/index.scss index ba4ed2516625a1..61dc1177b803bf 100644 --- a/x-pack/plugins/watcher/public/index.scss +++ b/x-pack/plugins/watcher/public/index.scss @@ -14,3 +14,8 @@ justify-content: flex-end; flex-direction: row; } + +.watcherThresholdWatchActionContextMenuItem, +.watcherThresholdWatchInBetweenComparatorText { + align-self: center; +} diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index 79673b09b5e767..e503e6f17dab79 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -152,12 +152,16 @@ export const loadIndexPatterns = async () => { return savedObjects; }; -export const getWatchVisualizationData = async (watchModel: BaseWatch, visualizeOptions: any) => { - const response = await getHttpClient().post(`${basePath}/watch/visualize`, { - watch: watchModel.upstreamJson, - options: visualizeOptions.upstreamJson, +export const getWatchVisualizationData = (watchModel: BaseWatch, visualizeOptions: any) => { + return useRequest({ + path: `${basePath}/watch/visualize`, + method: 'post', + body: { + watch: watchModel.upstreamJson, + options: visualizeOptions.upstreamJson, + }, + processData: ({ visualizeData }: { visualizeData: any }) => visualizeData, }); - return response.data; }; export const loadSettings = () => { diff --git a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js index 2df526e74a36ad..9153e21f029c7e 100644 --- a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js @@ -36,6 +36,7 @@ export class ThresholdWatch extends BaseWatch { this.index = props.index; this.timeField = props.timeField; + this.timeFields = props.timeFields || undefined; this.triggerIntervalSize = props.triggerIntervalSize == null ? DEFAULT_VALUES.TRIGGER_INTERVAL_SIZE @@ -124,6 +125,20 @@ export class ThresholdWatch extends BaseWatch { ) ); } + if (this.index !== undefined + && this.index.length > 0 + && this.timeFields !== undefined + && this.timeFields.length === 1 // first option will have empty value + ) { + errors.index.push( + i18n.translate( + 'xpack.watcher.sections.watchEdit.threshold.invalidIndexValidationMessage', + { + defaultMessage: 'Your index query does not have an associated time field', + } + ) + ); + } if (!this.timeField) { errors.timeField.push( i18n.translate( @@ -144,6 +159,16 @@ export class ThresholdWatch extends BaseWatch { ) ); } + if (this.triggerIntervalSize !== undefined && this.triggerIntervalSize < 0) { + errors.triggerIntervalSize.push( + i18n.translate( + 'xpack.watcher.sections.watchEdit.threshold.intervalSizeNegativeNumberValidationMessage', + { + defaultMessage: 'Interval size cannot be a negative number', + } + ) + ); + } if (aggTypes[this.aggType].fieldRequired && !this.aggField) { errors.aggField.push( i18n.translate( diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx index 905071f142194a..3fbbcd25c305a5 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx @@ -5,7 +5,16 @@ */ import React, { Fragment, useEffect } from 'react'; -import { EuiCodeEditor, EuiFieldNumber, EuiFieldText, EuiFormRow, EuiSelect } from '@elastic/eui'; +import { + EuiCodeEditor, + EuiFieldNumber, + EuiFieldText, + EuiFormRow, + EuiSelect, + EuiFlexGroup, + EuiFlexItem, + EuiText, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ErrableFormRow } from '../../../../../components/form_errors'; import { WebhookAction } from '../../../../../../common/types/action_types'; @@ -33,100 +42,118 @@ export const WebhookActionFields: React.FunctionComponent = ({ return ( - - ({ text: verb.toUpperCase(), value: verb }))} - onChange={e => { - editAction({ key: 'method', value: e.target.value }); - }} - /> - + + + + ({ text: verb.toUpperCase(), value: verb }))} + onChange={e => { + editAction({ key: 'method', value: e.target.value }); + }} + /> + + - - { - editAction({ key: 'host', value: e.target.value }); - }} - onBlur={() => { - if (!host) { - editAction({ key: 'host', value: '' }); - } - }} - /> - + + + { + editAction({ key: 'host', value: e.target.value }); + }} + onBlur={() => { + if (!host) { + editAction({ key: 'host', value: '' }); + } + }} + /> + + - - { - editAction({ key: 'port', value: parseInt(e.target.value, 10) }); - }} - onBlur={() => { - if (!port) { - editAction({ key: 'port', value: '' }); - } - }} - /> - + + + + : + + } + fullWidth + name="port" + value={port || ''} + onChange={e => { + editAction({ key: 'port', value: parseInt(e.target.value, 10) }); + }} + onBlur={() => { + if (!port) { + editAction({ key: 'port', value: '' }); + } + }} + /> + + - - { - editAction({ key: 'path', value: e.target.value }); - }} - /> - + + + + / + + } + fullWidth + name="path" + value={path || ''} + onChange={e => { + editAction({ key: 'path', value: e.target.value }); + }} + /> + + + = ({ settings, isLoading }) => { const { addAction } = useContext(WatchContext); + const [isPopoverOpen, setIsPopOverOpen] = useState(false); + const allActionTypes = Action.getActionTypes() as Record; const actions = Object.entries(allActionTypes).map( - ([type, { typeName, iconClass, selectMessage }]) => ({ - type, - typeName, - iconClass, - selectMessage, - isEnabled: settings ? settings.actionTypes[type].enabled : true, - }) + ([type, { typeName, iconClass, selectMessage }]) => { + const isEnabled = settings ? settings.actionTypes[type].enabled : true; + return { + type, + typeName, + iconClass, + selectMessage, + isEnabled, + }; + } + ); + + const button = ( + setIsPopOverOpen(!isPopoverOpen)} + > + + ); - const actionOptions = actions - ? actions.map((action: any) => { - const isActionDisabled = action.type === ACTION_TYPES.EMAIL && !action.isEnabled; // Currently can only fully verify email action - const description = isActionDisabled ? disabledMessage : action.selectMessage; - return { - value: action.type, - inputDisplay: action.typeName, - disabled: isActionDisabled && !action.isEnabled, - dropdownDisplay: ( - - - - - - {action.typeName} - - -

{description}

-
-
-
- ), - }; - }) - : []; - const actionOptionsWithEmptyValue = [firstActionOption, ...actionOptions]; return ( - { - addAction({ type: value, defaults: { isNew: true } }); - }} - itemLayoutAlign="top" - hasDividers - isLoading={isLoading} - /> + setIsPopOverOpen(false)} + panelPaddingSize="none" + anchorPosition="downLeft" + > + { + const isActionDisabled = action.type === ACTION_TYPES.EMAIL && !action.isEnabled; // Currently can only fully verify email action + const description = isActionDisabled ? disabledMessage : action.selectMessage; + return ( + { + addAction({ type: action.type, defaults: { isNew: true } }); + setIsPopOverOpen(false); + }} + > + + + + + + {action.typeName} + + +

{description}

+
+
+
+
+ ); + })} + /> +
); }; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index 52c4a97f69718b..3cc4091e6754ca 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -27,6 +27,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; +import { TIME_UNITS } from '../../../../../common/constants'; import { ConfirmWatchesModal, ErrableFormRow } from '../../../../components'; import { fetchFields, getMatchingIndices, loadIndexPatterns } from '../../../../lib/api'; import { aggTypes } from '../../../../models/watch/agg_types'; @@ -38,12 +39,24 @@ import { WatchContext } from '../../watch_context'; import { WatchVisualization } from './watch_visualization'; import { WatchActionsPanel } from './threshold_watch_action_panel'; import { LicenseServiceContext } from '../../../../license_service_context'; + const firstFieldOption = { text: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel', { defaultMessage: 'Select a field', }), value: '', }; + +const getTimeOptions = (unitSize: string) => + Object.entries(timeUnits) + .filter(([key]) => key !== TIME_UNITS.MILLISECOND) + .map(([key, value]) => { + return { + text: unitSize && parseInt(unitSize, 10) === 1 ? value.labelSingular : value.labelPlural, + value: key, + }; + }); + const getFields = async (indices: string[]) => { return await fetchFields(indices); }; @@ -104,7 +117,7 @@ const getIndexOptions = async (patternString: string, indexPatterns: string[]) = } options.push({ label: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.chooseLabel', { - defaultMessage: 'Choose...', + defaultMessage: 'Choose…', }), options: [ { @@ -119,7 +132,7 @@ const getIndexOptions = async (patternString: string, indexPatterns: string[]) = const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTitle: string }) => { // hooks const [indexPatterns, setIndexPatterns] = useState([]); - const [fields, setFields] = useState([]); + const [esFields, setEsFields] = useState([]); const [indexOptions, setIndexOptions] = useState([]); const [timeFieldOptions, setTimeFieldOptions] = useState([firstFieldOption]); @@ -129,6 +142,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit const [watchDurationPopoverOpen, setWatchDurationPopoverOpen] = useState(false); const [aggTypePopoverOpen, setAggTypePopoverOpen] = useState(false); const [modal, setModal] = useState<{ title: string; message: string } | null>(null); + const [isSaving, setIsSaving] = useState(false); const { watch, setWatchProperty } = useContext(WatchContext); const licenseService = useContext(LicenseServiceContext); @@ -139,9 +153,11 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit }; const loadData = async () => { if (watch.index && watch.index.length > 0) { - const theFields = await getFields(watch.index); - setFields(theFields); - setTimeFieldOptions(getTimeFieldOptions(theFields)); + const allEsFields = await getFields(watch.index); + const timeFields = getTimeFieldOptions(allEsFields); + setEsFields(allEsFields); + setTimeFieldOptions(timeFields); + setWatchProperty('timeFields', timeFields); } getIndexPatterns(); }; @@ -163,7 +179,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit const expressionErrorMessage = i18n.translate( 'xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage', { - defaultMessage: 'Please fix the errors in the expression below.', + defaultMessage: 'Your expression has errors.', } ); const expressionFields = [ @@ -181,6 +197,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit const andThresholdText = i18n.translate('xpack.watcher.sections.watchEdit.threshold.andLabel', { defaultMessage: 'AND', }); + return ( @@ -231,9 +248,10 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit />
- + { @@ -262,10 +281,19 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit onChange={async (selected: EuiComboBoxOptionProps[]) => { setWatchProperty('index', selected.map(aSelected => aSelected.value)); const indices = selected.map(s => s.value as string); - const theFields = await getFields(indices); - setFields(theFields); - setTimeFieldOptions(getTimeFieldOptions(theFields)); + // reset the time field if indices are deleted + if (indices.length === 0) { + setTimeFieldOptions(getTimeFieldOptions([])); + setWatchProperty('timeFields', []); + return; + } + const currentEsFields = await getFields(indices); + const timeFields = getTimeFieldOptions(currentEsFields); + + setEsFields(currentEsFields); + setWatchProperty('timeFields', timeFields); + setTimeFieldOptions(timeFields); }} onSearchChange={async search => { setIndexOptions(await getIndexOptions(search, indexPatterns)); @@ -281,6 +309,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit { @@ -309,6 +339,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit { @@ -336,6 +368,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit { setWatchProperty('triggerIntervalUnit', e.target.value); }} - options={[ - { - value: 's', - text: intl.formatMessage({ - id: 'xpack.watcher.sections.watchEdit.titlePanel.secondsLabel', - defaultMessage: 'seconds', - }), - }, - { - value: 'm', - text: intl.formatMessage({ - id: 'xpack.watcher.sections.watchEdit.titlePanel.minutesLabel', - defaultMessage: 'minutes', - }), - }, - { - value: 'd', - text: intl.formatMessage({ - id: 'xpack.watcher.sections.watchEdit.titlePanel.daysLabel', - defaultMessage: 'days', - }), - }, - { - value: 'h', - text: intl.formatMessage({ - id: 'xpack.watcher.sections.watchEdit.titlePanel.hoursLabel', - defaultMessage: 'hours', - }), - }, - ]} + options={getTimeOptions(watch.triggerIntervalSize)} /> @@ -383,12 +387,15 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit {shouldShowThresholdExpression ? ( - {hasExpressionErrors ? ( - - {expressionErrorMessage} - - - ) : null} + +

+ +

+
+ { if ( aggTypes[watch.aggType].validNormalizedTypes.includes( @@ -619,7 +626,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit onChange={e => { setWatchProperty('termField', e.target.value); }} - options={fields.reduce( + options={esFields.reduce( (options, field: any) => { if ( groupByTypes[watch.groupBy].validNormalizedTypes.includes( @@ -653,11 +660,11 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit value={watch.threshold .slice(0, comparators[watch.thresholdComparator].requiredValues) .join(` ${andThresholdText} `)} - isActive={ + isActive={Boolean( watchThresholdPopoverOpen || - errors.threshold0.length || - (errors.threshold1 && errors.threshold1.length) - } + errors.threshold0.length || + (errors.threshold1 && errors.threshold1.length) + )} onClick={() => { setWatchThresholdPopoverOpen(true); }} @@ -678,7 +685,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit >
{comparators[watch.thresholdComparator].text} - + {Array.from(Array(comparators[watch.thresholdComparator].requiredValues)).map( - (notUsed, i) => { + (_notUsed, i) => { return ( {i > 0 ? ( - + {andThresholdText} + {hasErrors && } ) : null} @@ -706,7 +717,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit errors={errors} > { const { value } = e.target; @@ -758,7 +769,12 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit anchorPosition="downLeft" >
- For the last + + + { setWatchProperty('timeWindowUnit', e.target.value); }} - options={Object.entries(timeUnits).map(([key, value]) => { - return { - text: - watch.timeWindowSize && parseInt(watch.timeWindowSize, 10) === 1 - ? value.labelSingular - : value.labelPlural, - value: key, - }; - })} + options={getTimeOptions(watch.timeWindowSize)} /> @@ -799,9 +807,21 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit - {hasErrors ? null : } - - + {hasExpressionErrors ? ( + + + + {expressionErrorMessage} + + + + ) : null} + {hasErrors ? null : ( + + + + + )} ) : null} @@ -809,18 +829,31 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit { + setIsSaving(true); const savedWatch = await onWatchSave(watch, licenseService); if (savedWatch && savedWatch.validationError) { + setIsSaving(false); return setModal(savedWatch.validationError); } }} > - {i18n.translate('xpack.watcher.sections.watchEdit.threshold.saveButtonLabel', { - defaultMessage: 'Save', - })} + {watch.isNew ? ( + + ) : ( + + )} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx index a3e395016d6f37..739e04a6d04deb 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx @@ -25,13 +25,15 @@ import { TimeBuckets } from 'ui/time_buckets'; import dateMath from '@elastic/datemath'; import chrome from 'ui/chrome'; import moment from 'moment-timezone'; -import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLoadingChart, EuiSpacer } from '@elastic/eui'; +import { EuiCallOut, EuiLoadingChart, EuiSpacer, EuiEmptyPrompt, EuiText } from '@elastic/eui'; import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; import { VisualizeOptions } from 'plugins/watcher/models/visualize_options'; +import { ThresholdWatch } from 'plugins/watcher/models/watch/threshold_watch'; import { getWatchVisualizationData } from '../../../../lib/api'; import { WatchContext } from '../../watch_context'; import { aggTypes } from '../../../../models/watch/agg_types'; import { comparators } from '../../../../models/watch/comparators'; +import { SectionError } from '../../../../components'; const getChartTheme = () => { const isDarkTheme = chrome.getUiSettingsClient().get('theme:darkMode'); @@ -52,6 +54,7 @@ const getChartTheme = () => { }, }; }; + const getTimezone = () => { const config = chrome.getUiSettingsClient(); const DATE_FORMAT_CONFIG_KEY = 'dateFormat:tz'; @@ -84,9 +87,11 @@ const getDomain = (watch: any) => { max: visualizeTimeWindowTo, }; }; + const getThreshold = (watch: any) => { return watch.threshold.slice(0, comparators[watch.thresholdComparator].requiredValues); }; + const getTimeBuckets = (watch: any) => { const domain = getDomain(watch); const timeBuckets = new TimeBuckets(); @@ -96,134 +101,193 @@ const getTimeBuckets = (watch: any) => { const WatchVisualizationUi = () => { const { watch } = useContext(WatchContext); - const [watchVisualizationData, setWatchVisualizationData] = useState({}); - const [isLoading, setIsLoading] = useState(true); - const loadWatchVisualizationData = async () => { - const domain = getDomain(watch); - const timeBuckets = new TimeBuckets(); - timeBuckets.setBounds(domain); - const interval = timeBuckets.getInterval().expression; - const visualizeOptions = new VisualizeOptions({ - rangeFrom: domain.min, - rangeTo: domain.max, - interval, - timezone: getTimezone(), - }); - const { visualizeData } = (await getWatchVisualizationData(watch, visualizeOptions)) as any; - setIsLoading(false); - setWatchVisualizationData(visualizeData || {}); - }; + const { + index, + timeField, + triggerIntervalSize, + triggerIntervalUnit, + aggType, + aggField, + termSize, + termField, + thresholdComparator, + timeWindowSize, + timeWindowUnit, + groupBy, + threshold, + } = watch; + + const domain = getDomain(watch); + const timeBuckets = new TimeBuckets(); + timeBuckets.setBounds(domain); + const interval = timeBuckets.getInterval().expression; + const visualizeOptions = new VisualizeOptions({ + rangeFrom: domain.min, + rangeTo: domain.max, + interval, + timezone: getTimezone(), + }); + + // Fetching visualization data is independent of watch actions + const watchWithoutActions = new ThresholdWatch({ ...watch, actions: [] }); + + const [isInitialRequest, setIsInitialRequest] = useState(true); + + const { + isLoading, + data: watchVisualizationData, + error, + createRequest: reload, + } = getWatchVisualizationData(watchWithoutActions, visualizeOptions); + useEffect( () => { - const handler = setTimeout(loadWatchVisualizationData, 500); - return () => { - clearTimeout(handler); - }; + // Prevents refetch on initial render + if (isInitialRequest) { + return setIsInitialRequest(false); + } + reload(); }, - [watch] + [ + index, + timeField, + triggerIntervalSize, + triggerIntervalUnit, + aggType, + aggField, + termSize, + termField, + thresholdComparator, + timeWindowSize, + timeWindowUnit, + groupBy, + threshold, + ] ); - const timezone = getTimezone(); - const actualThreshold = getThreshold(watch); - let maxY = actualThreshold[actualThreshold.length - 1]; - (Object.values(watchVisualizationData) as number[][][]).forEach(data => { - data.forEach(([, y]) => { - if (y > maxY) { - maxY = y; - } - }); - }); - const dateFormatter = (d: number) => { - return moment(d) - .tz(timezone) - .format(getTimeBuckets(watch).getScaledDateFormat()); - }; - const aggLabel = aggTypes[watch.aggType].text; - if (isLoading) { + return ( + } + body={ + + + + } + /> + ); + } + + if (error) { return ( - - - - - - - - + + + } + error={error} + /> + ); } - const domain = getDomain(watch); - const watchVisualizationDataKeys = Object.keys(watchVisualizationData); - - return ( - - - {watchVisualizationDataKeys.length ? ( - - - - - {watchVisualizationDataKeys.map((key: string) => { - return ( - - ); - })} - {actualThreshold.map((value: any, i: number) => { - const specId = i === 0 ? 'threshold' : `threshold${i}`; - return ( - { + data.forEach(([, y]) => { + if (y > maxY) { + maxY = y; + } + }); + }); + const dateFormatter = (d: number) => { + return moment(d) + .tz(timezone) + .format(getTimeBuckets(watch).getScaledDateFormat()); + }; + const aggLabel = aggTypes[watch.aggType].text; + return ( + + + {watchVisualizationDataKeys.length ? ( + + + + + {watchVisualizationDataKeys.map((key: string) => { + return ( + + ); + })} + {actualThreshold.map((_value: any, i: number) => { + const specId = i === 0 ? 'threshold' : `threshold${i}`; + return ( + + ); + })} + + ) : ( + - ); - })} - - ) : ( - - } - color="warning" - > - - - )} - - - ); + + )} + + + ); + } + return null; }; + export const WatchVisualization = injectI18n(WatchVisualizationUi); From 24802aee07fadb4ec0e2d37bba8251fdbf491cc8 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 23 May 2019 18:11:39 -0400 Subject: [PATCH 26/51] UI improvements to watch list page (#36816) --- .../translations/translations/zh-CN.json | 2 - .../components/delete_watches_modal.tsx | 8 +- .../documentation_links.ts | 8 +- .../watch_list/components/watch_list.tsx | 516 +++++++++++------- 4 files changed, 323 insertions(+), 211 deletions(-) diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 5052ff9bc698c1..40eac3d3cb865b 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7751,13 +7751,11 @@ "xpack.watcher.sections.watchEdit.titlePanel.watchNameLabel": "名称", "xpack.watcher.sections.watchList.createAdvancedWatchButtonLabel": "创建高级监视", "xpack.watcher.sections.watchList.createThresholdAlertButtonLabel": "创建阈值告警", - "xpack.watcher.sections.watchList.deleteWatchButtonLabel": "删除", "xpack.watcher.sections.watchList.managementSection.editDisplayName": "编辑", "xpack.watcher.sections.watchList.managementSection.newWatchDisplayName": "新建监视", "xpack.watcher.sections.watchList.managementSection.statusDisplayName": "状态", "xpack.watcher.sections.watchList.managementSection.watcherDisplayName": "Watcher", "xpack.watcher.sections.watchList.managementSection.watchesDisplayName": "监视", - "xpack.watcher.sections.watchList.watchTable.menuEditButtonTitle": "编辑", "xpack.watcher.server.checkLicense.licenseExpiredTextMessage": "您不能使用 {watcher},因为您的 {licenseType} 许可证已过期", "xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel": "高于", "xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel": "低于", diff --git a/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx index 6fcab4b9d93036..93892f52774348 100644 --- a/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx +++ b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx @@ -58,8 +58,8 @@ export const DeleteWatchesModal = ({ 'xpack.watcher.sections.watchList.deleteSelectedWatchesSuccessNotification.descriptionText', { defaultMessage: - 'Deleted {numWatchesToDelete, plural, one {watch} other {{numSuccesses} out of # selected watches}} ', - values: { numSuccesses, numWatchesToDelete }, + 'Deleted {numSuccesses, number} {numSuccesses, plural, one {watch} other {watches}}', + values: { numSuccesses }, } ) ); @@ -71,8 +71,8 @@ export const DeleteWatchesModal = ({ 'xpack.watcher.sections.watchList.deleteSelectedWatchesErrorNotification.descriptionText', { defaultMessage: - "Couldn't delete {numWatchesToDelete, plural, one {watch} other {{numErrors} out of # selected watches}}", - values: { numErrors, numWatchesToDelete }, + 'Failed to delete {numErrors, number} {numErrors, plural, one {watch} other {watches}}', + values: { numErrors }, } ) ); diff --git a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts index 32e6cb2887956c..88f23465d33e8d 100644 --- a/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts +++ b/x-pack/plugins/watcher/public/lib/documentation_links/documentation_links.ts @@ -7,11 +7,15 @@ import { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } from 'ui/documentation_links'; import { ACTION_TYPES } from '../../../common/constants'; -const esBase = `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/reference/${DOC_LINK_VERSION}`; -const esStackBase = `${ELASTIC_WEBSITE_URL}guide/en/elastic-stack-overview/${DOC_LINK_VERSION}`; +const elasticDocLinkBase = `${ELASTIC_WEBSITE_URL}guide/en/`; + +const esBase = `${elasticDocLinkBase}elasticsearch/reference/${DOC_LINK_VERSION}`; +const esStackBase = `${elasticDocLinkBase}elastic-stack-overview/${DOC_LINK_VERSION}`; +const kibanaBase = `${elasticDocLinkBase}kibana/${DOC_LINK_VERSION}`; export const putWatchApiUrl = `${esBase}/watcher-api-put-watch.html`; export const executeWatchApiUrl = `${esBase}/watcher-api-execute-watch.html#watcher-api-execute-watch-action-mode`; +export const watcherGettingStartedUrl = `${kibanaBase}/watcher-ui.html`; export const watchActionsConfigurationMap = { [ACTION_TYPES.SLACK]: `${esStackBase}/actions-slack.html#configuring-slack`, diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index c58d9b40c527bc..ee4dd63f8dfaa8 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useState, useMemo, useEffect } from 'react'; +import React, { useState, useMemo, useEffect, Fragment } from 'react'; import { EuiButton, @@ -18,19 +18,28 @@ import { EuiText, EuiTitle, EuiToolTip, + EuiEmptyPrompt, + EuiButtonIcon, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; +import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; import { Moment } from 'moment'; import chrome from 'ui/chrome'; import { MANAGEMENT_BREADCRUMB } from 'ui/management'; import { REFRESH_INTERVALS, PAGINATION } from '../../../../common/constants'; import { listBreadcrumb } from '../../../lib/breadcrumbs'; -import { getPageErrorCode, PageError, DeleteWatchesModal, WatchStatus } from '../../../components'; +import { + getPageErrorCode, + PageError, + DeleteWatchesModal, + WatchStatus, + SectionError, +} from '../../../components'; import { loadWatches } from '../../../lib/api'; +import { watcherGettingStartedUrl } from '../../../lib/documentation_links'; -const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { +const WatchListUi = () => { // hooks const [selection, setSelection] = useState([]); const [watchesToDelete, setWatchesToDelete] = useState([]); @@ -52,6 +61,56 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { [watches, deletedWatches] ); + const createWatchButtons = ( + + + + } + > + + + + + + + + + } + > + + + + + + + ); + if (getPageErrorCode(error)) { return ( @@ -60,132 +119,239 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { ); } - const columns = [ - { - field: 'id', - name: i18n.translate('xpack.watcher.sections.watchList.watchTable.idHeader', { - defaultMessage: 'ID', - }), - sortable: true, - truncateText: true, - render: (id: string) => { - return ( - - {id} - - ); + let content; + + if (error) { + content = ( + + } + error={error} + /> + ); + } else if (availableWatches && availableWatches.length === 0) { + content = ( + + + + } + body={ + +

+ +

+
+ } + actions={createWatchButtons} + /> + ); + } else { + const columns = [ + { + field: 'id', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.idHeader', { + defaultMessage: 'ID', + }), + sortable: true, + truncateText: true, + render: (id: string) => { + return ( + + {id} + + ); + }, + }, + { + field: 'name', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.nameHeader', { + defaultMessage: 'Name', + }), + render: (name: string, item: any) => { + return {name}; + }, + sortable: true, + truncateText: true, }, - }, - { - field: 'name', - name: i18n.translate('xpack.watcher.sections.watchList.watchTable.nameHeader', { - defaultMessage: 'Name', - }), - render: (name: string, item: any) => { - return {name}; + { + field: 'watchStatus.state', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.stateHeader', { + defaultMessage: 'State', + }), + sortable: true, + width: '130px', + render: (state: string) => , }, - sortable: true, - truncateText: true, - }, - { - field: 'watchStatus.state', - name: i18n.translate('xpack.watcher.sections.watchList.watchTable.stateHeader', { - defaultMessage: 'State', - }), - sortable: true, - render: (state: string) => , - }, - { - field: 'watchStatus.comment', - name: i18n.translate('xpack.watcher.sections.watchList.watchTable.commentHeader', { - defaultMessage: 'Comment', - }), - sortable: true, - truncateText: true, - }, - { - field: 'watchStatus.lastMetCondition', - name: i18n.translate('xpack.watcher.sections.watchList.watchTable.lastFiredHeader', { - defaultMessage: 'Last fired', - }), - sortable: true, - truncateText: true, - render: (lastMetCondition: Moment) => { - return lastMetCondition ? lastMetCondition.fromNow() : lastMetCondition; + { + field: 'watchStatus.comment', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.commentHeader', { + defaultMessage: 'Comment', + }), + sortable: true, + truncateText: true, }, - }, - { - field: 'watchStatus.lastChecked', - name: i18n.translate('xpack.watcher.sections.watchList.watchTable.lastTriggeredHeader', { - defaultMessage: 'Last triggered', - }), - sortable: true, - truncateText: true, - render: (lastChecked: Moment) => { - return lastChecked ? lastChecked.fromNow() : lastChecked; + { + field: 'watchStatus.lastMetCondition', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.lastFiredHeader', { + defaultMessage: 'Last fired', + }), + sortable: true, + truncateText: true, + width: '130px', + render: (lastMetCondition: Moment) => { + return lastMetCondition ? lastMetCondition.fromNow() : lastMetCondition; + }, }, - }, - { - actions: [ - { - render: (watch: any) => { - return ( - - - - ); - }, + { + field: 'watchStatus.lastChecked', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.lastTriggeredHeader', { + defaultMessage: 'Last triggered', + }), + sortable: true, + truncateText: true, + width: '130px', + render: (lastChecked: Moment) => { + return lastChecked ? lastChecked.fromNow() : lastChecked; }, - ], - }, - ]; + }, + { + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.actionHeader', { + defaultMessage: 'Actions', + }), + width: '75px', + actions: [ + { + render: (watch: any) => { + const label = i18n.translate( + 'xpack.watcher.sections.watchList.watchTable.actionEditTooltipLabel', + { defaultMessage: 'Edit' } + ); + return ( + + + + ); + }, + }, + { + render: (watch: any) => { + const label = i18n.translate( + 'xpack.watcher.sections.watchList.watchTable.actionDeleteTooltipLabel', + { defaultMessage: 'Delete' } + ); + return ( + + { + setWatchesToDelete([watch.id]); + }} + /> + + ); + }, + }, + ], + }, + ]; - const selectionConfig = { - onSelectionChange: setSelection, - selectable: (watch: any) => !watch.isSystemWatch, - selectableMessage: (selectable: boolean) => - !selectable - ? i18n.translate('xpack.watcher.sections.watchList.watchTable.disabledWatchTooltipText', { - defaultMessage: 'This watch is read-only', - }) - : undefined, - }; + const selectionConfig = { + onSelectionChange: setSelection, + selectable: (watch: any) => !watch.isSystemWatch, + selectableMessage: (selectable: boolean) => + !selectable + ? i18n.translate('xpack.watcher.sections.watchList.watchTable.disabledWatchTooltipText', { + defaultMessage: 'This watch is read-only', + }) + : undefined, + }; - const searchConfig = { - box: { - incremental: true, - }, - toolsRight: ( - { - setWatchesToDelete(selection.map((selected: any) => selected.id)); - }} - color="danger" - disabled={!selection.length} - > - - - ), - }; + const searchConfig = { + box: { + incremental: true, + }, + toolsLeft: selection.length && ( + { + setWatchesToDelete(selection.map((selected: any) => selected.id)); + }} + color="danger" + > + {selection.length > 1 ? ( + + ) : ( + + )} + + ), + toolsRight: createWatchButtons, + }; + + content = ( + + } + /> + ); + } return ( @@ -199,97 +365,41 @@ const WatchListUi = ({ intl }: { intl: InjectedIntl }) => { watchesToDelete={watchesToDelete} /> - - - + + +

-
- - - - -

+ + + -

-
-
-
+ +
+ + - + - - - - } - > - - - - - - - - - } - > - - - - - - - - - - + - } - /> + + + + + + {content} ); }; From 471e44596607ae96aa99854af90cfee3eed3913c Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 28 May 2019 18:38:59 -0400 Subject: [PATCH 27/51] cleanup watcher code (#37029) --- x-pack/plugins/watcher/README.md | 121 ++----------- x-pack/plugins/watcher/public/app.js | 2 +- .../components/page_error/page_error.tsx | 2 - .../watcher/public/directives/moment.js | 20 --- .../plugins/watcher/public/lib/clamp/clamp.js | 9 - .../plugins/watcher/public/lib/clamp/index.js | 7 - .../sortable_boolean.js => format_date.ts} | 15 +- ...et_search_value.js => get_search_value.ts} | 2 +- .../public/lib/get_search_value/index.js | 7 - ...units_label.js => get_time_units_label.ts} | 8 +- .../public/lib/get_time_units_label/index.js | 7 - .../__tests__/sortable_boolean.js | 39 ---- .../public/lib/sortable_boolean/index.js | 7 - .../lib/update_management_sections/index.js | 8 - .../update_history_section.js | 20 --- .../update_watch_sections.js | 29 --- .../models/execute_details/execute_details.js | 13 +- .../public/models/watch/default_watch.json | 2 +- .../json_watch_edit/json_watch_edit.tsx | 2 +- .../json_watch_edit/json_watch_edit_form.tsx | 24 ++- .../json_watch_edit_simulate.tsx | 4 - .../threshold_watch_edit.tsx | 1 + .../watch_status/components/watch_history.tsx | 2 +- .../{ => components}/watch_status.tsx | 12 +- .../services/fields/fields_service.factory.js | 14 -- .../public/services/fields/fields_service.js | 22 --- .../watcher/public/services/fields/index.js | 7 - .../html_id_generator_service.factory.js | 17 -- .../html_id_generator_service.js | 24 --- .../services/html_id_generator/index.js | 7 - .../watcher/public/services/indices/index.js | 7 - .../indices/indices_service.factory.js | 14 -- .../services/indices/indices_service.js | 22 --- .../watcher/public/services/interval/index.js | 7 - .../xpack_watcher_interval_service.factory.js | 16 -- .../xpack_watcher_interval_service.js | 16 -- .../watcher/public/services/watch/index.js | 7 - .../services/watch/watch_service.factory.js | 14 -- .../public/services/watch/watch_service.js | 170 ------------------ .../public/services/watch_history/index.js | 7 - .../watch_history_service.factory.js | 14 -- .../watch_history/watch_history_service.js | 27 --- .../watcher/public/services/watches/index.js | 7 - .../watches/watches_service.factory.js | 14 -- .../services/watches/watches_service.js | 41 ----- 45 files changed, 58 insertions(+), 779 deletions(-) delete mode 100644 x-pack/plugins/watcher/public/directives/moment.js delete mode 100644 x-pack/plugins/watcher/public/lib/clamp/clamp.js delete mode 100644 x-pack/plugins/watcher/public/lib/clamp/index.js rename x-pack/plugins/watcher/public/lib/{sortable_boolean/sortable_boolean.js => format_date.ts} (56%) rename x-pack/plugins/watcher/public/lib/{get_search_value/get_search_value.js => get_search_value.ts} (90%) delete mode 100644 x-pack/plugins/watcher/public/lib/get_search_value/index.js rename x-pack/plugins/watcher/public/lib/{get_time_units_label/get_time_units_label.js => get_time_units_label.ts} (60%) delete mode 100644 x-pack/plugins/watcher/public/lib/get_time_units_label/index.js delete mode 100644 x-pack/plugins/watcher/public/lib/sortable_boolean/__tests__/sortable_boolean.js delete mode 100644 x-pack/plugins/watcher/public/lib/sortable_boolean/index.js delete mode 100644 x-pack/plugins/watcher/public/lib/update_management_sections/index.js delete mode 100644 x-pack/plugins/watcher/public/lib/update_management_sections/update_history_section.js delete mode 100644 x-pack/plugins/watcher/public/lib/update_management_sections/update_watch_sections.js rename x-pack/plugins/watcher/public/sections/watch_status/{ => components}/watch_status.tsx (84%) delete mode 100644 x-pack/plugins/watcher/public/services/fields/fields_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/fields/fields_service.js delete mode 100644 x-pack/plugins/watcher/public/services/fields/index.js delete mode 100644 x-pack/plugins/watcher/public/services/html_id_generator/html_id_generator_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/html_id_generator/html_id_generator_service.js delete mode 100644 x-pack/plugins/watcher/public/services/html_id_generator/index.js delete mode 100644 x-pack/plugins/watcher/public/services/indices/index.js delete mode 100644 x-pack/plugins/watcher/public/services/indices/indices_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/indices/indices_service.js delete mode 100644 x-pack/plugins/watcher/public/services/interval/index.js delete mode 100644 x-pack/plugins/watcher/public/services/interval/xpack_watcher_interval_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/interval/xpack_watcher_interval_service.js delete mode 100644 x-pack/plugins/watcher/public/services/watch/index.js delete mode 100644 x-pack/plugins/watcher/public/services/watch/watch_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/watch/watch_service.js delete mode 100644 x-pack/plugins/watcher/public/services/watch_history/index.js delete mode 100644 x-pack/plugins/watcher/public/services/watch_history/watch_history_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/watch_history/watch_history_service.js delete mode 100644 x-pack/plugins/watcher/public/services/watches/index.js delete mode 100644 x-pack/plugins/watcher/public/services/watches/watches_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/watches/watches_service.js diff --git a/x-pack/plugins/watcher/README.md b/x-pack/plugins/watcher/README.md index bc19f4e4fd968d..4f9111760a0a6b 100644 --- a/x-pack/plugins/watcher/README.md +++ b/x-pack/plugins/watcher/README.md @@ -4,32 +4,19 @@ This plugins adopts some conventions in addition to or in place of conventions i ## Folder structure ``` +common/ + constants/ // constants used across client and server + lib/ // helpers used across client and server + types/ // TS definitions public/ - directives/ (This is the same as *A, but is for directives that are used cross-view) - services/ - watch/ - index.js (no code here; only `export from watch.js`) - watch.js - notifications/ - index.js (no code here; only `export from notifications.js`) - notifications.js - ... - views/ - edit/ - ... - list/ - directives/ (*A) - my_directive_name/ - directives/ (Subcomponents of my_directive_name are defined here, and this follows the same structure as *A) - index.js (no code here; only `export from my_directive_name.js`) - my_directive_name.js - my_directive_name.html - index.js (imports the directives in this folder, i.e.,my_directive_name) - routes/ - index.js (no code here; only imports routes.js) - routes.js - index.js - + components/ // common React components + constants/ // constants used on the client + lib/ // helpers used on the client + models/ // client models + sections/ // Sections of the app with corresponding React components + watch_edit + watch_list + watch_status server/ lib/ screenshots/ @@ -44,90 +31,6 @@ server/ say_hello.js ``` -## Data Services - -api calls: -- GET /watch/{id} -- PUT /watch/{id} - -using the service - -```js -import watch from './services/watch' - -watch.get(...) -watch.put(...) -``` - -## Services / Lib -- Shared code that requires state should be made into a service. For example, see `pageService`. -- Shared code that doesn't require state (e.g. a simple helper function) should be made a lib. -For example, see `clamp`. - -## Controller classes -- All functions in controller classes should be defined as arrow function constants. This is to ensure the `this` context is consistent, regardless of where it is being called. - -GOOD -``` - controller: class WatchListController { - onQueryChanged = (query) => {...}; - } -``` - -BAD -``` - controller: class WatchListController { - onQueryChanged(query) {...}; - } -``` - -``` - controller: class WatchListController { - constructor() { - this.onQueryChanged = (query) => {...}; - } - } -``` - -- Constructors should be used to initialize state and define $scope.$watch(es) - -GOOD -``` - controllerAs: 'watchList', - bindToController: true, - scope: { foo: '=' }, - controller: class WatchListController { - constructor() { - this.foo = this.foo || 'default'; - - $scope.$watch('watchList.foo', () => { - console.log('foo changed, fool'); - }); - } - } -``` -## Event handlers - -Event handler functions should be named with the following pattern: - -> `on`, in present tense - -In case there is ambiguity about _what_ the verb is acting upon a noun should be included like so: - -> `on`, in present tense - -GOOD -``` -onDelete -onWatchDelete -``` - -BAD -``` -onDeleted -onWatchDeleted -``` - ## Data Flow We have a layered architecture in the Watcher UI codebase, with each layer performing a specific function to the data as it flows through it. diff --git a/x-pack/plugins/watcher/public/app.js b/x-pack/plugins/watcher/public/app.js index 66d98eb2354328..1dc60616ac8b6a 100644 --- a/x-pack/plugins/watcher/public/app.js +++ b/x-pack/plugins/watcher/public/app.js @@ -7,7 +7,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { HashRouter, Switch, Route, Redirect } from 'react-router-dom'; -import { WatchStatus } from './sections/watch_status/watch_status'; +import { WatchStatus } from './sections/watch_status/components/watch_status'; import { WatchEdit } from './sections/watch_edit/components/watch_edit'; import { WatchList } from './sections/watch_list/components/watch_list'; import { registerRouter } from './lib/navigation'; diff --git a/x-pack/plugins/watcher/public/components/page_error/page_error.tsx b/x-pack/plugins/watcher/public/components/page_error/page_error.tsx index 429adccfe2acd8..e10ed198a4e743 100644 --- a/x-pack/plugins/watcher/public/components/page_error/page_error.tsx +++ b/x-pack/plugins/watcher/public/components/page_error/page_error.tsx @@ -33,6 +33,4 @@ export function PageError({ errorCode, id }: { errorCode?: any; id?: any }) { default: return ; } - - return null; } diff --git a/x-pack/plugins/watcher/public/directives/moment.js b/x-pack/plugins/watcher/public/directives/moment.js deleted file mode 100644 index e6c0aa27b6914c..00000000000000 --- a/x-pack/plugins/watcher/public/directives/moment.js +++ /dev/null @@ -1,20 +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 moment from 'moment'; -import _ from 'lodash'; -import { uiModules } from 'ui/modules'; - -uiModules - .get('xpack/watcher') - .filter('moment', function (config) { - return function (datetime) { - const format = config.get('dateFormat'); - if (moment.isMoment(datetime)) return datetime.format(format); - if (_.isDate(datetime)) return moment(datetime).format(format); - return datetime; - }; - }); diff --git a/x-pack/plugins/watcher/public/lib/clamp/clamp.js b/x-pack/plugins/watcher/public/lib/clamp/clamp.js deleted file mode 100644 index 00a0b1a49c3890..00000000000000 --- a/x-pack/plugins/watcher/public/lib/clamp/clamp.js +++ /dev/null @@ -1,9 +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. - */ - -export function clamp(val, min, max) { - return Math.min(Math.max(min, val), max); -} diff --git a/x-pack/plugins/watcher/public/lib/clamp/index.js b/x-pack/plugins/watcher/public/lib/clamp/index.js deleted file mode 100644 index 58c55bae647b5d..00000000000000 --- a/x-pack/plugins/watcher/public/lib/clamp/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { clamp } from './clamp'; diff --git a/x-pack/plugins/watcher/public/lib/sortable_boolean/sortable_boolean.js b/x-pack/plugins/watcher/public/lib/format_date.ts similarity index 56% rename from x-pack/plugins/watcher/public/lib/sortable_boolean/sortable_boolean.js rename to x-pack/plugins/watcher/public/lib/format_date.ts index 498b456e9d5880..f300ce73ad71a5 100644 --- a/x-pack/plugins/watcher/public/lib/sortable_boolean/sortable_boolean.js +++ b/x-pack/plugins/watcher/public/lib/format_date.ts @@ -4,11 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -export function sortableBoolean(val) { - const boolVal = Boolean(val); +export const getDateMathFormat = (timeUnit: string, timeValue: number) => { + const now = 'now'; - return { - value: boolVal, - sortOrder: boolVal ? -1 : 0 - }; -} + if (timeValue === 0) { + return now; + } + + return `${now}+${timeValue}${timeUnit}`; +}; diff --git a/x-pack/plugins/watcher/public/lib/get_search_value/get_search_value.js b/x-pack/plugins/watcher/public/lib/get_search_value.ts similarity index 90% rename from x-pack/plugins/watcher/public/lib/get_search_value/get_search_value.js rename to x-pack/plugins/watcher/public/lib/get_search_value.ts index 5c900437db1194..27b2e0229286b1 100644 --- a/x-pack/plugins/watcher/public/lib/get_search_value/get_search_value.js +++ b/x-pack/plugins/watcher/public/lib/get_search_value.ts @@ -11,6 +11,6 @@ import { pick, values } from 'lodash'; * @param array of property keys to use to generate the search value * @return newline delimited string built from the specified properties */ -export function getSearchValue(obj, fields) { +export function getSearchValue(obj: {}, fields: any[]) { return values(pick(obj, fields)).join('\n'); } diff --git a/x-pack/plugins/watcher/public/lib/get_search_value/index.js b/x-pack/plugins/watcher/public/lib/get_search_value/index.js deleted file mode 100644 index f3f1b49908edb0..00000000000000 --- a/x-pack/plugins/watcher/public/lib/get_search_value/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { getSearchValue } from './get_search_value'; diff --git a/x-pack/plugins/watcher/public/lib/get_time_units_label/get_time_units_label.js b/x-pack/plugins/watcher/public/lib/get_time_units_label.ts similarity index 60% rename from x-pack/plugins/watcher/public/lib/get_time_units_label/get_time_units_label.js rename to x-pack/plugins/watcher/public/lib/get_time_units_label.ts index 0388740684a410..0032e98490dcf1 100644 --- a/x-pack/plugins/watcher/public/lib/get_time_units_label/get_time_units_label.js +++ b/x-pack/plugins/watcher/public/lib/get_time_units_label.ts @@ -4,11 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TIME_UNITS } from 'plugins/watcher/constants'; +import { TIME_UNITS } from '../constants'; -export const getTimeUnitsLabel = (unit, size) => { +export const getTimeUnitsLabel = (unit: string, size: number) => { const timeUnit = TIME_UNITS[unit]; - return size === 1 - ? timeUnit.labelSingular - : timeUnit.labelPlural; + return size === 1 ? timeUnit.labelSingular : timeUnit.labelPlural; }; diff --git a/x-pack/plugins/watcher/public/lib/get_time_units_label/index.js b/x-pack/plugins/watcher/public/lib/get_time_units_label/index.js deleted file mode 100644 index 19fbb4d1fde289..00000000000000 --- a/x-pack/plugins/watcher/public/lib/get_time_units_label/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { getTimeUnitsLabel } from './get_time_units_label'; diff --git a/x-pack/plugins/watcher/public/lib/sortable_boolean/__tests__/sortable_boolean.js b/x-pack/plugins/watcher/public/lib/sortable_boolean/__tests__/sortable_boolean.js deleted file mode 100644 index b51130c836459b..00000000000000 --- a/x-pack/plugins/watcher/public/lib/sortable_boolean/__tests__/sortable_boolean.js +++ /dev/null @@ -1,39 +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 { sortableBoolean } from '../sortable_boolean'; - -describe('sortable_boolean', () => { - - const trueExpected = { value: true, sortOrder: -1 }; - const falseExpected = { value: false, sortOrder: 0 }; - - it('sets the sortOrder property correctly', () => { - const trueActual = sortableBoolean(true); - const falseActual = sortableBoolean(false); - - expect(trueActual.sortOrder).to.be(trueExpected.sortOrder); - expect(falseActual.sortOrder).to.be(falseExpected.sortOrder); - }); - - it('sets the value property correctly', () => { - expect(sortableBoolean().value).to.be(falseExpected.value); - expect(sortableBoolean(0).value).to.be(falseExpected.value); - expect(sortableBoolean(null).value).to.be(falseExpected.value); - expect(sortableBoolean('').value).to.be(falseExpected.value); - expect(sortableBoolean(false).value).to.be(falseExpected.value); - - expect(sortableBoolean(true).value).to.be(trueExpected.value); - expect(sortableBoolean(1).value).to.be(trueExpected.value); - expect(sortableBoolean('true').value).to.be(trueExpected.value); - expect(sortableBoolean('false').value).to.be(trueExpected.value); - expect(sortableBoolean('foo').value).to.be(trueExpected.value); - expect(sortableBoolean([]).value).to.be(trueExpected.value); - expect(sortableBoolean({}).value).to.be(trueExpected.value); - }); - -}); diff --git a/x-pack/plugins/watcher/public/lib/sortable_boolean/index.js b/x-pack/plugins/watcher/public/lib/sortable_boolean/index.js deleted file mode 100644 index eb77a0c9795c86..00000000000000 --- a/x-pack/plugins/watcher/public/lib/sortable_boolean/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { sortableBoolean } from './sortable_boolean'; diff --git a/x-pack/plugins/watcher/public/lib/update_management_sections/index.js b/x-pack/plugins/watcher/public/lib/update_management_sections/index.js deleted file mode 100644 index eebe0e41ae8a3b..00000000000000 --- a/x-pack/plugins/watcher/public/lib/update_management_sections/index.js +++ /dev/null @@ -1,8 +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. - */ - -export { updateWatchSections } from './update_watch_sections'; -export { updateHistorySection } from './update_history_section'; diff --git a/x-pack/plugins/watcher/public/lib/update_management_sections/update_history_section.js b/x-pack/plugins/watcher/public/lib/update_management_sections/update_history_section.js deleted file mode 100644 index 0b5275811d666f..00000000000000 --- a/x-pack/plugins/watcher/public/lib/update_management_sections/update_history_section.js +++ /dev/null @@ -1,20 +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 { management } from 'ui/management'; - -export function updateHistorySection(display) { - const statusSection = management.getSection('elasticsearch/watcher/watch/status'); - const editSection = management.getSection('elasticsearch/watcher/watch/edit'); - const newSection = management.getSection('elasticsearch/watcher/watch/new'); - const historySection = management.getSection('elasticsearch/watcher/watch/history-item'); - - newSection.hide(); - statusSection.hide(); - editSection.hide(); - historySection.show(); - historySection.display = display; -} diff --git a/x-pack/plugins/watcher/public/lib/update_management_sections/update_watch_sections.js b/x-pack/plugins/watcher/public/lib/update_management_sections/update_watch_sections.js deleted file mode 100644 index 2e78a94a0e6a8f..00000000000000 --- a/x-pack/plugins/watcher/public/lib/update_management_sections/update_watch_sections.js +++ /dev/null @@ -1,29 +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 { management } from 'ui/management'; - -export function updateWatchSections(watchId) { - const statusSection = management.getSection('elasticsearch/watcher/watch/status'); - const editSection = management.getSection('elasticsearch/watcher/watch/edit'); - const newSection = management.getSection('elasticsearch/watcher/watch/new'); - const historySection = management.getSection('elasticsearch/watcher/watch/history-item'); - - newSection.hide(); - statusSection.hide(); - editSection.hide(); - historySection.hide(); - - if (watchId) { - statusSection.url = `#/management/elasticsearch/watcher/watches/watch/${watchId}/status`; - editSection.url = `#/management/elasticsearch/watcher/watches/watch/${watchId}/edit`; - - statusSection.show(); - editSection.show(); - } else { - newSection.show(); - } -} diff --git a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js index ffe4780a70602a..8f7dd5d0e62ea5 100644 --- a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js +++ b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js @@ -5,6 +5,7 @@ */ import { i18n } from '@kbn/i18n'; +import { getDateMathFormat } from '../../lib/format_date'; export class ExecuteDetails { constructor(props = {}) { @@ -45,17 +46,9 @@ export class ExecuteDetails { return errors; } - formatTime(timeUnit, timeValue) { - const now = 'now'; - if (timeValue === 0) { - return now; - } - return `${now}+${timeValue}${timeUnit}`; - } - get upstreamJson() { - const triggeredTime = this.triggeredTimeValue ? this.formatTime(this.triggeredTimeUnit, this.triggeredTimeValue) : undefined; - const scheduledTime = this.scheduledTimeValue ? this.formatTime(this.scheduledTimeUnit, this.scheduledTimeValue) : undefined; + const triggeredTime = this.triggeredTimeValue !== '' ? getDateMathFormat(this.triggeredTimeUnit, this.triggeredTimeValue) : undefined; + const scheduledTime = this.scheduledTimeValue !== '' ? getDateMathFormat(this.scheduledTimeUnit, this.scheduledTimeValue) : undefined; return { triggerData: { diff --git a/x-pack/plugins/watcher/public/models/watch/default_watch.json b/x-pack/plugins/watcher/public/models/watch/default_watch.json index 555f45ef16237b..22c78660a0bb0e 100644 --- a/x-pack/plugins/watcher/public/models/watch/default_watch.json +++ b/x-pack/plugins/watcher/public/models/watch/default_watch.json @@ -30,4 +30,4 @@ } } } -} \ No newline at end of file +} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx index dbf929c7967795..af8e4944a9d194 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx @@ -56,7 +56,7 @@ const WATCH_TABS: WatchTab[] = [ const EXECUTE_DETAILS_INITIAL_STATE = { triggeredTimeValue: 0, - triggeredTimeUnit: TIME_UNITS.MILLISECOND, + triggeredTimeUnit: TIME_UNITS.SECOND, scheduledTimeValue: 0, scheduledTimeUnit: TIME_UNITS.SECOND, ignoreCondition: false, diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx index 654f19fbe0f9fa..800178e359e8a2 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx @@ -18,6 +18,7 @@ import { EuiLink, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; import { ConfirmWatchesModal, ErrableFormRow } from '../../../../components'; import { putWatchApiUrl } from '../../../../lib/documentation_links'; import { onWatchSave, saveWatch } from '../../watch_edit_actions'; @@ -37,6 +38,8 @@ export const JsonWatchEditForm = () => { message: string; } | null>(null); + const [isSaving, setIsSaving] = useState(false); + const hasActionErrors = !!validationResult && validationResult.type === 'error'; const invalidActionMessage = i18n.translate( @@ -164,20 +167,33 @@ export const JsonWatchEditForm = () => { { + setIsSaving(true); const savedWatch = await onWatchSave(watch, licenseService); if (savedWatch && savedWatch.validationError) { + setIsSaving(false); return setValidationResult(savedWatch.validationError); } }} > - {i18n.translate('xpack.watcher.sections.watchEdit.json.saveButtonLabel', { - defaultMessage: 'Save', - })} + {watch.isNew ? ( + + ) : ( + + )} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx index 112c8829cf7846..02c47c8788e19b 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx @@ -59,10 +59,6 @@ const scheduledTimeUnitOptions = [ ]; const triggeredTimeUnitOptions = [ - { - value: TIME_UNITS.MILLISECOND, - text: timeUnits[TIME_UNITS.MILLISECOND].labelPlural, - }, { value: TIME_UNITS.SECOND, text: timeUnits[TIME_UNITS.SECOND].labelPlural, diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index 3cc4091e6754ca..0f390b747074c5 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -868,4 +868,5 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit ); }; + export const ThresholdWatchEdit = injectI18n(ThresholdWatchEditUi); diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx index 4cab6f868846e2..a45f7dcca434fb 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx @@ -313,7 +313,7 @@ const WatchHistoryUi = () => { - {executionDetail}} + {executionDetail} ); diff --git a/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_status.tsx similarity index 84% rename from x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx rename to x-pack/plugins/watcher/public/sections/watch_status/components/watch_status.tsx index ed9116ccb58b3e..ad7d0b9941da93 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/watch_status.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_status.tsx @@ -10,12 +10,12 @@ import chrome from 'ui/chrome'; import { MANAGEMENT_BREADCRUMB } from 'ui/management'; import { FormattedMessage } from '@kbn/i18n/react'; -import { WatchDetail } from './components/watch_detail'; -import { WatchHistory } from './components/watch_history'; -import { listBreadcrumb, statusBreadcrumb } from '../../lib/breadcrumbs'; -import { loadWatchDetail } from '../../lib/api'; -import { WatchDetailsContext } from './watch_details_context'; -import { getPageErrorCode, PageError, SectionLoading } from '../../components'; +import { WatchDetail } from './watch_detail'; +import { WatchHistory } from './watch_history'; +import { listBreadcrumb, statusBreadcrumb } from '../../../lib/breadcrumbs'; +import { loadWatchDetail } from '../../../lib/api'; +import { WatchDetailsContext } from '../watch_details_context'; +import { getPageErrorCode, PageError, SectionLoading } from '../../../components'; export const WatchStatus = ({ match: { diff --git a/x-pack/plugins/watcher/public/services/fields/fields_service.factory.js b/x-pack/plugins/watcher/public/services/fields/fields_service.factory.js deleted file mode 100644 index cedb5edd9c6d1a..00000000000000 --- a/x-pack/plugins/watcher/public/services/fields/fields_service.factory.js +++ /dev/null @@ -1,14 +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 { uiModules } from 'ui/modules'; -import { FieldsService } from './fields_service'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherFieldsService', ($injector) => { - const $http = $injector.get('$http'); - return new FieldsService($http); - }); diff --git a/x-pack/plugins/watcher/public/services/fields/fields_service.js b/x-pack/plugins/watcher/public/services/fields/fields_service.js deleted file mode 100644 index d2be37ba605fc3..00000000000000 --- a/x-pack/plugins/watcher/public/services/fields/fields_service.js +++ /dev/null @@ -1,22 +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 chrome from 'ui/chrome'; -import { ROUTES } from '../../../common/constants'; - -export class FieldsService { - constructor($http) { - this.$http = $http; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - getFields(indexes = ['*']) { - return this.$http.post(`${this.basePath}/fields`, { indexes }) - .then(response => { - return response.data.fields; - }); - } -} diff --git a/x-pack/plugins/watcher/public/services/fields/index.js b/x-pack/plugins/watcher/public/services/fields/index.js deleted file mode 100644 index cbd4b9358c3559..00000000000000 --- a/x-pack/plugins/watcher/public/services/fields/index.js +++ /dev/null @@ -1,7 +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 './fields_service.factory'; diff --git a/x-pack/plugins/watcher/public/services/html_id_generator/html_id_generator_service.factory.js b/x-pack/plugins/watcher/public/services/html_id_generator/html_id_generator_service.factory.js deleted file mode 100644 index a10d3ce99ebde4..00000000000000 --- a/x-pack/plugins/watcher/public/services/html_id_generator/html_id_generator_service.factory.js +++ /dev/null @@ -1,17 +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 { uiModules } from 'ui/modules'; -import { createHtmlIdGenerator } from './html_id_generator_service'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherHtmlIdGeneratorFactory', () => { - return { - create(...args) { - return createHtmlIdGenerator(...args); - } - }; - }); diff --git a/x-pack/plugins/watcher/public/services/html_id_generator/html_id_generator_service.js b/x-pack/plugins/watcher/public/services/html_id_generator/html_id_generator_service.js deleted file mode 100644 index 4e093fd3d40151..00000000000000 --- a/x-pack/plugins/watcher/public/services/html_id_generator/html_id_generator_service.js +++ /dev/null @@ -1,24 +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 { camelCase } from 'lodash'; - -export function createHtmlIdGenerator(rootPartOrParts = []) { - const rootParts = Array.isArray(rootPartOrParts) ? rootPartOrParts : [rootPartOrParts]; - const cache = {}; - - return (parts, useRootParts = true) => { - if (!cache[parts]) { - const root = useRootParts ? rootParts : []; - const combined = root.concat(parts); - const id = camelCase(combined); - - cache[parts] = id; - } - - return cache[parts]; - }; -} diff --git a/x-pack/plugins/watcher/public/services/html_id_generator/index.js b/x-pack/plugins/watcher/public/services/html_id_generator/index.js deleted file mode 100644 index e3cf7904e38a33..00000000000000 --- a/x-pack/plugins/watcher/public/services/html_id_generator/index.js +++ /dev/null @@ -1,7 +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 './html_id_generator_service.factory'; diff --git a/x-pack/plugins/watcher/public/services/indices/index.js b/x-pack/plugins/watcher/public/services/indices/index.js deleted file mode 100644 index e8e6ee86f84c78..00000000000000 --- a/x-pack/plugins/watcher/public/services/indices/index.js +++ /dev/null @@ -1,7 +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 './indices_service.factory'; diff --git a/x-pack/plugins/watcher/public/services/indices/indices_service.factory.js b/x-pack/plugins/watcher/public/services/indices/indices_service.factory.js deleted file mode 100644 index 17a66936f12435..00000000000000 --- a/x-pack/plugins/watcher/public/services/indices/indices_service.factory.js +++ /dev/null @@ -1,14 +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 { uiModules } from 'ui/modules'; -import { IndicesService } from './indices_service'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherIndicesService', ($injector) => { - const $http = $injector.get('$http'); - return new IndicesService($http); - }); diff --git a/x-pack/plugins/watcher/public/services/indices/indices_service.js b/x-pack/plugins/watcher/public/services/indices/indices_service.js deleted file mode 100644 index 9b185e68ba7e6c..00000000000000 --- a/x-pack/plugins/watcher/public/services/indices/indices_service.js +++ /dev/null @@ -1,22 +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 chrome from 'ui/chrome'; -import { ROUTES } from '../../../common/constants'; - -export class IndicesService { - constructor($http) { - this.$http = $http; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - getMatchingIndices(pattern) { - return this.$http.post(`${this.basePath}/indices`, { pattern }) - .then(response => { - return response.data.indices; - }); - } -} diff --git a/x-pack/plugins/watcher/public/services/interval/index.js b/x-pack/plugins/watcher/public/services/interval/index.js deleted file mode 100644 index 01477b2ec24e30..00000000000000 --- a/x-pack/plugins/watcher/public/services/interval/index.js +++ /dev/null @@ -1,7 +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 './xpack_watcher_interval_service.factory'; diff --git a/x-pack/plugins/watcher/public/services/interval/xpack_watcher_interval_service.factory.js b/x-pack/plugins/watcher/public/services/interval/xpack_watcher_interval_service.factory.js deleted file mode 100644 index 694639ed0069a0..00000000000000 --- a/x-pack/plugins/watcher/public/services/interval/xpack_watcher_interval_service.factory.js +++ /dev/null @@ -1,16 +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 { uiModules } from 'ui/modules'; -import { XpackWatcherIntervalService } from './xpack_watcher_interval_service'; -import { TimeBuckets } from 'ui/time_buckets'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherIntervalService', () => { - const timeBuckets = new TimeBuckets(); - - return new XpackWatcherIntervalService(timeBuckets); - }); diff --git a/x-pack/plugins/watcher/public/services/interval/xpack_watcher_interval_service.js b/x-pack/plugins/watcher/public/services/interval/xpack_watcher_interval_service.js deleted file mode 100644 index c1f543d3e5db09..00000000000000 --- a/x-pack/plugins/watcher/public/services/interval/xpack_watcher_interval_service.js +++ /dev/null @@ -1,16 +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. - */ - -export class XpackWatcherIntervalService { - constructor(timeBuckets) { - this.timeBuckets = timeBuckets; - } - - getInterval(input) { - this.timeBuckets.setBounds(input); - return this.timeBuckets.getInterval(); - } -} diff --git a/x-pack/plugins/watcher/public/services/watch/index.js b/x-pack/plugins/watcher/public/services/watch/index.js deleted file mode 100644 index 809ff6e75abf96..00000000000000 --- a/x-pack/plugins/watcher/public/services/watch/index.js +++ /dev/null @@ -1,7 +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 './watch_service.factory'; diff --git a/x-pack/plugins/watcher/public/services/watch/watch_service.factory.js b/x-pack/plugins/watcher/public/services/watch/watch_service.factory.js deleted file mode 100644 index a0ad02cbdbf4c2..00000000000000 --- a/x-pack/plugins/watcher/public/services/watch/watch_service.factory.js +++ /dev/null @@ -1,14 +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 { uiModules } from 'ui/modules'; -import { WatchService } from './watch_service'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherWatchService', ($injector) => { - const $http = $injector.get('$http'); - return new WatchService($http); - }); diff --git a/x-pack/plugins/watcher/public/services/watch/watch_service.js b/x-pack/plugins/watcher/public/services/watch/watch_service.js deleted file mode 100644 index ca976056880080..00000000000000 --- a/x-pack/plugins/watcher/public/services/watch/watch_service.js +++ /dev/null @@ -1,170 +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 chrome from 'ui/chrome'; -import { reduce } from 'lodash'; -import { ROUTES, WATCH_TYPES, ACTION_MODES } from '../../../common/constants'; -import { ExecuteDetails } from 'plugins/watcher/models/execute_details'; -import { Watch } from 'plugins/watcher/models/watch'; -import { WatchStatus } from 'plugins/watcher/models/watch_status'; -import { WatchHistoryItem } from 'plugins/watcher/models/watch_history_item'; - -export class WatchService { - constructor($http) { - this.$http = $http; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - newWatch(watchType = WATCH_TYPES.JSON) { - const WatchType = Watch.getWatchTypes()[watchType]; - return new WatchType(); - } - - loadWatch(id) { - return this.$http.get(`${this.basePath}/watch/${id}`) - .then(response => { - return Watch.fromUpstreamJson(response.data.watch); - }); - } - - /** - * @param watchId string ID of watch - * @param startTime string Relative representation of start time of watch - * history, e.g. "now-1h" - * @return Promise Array of watch history items - */ - loadWatchHistory(watchId, startTime) { - let url = `${this.basePath}/watch/${watchId}/history`; - if (startTime) { - url += `?startTime=${startTime}`; - } - - return this.$http.get(url) - .then(response => response.data.watchHistoryItems) - .then(watchHistoryItems => watchHistoryItems.map(WatchHistoryItem.fromUpstreamJson)); - } - - saveWatch(watchModel) { - const url = `${this.basePath}/watch/${watchModel.id}`; - - return this.$http.put(url, watchModel.upstreamJson) - .catch(e => { - throw e.data.message; - }); - } - - /** - * @param id string ID of watch to delete - * @return Promise - */ - deleteWatch(id) { - return this.$http.delete(`${this.basePath}/watch/${id}`) - .catch(e => { - throw e.data.message; - }); - } - - /** - * @param id string ID of watch to deactivate - * @return Promise - */ - deactivateWatch(id) { - const url = `${this.basePath}/watch/${id}/deactivate`; - return this.$http.put(url) - .then(response => { - return WatchStatus.fromUpstreamJson(response.data.watchStatus); - }) - .catch(e => { - throw e.data.message; - }); - } - - /** - * @param id string ID of watch to activate - * @return Promise - */ - activateWatch(id) { - const url = `${this.basePath}/watch/${id}/activate`; - return this.$http.put(url) - .then(response => { - return WatchStatus.fromUpstreamJson(response.data.watchStatus); - }) - .catch(e => { - throw e.data.message; - }); - } - - /** - * @param watchId string ID of watch whose action is being acknowledged - * @param actionId string ID of watch action to acknowledge - * @return Promise updated WatchStatus object - */ - acknowledgeWatchAction(watchId, actionId) { - const url = `${this.basePath}/watch/${watchId}/action/${actionId}/acknowledge`; - return this.$http.put(url) - .then(response => { - return WatchStatus.fromUpstreamJson(response.data.watchStatus); - }) - .catch(e => { - throw e.data.message; - }); - } - - /** - * @param executeDetailsModel ExecuteDetailsModel instance with options on how to execute the watch - * @param watchModel Watch instance - * @return Promise which returns a populated WatchHistoryItem on success - */ - executeWatch(executeDetailsModel, watchModel) { - return this.$http.put(`${this.basePath}/watch/execute`, { - executeDetails: executeDetailsModel.upstreamJson, - watch: watchModel.upstreamJson - }) - .then(response => { - return WatchHistoryItem.fromUpstreamJson(response.data.watchHistoryItem); - }) - .catch(e => { - throw e.data.message; - }); - } - - /** - * @param watchModel Watch instance - * @param actionModel Watch instance - * @return Promise which returns a populated WatchHistoryItem on success - */ - simulateWatchAction(watchModel, actionModel) { - const actionModes = reduce(watchModel.actions, (acc, action) => { - acc[action.id] = (action === actionModel) ? - ACTION_MODES.FORCE_EXECUTE : - ACTION_MODES.SKIP; - return acc; - }, {}); - - const executeDetails = new ExecuteDetails({ - triggeredTime: 'now', - scheduledTime: 'now', - ignoreCondition: true, - actionModes, - recordExecution: false - }); - - return this.executeWatch(executeDetails, watchModel); - } - - visualizeWatch(watchModel, visualizeOptions) { - return this.$http.post(`${this.basePath}/watch/visualize`, { - watch: watchModel.upstreamJson, - options: visualizeOptions.upstreamJson - }) - .then(response => { - return response.data; - }) - .catch(e => { - throw e.data.message; - }); - } -} diff --git a/x-pack/plugins/watcher/public/services/watch_history/index.js b/x-pack/plugins/watcher/public/services/watch_history/index.js deleted file mode 100644 index d2f41a60adb779..00000000000000 --- a/x-pack/plugins/watcher/public/services/watch_history/index.js +++ /dev/null @@ -1,7 +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 './watch_history_service.factory'; diff --git a/x-pack/plugins/watcher/public/services/watch_history/watch_history_service.factory.js b/x-pack/plugins/watcher/public/services/watch_history/watch_history_service.factory.js deleted file mode 100644 index acb408b336d597..00000000000000 --- a/x-pack/plugins/watcher/public/services/watch_history/watch_history_service.factory.js +++ /dev/null @@ -1,14 +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 { uiModules } from 'ui/modules'; -import { WatchHistoryService } from './watch_history_service'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherWatchHistoryService', ($injector) => { - const $http = $injector.get('$http'); - return new WatchHistoryService($http); - }); diff --git a/x-pack/plugins/watcher/public/services/watch_history/watch_history_service.js b/x-pack/plugins/watcher/public/services/watch_history/watch_history_service.js deleted file mode 100644 index f684be47efccc5..00000000000000 --- a/x-pack/plugins/watcher/public/services/watch_history/watch_history_service.js +++ /dev/null @@ -1,27 +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 chrome from 'ui/chrome'; -import { ROUTES } from '../../../common/constants'; -import { WatchHistoryItem } from 'plugins/watcher/models/watch_history_item'; - -export class WatchHistoryService { - constructor($http) { - this.$http = $http; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - /** - * @param watchHistoryItemId string ID of watch history item - * @return Promise watch history item - */ - loadWatchHistoryItem(watchHistoryItemId) { - return this.$http.get(`${this.basePath}/history/${watchHistoryItemId}`) - .then(response => { - return WatchHistoryItem.fromUpstreamJson(response.data.watchHistoryItem); - }); - } -} diff --git a/x-pack/plugins/watcher/public/services/watches/index.js b/x-pack/plugins/watcher/public/services/watches/index.js deleted file mode 100644 index 9a52e4f276fde1..00000000000000 --- a/x-pack/plugins/watcher/public/services/watches/index.js +++ /dev/null @@ -1,7 +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 './watches_service.factory'; diff --git a/x-pack/plugins/watcher/public/services/watches/watches_service.factory.js b/x-pack/plugins/watcher/public/services/watches/watches_service.factory.js deleted file mode 100644 index 059da29c9c01e4..00000000000000 --- a/x-pack/plugins/watcher/public/services/watches/watches_service.factory.js +++ /dev/null @@ -1,14 +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 { uiModules } from 'ui/modules'; -import { WatchesService } from './watches_service'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherWatchesService', ($injector) => { - const $http = $injector.get('$http'); - return new WatchesService($http); - }); diff --git a/x-pack/plugins/watcher/public/services/watches/watches_service.js b/x-pack/plugins/watcher/public/services/watches/watches_service.js deleted file mode 100644 index a0b8b496def1d1..00000000000000 --- a/x-pack/plugins/watcher/public/services/watches/watches_service.js +++ /dev/null @@ -1,41 +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 chrome from 'ui/chrome'; -import { ROUTES } from '../../../common/constants'; -import { Watch } from 'plugins/watcher/models/watch'; - -export class WatchesService { - constructor($http) { - this.$http = $http; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - getWatchList() { - return this.$http.get(`${this.basePath}/watches`) - .then(response => response.data.watches) - .then(watches => watches.map(watch => { - return Watch.fromUpstreamJson(watch); - })); - } - - /** - * Delete a collection of watches - * - * @param watchIds Array of watch IDs - * @return Promise { numSuccesses, numErrors } - */ - deleteWatches(watchIds) { - // $http.delete does not take the request body as the 2nd argument. Instead it expects the 2nd - // argument to be a request options object, one of which can be the request body (data). We also - // need to explicitly define the content type of the data. - const body = { - watchIds - }; - return this.$http.post(`${this.basePath}/watches/delete`, body) - .then(response => response.data.results); - } -} From c34dd12083db940b3deb8edfbebfa36ead2926cf Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 31 May 2019 14:45:32 -0400 Subject: [PATCH 28/51] update watcher to use common license checker (#37331) --- .../translations/translations/ja-JP.json | 182 ------------------ .../translations/translations/zh-CN.json | 3 - .../watcher/common/constants/plugin.ts | 10 +- x-pack/plugins/watcher/plugin_definition.js | 11 +- x-pack/plugins/watcher/public/app.js | 30 ++- .../watcher/public/license_service_context.ts | 8 - .../public/register_management_sections.js | 1 - .../plugins/watcher/public/register_route.js | 37 ++-- .../json_watch_edit/json_watch_edit_form.tsx | 6 +- .../threshold_watch_edit.tsx | 6 +- .../sections/watch_edit/watch_edit_actions.ts | 26 ++- .../watcher/public/services/license/index.js | 7 - .../license/license_service.factory.js | 21 -- .../services/license/license_service.js | 69 ------- .../check_license/__tests__/check_license.js | 142 -------------- .../server/lib/check_license/check_license.js | 74 ------- .../watcher/server/lib/check_license/index.js | 7 - .../__tests__/license_pre_routing_factory.js | 9 +- .../license_pre_routing_factory.js | 5 +- .../lib/register_license_checker/index.js | 7 - .../register_license_checker.js | 21 -- .../server/lib/check_license/check_license.js | 2 +- 22 files changed, 89 insertions(+), 595 deletions(-) delete mode 100644 x-pack/plugins/watcher/public/license_service_context.ts delete mode 100644 x-pack/plugins/watcher/public/services/license/index.js delete mode 100644 x-pack/plugins/watcher/public/services/license/license_service.factory.js delete mode 100644 x-pack/plugins/watcher/public/services/license/license_service.js delete mode 100644 x-pack/plugins/watcher/server/lib/check_license/__tests__/check_license.js delete mode 100644 x-pack/plugins/watcher/server/lib/check_license/check_license.js delete mode 100644 x-pack/plugins/watcher/server/lib/check_license/index.js delete mode 100644 x-pack/plugins/watcher/server/lib/register_license_checker/index.js delete mode 100644 x-pack/plugins/watcher/server/lib/register_license_checker/register_license_checker.js diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index a842aceff61f18..c3973f23d00241 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9698,10 +9698,6 @@ "xpack.uptime.snapshotHistogram.series.downLabel": "ダウン", "xpack.uptime.snapshotHistogram.series.upLabel": "アップ", "xpack.uptime.uptimeFeatureCatalogueTitle": "アップタイム", - "xpack.watcher.actionTypeSelect.actionDisabledTextMessage": "無効になっています。{elasticsearchYmlText} を構成します。", - "xpack.watcher.actionTypeSelect.addNewActionPlaceholder": "新規アクションを追加", - "xpack.watcher.checkLicense.licenseDoesNotSupportTextMessage": "ご使用の {licenseType} ライセンスは {watcher} をサポートしていません。ライセンスをアップグレードしてください。", - "xpack.watcher.checkLicense.licenseInformationNotAvailableTextMessage": "現在ライセンス情報が利用できないため {watcher} を使用できません。", "xpack.watcher.constants.actionStates.acknowledgedStateText": "承認済み", "xpack.watcher.constants.actionStates.configErrorStateText": "構成エラー", "xpack.watcher.constants.actionStates.errorStateText": "エラー", @@ -9718,13 +9714,6 @@ "xpack.watcher.constants.watchStates.errorStateText": "エラー", "xpack.watcher.constants.watchStates.firingStateText": "実行中", "xpack.watcher.constants.watchStates.okStateText": "OK", - "xpack.watcher.create.breadcrumb": "作成", - "xpack.watcher.durationSelect.durationAmountAriaLabel": "期間", - "xpack.watcher.durationSelect.durationTimeUnitAriaLabel": "期間の時間単位", - "xpack.watcher.forbiddenMessage.contactAdministratorTextMessage": "管理者にお問い合わせください。", - "xpack.watcher.indexSelect.buildingListTextMessage": "リストを作成中… お待ちください", - "xpack.watcher.indexSelect.startTypingPlaceholder": "入力開始…", - "xpack.watcher.list.breadcrumb": "Watcher", "xpack.watcher.models.action.actionJsonPropertyMissingBadRequestMessage": "json 引数には {actionJson} プロパティが含まれている必要があります", "xpack.watcher.models.actionStatus.actionStatusJsonPropertyMissingBadRequestMessage": "json 引数には {actionStatusJson} プロパティが含まれている必要があります", "xpack.watcher.models.actionStatus.idPropertyMissingBadRequestMessage": "json 引数には {id} プロパティが含まれている必要があります", @@ -9743,27 +9732,20 @@ "xpack.watcher.models.baseWatch.watchStatusJsonPropertyMissingBadRequestMessage": "json 引数には {watchStatusJson} プロパティが含まれている必要があります", "xpack.watcher.models.emailAction.actionJsonEmailPropertyMissingBadRequestMessage": "json 引数には {actionJsonEmail} プロパティが含まれている必要があります", "xpack.watcher.models.emailAction.actionJsonEmailToPropertyMissingBadRequestMessage": "json 引数には {actionJsonEmailTo} プロパティが含まれている必要があります", - "xpack.watcher.models.emailAction.description": "「{subject}」が {toList} に送信されます", "xpack.watcher.models.emailAction.selectMessageText": "サーバーからメールを送信します。", "xpack.watcher.models.emailAction.simulateButtonLabel": "今すぐメールをテスト送信", "xpack.watcher.models.emailAction.simulateFailMessage": "{toList} へのメールの送信に失敗しました。", "xpack.watcher.models.emailAction.simulateMessage": "{toList} にサンプルメールが送信されました", "xpack.watcher.models.emailAction.typeName": "メール", "xpack.watcher.models.fields.fieldsPropertyMissingBadRequestMessage": "json 引数には {fields} プロパティが含まれている必要があります", - "xpack.watcher.models.hipchatAction.description": "{body} が Hipchat で送信されます", - "xpack.watcher.models.hipchatAction.simulateFailMessage": "Hipchat メッセージの送信に失敗しました.。", - "xpack.watcher.models.hipchatAction.simulateMessage": "Hipchat メッセージが送信されました。", - "xpack.watcher.models.indexAction.description": "{index} が {docType} としてインデックスされます", "xpack.watcher.models.indexAction.simulateFailMessage": "{index} のインデックスに失敗しました。", "xpack.watcher.models.indexAction.simulateMessage": "インデックス {index} がインデックスされました。", - "xpack.watcher.models.jiraAction.description": "Jira で {issueName} が作成されます", "xpack.watcher.models.jiraAction.simulateFailMessage": "Jira の問題の作成に失敗しました。", "xpack.watcher.models.jiraAction.simulateMessage": "Jira の問題が作成されました。", "xpack.watcher.models.jsonWatch.selectMessageText": "生 JSON のカスタムウォッチをセットアップします。", "xpack.watcher.models.jsonWatch.typeName": "高度なウォッチ", "xpack.watcher.models.loggingAction.actionJsonLoggingPropertyMissingBadRequestMessage": "json 引数には {actionJsonLogging} プロパティが含まれている必要があります", "xpack.watcher.models.loggingAction.actionJsonLoggingTextPropertyMissingBadRequestMessage": "json 引数には {actionJsonLoggingText} プロパティが含まれている必要があります", - "xpack.watcher.models.loggingAction.description": "ログメッセージ「{text}」", "xpack.watcher.models.loggingAction.selectMessageText": "ログに新規項目を追加します。", "xpack.watcher.models.loggingAction.simulateButtonLabel": "今すぐサンプルメッセージを記録", "xpack.watcher.models.loggingAction.simulateFailMessage": "サンプルメッセージの記録に失敗しました", @@ -9773,12 +9755,10 @@ "xpack.watcher.models.monitoringWatch.fromDownstreamJsonCalledBadRequestMessage": "ウォッチの監視に {fromDownstreamJson} が必要です", "xpack.watcher.models.monitoringWatch.getVisualizeQueryCalledBadRequestMessage": "ウォッチの監視に {getVisualizeQuery} が必要です", "xpack.watcher.models.monitoringWatch.upstreamJsonCalledBadRequestMessage": "ウォッチの監視に {upstreamJson} が必要です", - "xpack.watcher.models.pagerDutyAction.description": "{description} が PagerDuty に送信されます", "xpack.watcher.models.pagerDutyAction.simulateFailMessage": "Hipchat イベントの送信に失敗しました.。", "xpack.watcher.models.pagerDutyAction.simulateMessage": "PagerDuty イベントが送信されました。", "xpack.watcher.models.slackAction.actionJsonSlackMessagePropertyMissingBadRequestMessage": "json 引数には {actionJsonSlackMessage} プロパティが含まれている必要があります", "xpack.watcher.models.slackAction.actionJsonSlackPropertyMissingBadRequestMessage": "json 引数には {actionJsonSlack} プロパティが含まれている必要があります", - "xpack.watcher.models.slackAction.description": "{toList} に Slack メッセージが送信されます", "xpack.watcher.models.slackAction.selectMessageText": "Slack ユーザーまたはチャンネルにメッセージを送信します。", "xpack.watcher.models.slackAction.simulateButtonLabel": "今すぐサンプルメッセージを送信", "xpack.watcher.models.slackAction.simulateFailMessage": "{toList} へのサンプル Slack メッセージの送信に失敗しました。", @@ -9797,185 +9777,38 @@ "xpack.watcher.models.watchHistoryItem.watchIdPropertyMissingBadRequestMessage": "json 引数には {watchId} プロパティが含まれている必要があります", "xpack.watcher.models.watchStatus.idPropertyMissingBadRequestMessage": "json 引数には {id} プロパティが含まれている必要があります", "xpack.watcher.models.watchStatus.watchStatusJsonPropertyMissingBadRequestMessage": "json 引数には {watchStatusJson} プロパティが含まれている必要があります", - "xpack.watcher.models.webhookAction.description": "Webhook が {fullPath} に {method} リクエストを送信します", "xpack.watcher.models.webhookAction.simulateFailMessage": "{fullPath} へのリクエストの送信に失敗しました。", "xpack.watcher.models.webhookAction.simulateMessage": "{fullPath} にサンプルリクエストが送信されました", - "xpack.watcher.sections.watchDetail.actionStatusTable.acknowledgeButtonLabel": "承認", - "xpack.watcher.sections.watchDetail.actionStatusTable.acknowledgeButtonTitle": "承認", - "xpack.watcher.sections.watchDetail.actionStatusTable.actionColumnLabel": "アクション", - "xpack.watcher.sections.watchDetail.actionStatusTable.stateColumnLabel": "ステータス", - "xpack.watcher.sections.watchDetail.actionStatusTotalErrors": "{total, number} 件の{total, plural, one {エラー} other {エラー}}", - "xpack.watcher.sections.watchDetail.activateButtonLabel": "有効化", - "xpack.watcher.sections.watchDetail.currentStatusTitle": "現在のステータス", - "xpack.watcher.sections.watchDetail.deactivateButtonLabel": "無効化", - "xpack.watcher.sections.watchDetail.deleteButtonLabel": "削除", - "xpack.watcher.sections.watchDetail.deleteConfirmModal.deleteWatchButtonLabel": "ウォッチを削除", - "xpack.watcher.sections.watchDetail.deleteConfirmModal.description": "ウォッチが永久に削除されます。よろしいですか?", - "xpack.watcher.sections.watchDetail.deleteWatchSuccessNotificationText": "{watchName} が削除されました", - "xpack.watcher.sections.watchDetail.errorDisplayModalTitleText": "「{actionId}」アクションのエラー", - "xpack.watcher.sections.watchDetail.noActionsFoundText": "アクションが見つかりません。", - "xpack.watcher.sections.watchDetail.watchHistory.watchHistoryLoadingText": "ウォッチ履歴を読み込み中", - "xpack.watcher.sections.watchDetail.watchHistory.watchHistoryNotFoundText": "ウォッチ履歴が見つかりません。", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.allLabel": "すべて", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last1HourLabel": "過去 1 時間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last1YearLabel": "過去 1 年間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last24HoursLabel": "過去 24 時間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last30DaysLabel": "過去 30 日間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last6MonthsLabel": "過去 6 か月間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last7DaysLabel": "過去 7 日間", - "xpack.watcher.sections.watchDetail.watchHistoryTable.commentColumnLabel": "コメント", - "xpack.watcher.sections.watchDetail.watchHistoryTable.stateColumnLabel": "ステータス", - "xpack.watcher.sections.watchDetail.watchHistoryTable.triggerTimeColumnLabel": "実行時刻", - "xpack.watcher.sections.watchDetail.watchHistoryTitle": "ウォッチ履歴", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.actionColumnLabel": "アクション", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.modeColumnLabel": "モード", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.reasonColumnLabel": "理由", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.stateColumnLabel": "ステータス", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.typeColumnLabel": "タイプ", - "xpack.watcher.sections.watchEdit.detail.idIsRequiredValidationMessage": "ID が必要です。", - "xpack.watcher.sections.watchEdit.detail.idLabel": "ID", - "xpack.watcher.sections.watchEdit.detail.idNamingDescription": "ID は文字またはアンダーラインで始まり、文字、アンダーライン、ハイフン、数字のみ使用できます。", - "xpack.watcher.sections.watchEdit.detail.invalidJSONErrorMessage": "無効な JSON", - "xpack.watcher.sections.watchEdit.detail.nameLabel": "名前", - "xpack.watcher.sections.watchEdit.detail.syntaxLinkLabel": "構文", - "xpack.watcher.sections.watchEdit.detail.watchJSONLabel": "ウォッチ JSON", - "xpack.watcher.sections.watchEdit.executeDetail.actionOverrides.actionModesLabel": "アクションモード", - "xpack.watcher.sections.watchEdit.executeDetail.actionOverridesButtonLabel": "アクションオーバーライド", - "xpack.watcher.sections.watchEdit.executeDetail.conditionOverrides.ignoreConditionLabel": "条件を無視 (条件は常に true)", - "xpack.watcher.sections.watchEdit.executeDetail.conditionOverridesButtonLabel": "アクションオーバーライド", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.alternativeInputLabel": "代替インプット", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.alternativeInputLinkText": "以前の実行からコピー", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.invalidJSONErrorMessage": "無効な JSON", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverridesButtonLabel": "インプットオーバーライド", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.scheduledTimeLabel": "予定時刻", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.scheduledTimePlaceholder": "今", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.triggeredTimeLabel": "実行時刻", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.triggeredTimePlaceholder": "今", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverridesButtonLabel": "実行オーバーライド", - "xpack.watcher.sections.watchEdit.executeInfoPanel.howToModifyWatchExecutionDescription": "ウォッチの実行方法を変更するには、下のウォッチを拡張します", - "xpack.watcher.sections.watchEdit.executeInfoPanel.testWatchExecutionTitle": "ウォッチの実行テスト", - "xpack.watcher.sections.watchEdit.json.deleteConfirmModal.description": "ウォッチが永久に削除されます。よろしいですか?", - "xpack.watcher.sections.watchEdit.json.deleteConfirmModal.overwriteWatchButtonLabel": "ウォッチを削除", - "xpack.watcher.sections.watchEdit.json.deleteSuccessNotificationText": "「{watchDisplayName}」が削除されました", "xpack.watcher.sections.watchEdit.json.editTabLabel": "編集", - "xpack.watcher.sections.watchEdit.json.editTabTitle": "ウォッチの編集", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.description": "ID「{watchId}」 {watchNameMessageFragment} のウォッチが既に存在します。上書きしますか?", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.descriptionFragmentText": "(名前: 「{existingWatchName}」)", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.overwriteWatchButtonLabel": "ウォッチを上書き", "xpack.watcher.sections.watchEdit.json.saveSuccessNotificationText": "「{watchDisplayName}」が保存されました", - "xpack.watcher.sections.watchEdit.json.simulateResultsTabLabel": "シミュレーション結果", - "xpack.watcher.sections.watchEdit.json.simulateResultsTabTitle": "結果をシミュレート", "xpack.watcher.sections.watchEdit.json.simulateTabLabel": "シミュレート", - "xpack.watcher.sections.watchEdit.json.simulateTabTitle": "ウォッチをシミュレート", - "xpack.watcher.sections.watchEdit.json.simulateWatchButtonLabel": "ウォッチをシミュレート", - "xpack.watcher.sections.watchEdit.json.simulationOutputLabel": "シミュレーションアウトプット", - "xpack.watcher.sections.watchEdit.json.warningPossibleInvalidSlackAction.description": "このウォッチには「to」プロパティのない Slack アクションがあります。 このウォッチは、Elasticsearch で Slack の「message_default」設定で「to」プロパティが指定された場合のみ有効になります。", - "xpack.watcher.sections.watchEdit.json.watchErrorsWarning.confirmSaveWatch": "ウォッチを保存", - "xpack.watcher.sections.watchEdit.threshold.matchingFollowingConditionTitle": "次の条件に一致", "xpack.watcher.sections.watchEdit.threshold.saveButtonLabel": "保存", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.description": "ID「{watchId}」 {watchNameMessageFragment} のウォッチが既に存在します。上書きしますか?", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.descriptionFragmentText": "(名前: 「{existingWatchName}」)", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.overwriteWatchButtonLabel": "ウォッチを上書き", - "xpack.watcher.sections.watchEdit.threshold.saveSuccessNotificationText": "「{watchDisplayName}」が保存されました", - "xpack.watcher.sections.watchEdit.titleBar.cancelButtonLabel": "キャンセル", - "xpack.watcher.sections.watchEdit.titleBar.deleteButtonLabel": "削除", - "xpack.watcher.sections.watchEdit.titleBar.deleteButtonTooltip": "ウォッチを削除", - "xpack.watcher.sections.watchEdit.titleBar.newWatchTitle": "新規ウォッチ", - "xpack.watcher.sections.watchEdit.titleBar.saveButtonLabel": "保存", - "xpack.watcher.sections.watchEdit.titlePanel.associatedTimeFieldIsMissedInIndexQueryValidationMessage": "インデックスクエリに時間フィールドが関連付けられていません", - "xpack.watcher.sections.watchEdit.titlePanel.createNewTypeOfWatchTitle": "新規 {typeName} の作成", - "xpack.watcher.sections.watchEdit.titlePanel.enterOneOrMoreIndicesValidationMessage": "1 つまたは複数のインデックスを入力してください", "xpack.watcher.sections.watchEdit.titlePanel.howToBroadenSearchQueryDescription": "* で検索クエリの範囲を広げます", "xpack.watcher.sections.watchEdit.titlePanel.indicesToQueryLabel": "クエリを実行するインデックス", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeIsRequiredValidationMessage": "間隔サイズが必要です", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeMinimumDurationValidationMessage": " 最低期間は {minSize}{minUnit} です", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeNegativeNumberValidationMessage": "間隔サイズはマイナスの数字にできません", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeUnitIsRequiredValidationMessage": "間隔サイズが必要です", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeValidNumberValidationMessage": "間隔サイズは有効な数字でなければなりません", - "xpack.watcher.sections.watchEdit.titlePanel.queryDoesNotMatchAnyValidIndicesValidationMessage": "インデックスクエリが有効なインデックスと一致していません", - "xpack.watcher.sections.watchEdit.titlePanel.timeFieldIsRequiredValidationText": "時間フィールドドが必要です", "xpack.watcher.sections.watchEdit.titlePanel.timeFieldLabel": "時間フィールド", "xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel": "フィールドを選択", "xpack.watcher.sections.watchEdit.titlePanel.watchIntervalLabel": "次の間隔でウォッチを実行:", - "xpack.watcher.sections.watchEdit.titlePanel.watchNameIsRequiredValidationMessage": "名前が必要です", "xpack.watcher.sections.watchEdit.titlePanel.watchNameLabel": "名前", - "xpack.watcher.sections.watchEdit.titlePanel.watchNamePlaceholder": "マイしきい値ウォッチ", - "xpack.watcher.sections.watchEdit.watchActionModeTable.actionColumnLabel": "アクション", - "xpack.watcher.sections.watchEdit.watchActionModeTable.modeColumnLabel": "モード", - "xpack.watcher.sections.watchEdit.watchActionModeTable.typeColumnLabel": "タイプ", - "xpack.watcher.sections.watchEdit.watchExecuteSummary.simulationStatusLabel": "シミュレーションステータス:", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.actionHeaderCellLabel": "アクション", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.reasonHeaderCellLabel": "理由", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.stateHeaderCellLabel": "ステータス", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.typeHeaderCellLabel": "タイプ", - "xpack.watcher.sections.watchHistoryItem.executionOutputLabel": "実行アウトプット:", - "xpack.watcher.sections.watchHistoryItem.watchSummary.executionStatusLabel": "実行ステータス:", "xpack.watcher.sections.watchList.createAdvancedWatchButtonLabel": "高度なウォッチを作成", "xpack.watcher.sections.watchList.createAdvancedWatchTooltip": "生 JSON のカスタムウォッチをセットアップします", "xpack.watcher.sections.watchList.createThresholdAlertButtonLabel": "しきい値アラートを作成", "xpack.watcher.sections.watchList.createThresholdAlertButtonTooltip": "特定の条件でアラートを送信します", - "xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.deleteButtonLabel": "{numWatchesToDelete, plural, one {# ウォッチ} other {# ウォッチ}}を削除 ", - "xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.descriptionText": "{numWatchesToDelete, plural, one {# ウォッチ} other {# ウォッチ}}が永久に削除されます。よろしいですか?", - "xpack.watcher.sections.watchList.deleteSelectedWatchesErrorNotification.descriptionText": "選択された {numTotal} 件中 {numErrors} 件の{numWatchesToDelete, plural, one {# ウォッチ} other {# ウォッチ}}を削除できませんでした", - "xpack.watcher.sections.watchList.deleteSelectedWatchesSuccessNotification.descriptionText": "選択された {numTotal} 件中 {numSuccesses} 件の{numWatchesToDelete, plural, one {# ウォッチ} other {# ウォッチ}}が削除されました", - "xpack.watcher.sections.watchList.deleteWatchButtonLabel": "削除", "xpack.watcher.sections.watchList.header": "しきい値アラートを作成", "xpack.watcher.sections.watchList.managementSection.editDisplayName": "編集", "xpack.watcher.sections.watchList.managementSection.newWatchDisplayName": "新規ウォッチ", "xpack.watcher.sections.watchList.managementSection.statusDisplayName": "ステータス", "xpack.watcher.sections.watchList.managementSection.watcherDisplayName": "Watcher", "xpack.watcher.sections.watchList.managementSection.watchesDisplayName": "ウォッチ", - "xpack.watcher.sections.watchList.noPermissionToManageWatchesText": "ウォッチを管理するパーミッションがありません。", - "xpack.watcher.sections.watchList.selectedMultipleWatchText": "ウォッチ", - "xpack.watcher.sections.watchList.selectedSingleWatchText": "ウォッチ", "xpack.watcher.sections.watchList.subhead": "特定のパラメーターに到達した際にメール、Slack メッセージ、ログイベントを送信します。", - "xpack.watcher.sections.watchList.watchesNotFoundText": "ウォッチが見つかりません。", - "xpack.watcher.sections.watchList.watchTable.commentColumnLabel": "コメント", - "xpack.watcher.sections.watchList.watchTable.idColumnLabel": "ID", - "xpack.watcher.sections.watchList.watchTable.lastFiredColumnLabel": "最終実行", - "xpack.watcher.sections.watchList.watchTable.lastTriggeredColumnLabel": "最終実行", - "xpack.watcher.sections.watchList.watchTable.menuEditButtonLabel": "編集", - "xpack.watcher.sections.watchList.watchTable.menuEditButtonTitle": "編集", - "xpack.watcher.sections.watchList.watchTable.nameColumnLabel": "名前", - "xpack.watcher.sections.watchList.watchTable.stateColumnLabel": "ステータス", - "xpack.watcher.server.checkLicense.licenseExpiredTextMessage": "{licenseType} ライセンスが期限切れのため {watcher} を使用できません", - "xpack.watcher.sortableColumn.sortAscendingAriaLabel": "{field} を昇順に並べ替える", - "xpack.watcher.sortableColumn.sortDescendingAriaLabel": "{field} を降順に並べ替える", "xpack.watcher.thresholdPreviewChart.dataDoesNotExistTextMessage": "インデックスと条件がデータを返しませんでした", - "xpack.watcher.thresholdWatchExpression.aggField.itemDescription": "Of", - "xpack.watcher.thresholdWatchExpression.aggField.selectFieldTextMessage": "フィールドを選択します", - "xpack.watcher.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "フィールドを選択してください。", - "xpack.watcher.thresholdWatchExpression.aggType.itemDescription": "タイミング", - "xpack.watcher.thresholdWatchExpression.aggType.requiredTypeValidationMessage": "集約タイプを選択してください。", - "xpack.watcher.thresholdWatchExpression.aggType.selectFieldDropdownPlaceholder": "フィールドを選択…", "xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel": "より大きい:", "xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel": "より小さい:", "xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage": "下の表現のエラーを修正してください。", - "xpack.watcher.thresholdWatchExpression.groupBy.groupedItemDescription": "次に対してグループ化:", - "xpack.watcher.thresholdWatchExpression.groupBy.itemDescription": "Over", "xpack.watcher.thresholdWatchExpression.groupBy.requiredFieldValidationMessage": "フィールドを選択してください。", - "xpack.watcher.thresholdWatchExpression.groupBy.requiredValueValidationMessage": "値が必要です。", - "xpack.watcher.thresholdWatchExpression.groupBy.selectFieldDropdownPlaceholder": "フィールドを選択…", - "xpack.watcher.thresholdWatchExpression.groupBy.valueMustBeGraterThanZeroValidationMessage": "値は 0 よりも大きい値でなければなりません。", - "xpack.watcher.thresholdWatchExpression.groupBy.valueMustBeValidNumberValidationMessage": "値は有効な数字でなければなりません", "xpack.watcher.thresholdWatchExpression.groupByLabel.allDocumentsLabel": "すべてのドキュメント", "xpack.watcher.thresholdWatchExpression.groupByLabel.topLabel": "トップ", "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueIsRequiredValidationMessage": "値が必要です。", - "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueMustBeValidNumberValidationMessage": "値は有効な数字でなければなりません", - "xpack.watcher.thresholdWatchExpression.timeUnits.dayPluralLabel": "日", - "xpack.watcher.thresholdWatchExpression.timeUnits.daySingularLabel": "日", - "xpack.watcher.thresholdWatchExpression.timeUnits.hourPluralLabel": "時間", - "xpack.watcher.thresholdWatchExpression.timeUnits.hourSingularLabel": "時間", - "xpack.watcher.thresholdWatchExpression.timeUnits.minutePluralLabel": "分", - "xpack.watcher.thresholdWatchExpression.timeUnits.minuteSingularLabel": "分", - "xpack.watcher.thresholdWatchExpression.timeUnits.secondPluralLabel": "秒", - "xpack.watcher.thresholdWatchExpression.timeUnits.secondSingularLabel": "秒", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationIsTooShortValidationMessage": "ウィンドウ期間が短すぎます。使用可能な最低期間は {minimumSize}{minimumUnit} です。", "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeIsRequiredValidationMessage": "ウィンドウ期間サイズが必要です。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeMustBePositiveNumberValidationMessage": "ウィンドウ期間サイズはマイナスの数字にできません。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeMustBeValidNumberValidationMessage": "ウィンドウ期間サイズは有効な数字でなければなりません。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationUnitIsRequiredValidationMessage": "ウィンドウ期間単位が必要です。", - "xpack.watcher.thresholdWatchExpression.timeWindow.itemDescription": "過去", "xpack.watcher.timeUnits.dayPluralLabel": "日", "xpack.watcher.timeUnits.daySingularLabel": "日", "xpack.watcher.timeUnits.hourPluralLabel": "時間", @@ -9984,22 +9817,7 @@ "xpack.watcher.timeUnits.minuteSingularLabel": "分", "xpack.watcher.timeUnits.secondPluralLabel": "秒", "xpack.watcher.timeUnits.secondSingularLabel": "秒", - "xpack.watcher.toolBarSelectedCountText": "選択済み", - "xpack.watcher.watchActions.email.bodyIsRequiredValidationMessage": "本文が必要です。", - "xpack.watcher.watchActions.email.bodyLabel": "本文", - "xpack.watcher.watchActions.email.emailAddressIsRequiredValidationMessage": "送信先メールアドレスが必要です。", - "xpack.watcher.watchActions.email.emailAddressLabel": "送信先メールアドレス", - "xpack.watcher.watchActions.email.subjectIsRequiredValidationMessage": "件名が必要です。", - "xpack.watcher.watchActions.email.subjectLabel": "件名", - "xpack.watcher.watchActions.errorInActionValidationMessage": "このアクションには保存する前に対処が必要なエラーがあります。", "xpack.watcher.watchActions.logging.logTextIsRequiredValidationMessage": "ログテキストが必要です。", - "xpack.watcher.watchActions.logging.logTextLabel": "ログテキスト", - "xpack.watcher.watchActions.removeActionButtonLabel": "{actionTypeName} アクションを削除", - "xpack.watcher.watchActions.slack.messageIsRequiredValidationMessage": "メッセージが必要です。", - "xpack.watcher.watchActions.slack.messageLabel": "メッセージ", - "xpack.watcher.watchActions.slack.recipientIsRequiredValidationMessage": "受取人が必要です。", - "xpack.watcher.watchActions.slack.recipientLabel": "受取人", - "xpack.watcher.watchActionsTitle": "条件が満たされた際に {watchActionsCount, plural, one{# アクション} other {# アクション}} を実行します", "xpack.watcher.watcherDescription": "アラートの作成、管理、監視によりデータへの変更を検知します。" } } \ No newline at end of file diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 6642812c7fb969..77f0ae07d4ee16 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7630,8 +7630,6 @@ "xpack.uptime.snapshotHistogram.series.downLabel": "关闭", "xpack.uptime.snapshotHistogram.series.upLabel": "运行", "xpack.uptime.uptimeFeatureCatalogueTitle": "运行时间", - "xpack.watcher.checkLicense.licenseDoesNotSupportTextMessage": "您的 {licenseType} 许可证不支持 {watcher}。请升级您的许可。", - "xpack.watcher.checkLicense.licenseInformationNotAvailableTextMessage": "您不能使用 {watcher},因为许可证信息当前不可用。", "xpack.watcher.constants.actionStates.acknowledgedStateText": "已确认", "xpack.watcher.constants.actionStates.configErrorStateText": "配置错误", "xpack.watcher.constants.actionStates.errorStateText": "错误", @@ -7722,7 +7720,6 @@ "xpack.watcher.sections.watchList.managementSection.statusDisplayName": "状态", "xpack.watcher.sections.watchList.managementSection.watcherDisplayName": "Watcher", "xpack.watcher.sections.watchList.managementSection.watchesDisplayName": "监视", - "xpack.watcher.server.checkLicense.licenseExpiredTextMessage": "您不能使用 {watcher},因为您的 {licenseType} 许可证已过期", "xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel": "高于", "xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel": "低于", "xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage": "请解决如下表达式中的错误。", diff --git a/x-pack/plugins/watcher/common/constants/plugin.ts b/x-pack/plugins/watcher/common/constants/plugin.ts index 118e6424679388..58ecf7a2cc80b0 100644 --- a/x-pack/plugins/watcher/common/constants/plugin.ts +++ b/x-pack/plugins/watcher/common/constants/plugin.ts @@ -4,6 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -export const PLUGIN: { [key: string]: string } = { +import { LICENSE_TYPE_GOLD, LicenseType } from '../../../../common/constants'; + +export const PLUGIN = { ID: 'watcher', + MINIMUM_LICENSE_REQUIRED: LICENSE_TYPE_GOLD as LicenseType, + getI18nName: (translate: (key: string, config: object) => string): string => { + return translate('xpack.watcher.appName', { + defaultMessage: 'Watcher', + }); + }, }; diff --git a/x-pack/plugins/watcher/plugin_definition.js b/x-pack/plugins/watcher/plugin_definition.js index 36f5f4865e6d4b..57daec0b1b0b87 100644 --- a/x-pack/plugins/watcher/plugin_definition.js +++ b/x-pack/plugins/watcher/plugin_definition.js @@ -5,6 +5,7 @@ */ import { resolve } from 'path'; +import { i18n } from '@kbn/i18n'; import { registerFieldsRoutes } from './server/routes/api/fields'; import { registerSettingsRoutes } from './server/routes/api/settings'; import { registerHistoryRoutes } from './server/routes/api/history'; @@ -12,7 +13,7 @@ import { registerIndicesRoutes } from './server/routes/api/indices'; import { registerLicenseRoutes } from './server/routes/api/license'; import { registerWatchesRoutes } from './server/routes/api/watches'; import { registerWatchRoutes } from './server/routes/api/watch'; -import { registerLicenseChecker } from './server/lib/register_license_checker'; +import { registerLicenseChecker } from '../../server/lib/register_license_checker'; import { PLUGIN } from './common/constants'; export const pluginDefinition = { @@ -26,7 +27,13 @@ export const pluginDefinition = { home: ['plugins/watcher/register_feature'], }, init: function (server) { - registerLicenseChecker(server); + // Register license checker + registerLicenseChecker( + server, + PLUGIN.ID, + PLUGIN.getI18nName(i18n.translate), + PLUGIN.MINIMUM_LICENSE_REQUIRED + ); registerFieldsRoutes(server); registerHistoryRoutes(server); diff --git a/x-pack/plugins/watcher/public/app.js b/x-pack/plugins/watcher/public/app.js index 1dc60616ac8b6a..cd3e2e027c923e 100644 --- a/x-pack/plugins/watcher/public/app.js +++ b/x-pack/plugins/watcher/public/app.js @@ -7,11 +7,14 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { HashRouter, Switch, Route, Redirect } from 'react-router-dom'; +import { FormattedMessage } from '@kbn/i18n/react'; import { WatchStatus } from './sections/watch_status/components/watch_status'; import { WatchEdit } from './sections/watch_edit/components/watch_edit'; import { WatchList } from './sections/watch_list/components/watch_list'; import { registerRouter } from './lib/navigation'; import { BASE_PATH } from './constants'; +import { LICENSE_STATUS_VALID } from '../../../common/constants'; +import { EuiCallOut, EuiLink } from '@elastic/eui'; class ShareRouter extends Component { static contextTypes = { @@ -37,7 +40,32 @@ class ShareRouter extends Component { return this.props.children; } } -export const App = () => { +export const App = ({ licenseStatus }) => { + const { status, message } = licenseStatus; + + if (status !== LICENSE_STATUS_VALID) { + return ( + + )} + color="warning" + iconType="help" + > + {message}{' '} + + + + + ); + } + return ( diff --git a/x-pack/plugins/watcher/public/license_service_context.ts b/x-pack/plugins/watcher/public/license_service_context.ts deleted file mode 100644 index 90993dd4c1e299..00000000000000 --- a/x-pack/plugins/watcher/public/license_service_context.ts +++ /dev/null @@ -1,8 +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 React from 'react'; -export const LicenseServiceContext = React.createContext({} as any); diff --git a/x-pack/plugins/watcher/public/register_management_sections.js b/x-pack/plugins/watcher/public/register_management_sections.js index 14bc14688a5ed6..886ac7d28db64d 100644 --- a/x-pack/plugins/watcher/public/register_management_sections.js +++ b/x-pack/plugins/watcher/public/register_management_sections.js @@ -7,7 +7,6 @@ import { management } from 'ui/management'; import { i18n } from '@kbn/i18n'; -import 'plugins/watcher/services/license'; management.getSection('elasticsearch').register('watcher', { display: i18n.translate('xpack.watcher.sections.watchList.managementSection.watcherDisplayName', { diff --git a/x-pack/plugins/watcher/public/register_route.js b/x-pack/plugins/watcher/public/register_route.js index f4c6b931e9a906..3d1dde082c9bfe 100644 --- a/x-pack/plugins/watcher/public/register_route.js +++ b/x-pack/plugins/watcher/public/register_route.js @@ -8,21 +8,20 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { SavedObjectsClientProvider } from 'ui/saved_objects'; import routes from 'ui/routes'; import { management } from 'ui/management'; +import { XPackInfoProvider } from 'plugins/xpack_main/services/xpack_info'; import template from './app.html'; import { App } from './app'; -import 'plugins/watcher/services/license'; import { setHttpClient, setSavedObjectsClient } from './lib/api'; import { I18nContext } from 'ui/i18n'; import { manageAngularLifecycle } from './lib/manage_angular_lifecycle'; -import { LicenseServiceContext } from './license_service_context'; +import { PLUGIN } from '../common/constants'; +import { LICENSE_STATUS_UNAVAILABLE, LICENSE_STATUS_INVALID } from '../../../common/constants'; let elem; -const renderReact = async (elem, licenseService) => { +const renderReact = async (elem, licenseStatus) => { render( - - - + , elem ); @@ -32,7 +31,9 @@ routes.when('/management/elasticsearch/watcher/:param1?/:param2?/:param3?/:param controller: class WatcherController { constructor($injector, $scope, $http, Private) { const $route = $injector.get('$route'); - const licenseService = $injector.get('xpackWatcherLicenseService'); + const xpackInfoService = Private(XPackInfoProvider); + const licenseStatus = xpackInfoService.get(`features.${PLUGIN.ID}`); + // clean up previously rendered React app if one exists // this happens because of React Router redirects elem && unmountComponentAtNode(elem); @@ -42,7 +43,7 @@ routes.when('/management/elasticsearch/watcher/:param1?/:param2?/:param3?/:param setHttpClient($http); $scope.$$postDigest(() => { elem = document.getElementById('watchReactRoot'); - renderReact(elem, licenseService); + renderReact(elem, licenseStatus); manageAngularLifecycle($scope, $route, elem); }); } @@ -53,22 +54,18 @@ routes.when('/management/elasticsearch/watcher/:param1?/:param2?/:param3?/:param routes.defaults(/\/management/, { resolve: { watcherManagementSection: $injector => { - const licenseService = $injector.get('xpackWatcherLicenseService'); + const Private = $injector.get('Private'); + const xpackInfoService = Private(XPackInfoProvider); const watchesSection = management.getSection('elasticsearch/watcher'); + const licenseStatus = xpackInfoService.get(`features.${PLUGIN.ID}`); + const { status } = licenseStatus; - if (licenseService.showLinks) { - watchesSection.show(); - } else { - watchesSection.hide(); + if (status === LICENSE_STATUS_INVALID || status === LICENSE_STATUS_UNAVAILABLE) { + return watchesSection.hide(); } - if (licenseService.enableLinks) { - watchesSection.enable(); - watchesSection.tooltip = ''; - } else { - watchesSection.disable(); - watchesSection.tooltip = licenseService.message; - } + watchesSection.show(); + }, }, }); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx index 800178e359e8a2..05ed85e24ac37c 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx @@ -23,11 +23,9 @@ import { ConfirmWatchesModal, ErrableFormRow } from '../../../../components'; import { putWatchApiUrl } from '../../../../lib/documentation_links'; import { onWatchSave, saveWatch } from '../../watch_edit_actions'; import { WatchContext } from '../../watch_context'; -import { LicenseServiceContext } from '../../../../license_service_context'; export const JsonWatchEditForm = () => { const { watch, setWatchProperty } = useContext(WatchContext); - const licenseService = useContext(LicenseServiceContext); const { errors } = watch.validate(); const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); @@ -65,7 +63,7 @@ export const JsonWatchEditForm = () => { modalOptions={validationResult} callback={async isConfirmed => { if (isConfirmed) { - saveWatch(watch, licenseService); + saveWatch(watch); } setValidationResult(null); }} @@ -176,7 +174,7 @@ export const JsonWatchEditForm = () => { isDisabled={hasErrors} onClick={async () => { setIsSaving(true); - const savedWatch = await onWatchSave(watch, licenseService); + const savedWatch = await onWatchSave(watch); if (savedWatch && savedWatch.validationError) { setIsSaving(false); return setValidationResult(savedWatch.validationError); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index 0f390b747074c5..ff003e3cc47a7c 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -38,7 +38,6 @@ import { onWatchSave, saveWatch } from '../../watch_edit_actions'; import { WatchContext } from '../../watch_context'; import { WatchVisualization } from './watch_visualization'; import { WatchActionsPanel } from './threshold_watch_action_panel'; -import { LicenseServiceContext } from '../../../../license_service_context'; const firstFieldOption = { text: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel', { @@ -144,7 +143,6 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit const [modal, setModal] = useState<{ title: string; message: string } | null>(null); const [isSaving, setIsSaving] = useState(false); const { watch, setWatchProperty } = useContext(WatchContext); - const licenseService = useContext(LicenseServiceContext); const getIndexPatterns = async () => { const indexPatternObjects = await loadIndexPatterns(); @@ -216,7 +214,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit modalOptions={modal} callback={async isConfirmed => { if (isConfirmed) { - saveWatch(watch, licenseService); + saveWatch(watch); } setModal(null); }} @@ -836,7 +834,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit isLoading={isSaving} onClick={async () => { setIsSaving(true); - const savedWatch = await onWatchSave(watch, licenseService); + const savedWatch = await onWatchSave(watch); if (savedWatch && savedWatch.validationError) { setIsSaving(false); return setModal(savedWatch.validationError); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts index a36c1c2717970f..506613299a4345 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts +++ b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts @@ -65,7 +65,7 @@ function createActionsForWatch(watchInstance: BaseWatch) { return watchInstance; } -export async function saveWatch(watch: BaseWatch, licenseService: any) { +export async function saveWatch(watch: BaseWatch) { try { await createWatch(watch); toastNotifications.addSuccess( @@ -78,13 +78,11 @@ export async function saveWatch(watch: BaseWatch, licenseService: any) { ); goToWatchList(); } catch (error) { - return licenseService - .checkValidity() - .then(() => toastNotifications.addDanger(error.data.message)); + return toastNotifications.addDanger(error.data.message); } } -export async function validateActionsAndSaveWatch(watch: BaseWatch, licenseService: any) { +export async function validateActionsAndSaveWatch(watch: BaseWatch) { if (watch.type === WATCH_TYPES.JSON) { const actionsErrors = watch.actions.reduce((actionsErrorsAcc: any, action: any) => { if (action.validate) { @@ -107,16 +105,16 @@ export async function validateActionsAndSaveWatch(watch: BaseWatch, licenseServi }, }; } - return saveWatch(watch, licenseService); + return saveWatch(watch); } - return saveWatch(watch, licenseService); + return saveWatch(watch); } -export async function onWatchSave(watch: BaseWatch, licenseService: any): Promise { +export async function onWatchSave(watch: BaseWatch): Promise { const watchActions = watch.watch && watch.watch.actions; const watchData = watchActions ? createActionsForWatch(watch) : watch; if (!watchData.isNew) { - return validateActionsAndSaveWatch(watch, licenseService); + return validateActionsAndSaveWatch(watch); } try { const existingWatch = await loadWatch(watchData.id); @@ -148,11 +146,9 @@ export async function onWatchSave(watch: BaseWatch, licenseService: any): Promis } } catch (error) { // Confirms watcher does not already exist - return licenseService.checkValidity().then(() => { - if (error.status === 404) { - return validateActionsAndSaveWatch(watchData, licenseService); - } - return toastNotifications.addDanger(error.data.message); - }); + if (error.status === 404) { + return validateActionsAndSaveWatch(watchData); + } + return toastNotifications.addDanger(error.data.message); } } diff --git a/x-pack/plugins/watcher/public/services/license/index.js b/x-pack/plugins/watcher/public/services/license/index.js deleted file mode 100644 index 8be8fb5ccbc64f..00000000000000 --- a/x-pack/plugins/watcher/public/services/license/index.js +++ /dev/null @@ -1,7 +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 './license_service.factory'; diff --git a/x-pack/plugins/watcher/public/services/license/license_service.factory.js b/x-pack/plugins/watcher/public/services/license/license_service.factory.js deleted file mode 100644 index 2c2d02c3df5419..00000000000000 --- a/x-pack/plugins/watcher/public/services/license/license_service.factory.js +++ /dev/null @@ -1,21 +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 { uiModules } from 'ui/modules'; -import { XPackInfoProvider } from 'plugins/xpack_main/services/xpack_info'; -import 'ui/url'; -import { LicenseService } from './license_service'; - -uiModules.get('xpack/watcher') - .factory('xpackWatcherLicenseService', ($injector) => { - const $http = $injector.get('$http'); - const Private = $injector.get('Private'); - const xpackInfoService = Private(XPackInfoProvider); - const kbnUrlService = $injector.get('kbnUrl'); - const $timeout = $injector.get('$timeout'); - - return new LicenseService(xpackInfoService, kbnUrlService, $timeout, $http); - }); diff --git a/x-pack/plugins/watcher/public/services/license/license_service.js b/x-pack/plugins/watcher/public/services/license/license_service.js deleted file mode 100644 index 6a7ee2bbef733b..00000000000000 --- a/x-pack/plugins/watcher/public/services/license/license_service.js +++ /dev/null @@ -1,69 +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 React from 'react'; -import { toastNotifications } from 'ui/notify'; -import { MarkdownSimple } from 'ui/markdown'; -import chrome from 'ui/chrome'; -import { PLUGIN, ROUTES } from '../../../common/constants'; - -export class LicenseService { - constructor(xpackInfoService, kbnUrlService, $timeout, $http) { - this.$http = $http; - this.xpackInfoService = xpackInfoService; - this.kbnUrlService = kbnUrlService; - this.$timeout = $timeout; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - get showLinks() { - return Boolean(this.xpackInfoService.get(`features.${PLUGIN.ID}.showLinks`)); - } - - get enableLinks() { - return Boolean(this.xpackInfoService.get(`features.${PLUGIN.ID}.enableLinks`)); - } - - get isAvailable() { - return Boolean(this.xpackInfoService.get(`features.${PLUGIN.ID}.isAvailable`)); - } - - get message() { - return this.xpackInfoService.get(`features.${PLUGIN.ID}.message`); - } - - notifyAndRedirect() { - toastNotifications.addDanger({ - title: {this.xpackInfoService.get(`features.${PLUGIN.ID}.message`)}, - }); - this.kbnUrlService.redirect('/management'); - } - - /** - * @param opts Object options - * @param opts.onValid Function To execute when license is valid. Optional; default = noop - * @param opts.onInvalid Function To execute when license is invalid. Optional; default = noop - */ - checkValidity() { - return new Promise((resolve, reject) => { - this.$timeout(() => { - if (this.isAvailable) { - return resolve(); - } - - this.notifyAndRedirect(); - return reject(); - }, 10); // To allow latest XHR call to update license info - }); - } - - refreshLicense() { - return this.$http.get(`${this.basePath}/license/refresh`) - .then(response => { - return response.data.success; - }); - } -} diff --git a/x-pack/plugins/watcher/server/lib/check_license/__tests__/check_license.js b/x-pack/plugins/watcher/server/lib/check_license/__tests__/check_license.js deleted file mode 100644 index 3dc2eced25a8e4..00000000000000 --- a/x-pack/plugins/watcher/server/lib/check_license/__tests__/check_license.js +++ /dev/null @@ -1,142 +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 { set } from 'lodash'; -import { checkLicense } from '../check_license'; - -describe('check_license', function () { - - let mockLicenseInfo; - beforeEach(() => mockLicenseInfo = {}); - - describe('license information is undefined', () => { - beforeEach(() => mockLicenseInfo = undefined); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it('should set showLinks to true', () => { - expect(checkLicense(mockLicenseInfo).showLinks).to.be(true); - }); - - it('should set enableLinks to false', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - - describe('license information is not available', () => { - beforeEach(() => mockLicenseInfo.isAvailable = () => false); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it('should set showLinks to true', () => { - expect(checkLicense(mockLicenseInfo).showLinks).to.be(true); - }); - - it('should set enableLinks to false', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - - describe('license information is available', () => { - beforeEach(() => { - mockLicenseInfo.isAvailable = () => true; - set(mockLicenseInfo, 'license.getType', () => 'basic'); - }); - - describe('& license is trial, standard, gold, platinum', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isOneOf', () => true)); - - describe('& license is active', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isActive', () => true)); - - it('should set isAvailable to true', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(true); - }); - - it ('should set showLinks to true', () => { - expect(checkLicense(mockLicenseInfo).showLinks).to.be(true); - }); - - it ('should set enableLinks to true', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(true); - }); - - it('should not set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.be(undefined); - }); - }); - - describe('& license is expired', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isActive', () => false)); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it ('should set showLinks to true', () => { - expect(checkLicense(mockLicenseInfo).showLinks).to.be(true); - }); - - it ('should set enableLinks to false', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - }); - - describe('& license is basic', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isOneOf', () => false)); - - describe('& license is active', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isActive', () => true)); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it ('should set showLinks to false', () => { - expect(checkLicense(mockLicenseInfo).showLinks).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - - describe('& license is expired', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isActive', () => false)); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it ('should set showLinks to false', () => { - expect(checkLicense(mockLicenseInfo).showLinks).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - }); - }); -}); diff --git a/x-pack/plugins/watcher/server/lib/check_license/check_license.js b/x-pack/plugins/watcher/server/lib/check_license/check_license.js deleted file mode 100644 index 2b318c4ddd8851..00000000000000 --- a/x-pack/plugins/watcher/server/lib/check_license/check_license.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; - -export function checkLicense(xpackLicenseInfo) { - // If, for some reason, we cannot get the license information - // from Elasticsearch, assume worst case and disable the Watcher UI - if (!xpackLicenseInfo || !xpackLicenseInfo.isAvailable()) { - return { - isAvailable: false, - showLinks: true, - enableLinks: false, - message: i18n.translate('xpack.watcher.checkLicense.licenseInformationNotAvailableTextMessage', { - defaultMessage: 'You cannot use {watcher} because license information is not available at this time.', - values: { - watcher: 'Watcher' - } - }), - }; - } - - const VALID_LICENSE_MODES = [ - 'trial', - 'standard', - 'gold', - 'platinum' - ]; - - const isLicenseModeValid = xpackLicenseInfo.license.isOneOf(VALID_LICENSE_MODES); - const isLicenseActive = xpackLicenseInfo.license.isActive(); - const licenseType = xpackLicenseInfo.license.getType(); - - // License is not valid - if (!isLicenseModeValid) { - return { - isAvailable: false, - showLinks: false, - message: i18n.translate('xpack.watcher.checkLicense.licenseDoesNotSupportTextMessage', { - defaultMessage: 'Your {licenseType} license does not support {watcher}. Please upgrade your license.', - values: { - licenseType, - watcher: 'Watcher' - }, - }), - }; - } - - // License is valid but not active - if (!isLicenseActive) { - return { - isAvailable: false, - showLinks: true, - enableLinks: false, - message: i18n.translate('xpack.watcher.server.checkLicense.licenseExpiredTextMessage', { - defaultMessage: 'You cannot use {watcher} because your {licenseType} license has expired', - values: { - licenseType, - watcher: 'Watcher' - }, - }), - }; - } - - // License is valid and active - return { - isAvailable: true, - showLinks: true, - enableLinks: true - }; -} diff --git a/x-pack/plugins/watcher/server/lib/check_license/index.js b/x-pack/plugins/watcher/server/lib/check_license/index.js deleted file mode 100644 index f2c070fd44b6e6..00000000000000 --- a/x-pack/plugins/watcher/server/lib/check_license/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { checkLicense } from './check_license'; diff --git a/x-pack/plugins/watcher/server/lib/license_pre_routing_factory/__tests__/license_pre_routing_factory.js b/x-pack/plugins/watcher/server/lib/license_pre_routing_factory/__tests__/license_pre_routing_factory.js index 24cbaae2b2b672..ed4a51a11b7cda 100644 --- a/x-pack/plugins/watcher/server/lib/license_pre_routing_factory/__tests__/license_pre_routing_factory.js +++ b/x-pack/plugins/watcher/server/lib/license_pre_routing_factory/__tests__/license_pre_routing_factory.js @@ -6,6 +6,7 @@ import expect from '@kbn/expect'; import { licensePreRoutingFactory } from '../license_pre_routing_factory'; +import { LICENSE_STATUS_VALID, LICENSE_STATUS_EXPIRED } from '../../../../../../common/constants/license_status'; describe('license_pre_routing_factory', () => { describe('#reportingFeaturePreRoutingFactory', () => { @@ -33,10 +34,10 @@ describe('license_pre_routing_factory', () => { expect(firstInstance).to.be(secondInstance); }); - describe('isAvailable is false', () => { + describe('status is not valid', () => { beforeEach(() => { mockLicenseCheckResults = { - isAvailable: false + status: LICENSE_STATUS_EXPIRED }; }); @@ -51,10 +52,10 @@ describe('license_pre_routing_factory', () => { }); }); - describe('isAvailable is true', () => { + describe('status is valid', () => { beforeEach(() => { mockLicenseCheckResults = { - isAvailable: true + status: LICENSE_STATUS_VALID }; }); diff --git a/x-pack/plugins/watcher/server/lib/license_pre_routing_factory/license_pre_routing_factory.js b/x-pack/plugins/watcher/server/lib/license_pre_routing_factory/license_pre_routing_factory.js index 11e01304b6e5cf..5b34108c9c1c01 100644 --- a/x-pack/plugins/watcher/server/lib/license_pre_routing_factory/license_pre_routing_factory.js +++ b/x-pack/plugins/watcher/server/lib/license_pre_routing_factory/license_pre_routing_factory.js @@ -7,6 +7,7 @@ import { once } from 'lodash'; import { wrapCustomError } from '../error_wrappers'; import { PLUGIN } from '../../../common/constants'; +import { LICENSE_STATUS_VALID } from '../../../../../common/constants/license_status'; export const licensePreRoutingFactory = once((server) => { const xpackMainPlugin = server.plugins.xpack_main; @@ -14,7 +15,9 @@ export const licensePreRoutingFactory = once((server) => { // License checking and enable/disable logic function licensePreRouting() { const licenseCheckResults = xpackMainPlugin.info.feature(PLUGIN.ID).getLicenseCheckResults(); - if (!licenseCheckResults.isAvailable) { + const { status } = licenseCheckResults; + + if (status !== LICENSE_STATUS_VALID) { const error = new Error(licenseCheckResults.message); const statusCode = 403; throw wrapCustomError(error, statusCode); diff --git a/x-pack/plugins/watcher/server/lib/register_license_checker/index.js b/x-pack/plugins/watcher/server/lib/register_license_checker/index.js deleted file mode 100644 index 7b0f97c38d1292..00000000000000 --- a/x-pack/plugins/watcher/server/lib/register_license_checker/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { registerLicenseChecker } from './register_license_checker'; diff --git a/x-pack/plugins/watcher/server/lib/register_license_checker/register_license_checker.js b/x-pack/plugins/watcher/server/lib/register_license_checker/register_license_checker.js deleted file mode 100644 index b05946e60b3309..00000000000000 --- a/x-pack/plugins/watcher/server/lib/register_license_checker/register_license_checker.js +++ /dev/null @@ -1,21 +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 { mirrorPluginStatus } from '../../../../../server/lib/mirror_plugin_status'; -import { checkLicense } from '../check_license'; -import { PLUGIN } from '../../../common/constants'; - -export function registerLicenseChecker(server) { - const xpackMainPlugin = server.plugins.xpack_main; - const watcherPlugin = server.plugins.watcher; - - mirrorPluginStatus(xpackMainPlugin, watcherPlugin); - xpackMainPlugin.status.once('green', () => { - // Register a function that is called whenever the xpack info changes, - // to re-compute the license check results for this plugin - xpackMainPlugin.info.feature(PLUGIN.ID).registerLicenseCheckResultsGenerator(checkLicense); - }); -} diff --git a/x-pack/server/lib/check_license/check_license.js b/x-pack/server/lib/check_license/check_license.js index 5f5ecf816a4ab1..12e92c74e22d6f 100644 --- a/x-pack/server/lib/check_license/check_license.js +++ b/x-pack/server/lib/check_license/check_license.js @@ -59,7 +59,7 @@ export function checkLicense(pluginName, minimumLicenseRequired, xpackLicenseInf message: i18n.translate( 'xpack.server.checkLicense.errorExpiredMessage', { - defaultMessage: 'You cannot use {pluginName} because your {licenseType} license has expired', + defaultMessage: 'You cannot use {pluginName} because your {licenseType} license has expired.', values: { licenseType, pluginName }, }, ), From 581bd6200de6857b3a46e00fcc102f4cb3f8e191 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 4 Jun 2019 13:03:15 -0400 Subject: [PATCH 29/51] address design review feedback (#37911) --- .../plugins/watcher/public/lib/navigation.ts | 8 + .../watcher/public/models/watch/json_watch.js | 3 + .../json_watch_edit/json_watch_edit_form.tsx | 48 ++-- .../json_watch_edit_simulate.tsx | 162 ++++++------- .../action_fields/email_action_fields.tsx | 2 +- .../action_fields/slack_action_fields.tsx | 4 +- .../action_fields/webhook_action_fields.tsx | 5 +- .../sections/watch_edit/watch_edit_actions.ts | 6 +- .../watch_list/components/watch_list.tsx | 213 +++++++++++------- .../watch_status/components/watch_detail.tsx | 50 ---- .../watch_status/components/watch_history.tsx | 130 ++--------- .../watch_status/components/watch_status.tsx | 194 +++++++++++++++- .../functional/page_objects/watcher_page.js | 3 +- 13 files changed, 449 insertions(+), 379 deletions(-) diff --git a/x-pack/plugins/watcher/public/lib/navigation.ts b/x-pack/plugins/watcher/public/lib/navigation.ts index 055803d50dc810..87fa95ce534108 100644 --- a/x-pack/plugins/watcher/public/lib/navigation.ts +++ b/x-pack/plugins/watcher/public/lib/navigation.ts @@ -13,3 +13,11 @@ export const registerRouter = (aRouter: any) => { export const goToWatchList = () => { router.history.push({ pathname: `${BASE_PATH}watches` }); }; + +export const goToCreateThresholdAlert = () => { + router.history.push({ pathname: `${BASE_PATH}watches/new-watch/threshold` }); +}; + +export const goToCreateAdvancedWatch = () => { + router.history.push({ pathname: `${BASE_PATH}watches/new-watch/json` }); +}; diff --git a/x-pack/plugins/watcher/public/models/watch/json_watch.js b/x-pack/plugins/watcher/public/models/watch/json_watch.js index 64527c8cd54dda..ecda151e3ea34d 100644 --- a/x-pack/plugins/watcher/public/models/watch/json_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/json_watch.js @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import uuid from 'uuid'; import { get } from 'lodash'; import { BaseWatch } from './base_watch'; import { ACTION_TYPES, WATCH_TYPES } from 'plugins/watcher/../common/constants'; @@ -16,10 +17,12 @@ import { i18n } from '@kbn/i18n'; export class JsonWatch extends BaseWatch { constructor(props = {}) { props.type = WATCH_TYPES.JSON; + props.id = typeof props.id === 'undefined' ? uuid.v4() : props.id; super(props); const existingWatch = get(props, 'watch'); this.watch = existingWatch ? existingWatch : defaultWatchJson; this.watchString = get(props, 'watchString', JSON.stringify(existingWatch ? existingWatch : defaultWatchJson, null, 2)); + this.id = props.id; } validate() { diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx index 05ed85e24ac37c..3c5f4f2deea3b9 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx @@ -16,6 +16,7 @@ import { EuiForm, EuiFormRow, EuiLink, + EuiSpacer, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -73,6 +74,27 @@ export const JsonWatchEditForm = () => { isInvalid={!!validationResult && validationResult.type === 'error'} error={validationResult && validationResult.message ? validationResult.message : []} > + + ) => { + const watchName = e.target.value; + setWatchProperty('name', watchName); + }} + onBlur={() => { + if (!watch.name) { + setWatchProperty('name', ''); + } + }} + /> + { errorKey="id" isShowingErrors={hasErrors && watch.id !== undefined} errors={errors} - fullWidth > { }} /> - - ) => { - setWatchProperty('name', e.target.value); - }} - onBlur={() => { - if (!watch.name) { - setWatchProperty('name', ''); - } - }} - /> - + { errors={jsonErrors} > - + - + - - - { - const value = e.target.value; - setExecuteDetails( - new ExecuteDetails({ - ...executeDetails, - triggeredTimeValue: value === '' ? value : parseInt(value, 10), - }) - ); - }} - /> - - - { - setExecuteDetails( - new ExecuteDetails({ - ...executeDetails, - triggeredTimeUnit: e.target.value, - }) - ); - }} - /> - - - - - - {i18n.translate( - 'xpack.watcher.sections.watchEdit.simulate.form.inputOverridesTitle', - { defaultMessage: 'Input' } - )} - - } - description={i18n.translate( - 'xpack.watcher.sections.watchEdit.simulate.form.inputOverridesDescription', - { - defaultMessage: - 'Enter JSON data to override the watch payload that comes from running the input.', - } - )} - > - - { + {timeUnits[TIME_UNITS.SECOND].labelPlural}} + onChange={e => { + const value = e.target.value; setExecuteDetails( new ExecuteDetails({ ...executeDetails, - alternativeInput: json, + triggeredTimeValue: value === '' ? value : parseInt(value, 10), + triggeredTimeUnit: TIME_UNITS.SECOND, }) ); }} /> - + + + + + + {i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.inputOverridesTitle', + { defaultMessage: 'Input' } + )} + + } + description={i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.inputOverridesDescription', + { + defaultMessage: + 'Enter JSON data to override the watch payload that comes from running the input.', + } + )} + > + + { + setExecuteDetails( + new ExecuteDetails({ + ...executeDetails, + alternativeInput: json, + }) + ); + }} + /> + + = ({ label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.emailAction.subjectTextFieldLabel', { - defaultMessage: 'Subject', + defaultMessage: 'Subject (optional)', } )} > diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx index e1ac3e01c2c268..202e8ac4c53f16 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx @@ -30,7 +30,7 @@ export const SlackActionFields: React.FunctionComponent = ({ label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.slackAction.recipientTextFieldLabel', { - defaultMessage: 'Recipient', + defaultMessage: 'Recipient (optional)', } )} > @@ -56,7 +56,7 @@ export const SlackActionFields: React.FunctionComponent = ({ label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.slackAction.messageTextAreaFieldLabel', { - defaultMessage: 'Message', + defaultMessage: 'Message (optional)', } )} > diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx index 3fbbcd25c305a5..cf7928db843635 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx @@ -14,6 +14,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiText, + EuiSpacer, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ErrableFormRow } from '../../../../../components/form_errors'; @@ -134,7 +135,7 @@ export const WebhookActionFields: React.FunctionComponent = ({ label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.webhookAction.pathFieldLabel', { - defaultMessage: 'Path', + defaultMessage: 'Path (optional)', } )} > @@ -155,6 +156,8 @@ export const WebhookActionFields: React.FunctionComponent = ({ + + errors[errorKey]).flat(); - return [...actionsErrorsAcc, ...newErrors]; + const newErrors = errorKeys.map(errorKey => errors[errorKey]); + const newErrorsFlattened = newErrors && newErrors.length ? [].concat(...newErrors) : []; + + return [...actionsErrorsAcc, ...newErrorsFlattened]; } return actionsErrorsAcc; }, []); diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index ee4dd63f8dfaa8..7109202d9ac71b 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -20,6 +20,9 @@ import { EuiToolTip, EuiEmptyPrompt, EuiButtonIcon, + EuiPopover, + EuiContextMenuPanel, + EuiContextMenuItem, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; @@ -27,7 +30,7 @@ import { Moment } from 'moment'; import chrome from 'ui/chrome'; import { MANAGEMENT_BREADCRUMB } from 'ui/management'; -import { REFRESH_INTERVALS, PAGINATION } from '../../../../common/constants'; +import { REFRESH_INTERVALS, PAGINATION, WATCH_TYPES } from '../../../../common/constants'; import { listBreadcrumb } from '../../../lib/breadcrumbs'; import { getPageErrorCode, @@ -38,6 +41,7 @@ import { } from '../../../components'; import { loadWatches } from '../../../lib/api'; import { watcherGettingStartedUrl } from '../../../lib/documentation_links'; +import { goToCreateThresholdAlert, goToCreateAdvancedWatch } from '../../../lib/navigation'; const WatchListUi = () => { // hooks @@ -55,60 +59,106 @@ const WatchListUi = () => { REFRESH_INTERVALS.WATCH_LIST ); + const [isPopoverOpen, setIsPopOverOpen] = useState(false); + const availableWatches = useMemo( () => watches ? watches.filter((watch: any) => !deletedWatches.includes(watch.id)) : undefined, [watches, deletedWatches] ); - const createWatchButtons = ( - - - - } - > - - - - - + const watcherDescriptionText = ( + +

+ +

+
+ ); - - - } + const createWatchContextMenu = ( + setIsPopOverOpen(!isPopoverOpen)} > - - - - - -
+ + + } + isOpen={isPopoverOpen} + closePopover={() => setIsPopOverOpen(false)} + panelPaddingSize="none" + anchorPosition="downCenter" + > + { + return ( + { + setIsPopOverOpen(false); + const navigate = + watchType === WATCH_TYPES.THRESHOLD + ? goToCreateThresholdAlert + : goToCreateAdvancedWatch; + navigate(); + }} + > + {watchType === WATCH_TYPES.THRESHOLD ? ( + + + + + + + + + + + + + ) : ( + + + + + + + + + + + + + )} + + ); + })} + /> + ); if (getPageErrorCode(error)) { @@ -119,6 +169,39 @@ const WatchListUi = () => { ); } + if (availableWatches && availableWatches.length === 0) { + const emptyPromptBody = ( + + {watcherDescriptionText} + {''} + + + + + ); + + return ( + + + + + } + body={emptyPromptBody} + actions={createWatchContextMenu} + /> + + ); + } + let content; if (error) { @@ -133,31 +216,6 @@ const WatchListUi = () => { error={error} /> ); - } else if (availableWatches && availableWatches.length === 0) { - content = ( - - - - } - body={ - -

- -

-
- } - actions={createWatchButtons} - /> - ); } else { const columns = [ { @@ -329,7 +387,7 @@ const WatchListUi = () => { )} ), - toolsRight: createWatchButtons, + toolsRight: createWatchContextMenu, }; content = ( @@ -388,14 +446,7 @@ const WatchListUi = () => { - - - - - + {watcherDescriptionText} diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index b2c98b66d8316b..0265e6323a98fb 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -11,17 +11,13 @@ import { toastNotifications } from 'ui/notify'; import { EuiInMemoryTable, - EuiSpacer, EuiTitle, EuiButtonEmpty, - EuiBadge, EuiToolTip, EuiCallOut, EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, - EuiFlexGroup, - EuiFlexItem, } from '@elastic/eui'; import { ackWatchAction } from '../../../lib/api'; import { WatchStatus } from '../../../components'; @@ -48,7 +44,6 @@ const WatchDetailUi = () => { const [selectedErrorAction, setSelectedErrorAction] = useState(null); const { - isSystemWatch, id: watchId, watchErrors: { actionErrors }, watchStatus: { actionStatuses: currentActionStatuses }, @@ -216,51 +211,6 @@ const WatchDetailUi = () => { )} - - - -

- -

-
-
- {isSystemWatch && ( - - - } - > - - - - - - )} -
- - - - -

- -

-
- - { const [isActivated, setIsActivated] = useState(undefined); const [detailWatchId, setDetailWatchId] = useState(undefined); - const [watchesToDelete, setWatchesToDelete] = useState([]); - const [isTogglingActivation, setIsTogglingActivation] = useState(false); const [watchHistoryTimeSpan, setWatchHistoryTimeSpan] = useState( watchHistoryTimeSpanOptions[0].value @@ -105,21 +95,9 @@ const WatchHistoryUi = () => { ? JSON.stringify(watchHistoryDetails.details, null, 2) : ''; - const historySectionTitle = ( - -

- -

-
- ); - if (historyError) { return ( - {historySectionTitle} { setWatchHistoryTimeSpan(timespan); }; - const toggleWatchActivation = async () => { - const toggleActivation = isActivated ? deactivateWatch : activateWatch; - - setIsTogglingActivation(true); - - const { error } = await toggleActivation(loadedWatch.id); - - setIsTogglingActivation(false); - - if (error) { - const message = isActivated - ? i18n.translate( - 'xpack.watcher.sections.watchList.toggleActivatationErrorNotification.deactivateDescriptionText', - { - defaultMessage: "Couldn't deactivate watch", - } - ) - : i18n.translate( - 'xpack.watcher.sections.watchList.toggleActivatationErrorNotification.activateDescriptionText', - { - defaultMessage: "Couldn't activate watch", - } - ); - return toastNotifications.addDanger(message); - } - - setIsActivated(!isActivated); - }; - let flyout; if (detailWatchId !== undefined) { @@ -320,74 +269,21 @@ const WatchHistoryUi = () => { } } - const activationButtonText = isActivated ? ( - - ) : ( - - ); - return ( - { - if (deleted) { - goToWatchList(); - } - setWatchesToDelete([]); - }} - watchesToDelete={watchesToDelete} - /> - - {historySectionTitle} + - - - - - {!loadedWatch.isSystemWatch && ( - - - toggleWatchActivation()} - isLoading={isTogglingActivation} - > - {activationButtonText} - - - - { - setWatchesToDelete([loadedWatch.id]); - }} - color="danger" - disabled={false} - > - - - - + + /> diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_status.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_status.tsx index ad7d0b9941da93..2d5379e36f4e48 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_status.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_status.tsx @@ -4,18 +4,59 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useEffect } from 'react'; -import { EuiPageContent, EuiSpacer } from '@elastic/eui'; +import React, { useEffect, useState } from 'react'; +import { + EuiPageContent, + EuiSpacer, + EuiTabs, + EuiTab, + EuiFlexGroup, + EuiFlexItem, + EuiTitle, + EuiToolTip, + EuiBadge, + EuiButtonEmpty, +} from '@elastic/eui'; import chrome from 'ui/chrome'; import { MANAGEMENT_BREADCRUMB } from 'ui/management'; - +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; +import { toastNotifications } from 'ui/notify'; import { WatchDetail } from './watch_detail'; import { WatchHistory } from './watch_history'; import { listBreadcrumb, statusBreadcrumb } from '../../../lib/breadcrumbs'; -import { loadWatchDetail } from '../../../lib/api'; +import { loadWatchDetail, deactivateWatch, activateWatch } from '../../../lib/api'; import { WatchDetailsContext } from '../watch_details_context'; -import { getPageErrorCode, PageError, SectionLoading } from '../../../components'; +import { + getPageErrorCode, + PageError, + SectionLoading, + DeleteWatchesModal, +} from '../../../components'; +import { goToWatchList } from '../../../lib/navigation'; + +interface WatchStatusTab { + id: string; + name: string; +} + +const WATCH_EXECUTION_HISTORY_TAB = 'watchExecutionHistoryTab'; +const WATCH_ACTIONS_TAB = 'watchActionsTab'; + +const WATCH_STATUS_TABS: WatchStatusTab[] = [ + { + id: WATCH_EXECUTION_HISTORY_TAB, + name: i18n.translate('xpack.watcher.sections.watchStatus.executionHistoryTabLabel', { + defaultMessage: 'Execution history', + }), + }, + { + id: WATCH_ACTIONS_TAB, + name: i18n.translate('xpack.watcher.sections.watchStatus.actionsTabLabel', { + defaultMessage: 'Action statuses', + }), + }, +]; export const WatchStatus = ({ match: { @@ -34,6 +75,11 @@ export const WatchStatus = ({ isLoading: isWatchDetailLoading, } = loadWatchDetail(id); + const [selectedTab, setSelectedTab] = useState(WATCH_EXECUTION_HISTORY_TAB); + const [isActivated, setIsActivated] = useState(undefined); + const [watchesToDelete, setWatchesToDelete] = useState([]); + const [isTogglingActivation, setIsTogglingActivation] = useState(false); + useEffect( () => { chrome.breadcrumbs.set([MANAGEMENT_BREADCRUMB, listBreadcrumb, statusBreadcrumb]); @@ -63,12 +109,144 @@ export const WatchStatus = ({ } if (watchDetail) { + const { isSystemWatch, id: watchId, watchStatus, name: watchName } = watchDetail; + + if (isActivated === undefined) { + // Set initial value for isActivated based on the watch we just loaded. + setIsActivated(watchStatus.isActive); + } + + const activationButtonText = isActivated ? ( + + ) : ( + + ); + + const toggleWatchActivation = async () => { + const toggleActivation = isActivated ? deactivateWatch : activateWatch; + + setIsTogglingActivation(true); + + const { error } = await toggleActivation(watchId); + + setIsTogglingActivation(false); + + if (error) { + const message = isActivated + ? i18n.translate( + 'xpack.watcher.sections.watchList.toggleActivatationErrorNotification.deactivateDescriptionText', + { + defaultMessage: "Couldn't deactivate watch", + } + ) + : i18n.translate( + 'xpack.watcher.sections.watchList.toggleActivatationErrorNotification.activateDescriptionText', + { + defaultMessage: "Couldn't activate watch", + } + ); + return toastNotifications.addDanger(message); + } + + setIsActivated(!isActivated); + }; + return ( - - - + { + if (deleted) { + goToWatchList(); + } + setWatchesToDelete([]); + }} + watchesToDelete={watchesToDelete} + /> + + + +

+ +

+
+
+ {isSystemWatch ? ( + + + } + > + + + + + + ) : ( + + + + toggleWatchActivation()} + isLoading={isTogglingActivation} + > + {activationButtonText} + + + + { + setWatchesToDelete([watchId]); + }} + color="danger" + disabled={false} + > + + + + + + )} +
+ + + {WATCH_STATUS_TABS.map((tab, index) => ( + { + setSelectedTab(tab.id); + }} + isSelected={tab.id === selectedTab} + key={index} + > + {tab.name} + + ))} + + + {selectedTab === WATCH_ACTIONS_TAB ? : }
); diff --git a/x-pack/test/functional/page_objects/watcher_page.js b/x-pack/test/functional/page_objects/watcher_page.js index 791e8de08f2f15..5b09f561ca7778 100644 --- a/x-pack/test/functional/page_objects/watcher_page.js +++ b/x-pack/test/functional/page_objects/watcher_page.js @@ -23,7 +23,8 @@ export function WatcherPageProvider({ getPageObjects, getService }) { } async createWatch(watchName, name) { - await testSubjects.click('createAdvancedWatchButton'); + await testSubjects.click('createWatchButton'); + await testSubjects.click('jsonWatchCreateLink'); await find.setValue('#id', watchName); await find.setValue('#watchName', name); await find.clickByCssSelector('[type="submit"]'); From 35d5abe27f6a26a3b4c262e0eb633ad29fab4533 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 7 Jun 2019 10:32:52 -0400 Subject: [PATCH 30/51] move existing watch check to server (#38131) --- .../public/components/section_error.tsx | 2 +- .../watcher/public/models/watch/base_watch.js | 1 + .../json_watch_edit/json_watch_edit_form.tsx | 64 ++++++++++------- .../threshold_watch_edit.tsx | 35 ++++++---- .../sections/watch_edit/watch_edit_actions.ts | 70 +++++-------------- .../routes/api/watch/register_save_route.js | 37 ++++++++-- .../functional/apps/watcher/watcher_test.js | 19 +++-- x-pack/test/functional/config.js | 6 +- 8 files changed, 122 insertions(+), 112 deletions(-) diff --git a/x-pack/plugins/watcher/public/components/section_error.tsx b/x-pack/plugins/watcher/public/components/section_error.tsx index c375b0657a30fb..05cdc040d7592a 100644 --- a/x-pack/plugins/watcher/public/components/section_error.tsx +++ b/x-pack/plugins/watcher/public/components/section_error.tsx @@ -27,7 +27,7 @@ export const SectionError: React.FunctionComponent = ({ title, error }) = return ( -
{message || errorString}
+
{message || errorString}
{cause && ( diff --git a/x-pack/plugins/watcher/public/models/watch/base_watch.js b/x-pack/plugins/watcher/public/models/watch/base_watch.js index 5596e50a137fce..cbd3bc540b90b6 100644 --- a/x-pack/plugins/watcher/public/models/watch/base_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/base_watch.js @@ -114,6 +114,7 @@ export class BaseWatch { id: this.id, name: this.name, type: this.type, + isNew: this.isNew, actions: map(this.actions, action => action.upstreamJson) }; } diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx index 3c5f4f2deea3b9..e185dc62920bb2 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx @@ -20,9 +20,9 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { ConfirmWatchesModal, ErrableFormRow } from '../../../../components'; +import { ErrableFormRow, SectionError } from '../../../../components'; import { putWatchApiUrl } from '../../../../lib/documentation_links'; -import { onWatchSave, saveWatch } from '../../watch_edit_actions'; +import { onWatchSave } from '../../watch_edit_actions'; import { WatchContext } from '../../watch_context'; export const JsonWatchEditForm = () => { @@ -31,15 +31,15 @@ export const JsonWatchEditForm = () => { const { errors } = watch.validate(); const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); - const [validationResult, setValidationResult] = useState<{ - type: string; - title: string; - message: string; + const [validationError, setValidationError] = useState(null); + + const [serverError, setServerError] = useState<{ + data: { nessage: string; error: string }; } | null>(null); const [isSaving, setIsSaving] = useState(false); - const hasActionErrors = !!validationResult && validationResult.type === 'error'; + const hasActionErrors = !!validationError; const invalidActionMessage = i18n.translate( 'xpack.watcher.sections.watchEdit.json.form.actionValidationErrorMessage', @@ -59,21 +59,21 @@ export const JsonWatchEditForm = () => { return ( - {validationResult && validationResult.type === 'warning' && ( - { - if (isConfirmed) { - saveWatch(watch); - } - setValidationResult(null); - }} - /> - )} - + + {serverError && ( + + + } + error={serverError} + /> + + + )} { )} value={watch.watchString} onChange={(json: string) => { - if (validationResult && validationResult.type === 'error') { - setValidationResult(null); + if (validationError) { + setValidationError(null); } setWatchProperty('watchString', json); }} @@ -173,9 +173,16 @@ export const JsonWatchEditForm = () => { onClick={async () => { setIsSaving(true); const savedWatch = await onWatchSave(watch); - if (savedWatch && savedWatch.validationError) { + if (savedWatch && savedWatch.error) { + const { data } = savedWatch.error; + setIsSaving(false); - return setValidationResult(savedWatch.validationError); + + if (data.error === 'validation') { + return setValidationError(data.message); + } + + return setServerError(savedWatch.error); } }} > @@ -193,7 +200,10 @@ export const JsonWatchEditForm = () => {
- + {i18n.translate('xpack.watcher.sections.watchEdit.json.cancelButtonLabel', { defaultMessage: 'Cancel', })} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index ff003e3cc47a7c..50eba55f09ebf2 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -28,13 +28,13 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; import { TIME_UNITS } from '../../../../../common/constants'; -import { ConfirmWatchesModal, ErrableFormRow } from '../../../../components'; +import { ErrableFormRow, SectionError } from '../../../../components'; import { fetchFields, getMatchingIndices, loadIndexPatterns } from '../../../../lib/api'; import { aggTypes } from '../../../../models/watch/agg_types'; import { groupByTypes } from '../../../../models/watch/group_by_types'; import { comparators } from '../../../../models/watch/comparators'; import { timeUnits } from '../../time_units'; -import { onWatchSave, saveWatch } from '../../watch_edit_actions'; +import { onWatchSave } from '../../watch_edit_actions'; import { WatchContext } from '../../watch_context'; import { WatchVisualization } from './watch_visualization'; import { WatchActionsPanel } from './threshold_watch_action_panel'; @@ -140,7 +140,9 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit const [watchThresholdPopoverOpen, setWatchThresholdPopoverOpen] = useState(false); const [watchDurationPopoverOpen, setWatchDurationPopoverOpen] = useState(false); const [aggTypePopoverOpen, setAggTypePopoverOpen] = useState(false); - const [modal, setModal] = useState<{ title: string; message: string } | null>(null); + const [serverError, setServerError] = useState<{ + data: { nessage: string; error: string }; + } | null>(null); const [isSaving, setIsSaving] = useState(false); const { watch, setWatchProperty } = useContext(WatchContext); @@ -210,16 +212,21 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit
- { - if (isConfirmed) { - saveWatch(watch); - } - setModal(null); - }} - /> + {serverError && ( + + + } + error={serverError} + /> + + + )} { setIsSaving(true); const savedWatch = await onWatchSave(watch); - if (savedWatch && savedWatch.validationError) { + if (savedWatch && savedWatch.error) { setIsSaving(false); - return setModal(savedWatch.validationError); + return setServerError(savedWatch.error); } }} > diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts index 77ef7a7a0c27e5..9a9f02af24af5c 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts +++ b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts @@ -9,7 +9,7 @@ import { toastNotifications } from 'ui/notify'; import { get } from 'lodash'; import { ACTION_TYPES, WATCH_TYPES } from '../../../common/constants'; import { BaseWatch } from '../../../common/types/watch_types'; -import { createWatch, loadWatch } from '../../lib/api'; +import { createWatch } from '../../lib/api'; import { goToWatchList } from '../../lib/navigation'; /** @@ -65,7 +65,7 @@ function createActionsForWatch(watchInstance: BaseWatch) { return watchInstance; } -export async function saveWatch(watch: BaseWatch) { +export async function saveWatch(watch: BaseWatch): Promise { try { await createWatch(watch); toastNotifications.addSuccess( @@ -78,13 +78,16 @@ export async function saveWatch(watch: BaseWatch) { ); goToWatchList(); } catch (error) { - return toastNotifications.addDanger(error.data.message); + return { error }; } } -export async function validateActionsAndSaveWatch(watch: BaseWatch) { - if (watch.type === WATCH_TYPES.JSON) { - const actionsErrors = watch.actions.reduce((actionsErrorsAcc: any, action: any) => { +export async function onWatchSave(watch: BaseWatch): Promise { + const watchActions = watch.watch && watch.watch.actions; + const watchData = watchActions ? createActionsForWatch(watch) : watch; + + if (watchData.type === WATCH_TYPES.JSON) { + const actionsErrors = watchData.actions.reduce((actionsErrorsAcc: any, action: any) => { if (action.validate) { const errors = action.validate(); const errorKeys = Object.keys(errors); @@ -101,56 +104,15 @@ export async function validateActionsAndSaveWatch(watch: BaseWatch) { }, []); if (actionsErrors.length > 0) { return { - validationError: { - type: 'error', - message: actionsErrors, - }, - }; - } - return saveWatch(watch); - } - return saveWatch(watch); -} - -export async function onWatchSave(watch: BaseWatch): Promise { - const watchActions = watch.watch && watch.watch.actions; - const watchData = watchActions ? createActionsForWatch(watch) : watch; - if (!watchData.isNew) { - return validateActionsAndSaveWatch(watch); - } - try { - const existingWatch = await loadWatch(watchData.id); - if (existingWatch) { - return { - validationError: { - type: 'warning', - title: i18n.translate( - 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.existingWatchTitleText', - { - defaultMessage: 'A watch with this ID already exists', - } - ), - message: i18n.translate( - 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.existingWatchDescriptionText', - { - defaultMessage: 'Saving this watch will overwrite previous content.', - } - ), - buttonLabel: i18n.translate( - 'xpack.watcher.sections.watchEdit.json.saveConfirmModal.existingWatchButtonLabel', - { - defaultMessage: 'Overwrite', - } - ), - buttonType: 'danger', + error: { + data: { + message: actionsErrors, + error: 'validation', + }, }, }; } - } catch (error) { - // Confirms watcher does not already exist - if (error.status === 404) { - return validateActionsAndSaveWatch(watchData); - } - return toastNotifications.addDanger(error.data.message); + return saveWatch(watchData); } + return saveWatch(watchData); } diff --git a/x-pack/plugins/watcher/server/routes/api/watch/register_save_route.js b/x-pack/plugins/watcher/server/routes/api/watch/register_save_route.js index 3434a0ab559f28..5744f7e643b3dc 100644 --- a/x-pack/plugins/watcher/server/routes/api/watch/register_save_route.js +++ b/x-pack/plugins/watcher/server/routes/api/watch/register_save_route.js @@ -7,9 +7,15 @@ import { callWithRequestFactory } from '../../../lib/call_with_request_factory'; import { Watch } from '../../../models/watch'; import { isEsErrorFactory } from '../../../lib/is_es_error_factory'; -import { wrapEsError, wrapUnknownError } from '../../../lib/error_wrappers'; +import { wrapEsError, wrapUnknownError, wrapCustomError } from '../../../lib/error_wrappers'; import { licensePreRoutingFactory } from'../../../lib/license_pre_routing_factory'; +function fetchWatch(callWithRequest, watchId) { + return callWithRequest('watcher.getWatch', { + id: watchId + }); +} + function saveWatch(callWithRequest, watch) { return callWithRequest('watcher.putWatch', { id: watch.id, @@ -25,12 +31,35 @@ export function registerSaveRoute(server) { server.route({ path: '/api/watcher/watch/{id}', method: 'PUT', - handler: (request) => { + handler: async (request) => { const callWithRequest = callWithRequestFactory(server, request); + const watchPayload = request.payload; + + // For new watches, verify watch with the same ID doesn't already exist + if (watchPayload.isNew) { + const conflictError = wrapCustomError( + new Error(`There is already a watch with ID '${watchPayload.id}'.`), + 409 + ); + + try { + const existingWatch = await fetchWatch(callWithRequest, watchPayload.id); + + if (existingWatch.found) { + throw conflictError; + } + } catch (e) { + // Rethrow conflict error but silently swallow all others + if (e === conflictError) { + throw e; + } + } + } - const watch = Watch.fromDownstreamJson(request.payload); + const watchFromDownstream = Watch.fromDownstreamJson(watchPayload); - return saveWatch(callWithRequest, watch.upstreamJson) + // Create new watch + return saveWatch(callWithRequest, watchFromDownstream.upstreamJson) .catch(err => { // Case: Error from Elasticsearch JS client if (isEsError(err)) { diff --git a/x-pack/test/functional/apps/watcher/watcher_test.js b/x-pack/test/functional/apps/watcher/watcher_test.js index 3c7e24196d79be..7477e9554af872 100644 --- a/x-pack/test/functional/apps/watcher/watcher_test.js +++ b/x-pack/test/functional/apps/watcher/watcher_test.js @@ -21,8 +21,7 @@ export default function ({ getService, getPageObjects }) { describe('watcher_test', function () { before('initialize tests', async () => { await browser.setWindowSize(1600, 1000); - await PageObjects.common.navigateToApp('settings'); - await testSubjects.click('watcher'); + await PageObjects.common.navigateToApp('watcher'); await PageObjects.watcher.clearAllWatches(); }); @@ -33,22 +32,20 @@ export default function ({ getService, getPageObjects }) { expect(watch.name).to.be(watchName); }); - it('should prompt user to check to see if you can override a watch with a sameID', async () => { + it('should not allow a user to save a watch with the same ID', async () => { await PageObjects.watcher.createWatch(watchID, updatedName); - const modal = await testSubjects.find('confirmModalBodyText'); - const modalText = await modal.getVisibleText(); - expect(modalText).to.be('Saving this watch will overwrite previous content.'); - await testSubjects.click('confirmModalConfirmButton'); - const watch = await PageObjects.watcher.getWatch(watchID); - expect(watch.id).to.be(watchID); - expect(watch.name).to.be(updatedName); + const errorCallout = await testSubjects.find('sectionErrorMessage'); + const errorCalloutText = await errorCallout.getVisibleText(); + expect(errorCalloutText).to.be(`There is already a watch with ID '${watchID}'.`); }); //delete the watch it('should delete the watch', async () => { + // Navigate to the main list page + await PageObjects.common.navigateToApp('watcher'); const watchList = indexBy(await PageObjects.watcher.getWatches(), 'id'); log.debug(watchList); - expect(watchList.watchID.name).to.eql([updatedName]); + expect(watchList.watchID.name).to.eql([watchName]); await PageObjects.watcher.deleteWatch(watchID); await testSubjects.click('confirmModalConfirmButton'); await PageObjects.header.waitUntilLoadingHasFinished(); diff --git a/x-pack/test/functional/config.js b/x-pack/test/functional/config.js index 49afcff14a8bbc..a294db79a3af03 100644 --- a/x-pack/test/functional/config.js +++ b/x-pack/test/functional/config.js @@ -272,7 +272,11 @@ export default async function ({ readConfigFile }) { }, apm: { pathname: '/app/apm', - } + }, + watcher: { + pathname: '/app/kibana', + hash: '/management/elasticsearch/watcher/watches/', + }, }, // choose where esArchiver should load archives from From 7cf0cc2ef2ce593650f92eb8563353877b32918a Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 11 Jun 2019 08:38:32 -0400 Subject: [PATCH 31/51] address watcher bugs (#38442) --- .../watcher/common/constants/plugin.ts | 4 +- .../watcher/common/types/action_types.ts | 2 + x-pack/plugins/watcher/plugin_definition.js | 2 +- x-pack/plugins/watcher/public/app.js | 4 +- .../public/models/action/webhook_action.js | 27 ++++++++++ .../models/execute_details/execute_details.js | 8 ++- .../monitoring_watch_edit.tsx | 53 ++++++++++--------- .../action_fields/webhook_action_fields.tsx | 52 +++++++++++++++++- .../threshold_watch_action_accordion.tsx | 2 +- .../watch_status/components/watch_detail.tsx | 3 +- .../server/models/action/webhook_action.js | 44 ++++++++++++--- 11 files changed, 157 insertions(+), 44 deletions(-) diff --git a/x-pack/plugins/watcher/common/constants/plugin.ts b/x-pack/plugins/watcher/common/constants/plugin.ts index 58ecf7a2cc80b0..a4279a0dd0c414 100644 --- a/x-pack/plugins/watcher/common/constants/plugin.ts +++ b/x-pack/plugins/watcher/common/constants/plugin.ts @@ -9,8 +9,8 @@ import { LICENSE_TYPE_GOLD, LicenseType } from '../../../../common/constants'; export const PLUGIN = { ID: 'watcher', MINIMUM_LICENSE_REQUIRED: LICENSE_TYPE_GOLD as LicenseType, - getI18nName: (translate: (key: string, config: object) => string): string => { - return translate('xpack.watcher.appName', { + getI18nName: (i18n: any): string => { + return i18n.translate('xpack.watcher.appName', { defaultMessage: 'Watcher', }); }, diff --git a/x-pack/plugins/watcher/common/types/action_types.ts b/x-pack/plugins/watcher/common/types/action_types.ts index 253ab31f69523b..8247df3293d175 100644 --- a/x-pack/plugins/watcher/common/types/action_types.ts +++ b/x-pack/plugins/watcher/common/types/action_types.ts @@ -58,6 +58,8 @@ export interface WebhookAction extends BaseAction { port: number; path?: string; body?: string; + username?: string; + password?: string; } export interface SlackAction extends BaseAction { diff --git a/x-pack/plugins/watcher/plugin_definition.js b/x-pack/plugins/watcher/plugin_definition.js index 57daec0b1b0b87..4a5946cc4974d1 100644 --- a/x-pack/plugins/watcher/plugin_definition.js +++ b/x-pack/plugins/watcher/plugin_definition.js @@ -31,7 +31,7 @@ export const pluginDefinition = { registerLicenseChecker( server, PLUGIN.ID, - PLUGIN.getI18nName(i18n.translate), + PLUGIN.getI18nName(i18n), PLUGIN.MINIMUM_LICENSE_REQUIRED ); diff --git a/x-pack/plugins/watcher/public/app.js b/x-pack/plugins/watcher/public/app.js index cd3e2e027c923e..b206348547966d 100644 --- a/x-pack/plugins/watcher/public/app.js +++ b/x-pack/plugins/watcher/public/app.js @@ -78,10 +78,10 @@ export const App = ({ licenseStatus }) => { // Export this so we can test it with a different router. export const AppWithoutRouter = () => ( - - + + ); diff --git a/x-pack/plugins/watcher/public/models/action/webhook_action.js b/x-pack/plugins/watcher/public/models/action/webhook_action.js index c675cbb847cde5..c639648591d77f 100644 --- a/x-pack/plugins/watcher/public/models/action/webhook_action.js +++ b/x-pack/plugins/watcher/public/models/action/webhook_action.js @@ -20,6 +20,8 @@ export class WebhookAction extends BaseAction { this.host = get(props, 'host'); this.port = get(props, 'port'); this.path = get(props, 'path'); + this.username = get(props, 'username'); + this.password = get(props, 'password'); this.contentType = get(props, 'contentType'); this.fullPath = `${this.host}:${this.port}${this.path}`; @@ -30,6 +32,8 @@ export class WebhookAction extends BaseAction { host: [], port: [], body: [], + username: [], + password: [], }; if (!this.host) { @@ -39,6 +43,7 @@ export class WebhookAction extends BaseAction { }) ); } + if (!this.port) { errors.port.push( i18n.translate('xpack.watcher.watchActions.webhook.portIsRequiredValidationMessage', { @@ -46,6 +51,7 @@ export class WebhookAction extends BaseAction { }) ); } + if (this.contentType === 'application/json' && typeof this.body === 'string' && this.body !== '') { try { const parsedJson = JSON.parse(this.body); @@ -60,6 +66,25 @@ export class WebhookAction extends BaseAction { })); } } + + // Password is required if username specified + if (this.username && !this.password) { + errors.password.push( + i18n.translate('xpack.watcher.watchActions.webhook.passwordIsRequiredIfUsernameValidationMessage', { + defaultMessage: 'Password is required.', + }) + ); + } + + // Username is required if password is specified + if (this.password && !this.username) { + errors.username.push( + i18n.translate('xpack.watcher.watchActions.webhook.usernameIsRequiredIfPasswordValidationMessage', { + defaultMessage: 'Username is required.', + }) + ); + } + return errors; } @@ -72,6 +97,8 @@ export class WebhookAction extends BaseAction { port: this.port, path: this.path, body: this.body, + username: this.username, + password: this.password, webhook: { host: this.host, port: this.port, diff --git a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js index 8f7dd5d0e62ea5..27eb99fbf13066 100644 --- a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js +++ b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js @@ -47,8 +47,12 @@ export class ExecuteDetails { } get upstreamJson() { - const triggeredTime = this.triggeredTimeValue !== '' ? getDateMathFormat(this.triggeredTimeUnit, this.triggeredTimeValue) : undefined; - const scheduledTime = this.scheduledTimeValue !== '' ? getDateMathFormat(this.scheduledTimeUnit, this.scheduledTimeValue) : undefined; + const triggeredTime = this.triggeredTimeValue && this.triggeredTimeValue !== '' + ? getDateMathFormat(this.triggeredTimeUnit, this.triggeredTimeValue) + : undefined; + const scheduledTime = this.scheduledTimeTime && this.scheduledTimeValue !== '' + ? getDateMathFormat(this.scheduledTimeUnit, this.scheduledTimeValue) + : undefined; return { triggerData: { diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx index 1a42ffa8b22189..959e6bccd33826 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx @@ -16,13 +16,37 @@ import { EuiText, EuiLink, } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import { injectI18n, FormattedMessage } from '@kbn/i18n/react'; import { WatchContext } from '../../watch_context'; const MonitoringWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { const { watch } = useContext(WatchContext); + const systemWatchTitle = ( + + ); + + const systemWatchMessage = ( + + + + ), + }} + /> + ); + return ( @@ -33,32 +57,9 @@ const MonitoringWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { - + -

- - - - ), - }} - /> -

+

{systemWatchMessage}

diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx index cf7928db843635..f2a32a92dfb136 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx @@ -8,6 +8,7 @@ import React, { Fragment, useEffect } from 'react'; import { EuiCodeEditor, EuiFieldNumber, + EuiFieldPassword, EuiFieldText, EuiFormRow, EuiSelect, @@ -35,7 +36,7 @@ export const WebhookActionFields: React.FunctionComponent = ({ errors, hasErrors, }) => { - const { method, host, port, path, body } = action; + const { method, host, port, path, body, username, password } = action; useEffect(() => { editAction({ key: 'contentType', value: 'application/json' }); // set content-type for threshold watch to json by default @@ -156,6 +157,54 @@ export const WebhookActionFields: React.FunctionComponent = ({ + + + + { + editAction({ key: 'username', value: e.target.value }); + }} + /> + + + + + + { + editAction({ key: 'password', value: e.target.value }); + }} + /> + + + + = ({ fullWidth mode="json" width="100%" + height="200px" theme="github" aria-label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.webhookAction.bodyCodeEditorAriaLabel', diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx index 8bab0ab2c5d9a7..2980ea9ecaaa26 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx @@ -85,7 +85,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ return ( { id: watchId, watchErrors: { actionErrors }, watchStatus: { actionStatuses: currentActionStatuses }, + isSystemWatch, } = watchDetail; const hasActionErrors = actionErrors && Object.keys(actionErrors).length > 0; @@ -113,7 +114,7 @@ const WatchDetailUi = () => { const actionColumn = { actions: [ { - available: (action: ActionStatus) => action.isAckable, + available: (action: ActionStatus) => action.isAckable && !isSystemWatch, render: (action: ActionStatus) => { const { id: actionId } = action; return ( diff --git a/x-pack/plugins/watcher/server/models/action/webhook_action.js b/x-pack/plugins/watcher/server/models/action/webhook_action.js index c9463b0d64725d..72cea919db358d 100644 --- a/x-pack/plugins/watcher/server/models/action/webhook_action.js +++ b/x-pack/plugins/watcher/server/models/action/webhook_action.js @@ -19,6 +19,8 @@ export class WebhookAction extends BaseAction { this.path = props.path; this.body = props.body; this.contentType = props.contentType; + this.username = props.username; + this.password = props.password; } // To Kibana @@ -31,6 +33,7 @@ export class WebhookAction extends BaseAction { path: this.path, body: this.body, contentType: this.contentType, + username: this.username, }); return result; } @@ -47,6 +50,8 @@ export class WebhookAction extends BaseAction { path: json.path, body: json.body, contentType: json.contentType, + username: json.username, + password: json.password, }); const action = new WebhookAction(props, errors); @@ -58,21 +63,34 @@ export class WebhookAction extends BaseAction { const result = super.upstreamJson; const optionalFields = {}; + if (this.path) { optionalFields.path = this.path; } + if (this.method) { optionalFields.method = this.method; } + if (this.body) { optionalFields.body = this.body; } + if (this.contentType) { optionalFields.headers = { 'Content-Type': this.contentType, }; } + if (this.username && this.password) { + optionalFields.auth = { + basic: { + username: this.username, + password: this.password, + }, + }; + } + result[this.id] = { webhook: { host: this.host, @@ -87,21 +105,31 @@ export class WebhookAction extends BaseAction { // From Elasticsearch static fromUpstreamJson(json) { const props = super.getPropsFromUpstreamJson(json); + const webhookJson = json && json.actionJson && json.actionJson.webhook; const { errors } = this.validateJson(json.actionJson); + const { path, method, body, auth, headers } = webhookJson; + const optionalFields = {}; - if (json.actionJson.webhook.path) { - optionalFields.path = json.actionJson.webhook.path; + if (path) { + optionalFields.path = path; + } + + if (method) { + optionalFields.method = method; } - if (json.actionJson.webhook.method) { - optionalFields.method = json.actionJson.webhook.method; + + if (body) { + optionalFields.body = body; } - if (json.actionJson.webhook.body) { - optionalFields.body = json.actionJson.webhook.body; + + if (headers['Content-Type']) { + optionalFields.contentType = headers['Content-Type']; } - if (json.actionJson.webhook.headers['Content-Type']) { - optionalFields.contentType = json.actionJson.webhook.headers['Content-Type']; + + if (auth && auth.basic) { + optionalFields.username = auth.basic.username; } Object.assign(props, { From 09f78d86e1c19d9f2642deb53d69b05abd2ff0ba Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 18 Jun 2019 14:27:35 -0400 Subject: [PATCH 32/51] remove @elastic/charts style.css import --- .../components/threshold_watch_edit/watch_visualization.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx index 739e04a6d04deb..12fb2f795cc058 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx @@ -5,7 +5,6 @@ */ import React, { Fragment, useContext, useEffect, useState } from 'react'; -import '@elastic/charts/dist/style.css'; import { AnnotationDomainTypes, Axis, From 667eb57622d89b3e5cb8f161a4c2d93316da556d Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 18 Jun 2019 21:03:39 -0400 Subject: [PATCH 33/51] fix lint error --- x-pack/typings/@elastic/eui/index.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/typings/@elastic/eui/index.d.ts b/x-pack/typings/@elastic/eui/index.d.ts index e1992c77377c3f..fccbd4a343f7e3 100644 --- a/x-pack/typings/@elastic/eui/index.d.ts +++ b/x-pack/typings/@elastic/eui/index.d.ts @@ -11,7 +11,6 @@ declare module '@elastic/eui' { export const EuiCodeEditor: React.SFC; export const Query: any; export const EuiCard: any; - export const EuiSuperSelect: React.SFC; } declare module '@elastic/eui/lib/services/format' { From bc6874afbb377b053cab802b79c16aa09e2f5d24 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 18 Jun 2019 22:13:18 -0400 Subject: [PATCH 34/51] update watcher copy (#39200) --- .../components/delete_watches_modal.tsx | 2 +- .../public/models/action/email_action.js | 4 +- .../public/models/action/index_action.js | 2 +- .../public/models/action/jira_action.js | 4 +- .../public/models/action/logging_action.js | 4 +- .../public/models/action/pagerduty_action.js | 4 +- .../public/models/action/slack_action.js | 2 +- .../public/models/action/webhook_action.js | 4 +- .../public/models/watch/threshold_watch.js | 16 +++---- .../json_watch_edit/json_watch_edit_form.tsx | 6 +-- .../json_watch_edit_simulate.tsx | 4 +- .../threshold_watch_action_accordion.tsx | 4 +- .../threshold_watch_action_dropdown.tsx | 2 +- .../threshold_watch_action_panel.tsx | 2 +- .../threshold_watch_edit.tsx | 10 ++--- .../watch_list/components/watch_list.tsx | 43 +++++++++---------- .../watch_status/components/watch_detail.tsx | 4 +- .../watch_status/components/watch_status.tsx | 2 +- .../watcher/server/models/action/action.js | 4 +- .../server/models/action/base_action.js | 2 +- .../server/models/action/email_action.js | 4 +- .../server/models/action/index_action.js | 4 +- .../server/models/action/jira_action.js | 8 ++-- .../server/models/action/logging_action.js | 4 +- .../server/models/action/pagerduty_action.js | 4 +- .../server/models/action/slack_action.js | 4 +- .../server/models/action/unknown_action.js | 2 +- .../server/models/action/webhook_action.js | 4 +- .../models/action_status/action_status.js | 4 +- .../watcher/server/models/fields/fields.js | 2 +- .../watcher/server/models/watch/base_watch.js | 6 +-- .../watcher/server/models/watch/watch.js | 4 +- .../watch_history_item/watch_history_item.js | 6 +-- .../models/watch_status/watch_status.js | 4 +- 34 files changed, 92 insertions(+), 93 deletions(-) diff --git a/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx index 93892f52774348..dcb17d82f7a1fd 100644 --- a/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx +++ b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx @@ -24,7 +24,7 @@ export const DeleteWatchesModal = ({ 'xpack.watcher.deleteSelectedWatchesConfirmModal.descriptionText', { defaultMessage: - 'This will permanently delete {numWatchesToDelete, plural, one {a watch} other {# watches}}. You can’t recover a deleted watch.', + "You can't recover {numWatchesToDelete, plural, one {a deleted watch} other {deleted watches}}.", values: { numWatchesToDelete }, } ); diff --git a/x-pack/plugins/watcher/public/models/action/email_action.js b/x-pack/plugins/watcher/public/models/action/email_action.js index bca78e580a7746..9d199de0fe2967 100644 --- a/x-pack/plugins/watcher/public/models/action/email_action.js +++ b/x-pack/plugins/watcher/public/models/action/email_action.js @@ -101,9 +101,9 @@ export class EmailAction extends BaseAction { }); static iconClass = 'email'; static selectMessage = i18n.translate('xpack.watcher.models.emailAction.selectMessageText', { - defaultMessage: 'Send out an email from your server.', + defaultMessage: 'Send an email from your server.', }); static simulatePrompt = i18n.translate('xpack.watcher.models.emailAction.simulateButtonLabel', { - defaultMessage: 'Test fire an email now' + defaultMessage: 'Send test email' }); } diff --git a/x-pack/plugins/watcher/public/models/action/index_action.js b/x-pack/plugins/watcher/public/models/action/index_action.js index c254f2a63586a4..7276ef59a3fc35 100644 --- a/x-pack/plugins/watcher/public/models/action/index_action.js +++ b/x-pack/plugins/watcher/public/models/action/index_action.js @@ -76,6 +76,6 @@ export class IndexAction extends BaseAction { defaultMessage: 'Index data into Elasticsearch.', }); static simulatePrompt = i18n.translate('xpack.watcher.models.indexAction.simulateButtonLabel', { - defaultMessage: 'Index data now', + defaultMessage: 'Index data', }); } diff --git a/x-pack/plugins/watcher/public/models/action/jira_action.js b/x-pack/plugins/watcher/public/models/action/jira_action.js index 0dc90560b65c49..7e3839ea93b974 100644 --- a/x-pack/plugins/watcher/public/models/action/jira_action.js +++ b/x-pack/plugins/watcher/public/models/action/jira_action.js @@ -98,9 +98,9 @@ export class JiraAction extends BaseAction { }); static iconClass = 'apps'; static selectMessage = i18n.translate('xpack.watcher.models.jiraAction.selectMessageText', { - defaultMessage: 'Create issues in Atlassian’s Jira Software.', + defaultMessage: 'Create an issue in Atlassian’s Jira Software.', }); static simulatePrompt = i18n.translate('xpack.watcher.models.jiraAction.simulateButtonLabel', { - defaultMessage: 'Create a sample Jira issue now' + defaultMessage: 'Create a sample Jira issue' }); } diff --git a/x-pack/plugins/watcher/public/models/action/logging_action.js b/x-pack/plugins/watcher/public/models/action/logging_action.js index 07aae9470a5df8..e11ebedc874c07 100644 --- a/x-pack/plugins/watcher/public/models/action/logging_action.js +++ b/x-pack/plugins/watcher/public/models/action/logging_action.js @@ -70,9 +70,9 @@ export class LoggingAction extends BaseAction { }); static iconClass = 'loggingApp'; static selectMessage = i18n.translate('xpack.watcher.models.loggingAction.selectMessageText', { - defaultMessage: 'Add a new item to the logs.', + defaultMessage: 'Add an item to the logs.', }); static simulatePrompt = i18n.translate('xpack.watcher.models.loggingAction.simulateButtonLabel', { - defaultMessage: 'Log a sample message now', + defaultMessage: 'Log a sample message', }); } diff --git a/x-pack/plugins/watcher/public/models/action/pagerduty_action.js b/x-pack/plugins/watcher/public/models/action/pagerduty_action.js index 55008997209840..e825cf1f262fc8 100644 --- a/x-pack/plugins/watcher/public/models/action/pagerduty_action.js +++ b/x-pack/plugins/watcher/public/models/action/pagerduty_action.js @@ -71,10 +71,10 @@ export class PagerDutyAction extends BaseAction { }); static iconClass = 'apps'; static selectMessage = i18n.translate('xpack.watcher.models.pagerDutyAction.selectMessageText', { - defaultMessage: 'Create events in PagerDuty.', + defaultMessage: 'Create an event in PagerDuty.', }); static simulatePrompt = i18n.translate('xpack.watcher.models.pagerDutyAction.simulateButtonLabel', { - defaultMessage: 'Test fire a PagerDuty event' + defaultMessage: 'Send a PagerDuty event' }); } diff --git a/x-pack/plugins/watcher/public/models/action/slack_action.js b/x-pack/plugins/watcher/public/models/action/slack_action.js index ec11e5c10c8181..da0f3cf5fb0c7d 100644 --- a/x-pack/plugins/watcher/public/models/action/slack_action.js +++ b/x-pack/plugins/watcher/public/models/action/slack_action.js @@ -85,6 +85,6 @@ export class SlackAction extends BaseAction { defaultMessage: 'Send a message to a Slack user or channel.' }); static simulatePrompt = i18n.translate('xpack.watcher.models.slackAction.simulateButtonLabel', { - defaultMessage: 'Send a sample message now' + defaultMessage: 'Send a sample message' }); } diff --git a/x-pack/plugins/watcher/public/models/action/webhook_action.js b/x-pack/plugins/watcher/public/models/action/webhook_action.js index c639648591d77f..0eea87d6212b2b 100644 --- a/x-pack/plugins/watcher/public/models/action/webhook_action.js +++ b/x-pack/plugins/watcher/public/models/action/webhook_action.js @@ -135,9 +135,9 @@ export class WebhookAction extends BaseAction { }); static iconClass = 'logoWebhook'; static selectMessage = i18n.translate('xpack.watcher.models.webhookAction.selectMessageText', { - defaultMessage: 'Send a request to any web service.', + defaultMessage: 'Send a request to a web service.', }); static simulatePrompt = i18n.translate('xpack.watcher.models.webhookAction.simulateButtonLabel', { - defaultMessage: 'Send request now', + defaultMessage: 'Send request', }); } diff --git a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js index 9153e21f029c7e..3b7ed15f58af8c 100644 --- a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js @@ -75,7 +75,7 @@ export class ThresholdWatch extends BaseWatch { const staticPart = i18n.translate( 'xpack.watcher.models.thresholdWatch.sendAlertOnSpecificConditionTitleDescription', { - defaultMessage: 'Send an alert when a specific condition is met.', + defaultMessage: 'Send an alert when your specified condition is met.', } ); if (isNaN(this.triggerIntervalSize)) { @@ -86,7 +86,7 @@ export class ThresholdWatch extends BaseWatch { const dynamicPartText = i18n.translate( 'xpack.watcher.models.thresholdWatch.thresholdWatchIntervalTitleDescription', { - defaultMessage: 'This will run every {triggerIntervalSize} {timeUnitLabel}.', + defaultMessage: 'Your watch will run every {triggerIntervalSize} {timeUnitLabel}.', values: { triggerIntervalSize: this.triggerIntervalSize, timeUnitLabel, @@ -111,7 +111,7 @@ export class ThresholdWatch extends BaseWatch { if (!this.name) { errors.name.push( i18n.translate('xpack.watcher.sections.watchEdit.threshold.error.requiredNameText', { - defaultMessage: 'Name is required', + defaultMessage: 'Name is required.', }) ); } @@ -120,7 +120,7 @@ export class ThresholdWatch extends BaseWatch { i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.enterOneOrMoreIndicesValidationMessage', { - defaultMessage: 'Enter one or more indices', + defaultMessage: 'Enter one or more indices.', } ) ); @@ -134,7 +134,7 @@ export class ThresholdWatch extends BaseWatch { i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.invalidIndexValidationMessage', { - defaultMessage: 'Your index query does not have an associated time field', + defaultMessage: 'Index does not have a time field.', } ) ); @@ -174,7 +174,7 @@ export class ThresholdWatch extends BaseWatch { i18n.translate( 'xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage', { - defaultMessage: 'Please select a field', + defaultMessage: 'This field is required.', } ) ); @@ -196,7 +196,7 @@ export class ThresholdWatch extends BaseWatch { i18n.translate( 'xpack.watcher.thresholdWatchExpression.groupBy.requiredFieldValidationMessage', { - defaultMessage: 'Please select a field.', + defaultMessage: 'This field is required.', } ) ); @@ -219,7 +219,7 @@ export class ThresholdWatch extends BaseWatch { errors.threshold1.push(i18n.translate( 'xpack.watcher.thresholdWatchExpression.thresholdLevel.secondValueMustBeGreaterMessage', { - defaultMessage: 'This value must be greater than {lowerBound}.', + defaultMessage: 'Value must be greater than {lowerBound}.', values: { lowerBound: this.threshold[0] } diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx index e185dc62920bb2..ddfff9d8506593 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx @@ -130,7 +130,7 @@ export const JsonWatchEditForm = () => { ( {i18n.translate('xpack.watcher.sections.watchEdit.json.form.watchJsonDocLink', { - defaultMessage: 'Syntax', + defaultMessage: 'API syntax', })} ) @@ -189,12 +189,12 @@ export const JsonWatchEditForm = () => { {watch.isNew ? ( ) : ( )} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx index 09f1950c1c8d17..cd9864b1e11071 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx @@ -153,7 +153,7 @@ export const JsonWatchEditSimulate = ({

{i18n.translate('xpack.watcher.sections.watchEdit.simulate.pageDescription', { defaultMessage: - 'Use the simulator to override the watch schedule, input results, conditions, and actions.', + 'Use the simulator to override the watch schedule, condition, actions, and input results.', })}

@@ -172,7 +172,7 @@ export const JsonWatchEditSimulate = ({ description={i18n.translate( 'xpack.watcher.sections.watchEdit.simulate.form.triggerOverridesDescription', { - defaultMessage: 'Schedule the time and date for starting the watch.', + defaultMessage: 'Set the time and date for starting the watch.', } )} > diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx index 2980ea9ecaaa26..06c917f144e62f 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx @@ -161,7 +161,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ title={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.actions.actionConfigurationWarningTitleText', { - defaultMessage: 'Account may not be configured.', + defaultMessage: 'Account may not be configured', } )} color="warning" @@ -171,7 +171,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({

= ({ actionErrors

{i18n.translate('xpack.watcher.sections.watchEdit.actions.title', { defaultMessage: - 'Will perform {watchActionsCount, plural, one{# action} other {# actions}} once met', + 'Perform {watchActionsCount, plural, one{# action} other {# actions}} when condition is met', values: { watchActionsCount: watch.actions.length, }, diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index 50eba55f09ebf2..962fa03883834b 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -179,7 +179,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit const expressionErrorMessage = i18n.translate( 'xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage', { - defaultMessage: 'Your expression has errors.', + defaultMessage: 'Expression contains errors.', } ); const expressionFields = [ @@ -269,7 +269,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit helpText={ } > @@ -396,7 +396,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit

@@ -851,12 +851,12 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit {watch.isNew ? ( ) : ( )} diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 7109202d9ac71b..208d883a219c56 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -68,14 +68,10 @@ const WatchListUi = () => { ); const watcherDescriptionText = ( - -

- -

-
+ ); const createWatchContextMenu = ( @@ -129,7 +125,7 @@ const WatchListUi = () => { @@ -148,7 +144,7 @@ const WatchListUi = () => { @@ -171,16 +167,17 @@ const WatchListUi = () => { if (availableWatches && availableWatches.length === 0) { const emptyPromptBody = ( - - {watcherDescriptionText} - {''} - - - - + +

+ {watcherDescriptionText}{' '} + + + +

+
); return ( @@ -191,7 +188,7 @@ const WatchListUi = () => {

} @@ -446,7 +443,9 @@ const WatchListUi = () => { - {watcherDescriptionText} + +

{watcherDescriptionText}

+
diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index ab0cfc311191b9..db6d4e2a94682d 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -122,7 +122,7 @@ const WatchDetailUi = () => { content={i18n.translate( 'xpack.watcher.sections.watchDetail.watchTable.ackActionCellTooltipTitle', { - defaultMessage: 'Acknowledge this watch action', + defaultMessage: 'Acknowledge watch action.', } )} > @@ -192,7 +192,7 @@ const WatchDetailUi = () => { } > diff --git a/x-pack/plugins/watcher/server/models/action/action.js b/x-pack/plugins/watcher/server/models/action/action.js index c25cbfd0256d8d..09bc3316dcb363 100644 --- a/x-pack/plugins/watcher/server/models/action/action.js +++ b/x-pack/plugins/watcher/server/models/action/action.js @@ -38,7 +38,7 @@ export class Action { if (!json.id) { throw badRequest( i18n.translate('xpack.watcher.models.actionStatus.idPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {id} property', + defaultMessage: 'JSON argument must contain an {id} property', values: { id: 'id' } @@ -49,7 +49,7 @@ export class Action { if (!json.actionJson) { throw badRequest( i18n.translate('xpack.watcher.models.action.actionJsonPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJson} property', + defaultMessage: 'JSON argument must contain an {actionJson} property', values: { actionJson: 'actionJson' } diff --git a/x-pack/plugins/watcher/server/models/action/base_action.js b/x-pack/plugins/watcher/server/models/action/base_action.js index 0500a4a451ac8e..31d8b39b5b1c05 100644 --- a/x-pack/plugins/watcher/server/models/action/base_action.js +++ b/x-pack/plugins/watcher/server/models/action/base_action.js @@ -38,7 +38,7 @@ export class BaseAction { if (!json.id) { throw badRequest( i18n.translate('xpack.watcher.models.baseAction.idPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {id} property', + defaultMessage: 'JSON argument must contain an {id} property', values: { id: 'id' } diff --git a/x-pack/plugins/watcher/server/models/action/email_action.js b/x-pack/plugins/watcher/server/models/action/email_action.js index e2151b207a8420..42428ddfc69089 100644 --- a/x-pack/plugins/watcher/server/models/action/email_action.js +++ b/x-pack/plugins/watcher/server/models/action/email_action.js @@ -98,7 +98,7 @@ export class EmailAction extends BaseAction { if (!json.email) { const message = i18n.translate('xpack.watcher.models.emailAction.actionJsonEmailPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonEmail} property', + defaultMessage: 'JSON argument must contain an {actionJsonEmail} property', values: { actionJsonEmail: 'actionJson.email' } @@ -114,7 +114,7 @@ export class EmailAction extends BaseAction { if (!json.email.to) { const message = i18n.translate('xpack.watcher.models.emailAction.actionJsonEmailToPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonEmailTo} property', + defaultMessage: 'JSON argument must contain an {actionJsonEmailTo} property', values: { actionJsonEmailTo: 'actionJson.email.to' } diff --git a/x-pack/plugins/watcher/server/models/action/index_action.js b/x-pack/plugins/watcher/server/models/action/index_action.js index 692737456faa13..5bfd4335067ec1 100644 --- a/x-pack/plugins/watcher/server/models/action/index_action.js +++ b/x-pack/plugins/watcher/server/models/action/index_action.js @@ -69,7 +69,7 @@ export class IndexAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.indexAction.actionJsonIndexPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonIndex} property', + defaultMessage: 'JSON argument must contain an {actionJsonIndex} property', values: { actionJsonIndex: 'actionJson.index' } @@ -83,7 +83,7 @@ export class IndexAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.loggingAction.actionJsonIndexNamePropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonIndexName} property', + defaultMessage: 'JSON argument must contain an {actionJsonIndexName} property', values: { actionJsonIndexName: 'actionJson.index.index' } diff --git a/x-pack/plugins/watcher/server/models/action/jira_action.js b/x-pack/plugins/watcher/server/models/action/jira_action.js index 49b619e6428372..0a53258fe1bb66 100644 --- a/x-pack/plugins/watcher/server/models/action/jira_action.js +++ b/x-pack/plugins/watcher/server/models/action/jira_action.js @@ -89,7 +89,7 @@ export class JiraAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.jiraAction.actionJsonJiraPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonJira} property', + defaultMessage: 'JSON argument must contain an {actionJsonJira} property', values: { actionJsonJira: 'actionJson.jira' } @@ -103,7 +103,7 @@ export class JiraAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.jiraAction.actionJsonJiraProjectKeyPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonJiraProjectKey} property', + defaultMessage: 'JSON argument must contain an {actionJsonJiraProjectKey} property', values: { actionJsonJiraProjectKey: 'actionJson.jira.fields.project.key' } @@ -115,7 +115,7 @@ export class JiraAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.jiraAction.actionJsonJiraIssueTypePropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonJiraIssueType} property', + defaultMessage: 'JSON argument must contain an {actionJsonJiraIssueType} property', values: { actionJsonJiraIssueType: 'actionJson.jira.fields.issuetype.name' } @@ -127,7 +127,7 @@ export class JiraAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.jiraAction.actionJsonJiraSummaryPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonJiraSummary} property', + defaultMessage: 'JSON argument must contain an {actionJsonJiraSummary} property', values: { actionJsonJiraSummary: 'actionJson.jira.fields.summary' } diff --git a/x-pack/plugins/watcher/server/models/action/logging_action.js b/x-pack/plugins/watcher/server/models/action/logging_action.js index b65288ef87f834..92ba94dca84ff8 100644 --- a/x-pack/plugins/watcher/server/models/action/logging_action.js +++ b/x-pack/plugins/watcher/server/models/action/logging_action.js @@ -72,7 +72,7 @@ export class LoggingAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.loggingAction.actionJsonLoggingPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonLogging} property', + defaultMessage: 'JSON argument must contain an {actionJsonLogging} property', values: { actionJsonLogging: 'actionJson.logging' } @@ -86,7 +86,7 @@ export class LoggingAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.loggingAction.actionJsonLoggingTextPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonLoggingText} property', + defaultMessage: 'JSON argument must contain an {actionJsonLoggingText} property', values: { actionJsonLoggingText: 'actionJson.logging.text' } diff --git a/x-pack/plugins/watcher/server/models/action/pagerduty_action.js b/x-pack/plugins/watcher/server/models/action/pagerduty_action.js index 6ded2e4f0422bd..edfdb33584170a 100644 --- a/x-pack/plugins/watcher/server/models/action/pagerduty_action.js +++ b/x-pack/plugins/watcher/server/models/action/pagerduty_action.js @@ -72,7 +72,7 @@ export class PagerDutyAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.pagerDutyAction.actionJsonPagerDutyPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonPagerDuty} property', + defaultMessage: 'JSON argument must contain an {actionJsonPagerDuty} property', values: { actionJsonPagerDuty: 'actionJson.pagerduty' } @@ -86,7 +86,7 @@ export class PagerDutyAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.pagerDutyAction.actionJsonPagerDutyDescriptionPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonPagerDutyText} property', + defaultMessage: 'JSON argument must contain an {actionJsonPagerDutyText} property', values: { actionJsonPagerDutyText: 'actionJson.pagerduty.description' } diff --git a/x-pack/plugins/watcher/server/models/action/slack_action.js b/x-pack/plugins/watcher/server/models/action/slack_action.js index 6c76ed6ebff3d2..4441a71eacae91 100644 --- a/x-pack/plugins/watcher/server/models/action/slack_action.js +++ b/x-pack/plugins/watcher/server/models/action/slack_action.js @@ -81,7 +81,7 @@ export class SlackAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.slackAction.actionJsonSlackPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonSlack} property', + defaultMessage: 'JSON argument must contain an {actionJsonSlack} property', values: { actionJsonSlack: 'actionJson.slack' } @@ -95,7 +95,7 @@ export class SlackAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.slackAction.actionJsonSlackMessagePropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonSlackMessage} property', + defaultMessage: 'JSON argument must contain an {actionJsonSlackMessage} property', values: { actionJsonSlackMessage: 'actionJson.slack.message' } diff --git a/x-pack/plugins/watcher/server/models/action/unknown_action.js b/x-pack/plugins/watcher/server/models/action/unknown_action.js index 858b14472a9d1e..40324a9ab2882b 100644 --- a/x-pack/plugins/watcher/server/models/action/unknown_action.js +++ b/x-pack/plugins/watcher/server/models/action/unknown_action.js @@ -68,7 +68,7 @@ export class UnknownAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.unknownAction.actionJsonPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJson} property', + defaultMessage: 'JSON argument must contain an {actionJson} property', values: { actionJson: 'actionJson' } diff --git a/x-pack/plugins/watcher/server/models/action/webhook_action.js b/x-pack/plugins/watcher/server/models/action/webhook_action.js index 72cea919db358d..766ccd5371533d 100644 --- a/x-pack/plugins/watcher/server/models/action/webhook_action.js +++ b/x-pack/plugins/watcher/server/models/action/webhook_action.js @@ -149,7 +149,7 @@ export class WebhookAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.loggingAction.actionJsonWebhookHostPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonWebhookHost} property', + defaultMessage: 'JSON argument must contain an {actionJsonWebhookHost} property', values: { actionJsonWebhookHost: 'actionJson.webhook.host' } @@ -162,7 +162,7 @@ export class WebhookAction extends BaseAction { errors.push({ code: ERROR_CODES.ERR_PROP_MISSING, message: i18n.translate('xpack.watcher.models.loggingAction.actionJsonWebhookPortPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionJsonWebhookPort} property', + defaultMessage: 'JSON argument must contain an {actionJsonWebhookPort} property', values: { actionJsonWebhookPort: 'actionJson.webhook.port' } diff --git a/x-pack/plugins/watcher/server/models/action_status/action_status.js b/x-pack/plugins/watcher/server/models/action_status/action_status.js index 89e5fff535e5e3..a7aec37d2d29db 100644 --- a/x-pack/plugins/watcher/server/models/action_status/action_status.js +++ b/x-pack/plugins/watcher/server/models/action_status/action_status.js @@ -104,7 +104,7 @@ export class ActionStatus { if (!json.id) { throw badRequest( i18n.translate('xpack.watcher.models.actionStatus.idPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {id} property', + defaultMessage: 'JSON argument must contain an {id} property', values: { id: 'id' } @@ -114,7 +114,7 @@ export class ActionStatus { if (!json.actionStatusJson) { throw badRequest( i18n.translate('xpack.watcher.models.actionStatus.actionStatusJsonPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {actionStatusJson} property', + defaultMessage: 'JSON argument must contain an {actionStatusJson} property', values: { actionStatusJson: 'actionStatusJson' } diff --git a/x-pack/plugins/watcher/server/models/fields/fields.js b/x-pack/plugins/watcher/server/models/fields/fields.js index ba3ed23711457d..fef932ee630b79 100644 --- a/x-pack/plugins/watcher/server/models/fields/fields.js +++ b/x-pack/plugins/watcher/server/models/fields/fields.js @@ -55,7 +55,7 @@ export class Fields { if (!json.fields) { throw badRequest( i18n.translate('xpack.watcher.models.fields.fieldsPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain a {fields} property', + defaultMessage: 'JSON argument must contain a {fields} property', values: { fields: 'fields' } diff --git a/x-pack/plugins/watcher/server/models/watch/base_watch.js b/x-pack/plugins/watcher/server/models/watch/base_watch.js index bfcc8737cb1906..ada4cbc2dd2b2e 100644 --- a/x-pack/plugins/watcher/server/models/watch/base_watch.js +++ b/x-pack/plugins/watcher/server/models/watch/base_watch.js @@ -94,7 +94,7 @@ export class BaseWatch { if (!json.id) { throw badRequest( i18n.translate('xpack.watcher.models.baseWatch.idPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {id} property', + defaultMessage: 'JSON argument must contain an {id} property', values: { id: 'id' } @@ -104,7 +104,7 @@ export class BaseWatch { if (!json.watchJson) { throw badRequest( i18n.translate('xpack.watcher.models.baseWatch.watchJsonPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain a {watchJson} property', + defaultMessage: 'JSON argument must contain a {watchJson} property', values: { watchJson: 'watchJson' } @@ -114,7 +114,7 @@ export class BaseWatch { if (!json.watchStatusJson) { throw badRequest( i18n.translate('xpack.watcher.models.baseWatch.watchStatusJsonPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain a {watchStatusJson} property', + defaultMessage: 'JSON argument must contain a {watchStatusJson} property', values: { watchStatusJson: 'watchStatusJson' } diff --git a/x-pack/plugins/watcher/server/models/watch/watch.js b/x-pack/plugins/watcher/server/models/watch/watch.js index 03e75a365f028d..c75afc62c4c4bc 100644 --- a/x-pack/plugins/watcher/server/models/watch/watch.js +++ b/x-pack/plugins/watcher/server/models/watch/watch.js @@ -28,7 +28,7 @@ export class Watch { if (!json.type) { throw badRequest( i18n.translate('xpack.watcher.models.watch.typePropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {type} property', + defaultMessage: 'JSON argument must contain an {type} property', values: { type: 'type' } @@ -54,7 +54,7 @@ export class Watch { if (!json.watchJson) { throw badRequest( i18n.translate('xpack.watcher.models.watch.watchJsonPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain a {watchJson} property', + defaultMessage: 'JSON argument must contain a {watchJson} property', values: { watchJson: 'watchJson' } diff --git a/x-pack/plugins/watcher/server/models/watch_history_item/watch_history_item.js b/x-pack/plugins/watcher/server/models/watch_history_item/watch_history_item.js index b3982e11bef061..617f7585717426 100644 --- a/x-pack/plugins/watcher/server/models/watch_history_item/watch_history_item.js +++ b/x-pack/plugins/watcher/server/models/watch_history_item/watch_history_item.js @@ -40,7 +40,7 @@ export class WatchHistoryItem { if (!json.id) { throw badRequest( i18n.translate('xpack.watcher.models.watchHistoryItem.idPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {id} property', + defaultMessage: 'JSON argument must contain an {id} property', values: { id: 'id' } @@ -50,7 +50,7 @@ export class WatchHistoryItem { if (!json.watchId) { throw badRequest( i18n.translate('xpack.watcher.models.watchHistoryItem.watchIdPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain a {watchId} property', + defaultMessage: 'JSON argument must contain a {watchId} property', values: { watchId: 'watchId' } @@ -60,7 +60,7 @@ export class WatchHistoryItem { if (!json.watchHistoryItemJson) { throw badRequest( i18n.translate('xpack.watcher.models.watchHistoryItem.watchHistoryItemJsonPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain a {watchHistoryItemJson} property', + defaultMessage: 'JSON argument must contain a {watchHistoryItemJson} property', values: { watchHistoryItemJson: 'watchHistoryItemJson' } diff --git a/x-pack/plugins/watcher/server/models/watch_status/watch_status.js b/x-pack/plugins/watcher/server/models/watch_status/watch_status.js index 5045c3a7a311ef..b7cffe16ca0bc2 100644 --- a/x-pack/plugins/watcher/server/models/watch_status/watch_status.js +++ b/x-pack/plugins/watcher/server/models/watch_status/watch_status.js @@ -141,7 +141,7 @@ export class WatchStatus { if (!json.id) { throw badRequest( i18n.translate('xpack.watcher.models.watchStatus.idPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain an {id} property', + defaultMessage: 'JSON argument must contain an {id} property', values: { id: 'id' } @@ -151,7 +151,7 @@ export class WatchStatus { if (!json.watchStatusJson) { throw badRequest( i18n.translate('xpack.watcher.models.watchStatus.watchStatusJsonPropertyMissingBadRequestMessage', { - defaultMessage: 'json argument must contain a {watchStatusJson} property', + defaultMessage: 'JSON argument must contain a {watchStatusJson} property', values: { watchStatusJson: 'watchStatusJson' } From 7dfb95bf57d97eefb4260c1cb1c7dd529864c96e Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Wed, 19 Jun 2019 14:49:13 -0400 Subject: [PATCH 35/51] [WATCHER] component integration tests (#37726) --- x-pack/dev-tools/jest/create_jest_config.js | 1 + .../client_integration/helpers/constants.ts | 11 + .../helpers/http_requests.ts | 122 +++ .../client_integration/helpers/index.ts | 23 + .../helpers/setup_environment.ts | 32 + .../helpers/watch_create_json.helpers.ts | 83 ++ .../helpers/watch_create_threshold.helpers.ts | 104 +++ .../helpers/watch_edit.helpers.ts | 56 ++ .../helpers/watch_list.helpers.ts | 99 +++ .../helpers/watch_status.helpers.ts | 119 +++ .../watch_create_json.test.ts | 284 +++++++ .../watch_create_threshold.test.tsx | 786 ++++++++++++++++++ .../client_integration/watch_edit.test.ts | 229 +++++ .../client_integration/watch_list.test.ts | 238 ++++++ .../client_integration/watch_status.test.ts | 54 ++ .../watcher/__tests__/plugin_definition.js | 14 - .../components/delete_watches_modal.tsx | 1 + .../public/components/section_error.tsx | 4 +- .../public/components/section_loading.tsx | 1 + x-pack/plugins/watcher/public/lib/api.ts | 16 +- .../plugins/watcher/public/lib/use_request.ts | 4 +- .../watcher/public/models/action/action.js | 2 +- .../models/action_status/action_status.js | 2 +- .../models/execute_details/execute_details.js | 2 +- .../watcher/public/models/watch/base_watch.js | 2 +- .../watcher/public/models/watch/json_watch.js | 2 +- .../public/models/watch/monitoring_watch.js | 2 +- .../public/models/watch/threshold_watch.js | 4 +- .../watcher/public/models/watch/watch.js | 4 +- .../watch_history_item/watch_history_item.js | 2 +- .../models/watch_status/watch_status.js | 2 +- .../json_watch_edit/json_watch_edit.tsx | 3 +- .../json_watch_edit/json_watch_edit_form.tsx | 14 +- .../json_watch_edit_simulate.tsx | 7 +- .../json_watch_edit_simulate_results.tsx | 3 +- .../action_fields/email_action_fields.tsx | 3 + .../action_fields/index_action_fields.tsx | 1 + .../action_fields/jira_action_fields.tsx | 3 + .../action_fields/logging_action_fields.tsx | 1 + .../action_fields/pagerduty_action_fields.tsx | 1 + .../action_fields/slack_action_fields.tsx | 2 + .../action_fields/webhook_action_fields.tsx | 7 + .../threshold_watch_action_accordion.tsx | 4 +- .../threshold_watch_action_dropdown.tsx | 6 +- .../threshold_watch_action_panel.tsx | 6 +- .../threshold_watch_edit.tsx | 11 +- .../watch_visualization.tsx | 4 +- .../watch_edit/components/watch_edit.tsx | 18 +- .../sections/watch_edit/watch_edit_actions.ts | 2 +- .../watch_list/components/watch_list.tsx | 20 +- .../watch_status/components/watch_detail.tsx | 27 +- .../watch_status/components/watch_history.tsx | 9 +- .../watch_status/components/watch_status.tsx | 7 +- .../watcher/test/fixtures/execute_details.ts | 29 + x-pack/plugins/watcher/test/fixtures/index.ts | 9 + x-pack/plugins/watcher/test/fixtures/watch.ts | 66 ++ .../watcher/test/fixtures/watch_history.ts | 23 + 57 files changed, 2517 insertions(+), 74 deletions(-) create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/helpers/constants.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/helpers/http_requests.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/helpers/index.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/helpers/setup_environment.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_json.helpers.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_threshold.helpers.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_edit.helpers.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_list.helpers.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/watch_create_json.test.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/watch_edit.test.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/watch_list.test.ts create mode 100644 x-pack/plugins/watcher/__jest__/client_integration/watch_status.test.ts delete mode 100644 x-pack/plugins/watcher/__tests__/plugin_definition.js create mode 100644 x-pack/plugins/watcher/test/fixtures/execute_details.ts create mode 100644 x-pack/plugins/watcher/test/fixtures/index.ts create mode 100644 x-pack/plugins/watcher/test/fixtures/watch.ts create mode 100644 x-pack/plugins/watcher/test/fixtures/watch_history.ts diff --git a/x-pack/dev-tools/jest/create_jest_config.js b/x-pack/dev-tools/jest/create_jest_config.js index bbc258bcc92ef3..92a480833acb4d 100644 --- a/x-pack/dev-tools/jest/create_jest_config.js +++ b/x-pack/dev-tools/jest/create_jest_config.js @@ -24,6 +24,7 @@ export function createJestConfig({ '^ui/(.*)': `${kibanaDirectory}/src/legacy/ui/public/$1`, '^src/core/(.*)': `${kibanaDirectory}/src/core/$1`, '^plugins/xpack_main/(.*);': `${xPackKibanaDirectory}/plugins/xpack_main/public/$1`, + '^plugins/watcher/models/(.*)': `${xPackKibanaDirectory}/plugins/watcher/public/models/$1`, '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': `${kibanaDirectory}/src/dev/jest/mocks/file_mock.js`, '\\.(css|less|scss)$': `${kibanaDirectory}/src/dev/jest/mocks/style_mock.js`, diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/constants.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/constants.ts new file mode 100644 index 00000000000000..3f7c1fbe1c57ff --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/constants.ts @@ -0,0 +1,11 @@ +/* + * 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 { getWatch } from '../../../test/fixtures'; + +export const WATCH_ID = 'my-test-watch'; + +export const WATCH = { watch: getWatch({ id: WATCH_ID }) }; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/http_requests.ts new file mode 100644 index 00000000000000..e925ee42fb14ca --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/http_requests.ts @@ -0,0 +1,122 @@ +/* + * 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 sinon, { SinonFakeServer } from 'sinon'; +import { ROUTES } from '../../../common/constants'; + +const { API_ROOT } = ROUTES; + +type HttpResponse = Record | any[]; + +const mockResponse = (defaultResponse: HttpResponse, response: HttpResponse) => [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify({ ...defaultResponse, ...response }), +]; + +// Register helpers to mock HTTP Requests +const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { + const setLoadWatchesResponse = (response: HttpResponse = {}) => { + const defaultResponse = { watches: [] }; + + server.respondWith('GET', `${API_ROOT}/watches`, mockResponse(defaultResponse, response)); + }; + + const setLoadWatchResponse = (response: HttpResponse = {}) => { + const defaultResponse = { watch: {} }; + server.respondWith('GET', `${API_ROOT}/watch/:id`, mockResponse(defaultResponse, response)); + }; + + const setLoadWatchHistoryResponse = (response: HttpResponse = {}) => { + const defaultResponse = { watchHistoryItems: [] }; + server.respondWith( + 'GET', + `${API_ROOT}/watch/:id/history?startTime=*`, + mockResponse(defaultResponse, response) + ); + }; + + const setDeleteWatchResponse = (response?: HttpResponse, error?: any) => { + const status = error ? error.status || 400 : 200; + const body = error ? JSON.stringify(error.body) : JSON.stringify(response); + + server.respondWith('POST', `${API_ROOT}/watches/delete`, [ + status, + { 'Content-Type': 'application/json' }, + body, + ]); + }; + + const setSaveWatchResponse = (id: string, response?: HttpResponse, error?: any) => { + const status = error ? error.status || 400 : 200; + const body = error ? JSON.stringify(error.body) : JSON.stringify(response); + + server.respondWith('PUT', `${API_ROOT}/watch/${id}`, [ + status, + { 'Content-Type': 'application/json' }, + body, + ]); + }; + + const setLoadExecutionResultResponse = (response: HttpResponse = {}) => { + const defaultResponse = { watchHistoryItem: {} }; + server.respondWith('PUT', `${API_ROOT}/watch/execute`, mockResponse(defaultResponse, response)); + }; + + const setLoadMatchingIndicesResponse = (response: HttpResponse = {}) => { + const defaultResponse = { indices: [] }; + server.respondWith('POST', `${API_ROOT}/indices`, mockResponse(defaultResponse, response)); + }; + + const setLoadEsFieldsResponse = (response: HttpResponse = {}) => { + const defaultResponse = { fields: [] }; + server.respondWith('POST', `${API_ROOT}/fields`, mockResponse(defaultResponse, response)); + }; + + const setLoadSettingsResponse = (response: HttpResponse = {}) => { + const defaultResponse = { action_types: {} }; + server.respondWith('GET', `${API_ROOT}/settings`, mockResponse(defaultResponse, response)); + }; + + const setLoadWatchVisualizeResponse = (response: HttpResponse = {}) => { + const defaultResponse = { visualizeData: {} }; + server.respondWith( + 'POST', + `${API_ROOT}/watch/visualize`, + mockResponse(defaultResponse, response) + ); + }; + + return { + setLoadWatchesResponse, + setLoadWatchResponse, + setLoadWatchHistoryResponse, + setDeleteWatchResponse, + setSaveWatchResponse, + setLoadExecutionResultResponse, + setLoadMatchingIndicesResponse, + setLoadEsFieldsResponse, + setLoadSettingsResponse, + setLoadWatchVisualizeResponse, + }; +}; + +export const init = () => { + const server = sinon.fakeServer.create(); + server.respondImmediately = true; + + // Define default response for unhandled requests. + // We make requests to APIs which don't impact the component under test, e.g. UI metric telemetry, + // and we can mock them all with a 200 instead of mocking each one individually. + server.respondWith([200, {}, 'DefaultResponse']); + + const httpRequestsMockHelpers = registerHttpRequestMockHelpers(server); + + return { + server, + httpRequestsMockHelpers, + }; +}; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/index.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/index.ts new file mode 100644 index 00000000000000..5213a3f3d55907 --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/index.ts @@ -0,0 +1,23 @@ +/* + * 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 { setup as watchListSetup } from './watch_list.helpers'; +import { setup as watchStatusSetup } from './watch_status.helpers'; +import { setup as watchCreateJsonSetup } from './watch_create_json.helpers'; +import { setup as watchCreateThresholdSetup } from './watch_create_threshold.helpers'; +import { setup as watchEditSetup } from './watch_edit.helpers'; + +export { nextTick, getRandomString, findTestSubject, TestBed } from '../../../../../test_utils'; + +export { setupEnvironment } from './setup_environment'; + +export const pageHelpers = { + watchList: { setup: watchListSetup }, + watchStatus: { setup: watchStatusSetup }, + watchCreateJson: { setup: watchCreateJsonSetup }, + watchCreateThreshold: { setup: watchCreateThresholdSetup }, + watchEdit: { setup: watchEditSetup }, +}; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/setup_environment.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/setup_environment.ts new file mode 100644 index 00000000000000..806840a7821fd5 --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/setup_environment.ts @@ -0,0 +1,32 @@ +/* + * 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 axios from 'axios'; +import axiosXhrAdapter from 'axios/lib/adapters/xhr'; +import { init as initHttpRequests } from './http_requests'; +import { setHttpClient, setSavedObjectsClient } from '../../../public/lib/api'; + +const mockHttpClient = axios.create({ adapter: axiosXhrAdapter }); + +const mockSavedObjectsClient = () => { + return { + find: (_params?: any) => {}, + }; +}; + +export const setupEnvironment = () => { + const { server, httpRequestsMockHelpers } = initHttpRequests(); + + // @ts-ignore + setHttpClient(mockHttpClient); + + setSavedObjectsClient(mockSavedObjectsClient()); + + return { + server, + httpRequestsMockHelpers, + }; +}; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_json.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_json.helpers.ts new file mode 100644 index 00000000000000..df68e0d06834f5 --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_json.helpers.ts @@ -0,0 +1,83 @@ +/* + * 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 { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; +import { WatchEdit } from '../../../public/sections/watch_edit/components/watch_edit'; +import { ROUTES, WATCH_TYPES } from '../../../common/constants'; +import { registerRouter } from '../../../public/lib/navigation'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + onRouter: router => registerRouter(router), + initialEntries: [`${ROUTES.API_ROOT}/watches/new-watch/${WATCH_TYPES.JSON}`], + componentRoutePath: `${ROUTES.API_ROOT}/watches/new-watch/:type`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WatchEdit, testBedConfig); + +export interface WatchCreateJsonTestBed extends TestBed { + actions: { + selectTab: (tab: 'edit' | 'simulate') => void; + clickSubmitButton: () => void; + clickSimulateButton: () => void; + }; +} + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + /** + * User Actions + */ + + const selectTab = (tab: 'edit' | 'simulate') => { + const tabs = ['edit', 'simulate']; + + testBed + .find('tab') + .at(tabs.indexOf(tab)) + .simulate('click'); + }; + + const clickSubmitButton = () => { + testBed.find('saveWatchButton').simulate('click'); + }; + + const clickSimulateButton = () => { + testBed.find('simulateWatchButton').simulate('click'); + }; + + return { + ...testBed, + actions: { + selectTab, + clickSubmitButton, + clickSimulateButton, + }, + }; +}; + +type WatchCreateJsonTestSubjects = TestSubjects; + +export type TestSubjects = + | 'actionModesSelect' + | 'idInput' + | 'ignoreConditionSwitch' + | 'jsonEditor' + | 'jsonWatchForm' + | 'jsonWatchSimulateForm' + | 'nameInput' + | 'pageTitle' + | 'saveWatchButton' + | 'scheduledTimeInput' + | 'sectionError' + | 'sectionLoading' + | 'simulateResultsFlyout' + | 'simulateResultsFlyoutTitle' + | 'simulateWatchButton' + | 'tab' + | 'triggeredTimeInput'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_threshold.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_threshold.helpers.ts new file mode 100644 index 00000000000000..e70ad2010b4145 --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_threshold.helpers.ts @@ -0,0 +1,104 @@ +/* + * 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 { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; +import { WatchEdit } from '../../../public/sections/watch_edit/components/watch_edit'; +import { ROUTES, WATCH_TYPES } from '../../../common/constants'; +import { registerRouter } from '../../../public/lib/navigation'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + onRouter: router => registerRouter(router), + initialEntries: [`${ROUTES.API_ROOT}/watches/new-watch/${WATCH_TYPES.THRESHOLD}`], + componentRoutePath: `${ROUTES.API_ROOT}/watches/new-watch/:type`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WatchEdit, testBedConfig); + +export interface WatchCreateThresholdTestBed extends TestBed { + actions: { + clickSubmitButton: () => void; + clickAddActionButton: () => void; + clickActionLink: ( + actionType: 'logging' | 'email' | 'webhook' | 'index' | 'slack' | 'jira' | 'pagerduty' + ) => void; + clickSimulateButton: () => void; + }; +} + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + /** + * User Actions + */ + + const clickSubmitButton = () => { + testBed.find('saveWatchButton').simulate('click'); + }; + + const clickAddActionButton = () => { + testBed.find('addWatchActionButton').simulate('click'); + }; + + const clickSimulateButton = () => { + testBed.find('simulateActionButton').simulate('click'); + }; + + const clickActionLink = ( + actionType: 'logging' | 'email' | 'webhook' | 'index' | 'slack' | 'jira' | 'pagerduty' + ) => { + testBed.find(`${actionType}ActionButton`).simulate('click'); + }; + + return { + ...testBed, + actions: { + clickSubmitButton, + clickAddActionButton, + clickActionLink, + clickSimulateButton, + }, + }; +}; + +type WatchCreateThresholdTestSubjects = TestSubjects; + +export type TestSubjects = + | 'addWatchActionButton' + | 'emailBodyInput' + | 'emailSubjectInput' + | 'indexInput' + | 'indicesComboBox' + | 'jiraIssueTypeInput' + | 'jiraProjectKeyInput' + | 'jiraSummaryInput' + | 'loggingTextInput' + | 'mockComboBox' + | 'nameInput' + | 'pagerdutyDescriptionInput' + | 'pageTitle' + | 'saveWatchButton' + | 'sectionLoading' + | 'simulateActionButton' + | 'slackMessageTextarea' + | 'slackRecipientComboBox' + | 'toEmailAddressInput' + | 'triggerIntervalSizeInput' + | 'watchActionAccordion' + | 'watchActionAccordion.mockComboBox' + | 'watchActionsPanel' + | 'watchConditionTitle' + | 'watchTimeFieldSelect' + | 'watchVisualizationChart' + | 'webhookBodyEditor' + | 'webhookHostInput' + | 'webhookPasswordInput' + | 'webhookPathInput' + | 'webhookPortInput' + | 'webhookMethodSelect' + | 'webhookUsernameInput'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_edit.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_edit.helpers.ts new file mode 100644 index 00000000000000..a9dc410f106a93 --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_edit.helpers.ts @@ -0,0 +1,56 @@ +/* + * 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 { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; +import { WatchEdit } from '../../../public/sections/watch_edit/components/watch_edit'; +import { ROUTES } from '../../../common/constants'; +import { registerRouter } from '../../../public/lib/navigation'; +import { WATCH_ID } from './constants'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + onRouter: router => registerRouter(router), + initialEntries: [`${ROUTES.API_ROOT}/watches/watch/${WATCH_ID}/edit`], + componentRoutePath: `${ROUTES.API_ROOT}/watches/watch/:id/edit`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WatchEdit, testBedConfig); + +export interface WatchEditTestBed extends TestBed { + actions: { + clickSubmitButton: () => void; + }; +} + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + /** + * User Actions + */ + + const clickSubmitButton = () => { + testBed.find('saveWatchButton').simulate('click'); + }; + + return { + ...testBed, + actions: { + clickSubmitButton, + }, + }; +}; + +type WatchEditSubjects = TestSubjects; + +export type TestSubjects = + | 'idInput' + | 'jsonWatchForm' + | 'nameInput' + | 'pageTitle' + | 'thresholdWatchForm' + | 'watchTimeFieldSelect'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_list.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_list.helpers.ts new file mode 100644 index 00000000000000..a48a098c06333f --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_list.helpers.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { + registerTestBed, + findTestSubject, + TestBed, + TestBedConfig, + nextTick, +} from '../../../../../test_utils'; +import { WatchList } from '../../../public/sections/watch_list/components/watch_list'; +import { ROUTES } from '../../../common/constants'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: [`${ROUTES.API_ROOT}/watches`], + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WatchList, testBedConfig); + +export interface WatchListTestBed extends TestBed { + actions: { + selectWatchAt: (index: number) => void; + clickWatchAt: (index: number) => void; + clickWatchActionAt: (index: number, action: 'delete' | 'edit') => void; + }; +} + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + /** + * User Actions + */ + + const selectWatchAt = (index: number) => { + const { rows } = testBed.table.getMetaData('watchesTable'); + const row = rows[index]; + const checkBox = row.reactWrapper.find('input').hostNodes(); + checkBox.simulate('change', { target: { checked: true } }); + }; + + const clickWatchAt = async (index: number) => { + const { rows } = testBed.table.getMetaData('watchesTable'); + const watchesLink = findTestSubject(rows[index].reactWrapper, 'watchesLink'); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + const { href } = watchesLink.props(); + testBed.router.navigateTo(href!); + await nextTick(); + testBed.component.update(); + }); + }; + + const clickWatchActionAt = async (index: number, action: 'delete' | 'edit') => { + const { component, table } = testBed; + const { rows } = table.getMetaData('watchesTable'); + const currentRow = rows[index]; + const lastColumn = currentRow.columns[currentRow.columns.length - 1].reactWrapper; + const button = findTestSubject(lastColumn, `${action}WatchButton`); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + button.simulate('click'); + component.update(); + }); + }; + + return { + ...testBed, + actions: { + selectWatchAt, + clickWatchAt, + clickWatchActionAt, + }, + }; +}; + +type WatchListTestSubjects = TestSubjects; + +export type TestSubjects = + | 'appTitle' + | 'documentationLink' + | 'watchesTable' + | 'cell' + | 'row' + | 'deleteWatchButton' + | 'createWatchButton' + | 'emptyPrompt' + | 'emptyPrompt.createWatchButton' + | 'editWatchButton'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts new file mode 100644 index 00000000000000..436d1087039dc3 --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { + registerTestBed, + findTestSubject, + TestBed, + TestBedConfig, +} from '../../../../../test_utils'; +import { WatchStatus } from '../../../public/sections/watch_status/components/watch_status'; +import { ROUTES } from '../../../common/constants'; +import { WATCH_ID } from './constants'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: [`${ROUTES.API_ROOT}/watches/watch/${WATCH_ID}/status`], + componentRoutePath: `${ROUTES.API_ROOT}/watches/watch/:id/status`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WatchStatus, testBedConfig); + +export interface WatchStatusTestBed extends TestBed { + actions: { + clickToggleActivationButton: () => void; + clickAcknowledgeButton: () => void; + clickDeleteWatchButton: () => void; + clickWatchExecutionAt: (index: number, tableCellText: string) => void; + }; +} + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + /** + * User Actions + */ + + const clickToggleActivationButton = async () => { + const { component } = testBed; + const button = testBed.find('toggleWatchActivationButton'); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + button.simulate('click'); + component.update(); + }); + }; + + const clickAcknowledgeButton = async () => { + const { component } = testBed; + const button = testBed.find('acknowledgeWatchButton'); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + button.simulate('click'); + component.update(); + }); + }; + + const clickDeleteWatchButton = async () => { + const { component } = testBed; + const button = testBed.find('deleteWatchButton'); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + button.simulate('click'); + component.update(); + }); + }; + + const clickWatchExecutionAt = async (index: number, tableCellText: string) => { + const { component, table } = testBed; + const { rows } = table.getMetaData('watchHistoryTable'); + const currentRow = rows[index]; + const firstColumn = currentRow.columns[currentRow.columns.length - 1].reactWrapper; + const button = findTestSubject(firstColumn, `watchIdColumn-${tableCellText}`); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + button.simulate('click'); + component.update(); + }); + }; + + return { + ...testBed, + actions: { + clickToggleActivationButton, + clickAcknowledgeButton, + clickDeleteWatchButton, + clickWatchExecutionAt, + }, + }; +}; + +type WatchStatusTestSubjects = TestSubjects; + +export type TestSubjects = + | 'acknowledgeWatchButton' + | 'actionErrorsButton' + | 'actionErrorsFlyout' + | 'actionErrorsFlyout.errorMessage' + | 'actionErrorsFlyout.title' + | 'deleteWatchButton' + | 'pageTitle' + | 'toggleWatchActivationButton' + | 'watchHistoryDetailFlyout' + | 'watchHistoryDetailFlyout.title' + | 'watchHistoryErrorDetailFlyout' + | 'watchHistoryErrorDetailFlyout.errorMessage' + | 'watchHistoryErrorDetailFlyout.title' + | 'watchHistoryTable'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/watch_create_json.test.ts b/x-pack/plugins/watcher/__jest__/client_integration/watch_create_json.test.ts new file mode 100644 index 00000000000000..fbcd940ed65bbd --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/watch_create_json.test.ts @@ -0,0 +1,284 @@ +/* + * 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 { act } from 'react-dom/test-utils'; +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { WatchCreateJsonTestBed } from './helpers/watch_create_json.helpers'; +import { WATCH } from './helpers/constants'; +import defaultWatchJson from '../../public/models/watch/default_watch.json'; +import { getExecuteDetails } from '../../test/fixtures'; + +jest.mock('ui/chrome', () => ({ + breadcrumbs: { set: () => {} }, + addBasePath: (path: string) => path || '/api/watcher', +})); + +jest.mock('ui/time_buckets', () => {}); + +const { setup } = pageHelpers.watchCreateJson; + +describe.skip(' create route', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: WatchCreateJsonTestBed; + + afterAll(() => { + server.restore(); + }); + + describe('on component mount', () => { + beforeEach(async () => { + testBed = await setup(); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + const { component } = testBed; + await nextTick(); + component.update(); + }); + }); + + test('should set the correct page title', () => { + const { find } = testBed; + expect(find('pageTitle').text()).toBe('Create advanced watch'); + }); + + describe('tabs', () => { + test('should have 2 tabs', () => { + const { find } = testBed; + + expect(find('tab').length).toBe(2); + expect(find('tab').map(t => t.text())).toEqual(['Edit', 'Simulate']); + }); + + test('should navigate to the "Simulate" tab', () => { + const { exists, actions } = testBed; + + expect(exists('jsonWatchForm')).toBe(true); + expect(exists('jsonWatchSimulateForm')).toBe(false); + + actions.selectTab('simulate'); + + expect(exists('jsonWatchForm')).toBe(false); + expect(exists('jsonWatchSimulateForm')).toBe(true); + }); + }); + + describe('create', () => { + describe('form validation', () => { + test('should not allow empty ID field', () => { + const { form, actions } = testBed; + form.setInputValue('idInput', ''); + + actions.clickSubmitButton(); + + expect(form.getErrorsMessages()).toContain('ID is required'); + }); + test('should not allow invalid characters for ID field', () => { + const { form, actions } = testBed; + form.setInputValue('idInput', 'invalid$id*field/'); + + actions.clickSubmitButton(); + + expect(form.getErrorsMessages()).toContain( + 'ID can only contain letters, underscores, dashes, and numbers.' + ); + }); + }); + + describe('form payload & API errors', () => { + test('should send the correct payload', async () => { + const { form, actions } = testBed; + const { watch } = WATCH; + + form.setInputValue('nameInput', watch.name); + form.setInputValue('idInput', watch.id); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSubmitButton(); + await nextTick(); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + const DEFAULT_LOGGING_ACTION_ID = 'logging_1'; + const DEFAULT_LOGGING_ACTION_TYPE = 'logging'; + const DEFAULT_LOGGING_ACTION_TEXT = + 'There are {{ctx.payload.hits.total}} documents in your index. Threshold is 10.'; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + id: watch.id, + name: watch.name, + type: watch.type, + isNew: true, + actions: [ + { + id: DEFAULT_LOGGING_ACTION_ID, + type: DEFAULT_LOGGING_ACTION_TYPE, + text: DEFAULT_LOGGING_ACTION_TEXT, + [DEFAULT_LOGGING_ACTION_TYPE]: { + text: DEFAULT_LOGGING_ACTION_TEXT, + }, + }, + ], + watch: defaultWatchJson, + }) + ); + }); + + test('should surface the API errors from the "save" HTTP request', async () => { + const { form, actions, component, exists, find } = testBed; + const { watch } = WATCH; + + form.setInputValue('nameInput', watch.name); + form.setInputValue('idInput', watch.id); + + const error = { + status: 400, + error: 'Bad request', + message: 'Watch payload is invalid', + }; + + httpRequestsMockHelpers.setSaveWatchResponse(watch.id, undefined, { body: error }); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSubmitButton(); + await nextTick(); + component.update(); + }); + + expect(exists('sectionError')).toBe(true); + expect(find('sectionError').text()).toContain(error.message); + }); + }); + }); + + describe('simulate', () => { + beforeEach(() => { + const { actions, form } = testBed; + + // Set watch id (required field) and switch to simulate tab + form.setInputValue('idInput', WATCH.watch.id); + actions.selectTab('simulate'); + }); + + describe('form payload & API errors', () => { + test('should execute a watch with no input', async () => { + const { actions } = testBed; + const { + watch: { id, type }, + } = WATCH; + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSimulateButton(); + await nextTick(); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + const actionModes = Object.keys(defaultWatchJson.actions).reduce( + (actionAccum: any, action) => { + actionAccum[action] = 'simulate'; + return actionAccum; + }, + {} + ); + + const executedWatch = { + id, + type, + isNew: true, + actions: [], + watch: defaultWatchJson, + }; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + executeDetails: getExecuteDetails({ + actionModes, + }), + watch: executedWatch, + }) + ); + }); + + test('should execute a watch with a valid payload', async () => { + const { actions, form, find, exists, component } = testBed; + const { + watch: { id, type }, + } = WATCH; + + const SCHEDULED_TIME = '5'; + const TRIGGERED_TIME = '5'; + const IGNORE_CONDITION = true; + const ACTION_MODE = 'force_execute'; + + form.setInputValue('scheduledTimeInput', SCHEDULED_TIME); + form.setInputValue('triggeredTimeInput', TRIGGERED_TIME); + form.toggleEuiSwitch('ignoreConditionSwitch'); + form.setInputValue('actionModesSelect', ACTION_MODE); + + expect(exists('simulateResultsFlyout')).toBe(false); + + httpRequestsMockHelpers.setLoadExecutionResultResponse({ + watchHistoryItem: { + details: {}, + watchStatus: { + actionStatuses: [], + }, + }, + }); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSimulateButton(); + await nextTick(); + component.update(); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + const actionModes = Object.keys(defaultWatchJson.actions).reduce( + (actionAccum: any, action) => { + actionAccum[action] = ACTION_MODE; + return actionAccum; + }, + {} + ); + + const executedWatch = { + id, + type, + isNew: true, + actions: [], + watch: defaultWatchJson, + }; + + const triggeredTime = `now+${TRIGGERED_TIME}s`; + const scheduledTime = `now+${SCHEDULED_TIME}s`; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + executeDetails: getExecuteDetails({ + triggerData: { + triggeredTime, + scheduledTime, + }, + ignoreCondition: IGNORE_CONDITION, + actionModes, + }), + watch: executedWatch, + }) + ); + expect(exists('simulateResultsFlyout')).toBe(true); + expect(find('simulateResultsFlyoutTitle').text()).toEqual('Simulation results'); + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx b/x-pack/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx new file mode 100644 index 00000000000000..418248dd724c85 --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx @@ -0,0 +1,786 @@ +/* + * 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 React from 'react'; +import { act } from 'react-dom/test-utils'; +import axiosXhrAdapter from 'axios/lib/adapters/xhr'; +import axios from 'axios'; +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { WatchCreateThresholdTestBed } from './helpers/watch_create_threshold.helpers'; +import { getExecuteDetails } from '../../test/fixtures'; +import { WATCH_TYPES } from '../../common/constants'; + +const WATCH_NAME = 'my_test_watch'; + +const WATCH_TIME_FIELD = '@timestamp'; + +const MATCH_INDICES = ['index1']; + +const ES_FIELDS = [{ name: '@timestamp', type: 'date' }]; + +const SETTINGS = { + action_types: { + email: { enabled: true }, + index: { enabled: true }, + jira: { enabled: true }, + logging: { enabled: true }, + pagerduty: { enabled: true }, + slack: { enabled: true }, + webhook: { enabled: true }, + }, +}; + +const WATCH_VISUALIZE_DATA = { + count: [[1559404800000, 14], [1559448000000, 196], [1559491200000, 44]], +}; + +const mockHttpClient = axios.create({ adapter: axiosXhrAdapter }); + +jest.mock('ui/chrome', () => ({ + breadcrumbs: { set: () => {} }, + addBasePath: (path: string) => path || '/api/watcher', + getUiSettingsClient: () => ({ + get: () => {}, + isDefault: () => true, + }), +})); + +jest.mock('ui/time_buckets', () => { + class MockTimeBuckets { + setBounds(_domain: any) { + return {}; + } + getInterval() { + return { + expression: {}, + }; + } + } + return { TimeBuckets: MockTimeBuckets }; +}); + +jest.mock('../../public/lib/api', () => ({ + ...jest.requireActual('../../public/lib/api'), + loadIndexPatterns: async () => { + const INDEX_PATTERNS = [ + { attributes: { title: 'index1' } }, + { attributes: { title: 'index2' } }, + { attributes: { title: 'index3' } }, + ]; + return await INDEX_PATTERNS; + }, + getHttpClient: () => mockHttpClient, +})); + +jest.mock('@elastic/eui', () => ({ + ...jest.requireActual('@elastic/eui'), + // Mocking EuiComboBox, as it utilizes "react-virtualized" for rendering search suggestions, + // which does not produce a valid component wrapper + EuiComboBox: (props: any) => ( + { + props.onChange([syntheticEvent['0']]); + }} + /> + ), +})); + +const { setup } = pageHelpers.watchCreateThreshold; + +describe.skip(' create route', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: WatchCreateThresholdTestBed; + + afterAll(() => { + server.restore(); + }); + + describe('on component mount', () => { + beforeEach(async () => { + testBed = await setup(); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + const { component } = testBed; + await nextTick(); + component.update(); + }); + }); + + test('should set the correct page title', () => { + const { find } = testBed; + + expect(find('pageTitle').text()).toBe('Create threshold alert'); + }); + + describe('create', () => { + beforeEach(async () => { + httpRequestsMockHelpers.setLoadMatchingIndicesResponse({ indices: MATCH_INDICES }); + httpRequestsMockHelpers.setLoadEsFieldsResponse({ fields: ES_FIELDS }); + httpRequestsMockHelpers.setLoadSettingsResponse(SETTINGS); + httpRequestsMockHelpers.setLoadWatchVisualizeResponse(WATCH_VISUALIZE_DATA); + + testBed = await setup(); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + await nextTick(); + testBed.component.update(); + }); + }); + + describe('form validation', () => { + test('should not allow empty name field', () => { + const { form } = testBed; + + form.setInputValue('nameInput', ''); + + expect(form.getErrorsMessages()).toContain('Name is required.'); + }); + + test('should not allow empty time field', () => { + const { form } = testBed; + + form.setInputValue('watchTimeFieldSelect', ''); + + expect(form.getErrorsMessages()).toContain('A time field is required'); + }); + + test('should not allow empty interval size field', () => { + const { form } = testBed; + + form.setInputValue('triggerIntervalSizeInput', ''); + + expect(form.getErrorsMessages()).toContain('Interval size is required'); + }); + + test('should not allow negative interval size field', () => { + const { form } = testBed; + + form.setInputValue('triggerIntervalSizeInput', '-1'); + + expect(form.getErrorsMessages()).toContain('Interval size cannot be a negative number'); + }); + + test('should disable the Create button with invalid fields', () => { + const { find } = testBed; + + expect(find('saveWatchButton').props().disabled).toEqual(true); + }); + + test('it should enable the Create button and render additonal content with valid fields', async () => { + const { form, find, component, exists } = testBed; + + form.setInputValue('nameInput', 'my_test_watch'); + find('mockComboBox').simulate('change', [{ label: 'index1', value: 'index1' }]); // Using mocked EuiComboBox + form.setInputValue('watchTimeFieldSelect', '@timestamp'); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + await nextTick(); + component.update(); + }); + + expect(find('saveWatchButton').props().disabled).toEqual(false); + + expect(find('watchConditionTitle').text()).toBe('Match the following condition'); + expect(exists('watchVisualizationChart')).toBe(true); + expect(exists('watchActionsPanel')).toBe(true); + }); + }); + + describe('actions', () => { + beforeEach(async () => { + const { form, find, component } = testBed; + + // Set up valid fields needed for actions component to render + form.setInputValue('nameInput', WATCH_NAME); + find('mockComboBox').simulate('change', [{ label: 'index1', value: 'index1' }]); // Using mocked EuiComboBox + form.setInputValue('watchTimeFieldSelect', WATCH_TIME_FIELD); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + await nextTick(); + component.update(); + }); + }); + + test('should simulate a logging action', async () => { + const { form, find, actions, exists } = testBed; + + const LOGGING_MESSAGE = 'test log message'; + + actions.clickAddActionButton(); + actions.clickActionLink('logging'); + + expect(exists('watchActionAccordion')).toBe(true); + + // First, provide invalid field and verify + form.setInputValue('loggingTextInput', ''); + + expect(form.getErrorsMessages()).toContain('Log text is required.'); + expect(find('simulateActionButton').props().disabled).toEqual(true); + + // Next, provide valid field and verify + form.setInputValue('loggingTextInput', LOGGING_MESSAGE); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSimulateButton(); + await nextTick(); + }); + + // Verify request + const latestRequest = server.requests[server.requests.length - 1]; + + const thresholdWatch = { + id: JSON.parse(latestRequest.requestBody).watch.id, // watch ID is created dynamically + name: WATCH_NAME, + type: WATCH_TYPES.THRESHOLD, + isNew: true, + actions: [ + { + id: 'logging_1', + type: 'logging', + text: LOGGING_MESSAGE, + logging: { + text: LOGGING_MESSAGE, + }, + }, + ], + index: MATCH_INDICES, + timeField: WATCH_TIME_FIELD, + triggerIntervalSize: 1, + triggerIntervalUnit: 'm', + aggType: 'count', + termSize: 5, + thresholdComparator: '>', + timeWindowSize: 5, + timeWindowUnit: 'm', + threshold: 1000, + }; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + executeDetails: getExecuteDetails({ + actionModes: { + logging_1: 'force_execute', + }, + ignoreCondition: true, + recordExecution: false, + }), + watch: thresholdWatch, + }) + ); + }); + + test('should simulate an index action', async () => { + const { form, find, actions, exists } = testBed; + + const INDEX = 'my_index'; + + actions.clickAddActionButton(); + actions.clickActionLink('index'); + + expect(exists('watchActionAccordion')).toBe(true); + + // First, provide invalid field and verify + form.setInputValue('indexInput', ''); + + expect(form.getErrorsMessages()).toContain('Index name is required.'); + expect(find('simulateActionButton').props().disabled).toEqual(true); + + // Next, provide valid field and verify + form.setInputValue('indexInput', INDEX); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSimulateButton(); + await nextTick(); + }); + + // Verify request + const latestRequest = server.requests[server.requests.length - 1]; + + const thresholdWatch = { + id: JSON.parse(latestRequest.requestBody).watch.id, // watch ID is created dynamically + name: WATCH_NAME, + type: WATCH_TYPES.THRESHOLD, + isNew: true, + actions: [ + { + id: 'index_1', + type: 'index', + index: { + index: INDEX, + }, + }, + ], + index: MATCH_INDICES, + timeField: WATCH_TIME_FIELD, + triggerIntervalSize: 1, + triggerIntervalUnit: 'm', + aggType: 'count', + termSize: 5, + thresholdComparator: '>', + timeWindowSize: 5, + timeWindowUnit: 'm', + threshold: 1000, + }; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + executeDetails: getExecuteDetails({ + actionModes: { + index_1: 'force_execute', + }, + ignoreCondition: true, + recordExecution: false, + }), + watch: thresholdWatch, + }) + ); + }); + + test('should simulate a Slack action', async () => { + const { form, actions, exists } = testBed; + + const SLACK_MESSAGE = 'test slack message'; + + actions.clickAddActionButton(); + actions.clickActionLink('slack'); + + expect(exists('watchActionAccordion')).toBe(true); + + form.setInputValue('slackMessageTextarea', SLACK_MESSAGE); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSimulateButton(); + await nextTick(); + }); + + // Verify request + const latestRequest = server.requests[server.requests.length - 1]; + + const thresholdWatch = { + id: JSON.parse(latestRequest.requestBody).watch.id, // watch ID is created dynamically + name: WATCH_NAME, + type: WATCH_TYPES.THRESHOLD, + isNew: true, + actions: [ + { + id: 'slack_1', + type: 'slack', + text: SLACK_MESSAGE, + slack: { + message: { + text: SLACK_MESSAGE, + }, + }, + }, + ], + index: MATCH_INDICES, + timeField: WATCH_TIME_FIELD, + triggerIntervalSize: 1, + triggerIntervalUnit: 'm', + aggType: 'count', + termSize: 5, + thresholdComparator: '>', + timeWindowSize: 5, + timeWindowUnit: 'm', + threshold: 1000, + }; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + executeDetails: getExecuteDetails({ + actionModes: { + slack_1: 'force_execute', + }, + ignoreCondition: true, + recordExecution: false, + }), + watch: thresholdWatch, + }) + ); + }); + + test('should simulate an email action', async () => { + const { form, find, actions, exists } = testBed; + + const EMAIL_RECIPIENT = 'test@test.com'; + const EMAIL_SUBJECT = 'test email subject'; + const EMAIL_BODY = 'this is a test email body'; + + actions.clickAddActionButton(); + actions.clickActionLink('email'); + + expect(exists('watchActionAccordion')).toBe(true); + + // First, provide invalid fields and verify + form.setInputValue('emailBodyInput', ''); + + expect(form.getErrorsMessages()).toContain('Email body is required.'); + expect(find('simulateActionButton').props().disabled).toEqual(true); + + // Next, provide valid field and verify + find('watchActionAccordion.mockComboBox').simulate('change', [ + { label: EMAIL_RECIPIENT, value: EMAIL_RECIPIENT }, + ]); // Using mocked EuiComboBox + form.setInputValue('emailSubjectInput', EMAIL_SUBJECT); + form.setInputValue('emailBodyInput', EMAIL_BODY); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSimulateButton(); + await nextTick(); + }); + + // Verify request + const latestRequest = server.requests[server.requests.length - 1]; + + const thresholdWatch = { + id: JSON.parse(latestRequest.requestBody).watch.id, // watch ID is created dynamically + name: WATCH_NAME, + type: WATCH_TYPES.THRESHOLD, + isNew: true, + actions: [ + { + id: 'email_1', + type: 'email', + to: [EMAIL_RECIPIENT], + subject: EMAIL_SUBJECT, + body: EMAIL_BODY, + email: { + to: [EMAIL_RECIPIENT], + subject: EMAIL_SUBJECT, + body: { + text: EMAIL_BODY, + }, + }, + }, + ], + index: MATCH_INDICES, + timeField: WATCH_TIME_FIELD, + triggerIntervalSize: 1, + triggerIntervalUnit: 'm', + aggType: 'count', + termSize: 5, + thresholdComparator: '>', + timeWindowSize: 5, + timeWindowUnit: 'm', + threshold: 1000, + }; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + executeDetails: getExecuteDetails({ + actionModes: { + email_1: 'force_execute', + }, + ignoreCondition: true, + recordExecution: false, + }), + watch: thresholdWatch, + }) + ); + }); + + test('should simulate a webhook action', async () => { + const { form, find, actions, exists } = testBed; + + const METHOD = 'put'; + const HOST = 'localhost'; + const PORT = '9200'; + const PATH = '/test'; + const USERNAME = 'test_user'; + const PASSWORD = 'test_password'; + + actions.clickAddActionButton(); + actions.clickActionLink('webhook'); + + expect(exists('watchActionAccordion')).toBe(true); + + // First, provide invalid fields and verify + form.setInputValue('webhookHostInput', ''); + form.setInputValue('webhookPortInput', ''); + + expect(form.getErrorsMessages()).toEqual([ + 'Webhook host is required.', + 'Webhook port is required.', + ]); + expect(find('simulateActionButton').props().disabled).toEqual(true); + + // Next, provide valid fields and verify + form.setInputValue('webhookMethodSelect', METHOD); + form.setInputValue('webhookHostInput', HOST); + form.setInputValue('webhookPortInput', PORT); + form.setInputValue('webhookPathInput', PATH); + form.setInputValue('webhookUsernameInput', USERNAME); + form.setInputValue('webhookPasswordInput', PASSWORD); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSimulateButton(); + await nextTick(); + }); + + // Verify request + const latestRequest = server.requests[server.requests.length - 1]; + + const thresholdWatch = { + id: JSON.parse(latestRequest.requestBody).watch.id, // watch ID is created dynamically + name: WATCH_NAME, + type: WATCH_TYPES.THRESHOLD, + isNew: true, + actions: [ + { + id: 'webhook_1', + type: 'webhook', + method: METHOD, + host: HOST, + port: Number(PORT), + path: PATH, + body: + '{\n "message": "Watch [{{ctx.metadata.name}}] has exceeded the threshold"\n}', // Default + username: USERNAME, + password: PASSWORD, + webhook: { + host: HOST, + port: Number(PORT), + }, + }, + ], + index: MATCH_INDICES, + timeField: WATCH_TIME_FIELD, + triggerIntervalSize: 1, + triggerIntervalUnit: 'm', + aggType: 'count', + termSize: 5, + thresholdComparator: '>', + timeWindowSize: 5, + timeWindowUnit: 'm', + threshold: 1000, + }; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + executeDetails: getExecuteDetails({ + actionModes: { + webhook_1: 'force_execute', + }, + ignoreCondition: true, + recordExecution: false, + }), + watch: thresholdWatch, + }) + ); + }); + + test('should simulate a Jira action', async () => { + const { form, find, actions, exists } = testBed; + + const PROJECT_KEY = 'TEST_PROJECT_KEY'; + const ISSUE_TYPE = 'Bug'; + const SUMMARY = 'test Jira summary'; + + actions.clickAddActionButton(); + actions.clickActionLink('jira'); + + expect(exists('watchActionAccordion')).toBe(true); + + // First, provide invalid fields and verify + form.setInputValue('jiraProjectKeyInput', ''); + form.setInputValue('jiraIssueTypeInput', ''); + form.setInputValue('jiraSummaryInput', ''); + + expect(form.getErrorsMessages()).toEqual([ + 'Jira project key is required.', + 'Jira issue type is required.', + 'Jira summary is required.', + ]); + expect(find('simulateActionButton').props().disabled).toEqual(true); + + // Next, provide valid fields and verify + form.setInputValue('jiraProjectKeyInput', PROJECT_KEY); + form.setInputValue('jiraIssueTypeInput', ISSUE_TYPE); + form.setInputValue('jiraSummaryInput', SUMMARY); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSimulateButton(); + await nextTick(); + }); + + // Verify request + const latestRequest = server.requests[server.requests.length - 1]; + + const thresholdWatch = { + id: JSON.parse(latestRequest.requestBody).watch.id, // watch ID is created dynamically + name: WATCH_NAME, + type: WATCH_TYPES.THRESHOLD, + isNew: true, + actions: [ + { + id: 'jira_1', + type: 'jira', + projectKey: PROJECT_KEY, + issueType: ISSUE_TYPE, + summary: SUMMARY, + jira: { + fields: { + project: { + key: PROJECT_KEY, + }, + issuetype: { + name: ISSUE_TYPE, + }, + summary: SUMMARY, + }, + }, + }, + ], + index: MATCH_INDICES, + timeField: WATCH_TIME_FIELD, + triggerIntervalSize: 1, + triggerIntervalUnit: 'm', + aggType: 'count', + termSize: 5, + thresholdComparator: '>', + timeWindowSize: 5, + timeWindowUnit: 'm', + threshold: 1000, + }; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + executeDetails: getExecuteDetails({ + actionModes: { + jira_1: 'force_execute', + }, + ignoreCondition: true, + recordExecution: false, + }), + watch: thresholdWatch, + }) + ); + }); + + test('should simulate a PagerDuty action', async () => { + const { form, actions, exists, find } = testBed; + + const DESCRIPTION = 'test pagerduty description'; + + actions.clickAddActionButton(); + actions.clickActionLink('pagerduty'); + + expect(exists('watchActionAccordion')).toBe(true); + + // First, provide invalid fields and verify + form.setInputValue('pagerdutyDescriptionInput', ''); + + expect(form.getErrorsMessages()).toContain('PagerDuty description is required.'); + expect(find('simulateActionButton').props().disabled).toEqual(true); + + // Next, provide valid fields and verify + form.setInputValue('pagerdutyDescriptionInput', DESCRIPTION); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSimulateButton(); + await nextTick(); + }); + + // Verify request + const latestRequest = server.requests[server.requests.length - 1]; + + const thresholdWatch = { + id: JSON.parse(latestRequest.requestBody).watch.id, // watch ID is created dynamically + name: WATCH_NAME, + type: WATCH_TYPES.THRESHOLD, + isNew: true, + actions: [ + { + id: 'pagerduty_1', + type: 'pagerduty', + description: DESCRIPTION, + pagerduty: { + description: DESCRIPTION, + }, + }, + ], + index: MATCH_INDICES, + timeField: WATCH_TIME_FIELD, + triggerIntervalSize: 1, + triggerIntervalUnit: 'm', + aggType: 'count', + termSize: 5, + thresholdComparator: '>', + timeWindowSize: 5, + timeWindowUnit: 'm', + threshold: 1000, + }; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + executeDetails: getExecuteDetails({ + actionModes: { + pagerduty_1: 'force_execute', + }, + ignoreCondition: true, + recordExecution: false, + }), + watch: thresholdWatch, + }) + ); + }); + }); + + describe('form payload', () => { + test('should send the correct payload', async () => { + const { form, find, component, actions } = testBed; + + // Set up required fields + form.setInputValue('nameInput', WATCH_NAME); + find('mockComboBox').simulate('change', [{ label: 'index1', value: 'index1' }]); // Using mocked EuiComboBox + form.setInputValue('watchTimeFieldSelect', WATCH_TIME_FIELD); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + await nextTick(); + component.update(); + actions.clickSubmitButton(); + await nextTick(); + }); + + // Verify request + const latestRequest = server.requests[server.requests.length - 1]; + + const thresholdWatch = { + id: JSON.parse(latestRequest.requestBody).id, // watch ID is created dynamically + name: WATCH_NAME, + type: WATCH_TYPES.THRESHOLD, + isNew: true, + actions: [], + index: MATCH_INDICES, + timeField: WATCH_TIME_FIELD, + triggerIntervalSize: 1, + triggerIntervalUnit: 'm', + aggType: 'count', + termSize: 5, + thresholdComparator: '>', + timeWindowSize: 5, + timeWindowUnit: 'm', + threshold: 1000, + }; + + expect(latestRequest.requestBody).toEqual(JSON.stringify(thresholdWatch)); + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/watcher/__jest__/client_integration/watch_edit.test.ts b/x-pack/plugins/watcher/__jest__/client_integration/watch_edit.test.ts new file mode 100644 index 00000000000000..6b444530700dda --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/watch_edit.test.ts @@ -0,0 +1,229 @@ +/* + * 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 { act } from 'react-dom/test-utils'; +import axiosXhrAdapter from 'axios/lib/adapters/xhr'; +import axios from 'axios'; +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { WatchEditTestBed } from './helpers/watch_edit.helpers'; +import { WATCH } from './helpers/constants'; +import defaultWatchJson from '../../public/models/watch/default_watch.json'; +import { getWatch } from '../../test/fixtures'; +import { getRandomString } from '../../../../test_utils'; + +const mockHttpClient = axios.create({ adapter: axiosXhrAdapter }); + +jest.mock('ui/chrome', () => ({ + breadcrumbs: { set: () => {} }, + addBasePath: (path: string) => path || '/api/watcher', +})); + +jest.mock('ui/time_buckets', () => { + class MockTimeBuckets { + setBounds(_domain: any) { + return {}; + } + getInterval() { + return { + expression: {}, + }; + } + } + return { TimeBuckets: MockTimeBuckets }; +}); + +jest.mock('../../public/lib/api', () => ({ + ...jest.requireActual('../../public/lib/api'), + loadIndexPatterns: async () => { + const INDEX_PATTERNS = [ + { attributes: { title: 'index1' } }, + { attributes: { title: 'index2' } }, + { attributes: { title: 'index3' } }, + ]; + return await INDEX_PATTERNS; + }, + getHttpClient: () => mockHttpClient, +})); + +const { setup } = pageHelpers.watchEdit; + +describe.skip('', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: WatchEditTestBed; + + afterAll(() => { + server.restore(); + }); + + describe('Advanced watch', () => { + beforeEach(async () => { + httpRequestsMockHelpers.setLoadWatchResponse(WATCH); + + testBed = await setup(); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + await nextTick(); + testBed.component.update(); + }); + }); + + describe('on component mount', () => { + test('should set the correct page title', () => { + const { find } = testBed; + expect(find('pageTitle').text()).toBe(`Edit ${WATCH.watch.name}`); + }); + + test('should populate the correct values', () => { + const { find, exists, component } = testBed; + const { watch } = WATCH; + const codeEditor = component.find('EuiCodeEditor'); + + expect(exists('jsonWatchForm')).toBe(true); + expect(find('nameInput').props().value).toBe(watch.name); + expect(find('idInput').props().value).toBe(watch.id); + expect(JSON.parse(codeEditor.props().value as string)).toEqual(defaultWatchJson); + + // ID should not be editable + expect(find('idInput').props().readOnly).toEqual(true); + }); + + test('save a watch with new values', async () => { + const { form, actions } = testBed; + const { watch } = WATCH; + + const EDITED_WATCH_NAME = 'new_watch_name'; + + form.setInputValue('nameInput', EDITED_WATCH_NAME); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSubmitButton(); + await nextTick(); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + const DEFAULT_LOGGING_ACTION_ID = 'logging_1'; + const DEFAULT_LOGGING_ACTION_TYPE = 'logging'; + const DEFAULT_LOGGING_ACTION_TEXT = + 'There are {{ctx.payload.hits.total}} documents in your index. Threshold is 10.'; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + id: watch.id, + name: EDITED_WATCH_NAME, + type: watch.type, + isNew: false, + actions: [ + { + id: DEFAULT_LOGGING_ACTION_ID, + type: DEFAULT_LOGGING_ACTION_TYPE, + text: DEFAULT_LOGGING_ACTION_TEXT, + [DEFAULT_LOGGING_ACTION_TYPE]: { + text: DEFAULT_LOGGING_ACTION_TEXT, + }, + }, + ], + watch: defaultWatchJson, + }) + ); + }); + }); + }); + + describe('Threshold watch', () => { + const watch = getWatch({ + id: getRandomString(), + type: 'threshold', + name: 'my_threshold_watch', + timeField: '@timestamp', + triggerIntervalSize: 10, + triggerIntervalUnit: 'm', + aggType: 'count', + termSize: 10, + thresholdComparator: '>', + timeWindowSize: 10, + timeWindowUnit: 'm', + threshold: [1000], + }); + + beforeEach(async () => { + httpRequestsMockHelpers.setLoadWatchResponse({ watch }); + + testBed = await setup(); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + const { component } = testBed; + await nextTick(); + component.update(); + }); + }); + + describe('on component mount', () => { + test('should set the correct page title', () => { + const { find } = testBed; + expect(find('pageTitle').text()).toBe(`Edit ${watch.name}`); + }); + + test('should populate the correct values', () => { + const { find, exists } = testBed; + + expect(exists('thresholdWatchForm')).toBe(true); + expect(find('nameInput').props().value).toBe(watch.name); + expect(find('watchTimeFieldSelect').props().value).toBe(watch.timeField); + }); + + test('should save the watch with new values', async () => { + const { form, actions } = testBed; + + const EDITED_WATCH_NAME = 'new_threshold_watch_name'; + + form.setInputValue('nameInput', EDITED_WATCH_NAME); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + actions.clickSubmitButton(); + await nextTick(); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + const { + id, + type, + timeField, + triggerIntervalSize, + triggerIntervalUnit, + aggType, + termSize, + thresholdComparator, + timeWindowSize, + timeWindowUnit, + threshold, + } = watch; + + expect(latestRequest.requestBody).toEqual( + JSON.stringify({ + id, + name: EDITED_WATCH_NAME, + type, + isNew: false, + actions: [], + timeField, + triggerIntervalSize, + triggerIntervalUnit, + aggType, + termSize, + thresholdComparator, + timeWindowSize, + timeWindowUnit, + threshold: threshold && threshold[0], + }) + ); + }); + }); + }); +}); diff --git a/x-pack/plugins/watcher/__jest__/client_integration/watch_list.test.ts b/x-pack/plugins/watcher/__jest__/client_integration/watch_list.test.ts new file mode 100644 index 00000000000000..d119b7bb21f6a4 --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/watch_list.test.ts @@ -0,0 +1,238 @@ +/* + * 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 { act } from 'react-dom/test-utils'; +import * as fixtures from '../../test/fixtures'; +import { + setupEnvironment, + pageHelpers, + nextTick, + getRandomString, + findTestSubject, +} from './helpers'; +import { WatchListTestBed } from './helpers/watch_list.helpers'; +import { ROUTES } from '../../common/constants'; + +const { API_ROOT } = ROUTES; + +jest.mock('ui/chrome', () => ({ + breadcrumbs: { set: () => {} }, + addBasePath: (path: string) => path || '/api/watcher', +})); + +jest.mock('ui/time_buckets', () => {}); + +const { setup } = pageHelpers.watchList; + +describe.skip('', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: WatchListTestBed; + + afterAll(() => { + server.restore(); + }); + + describe('on component mount', () => { + beforeEach(async () => { + testBed = await setup(); + }); + + test('should set the correct app title', () => { + const { exists, find } = testBed; + expect(exists('appTitle')).toBe(true); + expect(find('appTitle').text()).toEqual('Watcher'); + }); + + describe('watches', () => { + describe('when there are no watches', () => { + beforeEach(() => { + httpRequestsMockHelpers.setLoadWatchesResponse({ watches: [] }); + }); + + test('should display an empty prompt', async () => { + const { component, exists } = await setup(); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + await nextTick(); + component.update(); + }); + + expect(exists('emptyPrompt')).toBe(true); + expect(exists('emptyPrompt.createWatchButton')).toBe(true); + }); + }); + + // create a threshold and advanced watch type and monitoring + describe('when there are watches', () => { + const watch1 = fixtures.getWatch({ + name: `watchA-${getRandomString()}`, + id: `a-${getRandomString()}`, + type: 'threshold', + }); + const watch2 = fixtures.getWatch({ + name: `watchB-${getRandomString()}`, + id: `b-${getRandomString()}`, + type: 'json', + }); + const watch3 = fixtures.getWatch({ + name: `watchC-${getRandomString()}`, + id: `c-${getRandomString()}`, + type: 'monitoring', + isSystemWatch: true, + }); + + const watches = [watch1, watch2, watch3]; + + beforeEach(async () => { + httpRequestsMockHelpers.setLoadWatchesResponse({ watches }); + + testBed = await setup(); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + await nextTick(); + testBed.component.update(); + }); + }); + + test('should have a link to the documentation', () => { + const { exists, find } = testBed; + expect(exists('documentationLink')).toBe(true); + expect(find('documentationLink').text()).toBe('Watcher docs'); + }); + + test('should list them in the table', async () => { + const { table } = testBed; + const { tableCellsValues } = table.getMetaData('watchesTable'); + + const getExpectedValue = (value: any) => (typeof value === 'undefined' ? '' : value); + + tableCellsValues.forEach((row, i) => { + const watch = watches[i]; + const { name, id, watchStatus } = watch; + + expect(row).toEqual([ + '', + id, // required value + getExpectedValue(name), + watchStatus.state, // required value + getExpectedValue(watchStatus.comment), + getExpectedValue(watchStatus.lastMetCondition), + getExpectedValue(watchStatus.lastChecked), + '', + ]); + }); + }); + + test('should have a button to create a watch', () => { + const { exists } = testBed; + expect(exists('createWatchButton')).toBe(true); + }); + + test('should have a link to view watch details', () => { + const { table } = testBed; + const { rows } = table.getMetaData('watchesTable'); + const idColumn = rows[0].columns[1].reactWrapper; + + expect(findTestSubject(idColumn, `watchIdColumn-${watch1.id}`).length).toBe(1); + expect(findTestSubject(idColumn, `watchIdColumn-${watch1.id}`).props().href).toEqual( + `#/management/elasticsearch/watcher/watches/watch/${watch1.id}/status` + ); + }); + + test('should have action buttons on each row to edit and delete a watch', () => { + const { table } = testBed; + const { rows } = table.getMetaData('watchesTable'); + const lastColumn = rows[0].columns[rows[0].columns.length - 1].reactWrapper; + + expect(findTestSubject(lastColumn, 'editWatchButton').length).toBe(1); + expect(findTestSubject(lastColumn, 'deleteWatchButton').length).toBe(1); + }); + + describe('system watch', () => { + test('should disable edit and delete actions', async () => { + const { table } = testBed; + const { rows } = table.getMetaData('watchesTable'); + const systemWatch = rows[2]; + const firstColumn = systemWatch.columns[0].reactWrapper; + const lastColumn = systemWatch.columns[rows[0].columns.length - 1].reactWrapper; + + expect( + findTestSubject(firstColumn, `checkboxSelectRow-${watch3.id}`) + .getDOMNode() + .getAttribute('disabled') + ).toEqual(''); + expect( + findTestSubject(lastColumn, 'editWatchButton') + .getDOMNode() + .getAttribute('disabled') + ).toEqual(''); + expect( + findTestSubject(lastColumn, 'deleteWatchButton') + .getDOMNode() + .getAttribute('disabled') + ).toEqual(''); + }); + }); + + describe('delete watch', () => { + test('should show a confirmation when clicking the delete watch button', async () => { + const { actions } = testBed; + + await actions.clickWatchActionAt(0, 'delete'); + + // We need to read the document "body" as the modal is added there and not inside + // the component DOM tree. + expect( + document.body.querySelector('[data-test-subj="deleteWatchesConfirmation"]') + ).not.toBe(null); + + expect( + document.body.querySelector('[data-test-subj="deleteWatchesConfirmation"]')! + .textContent + ).toContain('Delete watch'); + }); + + test('should send the correct HTTP request to delete repository', async () => { + const { component, actions, table } = testBed; + const { rows } = table.getMetaData('watchesTable'); + + const watchId = rows[0].columns[2].value; + + await actions.clickWatchActionAt(0, 'delete'); + + const modal = document.body.querySelector( + '[data-test-subj="deleteWatchesConfirmation"]' + ); + const confirmButton: HTMLButtonElement | null = modal!.querySelector( + '[data-test-subj="confirmModalConfirmButton"]' + ); + + httpRequestsMockHelpers.setDeleteWatchResponse({ + results: { + successes: [watchId], + errors: [], + }, + }); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + confirmButton!.click(); + await nextTick(); + component.update(); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + expect(latestRequest.method).toBe('POST'); + expect(latestRequest.url).toBe(`${API_ROOT}/watches/delete`); + }); + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/watcher/__jest__/client_integration/watch_status.test.ts b/x-pack/plugins/watcher/__jest__/client_integration/watch_status.test.ts new file mode 100644 index 00000000000000..4e0f3ce31eea26 --- /dev/null +++ b/x-pack/plugins/watcher/__jest__/client_integration/watch_status.test.ts @@ -0,0 +1,54 @@ +/* + * 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 { act } from 'react-dom/test-utils'; +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { WatchStatusTestBed } from './helpers/watch_status.helpers'; +import { WATCH } from './helpers/constants'; +import { getWatchHistory } from '../../test/fixtures'; + +jest.mock('ui/chrome', () => ({ + breadcrumbs: { set: () => {} }, + addBasePath: (path: string) => path || '/api/watcher', +})); + +jest.mock('ui/time_buckets', () => {}); + +const { setup } = pageHelpers.watchStatus; + +describe.skip('', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: WatchStatusTestBed; + + afterAll(() => { + server.restore(); + }); + + describe('on component mount', () => { + beforeEach(async () => { + const watchHistory1 = getWatchHistory({ startTime: '2019-06-04T01:11:11.294' }); + const watchHistory2 = getWatchHistory({ startTime: '2019-06-04T01:10:10.987Z' }); + + const watchHistoryItems = { watchHistoryItems: [watchHistory1, watchHistory2] }; + + httpRequestsMockHelpers.setLoadWatchResponse(WATCH); + httpRequestsMockHelpers.setLoadWatchHistoryResponse(watchHistoryItems); + + testBed = await setup(); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + await nextTick(); + testBed.component.update(); + }); + }); + + test('should set the correct page title', () => { + const { find } = testBed; + + expect(find('pageTitle').text()).toBe(`Current status for '${WATCH.watch.name}'`); + }); + }); +}); diff --git a/x-pack/plugins/watcher/__tests__/plugin_definition.js b/x-pack/plugins/watcher/__tests__/plugin_definition.js deleted file mode 100644 index c95d5aba8bbc50..00000000000000 --- a/x-pack/plugins/watcher/__tests__/plugin_definition.js +++ /dev/null @@ -1,14 +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 { pluginDefinition } from '../plugin_definition'; - -describe ('pluginDefinition', () => { - it('defines the configPrefix correctly', () => { - expect(pluginDefinition.configPrefix).to.be('xpack.watcher'); - }); -}); diff --git a/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx index dcb17d82f7a1fd..6d75495cbfc20d 100644 --- a/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx +++ b/x-pack/plugins/watcher/public/components/delete_watches_modal.tsx @@ -45,6 +45,7 @@ export const DeleteWatchesModal = ({ callback()} onConfirm={async () => { diff --git a/x-pack/plugins/watcher/public/components/section_error.tsx b/x-pack/plugins/watcher/public/components/section_error.tsx index 05cdc040d7592a..fea655107731fc 100644 --- a/x-pack/plugins/watcher/public/components/section_error.tsx +++ b/x-pack/plugins/watcher/public/components/section_error.tsx @@ -18,7 +18,7 @@ interface Props { }; } -export const SectionError: React.FunctionComponent = ({ title, error }) => { +export const SectionError: React.FunctionComponent = ({ title, error, ...rest }) => { const { error: errorString, cause, // wrapEsError() on the server adds a "cause" array @@ -26,7 +26,7 @@ export const SectionError: React.FunctionComponent = ({ title, error }) = } = error.data; return ( - +
{message || errorString}
{cause && ( diff --git a/x-pack/plugins/watcher/public/components/section_loading.tsx b/x-pack/plugins/watcher/public/components/section_loading.tsx index 0faf97f8ebb0bd..4c6273682a0e4c 100644 --- a/x-pack/plugins/watcher/public/components/section_loading.tsx +++ b/x-pack/plugins/watcher/public/components/section_loading.tsx @@ -17,6 +17,7 @@ export const SectionLoading: React.FunctionComponent = ({ children }) => } body={{children}} + data-test-subj="sectionLoading" /> ); }; diff --git a/x-pack/plugins/watcher/public/lib/api.ts b/x-pack/plugins/watcher/public/lib/api.ts index e503e6f17dab79..359725f5540da4 100644 --- a/x-pack/plugins/watcher/public/lib/api.ts +++ b/x-pack/plugins/watcher/public/lib/api.ts @@ -41,8 +41,9 @@ export const loadWatches = (interval: number) => { path: `${basePath}/watches`, method: 'get', interval, - processData: ({ watches }: { watches: any }) => - watches.map((watch: any) => Watch.fromUpstreamJson(watch)), + processData: ({ watches = [] }: { watches: any[] }) => { + return watches.map((watch: any) => Watch.fromUpstreamJson(watch)); + }, }); }; @@ -50,7 +51,7 @@ export const loadWatchDetail = (id: string) => { return useRequest({ path: `${basePath}/watch/${id}`, method: 'get', - processData: ({ watch }: { watch: any }) => Watch.fromUpstreamJson(watch), + processData: ({ watch = {} }: { watch: any }) => Watch.fromUpstreamJson(watch), }); }; @@ -64,8 +65,11 @@ export const loadWatchHistory = (id: string, startTime: string) => { return useRequest({ path, method: 'get', - processData: ({ watchHistoryItems: items }: { watchHistoryItems: any }) => - items.map((historyItem: any) => WatchHistoryItem.fromUpstreamJson(historyItem)), + processData: ({ watchHistoryItems = [] }: { watchHistoryItems: any }) => { + return watchHistoryItems.map((historyItem: any) => + WatchHistoryItem.fromUpstreamJson(historyItem) + ); + }, }); }; @@ -169,7 +173,7 @@ export const loadSettings = () => { path: `${basePath}/settings`, method: 'get', processData: (data: { - actionTypes: { + action_types: { [key: string]: { enabled: boolean; }; diff --git a/x-pack/plugins/watcher/public/lib/use_request.ts b/x-pack/plugins/watcher/public/lib/use_request.ts index 6770f820b76565..2816360f5febae 100644 --- a/x-pack/plugins/watcher/public/lib/use_request.ts +++ b/x-pack/plugins/watcher/public/lib/use_request.ts @@ -26,7 +26,7 @@ export const sendRequest = async ({ try { const response = await (getHttpClient() as any)[method](path, body); - if (!response.data) { + if (typeof response.data === 'undefined') { throw new Error(response.statusText); } @@ -35,7 +35,7 @@ export const sendRequest = async ({ }; } catch (e) { return { - error: e, + error: e.response ? e.response : e, }; } }; diff --git a/x-pack/plugins/watcher/public/models/action/action.js b/x-pack/plugins/watcher/public/models/action/action.js index 051c2fc6868aaa..2f1850c3a434cb 100644 --- a/x-pack/plugins/watcher/public/models/action/action.js +++ b/x-pack/plugins/watcher/public/models/action/action.js @@ -5,7 +5,7 @@ */ import { get, set } from 'lodash'; -import { ACTION_TYPES } from 'plugins/watcher/../common/constants'; +import { ACTION_TYPES } from '../../../common/constants'; import { EmailAction } from './email_action'; import { LoggingAction } from './logging_action'; import { SlackAction } from './slack_action'; diff --git a/x-pack/plugins/watcher/public/models/action_status/action_status.js b/x-pack/plugins/watcher/public/models/action_status/action_status.js index b24893645e9755..fa9e056554ab00 100644 --- a/x-pack/plugins/watcher/public/models/action_status/action_status.js +++ b/x-pack/plugins/watcher/public/models/action_status/action_status.js @@ -5,7 +5,7 @@ */ import { get } from 'lodash'; -import { getMoment } from 'plugins/watcher/../common/lib/get_moment'; +import { getMoment } from '../../../common/lib/get_moment'; export class ActionStatus { constructor(props = {}) { diff --git a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js index 27eb99fbf13066..2d8415284fe2c2 100644 --- a/x-pack/plugins/watcher/public/models/execute_details/execute_details.js +++ b/x-pack/plugins/watcher/public/models/execute_details/execute_details.js @@ -50,7 +50,7 @@ export class ExecuteDetails { const triggeredTime = this.triggeredTimeValue && this.triggeredTimeValue !== '' ? getDateMathFormat(this.triggeredTimeUnit, this.triggeredTimeValue) : undefined; - const scheduledTime = this.scheduledTimeTime && this.scheduledTimeValue !== '' + const scheduledTime = this.scheduledTimeValue && this.scheduledTimeValue !== '' ? getDateMathFormat(this.scheduledTimeUnit, this.scheduledTimeValue) : undefined; diff --git a/x-pack/plugins/watcher/public/models/watch/base_watch.js b/x-pack/plugins/watcher/public/models/watch/base_watch.js index cbd3bc540b90b6..cf68776081c18e 100644 --- a/x-pack/plugins/watcher/public/models/watch/base_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/base_watch.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getSearchValue } from 'plugins/watcher/lib/get_search_value'; +import { getSearchValue } from '../../lib/get_search_value'; import { get, isEqual, remove, map } from 'lodash'; import { Action } from '../action'; import { WatchStatus } from '../watch_status'; diff --git a/x-pack/plugins/watcher/public/models/watch/json_watch.js b/x-pack/plugins/watcher/public/models/watch/json_watch.js index ecda151e3ea34d..3dd7af759970e5 100644 --- a/x-pack/plugins/watcher/public/models/watch/json_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/json_watch.js @@ -7,7 +7,7 @@ import uuid from 'uuid'; import { get } from 'lodash'; import { BaseWatch } from './base_watch'; -import { ACTION_TYPES, WATCH_TYPES } from 'plugins/watcher/../common/constants'; +import { ACTION_TYPES, WATCH_TYPES } from '../../../common/constants'; import defaultWatchJson from './default_watch.json'; import { i18n } from '@kbn/i18n'; diff --git a/x-pack/plugins/watcher/public/models/watch/monitoring_watch.js b/x-pack/plugins/watcher/public/models/watch/monitoring_watch.js index 94aec4fb54bed9..a0873934e17591 100644 --- a/x-pack/plugins/watcher/public/models/watch/monitoring_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/monitoring_watch.js @@ -5,7 +5,7 @@ */ import { BaseWatch } from './base_watch'; -import { WATCH_TYPES } from 'plugins/watcher/../common/constants'; +import { WATCH_TYPES } from '../../../common/constants'; /** * {@code MonitoringWatch} system defined watches created by the Monitoring plugin. diff --git a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js index 3b7ed15f58af8c..48c7b406f4112a 100644 --- a/x-pack/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/plugins/watcher/public/models/watch/threshold_watch.js @@ -6,8 +6,8 @@ import { BaseWatch } from './base_watch'; import uuid from 'uuid'; -import { WATCH_TYPES, SORT_ORDERS, COMPARATORS } from 'plugins/watcher/../common/constants'; -import { getTimeUnitsLabel } from 'plugins/watcher/lib/get_time_units_label'; +import { WATCH_TYPES, SORT_ORDERS, COMPARATORS } from '../../../common/constants'; +import { getTimeUnitsLabel } from '../../lib/get_time_units_label'; import { i18n } from '@kbn/i18n'; import { aggTypes } from './agg_types'; import { groupByTypes } from './group_by_types'; diff --git a/x-pack/plugins/watcher/public/models/watch/watch.js b/x-pack/plugins/watcher/public/models/watch/watch.js index 864ba0a61c8194..d58a7799c65169 100644 --- a/x-pack/plugins/watcher/public/models/watch/watch.js +++ b/x-pack/plugins/watcher/public/models/watch/watch.js @@ -5,7 +5,7 @@ */ import { get, set } from 'lodash'; -import { WATCH_TYPES } from 'plugins/watcher/../common/constants'; +import { WATCH_TYPES } from '../../../common/constants'; import { JsonWatch } from './json_watch'; import { ThresholdWatch } from './threshold_watch'; import { MonitoringWatch } from './monitoring_watch'; @@ -21,7 +21,7 @@ export class Watch { return WatchTypes; } - static fromUpstreamJson(upstreamWatch) { + static fromUpstreamJson(upstreamWatch = {}) { const type = get(upstreamWatch, 'type'); const WatchType = WatchTypes[type]; diff --git a/x-pack/plugins/watcher/public/models/watch_history_item/watch_history_item.js b/x-pack/plugins/watcher/public/models/watch_history_item/watch_history_item.js index f6229eb5b4238d..a5918cec2764b5 100644 --- a/x-pack/plugins/watcher/public/models/watch_history_item/watch_history_item.js +++ b/x-pack/plugins/watcher/public/models/watch_history_item/watch_history_item.js @@ -6,7 +6,7 @@ import 'moment-duration-format'; import { get } from 'lodash'; -import { getMoment } from 'plugins/watcher/../common/lib/get_moment'; +import { getMoment } from '../../../common/lib/get_moment'; import { WatchStatus } from '../watch_status'; export class WatchHistoryItem { diff --git a/x-pack/plugins/watcher/public/models/watch_status/watch_status.js b/x-pack/plugins/watcher/public/models/watch_status/watch_status.js index 59034ab9624a8e..57409bc1bb8e37 100644 --- a/x-pack/plugins/watcher/public/models/watch_status/watch_status.js +++ b/x-pack/plugins/watcher/public/models/watch_status/watch_status.js @@ -5,7 +5,7 @@ */ import { get } from 'lodash'; -import { getMoment } from 'plugins/watcher/../common/lib/get_moment'; +import { getMoment } from '../../../common/lib/get_moment'; import { ActionStatus } from '../action_status'; export class WatchStatus { diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx index af8e4944a9d194..f092e95216fbfd 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx @@ -101,7 +101,7 @@ const JsonWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { -

{pageTitle}

+

{pageTitle}

@@ -119,6 +119,7 @@ const JsonWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { }} isSelected={tab.id === selectedTab} key={index} + data-test-subj="tab" > {tab.name} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx index ddfff9d8506593..8262f8c5235c83 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx @@ -59,7 +59,11 @@ export const JsonWatchEditForm = () => { return ( - + {serverError && ( { /> } error={serverError} + data-test-subj="sectionError" /> @@ -84,6 +89,7 @@ export const JsonWatchEditForm = () => { id="watchName" name="name" value={watch.name || ''} + data-test-subj="nameInput" onChange={(e: React.ChangeEvent) => { const watchName = e.target.value; setWatchProperty('name', watchName); @@ -107,6 +113,7 @@ export const JsonWatchEditForm = () => { ) => { @@ -145,6 +152,7 @@ export const JsonWatchEditForm = () => { mode="json" width="100%" theme="github" + data-test-subj="jsonEditor" aria-label={i18n.translate( 'xpack.watcher.sections.watchEdit.json.form.watchJsonAriaLabel', { @@ -163,7 +171,7 @@ export const JsonWatchEditForm = () => { { setIsSaving(false); - if (data.error === 'validation') { + if (data && data.error === 'validation') { return setValidationError(data.message); } diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx index cd9864b1e11071..85cf8f1b1e1fed 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx @@ -119,6 +119,7 @@ export const JsonWatchEditSimulate = ({ { setExecuteDetails( new ExecuteDetails({ @@ -158,7 +159,7 @@ export const JsonWatchEditSimulate = ({

- + { const value = e.target.value; setExecuteDetails( @@ -227,6 +229,7 @@ export const JsonWatchEditSimulate = ({ {timeUnits[TIME_UNITS.SECOND].labelPlural}} onChange={e => { const value = e.target.value; @@ -268,6 +271,7 @@ export const JsonWatchEditSimulate = ({ } )} checked={ignoreCondition} + data-test-subj="ignoreConditionSwitch" onChange={e => { setExecuteDetails( new ExecuteDetails({ ...executeDetails, ignoreCondition: e.target.checked }) @@ -383,6 +387,7 @@ export const JsonWatchEditSimulate = ({ -

+

{i18n.translate('xpack.watcher.sections.watchEdit.simulateResults.title', { defaultMessage: 'Simulation results', })} @@ -163,6 +163,7 @@ export const JsonWatchEditSimulateResults = ({ onClose={() => { onCloseFlyout(); }} + data-test-subj="simulateResultsFlyout" aria-labelledby="simulateResultsFlyOutTitle" > diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx index e95334a6af9ebd..08c7756fb4110e 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx @@ -44,6 +44,7 @@ export const EmailActionFields: React.FunctionComponent = ({ { const newOptions = [...toOptions, { label: searchValue }]; @@ -78,6 +79,7 @@ export const EmailActionFields: React.FunctionComponent = ({ { editAction({ key: 'subject', value: e.target.value }); @@ -102,6 +104,7 @@ export const EmailActionFields: React.FunctionComponent = ({ fullWidth value={body || ''} name="body" + data-test-subj="emailBodyInput" onChange={e => { editAction({ key: 'body', value: e.target.value }); }} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index_action_fields.tsx index b4e65609efffcf..1cafb08ca40602 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/index_action_fields.tsx @@ -40,6 +40,7 @@ export const IndexActionFields: React.FunctionComponent = ({ ) => { editAction({ key: 'index', value: e.target.value }); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/jira_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/jira_action_fields.tsx index ec746d0cb2ecb8..b8bdeaff908216 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/jira_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/jira_action_fields.tsx @@ -48,6 +48,7 @@ export const JiraActionFields: React.FunctionComponent = ({ fullWidth name="projectKey" value={projectKey || ''} + data-test-subj="jiraProjectKeyInput" onChange={e => { editAction({ key: 'projectKey', value: e.target.value }); }} @@ -76,6 +77,7 @@ export const JiraActionFields: React.FunctionComponent = ({ fullWidth value={issueType || ''} name="issueType" + data-test-subj="jiraIssueTypeInput" onChange={e => { editAction({ key: 'issueType', value: e.target.value }); }} @@ -104,6 +106,7 @@ export const JiraActionFields: React.FunctionComponent = ({ fullWidth value={summary || ''} name="summary" + data-test-subj="jiraSummaryInput" onChange={e => { editAction({ key: 'summary', value: e.target.value }); }} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/logging_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/logging_action_fields.tsx index 923d3e8f627d50..b70e504519ae59 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/logging_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/logging_action_fields.tsx @@ -41,6 +41,7 @@ export const LoggingActionFields: React.FunctionComponent = ({ fullWidth name="text" value={text || ''} + data-test-subj="loggingTextInput" onChange={(e: React.ChangeEvent) => { editAction({ key: 'text', value: e.target.value }); }} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/pagerduty_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/pagerduty_action_fields.tsx index 826c7a2c3989a5..b2b670bf6b91fb 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/pagerduty_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/pagerduty_action_fields.tsx @@ -45,6 +45,7 @@ export const PagerDutyActionFields: React.FunctionComponent = ({ fullWidth name="description" value={description || ''} + data-test-subj="pagerdutyDescriptionInput" onChange={(e: React.ChangeEvent) => { editAction({ key: 'description', value: e.target.value }); }} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx index 202e8ac4c53f16..7b5a598c97eb73 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/slack_action_fields.tsx @@ -38,6 +38,7 @@ export const SlackActionFields: React.FunctionComponent = ({ noSuggestions fullWidth selectedOptions={toOptions} + data-test-subj="slackRecipientComboBox" onCreateOption={(searchValue: string) => { const newOptions = [...toOptions, { label: searchValue }]; editAction({ key: 'to', value: newOptions.map(newOption => newOption.label) }); @@ -64,6 +65,7 @@ export const SlackActionFields: React.FunctionComponent = ({ fullWidth name="text" value={text} + data-test-subj="slackMessageTextarea" onChange={e => { editAction({ key: 'text', value: e.target.value }); }} diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx index f2a32a92dfb136..d877ec1dbcbde9 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/webhook_action_fields.tsx @@ -57,6 +57,7 @@ export const WebhookActionFields: React.FunctionComponent = ({ ({ text: verb.toUpperCase(), value: verb }))} onChange={e => { editAction({ key: 'method', value: e.target.value }); @@ -83,6 +84,7 @@ export const WebhookActionFields: React.FunctionComponent = ({ fullWidth name="host" value={host || ''} + data-test-subj="webhookHostInput" onChange={e => { editAction({ key: 'host', value: e.target.value }); }} @@ -118,6 +120,7 @@ export const WebhookActionFields: React.FunctionComponent = ({ fullWidth name="port" value={port || ''} + data-test-subj="webhookPortInput" onChange={e => { editAction({ key: 'port', value: parseInt(e.target.value, 10) }); }} @@ -149,6 +152,7 @@ export const WebhookActionFields: React.FunctionComponent = ({ fullWidth name="path" value={path || ''} + data-test-subj="webhookPathInput" onChange={e => { editAction({ key: 'path', value: e.target.value }); }} @@ -174,6 +178,7 @@ export const WebhookActionFields: React.FunctionComponent = ({ { editAction({ key: 'username', value: e.target.value }); }} @@ -197,6 +202,7 @@ export const WebhookActionFields: React.FunctionComponent = ({ { editAction({ key: 'password', value: e.target.value }); }} @@ -226,6 +232,7 @@ export const WebhookActionFields: React.FunctionComponent = ({ width="100%" height="200px" theme="github" + data-test-subj="webhookBodyEditor" aria-label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.webhookAction.bodyCodeEditorAriaLabel', { diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx index 06c917f144e62f..0f948a57e21273 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx @@ -90,6 +90,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ id={action.id} className="euiAccordionForm" buttonContentClassName="euiAccordionForm__button" + data-test-subj="watchActionAccordion" buttonContent={ @@ -199,6 +200,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ type="submit" isDisabled={hasErrors} isLoading={isExecuting} + data-test-subj="simulateActionButton" onClick={async () => { const selectedWatchAction = watch.actions.filter( (watchAction: any) => watchAction.id === action.id @@ -234,7 +236,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ (actionItem: ActionType) => actionItem.id === action.id ); - if (actionStatus.lastExecutionSuccessful === false) { + if (actionStatus && actionStatus.lastExecutionSuccessful === false) { const message = actionStatus.lastExecutionReason || action.simulateFailMessage; return toastNotifications.addDanger(message); } diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_dropdown.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_dropdown.tsx index 0bf856899d35df..a0cedd9e0eb980 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_dropdown.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_dropdown.tsx @@ -48,7 +48,10 @@ export const WatchActionsDropdown: React.FunctionComponent = ({ settings, const actions = Object.entries(allActionTypes).map( ([type, { typeName, iconClass, selectMessage }]) => { - const isEnabled = settings ? settings.actionTypes[type].enabled : true; + const isEnabled = + settings && settings.actionTypes[type] && settings.actionTypes[type].enabled + ? settings.actionTypes[type].enabled + : true; return { type, typeName, @@ -90,6 +93,7 @@ export const WatchActionsDropdown: React.FunctionComponent = ({ settings, { addAction({ type: action.type, defaults: { isNew: true } }); setIsPopOverOpen(false); diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_panel.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_panel.tsx index c339e27d8c0448..504c5e10ed665b 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_panel.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_panel.tsx @@ -5,7 +5,7 @@ */ import { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React, { Fragment, useContext } from 'react'; +import React, { useContext } from 'react'; import { loadSettings } from '../../../../lib/api'; import { WatchActionsDropdown } from './threshold_watch_action_dropdown'; import { WatchActionsAccordion } from './threshold_watch_action_accordion'; @@ -25,7 +25,7 @@ export const WatchActionsPanel: React.FunctionComponent = ({ actionErrors const { data: settings, isLoading } = loadSettings(); return ( - +
@@ -46,6 +46,6 @@ export const WatchActionsPanel: React.FunctionComponent = ({ actionErrors - +
); }; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index 962fa03883834b..c8325b16f28ce9 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -203,7 +203,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit -

{pageTitle}

+

{pageTitle}

@@ -212,7 +212,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit
- + {serverError && ( { setWatchProperty('name', e.target.value); @@ -277,6 +278,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit fullWidth noSuggestions={!indexOptions.length} options={indexOptions} + data-test-subj="indicesComboBox" selectedOptions={(watch.index || []).map((anIndex: string) => { return { label: anIndex, @@ -329,6 +331,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit options={timeFieldOptions} fullWidth name="watchTimeField" + data-test-subj="watchTimeFieldSelect" value={watch.timeField} onChange={e => { setWatchProperty('timeField', e.target.value); @@ -359,6 +362,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit fullWidth min={1} value={watch.triggerIntervalSize} + data-test-subj="triggerIntervalSizeInput" onChange={e => { const { value } = e.target; const triggerIntervalSize = value !== '' ? parseInt(value, 10) : value; @@ -393,7 +397,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit {shouldShowThresholdExpression ? ( -

+

{ }; const aggLabel = aggTypes[watch.aggType].text; return ( - +
{watchVisualizationDataKeys.length ? ( @@ -283,7 +283,7 @@ const WatchVisualizationUi = () => { )} - +
); } return null; diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx index 402cce4a8e6a61..b6946c8cc54f6a 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_edit/components/watch_edit.tsx @@ -16,7 +16,7 @@ import { Watch } from 'plugins/watcher/models/watch'; import { FormattedMessage } from '@kbn/i18n/react'; import { WATCH_TYPES } from '../../../../common/constants'; import { BaseWatch } from '../../../../common/types/watch_types'; -import { getPageErrorCode, PageError, SectionLoading } from '../../../components'; +import { getPageErrorCode, PageError, SectionLoading, SectionError } from '../../../components'; import { loadWatch } from '../../../lib/api'; import { listBreadcrumb, editBreadcrumb, createBreadcrumb } from '../../../lib/breadcrumbs'; import { JsonWatchEdit } from './json_watch_edit'; @@ -147,6 +147,22 @@ export const WatchEdit = ({ ); } + if (loadError) { + return ( + + + } + error={loadError} + /> + + ); + } + if (!watch) { return ( diff --git a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts index 9a9f02af24af5c..9d6a999db60e3f 100644 --- a/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts +++ b/x-pack/plugins/watcher/public/sections/watch_edit/watch_edit_actions.ts @@ -78,7 +78,7 @@ export async function saveWatch(watch: BaseWatch): Promise { ); goToWatchList(); } catch (error) { - return { error }; + return error.response ? { error: error.response } : { error }; } } diff --git a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 208d883a219c56..17b54ce9b1ea45 100644 --- a/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -194,6 +194,7 @@ const WatchListUi = () => { } body={emptyPromptBody} actions={createWatchContextMenu} + data-test-subj="emptyPrompt" /> ); @@ -225,7 +226,6 @@ const WatchListUi = () => { render: (id: string) => { return ( @@ -312,6 +312,7 @@ const WatchListUi = () => { iconType="pencil" color="primary" href={`#/management/elasticsearch/watcher/watches/watch/${watch.id}/edit`} + data-test-subj="editWatchButton" /> ); @@ -339,6 +340,7 @@ const WatchListUi = () => { onClick={() => { setWatchesToDelete([watch.id]); }} + data-test-subj="deleteWatchButton" /> ); @@ -404,6 +406,13 @@ const WatchListUi = () => { defaultMessage="No watches to show" /> } + rowProps={() => ({ + 'data-test-subj': 'row', + })} + cellProps={() => ({ + 'data-test-subj': 'cell', + })} + data-test-subj="watchesTable" /> ); } @@ -423,7 +432,7 @@ const WatchListUi = () => { -

+

{

- + { const [actionStatuses, setActionStatuses] = useState([]); const [isActionStatusLoading, setIsActionStatusLoading] = useState(false); - const [selectedErrorAction, setSelectedErrorAction] = useState(null); - const { - id: watchId, - watchErrors: { actionErrors }, - watchStatus: { actionStatuses: currentActionStatuses }, - isSystemWatch, - } = watchDetail; + const { id: watchId, watchErrors, watchStatus, isSystemWatch } = watchDetail; + + const actionErrors = watchErrors && watchErrors.actionErrors; + const currentActionStatuses = watchStatus && watchStatus.actionStatuses; const hasActionErrors = actionErrors && Object.keys(actionErrors).length > 0; @@ -97,7 +94,10 @@ const WatchDetailUi = () => { const { id: actionId } = action; if (errors && errors.length > 0) { return ( - setSelectedErrorAction(actionId)}> + setSelectedErrorAction(actionId)} + data-test-subj="actionErrorsButton" + > {i18n.translate('xpack.watcher.sections.watchDetail.watchTable.errorsCellText', { defaultMessage: '{total, number} {total, plural, one {error} other {errors}}', values: { @@ -129,11 +129,12 @@ const WatchDetailUi = () => { { setIsActionStatusLoading(true); try { - const watchStatus = await ackWatchAction(watchId, actionId); - const newActionStatusesWithErrors = watchStatus.actionStatuses.map( + const newWatchStatus = await ackWatchAction(watchId, actionId); + const newActionStatusesWithErrors = newWatchStatus.actionStatuses.map( (newActionStatus: ActionStatus) => { const errors = actionErrors && actionErrors[newActionStatus.id]; return { @@ -182,11 +183,14 @@ const WatchDetailUi = () => { setSelectedErrorAction(null)} > -

{selectedErrorAction}

+

+ {selectedErrorAction} +

@@ -196,6 +200,7 @@ const WatchDetailUi = () => { })} color="danger" iconType="cross" + data-test-subj="errorMessage" > {actionErrors[selectedErrorAction].length > 1 ? (
    diff --git a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx index 75d56d7ae78d72..c612509005eaff 100644 --- a/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx +++ b/x-pack/plugins/watcher/public/sections/watch_status/components/watch_history.tsx @@ -79,7 +79,8 @@ const WatchHistoryUi = () => { if (isActivated === undefined) { // Set initial value for isActivated based on the watch we just loaded. - setIsActivated(loadedWatch.watchStatus.isActive); + const isActive = (loadedWatch.watchStatus && loadedWatch.watchStatus.isActive) || false; + setIsActivated(isActive); } const { error: historyError, data: history, isLoading } = loadWatchHistory( @@ -169,7 +170,7 @@ const WatchHistoryUi = () => { > -

    +

    { /> } error={watchHistoryDetailsError} + data-test-subj="errorMessage" /> @@ -222,7 +224,7 @@ const WatchHistoryUi = () => { > -

    +

    { pagination={PAGINATION} sorting={true} loading={isLoading} + data-test-subj="watchHistoryTable" message={ -

    +

    toggleWatchActivation()} isLoading={isTogglingActivation} > @@ -214,7 +215,7 @@ export const WatchStatus = ({ { setWatchesToDelete([watchId]); }} diff --git a/x-pack/plugins/watcher/test/fixtures/execute_details.ts b/x-pack/plugins/watcher/test/fixtures/execute_details.ts new file mode 100644 index 00000000000000..232c44737b54c4 --- /dev/null +++ b/x-pack/plugins/watcher/test/fixtures/execute_details.ts @@ -0,0 +1,29 @@ +/* + * 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. + */ + +interface ExecuteDetails { + triggerData?: { + triggeredTime?: string; + scheduledTime?: string; + }; + ignoreCondition: boolean; + actionModes?: { + [key: string]: string; + }; + recordExecution?: boolean; +} + +export const getExecuteDetails = ({ + triggerData = {}, + ignoreCondition = false, + actionModes = {}, + recordExecution, +}: Partial = {}): ExecuteDetails => ({ + triggerData, + ignoreCondition, + actionModes, + recordExecution, +}); diff --git a/x-pack/plugins/watcher/test/fixtures/index.ts b/x-pack/plugins/watcher/test/fixtures/index.ts new file mode 100644 index 00000000000000..f1e24a81c710a7 --- /dev/null +++ b/x-pack/plugins/watcher/test/fixtures/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export * from './watch'; +export * from './watch_history'; +export * from './execute_details'; diff --git a/x-pack/plugins/watcher/test/fixtures/watch.ts b/x-pack/plugins/watcher/test/fixtures/watch.ts new file mode 100644 index 00000000000000..ced37c6a6fad51 --- /dev/null +++ b/x-pack/plugins/watcher/test/fixtures/watch.ts @@ -0,0 +1,66 @@ +/* + * 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 { Moment } from 'moment'; +import { getRandomString } from '../../../../test_utils'; + +interface Watch { + id: string; + name: string; + type: 'json' | 'threshold' | 'monitoring'; + timeField?: string; + triggerIntervalSize?: number; + triggerIntervalUnit?: string; + aggType?: string; + termSize?: number; + thresholdComparator?: string; + timeWindowSize?: number; + timeWindowUnit?: string; + threshold?: number[]; + isSystemWatch: boolean; + watchStatus: { + state: 'OK' | 'Firing' | 'Error' | 'Config error' | 'Disabled'; + comment?: string; + lastMetCondition?: Moment; + lastChecked?: Moment; + isActive: boolean; + }; +} + +export const getWatch = ({ + id = getRandomString(), + name = getRandomString(), + type = 'json', + timeField, + triggerIntervalSize, + triggerIntervalUnit, + aggType, + termSize, + thresholdComparator, + timeWindowSize, + timeWindowUnit, + threshold, + isSystemWatch = false, + watchStatus = { + state: 'OK', + isActive: true, + }, +}: Partial = {}): Watch => ({ + id, + name, + type, + timeField, + triggerIntervalSize, + triggerIntervalUnit, + aggType, + termSize, + thresholdComparator, + timeWindowSize, + timeWindowUnit, + threshold, + isSystemWatch, + watchStatus, +}); diff --git a/x-pack/plugins/watcher/test/fixtures/watch_history.ts b/x-pack/plugins/watcher/test/fixtures/watch_history.ts new file mode 100644 index 00000000000000..a62b91286d519b --- /dev/null +++ b/x-pack/plugins/watcher/test/fixtures/watch_history.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +interface WatchHistory { + startTime: string; + watchStatus: { + state: 'OK' | 'Firing' | 'Error' | 'Config error' | 'Disabled'; + comment?: string; + }; +} + +export const getWatchHistory = ({ + startTime = '2019-06-03T19:44:11.088Z', + watchStatus = { + state: 'OK', + }, +}: Partial = {}): WatchHistory => ({ + startTime, + watchStatus, +}); From 53eb81a6fbed918ae38ed30dbbad442acc89cb30 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 21 Jun 2019 12:12:48 -0400 Subject: [PATCH 36/51] i18n fix --- .../translations/translations/ja-JP.json | 182 ------------------ .../translations/translations/zh-CN.json | 173 ----------------- 2 files changed, 355 deletions(-) diff --git a/x-pack/legacy/plugins/translations/translations/ja-JP.json b/x-pack/legacy/plugins/translations/translations/ja-JP.json index deaa88e49e54a8..67645d544312fd 100644 --- a/x-pack/legacy/plugins/translations/translations/ja-JP.json +++ b/x-pack/legacy/plugins/translations/translations/ja-JP.json @@ -9598,10 +9598,6 @@ "xpack.uptime.snapshotHistogram.series.downLabel": "ダウン", "xpack.uptime.snapshotHistogram.series.upLabel": "アップ", "xpack.uptime.uptimeFeatureCatalogueTitle": "アップタイム", - "xpack.watcher.actionTypeSelect.actionDisabledTextMessage": "無効になっています。{elasticsearchYmlText} を構成します。", - "xpack.watcher.actionTypeSelect.addNewActionPlaceholder": "新規アクションを追加", - "xpack.watcher.checkLicense.licenseDoesNotSupportTextMessage": "ご使用の {licenseType} ライセンスは {watcher} をサポートしていません。ライセンスをアップグレードしてください。", - "xpack.watcher.checkLicense.licenseInformationNotAvailableTextMessage": "現在ライセンス情報が利用できないため {watcher} を使用できません。", "xpack.watcher.constants.actionStates.acknowledgedStateText": "承認済み", "xpack.watcher.constants.actionStates.configErrorStateText": "構成エラー", "xpack.watcher.constants.actionStates.errorStateText": "エラー", @@ -9618,13 +9614,6 @@ "xpack.watcher.constants.watchStates.errorStateText": "エラー", "xpack.watcher.constants.watchStates.firingStateText": "実行中", "xpack.watcher.constants.watchStates.okStateText": "OK", - "xpack.watcher.create.breadcrumb": "作成", - "xpack.watcher.durationSelect.durationAmountAriaLabel": "期間", - "xpack.watcher.durationSelect.durationTimeUnitAriaLabel": "期間の時間単位", - "xpack.watcher.forbiddenMessage.contactAdministratorTextMessage": "管理者にお問い合わせください。", - "xpack.watcher.indexSelect.buildingListTextMessage": "リストを作成中… お待ちください", - "xpack.watcher.indexSelect.startTypingPlaceholder": "入力開始…", - "xpack.watcher.list.breadcrumb": "Watcher", "xpack.watcher.models.action.actionJsonPropertyMissingBadRequestMessage": "json 引数には {actionJson} プロパティが含まれている必要があります", "xpack.watcher.models.actionStatus.actionStatusJsonPropertyMissingBadRequestMessage": "json 引数には {actionStatusJson} プロパティが含まれている必要があります", "xpack.watcher.models.actionStatus.idPropertyMissingBadRequestMessage": "json 引数には {id} プロパティが含まれている必要があります", @@ -9643,27 +9632,20 @@ "xpack.watcher.models.baseWatch.watchStatusJsonPropertyMissingBadRequestMessage": "json 引数には {watchStatusJson} プロパティが含まれている必要があります", "xpack.watcher.models.emailAction.actionJsonEmailPropertyMissingBadRequestMessage": "json 引数には {actionJsonEmail} プロパティが含まれている必要があります", "xpack.watcher.models.emailAction.actionJsonEmailToPropertyMissingBadRequestMessage": "json 引数には {actionJsonEmailTo} プロパティが含まれている必要があります", - "xpack.watcher.models.emailAction.description": "「{subject}」が {toList} に送信されます", "xpack.watcher.models.emailAction.selectMessageText": "サーバーからメールを送信します。", "xpack.watcher.models.emailAction.simulateButtonLabel": "今すぐメールをテスト送信", "xpack.watcher.models.emailAction.simulateFailMessage": "{toList} へのメールの送信に失敗しました。", "xpack.watcher.models.emailAction.simulateMessage": "{toList} にサンプルメールが送信されました", "xpack.watcher.models.emailAction.typeName": "メール", "xpack.watcher.models.fields.fieldsPropertyMissingBadRequestMessage": "json 引数には {fields} プロパティが含まれている必要があります", - "xpack.watcher.models.hipchatAction.description": "{body} が Hipchat で送信されます", - "xpack.watcher.models.hipchatAction.simulateFailMessage": "Hipchat メッセージの送信に失敗しました.。", - "xpack.watcher.models.hipchatAction.simulateMessage": "Hipchat メッセージが送信されました。", - "xpack.watcher.models.indexAction.description": "{index} が {docType} としてインデックスされます", "xpack.watcher.models.indexAction.simulateFailMessage": "{index} のインデックスに失敗しました。", "xpack.watcher.models.indexAction.simulateMessage": "インデックス {index} がインデックスされました。", - "xpack.watcher.models.jiraAction.description": "Jira で {issueName} が作成されます", "xpack.watcher.models.jiraAction.simulateFailMessage": "Jira の問題の作成に失敗しました。", "xpack.watcher.models.jiraAction.simulateMessage": "Jira の問題が作成されました。", "xpack.watcher.models.jsonWatch.selectMessageText": "生 JSON のカスタムウォッチをセットアップします。", "xpack.watcher.models.jsonWatch.typeName": "高度なウォッチ", "xpack.watcher.models.loggingAction.actionJsonLoggingPropertyMissingBadRequestMessage": "json 引数には {actionJsonLogging} プロパティが含まれている必要があります", "xpack.watcher.models.loggingAction.actionJsonLoggingTextPropertyMissingBadRequestMessage": "json 引数には {actionJsonLoggingText} プロパティが含まれている必要があります", - "xpack.watcher.models.loggingAction.description": "ログメッセージ「{text}」", "xpack.watcher.models.loggingAction.selectMessageText": "ログに新規項目を追加します。", "xpack.watcher.models.loggingAction.simulateButtonLabel": "今すぐサンプルメッセージを記録", "xpack.watcher.models.loggingAction.simulateFailMessage": "サンプルメッセージの記録に失敗しました", @@ -9673,12 +9655,10 @@ "xpack.watcher.models.monitoringWatch.fromDownstreamJsonCalledBadRequestMessage": "ウォッチの監視に {fromDownstreamJson} が必要です", "xpack.watcher.models.monitoringWatch.getVisualizeQueryCalledBadRequestMessage": "ウォッチの監視に {getVisualizeQuery} が必要です", "xpack.watcher.models.monitoringWatch.upstreamJsonCalledBadRequestMessage": "ウォッチの監視に {upstreamJson} が必要です", - "xpack.watcher.models.pagerDutyAction.description": "{description} が PagerDuty に送信されます", "xpack.watcher.models.pagerDutyAction.simulateFailMessage": "Hipchat イベントの送信に失敗しました.。", "xpack.watcher.models.pagerDutyAction.simulateMessage": "PagerDuty イベントが送信されました。", "xpack.watcher.models.slackAction.actionJsonSlackMessagePropertyMissingBadRequestMessage": "json 引数には {actionJsonSlackMessage} プロパティが含まれている必要があります", "xpack.watcher.models.slackAction.actionJsonSlackPropertyMissingBadRequestMessage": "json 引数には {actionJsonSlack} プロパティが含まれている必要があります", - "xpack.watcher.models.slackAction.description": "{toList} に Slack メッセージが送信されます", "xpack.watcher.models.slackAction.selectMessageText": "Slack ユーザーまたはチャンネルにメッセージを送信します。", "xpack.watcher.models.slackAction.simulateButtonLabel": "今すぐサンプルメッセージを送信", "xpack.watcher.models.slackAction.simulateFailMessage": "{toList} へのサンプル Slack メッセージの送信に失敗しました。", @@ -9697,185 +9677,38 @@ "xpack.watcher.models.watchHistoryItem.watchIdPropertyMissingBadRequestMessage": "json 引数には {watchId} プロパティが含まれている必要があります", "xpack.watcher.models.watchStatus.idPropertyMissingBadRequestMessage": "json 引数には {id} プロパティが含まれている必要があります", "xpack.watcher.models.watchStatus.watchStatusJsonPropertyMissingBadRequestMessage": "json 引数には {watchStatusJson} プロパティが含まれている必要があります", - "xpack.watcher.models.webhookAction.description": "Webhook が {fullPath} に {method} リクエストを送信します", "xpack.watcher.models.webhookAction.simulateFailMessage": "{fullPath} へのリクエストの送信に失敗しました。", "xpack.watcher.models.webhookAction.simulateMessage": "{fullPath} にサンプルリクエストが送信されました", - "xpack.watcher.sections.watchDetail.actionStatusTable.acknowledgeButtonLabel": "承認", - "xpack.watcher.sections.watchDetail.actionStatusTable.acknowledgeButtonTitle": "承認", - "xpack.watcher.sections.watchDetail.actionStatusTable.actionColumnLabel": "アクション", - "xpack.watcher.sections.watchDetail.actionStatusTable.stateColumnLabel": "ステータス", - "xpack.watcher.sections.watchDetail.actionStatusTotalErrors": "{total, number} 件の{total, plural, one {エラー} other {エラー}}", - "xpack.watcher.sections.watchDetail.activateButtonLabel": "有効化", - "xpack.watcher.sections.watchDetail.currentStatusTitle": "現在のステータス", - "xpack.watcher.sections.watchDetail.deactivateButtonLabel": "無効化", - "xpack.watcher.sections.watchDetail.deleteButtonLabel": "削除", - "xpack.watcher.sections.watchDetail.deleteConfirmModal.deleteWatchButtonLabel": "ウォッチを削除", - "xpack.watcher.sections.watchDetail.deleteConfirmModal.description": "ウォッチが永久に削除されます。よろしいですか?", - "xpack.watcher.sections.watchDetail.deleteWatchSuccessNotificationText": "{watchName} が削除されました", - "xpack.watcher.sections.watchDetail.errorDisplayModalTitleText": "「{actionId}」アクションのエラー", - "xpack.watcher.sections.watchDetail.noActionsFoundText": "アクションが見つかりません。", - "xpack.watcher.sections.watchDetail.watchHistory.watchHistoryLoadingText": "ウォッチ履歴を読み込み中", - "xpack.watcher.sections.watchDetail.watchHistory.watchHistoryNotFoundText": "ウォッチ履歴が見つかりません。", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.allLabel": "すべて", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last1HourLabel": "過去 1 時間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last1YearLabel": "過去 1 年間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last24HoursLabel": "過去 24 時間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last30DaysLabel": "過去 30 日間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last6MonthsLabel": "過去 6 か月間", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last7DaysLabel": "過去 7 日間", - "xpack.watcher.sections.watchDetail.watchHistoryTable.commentColumnLabel": "コメント", - "xpack.watcher.sections.watchDetail.watchHistoryTable.stateColumnLabel": "ステータス", - "xpack.watcher.sections.watchDetail.watchHistoryTable.triggerTimeColumnLabel": "実行時刻", - "xpack.watcher.sections.watchDetail.watchHistoryTitle": "ウォッチ履歴", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.actionColumnLabel": "アクション", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.modeColumnLabel": "モード", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.reasonColumnLabel": "理由", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.stateColumnLabel": "ステータス", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.typeColumnLabel": "タイプ", - "xpack.watcher.sections.watchEdit.detail.idIsRequiredValidationMessage": "ID が必要です。", - "xpack.watcher.sections.watchEdit.detail.idLabel": "ID", - "xpack.watcher.sections.watchEdit.detail.idNamingDescription": "ID は文字またはアンダーラインで始まり、文字、アンダーライン、ハイフン、数字のみ使用できます。", - "xpack.watcher.sections.watchEdit.detail.invalidJSONErrorMessage": "無効な JSON", - "xpack.watcher.sections.watchEdit.detail.nameLabel": "名前", - "xpack.watcher.sections.watchEdit.detail.syntaxLinkLabel": "構文", - "xpack.watcher.sections.watchEdit.detail.watchJSONLabel": "ウォッチ JSON", - "xpack.watcher.sections.watchEdit.executeDetail.actionOverrides.actionModesLabel": "アクションモード", - "xpack.watcher.sections.watchEdit.executeDetail.actionOverridesButtonLabel": "アクションオーバーライド", - "xpack.watcher.sections.watchEdit.executeDetail.conditionOverrides.ignoreConditionLabel": "条件を無視 (条件は常に true)", - "xpack.watcher.sections.watchEdit.executeDetail.conditionOverridesButtonLabel": "アクションオーバーライド", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.alternativeInputLabel": "代替インプット", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.alternativeInputLinkText": "以前の実行からコピー", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.invalidJSONErrorMessage": "無効な JSON", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverridesButtonLabel": "インプットオーバーライド", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.scheduledTimeLabel": "予定時刻", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.scheduledTimePlaceholder": "今", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.triggeredTimeLabel": "実行時刻", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.triggeredTimePlaceholder": "今", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverridesButtonLabel": "実行オーバーライド", - "xpack.watcher.sections.watchEdit.executeInfoPanel.howToModifyWatchExecutionDescription": "ウォッチの実行方法を変更するには、下のウォッチを拡張します", - "xpack.watcher.sections.watchEdit.executeInfoPanel.testWatchExecutionTitle": "ウォッチの実行テスト", - "xpack.watcher.sections.watchEdit.json.deleteConfirmModal.description": "ウォッチが永久に削除されます。よろしいですか?", - "xpack.watcher.sections.watchEdit.json.deleteConfirmModal.overwriteWatchButtonLabel": "ウォッチを削除", - "xpack.watcher.sections.watchEdit.json.deleteSuccessNotificationText": "「{watchDisplayName}」が削除されました", "xpack.watcher.sections.watchEdit.json.editTabLabel": "編集", - "xpack.watcher.sections.watchEdit.json.editTabTitle": "ウォッチの編集", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.description": "ID「{watchId}」 {watchNameMessageFragment} のウォッチが既に存在します。上書きしますか?", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.descriptionFragmentText": "(名前: 「{existingWatchName}」)", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.overwriteWatchButtonLabel": "ウォッチを上書き", "xpack.watcher.sections.watchEdit.json.saveSuccessNotificationText": "「{watchDisplayName}」が保存されました", - "xpack.watcher.sections.watchEdit.json.simulateResultsTabLabel": "シミュレーション結果", - "xpack.watcher.sections.watchEdit.json.simulateResultsTabTitle": "結果をシミュレート", "xpack.watcher.sections.watchEdit.json.simulateTabLabel": "シミュレート", - "xpack.watcher.sections.watchEdit.json.simulateTabTitle": "ウォッチをシミュレート", - "xpack.watcher.sections.watchEdit.json.simulateWatchButtonLabel": "ウォッチをシミュレート", - "xpack.watcher.sections.watchEdit.json.simulationOutputLabel": "シミュレーションアウトプット", - "xpack.watcher.sections.watchEdit.json.warningPossibleInvalidSlackAction.description": "このウォッチには「to」プロパティのない Slack アクションがあります。 このウォッチは、Elasticsearch で Slack の「message_default」設定で「to」プロパティが指定された場合のみ有効になります。", - "xpack.watcher.sections.watchEdit.json.watchErrorsWarning.confirmSaveWatch": "ウォッチを保存", - "xpack.watcher.sections.watchEdit.threshold.matchingFollowingConditionTitle": "次の条件に一致", "xpack.watcher.sections.watchEdit.threshold.saveButtonLabel": "保存", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.description": "ID「{watchId}」 {watchNameMessageFragment} のウォッチが既に存在します。上書きしますか?", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.descriptionFragmentText": "(名前: 「{existingWatchName}」)", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.overwriteWatchButtonLabel": "ウォッチを上書き", - "xpack.watcher.sections.watchEdit.threshold.saveSuccessNotificationText": "「{watchDisplayName}」が保存されました", - "xpack.watcher.sections.watchEdit.titleBar.cancelButtonLabel": "キャンセル", - "xpack.watcher.sections.watchEdit.titleBar.deleteButtonLabel": "削除", - "xpack.watcher.sections.watchEdit.titleBar.deleteButtonTooltip": "ウォッチを削除", - "xpack.watcher.sections.watchEdit.titleBar.newWatchTitle": "新規ウォッチ", - "xpack.watcher.sections.watchEdit.titleBar.saveButtonLabel": "保存", - "xpack.watcher.sections.watchEdit.titlePanel.associatedTimeFieldIsMissedInIndexQueryValidationMessage": "インデックスクエリに時間フィールドが関連付けられていません", - "xpack.watcher.sections.watchEdit.titlePanel.createNewTypeOfWatchTitle": "新規 {typeName} の作成", - "xpack.watcher.sections.watchEdit.titlePanel.enterOneOrMoreIndicesValidationMessage": "1 つまたは複数のインデックスを入力してください", "xpack.watcher.sections.watchEdit.titlePanel.howToBroadenSearchQueryDescription": "* で検索クエリの範囲を広げます", "xpack.watcher.sections.watchEdit.titlePanel.indicesToQueryLabel": "クエリを実行するインデックス", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeIsRequiredValidationMessage": "間隔サイズが必要です", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeMinimumDurationValidationMessage": " 最低期間は {minSize}{minUnit} です", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeNegativeNumberValidationMessage": "間隔サイズはマイナスの数字にできません", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeUnitIsRequiredValidationMessage": "間隔サイズが必要です", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeValidNumberValidationMessage": "間隔サイズは有効な数字でなければなりません", - "xpack.watcher.sections.watchEdit.titlePanel.queryDoesNotMatchAnyValidIndicesValidationMessage": "インデックスクエリが有効なインデックスと一致していません", - "xpack.watcher.sections.watchEdit.titlePanel.timeFieldIsRequiredValidationText": "時間フィールドドが必要です", "xpack.watcher.sections.watchEdit.titlePanel.timeFieldLabel": "時間フィールド", "xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel": "フィールドを選択", "xpack.watcher.sections.watchEdit.titlePanel.watchIntervalLabel": "次の間隔でウォッチを実行:", - "xpack.watcher.sections.watchEdit.titlePanel.watchNameIsRequiredValidationMessage": "名前が必要です", "xpack.watcher.sections.watchEdit.titlePanel.watchNameLabel": "名前", - "xpack.watcher.sections.watchEdit.titlePanel.watchNamePlaceholder": "マイしきい値ウォッチ", - "xpack.watcher.sections.watchEdit.watchActionModeTable.actionColumnLabel": "アクション", - "xpack.watcher.sections.watchEdit.watchActionModeTable.modeColumnLabel": "モード", - "xpack.watcher.sections.watchEdit.watchActionModeTable.typeColumnLabel": "タイプ", - "xpack.watcher.sections.watchEdit.watchExecuteSummary.simulationStatusLabel": "シミュレーションステータス:", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.actionHeaderCellLabel": "アクション", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.reasonHeaderCellLabel": "理由", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.stateHeaderCellLabel": "ステータス", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.typeHeaderCellLabel": "タイプ", - "xpack.watcher.sections.watchHistoryItem.executionOutputLabel": "実行アウトプット:", - "xpack.watcher.sections.watchHistoryItem.watchSummary.executionStatusLabel": "実行ステータス:", "xpack.watcher.sections.watchList.createAdvancedWatchButtonLabel": "高度なウォッチを作成", "xpack.watcher.sections.watchList.createAdvancedWatchTooltip": "生 JSON のカスタムウォッチをセットアップします", "xpack.watcher.sections.watchList.createThresholdAlertButtonLabel": "しきい値アラートを作成", "xpack.watcher.sections.watchList.createThresholdAlertButtonTooltip": "特定の条件でアラートを送信します", - "xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.deleteButtonLabel": "{numWatchesToDelete, plural, one {# ウォッチ} other {# ウォッチ}}を削除 ", - "xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.descriptionText": "{numWatchesToDelete, plural, one {# ウォッチ} other {# ウォッチ}}が永久に削除されます。よろしいですか?", - "xpack.watcher.sections.watchList.deleteSelectedWatchesErrorNotification.descriptionText": "選択された {numTotal} 件中 {numErrors} 件の{numWatchesToDelete, plural, one {# ウォッチ} other {# ウォッチ}}を削除できませんでした", - "xpack.watcher.sections.watchList.deleteSelectedWatchesSuccessNotification.descriptionText": "選択された {numTotal} 件中 {numSuccesses} 件の{numWatchesToDelete, plural, one {# ウォッチ} other {# ウォッチ}}が削除されました", - "xpack.watcher.sections.watchList.deleteWatchButtonLabel": "削除", "xpack.watcher.sections.watchList.header": "しきい値アラートを作成", "xpack.watcher.sections.watchList.managementSection.editDisplayName": "編集", "xpack.watcher.sections.watchList.managementSection.newWatchDisplayName": "新規ウォッチ", "xpack.watcher.sections.watchList.managementSection.statusDisplayName": "ステータス", "xpack.watcher.sections.watchList.managementSection.watcherDisplayName": "Watcher", "xpack.watcher.sections.watchList.managementSection.watchesDisplayName": "ウォッチ", - "xpack.watcher.sections.watchList.noPermissionToManageWatchesText": "ウォッチを管理するパーミッションがありません。", - "xpack.watcher.sections.watchList.selectedMultipleWatchText": "ウォッチ", - "xpack.watcher.sections.watchList.selectedSingleWatchText": "ウォッチ", "xpack.watcher.sections.watchList.subhead": "特定のパラメーターに到達した際にメール、Slack メッセージ、ログイベントを送信します。", - "xpack.watcher.sections.watchList.watchesNotFoundText": "ウォッチが見つかりません。", - "xpack.watcher.sections.watchList.watchTable.commentColumnLabel": "コメント", - "xpack.watcher.sections.watchList.watchTable.idColumnLabel": "ID", - "xpack.watcher.sections.watchList.watchTable.lastFiredColumnLabel": "最終実行", - "xpack.watcher.sections.watchList.watchTable.lastTriggeredColumnLabel": "最終実行", - "xpack.watcher.sections.watchList.watchTable.menuEditButtonLabel": "編集", - "xpack.watcher.sections.watchList.watchTable.menuEditButtonTitle": "編集", - "xpack.watcher.sections.watchList.watchTable.nameColumnLabel": "名前", - "xpack.watcher.sections.watchList.watchTable.stateColumnLabel": "ステータス", - "xpack.watcher.server.checkLicense.licenseExpiredTextMessage": "{licenseType} ライセンスが期限切れのため {watcher} を使用できません", - "xpack.watcher.sortableColumn.sortAscendingAriaLabel": "{field} を昇順に並べ替える", - "xpack.watcher.sortableColumn.sortDescendingAriaLabel": "{field} を降順に並べ替える", "xpack.watcher.thresholdPreviewChart.dataDoesNotExistTextMessage": "インデックスと条件がデータを返しませんでした", - "xpack.watcher.thresholdWatchExpression.aggField.itemDescription": "Of", - "xpack.watcher.thresholdWatchExpression.aggField.selectFieldTextMessage": "フィールドを選択します", - "xpack.watcher.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "フィールドを選択してください。", - "xpack.watcher.thresholdWatchExpression.aggType.itemDescription": "タイミング", - "xpack.watcher.thresholdWatchExpression.aggType.requiredTypeValidationMessage": "集約タイプを選択してください。", - "xpack.watcher.thresholdWatchExpression.aggType.selectFieldDropdownPlaceholder": "フィールドを選択…", "xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel": "より大きい:", "xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel": "より小さい:", "xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage": "下の表現のエラーを修正してください。", - "xpack.watcher.thresholdWatchExpression.groupBy.groupedItemDescription": "次に対してグループ化:", - "xpack.watcher.thresholdWatchExpression.groupBy.itemDescription": "Over", "xpack.watcher.thresholdWatchExpression.groupBy.requiredFieldValidationMessage": "フィールドを選択してください。", - "xpack.watcher.thresholdWatchExpression.groupBy.requiredValueValidationMessage": "値が必要です。", - "xpack.watcher.thresholdWatchExpression.groupBy.selectFieldDropdownPlaceholder": "フィールドを選択…", - "xpack.watcher.thresholdWatchExpression.groupBy.valueMustBeGraterThanZeroValidationMessage": "値は 0 よりも大きい値でなければなりません。", - "xpack.watcher.thresholdWatchExpression.groupBy.valueMustBeValidNumberValidationMessage": "値は有効な数字でなければなりません", "xpack.watcher.thresholdWatchExpression.groupByLabel.allDocumentsLabel": "すべてのドキュメント", "xpack.watcher.thresholdWatchExpression.groupByLabel.topLabel": "トップ", "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueIsRequiredValidationMessage": "値が必要です。", - "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueMustBeValidNumberValidationMessage": "値は有効な数字でなければなりません", - "xpack.watcher.thresholdWatchExpression.timeUnits.dayPluralLabel": "日", - "xpack.watcher.thresholdWatchExpression.timeUnits.daySingularLabel": "日", - "xpack.watcher.thresholdWatchExpression.timeUnits.hourPluralLabel": "時間", - "xpack.watcher.thresholdWatchExpression.timeUnits.hourSingularLabel": "時間", - "xpack.watcher.thresholdWatchExpression.timeUnits.minutePluralLabel": "分", - "xpack.watcher.thresholdWatchExpression.timeUnits.minuteSingularLabel": "分", - "xpack.watcher.thresholdWatchExpression.timeUnits.secondPluralLabel": "秒", - "xpack.watcher.thresholdWatchExpression.timeUnits.secondSingularLabel": "秒", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationIsTooShortValidationMessage": "ウィンドウ期間が短すぎます。使用可能な最低期間は {minimumSize}{minimumUnit} です。", "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeIsRequiredValidationMessage": "ウィンドウ期間サイズが必要です。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeMustBePositiveNumberValidationMessage": "ウィンドウ期間サイズはマイナスの数字にできません。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeMustBeValidNumberValidationMessage": "ウィンドウ期間サイズは有効な数字でなければなりません。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationUnitIsRequiredValidationMessage": "ウィンドウ期間単位が必要です。", - "xpack.watcher.thresholdWatchExpression.timeWindow.itemDescription": "過去", "xpack.watcher.timeUnits.dayPluralLabel": "日", "xpack.watcher.timeUnits.daySingularLabel": "日", "xpack.watcher.timeUnits.hourPluralLabel": "時間", @@ -9884,22 +9717,7 @@ "xpack.watcher.timeUnits.minuteSingularLabel": "分", "xpack.watcher.timeUnits.secondPluralLabel": "秒", "xpack.watcher.timeUnits.secondSingularLabel": "秒", - "xpack.watcher.toolBarSelectedCountText": "選択済み", - "xpack.watcher.watchActions.email.bodyIsRequiredValidationMessage": "本文が必要です。", - "xpack.watcher.watchActions.email.bodyLabel": "本文", - "xpack.watcher.watchActions.email.emailAddressIsRequiredValidationMessage": "送信先メールアドレスが必要です。", - "xpack.watcher.watchActions.email.emailAddressLabel": "送信先メールアドレス", - "xpack.watcher.watchActions.email.subjectIsRequiredValidationMessage": "件名が必要です。", - "xpack.watcher.watchActions.email.subjectLabel": "件名", - "xpack.watcher.watchActions.errorInActionValidationMessage": "このアクションには保存する前に対処が必要なエラーがあります。", "xpack.watcher.watchActions.logging.logTextIsRequiredValidationMessage": "ログテキストが必要です。", - "xpack.watcher.watchActions.logging.logTextLabel": "ログテキスト", - "xpack.watcher.watchActions.removeActionButtonLabel": "{actionTypeName} アクションを削除", - "xpack.watcher.watchActions.slack.messageIsRequiredValidationMessage": "メッセージが必要です。", - "xpack.watcher.watchActions.slack.messageLabel": "メッセージ", - "xpack.watcher.watchActions.slack.recipientIsRequiredValidationMessage": "受取人が必要です。", - "xpack.watcher.watchActions.slack.recipientLabel": "受取人", - "xpack.watcher.watchActionsTitle": "条件が満たされた際に {watchActionsCount, plural, one{# アクション} other {# アクション}} を実行します", "xpack.watcher.watcherDescription": "アラートの作成、管理、監視によりデータへの変更を検知します。" } } diff --git a/x-pack/legacy/plugins/translations/translations/zh-CN.json b/x-pack/legacy/plugins/translations/translations/zh-CN.json index 4804216ccc7daf..86f4ccadc7e512 100644 --- a/x-pack/legacy/plugins/translations/translations/zh-CN.json +++ b/x-pack/legacy/plugins/translations/translations/zh-CN.json @@ -7549,10 +7549,6 @@ "xpack.uptime.snapshotHistogram.series.downLabel": "关闭", "xpack.uptime.snapshotHistogram.series.upLabel": "运行", "xpack.uptime.uptimeFeatureCatalogueTitle": "运行时间", - "xpack.watcher.actionTypeSelect.actionDisabledTextMessage": "已禁用。配置 {elasticsearchYmlText}。", - "xpack.watcher.actionTypeSelect.addNewActionPlaceholder": "添加新操作", - "xpack.watcher.checkLicense.licenseDoesNotSupportTextMessage": "您的 {licenseType} 许可证不支持 {watcher}。请升级您的许可。", - "xpack.watcher.checkLicense.licenseInformationNotAvailableTextMessage": "您不能使用 {watcher},因为许可证信息当前不可用。", "xpack.watcher.constants.actionStates.acknowledgedStateText": "已确认", "xpack.watcher.constants.actionStates.configErrorStateText": "配置错误", "xpack.watcher.constants.actionStates.errorStateText": "错误", @@ -7569,11 +7565,6 @@ "xpack.watcher.constants.watchStates.errorStateText": "错误!", "xpack.watcher.constants.watchStates.firingStateText": "正在发送", "xpack.watcher.constants.watchStates.okStateText": "确定", - "xpack.watcher.durationSelect.durationAmountAriaLabel": "持续时间量", - "xpack.watcher.durationSelect.durationTimeUnitAriaLabel": "持续时间单位", - "xpack.watcher.forbiddenMessage.contactAdministratorTextMessage": "请联系您的管理员。", - "xpack.watcher.indexSelect.buildingListTextMessage": "正在生成列表…… 请稍候", - "xpack.watcher.indexSelect.startTypingPlaceholder": "开始键入……", "xpack.watcher.models.action.actionJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJson} 属性", "xpack.watcher.models.actionStatus.actionStatusJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {actionStatusJson} 属性", "xpack.watcher.models.actionStatus.idPropertyMissingBadRequestMessage": "json 参数必须包含 {id} 属性", @@ -7592,7 +7583,6 @@ "xpack.watcher.models.baseWatch.watchStatusJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {watchStatusJson} 属性", "xpack.watcher.models.emailAction.actionJsonEmailPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonEmail} 属性", "xpack.watcher.models.emailAction.actionJsonEmailToPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonEmailTo} 属性", - "xpack.watcher.models.emailAction.description": "“{subject}” 将发送至 {toList}", "xpack.watcher.models.emailAction.selectMessageText": "从您的服务器发送电子邮件。", "xpack.watcher.models.emailAction.simulateButtonLabel": "立即试发电子邮件", "xpack.watcher.models.emailAction.simulateFailMessage": "无法将电子邮件发至 {toList}。", @@ -7603,7 +7593,6 @@ "xpack.watcher.models.jsonWatch.typeName": "高级监视", "xpack.watcher.models.loggingAction.actionJsonLoggingPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonLogging} 属性", "xpack.watcher.models.loggingAction.actionJsonLoggingTextPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonLoggingText} 属性", - "xpack.watcher.models.loggingAction.description": "记录消息“{text}”", "xpack.watcher.models.loggingAction.selectMessageText": "向日志添加新项。", "xpack.watcher.models.loggingAction.simulateButtonLabel": "立即记录示例消息", "xpack.watcher.models.loggingAction.simulateFailMessage": "无法记录示例消息。", @@ -7615,7 +7604,6 @@ "xpack.watcher.models.monitoringWatch.upstreamJsonCalledBadRequestMessage": "为监测监视而调用的 {upstreamJson}", "xpack.watcher.models.slackAction.actionJsonSlackMessagePropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonSlackMessage} 属性", "xpack.watcher.models.slackAction.actionJsonSlackPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJsonSlack} 属性", - "xpack.watcher.models.slackAction.description": "Slack 消息将发至 {toList}", "xpack.watcher.models.slackAction.selectMessageText": "向 slack 用户或渠道发送消息。", "xpack.watcher.models.slackAction.simulateButtonLabel": "立即发送示例消息", "xpack.watcher.models.slackAction.simulateFailMessage": "无法将示例 Slack 消息发至 {toList}。", @@ -7634,180 +7622,34 @@ "xpack.watcher.models.watchHistoryItem.watchIdPropertyMissingBadRequestMessage": "json 参数必须包含 {watchId} 属性", "xpack.watcher.models.watchStatus.idPropertyMissingBadRequestMessage": "json 参数必须包含 {id} 属性", "xpack.watcher.models.watchStatus.watchStatusJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {watchStatusJson} 属性", - "xpack.watcher.sections.watchDetail.actionStatusTable.acknowledgeButtonLabel": "确认", - "xpack.watcher.sections.watchDetail.actionStatusTable.acknowledgeButtonTitle": "确认", - "xpack.watcher.sections.watchDetail.actionStatusTable.actionColumnLabel": "操作", - "xpack.watcher.sections.watchDetail.actionStatusTable.stateColumnLabel": "状态", - "xpack.watcher.sections.watchDetail.actionStatusTotalErrors": "{total, number} {total, plural, one {个错误} other {个错误}}", - "xpack.watcher.sections.watchDetail.activateButtonLabel": "激活", - "xpack.watcher.sections.watchDetail.currentStatusTitle": "当前状态", - "xpack.watcher.sections.watchDetail.deactivateButtonLabel": "停用", - "xpack.watcher.sections.watchDetail.deleteButtonLabel": "删除", - "xpack.watcher.sections.watchDetail.deleteConfirmModal.deleteWatchButtonLabel": "删除监视", - "xpack.watcher.sections.watchDetail.deleteConfirmModal.description": "这将永久删除该监视。是否确定?", - "xpack.watcher.sections.watchDetail.deleteWatchSuccessNotificationText": "已删除 {watchName}", - "xpack.watcher.sections.watchDetail.errorDisplayModalTitleText": "“{actionId}” 操作中有错误", - "xpack.watcher.sections.watchDetail.noActionsFoundText": "未找到操作。", - "xpack.watcher.sections.watchDetail.watchHistory.watchHistoryLoadingText": "正在加载监视历史记录", - "xpack.watcher.sections.watchDetail.watchHistory.watchHistoryNotFoundText": "未找到任何监视历史记录。", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.allLabel": "全部", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last1HourLabel": "过去 1 小时", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last1YearLabel": "过去 1 年", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last24HoursLabel": "过去 24 小时", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last30DaysLabel": "过去 30 天", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last6MonthsLabel": "过去 6 个月", - "xpack.watcher.sections.watchDetail.watchHistoryRangeFilter.last7DaysLabel": "过去 7 天", - "xpack.watcher.sections.watchDetail.watchHistoryTable.commentColumnLabel": "注释", - "xpack.watcher.sections.watchDetail.watchHistoryTable.stateColumnLabel": "状态", - "xpack.watcher.sections.watchDetail.watchHistoryTable.triggerTimeColumnLabel": "触发时间", - "xpack.watcher.sections.watchDetail.watchHistoryTitle": "监视历史记录", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.actionColumnLabel": "操作", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.modeColumnLabel": "模式", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.reasonColumnLabel": "原因", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.stateColumnLabel": "状态", - "xpack.watcher.sections.watchEdit.actionsExecuteSummary.typeColumnLabel": "类型", - "xpack.watcher.sections.watchEdit.detail.idIsRequiredValidationMessage": "ID 必填。", - "xpack.watcher.sections.watchEdit.detail.idLabel": "ID", - "xpack.watcher.sections.watchEdit.detail.idNamingDescription": "ID 必须以字母或下划线开头,并只能包含字母、下划线、短划线和数字。", - "xpack.watcher.sections.watchEdit.detail.invalidJSONErrorMessage": "JSON 无效", - "xpack.watcher.sections.watchEdit.detail.nameLabel": "名称", - "xpack.watcher.sections.watchEdit.detail.syntaxLinkLabel": "语法", - "xpack.watcher.sections.watchEdit.detail.watchJSONLabel": "监视 JSON", - "xpack.watcher.sections.watchEdit.executeDetail.actionOverrides.actionModesLabel": "操作模式", - "xpack.watcher.sections.watchEdit.executeDetail.actionOverridesButtonLabel": "操作覆盖", - "xpack.watcher.sections.watchEdit.executeDetail.conditionOverrides.ignoreConditionLabel": "忽略条件(条件始终为 true)", - "xpack.watcher.sections.watchEdit.executeDetail.conditionOverridesButtonLabel": "条件覆盖", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.alternativeInputLabel": "备用输入", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.alternativeInputLinkText": "从之前执行复制", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverrides.invalidJSONErrorMessage": "JSON 无效", - "xpack.watcher.sections.watchEdit.executeDetail.inputOverridesButtonLabel": "输入覆盖", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.scheduledTimeLabel": "排定时间", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.scheduledTimePlaceholder": "现在", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.triggeredTimeLabel": "触发时间", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverrides.triggeredTimePlaceholder": "现在", - "xpack.watcher.sections.watchEdit.executeDetail.triggerOverridesButtonLabel": "触发覆盖", - "xpack.watcher.sections.watchEdit.executeInfoPanel.howToModifyWatchExecutionDescription": "要修改执行监视的方式,请展开以下部分", - "xpack.watcher.sections.watchEdit.executeInfoPanel.testWatchExecutionTitle": "测试您的监视执行", - "xpack.watcher.sections.watchEdit.json.deleteConfirmModal.description": "这将永久删除该监视。是否确定?", - "xpack.watcher.sections.watchEdit.json.deleteConfirmModal.overwriteWatchButtonLabel": "删除监视", - "xpack.watcher.sections.watchEdit.json.deleteSuccessNotificationText": "已删除“{watchDisplayName}”", "xpack.watcher.sections.watchEdit.json.editTabLabel": "编辑", - "xpack.watcher.sections.watchEdit.json.editTabTitle": "编辑监视", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.description": "ID “{watchId}{watchNameMessageFragment}” 的监视已存在。确定要覆盖?", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.descriptionFragmentText": "(名称:“{existingWatchName}”)", - "xpack.watcher.sections.watchEdit.json.saveConfirmModal.overwriteWatchButtonLabel": "覆盖监视", "xpack.watcher.sections.watchEdit.json.saveSuccessNotificationText": "已保存“{watchDisplayName}”", - "xpack.watcher.sections.watchEdit.json.simulateResultsTabLabel": "模拟结果", - "xpack.watcher.sections.watchEdit.json.simulateResultsTabTitle": "模拟结果", "xpack.watcher.sections.watchEdit.json.simulateTabLabel": "模拟", - "xpack.watcher.sections.watchEdit.json.simulateTabTitle": "模拟监视", - "xpack.watcher.sections.watchEdit.json.simulateWatchButtonLabel": "模拟监视", - "xpack.watcher.sections.watchEdit.json.simulationOutputLabel": "模拟输出:", - "xpack.watcher.sections.watchEdit.json.warningPossibleInvalidSlackAction.description": "此监视具有不包含“to”属性的 Slack 操作。 只有在 Elasticsearch 的 Slack“message_default”中指定了“to”属性,此监视才有效。", - "xpack.watcher.sections.watchEdit.json.watchErrorsWarning.confirmSaveWatch": "保存监视", - "xpack.watcher.sections.watchEdit.threshold.matchingFollowingConditionTitle": "匹配以下条件", "xpack.watcher.sections.watchEdit.threshold.saveButtonLabel": "保存", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.description": "ID “{watchId}{watchNameMessageFragment}” 的监视已存在。确定要覆盖?", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.descriptionFragmentText": "(名称:“{existingWatchName}”)", - "xpack.watcher.sections.watchEdit.threshold.saveConfirmModal.overwriteWatchButtonLabel": "覆盖监视", - "xpack.watcher.sections.watchEdit.threshold.saveSuccessNotificationText": "已保存“{watchDisplayName}”", - "xpack.watcher.sections.watchEdit.titleBar.cancelButtonLabel": "取消", - "xpack.watcher.sections.watchEdit.titleBar.deleteButtonLabel": "删除", - "xpack.watcher.sections.watchEdit.titleBar.deleteButtonTooltip": "删除监视", - "xpack.watcher.sections.watchEdit.titleBar.newWatchTitle": "新建监视", - "xpack.watcher.sections.watchEdit.titleBar.saveButtonLabel": "保存", - "xpack.watcher.sections.watchEdit.titlePanel.associatedTimeFieldIsMissedInIndexQueryValidationMessage": "您的索引查询没有关联的时间字段", - "xpack.watcher.sections.watchEdit.titlePanel.createNewTypeOfWatchTitle": "创建新的 {typeName}", - "xpack.watcher.sections.watchEdit.titlePanel.enterOneOrMoreIndicesValidationMessage": "输入一个或多个索引", "xpack.watcher.sections.watchEdit.titlePanel.howToBroadenSearchQueryDescription": "使用 * 拓宽您的搜索查询", "xpack.watcher.sections.watchEdit.titlePanel.indicesToQueryLabel": "要查询的索引", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeIsRequiredValidationMessage": "“时间间隔大小”必填", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeMinimumDurationValidationMessage": " 最小持续时间为 {minSize}{minUnit}", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeNegativeNumberValidationMessage": "时间间隔大小不能为负数", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeUnitIsRequiredValidationMessage": "需要时间间隔大小", - "xpack.watcher.sections.watchEdit.titlePanel.intervalSizeValidNumberValidationMessage": "时间间隔大小必须为有效数值", - "xpack.watcher.sections.watchEdit.titlePanel.queryDoesNotMatchAnyValidIndicesValidationMessage": "您的索引查询不匹配任何有效索引", - "xpack.watcher.sections.watchEdit.titlePanel.timeFieldIsRequiredValidationText": "需要时间字段", "xpack.watcher.sections.watchEdit.titlePanel.timeFieldLabel": "时间字段", "xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel": "选择字段", "xpack.watcher.sections.watchEdit.titlePanel.watchIntervalLabel": "运行监视的频率", - "xpack.watcher.sections.watchEdit.titlePanel.watchNameIsRequiredValidationMessage": "“名称”必填", "xpack.watcher.sections.watchEdit.titlePanel.watchNameLabel": "名称", - "xpack.watcher.sections.watchEdit.titlePanel.watchNamePlaceholder": "我的阈值监视", - "xpack.watcher.sections.watchEdit.watchActionModeTable.actionColumnLabel": "操作", - "xpack.watcher.sections.watchEdit.watchActionModeTable.modeColumnLabel": "模式", - "xpack.watcher.sections.watchEdit.watchActionModeTable.typeColumnLabel": "类型", - "xpack.watcher.sections.watchEdit.watchExecuteSummary.simulationStatusLabel": "模拟状态:", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.actionHeaderCellLabel": "操作", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.reasonHeaderCellLabel": "原因", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.stateHeaderCellLabel": "状态", - "xpack.watcher.sections.watchHistoryItem.actionsSummary.typeHeaderCellLabel": "类型", - "xpack.watcher.sections.watchHistoryItem.executionOutputLabel": "执行输出:", - "xpack.watcher.sections.watchHistoryItem.watchSummary.executionStatusLabel": "执行状态:", "xpack.watcher.sections.watchList.createAdvancedWatchButtonLabel": "创建高级监视", "xpack.watcher.sections.watchList.createAdvancedWatchTooltip": "以原始 JSON 格式设置定制监视", "xpack.watcher.sections.watchList.createThresholdAlertButtonLabel": "创建阈值告警", "xpack.watcher.sections.watchList.createThresholdAlertButtonTooltip": "在特定条件下发送告警", - "xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.deleteButtonLabel": "删除 {numWatchesToDelete, plural, one {# 个监视} other {# 个监视}} ", - "xpack.watcher.sections.watchList.deleteSelectedWatchesConfirmModal.descriptionText": "这将永久删除 {numWatchesToDelete, plural, one {# 个监视} other {# 个监视}}。是否确定?", - "xpack.watcher.sections.watchList.deleteSelectedWatchesErrorNotification.descriptionText": "已选的 {numTotal}{numWatchesToDelete, plural, one {# 个监视} other {# 个监视}}有 {numErrors} 个无法删除", - "xpack.watcher.sections.watchList.deleteSelectedWatchesSuccessNotification.descriptionText": "已选的 {numTotal}{numWatchesToDelete, plural, one {# 个监视} other {# 个监视}}有 {numSuccesses} 个已删除", - "xpack.watcher.sections.watchList.deleteWatchButtonLabel": "删除", "xpack.watcher.sections.watchList.managementSection.editDisplayName": "编辑", "xpack.watcher.sections.watchList.managementSection.newWatchDisplayName": "新建监视", "xpack.watcher.sections.watchList.managementSection.statusDisplayName": "状态", "xpack.watcher.sections.watchList.managementSection.watcherDisplayName": "Watcher", "xpack.watcher.sections.watchList.managementSection.watchesDisplayName": "监视", - "xpack.watcher.sections.watchList.noPermissionToManageWatchesText": "您无权管理监视。", - "xpack.watcher.sections.watchList.selectedMultipleWatchText": "监视", - "xpack.watcher.sections.watchList.selectedSingleWatchText": "监视", - "xpack.watcher.sections.watchList.watchesNotFoundText": "未找到任何监视。", - "xpack.watcher.sections.watchList.watchTable.commentColumnLabel": "注释", - "xpack.watcher.sections.watchList.watchTable.idColumnLabel": "ID", - "xpack.watcher.sections.watchList.watchTable.lastFiredColumnLabel": "最后发送时间", - "xpack.watcher.sections.watchList.watchTable.lastTriggeredColumnLabel": "最后触发时间", - "xpack.watcher.sections.watchList.watchTable.menuEditButtonLabel": "编辑", - "xpack.watcher.sections.watchList.watchTable.menuEditButtonTitle": "编辑", - "xpack.watcher.sections.watchList.watchTable.nameColumnLabel": "名称", - "xpack.watcher.sections.watchList.watchTable.stateColumnLabel": "状态", - "xpack.watcher.server.checkLicense.licenseExpiredTextMessage": "您不能使用 {watcher},因为您的 {licenseType} 许可证已过期", - "xpack.watcher.sortableColumn.sortAscendingAriaLabel": "升序排序 {field}", - "xpack.watcher.sortableColumn.sortDescendingAriaLabel": "降序排序 {field}", "xpack.watcher.thresholdPreviewChart.dataDoesNotExistTextMessage": "您的索引和条件未返回任何数据", - "xpack.watcher.thresholdWatchExpression.aggField.itemDescription": "/", - "xpack.watcher.thresholdWatchExpression.aggField.selectFieldTextMessage": "选择字段", - "xpack.watcher.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "请选择字段。", - "xpack.watcher.thresholdWatchExpression.aggType.itemDescription": "当", - "xpack.watcher.thresholdWatchExpression.aggType.requiredTypeValidationMessage": "请选择聚合类型。", - "xpack.watcher.thresholdWatchExpression.aggType.selectFieldDropdownPlaceholder": "选择字段……", "xpack.watcher.thresholdWatchExpression.comparators.isAboveLabel": "高于", "xpack.watcher.thresholdWatchExpression.comparators.isBelowLabel": "低于", "xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage": "请解决如下表达式中的错误。", - "xpack.watcher.thresholdWatchExpression.groupBy.groupedItemDescription": "分组依据", - "xpack.watcher.thresholdWatchExpression.groupBy.itemDescription": "依据", "xpack.watcher.thresholdWatchExpression.groupBy.requiredFieldValidationMessage": "请选择字段。", - "xpack.watcher.thresholdWatchExpression.groupBy.requiredValueValidationMessage": "需要值。", - "xpack.watcher.thresholdWatchExpression.groupBy.selectFieldDropdownPlaceholder": "选择字段……", - "xpack.watcher.thresholdWatchExpression.groupBy.valueMustBeGraterThanZeroValidationMessage": "值必须大于 0。", - "xpack.watcher.thresholdWatchExpression.groupBy.valueMustBeValidNumberValidationMessage": "值必须为有效数值。", "xpack.watcher.thresholdWatchExpression.groupByLabel.allDocumentsLabel": "所有文档", "xpack.watcher.thresholdWatchExpression.groupByLabel.topLabel": "顶部", "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueIsRequiredValidationMessage": "需要值。", - "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueMustBeValidNumberValidationMessage": "值必须为有效数值。", - "xpack.watcher.thresholdWatchExpression.timeUnits.dayPluralLabel": "天", - "xpack.watcher.thresholdWatchExpression.timeUnits.daySingularLabel": "天", - "xpack.watcher.thresholdWatchExpression.timeUnits.hourPluralLabel": "小时", - "xpack.watcher.thresholdWatchExpression.timeUnits.hourSingularLabel": "小时", - "xpack.watcher.thresholdWatchExpression.timeUnits.minutePluralLabel": "分钟", - "xpack.watcher.thresholdWatchExpression.timeUnits.minuteSingularLabel": "分钟", - "xpack.watcher.thresholdWatchExpression.timeUnits.secondPluralLabel": "秒", - "xpack.watcher.thresholdWatchExpression.timeUnits.secondSingularLabel": "秒", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationIsTooShortValidationMessage": "窗口持续时间过短。允许的最小值为 {minimumSize}{minimumUnit}。", "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeIsRequiredValidationMessage": "“窗口持续时间大小”必填。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeMustBePositiveNumberValidationMessage": "窗口持续时间大小不能为负数。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeMustBeValidNumberValidationMessage": "窗口持续时间大小必须为有效数值。", - "xpack.watcher.thresholdWatchExpression.timeWindow.durationUnitIsRequiredValidationMessage": "“窗口持续时间单位”必填。", - "xpack.watcher.thresholdWatchExpression.timeWindow.itemDescription": "过去", "xpack.watcher.timeUnits.dayPluralLabel": "天", "xpack.watcher.timeUnits.daySingularLabel": "天", "xpack.watcher.timeUnits.hourPluralLabel": "小时", @@ -7816,22 +7658,7 @@ "xpack.watcher.timeUnits.minuteSingularLabel": "分钟", "xpack.watcher.timeUnits.secondPluralLabel": "秒", "xpack.watcher.timeUnits.secondSingularLabel": "秒", - "xpack.watcher.toolBarSelectedCountText": "已选", - "xpack.watcher.watchActions.email.bodyIsRequiredValidationMessage": "“正文”必填。", - "xpack.watcher.watchActions.email.bodyLabel": "正文", - "xpack.watcher.watchActions.email.emailAddressIsRequiredValidationMessage": "“收件人电子邮件地址”必填。", - "xpack.watcher.watchActions.email.emailAddressLabel": "收件人电子邮件地址", - "xpack.watcher.watchActions.email.subjectIsRequiredValidationMessage": "“主题”必填。", - "xpack.watcher.watchActions.email.subjectLabel": "主题", - "xpack.watcher.watchActions.errorInActionValidationMessage": "此操作中有错误,在可以保存之前,需要解决这些错误。", "xpack.watcher.watchActions.logging.logTextIsRequiredValidationMessage": "“日志文本”必填。", - "xpack.watcher.watchActions.logging.logTextLabel": "日志文本", - "xpack.watcher.watchActions.removeActionButtonLabel": "删除 {actionTypeName} 操作", - "xpack.watcher.watchActions.slack.messageIsRequiredValidationMessage": "“消息”必填。", - "xpack.watcher.watchActions.slack.messageLabel": "消息", - "xpack.watcher.watchActions.slack.recipientIsRequiredValidationMessage": "“收件人”必填。", - "xpack.watcher.watchActions.slack.recipientLabel": "收件人", - "xpack.watcher.watchActionsTitle": "满足后将执行 {watchActionsCount, plural, one{# 个操作} other {# 个操作}}", "xpack.watcher.watcherDescription": "通过创建、管理和监测警报来检测数据中的更改。" } } From 53b7633ae7121b801e27cb4825fddb142776cacc Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 21 Jun 2019 13:29:17 -0400 Subject: [PATCH 37/51] fix jest tests --- x-pack/dev-tools/jest/create_jest_config.js | 2 +- .../watcher/__jest__/client_integration/helpers/index.ts | 2 +- .../watcher/__jest__/client_integration/watch_edit.test.ts | 2 +- x-pack/legacy/plugins/watcher/test/fixtures/watch.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/dev-tools/jest/create_jest_config.js b/x-pack/dev-tools/jest/create_jest_config.js index 0d00d78728133c..5114778e7acb7f 100644 --- a/x-pack/dev-tools/jest/create_jest_config.js +++ b/x-pack/dev-tools/jest/create_jest_config.js @@ -24,7 +24,7 @@ export function createJestConfig({ '^ui/(.*)': `${kibanaDirectory}/src/legacy/ui/public/$1`, '^src/core/(.*)': `${kibanaDirectory}/src/core/$1`, '^legacy/plugins/xpack_main/(.*);': `${xPackKibanaDirectory}/legacy/plugins/xpack_main/public/$1`, - '^legacy/plugins/watcher/models/(.*)': `${xPackKibanaDirectory}/legacy/plugins/watcher/public/models/$1`, + '^plugins/watcher/models/(.*)': `${xPackKibanaDirectory}/legacy/plugins/watcher/public/models/$1`, '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': `${kibanaDirectory}/src/dev/jest/mocks/file_mock.js`, '\\.(css|less|scss)$': `${kibanaDirectory}/src/dev/jest/mocks/style_mock.js`, diff --git a/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/index.ts b/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/index.ts index 5213a3f3d55907..ad005078db0a8e 100644 --- a/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/index.ts +++ b/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/index.ts @@ -10,7 +10,7 @@ import { setup as watchCreateJsonSetup } from './watch_create_json.helpers'; import { setup as watchCreateThresholdSetup } from './watch_create_threshold.helpers'; import { setup as watchEditSetup } from './watch_edit.helpers'; -export { nextTick, getRandomString, findTestSubject, TestBed } from '../../../../../test_utils'; +export { nextTick, getRandomString, findTestSubject, TestBed } from '../../../../../../test_utils'; export { setupEnvironment } from './setup_environment'; diff --git a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_edit.test.ts b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_edit.test.ts index 6b444530700dda..fb23a86980a339 100644 --- a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_edit.test.ts +++ b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_edit.test.ts @@ -11,7 +11,7 @@ import { WatchEditTestBed } from './helpers/watch_edit.helpers'; import { WATCH } from './helpers/constants'; import defaultWatchJson from '../../public/models/watch/default_watch.json'; import { getWatch } from '../../test/fixtures'; -import { getRandomString } from '../../../../test_utils'; +import { getRandomString } from '../../../../../test_utils'; const mockHttpClient = axios.create({ adapter: axiosXhrAdapter }); diff --git a/x-pack/legacy/plugins/watcher/test/fixtures/watch.ts b/x-pack/legacy/plugins/watcher/test/fixtures/watch.ts index ced37c6a6fad51..910ffb989f86a3 100644 --- a/x-pack/legacy/plugins/watcher/test/fixtures/watch.ts +++ b/x-pack/legacy/plugins/watcher/test/fixtures/watch.ts @@ -5,7 +5,7 @@ */ import { Moment } from 'moment'; -import { getRandomString } from '../../../../test_utils'; +import { getRandomString } from '../../../../../test_utils'; interface Watch { id: string; From f8ef5d1cc408ff301bf55462c378bb56acec0f96 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 21 Jun 2019 14:44:35 -0400 Subject: [PATCH 38/51] improvements to expression for threshold alert (#39362) --- .../watch_create_threshold.test.tsx | 6 +- .../public/models/watch/threshold_watch.js | 6 +- .../threshold_watch_edit.tsx | 62 ++++++++++++++----- 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx index 418248dd724c85..352cbf5c43ba0b 100644 --- a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx +++ b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx @@ -146,7 +146,7 @@ describe.skip(' create route', () => { form.setInputValue('watchTimeFieldSelect', ''); - expect(form.getErrorsMessages()).toContain('A time field is required'); + expect(form.getErrorsMessages()).toContain('A time field is required.'); }); test('should not allow empty interval size field', () => { @@ -154,7 +154,7 @@ describe.skip(' create route', () => { form.setInputValue('triggerIntervalSizeInput', ''); - expect(form.getErrorsMessages()).toContain('Interval size is required'); + expect(form.getErrorsMessages()).toContain('Interval size is required.'); }); test('should not allow negative interval size field', () => { @@ -162,7 +162,7 @@ describe.skip(' create route', () => { form.setInputValue('triggerIntervalSizeInput', '-1'); - expect(form.getErrorsMessages()).toContain('Interval size cannot be a negative number'); + expect(form.getErrorsMessages()).toContain('Interval size cannot be a negative number.'); }); test('should disable the Create button with invalid fields', () => { diff --git a/x-pack/legacy/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/legacy/plugins/watcher/public/models/watch/threshold_watch.js index 48c7b406f4112a..f52ff13742c160 100644 --- a/x-pack/legacy/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/legacy/plugins/watcher/public/models/watch/threshold_watch.js @@ -144,7 +144,7 @@ export class ThresholdWatch extends BaseWatch { i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.timeFieldIsRequiredValidationText', { - defaultMessage: 'A time field is required', + defaultMessage: 'A time field is required.', } ) ); @@ -154,7 +154,7 @@ export class ThresholdWatch extends BaseWatch { i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.intervalSizeIsRequiredValidationMessage', { - defaultMessage: 'Interval size is required', + defaultMessage: 'Interval size is required.', } ) ); @@ -164,7 +164,7 @@ export class ThresholdWatch extends BaseWatch { i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.intervalSizeNegativeNumberValidationMessage', { - defaultMessage: 'Interval size cannot be a negative number', + defaultMessage: 'Interval size cannot be a negative number.', } ) ); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index c8325b16f28ce9..3e015b51a15bdc 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -39,6 +39,36 @@ import { WatchContext } from '../../watch_context'; import { WatchVisualization } from './watch_visualization'; import { WatchActionsPanel } from './threshold_watch_action_panel'; +const expressionFieldsWithValidation = [ + 'aggField', + 'termSize', + 'termField', + 'threshold0', + 'threshold1', + 'timeWindowSize', +]; + +const expressionFields = [ + 'aggType', + 'aggField', + 'termSize', + 'termField', + 'thresholdComparator', + 'timeWindowSize', + 'timeWindowUnit', + 'triggerIntervalSize', + 'triggerIntervalUnit', + 'threshold', + 'groupBy', +]; + +const expressionErrorMessage = i18n.translate( + 'xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage', + { + defaultMessage: 'Expression contains errors.', + } +); + const firstFieldOption = { text: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.timeFieldOptionLabel', { defaultMessage: 'Select a field', @@ -151,6 +181,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit const titles = indexPatternObjects.map((indexPattern: any) => indexPattern.attributes.title); setIndexPatterns(titles); }; + const loadData = async () => { if (watch.index && watch.index.length > 0) { const allEsFields = await getFields(watch.index); @@ -161,39 +192,33 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit } getIndexPatterns(); }; + useEffect(() => { loadData(); }, []); + const { errors } = watch.validate(); + const hasErrors = !!Object.keys(errors).find(errorKey => errors[errorKey].length >= 1); + const actionErrors = watch.actions.reduce((acc: any, action: any) => { const actionValidationErrors = action.validate(); acc[action.id] = actionValidationErrors; return acc; }, {}); + const hasActionErrors = !!Object.keys(actionErrors).find(actionError => { return !!Object.keys(actionErrors[actionError]).find((actionErrorKey: string) => { return actionErrors[actionError][actionErrorKey].length >= 1; }); }); - const expressionErrorMessage = i18n.translate( - 'xpack.watcher.thresholdWatchExpression.fixErrorInExpressionBelowValidationMessage', - { - defaultMessage: 'Expression contains errors.', - } - ); - const expressionFields = [ - 'aggField', - 'termSize', - 'termField', - 'threshold0', - 'threshold1', - 'timeWindowSize', - ]; + const hasExpressionErrors = !!Object.keys(errors).find( - errorKey => expressionFields.includes(errorKey) && errors[errorKey].length >= 1 + errorKey => expressionFieldsWithValidation.includes(errorKey) && errors[errorKey].length >= 1 ); + const shouldShowThresholdExpression = watch.index && watch.index.length > 0 && watch.timeField; + const andThresholdText = i18n.translate('xpack.watcher.sections.watchEdit.threshold.andLabel', { defaultMessage: 'AND', }); @@ -289,10 +314,14 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit setWatchProperty('index', selected.map(aSelected => aSelected.value)); const indices = selected.map(s => s.value as string); - // reset the time field if indices are deleted + // reset time field and expression fields if indices are deleted if (indices.length === 0) { setTimeFieldOptions(getTimeFieldOptions([])); setWatchProperty('timeFields', []); + + expressionFields.forEach(expressionField => { + setWatchProperty(expressionField, null); + }); return; } const currentEsFields = await getFields(indices); @@ -504,6 +533,7 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit value={watch.aggField} onChange={e => { setWatchProperty('aggField', e.target.value); + setAggFieldPopoverOpen(false); }} onBlur={() => { if (!watch.aggField) { From 29f9c56bf8c833c820b65e7d8210d7f95c32acaf Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Mon, 24 Jun 2019 10:19:09 -0400 Subject: [PATCH 39/51] fix loading state on watch list page + better handling for reloads (#39339) --- .../plugins/watcher/public/lib/use_request.ts | 13 ++- .../watch_visualization.tsx | 2 +- .../watch_list/components/watch_list.tsx | 104 ++++++++++-------- 3 files changed, 69 insertions(+), 50 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/public/lib/use_request.ts b/x-pack/legacy/plugins/watcher/public/lib/use_request.ts index 2816360f5febae..d13990f7d5ccc4 100644 --- a/x-pack/legacy/plugins/watcher/public/lib/use_request.ts +++ b/x-pack/legacy/plugins/watcher/public/lib/use_request.ts @@ -61,7 +61,7 @@ export const useRequest = ({ // Tied to every render and bound to each request. let isOutdatedRequest = false; - const createRequest = async () => { + const createRequest = async (isInitialRequest = true) => { // Set a neutral state for a non-request. if (!path) { setError(null); @@ -71,8 +71,12 @@ export const useRequest = ({ } setError(null); - setData(initialData); - setIsLoading(true); + + // Only set loading state to true and initial data on the first request + if (isInitialRequest) { + setIsLoading(true); + setData(initialData); + } const { data: responseData, error: responseError } = await sendRequest({ path, @@ -99,7 +103,8 @@ export const useRequest = ({ createRequest(); if (interval) { - const intervalRequest = setInterval(createRequest, interval); + const intervalRequest = setInterval(createRequest.bind(null, false), interval); + return () => { cancelOutdatedRequest(); clearInterval(intervalRequest); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx index f875b3ec788a71..b623c4778e2229 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx @@ -145,7 +145,7 @@ const WatchVisualizationUi = () => { if (isInitialRequest) { return setIsInitialRequest(false); } - reload(); + reload(false); }, [ index, diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 17b54ce9b1ea45..1f68575f65fa80 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -38,6 +38,7 @@ import { DeleteWatchesModal, WatchStatus, SectionError, + SectionLoading, } from '../../../components'; import { loadWatches } from '../../../lib/api'; import { watcherGettingStartedUrl } from '../../../lib/documentation_links'; @@ -157,6 +158,17 @@ const WatchListUi = () => { ); + if (isWatchesLoading) { + return ( + + + + ); + } + if (getPageErrorCode(error)) { return ( @@ -399,7 +411,6 @@ const WatchListUi = () => { sorting={true} selection={selectionConfig} isSelectable={true} - loading={isWatchesLoading} message={ { ); } - return ( - - { - if (deleted) { - setDeletedWatches([...deletedWatches, ...watchesToDelete]); - } - setWatchesToDelete([]); - }} - watchesToDelete={watchesToDelete} - /> + if (content) { + return ( + + { + if (deleted) { + setDeletedWatches([...deletedWatches, ...watchesToDelete]); + } + setWatchesToDelete([]); + }} + watchesToDelete={watchesToDelete} + /> - - - -

    - -

    -
    - - - - - -
    -
    + + + +

    + +

    +
    + + + + + +
    +
    - + - -

    {watcherDescriptionText}

    -
    + +

    {watcherDescriptionText}

    +
    - + - {content} -
    - ); + {content} +
    + ); + } + return null; }; export const WatchList = injectI18n(WatchListUi); From edc6a23c2f9c6f4f4bd12312a811dcd1bacb71a6 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Wed, 26 Jun 2019 09:21:58 -0400 Subject: [PATCH 40/51] address i18n feedback + bugfixes (#39624) --- .../translations/translations/ja-JP.json | 9 -- .../translations/translations/zh-CN.json | 9 -- .../watcher/common/constants/time_units.ts | 1 - .../plugins/watcher/public/constants/index.ts | 1 - .../watcher/public/constants/time_units.ts | 43 ----- .../legacy/plugins/watcher/public/index.scss | 4 + .../plugins/watcher/public/lib/breadcrumbs.ts | 13 +- .../watcher/public/lib/get_time_unit_label.ts | 33 ++++ .../public/lib/get_time_units_label.ts | 12 -- .../public/models/action/email_action.js | 2 +- .../public/models/action/webhook_action.js | 14 +- .../models/execute_details/execute_details.js | 25 ++- .../public/models/watch/threshold_watch.js | 4 +- .../json_watch_edit/json_watch_edit.tsx | 5 +- .../json_watch_edit_simulate.tsx | 33 ++-- .../monitoring_watch_edit.tsx | 6 +- .../action_fields/email_action_fields.tsx | 2 +- .../threshold_watch_action_accordion.tsx | 6 +- .../threshold_watch_edit.tsx | 152 +++++++++--------- .../watch_visualization.tsx | 6 +- .../public/sections/watch_edit/time_units.ts | 55 ------- .../watch_list/components/watch_list.tsx | 6 +- .../watch_status/components/watch_detail.tsx | 6 +- .../watch_status/components/watch_history.tsx | 6 +- .../models/action_status/action_status.js | 27 ++-- .../routes/api/watch/register_save_route.js | 8 +- 26 files changed, 191 insertions(+), 297 deletions(-) delete mode 100644 x-pack/legacy/plugins/watcher/public/constants/time_units.ts create mode 100644 x-pack/legacy/plugins/watcher/public/lib/get_time_unit_label.ts delete mode 100644 x-pack/legacy/plugins/watcher/public/lib/get_time_units_label.ts delete mode 100644 x-pack/legacy/plugins/watcher/public/sections/watch_edit/time_units.ts diff --git a/x-pack/legacy/plugins/translations/translations/ja-JP.json b/x-pack/legacy/plugins/translations/translations/ja-JP.json index 19c250c7cd9c26..ba4735a9631d3c 100644 --- a/x-pack/legacy/plugins/translations/translations/ja-JP.json +++ b/x-pack/legacy/plugins/translations/translations/ja-JP.json @@ -9610,7 +9610,6 @@ "xpack.watcher.constants.watchStates.firingStateText": "実行中", "xpack.watcher.constants.watchStates.okStateText": "OK", "xpack.watcher.models.action.actionJsonPropertyMissingBadRequestMessage": "json 引数には {actionJson} プロパティが含まれている必要があります", - "xpack.watcher.models.actionStatus.actionStatusJsonPropertyMissingBadRequestMessage": "json 引数には {actionStatusJson} プロパティが含まれている必要があります", "xpack.watcher.models.actionStatus.idPropertyMissingBadRequestMessage": "json 引数には {id} プロパティが含まれている必要があります", "xpack.watcher.models.actionStatus.notDetermineActionStatusBadImplementationMessage": "アクションステータスを把握できませんでした; action = {actionStatusJson}", "xpack.watcher.models.baseAction.idPropertyMissingBadRequestMessage": "json 引数には {id} プロパティが含まれている必要があります", @@ -9704,14 +9703,6 @@ "xpack.watcher.thresholdWatchExpression.groupByLabel.topLabel": "トップ", "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueIsRequiredValidationMessage": "値が必要です。", "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeIsRequiredValidationMessage": "ウィンドウ期間サイズが必要です。", - "xpack.watcher.timeUnits.dayPluralLabel": "日", - "xpack.watcher.timeUnits.daySingularLabel": "日", - "xpack.watcher.timeUnits.hourPluralLabel": "時間", - "xpack.watcher.timeUnits.hourSingularLabel": "時間", - "xpack.watcher.timeUnits.minutePluralLabel": "分", - "xpack.watcher.timeUnits.minuteSingularLabel": "分", - "xpack.watcher.timeUnits.secondPluralLabel": "秒", - "xpack.watcher.timeUnits.secondSingularLabel": "秒", "xpack.watcher.watchActions.logging.logTextIsRequiredValidationMessage": "ログテキストが必要です。", "xpack.watcher.watcherDescription": "アラートの作成、管理、監視によりデータへの変更を検知します。" } diff --git a/x-pack/legacy/plugins/translations/translations/zh-CN.json b/x-pack/legacy/plugins/translations/translations/zh-CN.json index f444fc165993a0..2766db6eca0eb8 100644 --- a/x-pack/legacy/plugins/translations/translations/zh-CN.json +++ b/x-pack/legacy/plugins/translations/translations/zh-CN.json @@ -7561,7 +7561,6 @@ "xpack.watcher.constants.watchStates.firingStateText": "正在发送", "xpack.watcher.constants.watchStates.okStateText": "确定", "xpack.watcher.models.action.actionJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {actionJson} 属性", - "xpack.watcher.models.actionStatus.actionStatusJsonPropertyMissingBadRequestMessage": "json 参数必须包含 {actionStatusJson} 属性", "xpack.watcher.models.actionStatus.idPropertyMissingBadRequestMessage": "json 参数必须包含 {id} 属性", "xpack.watcher.models.actionStatus.notDetermineActionStatusBadImplementationMessage": "无法确定操作状态;操作 = {actionStatusJson}", "xpack.watcher.models.baseAction.idPropertyMissingBadRequestMessage": "json 参数必须包含 {id} 属性", @@ -7645,14 +7644,6 @@ "xpack.watcher.thresholdWatchExpression.groupByLabel.topLabel": "顶部", "xpack.watcher.thresholdWatchExpression.thresholdLevel.valueIsRequiredValidationMessage": "需要值。", "xpack.watcher.thresholdWatchExpression.timeWindow.durationSizeIsRequiredValidationMessage": "“窗口持续时间大小”必填。", - "xpack.watcher.timeUnits.dayPluralLabel": "天", - "xpack.watcher.timeUnits.daySingularLabel": "天", - "xpack.watcher.timeUnits.hourPluralLabel": "小时", - "xpack.watcher.timeUnits.hourSingularLabel": "小时", - "xpack.watcher.timeUnits.minutePluralLabel": "分钟", - "xpack.watcher.timeUnits.minuteSingularLabel": "分钟", - "xpack.watcher.timeUnits.secondPluralLabel": "秒", - "xpack.watcher.timeUnits.secondSingularLabel": "秒", "xpack.watcher.watchActions.logging.logTextIsRequiredValidationMessage": "“日志文本”必填。", "xpack.watcher.watcherDescription": "通过创建、管理和监测警报来检测数据中的更改。" } diff --git a/x-pack/legacy/plugins/watcher/common/constants/time_units.ts b/x-pack/legacy/plugins/watcher/common/constants/time_units.ts index 9b79f163e5831a..c861d47416a804 100644 --- a/x-pack/legacy/plugins/watcher/common/constants/time_units.ts +++ b/x-pack/legacy/plugins/watcher/common/constants/time_units.ts @@ -5,7 +5,6 @@ */ export const TIME_UNITS: { [key: string]: string } = { - MILLISECOND: 'ms', SECOND: 's', MINUTE: 'm', HOUR: 'h', diff --git a/x-pack/legacy/plugins/watcher/public/constants/index.ts b/x-pack/legacy/plugins/watcher/public/constants/index.ts index 82c7927a35fff0..3120bed81fdf22 100644 --- a/x-pack/legacy/plugins/watcher/public/constants/index.ts +++ b/x-pack/legacy/plugins/watcher/public/constants/index.ts @@ -4,5 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { TIME_UNITS } from './time_units'; export { BASE_PATH } from './base_path'; diff --git a/x-pack/legacy/plugins/watcher/public/constants/time_units.ts b/x-pack/legacy/plugins/watcher/public/constants/time_units.ts deleted file mode 100644 index cdf58dea7af21a..00000000000000 --- a/x-pack/legacy/plugins/watcher/public/constants/time_units.ts +++ /dev/null @@ -1,43 +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 { i18n } from '@kbn/i18n'; -import { TIME_UNITS as COMMON_TIME_UNITS } from '../../common/constants/time_units'; - -export const TIME_UNITS = { - [COMMON_TIME_UNITS.SECOND]: { - labelPlural: i18n.translate('xpack.watcher.timeUnits.secondPluralLabel', { - defaultMessage: 'seconds', - }), - labelSingular: i18n.translate('xpack.watcher.timeUnits.secondSingularLabel', { - defaultMessage: 'second', - }), - }, - [COMMON_TIME_UNITS.MINUTE]: { - labelPlural: i18n.translate('xpack.watcher.timeUnits.minutePluralLabel', { - defaultMessage: 'minutes', - }), - labelSingular: i18n.translate('xpack.watcher.timeUnits.minuteSingularLabel', { - defaultMessage: 'minute', - }), - }, - [COMMON_TIME_UNITS.HOUR]: { - labelPlural: i18n.translate('xpack.watcher.timeUnits.hourPluralLabel', { - defaultMessage: 'hours', - }), - labelSingular: i18n.translate('xpack.watcher.timeUnits.hourSingularLabel', { - defaultMessage: 'hour', - }), - }, - [COMMON_TIME_UNITS.DAY]: { - labelPlural: i18n.translate('xpack.watcher.timeUnits.dayPluralLabel', { - defaultMessage: 'days', - }), - labelSingular: i18n.translate('xpack.watcher.timeUnits.daySingularLabel', { - defaultMessage: 'day', - }), - }, -}; diff --git a/x-pack/legacy/plugins/watcher/public/index.scss b/x-pack/legacy/plugins/watcher/public/index.scss index 61dc1177b803bf..33ebf21326c7b4 100644 --- a/x-pack/legacy/plugins/watcher/public/index.scss +++ b/x-pack/legacy/plugins/watcher/public/index.scss @@ -19,3 +19,7 @@ .watcherThresholdWatchInBetweenComparatorText { align-self: center; } + +.watcherThresholdAlertAggFieldContainer { + width: 300px; +} diff --git a/x-pack/legacy/plugins/watcher/public/lib/breadcrumbs.ts b/x-pack/legacy/plugins/watcher/public/lib/breadcrumbs.ts index a8c34599557cbd..c8c5d66e37d8f2 100644 --- a/x-pack/legacy/plugins/watcher/public/lib/breadcrumbs.ts +++ b/x-pack/legacy/plugins/watcher/public/lib/breadcrumbs.ts @@ -6,26 +6,31 @@ import { i18n } from '@kbn/i18n'; -export const listBreadcrumb: any = { +interface Breadcrumb { + text: string; + href?: string; +} + +export const listBreadcrumb: Breadcrumb = { text: i18n.translate('xpack.watcher.breadcrumb.listLabel', { defaultMessage: 'Watcher', }), href: '#/management/elasticsearch/watcher/watches/', }; -export const createBreadcrumb: any = { +export const createBreadcrumb: Breadcrumb = { text: i18n.translate('xpack.watcher.breadcrumb.createLabel', { defaultMessage: 'Create', }), }; -export const editBreadcrumb: any = { +export const editBreadcrumb: Breadcrumb = { text: i18n.translate('xpack.watcher.breadcrumb.editLabel', { defaultMessage: 'Edit', }), }; -export const statusBreadcrumb: any = { +export const statusBreadcrumb: Breadcrumb = { text: i18n.translate('xpack.watcher.breadcrumb.statusLabel', { defaultMessage: 'Status', }), diff --git a/x-pack/legacy/plugins/watcher/public/lib/get_time_unit_label.ts b/x-pack/legacy/plugins/watcher/public/lib/get_time_unit_label.ts new file mode 100644 index 00000000000000..35bd19e7007c6b --- /dev/null +++ b/x-pack/legacy/plugins/watcher/public/lib/get_time_unit_label.ts @@ -0,0 +1,33 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { TIME_UNITS } from '../../common/constants'; + +export function getTimeUnitLabel(timeUnit = TIME_UNITS.SECOND, timeValue = '0') { + switch (timeUnit) { + case TIME_UNITS.SECOND: + return i18n.translate('xpack.watcher.timeUnits.secondLabel', { + defaultMessage: '{timeValue, plural, one {second} other {seconds}}', + values: { timeValue }, + }); + case TIME_UNITS.MINUTE: + return i18n.translate('xpack.watcher.timeUnits.minuteLabel', { + defaultMessage: '{timeValue, plural, one {minute} other {minutes}}', + values: { timeValue }, + }); + case TIME_UNITS.HOUR: + return i18n.translate('xpack.watcher.timeUnits.hourLabel', { + defaultMessage: '{timeValue, plural, one {hour} other {hours}}', + values: { timeValue }, + }); + case TIME_UNITS.DAY: + return i18n.translate('xpack.watcher.timeUnits.dayLabel', { + defaultMessage: '{timeValue, plural, one {day} other {days}}', + values: { timeValue }, + }); + } +} diff --git a/x-pack/legacy/plugins/watcher/public/lib/get_time_units_label.ts b/x-pack/legacy/plugins/watcher/public/lib/get_time_units_label.ts deleted file mode 100644 index 0032e98490dcf1..00000000000000 --- a/x-pack/legacy/plugins/watcher/public/lib/get_time_units_label.ts +++ /dev/null @@ -1,12 +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 { TIME_UNITS } from '../constants'; - -export const getTimeUnitsLabel = (unit: string, size: number) => { - const timeUnit = TIME_UNITS[unit]; - return size === 1 ? timeUnit.labelSingular : timeUnit.labelPlural; -}; diff --git a/x-pack/legacy/plugins/watcher/public/models/action/email_action.js b/x-pack/legacy/plugins/watcher/public/models/action/email_action.js index 9d199de0fe2967..5d519825ad19b5 100644 --- a/x-pack/legacy/plugins/watcher/public/models/action/email_action.js +++ b/x-pack/legacy/plugins/watcher/public/models/action/email_action.js @@ -14,7 +14,7 @@ export class EmailAction extends BaseAction { super(props); const uiSettings = chrome.getUiSettingsClient(); - const defaultToEmail = uiSettings.get('xPack:defaultAdminEmail') || undefined; + const defaultToEmail = uiSettings.get('xPack:defaultAdminEmail'); const toArray = get(props, 'to', defaultToEmail); this.to = isArray(toArray) ? toArray : toArray && [ toArray ]; diff --git a/x-pack/legacy/plugins/watcher/public/models/action/webhook_action.js b/x-pack/legacy/plugins/watcher/public/models/action/webhook_action.js index 0eea87d6212b2b..00be91aae4617b 100644 --- a/x-pack/legacy/plugins/watcher/public/models/action/webhook_action.js +++ b/x-pack/legacy/plugins/watcher/public/models/action/webhook_action.js @@ -53,17 +53,19 @@ export class WebhookAction extends BaseAction { } if (this.contentType === 'application/json' && typeof this.body === 'string' && this.body !== '') { + const invalidJsonMessage = i18n.translate('xpack.watcher.watchActions.webhook.invalidJsonValidationMessage', { + defaultMessage: 'Invalid JSON', + }); + try { const parsedJson = JSON.parse(this.body); + if (parsedJson && typeof parsedJson !== 'object') { - errors.body.push(i18n.translate('xpack.watcher.watchActions.webhook.bodyParseValidationMessage', { - defaultMessage: 'Invalid JSON', - })); + errors.body.push(invalidJsonMessage); } + } catch (e) { - errors.body.push(i18n.translate('xpack.watcher.watchActions.webhook.bodyParseValidationMessage', { - defaultMessage: 'Invalid JSON', - })); + errors.body.push(invalidJsonMessage); } } diff --git a/x-pack/legacy/plugins/watcher/public/models/execute_details/execute_details.js b/x-pack/legacy/plugins/watcher/public/models/execute_details/execute_details.js index 2d8415284fe2c2..e41345daa182a4 100644 --- a/x-pack/legacy/plugins/watcher/public/models/execute_details/execute_details.js +++ b/x-pack/legacy/plugins/watcher/public/models/execute_details/execute_details.js @@ -23,24 +23,23 @@ export class ExecuteDetails { const errors = { json: [], }; - if (this.alternativeInput || this.alternativeInput !== '') { + + const invalidJsonFieldError = i18n.translate( + 'xpack.watcher.sections.watchEdit.simulate.form.invalidJsonFieldError', + { + defaultMessage: 'Invalid JSON', + } + ); + + if (this.alternativeInput !== '') { try { const parsedJson = JSON.parse(this.alternativeInput); + if (parsedJson && typeof parsedJson !== 'object') { - errors.json.push(i18n.translate( - 'xpack.watcher.sections.watchEdit.simulate.form.alternativeInputFieldError', - { - defaultMessage: 'Invalid JSON', - } - )); + errors.json.push(invalidJsonFieldError); } } catch (e) { - errors.json.push(i18n.translate( - 'xpack.watcher.sections.watchEdit.simulate.form.alternativeInputFieldError', - { - defaultMessage: 'Invalid JSON', - } - )); + errors.json.push(invalidJsonFieldError); } } return errors; diff --git a/x-pack/legacy/plugins/watcher/public/models/watch/threshold_watch.js b/x-pack/legacy/plugins/watcher/public/models/watch/threshold_watch.js index f52ff13742c160..5f46f1400c57aa 100644 --- a/x-pack/legacy/plugins/watcher/public/models/watch/threshold_watch.js +++ b/x-pack/legacy/plugins/watcher/public/models/watch/threshold_watch.js @@ -7,7 +7,7 @@ import { BaseWatch } from './base_watch'; import uuid from 'uuid'; import { WATCH_TYPES, SORT_ORDERS, COMPARATORS } from '../../../common/constants'; -import { getTimeUnitsLabel } from '../../lib/get_time_units_label'; +import { getTimeUnitLabel } from '../../lib/get_time_unit_label'; import { i18n } from '@kbn/i18n'; import { aggTypes } from './agg_types'; import { groupByTypes } from './group_by_types'; @@ -82,7 +82,7 @@ export class ThresholdWatch extends BaseWatch { return staticPart; } - const timeUnitLabel = getTimeUnitsLabel(this.triggerIntervalUnit, this.triggerIntervalSize); + const timeUnitLabel = getTimeUnitLabel(this.triggerIntervalUnit, this.triggerIntervalSize); const dynamicPartText = i18n.translate( 'xpack.watcher.models.thresholdWatch.thresholdWatchIntervalTitleDescription', { diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx index f092e95216fbfd..9c4b16e301b384 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit.tsx @@ -16,7 +16,6 @@ import { EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { injectI18n } from '@kbn/i18n/react'; import { ExecuteDetails } from 'plugins/watcher/models/execute_details/execute_details'; import { getActionType } from '../../../../../common/lib/get_action_type'; import { BaseWatch, ExecutedWatchDetails } from '../../../../../common/types/watch_types'; @@ -81,7 +80,7 @@ function getActionModes(items: WatchAction[]) { return result; } -const JsonWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { +export const JsonWatchEdit = ({ pageTitle }: { pageTitle: string }) => { const { watch } = useContext(WatchContext); const watchActions = getActions(watch); // hooks @@ -139,5 +138,3 @@ const JsonWatchEditUi = ({ pageTitle }: { pageTitle: string }) => {
    ); }; - -export const JsonWatchEdit = injectI18n(JsonWatchEditUi); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx index 85cf8f1b1e1fed..5d16ac3aa18f09 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate.tsx @@ -35,28 +35,23 @@ import { ErrableFormRow } from '../../../../components/form_errors'; import { executeWatch } from '../../../../lib/api'; import { executeWatchApiUrl } from '../../../../lib/documentation_links'; import { WatchContext } from '../../watch_context'; -import { timeUnits } from '../../time_units'; import { JsonWatchEditSimulateResults } from './json_watch_edit_simulate_results'; +import { getTimeUnitLabel } from '../../../../lib/get_time_unit_label'; const actionModeOptions = Object.keys(ACTION_MODES).map(mode => ({ text: ACTION_MODES[mode], value: ACTION_MODES[mode], })); -const scheduledTimeUnitOptions = [ - { - value: TIME_UNITS.SECOND, - text: timeUnits[TIME_UNITS.SECOND].labelPlural, - }, - { - value: TIME_UNITS.MINUTE, - text: timeUnits[TIME_UNITS.MINUTE].labelPlural, - }, - { - value: TIME_UNITS.HOUR, - text: timeUnits[TIME_UNITS.HOUR].labelPlural, - }, -]; +const getScheduleTimeOptions = (unitSize = '0') => + Object.entries(TIME_UNITS) + .filter(([key]) => key !== TIME_UNITS.DAY) + .map(([_key, value]) => { + return { + text: getTimeUnitLabel(value, unitSize), + value, + }; + }); export const JsonWatchEditSimulate = ({ executeWatchErrors, @@ -205,7 +200,7 @@ export const JsonWatchEditSimulate = ({ { setExecuteDetails( new ExecuteDetails({ @@ -230,7 +225,11 @@ export const JsonWatchEditSimulate = ({ value={triggeredTimeValue} min={0} data-test-subj="triggeredTimeInput" - append={{timeUnits[TIME_UNITS.SECOND].labelPlural}} + append={ + + {getTimeUnitLabel(TIME_UNITS.SECOND, triggeredTimeValue)} + + } onChange={e => { const value = e.target.value; setExecuteDetails( diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx index 959e6bccd33826..babc7d0053a51d 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/monitoring_watch_edit/monitoring_watch_edit.tsx @@ -16,10 +16,10 @@ import { EuiText, EuiLink, } from '@elastic/eui'; -import { injectI18n, FormattedMessage } from '@kbn/i18n/react'; +import { FormattedMessage } from '@kbn/i18n/react'; import { WatchContext } from '../../watch_context'; -const MonitoringWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { +export const MonitoringWatchEdit = ({ pageTitle }: { pageTitle: string }) => { const { watch } = useContext(WatchContext); const systemWatchTitle = ( @@ -65,5 +65,3 @@ const MonitoringWatchEditUi = ({ pageTitle }: { pageTitle: string }) => { ); }; - -export const MonitoringWatchEdit = injectI18n(MonitoringWatchEditUi); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx index 08c7756fb4110e..c8f03cb9f8c63b 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx @@ -33,7 +33,7 @@ export const EmailActionFields: React.FunctionComponent = ({ errorKey="to" fullWidth errors={errors} - isShowingErrors={hasErrors && to !== undefined} + isShowingErrors={hasErrors && to !== null} label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.emailAction.recipientTextFieldLabel', { diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx index 0f948a57e21273..202bc254521152 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx @@ -124,7 +124,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ } paddingSize="l" > - {executeResultsError && ( + {executeResultsError && executeResultsError[action.id] && ( = ({ defaultMessage="Error testing action" /> } - error={executeResultsError} + error={executeResultsError[action.id]} /> @@ -227,7 +227,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ setIsExecuting(false); if (error) { - return setExecuteResultsError(error); + return setExecuteResultsError({ [action.id]: error }); } const formattedResults = WatchHistoryItem.fromUpstreamJson(data.watchHistoryItem); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index 3e015b51a15bdc..2bc53a03376441 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -25,19 +25,18 @@ import { EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; - +import { FormattedMessage } from '@kbn/i18n/react'; import { TIME_UNITS } from '../../../../../common/constants'; import { ErrableFormRow, SectionError } from '../../../../components'; import { fetchFields, getMatchingIndices, loadIndexPatterns } from '../../../../lib/api'; import { aggTypes } from '../../../../models/watch/agg_types'; import { groupByTypes } from '../../../../models/watch/group_by_types'; import { comparators } from '../../../../models/watch/comparators'; -import { timeUnits } from '../../time_units'; import { onWatchSave } from '../../watch_edit_actions'; import { WatchContext } from '../../watch_context'; import { WatchVisualization } from './watch_visualization'; import { WatchActionsPanel } from './threshold_watch_action_panel'; +import { getTimeUnitLabel } from '../../../../lib/get_time_unit_label'; const expressionFieldsWithValidation = [ 'aggField', @@ -77,23 +76,18 @@ const firstFieldOption = { }; const getTimeOptions = (unitSize: string) => - Object.entries(timeUnits) - .filter(([key]) => key !== TIME_UNITS.MILLISECOND) - .map(([key, value]) => { - return { - text: unitSize && parseInt(unitSize, 10) === 1 ? value.labelSingular : value.labelPlural, - value: key, - }; - }); + Object.entries(TIME_UNITS).map(([_key, value]) => { + return { + text: getTimeUnitLabel(value, unitSize), + value, + }; + }); const getFields = async (indices: string[]) => { return await fetchFields(indices); }; const getTimeFieldOptions = (fields: any) => { const options = [firstFieldOption]; - if (!fields.length) { - return options; - } fields.forEach((field: any) => { if (field.type === 'date') { @@ -109,41 +103,38 @@ interface IOption { label: string; options: Array<{ value: string; label: string }>; } + const getIndexOptions = async (patternString: string, indexPatterns: string[]) => { const options: IOption[] = []; + if (!patternString) { return options; } + const matchingIndices = (await getMatchingIndices(patternString)) as string[]; const matchingIndexPatterns = indexPatterns.filter(anIndexPattern => { return anIndexPattern.includes(patternString); }) as string[]; - if (matchingIndices) { - options.push({ - label: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.indicesAndAliasesLabel', { - defaultMessage: 'Based on your indices/aliases', - }), - options: matchingIndices.map(matchingIndex => { - return { - label: matchingIndex, - value: matchingIndex, - }; - }), - }); - } - if (matchingIndexPatterns) { + + if (matchingIndices.length || matchingIndexPatterns.length) { + const matchingOptions = _.uniq([...matchingIndices, ...matchingIndexPatterns]); + options.push({ - label: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.indexPatternLabel', { - defaultMessage: 'Based on your index patterns', - }), - options: matchingIndexPatterns.map(matchingIndexPattern => { + label: i18n.translate( + 'xpack.watcher.sections.watchEdit.titlePanel.indicesAndIndexPatternsLabel', + { + defaultMessage: 'Based on your indices and index patterns', + } + ), + options: matchingOptions.map(match => { return { - label: matchingIndexPattern, - value: matchingIndexPattern, + label: match, + value: match, }; }), }); } + options.push({ label: i18n.translate('xpack.watcher.sections.watchEdit.titlePanel.chooseLabel', { defaultMessage: 'Choose…', @@ -155,10 +146,11 @@ const getIndexOptions = async (patternString: string, indexPatterns: string[]) = }, ], }); + return options; }; -const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTitle: string }) => { +export const ThresholdWatchEdit = ({ pageTitle }: { pageTitle: string }) => { // hooks const [indexPatterns, setIndexPatterns] = useState([]); const [esFields, setEsFields] = useState([]); @@ -377,10 +369,12 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit + } errorKey="triggerIntervalSize" isShowingErrors={hasErrors && watch.triggerIntervalSize !== undefined} errors={errors} @@ -408,10 +402,12 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit { setWatchProperty('triggerIntervalUnit', e.target.value); }} @@ -510,7 +506,6 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit closePopover={() => { setAggFieldPopoverOpen(false); }} - ownFocus anchorPosition="downLeft" >
    @@ -523,39 +518,40 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit )} - + - { - setWatchProperty('aggField', e.target.value); - setAggFieldPopoverOpen(false); - }} - onBlur={() => { - if (!watch.aggField) { - setWatchProperty('aggField', ''); + { + if ( + aggTypes[watch.aggType].validNormalizedTypes.includes( + field.normalizedType + ) + ) { + esFieldOptions.push({ + label: field.name, + }); } + return esFieldOptions; + }, [])} + selectedOptions={watch.aggField ? [{ label: watch.aggField }] : []} + onChange={selectedOptions => { + setWatchProperty( + 'aggField', + selectedOptions.length === 1 + ? selectedOptions[0].label + : undefined + ); + setAggFieldPopoverOpen(false); }} - options={esFields.reduce( - (options, field: any) => { - if ( - aggTypes[watch.aggType].validNormalizedTypes.includes( - field.normalizedType - ) - ) { - options.push({ - text: field.name, - value: field.name, - }); - } - return options; - }, - [firstFieldOption] - )} /> @@ -757,10 +753,11 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit > { const { value } = e.target; - const threshold = value !== '' ? parseInt(value, 10) : value; + const threshold = value !== '' ? parseFloat(value) : value; const newThreshold = [...watch.threshold]; newThreshold[i] = threshold; setWatchProperty('threshold', newThreshold); @@ -787,11 +784,10 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit defaultMessage: 'for the last', } )} - value={`${watch.timeWindowSize} ${ - watch.timeWindowSize && parseInt(watch.timeWindowSize, 10) === 1 - ? timeUnits[watch.timeWindowUnit].labelSingular - : timeUnits[watch.timeWindowUnit].labelPlural - }`} + value={`${watch.timeWindowSize} ${getTimeUnitLabel( + watch.timeWindowUnit, + parseInt(watch.timeWindowSize, 10).toString() + )}`} isActive={watchDurationPopoverOpen || !watch.timeWindowSize} onClick={() => { setWatchDurationPopoverOpen(true); @@ -908,5 +904,3 @@ const ThresholdWatchEditUi = ({ intl, pageTitle }: { intl: InjectedIntl; pageTit ); }; - -export const ThresholdWatchEdit = injectI18n(ThresholdWatchEditUi); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx index b623c4778e2229..d9254c3692ee0d 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/watch_visualization.tsx @@ -25,7 +25,7 @@ import dateMath from '@elastic/datemath'; import chrome from 'ui/chrome'; import moment from 'moment-timezone'; import { EuiCallOut, EuiLoadingChart, EuiSpacer, EuiEmptyPrompt, EuiText } from '@elastic/eui'; -import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; +import { FormattedMessage } from '@kbn/i18n/react'; import { VisualizeOptions } from 'plugins/watcher/models/visualize_options'; import { ThresholdWatch } from 'plugins/watcher/models/watch/threshold_watch'; import { getWatchVisualizationData } from '../../../../lib/api'; @@ -98,7 +98,7 @@ const getTimeBuckets = (watch: any) => { return timeBuckets; }; -const WatchVisualizationUi = () => { +export const WatchVisualization = () => { const { watch } = useContext(WatchContext); const { index, @@ -288,5 +288,3 @@ const WatchVisualizationUi = () => { } return null; }; - -export const WatchVisualization = injectI18n(WatchVisualizationUi); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/time_units.ts b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/time_units.ts deleted file mode 100644 index 3b5ed35044f48b..00000000000000 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/time_units.ts +++ /dev/null @@ -1,55 +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 { i18n } from '@kbn/i18n'; -import { TIME_UNITS as COMMON_TIME_UNITS } from '../../../common/constants/time_units'; - -interface TimeUnit { - labelPlural: string; - labelSingular: string; -} -export const timeUnits: { [key: string]: TimeUnit } = { - [COMMON_TIME_UNITS.MILLISECOND]: { - labelPlural: i18n.translate('xpack.watcher.timeUnits.millisecondPluralLabel', { - defaultMessage: 'milliseconds', - }), - labelSingular: i18n.translate('xpack.watcher.timeUnits.millisecondSingularLabel', { - defaultMessage: 'millisecond', - }), - }, - [COMMON_TIME_UNITS.SECOND]: { - labelPlural: i18n.translate('xpack.watcher.timeUnits.secondPluralLabel', { - defaultMessage: 'seconds', - }), - labelSingular: i18n.translate('xpack.watcher.timeUnits.secondSingularLabel', { - defaultMessage: 'second', - }), - }, - [COMMON_TIME_UNITS.MINUTE]: { - labelPlural: i18n.translate('xpack.watcher.timeUnits.minutePluralLabel', { - defaultMessage: 'minutes', - }), - labelSingular: i18n.translate('xpack.watcher.timeUnits.minuteSingularLabel', { - defaultMessage: 'minute', - }), - }, - [COMMON_TIME_UNITS.HOUR]: { - labelPlural: i18n.translate('xpack.watcher.timeUnits.hourPluralLabel', { - defaultMessage: 'hours', - }), - labelSingular: i18n.translate('xpack.watcher.timeUnits.hourSingularLabel', { - defaultMessage: 'hour', - }), - }, - [COMMON_TIME_UNITS.DAY]: { - labelPlural: i18n.translate('xpack.watcher.timeUnits.dayPluralLabel', { - defaultMessage: 'days', - }), - labelSingular: i18n.translate('xpack.watcher.timeUnits.daySingularLabel', { - defaultMessage: 'day', - }), - }, -}; diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 1f68575f65fa80..290d65b69d37a3 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -25,7 +25,7 @@ import { EuiContextMenuItem, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; +import { FormattedMessage } from '@kbn/i18n/react'; import { Moment } from 'moment'; import chrome from 'ui/chrome'; import { MANAGEMENT_BREADCRUMB } from 'ui/management'; @@ -44,7 +44,7 @@ import { loadWatches } from '../../../lib/api'; import { watcherGettingStartedUrl } from '../../../lib/documentation_links'; import { goToCreateThresholdAlert, goToCreateAdvancedWatch } from '../../../lib/navigation'; -const WatchListUi = () => { +export const WatchList = () => { // hooks const [selection, setSelection] = useState([]); const [watchesToDelete, setWatchesToDelete] = useState([]); @@ -481,5 +481,3 @@ const WatchListUi = () => { } return null; }; - -export const WatchList = injectI18n(WatchListUi); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index b96002d6875a6a..997e76b907d44f 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -6,7 +6,7 @@ import React, { Fragment, useState, useEffect, useContext } from 'react'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; +import { FormattedMessage } from '@kbn/i18n/react'; import { toastNotifications } from 'ui/notify'; import { @@ -35,7 +35,7 @@ interface ActionStatus { errors: ActionError[]; } -const WatchDetailUi = () => { +export const WatchDetail = () => { const { watchDetail } = useContext(WatchDetailsContext); const [actionStatuses, setActionStatuses] = useState([]); @@ -234,5 +234,3 @@ const WatchDetailUi = () => { ); }; - -export const WatchDetail = injectI18n(WatchDetailUi); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_history.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_history.tsx index c612509005eaff..b2e0ea59b98186 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_history.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_history.tsx @@ -6,7 +6,7 @@ import React, { Fragment, useState, useContext } from 'react'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; +import { FormattedMessage } from '@kbn/i18n/react'; import { Moment } from 'moment'; import { @@ -67,7 +67,7 @@ const watchHistoryTimeSpanOptions = [ }, ]; -const WatchHistoryUi = () => { +export const WatchHistory = () => { const { watchDetail: loadedWatch } = useContext(WatchDetailsContext); const [isActivated, setIsActivated] = useState(undefined); @@ -309,5 +309,3 @@ const WatchHistoryUi = () => { ); }; - -export const WatchHistory = injectI18n(WatchHistoryUi); diff --git a/x-pack/legacy/plugins/watcher/server/models/action_status/action_status.js b/x-pack/legacy/plugins/watcher/server/models/action_status/action_status.js index a7aec37d2d29db..eeedf9aefe5f66 100644 --- a/x-pack/legacy/plugins/watcher/server/models/action_status/action_status.js +++ b/x-pack/legacy/plugins/watcher/server/models/action_status/action_status.js @@ -101,25 +101,20 @@ export class ActionStatus { // generate object from elasticsearch response static fromUpstreamJson(json) { + const missingPropertyError = missingProperty => i18n.translate( + 'xpack.watcher.models.actionStatus.actionStatusJsonPropertyMissingBadRequestMessage', + { + defaultMessage: 'JSON argument must contain an "{missingProperty}" property', + values: { missingProperty } + } + ); + if (!json.id) { - throw badRequest( - i18n.translate('xpack.watcher.models.actionStatus.idPropertyMissingBadRequestMessage', { - defaultMessage: 'JSON argument must contain an {id} property', - values: { - id: 'id' - } - }), - ); + throw badRequest(missingPropertyError('id')); } + if (!json.actionStatusJson) { - throw badRequest( - i18n.translate('xpack.watcher.models.actionStatus.actionStatusJsonPropertyMissingBadRequestMessage', { - defaultMessage: 'JSON argument must contain an {actionStatusJson} property', - values: { - actionStatusJson: 'actionStatusJson' - } - }), - ); + throw badRequest(missingPropertyError('actionStatusJson')); } return new ActionStatus(json); diff --git a/x-pack/legacy/plugins/watcher/server/routes/api/watch/register_save_route.js b/x-pack/legacy/plugins/watcher/server/routes/api/watch/register_save_route.js index 5744f7e643b3dc..ffc70e709907d5 100644 --- a/x-pack/legacy/plugins/watcher/server/routes/api/watch/register_save_route.js +++ b/x-pack/legacy/plugins/watcher/server/routes/api/watch/register_save_route.js @@ -9,6 +9,7 @@ import { Watch } from '../../../models/watch'; import { isEsErrorFactory } from '../../../lib/is_es_error_factory'; import { wrapEsError, wrapUnknownError, wrapCustomError } from '../../../lib/error_wrappers'; import { licensePreRoutingFactory } from'../../../lib/license_pre_routing_factory'; +import { i18n } from '@kbn/i18n'; function fetchWatch(callWithRequest, watchId) { return callWithRequest('watcher.getWatch', { @@ -38,7 +39,12 @@ export function registerSaveRoute(server) { // For new watches, verify watch with the same ID doesn't already exist if (watchPayload.isNew) { const conflictError = wrapCustomError( - new Error(`There is already a watch with ID '${watchPayload.id}'.`), + new Error(i18n.translate('xpack.watcher.saveRoute.duplicateWatchIdErrorMessage', { + defaultMessage: 'There is already a watch with ID \'{watchId}\'.', + values: { + watchId: watchPayload.id, + } + })), 409 ); From 448b331cfb638c355d65b79247da3776aff0b1db Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Wed, 26 Jun 2019 10:32:48 -0400 Subject: [PATCH 41/51] fix text size for watch status component (#39671) --- .../legacy/plugins/watcher/public/components/watch_status.tsx | 4 ++-- .../json_watch_edit/json_watch_edit_simulate_results.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/public/components/watch_status.tsx b/x-pack/legacy/plugins/watcher/public/components/watch_status.tsx index 08370cd9f1574b..39e6a5247b4a6f 100644 --- a/x-pack/legacy/plugins/watcher/public/components/watch_status.tsx +++ b/x-pack/legacy/plugins/watcher/public/components/watch_status.tsx @@ -30,14 +30,14 @@ function StatusIcon({ status }: { status: string }) { return null; } -export function WatchStatus({ status }: { status: string }) { +export function WatchStatus({ status, size = 's' }: { status: string; size?: 'xs' | 's' | 'm' }) { return ( - {status} + {status} ); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx index 66faece8cb03c8..1b2b4ab935e8c1 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_simulate_results.tsx @@ -169,7 +169,7 @@ export const JsonWatchEditSimulateResults = ({ {flyoutTitle} - + {actionsTableData && actionsTableData.length > 0 && ( From d57698cc7fbb9c865a4dfefb97bbad59a44adddb Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Wed, 26 Jun 2019 11:58:32 -0400 Subject: [PATCH 42/51] fix lastMetCondition column + loading state for threshold actions --- .../public/models/watch_status/watch_status.js | 2 +- .../threshold_watch_action_accordion.tsx | 8 ++++---- .../watch_list/components/watch_list.tsx | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/public/models/watch_status/watch_status.js b/x-pack/legacy/plugins/watcher/public/models/watch_status/watch_status.js index 57409bc1bb8e37..f213032a93c27e 100644 --- a/x-pack/legacy/plugins/watcher/public/models/watch_status/watch_status.js +++ b/x-pack/legacy/plugins/watcher/public/models/watch_status/watch_status.js @@ -16,7 +16,7 @@ export class WatchStatus { this.isActive = get(props, 'isActive'); this.lastFired = getMoment(get(props, 'lastFired')); this.lastChecked = getMoment(get(props, 'lastChecked')); - this.lastMetCondition = getMoment(this.lastMetCondition); + this.lastMetCondition = getMoment(get(props, 'lastMetCondition')); if (this.lastFired) { this.lastFiredHumanized = this.lastFired.fromNow(); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx index 202bc254521152..8b72eb7f194561 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_action_accordion.tsx @@ -74,7 +74,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ const { watch, setWatchProperty } = useContext(WatchContext); const { actions } = watch; - const [isExecuting, setIsExecuting] = useState(false); + const [isExecuting, setIsExecuting] = useState<{ [key: string]: boolean }>({}); const [executeResultsError, setExecuteResultsError] = useState(null); if (actions && actions.length >= 1) { @@ -199,7 +199,7 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ { const selectedWatchAction = watch.actions.filter( @@ -219,12 +219,12 @@ export const WatchActionsAccordion: React.FunctionComponent = ({ actions: selectedWatchAction, }); - setIsExecuting(true); + setIsExecuting({ [action.id]: true }); setExecuteResultsError(null); const { data, error } = await executeWatch(executeDetails, newExecuteWatch); - setIsExecuting(false); + setIsExecuting({ [action.id]: false }); if (error) { return setExecuteResultsError({ [action.id]: error }); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 290d65b69d37a3..2a6ce1c3544f72 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -266,14 +266,6 @@ export const WatchList = () => { width: '130px', render: (state: string) => , }, - { - field: 'watchStatus.comment', - name: i18n.translate('xpack.watcher.sections.watchList.watchTable.commentHeader', { - defaultMessage: 'Comment', - }), - sortable: true, - truncateText: true, - }, { field: 'watchStatus.lastMetCondition', name: i18n.translate('xpack.watcher.sections.watchList.watchTable.lastFiredHeader', { @@ -298,6 +290,14 @@ export const WatchList = () => { return lastChecked ? lastChecked.fromNow() : lastChecked; }, }, + { + field: 'watchStatus.comment', + name: i18n.translate('xpack.watcher.sections.watchList.watchTable.commentHeader', { + defaultMessage: 'Comment', + }), + sortable: true, + truncateText: true, + }, { name: i18n.translate('xpack.watcher.sections.watchList.watchTable.actionHeader', { defaultMessage: 'Actions', From 3bb5eb6971399c51fb6348e4d80dd79dce7e5740 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 27 Jun 2019 07:40:12 -0400 Subject: [PATCH 43/51] component integration tests for watch status page (#39509) --- x-pack/dev-tools/jest/create_jest_config.js | 2 +- .../helpers/http_requests.ts | 36 +++ .../helpers/watch_status.helpers.ts | 34 ++- .../client_integration/watch_list.test.ts | 2 +- .../client_integration/watch_status.test.ts | 245 +++++++++++++++++- .../watch_status/components/watch_detail.tsx | 5 +- .../watch_status/components/watch_history.tsx | 8 +- .../watch_status/components/watch_status.tsx | 1 + .../plugins/watcher/test/fixtures/watch.ts | 1 + .../watcher/test/fixtures/watch_history.ts | 15 ++ 10 files changed, 328 insertions(+), 21 deletions(-) diff --git a/x-pack/dev-tools/jest/create_jest_config.js b/x-pack/dev-tools/jest/create_jest_config.js index d511e879e9076d..7ff6b6cb8a4c6d 100644 --- a/x-pack/dev-tools/jest/create_jest_config.js +++ b/x-pack/dev-tools/jest/create_jest_config.js @@ -24,9 +24,9 @@ export function createJestConfig({ '^ui/(.*)': `${kibanaDirectory}/src/legacy/ui/public/$1`, 'uiExports/(.*)': `${kibanaDirectory}/src/dev/jest/mocks/file_mocks.js`, '^src/core/(.*)': `${kibanaDirectory}/src/core/$1`, + '^plugins/watcher/models/(.*)': `${xPackKibanaDirectory}/legacy/plugins/watcher/public/models/$1`, '^plugins/([^\/.]*)(.*)': `${kibanaDirectory}/src/legacy/core_plugins/$1/public$2`, '^legacy/plugins/xpack_main/(.*);': `${xPackKibanaDirectory}/legacy/plugins/xpack_main/public/$1`, - '^plugins/watcher/models/(.*)': `${xPackKibanaDirectory}/legacy/plugins/watcher/public/models/$1`, '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': `${kibanaDirectory}/src/dev/jest/mocks/file_mock.js`, '\\.(css|less|scss)$': `${kibanaDirectory}/src/dev/jest/mocks/style_mock.js`, diff --git a/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/http_requests.ts b/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/http_requests.ts index e925ee42fb14ca..2170559dace5a3 100644 --- a/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/http_requests.ts +++ b/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/http_requests.ts @@ -39,6 +39,11 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { ); }; + const setLoadWatchHistoryItemResponse = (response: HttpResponse = {}) => { + const defaultResponse = { watchHistoryItem: {} }; + server.respondWith('GET', `${API_ROOT}/history/:id`, mockResponse(defaultResponse, response)); + }; + const setDeleteWatchResponse = (response?: HttpResponse, error?: any) => { const status = error ? error.status || 400 : 200; const body = error ? JSON.stringify(error.body) : JSON.stringify(response); @@ -90,10 +95,38 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { ); }; + const setDeactivateWatchResponse = (response: HttpResponse = {}) => { + const defaultResponse = { watchStatus: {} }; + server.respondWith( + 'PUT', + `${API_ROOT}/watch/:id/deactivate`, + mockResponse(defaultResponse, response) + ); + }; + + const setActivateWatchResponse = (response: HttpResponse = {}) => { + const defaultResponse = { watchStatus: {} }; + server.respondWith( + 'PUT', + `${API_ROOT}/watch/:id/activate`, + mockResponse(defaultResponse, response) + ); + }; + + const setAcknowledgeWatchResponse = (response: HttpResponse = {}) => { + const defaultResponse = { watchStatus: {} }; + server.respondWith( + 'PUT', + `${API_ROOT}/watch/:id/action/:actionId/acknowledge`, + mockResponse(defaultResponse, response) + ); + }; + return { setLoadWatchesResponse, setLoadWatchResponse, setLoadWatchHistoryResponse, + setLoadWatchHistoryItemResponse, setDeleteWatchResponse, setSaveWatchResponse, setLoadExecutionResultResponse, @@ -101,6 +134,9 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { setLoadEsFieldsResponse, setLoadSettingsResponse, setLoadWatchVisualizeResponse, + setDeactivateWatchResponse, + setActivateWatchResponse, + setAcknowledgeWatchResponse, }; }; diff --git a/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts b/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts index adf6bf14677701..ac4e4eab1dcc82 100644 --- a/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts +++ b/x-pack/legacy/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts @@ -11,6 +11,7 @@ import { findTestSubject, TestBed, TestBedConfig, + nextTick, } from '../../../../../../test_utils'; import { WatchStatus } from '../../../public/sections/watch_status/components/watch_status'; import { ROUTES } from '../../../common/constants'; @@ -28,8 +29,9 @@ const initTestBed = registerTestBed(WatchStatus, testBedConfig); export interface WatchStatusTestBed extends TestBed { actions: { + selectTab: (tab: 'execution history' | 'action statuses') => void; clickToggleActivationButton: () => void; - clickAcknowledgeButton: () => void; + clickAcknowledgeButton: (index: number) => void; clickDeleteWatchButton: () => void; clickWatchExecutionAt: (index: number, tableCellText: string) => void; }; @@ -42,6 +44,15 @@ export const setup = async (): Promise => { * User Actions */ + const selectTab = (tab: 'execution history' | 'action statuses') => { + const tabs = ['execution history', 'action statuses']; + + testBed + .find('tab') + .at(tabs.indexOf(tab)) + .simulate('click'); + }; + const clickToggleActivationButton = async () => { const { component } = testBed; const button = testBed.find('toggleWatchActivationButton'); @@ -53,9 +64,12 @@ export const setup = async (): Promise => { }); }; - const clickAcknowledgeButton = async () => { - const { component } = testBed; - const button = testBed.find('acknowledgeWatchButton'); + const clickAcknowledgeButton = async (index: number) => { + const { component, table } = testBed; + const { rows } = table.getMetaData('watchActionStatusTable'); + const currentRow = rows[index]; + const lastColumn = currentRow.columns[currentRow.columns.length - 1].reactWrapper; + const button = findTestSubject(lastColumn, 'acknowledgeWatchButton'); // @ts-ignore (remove when react 16.9.0 is released) await act(async () => { @@ -79,12 +93,14 @@ export const setup = async (): Promise => { const { component, table } = testBed; const { rows } = table.getMetaData('watchHistoryTable'); const currentRow = rows[index]; - const firstColumn = currentRow.columns[currentRow.columns.length - 1].reactWrapper; - const button = findTestSubject(firstColumn, `watchIdColumn-${tableCellText}`); + const firstColumn = currentRow.columns[0].reactWrapper; + + const button = findTestSubject(firstColumn, `watchStartTimeColumn-${tableCellText}`); // @ts-ignore (remove when react 16.9.0 is released) await act(async () => { button.simulate('click'); + await nextTick(100); component.update(); }); }; @@ -92,6 +108,7 @@ export const setup = async (): Promise => { return { ...testBed, actions: { + selectTab, clickToggleActivationButton, clickAcknowledgeButton, clickDeleteWatchButton, @@ -110,9 +127,14 @@ export type TestSubjects = | 'actionErrorsFlyout.title' | 'deleteWatchButton' | 'pageTitle' + | 'tab' | 'toggleWatchActivationButton' + | 'watchActionStatusTable' + | 'watchActionsTable' + | 'watchDetailSection' | 'watchHistoryDetailFlyout' | 'watchHistoryDetailFlyout.title' + | 'watchHistorySection' | 'watchHistoryErrorDetailFlyout' | 'watchHistoryErrorDetailFlyout.errorMessage' | 'watchHistoryErrorDetailFlyout.title' diff --git a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_list.test.ts b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_list.test.ts index d119b7bb21f6a4..a7d5b4d3d470bd 100644 --- a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_list.test.ts +++ b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_list.test.ts @@ -197,7 +197,7 @@ describe.skip('', () => { ).toContain('Delete watch'); }); - test('should send the correct HTTP request to delete repository', async () => { + test('should send the correct HTTP request to delete watch', async () => { const { component, actions, table } = testBed; const { rows } = table.getMetaData('watchesTable'); diff --git a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_status.test.ts b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_status.test.ts index 4e0f3ce31eea26..3c01a5e007c2a9 100644 --- a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_status.test.ts +++ b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_status.test.ts @@ -8,6 +8,11 @@ import { setupEnvironment, pageHelpers, nextTick } from './helpers'; import { WatchStatusTestBed } from './helpers/watch_status.helpers'; import { WATCH } from './helpers/constants'; import { getWatchHistory } from '../../test/fixtures'; +import moment from 'moment'; +import { ROUTES } from '../../common/constants'; +import { WATCH_STATES, ACTION_STATES } from '../../common/constants'; + +const { API_ROOT } = ROUTES; jest.mock('ui/chrome', () => ({ breadcrumbs: { set: () => {} }, @@ -18,6 +23,28 @@ jest.mock('ui/time_buckets', () => {}); const { setup } = pageHelpers.watchStatus; +const watchHistory1 = getWatchHistory({ startTime: '2019-06-04T01:11:11.294' }); +const watchHistory2 = getWatchHistory({ startTime: '2019-06-04T01:10:10.987Z' }); + +const watchHistoryItems = { watchHistoryItems: [watchHistory1, watchHistory2] }; + +const ACTION_ID = 'my_logging_action_1'; + +const watch = { + ...WATCH.watch, + watchStatus: { + state: WATCH_STATES.FIRING, + isActive: true, + actionStatuses: [ + { + id: ACTION_ID, + state: ACTION_STATES.FIRING, + isAckable: true, + }, + ], + }, +}; + describe.skip('', () => { const { server, httpRequestsMockHelpers } = setupEnvironment(); let testBed: WatchStatusTestBed; @@ -28,12 +55,7 @@ describe.skip('', () => { describe('on component mount', () => { beforeEach(async () => { - const watchHistory1 = getWatchHistory({ startTime: '2019-06-04T01:11:11.294' }); - const watchHistory2 = getWatchHistory({ startTime: '2019-06-04T01:10:10.987Z' }); - - const watchHistoryItems = { watchHistoryItems: [watchHistory1, watchHistory2] }; - - httpRequestsMockHelpers.setLoadWatchResponse(WATCH); + httpRequestsMockHelpers.setLoadWatchResponse({ watch }); httpRequestsMockHelpers.setLoadWatchHistoryResponse(watchHistoryItems); testBed = await setup(); @@ -48,7 +70,216 @@ describe.skip('', () => { test('should set the correct page title', () => { const { find } = testBed; - expect(find('pageTitle').text()).toBe(`Current status for '${WATCH.watch.name}'`); + expect(find('pageTitle').text()).toBe(`Current status for '${watch.name}'`); + }); + + describe('tabs', () => { + test('should have 2 tabs', () => { + const { find } = testBed; + + expect(find('tab').length).toBe(2); + expect(find('tab').map(t => t.text())).toEqual(['Execution history', 'Action statuses']); + }); + + test('should navigate to the "Action statuses" tab', () => { + const { exists, actions } = testBed; + + expect(exists('watchHistorySection')).toBe(true); + expect(exists('watchDetailSection')).toBe(false); + + actions.selectTab('action statuses'); + + expect(exists('watchHistorySection')).toBe(false); + expect(exists('watchDetailSection')).toBe(true); + }); + }); + + describe('execution history', () => { + test('should list history items in the table', () => { + const { table } = testBed; + const { tableCellsValues } = table.getMetaData('watchHistoryTable'); + + const getExpectedValue = (value: any) => (typeof value === 'undefined' ? '' : value); + + tableCellsValues.forEach((row, i) => { + const historyItem = watchHistoryItems.watchHistoryItems[i]; + const { startTime, watchStatus } = historyItem; + + expect(row).toEqual([ + getExpectedValue(moment(startTime).format()), + getExpectedValue(watchStatus.state), + getExpectedValue(watchStatus.comment), + ]); + }); + }); + + test('should show execution history details on click', async () => { + const { actions, exists } = testBed; + + const watchHistoryItem = { + ...watchHistory1, + watchId: watch.id, + watchStatus: { + state: WATCH_STATES.FIRING, + actionStatuses: [ + { + id: 'my_logging_action_1', + state: ACTION_STATES.FIRING, + isAckable: true, + }, + ], + }, + }; + + const formattedStartTime = moment(watchHistoryItem.startTime).format(); + + httpRequestsMockHelpers.setLoadWatchHistoryItemResponse({ watchHistoryItem }); + + await actions.clickWatchExecutionAt(0, formattedStartTime); + + const latestRequest = server.requests[server.requests.length - 1]; + + expect(latestRequest.method).toBe('GET'); + expect(latestRequest.url).toBe(`${API_ROOT}/history/${watchHistoryItem.id}`); + + expect(exists('watchHistoryDetailFlyout')).toBe(true); + }); + }); + + describe('delete watch', () => { + test('should show a confirmation when clicking the delete button', async () => { + const { actions } = testBed; + + await actions.clickDeleteWatchButton(); + + // We need to read the document "body" as the modal is added there and not inside + // the component DOM tree. + expect( + document.body.querySelector('[data-test-subj="deleteWatchesConfirmation"]') + ).not.toBe(null); + + expect( + document.body.querySelector('[data-test-subj="deleteWatchesConfirmation"]')!.textContent + ).toContain('Delete watch'); + }); + + test('should send the correct HTTP request to delete watch', async () => { + const { component, actions } = testBed; + + await actions.clickDeleteWatchButton(); + + const modal = document.body.querySelector('[data-test-subj="deleteWatchesConfirmation"]'); + const confirmButton: HTMLButtonElement | null = modal!.querySelector( + '[data-test-subj="confirmModalConfirmButton"]' + ); + + httpRequestsMockHelpers.setDeleteWatchResponse({ + results: { + successes: [watch.id], + errors: [], + }, + }); + + // @ts-ignore (remove when react 16.9.0 is released) + await act(async () => { + confirmButton!.click(); + await nextTick(); + component.update(); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + expect(latestRequest.method).toBe('POST'); + expect(latestRequest.url).toBe(`${API_ROOT}/watches/delete`); + }); + }); + + describe('activate & deactive watch', () => { + test('should send the correct HTTP request to deactivate and activate a watch', async () => { + const { actions } = testBed; + + httpRequestsMockHelpers.setDeactivateWatchResponse({ + watchStatus: { + state: WATCH_STATES.DISABLED, + isActive: false, + }, + }); + + await actions.clickToggleActivationButton(); + + const deactivateRequest = server.requests[server.requests.length - 1]; + + expect(deactivateRequest.method).toBe('PUT'); + expect(deactivateRequest.url).toBe(`${API_ROOT}/watch/${watch.id}/deactivate`); + + httpRequestsMockHelpers.setActivateWatchResponse({ + watchStatus: { + state: WATCH_STATES.FIRING, + isActive: true, + }, + }); + + await actions.clickToggleActivationButton(); + + const activateRequest = server.requests[server.requests.length - 1]; + + expect(activateRequest.method).toBe('PUT'); + expect(activateRequest.url).toBe(`${API_ROOT}/watch/${watch.id}/activate`); + }); + }); + + describe('action statuses', () => { + beforeEach(() => { + const { actions } = testBed; + + actions.selectTab('action statuses'); + }); + + test('should list the watch actions in a table', () => { + const { table } = testBed; + const { tableCellsValues } = table.getMetaData('watchActionStatusTable'); + + tableCellsValues.forEach((row, i) => { + const action = watch.watchStatus.actionStatuses[i]; + const { id, state, isAckable } = action; + + expect(row).toEqual([id, state, isAckable ? 'Acknowledge' : '']); + }); + }); + + test('should allow an action to be acknowledged', async () => { + const { actions, table } = testBed; + + httpRequestsMockHelpers.setAcknowledgeWatchResponse({ + watchStatus: { + state: WATCH_STATES.FIRING, + isActive: true, + comment: 'Acked', + actionStatuses: [ + { + id: ACTION_ID, + state: ACTION_STATES.ACKNOWLEDGED, + isAckable: false, + }, + ], + }, + }); + + await actions.clickAcknowledgeButton(0); + + const latestRequest = server.requests[server.requests.length - 1]; + + expect(latestRequest.method).toBe('PUT'); + expect(latestRequest.url).toBe( + `${API_ROOT}/watch/${watch.id}/action/${ACTION_ID}/acknowledge` + ); + + const { tableCellsValues } = table.getMetaData('watchActionStatusTable'); + + tableCellsValues.forEach(row => { + expect(row).toEqual([ACTION_ID, ACTION_STATES.ACKNOWLEDGED, '']); + }); + }); }); }); }); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx index 997e76b907d44f..e871641fe0d5eb 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_detail.tsx @@ -178,7 +178,7 @@ export const WatchDetail = () => { : [...baseColumns, actionColumn]; return ( - +
    {selectedErrorAction && ( { columns={columns} pagination={PAGINATION} sorting={true} + data-test-subj="watchActionStatusTable" message={ { /> } /> - +
    ); }; diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_history.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_history.tsx index b2e0ea59b98186..c65d6b12e2e654 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_history.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_history.tsx @@ -124,8 +124,7 @@ export const WatchHistory = () => { const formattedDate = startTime.format(); return ( setDetailWatchId(item.id)} > {formattedDate} @@ -253,6 +252,7 @@ export const WatchHistory = () => { defaultMessage="No current status to show" /> } + data-test-subj="watchActionsTable" /> @@ -272,7 +272,7 @@ export const WatchHistory = () => { } return ( - +
    { } /> {flyout} - +
    ); }; diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_status.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_status.tsx index 1714525c8e7406..409cea68628f94 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_status.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_status/components/watch_status.tsx @@ -241,6 +241,7 @@ export const WatchStatus = ({ }} isSelected={tab.id === selectedTab} key={index} + data-test-subj="tab" > {tab.name} diff --git a/x-pack/legacy/plugins/watcher/test/fixtures/watch.ts b/x-pack/legacy/plugins/watcher/test/fixtures/watch.ts index 910ffb989f86a3..d948fddeefd588 100644 --- a/x-pack/legacy/plugins/watcher/test/fixtures/watch.ts +++ b/x-pack/legacy/plugins/watcher/test/fixtures/watch.ts @@ -27,6 +27,7 @@ interface Watch { lastMetCondition?: Moment; lastChecked?: Moment; isActive: boolean; + actionStatuses?: any[]; }; } diff --git a/x-pack/legacy/plugins/watcher/test/fixtures/watch_history.ts b/x-pack/legacy/plugins/watcher/test/fixtures/watch_history.ts index a62b91286d519b..70275e6e8869eb 100644 --- a/x-pack/legacy/plugins/watcher/test/fixtures/watch_history.ts +++ b/x-pack/legacy/plugins/watcher/test/fixtures/watch_history.ts @@ -4,20 +4,35 @@ * you may not use this file except in compliance with the Elastic License. */ +import { getRandomString } from '../../../../../test_utils'; + interface WatchHistory { startTime: string; + id: string; + watchId: string; watchStatus: { state: 'OK' | 'Firing' | 'Error' | 'Config error' | 'Disabled'; comment?: string; + actionStatuses?: Array<{ + id: string; + state: 'OK' | 'Firing' | 'Error' | 'Acked' | 'Throttled' | 'Config error'; + }>; }; + details?: object; } export const getWatchHistory = ({ startTime = '2019-06-03T19:44:11.088Z', + id = getRandomString(), + watchId = getRandomString(), watchStatus = { state: 'OK', }, + details = {}, }: Partial = {}): WatchHistory => ({ startTime, + id, + watchId, watchStatus, + details, }); From b493b51c952777b0a9dadaf5e4006c524bdbdc13 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 27 Jun 2019 11:04:51 -0400 Subject: [PATCH 44/51] address review feedback --- .../components/json_watch_edit/json_watch_edit_form.tsx | 6 ++---- .../threshold_watch_edit/threshold_watch_edit.tsx | 9 ++++++++- .../public/sections/watch_list/components/watch_list.tsx | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx index 8262f8c5235c83..80d3751ae3632a 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/json_watch_edit/json_watch_edit_form.tsx @@ -24,6 +24,7 @@ import { ErrableFormRow, SectionError } from '../../../../components'; import { putWatchApiUrl } from '../../../../lib/documentation_links'; import { onWatchSave } from '../../watch_edit_actions'; import { WatchContext } from '../../watch_context'; +import { goToWatchList } from '../../../../lib/navigation'; export const JsonWatchEditForm = () => { const { watch, setWatchProperty } = useContext(WatchContext); @@ -208,10 +209,7 @@ export const JsonWatchEditForm = () => {
    - + goToWatchList()}> {i18n.translate('xpack.watcher.sections.watchEdit.json.cancelButtonLabel', { defaultMessage: 'Cancel', })} diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index 2bc53a03376441..4d092895b4149e 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -37,6 +37,7 @@ import { WatchContext } from '../../watch_context'; import { WatchVisualization } from './watch_visualization'; import { WatchActionsPanel } from './threshold_watch_action_panel'; import { getTimeUnitLabel } from '../../../../lib/get_time_unit_label'; +import { goToWatchList } from '../../../../lib/navigation'; const expressionFieldsWithValidation = [ 'aggField', @@ -166,6 +167,8 @@ export const ThresholdWatchEdit = ({ pageTitle }: { pageTitle: string }) => { data: { nessage: string; error: string }; } | null>(null); const [isSaving, setIsSaving] = useState(false); + const [isIndiciesLoading, setIsIndiciesLoading] = useState(false); + const { watch, setWatchProperty } = useContext(WatchContext); const getIndexPatterns = async () => { @@ -293,6 +296,8 @@ export const ThresholdWatchEdit = ({ pageTitle }: { pageTitle: string }) => { > { setTimeFieldOptions(timeFields); }} onSearchChange={async search => { + setIsIndiciesLoading(true); setIndexOptions(await getIndexOptions(search, indexPatterns)); + setIsIndiciesLoading(false); }} onBlur={() => { if (!watch.index) { @@ -893,7 +900,7 @@ export const ThresholdWatchEdit = ({ pageTitle }: { pageTitle: string }) => { - + goToWatchList()}> {i18n.translate('xpack.watcher.sections.watchEdit.threshold.cancelButtonLabel', { defaultMessage: 'Cancel', })} diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx index 2a6ce1c3544f72..6bcb7568eae383 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_list/components/watch_list.tsx @@ -226,7 +226,7 @@ export const WatchList = () => { error={error} /> ); - } else { + } else if (availableWatches) { const columns = [ { field: 'id', From ccecb29cf1511cab135ebe672391186331f69307 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 27 Jun 2019 15:35:47 -0400 Subject: [PATCH 45/51] remove deprecated xpack:defaultAdminEmail from email action --- .../plugins/watcher/public/models/action/email_action.js | 7 +++---- .../action_fields/email_action_fields.tsx | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/public/models/action/email_action.js b/x-pack/legacy/plugins/watcher/public/models/action/email_action.js index 5d519825ad19b5..3d042435796399 100644 --- a/x-pack/legacy/plugins/watcher/public/models/action/email_action.js +++ b/x-pack/legacy/plugins/watcher/public/models/action/email_action.js @@ -7,15 +7,13 @@ import { get, isArray } from 'lodash'; import { BaseAction } from './base_action'; import { i18n } from '@kbn/i18n'; -import chrome from 'ui/chrome'; export class EmailAction extends BaseAction { constructor(props = {}) { super(props); - const uiSettings = chrome.getUiSettingsClient(); - const defaultToEmail = uiSettings.get('xPack:defaultAdminEmail'); - const toArray = get(props, 'to', defaultToEmail); + const toArray = get(props, 'to'); + this.to = isArray(toArray) ? toArray : toArray && [ toArray ]; const defaultSubject = i18n.translate('xpack.watcher.models.emailAction.defaultSubjectText', { @@ -24,6 +22,7 @@ export class EmailAction extends BaseAction { context: '{{ctx.metadata.name}}', } }); + this.subject = get(props, 'subject', props.ignoreDefaults ? null : defaultSubject); this.body = get(props, 'body'); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx index c8f03cb9f8c63b..08c7756fb4110e 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx @@ -33,7 +33,7 @@ export const EmailActionFields: React.FunctionComponent = ({ errorKey="to" fullWidth errors={errors} - isShowingErrors={hasErrors && to !== null} + isShowingErrors={hasErrors && to !== undefined} label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.emailAction.recipientTextFieldLabel', { From 87ff8aa75960f485cdf7d6511cfebff5971d592c Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 27 Jun 2019 21:27:41 -0400 Subject: [PATCH 46/51] Revert "remove deprecated xpack:defaultAdminEmail from email action" This reverts commit ccecb29cf1511cab135ebe672391186331f69307. --- .../plugins/watcher/public/models/action/email_action.js | 7 ++++--- .../action_fields/email_action_fields.tsx | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/public/models/action/email_action.js b/x-pack/legacy/plugins/watcher/public/models/action/email_action.js index 3d042435796399..5d519825ad19b5 100644 --- a/x-pack/legacy/plugins/watcher/public/models/action/email_action.js +++ b/x-pack/legacy/plugins/watcher/public/models/action/email_action.js @@ -7,13 +7,15 @@ import { get, isArray } from 'lodash'; import { BaseAction } from './base_action'; import { i18n } from '@kbn/i18n'; +import chrome from 'ui/chrome'; export class EmailAction extends BaseAction { constructor(props = {}) { super(props); - const toArray = get(props, 'to'); - + const uiSettings = chrome.getUiSettingsClient(); + const defaultToEmail = uiSettings.get('xPack:defaultAdminEmail'); + const toArray = get(props, 'to', defaultToEmail); this.to = isArray(toArray) ? toArray : toArray && [ toArray ]; const defaultSubject = i18n.translate('xpack.watcher.models.emailAction.defaultSubjectText', { @@ -22,7 +24,6 @@ export class EmailAction extends BaseAction { context: '{{ctx.metadata.name}}', } }); - this.subject = get(props, 'subject', props.ignoreDefaults ? null : defaultSubject); this.body = get(props, 'body'); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx index 08c7756fb4110e..c8f03cb9f8c63b 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx @@ -33,7 +33,7 @@ export const EmailActionFields: React.FunctionComponent = ({ errorKey="to" fullWidth errors={errors} - isShowingErrors={hasErrors && to !== undefined} + isShowingErrors={hasErrors && to !== null} label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.emailAction.recipientTextFieldLabel', { From ba5868a8ffb642fc5fe2d8bf721a965db355c78d Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 28 Jun 2019 08:05:21 -0400 Subject: [PATCH 47/51] fix license checker --- .../legacy/plugins/watcher/public/register_route.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/public/register_route.js b/x-pack/legacy/plugins/watcher/public/register_route.js index 3d1dde082c9bfe..c58be17bc6e758 100644 --- a/x-pack/legacy/plugins/watcher/public/register_route.js +++ b/x-pack/legacy/plugins/watcher/public/register_route.js @@ -8,7 +8,7 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { SavedObjectsClientProvider } from 'ui/saved_objects'; import routes from 'ui/routes'; import { management } from 'ui/management'; -import { XPackInfoProvider } from 'plugins/xpack_main/services/xpack_info'; +import { xpackInfo } from 'plugins/xpack_main/services/xpack_info'; import template from './app.html'; import { App } from './app'; import { setHttpClient, setSavedObjectsClient } from './lib/api'; @@ -31,8 +31,7 @@ routes.when('/management/elasticsearch/watcher/:param1?/:param2?/:param3?/:param controller: class WatcherController { constructor($injector, $scope, $http, Private) { const $route = $injector.get('$route'); - const xpackInfoService = Private(XPackInfoProvider); - const licenseStatus = xpackInfoService.get(`features.${PLUGIN.ID}`); + const licenseStatus = xpackInfo.get(`features.${PLUGIN.ID}`); // clean up previously rendered React app if one exists // this happens because of React Router redirects @@ -53,11 +52,9 @@ routes.when('/management/elasticsearch/watcher/:param1?/:param2?/:param3?/:param routes.defaults(/\/management/, { resolve: { - watcherManagementSection: $injector => { - const Private = $injector.get('Private'); - const xpackInfoService = Private(XPackInfoProvider); + watcherManagementSection: () => { const watchesSection = management.getSection('elasticsearch/watcher'); - const licenseStatus = xpackInfoService.get(`features.${PLUGIN.ID}`); + const licenseStatus = xpackInfo.get(`features.${PLUGIN.ID}`); const { status } = licenseStatus; if (status === LICENSE_STATUS_INVALID || status === LICENSE_STATUS_UNAVAILABLE) { From c75c90b5a92d9e3746ff003dcde17bbaf83d3423 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 28 Jun 2019 08:45:12 -0400 Subject: [PATCH 48/51] fix test --- .../__jest__/client_integration/watch_list.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_list.test.ts b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_list.test.ts index a7d5b4d3d470bd..ebd6628c9c0833 100644 --- a/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_list.test.ts +++ b/x-pack/legacy/plugins/watcher/__jest__/client_integration/watch_list.test.ts @@ -40,12 +40,6 @@ describe.skip('', () => { testBed = await setup(); }); - test('should set the correct app title', () => { - const { exists, find } = testBed; - expect(exists('appTitle')).toBe(true); - expect(find('appTitle').text()).toEqual('Watcher'); - }); - describe('watches', () => { describe('when there are no watches', () => { beforeEach(() => { @@ -99,6 +93,12 @@ describe.skip('', () => { }); }); + test('should set the correct app title', () => { + const { exists, find } = testBed; + expect(exists('appTitle')).toBe(true); + expect(find('appTitle').text()).toEqual('Watcher'); + }); + test('should have a link to the documentation', () => { const { exists, find } = testBed; expect(exists('documentationLink')).toBe(true); From 44450ac87385121c3f4859cc9dffdd02295f26d9 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 28 Jun 2019 12:08:44 -0400 Subject: [PATCH 49/51] fix action model test --- .../plugins/watcher/server/models/action/action.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/server/models/action/action.test.js b/x-pack/legacy/plugins/watcher/server/models/action/action.test.js index d3d8abc73a62ed..d41844017e2983 100644 --- a/x-pack/legacy/plugins/watcher/server/models/action/action.test.js +++ b/x-pack/legacy/plugins/watcher/server/models/action/action.test.js @@ -39,14 +39,14 @@ describe('action', () => { delete upstreamJson.id; expect(() => { Action.fromUpstreamJson(upstreamJson); - }).toThrowError(/must contain an id property/i); + }).toThrowError('JSON argument must contain an id property'); }); it(`throws an error if no 'actionJson' property in json`, () => { delete upstreamJson.actionJson; expect(() => { Action.fromUpstreamJson(upstreamJson); - }).toThrowError(/must contain an actionJson property/i); + }).toThrowError('JSON argument must contain an actionJson property'); }); it(`throws an error if an Action is invalid`, () => { From c0e9ae2281bf718d6744ce5fa55057876f29fe39 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 28 Jun 2019 14:12:55 -0400 Subject: [PATCH 50/51] fix tests --- .../server/models/action_status/__tests__/action_status.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/server/models/action_status/__tests__/action_status.js b/x-pack/legacy/plugins/watcher/server/models/action_status/__tests__/action_status.js index 911c960efdab59..456768c8c02ec0 100644 --- a/x-pack/legacy/plugins/watcher/server/models/action_status/__tests__/action_status.js +++ b/x-pack/legacy/plugins/watcher/server/models/action_status/__tests__/action_status.js @@ -43,13 +43,13 @@ describe('action_status', () => { it(`throws an error if no 'id' property in json`, () => { delete upstreamJson.id; expect(ActionStatus.fromUpstreamJson).withArgs(upstreamJson) - .to.throwError(/must contain an id property/i); + .to.throwError('JSON argument must contain an "id" property'); }); it(`throws an error if no 'actionStatusJson' property in json`, () => { delete upstreamJson.actionStatusJson; expect(ActionStatus.fromUpstreamJson).withArgs(upstreamJson) - .to.throwError(/must contain an actionStatusJson property/i); + .to.throwError('JSON argument must contain an "actionStatusJson" property'); }); it('returns correct ActionStatus instance', () => { From af75ef48a809c1cbd531723948847410be954d7d Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Fri, 28 Jun 2019 15:41:34 -0400 Subject: [PATCH 51/51] Revert "Revert "remove deprecated xpack:defaultAdminEmail from email action"" This reverts commit 87ff8aa75960f485cdf7d6511cfebff5971d592c. --- .../plugins/watcher/public/models/action/email_action.js | 7 +++---- .../action_fields/email_action_fields.tsx | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/x-pack/legacy/plugins/watcher/public/models/action/email_action.js b/x-pack/legacy/plugins/watcher/public/models/action/email_action.js index 5d519825ad19b5..3d042435796399 100644 --- a/x-pack/legacy/plugins/watcher/public/models/action/email_action.js +++ b/x-pack/legacy/plugins/watcher/public/models/action/email_action.js @@ -7,15 +7,13 @@ import { get, isArray } from 'lodash'; import { BaseAction } from './base_action'; import { i18n } from '@kbn/i18n'; -import chrome from 'ui/chrome'; export class EmailAction extends BaseAction { constructor(props = {}) { super(props); - const uiSettings = chrome.getUiSettingsClient(); - const defaultToEmail = uiSettings.get('xPack:defaultAdminEmail'); - const toArray = get(props, 'to', defaultToEmail); + const toArray = get(props, 'to'); + this.to = isArray(toArray) ? toArray : toArray && [ toArray ]; const defaultSubject = i18n.translate('xpack.watcher.models.emailAction.defaultSubjectText', { @@ -24,6 +22,7 @@ export class EmailAction extends BaseAction { context: '{{ctx.metadata.name}}', } }); + this.subject = get(props, 'subject', props.ignoreDefaults ? null : defaultSubject); this.body = get(props, 'body'); diff --git a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx index c8f03cb9f8c63b..08c7756fb4110e 100644 --- a/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx +++ b/x-pack/legacy/plugins/watcher/public/sections/watch_edit/components/threshold_watch_edit/action_fields/email_action_fields.tsx @@ -33,7 +33,7 @@ export const EmailActionFields: React.FunctionComponent = ({ errorKey="to" fullWidth errors={errors} - isShowingErrors={hasErrors && to !== null} + isShowingErrors={hasErrors && to !== undefined} label={i18n.translate( 'xpack.watcher.sections.watchEdit.threshold.emailAction.recipientTextFieldLabel', {