diff --git a/.eslintrc.js b/.eslintrc.js
index e66331594b4ae..2ce6d279d93a9 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -69,26 +69,6 @@ module.exports = {
'jsx-a11y/no-onchange': 'off',
},
},
- {
- files: ['src/legacy/core_plugins/expressions/**/*.{js,ts,tsx}'],
- rules: {
- 'react-hooks/exhaustive-deps': 'off',
- },
- },
- {
- files: [
- 'src/legacy/core_plugins/vis_default_editor/public/components/controls/**/*.{ts,tsx}',
- ],
- rules: {
- 'react-hooks/exhaustive-deps': 'off',
- },
- },
- {
- files: ['src/legacy/ui/public/vis/**/*.{js,ts,tsx}'],
- rules: {
- 'react-hooks/exhaustive-deps': 'off',
- },
- },
{
files: ['src/plugins/es_ui_shared/**/*.{js,ts,tsx}'],
rules: {
@@ -552,29 +532,6 @@ module.exports = {
},
},
- /**
- * Graph overrides
- */
- {
- files: ['x-pack/legacy/plugins/graph/**/*.js'],
- globals: {
- angular: true,
- $: true,
- },
- rules: {
- 'block-scoped-var': 'off',
- camelcase: 'off',
- eqeqeq: 'off',
- 'guard-for-in': 'off',
- 'new-cap': 'off',
- 'no-loop-func': 'off',
- 'no-redeclare': 'off',
- 'no-shadow': 'off',
- 'no-unused-vars': 'off',
- 'one-var': 'off',
- },
- },
-
/**
* ML overrides
*/
@@ -771,7 +728,7 @@ module.exports = {
* Lens overrides
*/
{
- files: ['x-pack/legacy/plugins/lens/**/*.ts', 'x-pack/legacy/plugins/lens/**/*.tsx'],
+ files: ['x-pack/legacy/plugins/lens/**/*.{ts,tsx}', 'x-pack/plugins/lens/**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-explicit-any': 'error',
},
@@ -885,8 +842,10 @@ module.exports = {
* TSVB overrides
*/
{
- files: ['src/legacy/core_plugins/metrics/**/*.js'],
- excludedFiles: 'src/legacy/core_plugins/metrics/index.js',
+ files: [
+ 'src/plugins/vis_type_timeseries/**/*.{js,ts,tsx}',
+ 'src/legacy/core_plugins/vis_type_timeseries/**/*.{js,ts,tsx}',
+ ],
rules: {
'import/no-default-export': 'error',
},
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 1666c30c75a61..1c51fc01201b5 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -16,18 +16,20 @@
/src/legacy/core_plugins/metrics/ @elastic/kibana-app
/src/legacy/core_plugins/vis_type_vislib/ @elastic/kibana-app
/src/legacy/core_plugins/vis_type_xy/ @elastic/kibana-app
-# Exclude tutorials folder for now because they are not owned by Kibana app and most will move out soon
-/src/plugins/home/public @elastic/kibana-app
-/src/plugins/home/server/*.ts @elastic/kibana-app
-/src/plugins/home/server/services/ @elastic/kibana-app
-# Exclude tutorial resources folder for now because they are not owned by Kibana app and most will move out soon
-/src/legacy/core_plugins/kibana/public/home/*.ts @elastic/kibana-app
-/src/legacy/core_plugins/kibana/public/home/*.scss @elastic/kibana-app
-/src/legacy/core_plugins/kibana/public/home/np_ready/ @elastic/kibana-app
/src/plugins/kibana_legacy/ @elastic/kibana-app
/src/plugins/timelion/ @elastic/kibana-app
-/src/plugins/dev_tools/ @elastic/kibana-app
/src/plugins/dashboard/ @elastic/kibana-app
+/src/plugins/discover/ @elastic/kibana-app
+
+# Core UI
+# Exclude tutorials folder for now because they are not owned by Kibana app and most will move out soon
+/src/plugins/home/public @elastic/kibana-core-ui
+/src/plugins/home/server/*.ts @elastic/kibana-core-ui
+/src/plugins/home/server/services/ @elastic/kibana-core-ui
+# Exclude tutorial resources folder for now because they are not owned by Kibana app and most will move out soon
+/src/legacy/core_plugins/kibana/public/home/*.ts @elastic/kibana-core-ui
+/src/legacy/core_plugins/kibana/public/home/*.scss @elastic/kibana-core-ui
+/src/legacy/core_plugins/kibana/public/home/np_ready/ @elastic/kibana-core-ui
# App Architecture
/examples/url_generators_examples/ @elastic/kibana-app-arch
@@ -86,9 +88,8 @@
/x-pack/test/functional/apps/machine_learning/ @elastic/ml-ui
/x-pack/test/functional/services/machine_learning/ @elastic/ml-ui
/x-pack/test/functional/services/ml.ts @elastic/ml-ui
-# ML team owns the transform plugin, ES team added here for visibility
-# because the plugin lives in Kibana's Elasticsearch management section.
-/x-pack/plugins/transform/ @elastic/ml-ui @elastic/es-ui
+# ML team owns and maintains the transform plugin despite it living in the Elasticsearch management section.
+/x-pack/plugins/transform/ @elastic/ml-ui
/x-pack/test/functional/apps/transform/ @elastic/ml-ui
/x-pack/test/functional/services/transform_ui/ @elastic/ml-ui
/x-pack/test/functional/services/transform.ts @elastic/ml-ui
@@ -176,6 +177,7 @@
**/*.scss @elastic/kibana-design
# Elasticsearch UI
+/src/plugins/dev_tools/ @elastic/es-ui
/src/plugins/console/ @elastic/es-ui
/src/plugins/es_ui_shared/ @elastic/es-ui
/x-pack/legacy/plugins/cross_cluster_replication/ @elastic/es-ui
diff --git a/.i18nrc.json b/.i18nrc.json
index c293b3103a39c..19d361aed9344 100644
--- a/.i18nrc.json
+++ b/.i18nrc.json
@@ -24,6 +24,7 @@
"src/legacy/core_plugins/management",
"src/plugins/management"
],
+ "indexPatternManagement": "src/plugins/index_pattern_management",
"advancedSettings": "src/plugins/advanced_settings",
"kibana_legacy": "src/plugins/kibana_legacy",
"kibana_react": "src/legacy/core_plugins/kibana_react",
@@ -43,7 +44,7 @@
"tileMap": "src/legacy/core_plugins/tile_map",
"timelion": ["src/legacy/core_plugins/timelion", "src/legacy/core_plugins/vis_type_timelion", "src/plugins/timelion"],
"uiActions": "src/plugins/ui_actions",
- "visDefaultEditor": "src/legacy/core_plugins/vis_default_editor",
+ "visDefaultEditor": "src/plugins/vis_default_editor",
"visTypeMarkdown": "src/legacy/core_plugins/vis_type_markdown",
"visTypeMetric": "src/legacy/core_plugins/vis_type_metric",
"visTypeTable": "src/legacy/core_plugins/vis_type_table",
diff --git a/docs/api/role-management/put.asciidoc b/docs/api/role-management/put.asciidoc
index 59e6bc8d37eec..993d75780c87c 100644
--- a/docs/api/role-management/put.asciidoc
+++ b/docs/api/role-management/put.asciidoc
@@ -17,6 +17,7 @@ experimental[] Create a new {kib} role, or update the attributes of an existing
To use the create or update role API, you must have the `manage_security` cluster privilege.
+[role="child_attributes"]
[[role-management-api-response-body]]
==== Request body
@@ -29,8 +30,11 @@ To use the create or update role API, you must have the `manage_security` cluste
{ref}/defining-roles.html[Defining roles].
`kibana`::
- (list) Objects that specify the <> for the role:
-
+ (list) Objects that specify the <> for the role.
++
+.Properties of `kibana`
+[%collapsible%open]
+=====
`base` :::
(Optional, list) A base privilege. When specified, the base must be `["all"]` or `["read"]`.
When the `base` privilege is specified, you are unable to use the `feature` section.
@@ -45,6 +49,7 @@ To use the create or update role API, you must have the `manage_security` cluste
`spaces` :::
(list) The spaces to apply the privileges to.
To grant access to all spaces, set to `["*"]`, or omit the value.
+=====
[[role-management-api-put-response-codes]]
==== Response code
@@ -52,7 +57,7 @@ To use the create or update role API, you must have the `manage_security` cluste
`204`::
Indicates a successful call.
-===== Examples
+==== Examples
Grant access to various features in all spaces:
diff --git a/docs/api/spaces-management/copy_saved_objects.asciidoc b/docs/api/spaces-management/copy_saved_objects.asciidoc
index e23a137485b2d..4822e7f624302 100644
--- a/docs/api/spaces-management/copy_saved_objects.asciidoc
+++ b/docs/api/spaces-management/copy_saved_objects.asciidoc
@@ -26,6 +26,7 @@ You can request to overwrite any objects that already exist in the target space
`space_id`::
(Optional, string) The ID of the space that contains the saved objects you want to copy. When `space_id` is unspecified in the URL, the default space is used.
+[role="child_attributes"]
[[spaces-api-copy-saved-objects-request-body]]
==== {api-request-body-title}
@@ -34,10 +35,16 @@ You can request to overwrite any objects that already exist in the target space
`objects`::
(Required, object array) The saved objects to copy.
++
+.Properties of `objects`
+[%collapsible%open]
+=====
`type`:::
(Required, string) The saved object type.
+
`id`:::
(Required, string) The saved object ID.
+=====
`includeReferences`::
(Optional, boolean) When set to `true`, all saved objects related to the specified saved objects will also be copied into the target spaces. The default value is `false`.
@@ -45,27 +52,43 @@ You can request to overwrite any objects that already exist in the target space
`overwrite`::
(Optional, boolean) When set to `true`, all conflicts are automatically overidden. When a saved object with a matching `type` and `id` exists in the target space, that version is replaced with the version from the source space. The default value is `false`.
-
+[role="child_attributes"]
[[spaces-api-copy-saved-objects-response-body]]
==== {api-response-body-title}
``::
(object) An object that describes the result of the copy operation for the space. Includes the dynamic keys in the response.
++
+.Properties of ``
+[%collapsible%open]
+=====
`success`:::
(boolean) The copy operation was successful. When set to `false`, some objects may have been copied. For additional information, refer to the `successCount` and `errors` properties.
+
`successCount`:::
(number) The number of objects that successfully copied.
+
`errors`:::
- (Optional, array) The errors that occurred during the copy operation. When errors are reported, the `success` flag is set to `false`.v
+ (Optional, array) The errors that occurred during the copy operation. When errors are reported, the `success` flag is set to `false`.
++
+.Properties of `errors`
+[%collapsible%open]
+======
`id`::::
(string) The saved object ID that failed to copy.
`type`::::
(string) The type of saved object that failed to copy.
`error`::::
(object) The error that caused the copy operation to fail.
++
+.Properties of `error`
+[%collapsible%open]
+=======
`type`:::::
(string) The type of error. For example, `unsupported_type`, `missing_references`, or `unknown`. Errors marked as `conflict` may be resolved by using the <>.
-
+=======
+======
+=====
[[spaces-api-copy-saved-objects-example]]
==== {api-examples-title}
diff --git a/docs/api/spaces-management/resolve_copy_saved_objects_conflicts.asciidoc b/docs/api/spaces-management/resolve_copy_saved_objects_conflicts.asciidoc
index 8e874bb9f94e5..565d12513815b 100644
--- a/docs/api/spaces-management/resolve_copy_saved_objects_conflicts.asciidoc
+++ b/docs/api/spaces-management/resolve_copy_saved_objects_conflicts.asciidoc
@@ -25,51 +25,89 @@ Execute the <>, w
`space_id`::
(Optional, string) The ID of the space that contains the saved objects you want to copy. When `space_id` is unspecified in the URL, the default space is used. The `space_id` must be the same value used during the failed <> operation.
+[role="child_attributes"]
[[spaces-api-resolve-copy-saved-objects-conflicts-request-body]]
==== {api-request-body-title}
`objects`::
(Required, object array) The saved objects to copy. The `objects` must be the same values used during the failed <> operation.
++
+.Properties of `objects`
+[%collapsible%open]
+=====
`type`:::
(Required, string) The saved object type.
+
`id`:::
(Required, string) The saved object ID.
+=====
`includeReferences`::
(Optional, boolean) When set to `true`, all saved objects related to the specified saved objects are copied into the target spaces. The `includeReferences` must be the same values used during the failed <> operation. The default value is `false`.
`retries`::
(Required, object) The retry operations to attempt. Object keys represent the target space IDs.
++
+.Properties of `retries`
+[%collapsible%open]
+=====
``:::
(Required, array) The errors to resolve for the specified ``.
++
+
+.Properties of ``
+[%collapsible%open]
+======
`type`::::
(Required, string) The saved object type.
`id`::::
(Required, string) The saved object ID.
`overwrite`::::
(Required, boolean) When set to `true`, the saved object from the source space (desigated by the <>) overwrites the conflicting object in the destination space. When set to `false`, this does nothing.
+======
+=====
-
+[role="child_attributes"]
[[spaces-api-resolve-copy-saved-objects-conflicts-response-body]]
==== {api-response-body-title}
``::
(object) An object that describes the result of the copy operation for the space. Includes the dynamic keys in the response.
++
+.Properties of ``
+[%collapsible%open]
+=====
`success`:::
(boolean) The copy operation was successful. When set to `false`, some objects may have been copied. For additional information, refer to the `successCount` and `errors` properties.
+
`successCount`:::
(number) The number of objects that successfully copied.
+
`errors`:::
(Optional, array) The errors that occurred during the copy operation. When errors are reported, the `success` flag is set to `false`.
++
+
+.Properties of `errors`
+[%collapsible%open]
+======
`id`::::
(string) The saved object ID that failed to copy.
+
`type`::::
(string) The type of saved object that failed to copy.
+
`error`::::
(object) The error that caused the copy operation to fail.
- `type`:::::
- (string) The type of error. For example, `unsupported_type`, `missing_references`, or `unknown`.
++
+.Properties of `error`
+[%collapsible%open]
+=======
+ `type`::::
+ (string) The type of error. For example, `unsupported_type`, `missing_references`, or `unknown`.
+=======
+======
+=====
[[spaces-api-resolve-copy-saved-objects-conflicts-example]]
==== {api-examples-title}
diff --git a/docs/apm/api.asciidoc b/docs/apm/api.asciidoc
index b520cc46bef8d..a8f4f4bf0baaa 100644
--- a/docs/apm/api.asciidoc
+++ b/docs/apm/api.asciidoc
@@ -38,17 +38,22 @@ The following Agent configuration APIs are available:
`PUT /api/apm/settings/agent-configuration`
+[role="child_attributes"]
[[apm-update-config-req-body]]
===== Request body
`service`::
(required, object) Service identifying the configuration to create or update.
-
++
+.Properties of `service`
+[%collapsible%open]
+======
`name` :::
(required, string) Name of service
`environment` :::
(optional, string) Environment of service
+======
`settings`::
(required) Key/value object with settings and their corresponding value.
@@ -90,16 +95,21 @@ PUT /api/apm/settings/agent-configuration
`DELETE /api/apm/settings/agent-configuration`
+[role="child_attributes"]
[[apm-delete-config-req-body]]
===== Request body
`service`::
(required, object) Service identifying the configuration to delete
-
++
+.Properties of `service`
+[%collapsible%open]
+======
`name` :::
(required, string) Name of service
`environment` :::
(optional, string) Environment of service
+======
[[apm-delete-config-example]]
@@ -201,17 +211,22 @@ GET /api/apm/settings/agent-configuration
`POST /api/apm/settings/agent-configuration/search`
+[role="child_attributes"]
[[apm-search-config-req-body]]
===== Request body
`service`::
(required, object) Service identifying the configuration.
-
++
+.Properties of `service`
+[%collapsible%open]
+======
`name` :::
(required, string) Name of service
`environment` :::
(optional, string) Environment of service
+======
`etag`::
(required) etag is sent by the agent to indicate the etag of the last successfully applied configuration. If the etag matches an existing configuration its `applied_by_agent` property will be set to `true`. Every time a configuration is edited `applied_by_agent` is reset to `false`.
diff --git a/docs/apm/images/service-maps-java.png b/docs/apm/images/service-maps-java.png
new file mode 100644
index 0000000000000..e1a42f4c76e12
Binary files /dev/null and b/docs/apm/images/service-maps-java.png differ
diff --git a/docs/apm/images/service-maps.png b/docs/apm/images/service-maps.png
new file mode 100644
index 0000000000000..454ae9bb720fb
Binary files /dev/null and b/docs/apm/images/service-maps.png differ
diff --git a/docs/apm/service-maps.asciidoc b/docs/apm/service-maps.asciidoc
new file mode 100644
index 0000000000000..e0d84f33b4dcb
--- /dev/null
+++ b/docs/apm/service-maps.asciidoc
@@ -0,0 +1,48 @@
+[[service-maps]]
+=== Service maps
+
+beta::[]
+
+A service map is a real-time diagram of the interactions occurring in your application’s architecture.
+It allows you to easily visualize data flow and high-level statistics, like average transaction duration,
+requests per minute, errors per minute, and metrics, allowing you to quickly assess the status of your services.
+
+Our beta offering creates two types of service maps:
+
+* Global: All services and connections are shown.
+* Service-specific: Selecting a specific service will highlight it's connections.
+
+[role="screenshot"]
+image::apm/images/service-maps.png[Example view of service maps in the APM app in Kibana]
+
+[float]
+[[visualize-your-architecture]]
+=== Visualize your architecture
+
+Select the **Service Map** tab to get started.
+By default, all services and connections are shown.
+Whether your onboarding a new engineer, or just trying to grasp the big picture,
+click around, zoom in and out, and begin to visualize how your services are connected.
+
+If there's a specific service that interests you, select that service to highlight its connections.
+Clicking **Focus map** will refocus the map on that specific service and lock the connection highlighting.
+From here, select **Service Details**, or click on the **Transaction** tab to jump to the Transaction overview.
+You can also use the tabs at the top of the page to easily jump to the **Errors** or **Metrics** overview.
+
+While it's not possible to query in service maps, it is possible to filter by environment.
+This can be useful if you have two or more services, in separate environments, but with the same name.
+Use the environment drop down to only see the data you're interested in, like `dev` or `production`.
+
+[role="screenshot"]
+image::apm/images/service-maps-java.png[Example view of service maps with Java highlighted in the APM app in Kibana]
+
+[float]
+[[service-maps-legend]]
+=== Legend
+
+Nodes appear on the map in one of two shapes:
+
+* **Circle**: Instrumented services. Interior icons are based on the language of the agent used.
+* **Diamond**: Databases, external, and messaging. Interior icons represent the generic type,
+with specific icons for known entities, like Elasticsearch.
+Type and subtype are based on `span.type`, and `span.subtype`.
diff --git a/docs/apm/transactions.asciidoc b/docs/apm/transactions.asciidoc
index 536ab2ec29c80..5c92afa55109d 100644
--- a/docs/apm/transactions.asciidoc
+++ b/docs/apm/transactions.asciidoc
@@ -103,9 +103,7 @@ The number of requests per bucket is displayed when hovering over the graph, and
[role="screenshot"]
image::apm/images/apm-transaction-duration-dist.png[Example view of transactions duration distribution graph]
-Most of the requests fall into buckets on the left side of the graph,
-with a long tail of smaller buckets to the right.
-This is a typical distribution, and indicates most of our requests were served quickly - awesome!
+This graph shows a typical distribution, and indicates most of our requests were served quickly - awesome!
It's the requests on the right, the ones taking longer than average, that we probably want to focus on.
When you select one of these buckets,
you're presented with up to ten trace samples.
diff --git a/docs/apm/using-the-apm-ui.asciidoc b/docs/apm/using-the-apm-ui.asciidoc
index 1361dc046e3b1..b1b7ed7307986 100644
--- a/docs/apm/using-the-apm-ui.asciidoc
+++ b/docs/apm/using-the-apm-ui.asciidoc
@@ -31,6 +31,8 @@ include::transactions.asciidoc[]
include::spans.asciidoc[]
+include::service-maps.asciidoc[]
+
include::errors.asciidoc[]
include::metrics.asciidoc[]
diff --git a/docs/canvas/canvas-elements.asciidoc b/docs/canvas/canvas-elements.asciidoc
index 163579d5763b2..a25460a20eb50 100644
--- a/docs/canvas/canvas-elements.asciidoc
+++ b/docs/canvas/canvas-elements.asciidoc
@@ -138,7 +138,9 @@ To apply CSS overrides:
. Next to *Element style*, click *+*, then select *CSS*.
-. Enter the *CSS*. For example, to center the Markdown element, enter:
+. Enter the *CSS*.
++
+For example, to center the Markdown element, enter:
+
[source,text]
--------------------------------------------------
diff --git a/docs/canvas/canvas-present-workpad.asciidoc b/docs/canvas/canvas-present-workpad.asciidoc
index 486686cd857b5..9cd4ecc9519e1 100644
--- a/docs/canvas/canvas-present-workpad.asciidoc
+++ b/docs/canvas/canvas-present-workpad.asciidoc
@@ -8,7 +8,7 @@ When you are ready to present your workpad, use and enable the presentation opti
[[view-fullscreen-mode]]
==== View your workpad in fullscreen mode
-In the upper left corner, click the *Enter fullscreen mode* icon.
+Click the *Enter fullscreen mode* icon.
[role="screenshot"]
image::images/canvas-fullscreen.png[Fullscreen mode]
@@ -19,7 +19,7 @@ image::images/canvas-fullscreen.png[Fullscreen mode]
Automatically cycle through your workpads pages in fullscreen mode.
-. In the upper left corner, click the *Control settings* icon.
+. Click the *Control settings* icon.
. Under *Change cycling interval*, select the interval you want to use.
+
diff --git a/docs/canvas/canvas-share-workpad.asciidoc b/docs/canvas/canvas-share-workpad.asciidoc
index dbba12865b8ca..ee29926914ad6 100644
--- a/docs/canvas/canvas-share-workpad.asciidoc
+++ b/docs/canvas/canvas-share-workpad.asciidoc
@@ -10,7 +10,7 @@ When you've finished your workpad, you can share it outside of {kib}.
Create a JSON file of your workpad that you can export outside of {kib}.
-. From your workpad, click the *Share workpad* icon in the upper left corner.
+. From your workpad, click the *Share workpad* icon.
. Select *Download as JSON*.
+
@@ -27,7 +27,7 @@ If you have a license that supports the {report-features}, you can create a PDF
For more information, refer to <>.
-. From your workpad, click the *Share workpad* icon in the upper left corner, then select *PDF reports*.
+. From your workpad, click the *Share workpad* icon, then select *PDF reports*.
. Click *Generate PDF*.
+
@@ -42,7 +42,7 @@ If you have a license that supports the {report-features}, you can create a POST
For more information, refer to <>.
-. From your workpad, click the *Share workpad* icon in the upper left corner, then select *PDF reports*.
+. From your workpad, click the *Share workpad* icon, then select *PDF reports*.
. Click *Copy POST URL*.
+
@@ -55,7 +55,7 @@ image::images/canvas-create-URL.gif[Create POST URL]
beta[] Canvas allows you to create _shareables_, which are workpads that you download and securely share on any website. To customize the behavior of the workpad on your website, you can choose to autoplay the pages or hide the workpad toolbar.
-. From your workpad, click the *Share this workpad* icon in the upper left corner, then select *Share on a website*.
+. From your workpad, click the *Share this workpad* icon, then select *Share on a website*.
. On the *Share on a website* pane, follow the instructions.
diff --git a/docs/dev-tools/searchprofiler/getting-started.asciidoc b/docs/dev-tools/searchprofiler/getting-started.asciidoc
index 2360e4c28ff15..4a87d4b84b783 100644
--- a/docs/dev-tools/searchprofiler/getting-started.asciidoc
+++ b/docs/dev-tools/searchprofiler/getting-started.asciidoc
@@ -3,10 +3,10 @@
=== Getting Started
The {searchprofiler} is automatically enabled in {kib}. Go to *Dev Tools > Search Profiler*
-to get started.
+to get started.
{searchprofiler} displays the names of the indices searched, the shards in each index,
-and how long it took for the query to complete. To try it out, replace the default `match_all` query
+and how long it took for the query to complete. To try it out, replace the default `match_all` query
with the query you want to profile and click *Profile*.
The following example shows the results of profiling the `match_all` query.
@@ -29,8 +29,8 @@ While the Cumulative Time metric is useful for comparing the performance of your
indices and shards, it doesn't necessarily represent the actual physical query times.
====
-You can select the name of the shard and then click *View details* to see more profiling information,
-including details about the query component(s) that ran on the shard, as well as the timing
+You can select the name of the shard and then click *View details* to see more profiling information,
+including details about the query component(s) that ran on the shard, as well as the timing
breakdown of low-level Lucene methods. For more information, see {ref}/search-profile.html#profiling-queries[Profiling queries].
[float]
@@ -40,10 +40,10 @@ By default, all queries executed by the {searchprofiler} are sent
to `GET /_search`. It searches across your entire cluster (all indices, all types).
If you need to query a specific index or type (or several), you can use the Index
-and Type filters at the top left.
+and Type filters.
In the following example, the query is executed against the indices `test` and `kibana_1`
and the type `my_type`. This is equivalent making a request to `GET /test,kibana_1/my_type/_search`.
[role="screenshot"]
-image::dev-tools/searchprofiler/images/filter.png["Filtering by index and type"]
\ No newline at end of file
+image::dev-tools/searchprofiler/images/filter.png["Filtering by index and type"]
diff --git a/docs/developer/plugin/development-plugin-feature-registration.asciidoc b/docs/developer/plugin/development-plugin-feature-registration.asciidoc
index ca61e5309ce85..4702204196bf2 100644
--- a/docs/developer/plugin/development-plugin-feature-registration.asciidoc
+++ b/docs/developer/plugin/development-plugin-feature-registration.asciidoc
@@ -45,10 +45,15 @@ Registering a feature consists of the following fields. For more information, co
|An array of applications this feature enables. Typically, all of your plugin's apps (from `uiExports`) will be included here.
|`privileges` (required)
-|{repo}blob/{branch}/x-pack/plugins/features/server/feature.ts[`FeatureWithAllOrReadPrivileges`].
+|{repo}blob/{branch}/x-pack/plugins/features/common/feature.ts[`FeatureConfig`].
|See <> and <>
|The set of privileges this feature requires to function.
+|`subFeatures` (optional)
+|{repo}blob/{branch}/x-pack/plugins/features/common/feature.ts[`FeatureConfig`].
+|See <>
+|The set of subfeatures that enables finer access control than the `all` and `read` feature privileges. These options are only available in the Gold subscription level and higher.
+
|`icon`
|`string`
|"discoverApp"
@@ -192,3 +197,78 @@ server.route({
}
});
-----------
+
+[[example-3-discover]]
+==== Example 3: Discover
+
+Discover takes advantage of subfeature privileges to allow fine-grained access control. In this example,
+a single "Create Short URLs" subfeature privilege is defined, which allows users to grant access to this feature without having to grant the `all` privilege to Discover. In other words, you can grant `read` access to Discover, and also grant the ability to create short URLs.
+
+["source","javascript"]
+-----------
+init(server) {
+ const xpackMainPlugin = server.plugins.xpack_main;
+ xpackMainPlugin.registerFeature({
+ {
+ id: 'discover',
+ name: i18n.translate('xpack.features.discoverFeatureName', {
+ defaultMessage: 'Discover',
+ }),
+ order: 100,
+ icon: 'discoverApp',
+ navLinkId: 'kibana:discover',
+ app: ['kibana'],
+ catalogue: ['discover'],
+ privileges: {
+ all: {
+ app: ['kibana'],
+ catalogue: ['discover'],
+ savedObject: {
+ all: ['search', 'query'],
+ read: ['index-pattern'],
+ },
+ ui: ['show', 'save', 'saveQuery'],
+ },
+ read: {
+ app: ['kibana'],
+ catalogue: ['discover'],
+ savedObject: {
+ all: [],
+ read: ['index-pattern', 'search', 'query'],
+ },
+ ui: ['show'],
+ },
+ },
+ subFeatures: [
+ {
+ name: i18n.translate('xpack.features.ossFeatures.discoverShortUrlSubFeatureName', {
+ defaultMessage: 'Short URLs',
+ }),
+ privilegeGroups: [
+ {
+ groupType: 'independent',
+ privileges: [
+ {
+ id: 'url_create',
+ name: i18n.translate(
+ 'xpack.features.ossFeatures.discoverCreateShortUrlPrivilegeName',
+ {
+ defaultMessage: 'Create Short URLs',
+ }
+ ),
+ includeIn: 'all',
+ savedObject: {
+ all: ['url'],
+ read: [],
+ },
+ ui: ['createShortUrl'],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ }
+ });
+}
+-----------
diff --git a/docs/development/core/server/kibana-plugin-core-server.coresetup.md b/docs/development/core/server/kibana-plugin-core-server.coresetup.md
index 29fdc37a81176..c10b460da8b4f 100644
--- a/docs/development/core/server/kibana-plugin-core-server.coresetup.md
+++ b/docs/development/core/server/kibana-plugin-core-server.coresetup.md
@@ -23,6 +23,7 @@ export interface CoreSetupHttpServiceSetup | [HttpServiceSetup](./kibana-plugin-core-server.httpservicesetup.md) |
| [metrics](./kibana-plugin-core-server.coresetup.metrics.md) | MetricsServiceSetup
| [MetricsServiceSetup](./kibana-plugin-core-server.metricsservicesetup.md) |
| [savedObjects](./kibana-plugin-core-server.coresetup.savedobjects.md) | SavedObjectsServiceSetup
| [SavedObjectsServiceSetup](./kibana-plugin-core-server.savedobjectsservicesetup.md) |
+| [status](./kibana-plugin-core-server.coresetup.status.md) | StatusServiceSetup
| [StatusServiceSetup](./kibana-plugin-core-server.statusservicesetup.md) |
| [uiSettings](./kibana-plugin-core-server.coresetup.uisettings.md) | UiSettingsServiceSetup
| [UiSettingsServiceSetup](./kibana-plugin-core-server.uisettingsservicesetup.md) |
| [uuid](./kibana-plugin-core-server.coresetup.uuid.md) | UuidServiceSetup
| [UuidServiceSetup](./kibana-plugin-core-server.uuidservicesetup.md) |
diff --git a/docs/development/core/server/kibana-plugin-core-server.coresetup.status.md b/docs/development/core/server/kibana-plugin-core-server.coresetup.status.md
new file mode 100644
index 0000000000000..f5ea627a9f008
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.coresetup.status.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [CoreSetup](./kibana-plugin-core-server.coresetup.md) > [status](./kibana-plugin-core-server.coresetup.status.md)
+
+## CoreSetup.status property
+
+[StatusServiceSetup](./kibana-plugin-core-server.statusservicesetup.md)
+
+Signature:
+
+```typescript
+status: StatusServiceSetup;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.corestatus.elasticsearch.md b/docs/development/core/server/kibana-plugin-core-server.corestatus.elasticsearch.md
new file mode 100644
index 0000000000000..b41e7020c38e9
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.corestatus.elasticsearch.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [CoreStatus](./kibana-plugin-core-server.corestatus.md) > [elasticsearch](./kibana-plugin-core-server.corestatus.elasticsearch.md)
+
+## CoreStatus.elasticsearch property
+
+Signature:
+
+```typescript
+elasticsearch: ServiceStatus;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.corestatus.md b/docs/development/core/server/kibana-plugin-core-server.corestatus.md
new file mode 100644
index 0000000000000..3fde86a18c58b
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.corestatus.md
@@ -0,0 +1,21 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [CoreStatus](./kibana-plugin-core-server.corestatus.md)
+
+## CoreStatus interface
+
+Status of core services.
+
+Signature:
+
+```typescript
+export interface CoreStatus
+```
+
+## Properties
+
+| Property | Type | Description |
+| --- | --- | --- |
+| [elasticsearch](./kibana-plugin-core-server.corestatus.elasticsearch.md) | ServiceStatus
| |
+| [savedObjects](./kibana-plugin-core-server.corestatus.savedobjects.md) | ServiceStatus
| |
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.corestatus.savedobjects.md b/docs/development/core/server/kibana-plugin-core-server.corestatus.savedobjects.md
new file mode 100644
index 0000000000000..d554c6f70d720
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.corestatus.savedobjects.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [CoreStatus](./kibana-plugin-core-server.corestatus.md) > [savedObjects](./kibana-plugin-core-server.corestatus.savedobjects.md)
+
+## CoreStatus.savedObjects property
+
+Signature:
+
+```typescript
+savedObjects: ServiceStatus;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.elasticsearchstatusmeta.incompatiblenodes.md b/docs/development/core/server/kibana-plugin-core-server.elasticsearchstatusmeta.incompatiblenodes.md
new file mode 100644
index 0000000000000..f8a45fe9a5a9c
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.elasticsearchstatusmeta.incompatiblenodes.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ElasticsearchStatusMeta](./kibana-plugin-core-server.elasticsearchstatusmeta.md) > [incompatibleNodes](./kibana-plugin-core-server.elasticsearchstatusmeta.incompatiblenodes.md)
+
+## ElasticsearchStatusMeta.incompatibleNodes property
+
+Signature:
+
+```typescript
+incompatibleNodes: NodesVersionCompatibility['incompatibleNodes'];
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.elasticsearchstatusmeta.md b/docs/development/core/server/kibana-plugin-core-server.elasticsearchstatusmeta.md
new file mode 100644
index 0000000000000..2398410fa4b84
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.elasticsearchstatusmeta.md
@@ -0,0 +1,20 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ElasticsearchStatusMeta](./kibana-plugin-core-server.elasticsearchstatusmeta.md)
+
+## ElasticsearchStatusMeta interface
+
+
+Signature:
+
+```typescript
+export interface ElasticsearchStatusMeta
+```
+
+## Properties
+
+| Property | Type | Description |
+| --- | --- | --- |
+| [incompatibleNodes](./kibana-plugin-core-server.elasticsearchstatusmeta.incompatiblenodes.md) | NodesVersionCompatibility['incompatibleNodes']
| |
+| [warningNodes](./kibana-plugin-core-server.elasticsearchstatusmeta.warningnodes.md) | NodesVersionCompatibility['warningNodes']
| |
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.elasticsearchstatusmeta.warningnodes.md b/docs/development/core/server/kibana-plugin-core-server.elasticsearchstatusmeta.warningnodes.md
new file mode 100644
index 0000000000000..7374ccd9e7fa8
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.elasticsearchstatusmeta.warningnodes.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ElasticsearchStatusMeta](./kibana-plugin-core-server.elasticsearchstatusmeta.md) > [warningNodes](./kibana-plugin-core-server.elasticsearchstatusmeta.warningnodes.md)
+
+## ElasticsearchStatusMeta.warningNodes property
+
+Signature:
+
+```typescript
+warningNodes: NodesVersionCompatibility['warningNodes'];
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.md b/docs/development/core/server/kibana-plugin-core-server.md
index 793684c1b3796..accab9bf0cb36 100644
--- a/docs/development/core/server/kibana-plugin-core-server.md
+++ b/docs/development/core/server/kibana-plugin-core-server.md
@@ -66,6 +66,7 @@ The plugin integrates with the core system via lifecycle events: `setup`
| [ContextSetup](./kibana-plugin-core-server.contextsetup.md) | An object that handles registration of context providers and configuring handlers with context. |
| [CoreSetup](./kibana-plugin-core-server.coresetup.md) | Context passed to the plugins setup
method. |
| [CoreStart](./kibana-plugin-core-server.corestart.md) | Context passed to the plugins start
method. |
+| [CoreStatus](./kibana-plugin-core-server.corestatus.md) | Status of core services. |
| [CustomHttpResponseOptions](./kibana-plugin-core-server.customhttpresponseoptions.md) | HTTP response parameters for a response with adjustable status code. |
| [DeprecationAPIClientParams](./kibana-plugin-core-server.deprecationapiclientparams.md) | |
| [DeprecationAPIResponse](./kibana-plugin-core-server.deprecationapiresponse.md) | |
@@ -75,6 +76,7 @@ The plugin integrates with the core system via lifecycle events: `setup`
| [ElasticsearchError](./kibana-plugin-core-server.elasticsearcherror.md) | |
| [ElasticsearchServiceSetup](./kibana-plugin-core-server.elasticsearchservicesetup.md) | |
| [ElasticsearchServiceStart](./kibana-plugin-core-server.elasticsearchservicestart.md) | |
+| [ElasticsearchStatusMeta](./kibana-plugin-core-server.elasticsearchstatusmeta.md) | |
| [EnvironmentMode](./kibana-plugin-core-server.environmentmode.md) | |
| [ErrorHttpResponseOptions](./kibana-plugin-core-server.errorhttpresponseoptions.md) | HTTP response parameters |
| [FakeRequest](./kibana-plugin-core-server.fakerequest.md) | Fake request object created manually by Kibana plugins. |
@@ -101,6 +103,7 @@ The plugin integrates with the core system via lifecycle events: `setup`
| [LoggerFactory](./kibana-plugin-core-server.loggerfactory.md) | The single purpose of LoggerFactory
interface is to define a way to retrieve a context-based logger instance. |
| [LogMeta](./kibana-plugin-core-server.logmeta.md) | Contextual metadata |
| [MetricsServiceSetup](./kibana-plugin-core-server.metricsservicesetup.md) | APIs to retrieves metrics gathered and exposed by the core platform. |
+| [NodesVersionCompatibility](./kibana-plugin-core-server.nodesversioncompatibility.md) | |
| [OnPostAuthToolkit](./kibana-plugin-core-server.onpostauthtoolkit.md) | A tool set defining an outcome of OnPostAuth interceptor for incoming request. |
| [OnPreAuthToolkit](./kibana-plugin-core-server.onpreauthtoolkit.md) | A tool set defining an outcome of OnPreAuth interceptor for incoming request. |
| [OnPreResponseExtensions](./kibana-plugin-core-server.onpreresponseextensions.md) | Additional data to extend a response. |
@@ -162,15 +165,18 @@ The plugin integrates with the core system via lifecycle events: `setup`
| [SavedObjectsResolveImportErrorsOptions](./kibana-plugin-core-server.savedobjectsresolveimporterrorsoptions.md) | Options to control the "resolve import" operation. |
| [SavedObjectsServiceSetup](./kibana-plugin-core-server.savedobjectsservicesetup.md) | Saved Objects is Kibana's data persistence mechanism allowing plugins to use Elasticsearch for storing and querying state. The SavedObjectsServiceSetup API exposes methods for registering Saved Object types, creating and registering Saved Object client wrappers and factories. |
| [SavedObjectsServiceStart](./kibana-plugin-core-server.savedobjectsservicestart.md) | Saved Objects is Kibana's data persisentence mechanism allowing plugins to use Elasticsearch for storing and querying state. The SavedObjectsServiceStart API provides a scoped Saved Objects client for interacting with Saved Objects. |
+| [SavedObjectStatusMeta](./kibana-plugin-core-server.savedobjectstatusmeta.md) | Meta information about the SavedObjectService's status. Available to plugins via [CoreSetup.status](./kibana-plugin-core-server.coresetup.status.md). |
| [SavedObjectsType](./kibana-plugin-core-server.savedobjectstype.md) | |
| [SavedObjectsTypeManagementDefinition](./kibana-plugin-core-server.savedobjectstypemanagementdefinition.md) | Configuration options for the [type](./kibana-plugin-core-server.savedobjectstype.md)'s management section. |
| [SavedObjectsTypeMappingDefinition](./kibana-plugin-core-server.savedobjectstypemappingdefinition.md) | Describe a saved object type mapping. |
| [SavedObjectsUpdateOptions](./kibana-plugin-core-server.savedobjectsupdateoptions.md) | |
| [SavedObjectsUpdateResponse](./kibana-plugin-core-server.savedobjectsupdateresponse.md) | |
+| [ServiceStatus](./kibana-plugin-core-server.servicestatus.md) | The current status of a service at a point in time. |
| [SessionCookieValidationResult](./kibana-plugin-core-server.sessioncookievalidationresult.md) | Return type from a function to validate cookie contents. |
| [SessionStorage](./kibana-plugin-core-server.sessionstorage.md) | Provides an interface to store and retrieve data across requests. |
| [SessionStorageCookieOptions](./kibana-plugin-core-server.sessionstoragecookieoptions.md) | Configuration used to create HTTP session storage based on top of cookie mechanism. |
| [SessionStorageFactory](./kibana-plugin-core-server.sessionstoragefactory.md) | SessionStorage factory to bind one to an incoming request |
+| [StatusServiceSetup](./kibana-plugin-core-server.statusservicesetup.md) | API for accessing status of Core and this plugin's dependencies as well as for customizing this plugin's status. |
| [StringValidationRegex](./kibana-plugin-core-server.stringvalidationregex.md) | StringValidation with regex object |
| [StringValidationRegexString](./kibana-plugin-core-server.stringvalidationregexstring.md) | StringValidation as regex string |
| [UiSettingsParams](./kibana-plugin-core-server.uisettingsparams.md) | UiSettings parameters defined by the plugins. |
@@ -184,6 +190,7 @@ The plugin integrates with the core system via lifecycle events: `setup`
| Variable | Description |
| --- | --- |
| [kibanaResponseFactory](./kibana-plugin-core-server.kibanaresponsefactory.md) | Set of helpers used to create KibanaResponse
to form HTTP response on an incoming request. Should be returned as a result of [RequestHandler](./kibana-plugin-core-server.requesthandler.md) execution. |
+| [ServiceStatusLevels](./kibana-plugin-core-server.servicestatuslevels.md) | The current "level" of availability of a service. |
| [validBodyOutput](./kibana-plugin-core-server.validbodyoutput.md) | The set of valid body.output |
## Type Aliases
@@ -256,6 +263,7 @@ The plugin integrates with the core system via lifecycle events: `setup`
| [SavedObjectsClientWrapperFactory](./kibana-plugin-core-server.savedobjectsclientwrapperfactory.md) | Describes the factory used to create instances of Saved Objects Client Wrappers. |
| [SavedObjectsFieldMapping](./kibana-plugin-core-server.savedobjectsfieldmapping.md) | Describe a [saved object type mapping](./kibana-plugin-core-server.savedobjectstypemappingdefinition.md) field.Please refer to [elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html) For the mapping documentation |
| [ScopeableRequest](./kibana-plugin-core-server.scopeablerequest.md) | A user credentials container. It accommodates the necessary auth credentials to impersonate the current user.See [KibanaRequest](./kibana-plugin-core-server.kibanarequest.md). |
+| [ServiceStatusLevel](./kibana-plugin-core-server.servicestatuslevel.md) | A convenience type that represents the union of each value in [ServiceStatusLevels](./kibana-plugin-core-server.servicestatuslevels.md). |
| [SharedGlobalConfig](./kibana-plugin-core-server.sharedglobalconfig.md) | |
| [StartServicesAccessor](./kibana-plugin-core-server.startservicesaccessor.md) | Allows plugins to get access to APIs available in start inside async handlers. Promise will not resolve until Core and plugin dependencies have completed start
. This should only be used inside handlers registered during setup
that will only be executed after start
lifecycle. |
| [StringValidation](./kibana-plugin-core-server.stringvalidation.md) | Allows regex objects or a regex string |
diff --git a/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.incompatiblenodes.md b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.incompatiblenodes.md
new file mode 100644
index 0000000000000..8e7298d28801c
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.incompatiblenodes.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [NodesVersionCompatibility](./kibana-plugin-core-server.nodesversioncompatibility.md) > [incompatibleNodes](./kibana-plugin-core-server.nodesversioncompatibility.incompatiblenodes.md)
+
+## NodesVersionCompatibility.incompatibleNodes property
+
+Signature:
+
+```typescript
+incompatibleNodes: NodeInfo[];
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.iscompatible.md b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.iscompatible.md
new file mode 100644
index 0000000000000..82a4800a3b4b6
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.iscompatible.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [NodesVersionCompatibility](./kibana-plugin-core-server.nodesversioncompatibility.md) > [isCompatible](./kibana-plugin-core-server.nodesversioncompatibility.iscompatible.md)
+
+## NodesVersionCompatibility.isCompatible property
+
+Signature:
+
+```typescript
+isCompatible: boolean;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.kibanaversion.md b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.kibanaversion.md
new file mode 100644
index 0000000000000..347f2d3474b11
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.kibanaversion.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [NodesVersionCompatibility](./kibana-plugin-core-server.nodesversioncompatibility.md) > [kibanaVersion](./kibana-plugin-core-server.nodesversioncompatibility.kibanaversion.md)
+
+## NodesVersionCompatibility.kibanaVersion property
+
+Signature:
+
+```typescript
+kibanaVersion: string;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.md b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.md
new file mode 100644
index 0000000000000..6fcfacc3bc908
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.md
@@ -0,0 +1,22 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [NodesVersionCompatibility](./kibana-plugin-core-server.nodesversioncompatibility.md)
+
+## NodesVersionCompatibility interface
+
+Signature:
+
+```typescript
+export interface NodesVersionCompatibility
+```
+
+## Properties
+
+| Property | Type | Description |
+| --- | --- | --- |
+| [incompatibleNodes](./kibana-plugin-core-server.nodesversioncompatibility.incompatiblenodes.md) | NodeInfo[]
| |
+| [isCompatible](./kibana-plugin-core-server.nodesversioncompatibility.iscompatible.md) | boolean
| |
+| [kibanaVersion](./kibana-plugin-core-server.nodesversioncompatibility.kibanaversion.md) | string
| |
+| [message](./kibana-plugin-core-server.nodesversioncompatibility.message.md) | string
| |
+| [warningNodes](./kibana-plugin-core-server.nodesversioncompatibility.warningnodes.md) | NodeInfo[]
| |
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.message.md b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.message.md
new file mode 100644
index 0000000000000..415a7825ee2bf
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.message.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [NodesVersionCompatibility](./kibana-plugin-core-server.nodesversioncompatibility.md) > [message](./kibana-plugin-core-server.nodesversioncompatibility.message.md)
+
+## NodesVersionCompatibility.message property
+
+Signature:
+
+```typescript
+message?: string;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.warningnodes.md b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.warningnodes.md
new file mode 100644
index 0000000000000..6c017e9fc800c
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.nodesversioncompatibility.warningnodes.md
@@ -0,0 +1,11 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [NodesVersionCompatibility](./kibana-plugin-core-server.nodesversioncompatibility.md) > [warningNodes](./kibana-plugin-core-server.nodesversioncompatibility.warningnodes.md)
+
+## NodesVersionCompatibility.warningNodes property
+
+Signature:
+
+```typescript
+warningNodes: NodeInfo[];
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectstatusmeta.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectstatusmeta.md
new file mode 100644
index 0000000000000..3a0b23d18632f
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectstatusmeta.md
@@ -0,0 +1,20 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectStatusMeta](./kibana-plugin-core-server.savedobjectstatusmeta.md)
+
+## SavedObjectStatusMeta interface
+
+Meta information about the SavedObjectService's status. Available to plugins via [CoreSetup.status](./kibana-plugin-core-server.coresetup.status.md).
+
+Signature:
+
+```typescript
+export interface SavedObjectStatusMeta
+```
+
+## Properties
+
+| Property | Type | Description |
+| --- | --- | --- |
+| [migratedIndices](./kibana-plugin-core-server.savedobjectstatusmeta.migratedindices.md) | {
[status: string]: number;
skipped: number;
migrated: number;
}
| |
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectstatusmeta.migratedindices.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectstatusmeta.migratedindices.md
new file mode 100644
index 0000000000000..6a29623b2f122
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectstatusmeta.migratedindices.md
@@ -0,0 +1,15 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectStatusMeta](./kibana-plugin-core-server.savedobjectstatusmeta.md) > [migratedIndices](./kibana-plugin-core-server.savedobjectstatusmeta.migratedindices.md)
+
+## SavedObjectStatusMeta.migratedIndices property
+
+Signature:
+
+```typescript
+migratedIndices: {
+ [status: string]: number;
+ skipped: number;
+ migrated: number;
+ };
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.servicestatus.detail.md b/docs/development/core/server/kibana-plugin-core-server.servicestatus.detail.md
new file mode 100644
index 0000000000000..fa369aa0bdfbb
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.servicestatus.detail.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ServiceStatus](./kibana-plugin-core-server.servicestatus.md) > [detail](./kibana-plugin-core-server.servicestatus.detail.md)
+
+## ServiceStatus.detail property
+
+A more detailed description of the service status.
+
+Signature:
+
+```typescript
+detail?: string;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.servicestatus.documentationurl.md b/docs/development/core/server/kibana-plugin-core-server.servicestatus.documentationurl.md
new file mode 100644
index 0000000000000..5ef8c1251a602
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.servicestatus.documentationurl.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ServiceStatus](./kibana-plugin-core-server.servicestatus.md) > [documentationUrl](./kibana-plugin-core-server.servicestatus.documentationurl.md)
+
+## ServiceStatus.documentationUrl property
+
+A URL to open in a new tab about how to resolve or troubleshoot the problem.
+
+Signature:
+
+```typescript
+documentationUrl?: string;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.servicestatus.level.md b/docs/development/core/server/kibana-plugin-core-server.servicestatus.level.md
new file mode 100644
index 0000000000000..551c10c9bff82
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.servicestatus.level.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ServiceStatus](./kibana-plugin-core-server.servicestatus.md) > [level](./kibana-plugin-core-server.servicestatus.level.md)
+
+## ServiceStatus.level property
+
+The current availability level of the service.
+
+Signature:
+
+```typescript
+level: ServiceStatusLevel;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.servicestatus.md b/docs/development/core/server/kibana-plugin-core-server.servicestatus.md
new file mode 100644
index 0000000000000..d35fc951c57ff
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.servicestatus.md
@@ -0,0 +1,24 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ServiceStatus](./kibana-plugin-core-server.servicestatus.md)
+
+## ServiceStatus interface
+
+The current status of a service at a point in time.
+
+Signature:
+
+```typescript
+export interface ServiceStatus | unknown = unknown>
+```
+
+## Properties
+
+| Property | Type | Description |
+| --- | --- | --- |
+| [detail](./kibana-plugin-core-server.servicestatus.detail.md) | string
| A more detailed description of the service status. |
+| [documentationUrl](./kibana-plugin-core-server.servicestatus.documentationurl.md) | string
| A URL to open in a new tab about how to resolve or troubleshoot the problem. |
+| [level](./kibana-plugin-core-server.servicestatus.level.md) | ServiceStatusLevel
| The current availability level of the service. |
+| [meta](./kibana-plugin-core-server.servicestatus.meta.md) | Meta
| Any JSON-serializable data to be included in the HTTP API response. Useful for providing more fine-grained, machine-readable information about the service status. May include status information for underlying features. |
+| [summary](./kibana-plugin-core-server.servicestatus.summary.md) | string
| A high-level summary of the service status. |
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.servicestatus.meta.md b/docs/development/core/server/kibana-plugin-core-server.servicestatus.meta.md
new file mode 100644
index 0000000000000..a48994daa5a4e
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.servicestatus.meta.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ServiceStatus](./kibana-plugin-core-server.servicestatus.md) > [meta](./kibana-plugin-core-server.servicestatus.meta.md)
+
+## ServiceStatus.meta property
+
+Any JSON-serializable data to be included in the HTTP API response. Useful for providing more fine-grained, machine-readable information about the service status. May include status information for underlying features.
+
+Signature:
+
+```typescript
+meta?: Meta;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.servicestatus.summary.md b/docs/development/core/server/kibana-plugin-core-server.servicestatus.summary.md
new file mode 100644
index 0000000000000..db90afd6f74a6
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.servicestatus.summary.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ServiceStatus](./kibana-plugin-core-server.servicestatus.md) > [summary](./kibana-plugin-core-server.servicestatus.summary.md)
+
+## ServiceStatus.summary property
+
+A high-level summary of the service status.
+
+Signature:
+
+```typescript
+summary: string;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.servicestatuslevel.md b/docs/development/core/server/kibana-plugin-core-server.servicestatuslevel.md
new file mode 100644
index 0000000000000..5f995ff5e13e3
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.servicestatuslevel.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ServiceStatusLevel](./kibana-plugin-core-server.servicestatuslevel.md)
+
+## ServiceStatusLevel type
+
+A convenience type that represents the union of each value in [ServiceStatusLevels](./kibana-plugin-core-server.servicestatuslevels.md).
+
+Signature:
+
+```typescript
+export declare type ServiceStatusLevel = typeof ServiceStatusLevels[keyof typeof ServiceStatusLevels];
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.servicestatuslevels.md b/docs/development/core/server/kibana-plugin-core-server.servicestatuslevels.md
new file mode 100644
index 0000000000000..a66cec78c736b
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.servicestatuslevels.md
@@ -0,0 +1,37 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ServiceStatusLevels](./kibana-plugin-core-server.servicestatuslevels.md)
+
+## ServiceStatusLevels variable
+
+The current "level" of availability of a service.
+
+Signature:
+
+```typescript
+ServiceStatusLevels: Readonly<{
+ available: Readonly<{
+ toString: () => "available";
+ valueOf: () => 0;
+ }>;
+ degraded: Readonly<{
+ toString: () => "degraded";
+ valueOf: () => 1;
+ }>;
+ unavailable: Readonly<{
+ toString: () => "unavailable";
+ valueOf: () => 2;
+ }>;
+ critical: Readonly<{
+ toString: () => "critical";
+ valueOf: () => 3;
+ }>;
+}>
+```
+
+## Remarks
+
+The values implement `valueOf` to allow for easy comparisons between status levels with <, >, etc. Higher values represent higher severities. Note that the default `Array.prototype.sort` implementation does not correctly sort these values.
+
+A snapshot serializer is available in `src/core/server/test_utils` to ease testing of these values with Jest.
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.statusservicesetup.core_.md b/docs/development/core/server/kibana-plugin-core-server.statusservicesetup.core_.md
new file mode 100644
index 0000000000000..6662e68b44d36
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.statusservicesetup.core_.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [StatusServiceSetup](./kibana-plugin-core-server.statusservicesetup.md) > [core$](./kibana-plugin-core-server.statusservicesetup.core_.md)
+
+## StatusServiceSetup.core$ property
+
+Current status for all Core services.
+
+Signature:
+
+```typescript
+core$: Observable;
+```
diff --git a/docs/development/core/server/kibana-plugin-core-server.statusservicesetup.md b/docs/development/core/server/kibana-plugin-core-server.statusservicesetup.md
new file mode 100644
index 0000000000000..0551a217520ad
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.statusservicesetup.md
@@ -0,0 +1,20 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [StatusServiceSetup](./kibana-plugin-core-server.statusservicesetup.md)
+
+## StatusServiceSetup interface
+
+API for accessing status of Core and this plugin's dependencies as well as for customizing this plugin's status.
+
+Signature:
+
+```typescript
+export interface StatusServiceSetup
+```
+
+## Properties
+
+| Property | Type | Description |
+| --- | --- | --- |
+| [core$](./kibana-plugin-core-server.statusservicesetup.core_.md) | Observable<CoreStatus>
| Current status for all Core services. |
+
diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md
index afb6ea88f9fad..78ac05b9fd386 100644
--- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md
+++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md
@@ -19,7 +19,7 @@ search: {
intervalOptions: ({
display: string;
val: string;
- enabled(agg: import("./search/aggs/buckets/_bucket_agg_type").IBucketAggConfig): boolean | "" | undefined;
+ enabled(agg: import("./search/aggs/buckets/bucket_agg_type").IBucketAggConfig): boolean | "" | undefined;
} | {
display: string;
val: string;
diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md
index 259d725b3bf0d..e756eb9b72905 100644
--- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md
+++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md
@@ -23,7 +23,6 @@
| Function | Description |
| --- | --- |
| [getDefaultSearchParams(config)](./kibana-plugin-plugins-data-server.getdefaultsearchparams.md) | |
-| [getTotalLoaded({ total, failed, successful })](./kibana-plugin-plugins-data-server.gettotalloaded.md) | |
| [parseInterval(interval)](./kibana-plugin-plugins-data-server.parseinterval.md) | |
| [plugin(initializerContext)](./kibana-plugin-plugins-data-server.plugin.md) | Static code to be shared externally |
| [shouldReadFieldFromDocValues(aggregatable, esType)](./kibana-plugin-plugins-data-server.shouldreadfieldfromdocvalues.md) | |
diff --git a/docs/discover/document-data.asciidoc b/docs/discover/document-data.asciidoc
index 6e9218d66c115..477c2ec90e95c 100644
--- a/docs/discover/document-data.asciidoc
+++ b/docs/discover/document-data.asciidoc
@@ -26,7 +26,7 @@ and click image:images/sort-icon.png[].
The first click sorts by ascending order, the second click sorts by descending order, and the third
click removes the field from the sorted fields.
-Move a field column:: Hover over the column header and click the move left (<<) or move right icon (>>).
+Move a field column:: Hover over the column header and click the (<<) or (>>) icons.
Remove a field column :: Hover over the list of *Specified fields*
and then click *remove*.
Or, use the (x) control in the column header.
diff --git a/docs/getting-started/tutorial-visualizing.asciidoc b/docs/getting-started/tutorial-visualizing.asciidoc
index a16343aa4850a..acd4d6d908fd4 100644
--- a/docs/getting-started/tutorial-visualizing.asciidoc
+++ b/docs/getting-started/tutorial-visualizing.asciidoc
@@ -180,5 +180,5 @@ The map now looks like this:
image::images/tutorial-visualize-map-2.png[]
. Navigate the map by clicking and dragging. Use the controls
-on the left to zoom the map and set filters.
+to zoom the map and set filters.
. *Save* this map with the name `Map Example`.
diff --git a/docs/infrastructure/view-metrics.asciidoc b/docs/infrastructure/view-metrics.asciidoc
index bbb981acc3ad6..1bd64dde76ee1 100644
--- a/docs/infrastructure/view-metrics.asciidoc
+++ b/docs/infrastructure/view-metrics.asciidoc
@@ -30,11 +30,3 @@ For complete control over the start and end times, click the start time or end t
=== Refresh the metrics
You can click *Refresh* to manually refresh the metrics.
-
-[float]
-[[infra-view-go-to-chart]]
-=== Go to a specific chart
-
-The charts available for this component are shown in a list on the left of the page. Click a chart in the list to quickly go to that chart.
-
-
diff --git a/docs/management/managing-indices.asciidoc b/docs/management/managing-indices.asciidoc
index 933a2ffbf6ee2..946d9ee1b41c7 100644
--- a/docs/management/managing-indices.asciidoc
+++ b/docs/management/managing-indices.asciidoc
@@ -126,6 +126,23 @@ under the *Mapped fields* tab as follows:
[role="screenshot"]
image::images/management-index-templates-mappings.png[Mapped fields page]
+Alternatively, you can click the *Load JSON* link and define the mapping as JSON:
+
+[source,js]
+----------------------------------
+{
+ "properties": {
+ "geo": {
+ "properties": {
+ "coordinates": {
+ "type": "geo_point"
+ }
+ }
+ }
+ }
+}
+----------------------------------
+
You can create additional mapping configurations in the *Dynamic templates* and
*Advanced options* tabs. No additional mappings are required for this example.
diff --git a/docs/management/managing-licenses.asciidoc b/docs/management/managing-licenses.asciidoc
index 72accdb5fe2aa..a7ed4e942f3f6 100644
--- a/docs/management/managing-licenses.asciidoc
+++ b/docs/management/managing-licenses.asciidoc
@@ -15,8 +15,7 @@ already activated a trial for 6.0, you cannot start a new trial until
7.0. You can, however, contact `info@elastic.co` to request an extended trial
license.
-When you activate a new license level, new features appear in the left sidebar
-of the *Management* page.
+When you activate a new license level, new features appear in *Management*.
[role="screenshot"]
image::images/management-license.png[]
diff --git a/docs/maps/images/top_hits.png b/docs/maps/images/top_hits.png
index 45bbf575f10dd..a791e23b869ef 100644
Binary files a/docs/maps/images/top_hits.png and b/docs/maps/images/top_hits.png differ
diff --git a/docs/maps/maps-aggregations.asciidoc b/docs/maps/maps-aggregations.asciidoc
index 692e30a6665ed..2b65ae99a381b 100644
--- a/docs/maps/maps-aggregations.asciidoc
+++ b/docs/maps/maps-aggregations.asciidoc
@@ -20,6 +20,8 @@ You can add the following metric aggregations:
* *Sum.* The total value.
+* *Top term.* The most common value.
+
* *Unique count.* The number of distinct values.
Use aggregated layers with document layers to show aggregated views when the map shows larger
@@ -37,14 +39,24 @@ image::maps/images/grid_to_docs.gif[]
The *Grid aggregation* source uses {ref}/search-aggregations-bucket-geotilegrid-aggregation.html[GeoTile grid aggregation] to group your documents into grids. You can calculate metrics for each gridded cell.
-You can symbolize grid aggregation metrics as:
+Symbolize grid aggregation metrics as:
+
+*Clusters*:: Creates a <> with a cluster symbol for each gridded cell.
+The cluster location is the weighted centroid for all geo-points in the gridded cell.
*Grid rectangles*:: Creates a <> with a bounding box polygon for each gridded cell.
*Heat map*:: Creates a <> that clusters the weighted centroids for each gridded cell.
-*Clusters*:: Creates a <> with a cluster symbol for each gridded cell.
-The cluster location is the weighted centroid for all geo-points in the gridded cell.
+To enable grid aggregation:
+
+. Click *Add layer*, then select the *Grid aggregation* source.
+
+To enable a blended layer that dynamically shows clusters or documents:
+
+. Click *Add layer*, then select the *Documents* source.
+. Configure *Index pattern* and the *Geospatial field*. To enable clustering, the *Geospatial field* must be set to a field mapped as {ref}/geo-point.html[geo_point].
+. In *Scaling*, select *Show clusters when results exceed 10000*.
[role="xpack"]
@@ -55,10 +67,11 @@ You can display the most relevant documents per entity, for example, the most re
To get this data, {es} first groups your data using a {ref}/search-aggregations-bucket-terms-aggregation.html[terms aggregation],
then accumulates the most relevant documents based on sort order for each entry using a {ref}/search-aggregations-metrics-top-hits-aggregation.html[top hits metric aggregation].
-Top hits per entity is available for <> with *Documents* source.
To enable top hits:
-. In *Sorting*, select the *Show documents per entity* checkbox.
+. Click *Add layer* button and select *Documents* source.
+. Configure *Index pattern* and *Geospatial field*.
+. In *Scaling*, select *Show top hits per entity*.
. Set *Entity* to the field that identifies entities in your documents.
This field will be used in the terms aggregation to group your documents into entity buckets.
. Set *Documents per entity* to configure the maximum number of documents accumulated per entity.
diff --git a/docs/maps/vector-style.asciidoc b/docs/maps/vector-style.asciidoc
index 80e4c4ed5f844..7bc8a909d1ec6 100644
--- a/docs/maps/vector-style.asciidoc
+++ b/docs/maps/vector-style.asciidoc
@@ -53,7 +53,7 @@ The `bytes` property value for each feature will fit on a linear scale from the
To ensure symbols are consistent as you pan, zoom, and filter the map, quantitative data driven styling uses {ref}/search-aggregations-metrics-extendedstats-aggregation.html[extended_stats aggregation] to retrieve statistical metadata. Extended_stats is not available for numeric property values from the <> count, sum, and unique count.
-To configure extended_stats,click the gear icon image:maps/images/gear_icon.png[] to configure extended_stats. Set *Sigma* to a smaller value to minimize outliers by moving the range minimum and maximum closer to the average. Clear the *Calculate range from indices* checkbox to turn off the extended_stats aggregation request. The gear icon is not available for numeric property values from the <> count, sum, and unique count.
+To configure extended_stats, click the gear icon image:maps/images/gear_icon.png[]. Set *Sigma* to a smaller value to minimize outliers by moving the range minimum and maximum closer to the average. Clear the *Calculate range from indices* checkbox to turn off the extended_stats aggregation request. The gear icon is not available for numeric property values from the <> count, sum, and unique count.
NOTE: When extended_stats is not used, symbols might be inconsistent as users pan, zoom, and filter the map. Without extended_stats, the range is calculated with data from the local layer. The range is re-calculated when layer data changes.
@@ -76,16 +76,21 @@ When the symbol range minimum and maximum are the same and there is no range:
[[maps-vector-style-qualitative-data-driven]]
==== Qualitative data driven styling
-Qualitative data driven styling symbolizes non-numeric properties, such as strings and IP addresses, by category.
+Qualitative data driven styling symbolizes properties, such as strings and IP addresses, by category.
Qualitative data driven styling is available for the following styling properties:
+* *Icon*
* *Fill color*
* *Border color*
* *Label color*
* *Label border color*
-Qualitative data driven styling uses a {ref}/search-aggregations-bucket-terms-aggregation.html[terms aggregation] to retrieve the top nine categories for the property. Feature values within the top categories are assigned a unique color. Feature values outside of the top categories are grouped into the *Other* category. A feature is assigned the *Other* category when the property value is undefined.
+To ensure symbols are consistent as you pan, zoom, and filter the map, qualitative data driven styling uses a {ref}/search-aggregations-bucket-terms-aggregation.html[terms aggregation]. The term aggregation retrieves the top nine categories for the property. Feature values within the top categories are assigned a unique style. Feature values outside of the top categories are grouped into the *Other* category. A feature is assigned the *Other* category when the property value is undefined.
+
+To configure the terms aggregation, click the gear icon image:maps/images/gear_icon.png[]. Clear the *Get categories from indice* checkbox to turn off the terms aggregation request.
+
+NOTE: When the terms aggregation is not used, symbols might be inconsistent as users pan, zoom, and filter the map. Without terms aggregation, the top categories are calculated with data from the local layer. The top categories are re-calculated when layer data changes.
This image shows an example of quantitative data driven styling using the <> data set.
The `machine.os.keyword` property determines the color of each symbol based on category.
diff --git a/docs/spaces/index.asciidoc b/docs/spaces/index.asciidoc
index fb5ef670692dc..990af3a018b1f 100644
--- a/docs/spaces/index.asciidoc
+++ b/docs/spaces/index.asciidoc
@@ -9,10 +9,10 @@ the dashboards and saved objects that belong to that space.
{kib} creates a default space for you.
After you create your own
spaces, you're asked to choose a space when you log in to Kibana. You can change your
-current space at any time by using the menu in the upper left.
+current space at any time by using the menu.
[role="screenshot"]
-image::spaces/images/change-space.png["Change current space"]
+image::spaces/images/change-space.png["Change current space menu"]
Kibana supports spaces in several ways. You can:
diff --git a/docs/user/dashboard.asciidoc b/docs/user/dashboard.asciidoc
index 490edb9d26338..a17e46c5b3542 100644
--- a/docs/user/dashboard.asciidoc
+++ b/docs/user/dashboard.asciidoc
@@ -93,7 +93,7 @@ In *Edit* mode, you can move, resize, customize, and delete panels to suit your
* To resize a panel, click the resize control on the lower right and drag
to the new dimensions.
-* To toggle the use of margins and panel titles, use the *Options* menu in the upper left.
+* To toggle the use of margins and panel titles, use the *Options* menu.
* To delete a panel, open the panel menu and select *Delete from dashboard.* Deleting a panel from a
dashboard does *not* delete the saved visualization or search.
diff --git a/docs/user/discover.asciidoc b/docs/user/discover.asciidoc
index 7de7d73bf1664..4222ba40debb7 100644
--- a/docs/user/discover.asciidoc
+++ b/docs/user/discover.asciidoc
@@ -24,7 +24,7 @@ image::images/Discover-Start.png[Discover]
=== Set up your index pattern
The first thing to do in *Discover* is to select an <>, which
-defines the data you want to explore and visualize. The current index pattern is in the upper left.
+defines the data you want to explore and visualize.
If you haven't yet created an index pattern, you can add a <>,
which has a pre-built index pattern.
@@ -69,7 +69,7 @@ image::images/filter-field.png[height=317]
The sortable documents table
lists the documents that match your search.
By default, the table includes columns for the time field and the document `_source`.
-To zero in on a specific field, click *add* next to the field name in the left sidebar.
+To zero in on a specific field, click *add* next to the field name.
For example, if you add the `currency`, `customer_last_name`, and `day_of_week` fields,
the document table includes columns for those three fields.
diff --git a/docs/user/security/authorization/kibana-privileges.asciidoc b/docs/user/security/authorization/kibana-privileges.asciidoc
index 6a0b7cefab018..21fcb9bdccb87 100644
--- a/docs/user/security/authorization/kibana-privileges.asciidoc
+++ b/docs/user/security/authorization/kibana-privileges.asciidoc
@@ -43,6 +43,10 @@ Assigning a feature privilege grants access to a specific feature.
`all`:: Grants full read-write access.
`read`:: Grants read-only access.
+===== Sub-feature privileges
+Some features allow for finer access control than the `all` and `read` privileges.
+This additional level of control is available in the Gold subscription level and higher.
+
===== Assigning feature privileges
From the role management screen:
@@ -62,7 +66,8 @@ PUT /api/security/role/my_kibana_role
{
"base": [],
"feature": {
- "dashboard": ["all"]
+ "visualize": ["all"],
+ "dashboard": ["read", "url_create"]
},
"spaces": ["marketing"]
}
diff --git a/docs/user/security/images/assign_feature_privilege.png b/docs/user/security/images/assign_feature_privilege.png
index e7d000d4554ad..26fbbf20b39ad 100644
Binary files a/docs/user/security/images/assign_feature_privilege.png and b/docs/user/security/images/assign_feature_privilege.png differ
diff --git a/docs/visualize/lens.asciidoc b/docs/visualize/lens.asciidoc
index e3f61565453b5..35570ea7ca1dc 100644
--- a/docs/visualize/lens.asciidoc
+++ b/docs/visualize/lens.asciidoc
@@ -32,7 +32,7 @@ Lens supports the following aggregations:
[[drag-drop]]
=== Drag and drop
-The data panel in the left column shows the data fields for the selected time period. When
+The panel shows the data fields for the selected time period. When
you drag a field from the data panel, Lens highlights where you can drop that field. The first time you drag a data field,
you'll see two places highlighted in green:
@@ -57,7 +57,7 @@ Lens shows you fields based on the <> you have d
{kib}, and the current time range. When you change the index pattern or time filter,
the list of fields are updated.
-To narrow the list of fields you see in the left panel, you can:
+To narrow the list of fields, you can:
* Enter the field name in *Search field names*.
@@ -100,11 +100,7 @@ still allows you to make the change.
Lens allows some customizations of the data for each visualization.
-. Change the index pattern.
-
-.. In the left column, click the index pattern name.
-
-.. Select the new index pattern.
+. Click the index pattern name, then select the new index pattern.
+
If there is a match, Lens displays the new data. All fields that do not match the index pattern are removed.
@@ -147,7 +143,7 @@ Drag and drop your data onto the visualization builder pane.
. On the *New Visualization* window, click *Lens*.
-. In the left column, select the *kibana_sample_data_ecommerce* index.
+. Select the *kibana_sample_data_ecommerce* index.
. Click image:images/time-filter-calendar.png[], then click *Last 7 days*. The list of data fields are updated.
diff --git a/examples/embeddable_examples/public/list_container/embeddable_list_item.tsx b/examples/embeddable_examples/public/list_container/embeddable_list_item.tsx
deleted file mode 100644
index 2c80cef8a6364..0000000000000
--- a/examples/embeddable_examples/public/list_container/embeddable_list_item.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import React from 'react';
-import { EuiPanel, EuiLoadingSpinner, EuiFlexItem } from '@elastic/eui';
-import { IEmbeddable } from '../../../../src/plugins/embeddable/public';
-
-interface Props {
- embeddable: IEmbeddable;
-}
-
-export class EmbeddableListItem extends React.Component {
- private embeddableRoot: React.RefObject;
- private rendered = false;
-
- constructor(props: Props) {
- super(props);
- this.embeddableRoot = React.createRef();
- }
-
- public componentDidMount() {
- if (this.embeddableRoot.current && this.props.embeddable) {
- this.props.embeddable.render(this.embeddableRoot.current);
- this.rendered = true;
- }
- }
-
- public componentDidUpdate() {
- if (this.embeddableRoot.current && this.props.embeddable && !this.rendered) {
- this.props.embeddable.render(this.embeddableRoot.current);
- this.rendered = true;
- }
- }
-
- public render() {
- return (
-
-
- {this.props.embeddable ? (
-
- ) : (
-
- )}
-
-
- );
- }
-}
diff --git a/examples/embeddable_examples/public/list_container/list_container.tsx b/examples/embeddable_examples/public/list_container/list_container.tsx
index bbbd0d6e32304..9e7bec7a1c951 100644
--- a/examples/embeddable_examples/public/list_container/list_container.tsx
+++ b/examples/embeddable_examples/public/list_container/list_container.tsx
@@ -31,16 +31,14 @@ export class ListContainer extends Container<{}, ContainerInput> {
public readonly type = LIST_CONTAINER;
private node?: HTMLElement;
- constructor(
- input: ContainerInput,
- getEmbeddableFactory: EmbeddableStart['getEmbeddableFactory']
- ) {
- super(input, { embeddableLoaded: {} }, getEmbeddableFactory);
+ constructor(input: ContainerInput, private embeddableServices: EmbeddableStart) {
+ super(input, { embeddableLoaded: {} }, embeddableServices.getEmbeddableFactory);
}
- // This container has no input itself.
- getInheritedInput(id: string) {
- return {};
+ getInheritedInput() {
+ return {
+ viewMode: this.input.viewMode,
+ };
}
public render(node: HTMLElement) {
@@ -48,7 +46,10 @@ export class ListContainer extends Container<{}, ContainerInput> {
if (this.node) {
ReactDOM.unmountComponentAtNode(this.node);
}
- ReactDOM.render(, node);
+ ReactDOM.render(
+ ,
+ node
+ );
}
public destroy() {
diff --git a/examples/embeddable_examples/public/list_container/list_container_component.tsx b/examples/embeddable_examples/public/list_container/list_container_component.tsx
index f6e04933ee897..da27889a27603 100644
--- a/examples/embeddable_examples/public/list_container/list_container_component.tsx
+++ b/examples/embeddable_examples/public/list_container/list_container_component.tsx
@@ -24,30 +24,35 @@ import {
withEmbeddableSubscription,
ContainerInput,
ContainerOutput,
+ EmbeddableStart,
} from '../../../../src/plugins/embeddable/public';
-import { EmbeddableListItem } from './embeddable_list_item';
interface Props {
embeddable: IContainer;
input: ContainerInput;
output: ContainerOutput;
+ embeddableServices: EmbeddableStart;
}
-function renderList(embeddable: IContainer, panels: ContainerInput['panels']) {
+function renderList(
+ embeddable: IContainer,
+ panels: ContainerInput['panels'],
+ embeddableServices: EmbeddableStart
+) {
let number = 0;
const list = Object.values(panels).map(panel => {
const child = embeddable.getChild(panel.explicitInput.id);
number++;
return (
-
+
{number}
-
+
@@ -56,12 +61,12 @@ function renderList(embeddable: IContainer, panels: ContainerInput['panels']) {
return list;
}
-export function ListContainerComponentInner(props: Props) {
+export function ListContainerComponentInner({ embeddable, input, embeddableServices }: Props) {
return (
-
{props.embeddable.getTitle()}
+ {embeddable.getTitle()}
- {renderList(props.embeddable, props.input.panels)}
+ {renderList(embeddable, input.panels, embeddableServices)}
);
}
@@ -71,4 +76,9 @@ export function ListContainerComponentInner(props: Props) {
// anything on input or output state changes. If you don't want that to happen (for example
// if you expect something on input or output state to change frequently that your react
// component does not care about, then you should probably hook this up manually).
-export const ListContainerComponent = withEmbeddableSubscription(ListContainerComponentInner);
+export const ListContainerComponent = withEmbeddableSubscription<
+ ContainerInput,
+ ContainerOutput,
+ IContainer,
+ { embeddableServices: EmbeddableStart }
+>(ListContainerComponentInner);
diff --git a/examples/embeddable_examples/public/list_container/list_container_factory.ts b/examples/embeddable_examples/public/list_container/list_container_factory.ts
index 1fde254110c62..02a024b95349f 100644
--- a/examples/embeddable_examples/public/list_container/list_container_factory.ts
+++ b/examples/embeddable_examples/public/list_container/list_container_factory.ts
@@ -26,7 +26,7 @@ import {
import { LIST_CONTAINER, ListContainer } from './list_container';
interface StartServices {
- getEmbeddableFactory: EmbeddableStart['getEmbeddableFactory'];
+ embeddableServices: EmbeddableStart;
}
export class ListContainerFactory implements EmbeddableFactoryDefinition {
@@ -40,8 +40,8 @@ export class ListContainerFactory implements EmbeddableFactoryDefinition {
}
public create = async (initialInput: ContainerInput) => {
- const { getEmbeddableFactory } = await this.getStartServices();
- return new ListContainer(initialInput, getEmbeddableFactory);
+ const { embeddableServices } = await this.getStartServices();
+ return new ListContainer(initialInput, embeddableServices);
};
public getDisplayName() {
diff --git a/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_component.tsx b/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_component.tsx
index e33dfab0eaf4a..b2882c97ef501 100644
--- a/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_component.tsx
+++ b/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_component.tsx
@@ -54,7 +54,7 @@ function wrapSearchTerms(task: string, search?: string) {
);
}
-function renderTasks(tasks: MultiTaskTodoOutput['tasks'], search?: string) {
+function renderTasks(tasks: MultiTaskTodoInput['tasks'], search?: string) {
return tasks.map(task => (
+
{icon ? : }
-
+
{wrapSearchTerms(title, search)}
@@ -89,6 +88,8 @@ export function MultiTaskTodoEmbeddableComponentInner({
);
}
-export const MultiTaskTodoEmbeddableComponent = withEmbeddableSubscription(
- MultiTaskTodoEmbeddableComponentInner
-);
+export const MultiTaskTodoEmbeddableComponent = withEmbeddableSubscription<
+ MultiTaskTodoInput,
+ MultiTaskTodoOutput,
+ MultiTaskTodoEmbeddable
+>(MultiTaskTodoEmbeddableComponentInner);
diff --git a/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_embeddable.tsx b/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_embeddable.tsx
index a2197c9c06fe9..a9e58c5538107 100644
--- a/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_embeddable.tsx
+++ b/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_embeddable.tsx
@@ -36,30 +36,27 @@ export interface MultiTaskTodoInput extends EmbeddableInput {
title: string;
}
-// This embeddable has output! It's the tasks list that is filtered.
-// Output state is something only the embeddable itself can update. It
-// can be something completely internal, or it can be state that is
+// This embeddable has output! Output state is something only the embeddable itself
+// can update. It can be something completely internal, or it can be state that is
// derived from input state and updates when input does.
export interface MultiTaskTodoOutput extends EmbeddableOutput {
- tasks: string[];
+ hasMatch: boolean;
}
-function getFilteredTasks(tasks: string[], search?: string) {
- const filteredTasks: string[] = [];
- if (search === undefined) return tasks;
+function getHasMatch(tasks: string[], title?: string, search?: string) {
+ if (search === undefined || search === '') return false;
- tasks.forEach(task => {
- if (task.match(search)) {
- filteredTasks.push(task);
- }
- });
+ if (title && title.match(search)) return true;
+
+ const match = tasks.find(task => task.match(search));
+ if (match) return true;
- return filteredTasks;
+ return false;
}
function getOutput(input: MultiTaskTodoInput) {
- const tasks = getFilteredTasks(input.tasks, input.search);
- return { tasks, hasMatch: tasks.length > 0 || (input.search && input.title.match(input.search)) };
+ const hasMatch = getHasMatch(input.tasks, input.title, input.search);
+ return { hasMatch };
}
export class MultiTaskTodoEmbeddable extends Embeddable {
diff --git a/examples/embeddable_examples/public/plugin.ts b/examples/embeddable_examples/public/plugin.ts
index 5c202d96ceb1a..31a3037332dda 100644
--- a/examples/embeddable_examples/public/plugin.ts
+++ b/examples/embeddable_examples/public/plugin.ts
@@ -53,20 +53,17 @@ export class EmbeddableExamplesPlugin
new MultiTaskTodoEmbeddableFactory()
);
- // These are registered in the start method because `getEmbeddableFactory `
- // is only available in start. We could reconsider this I think and make it
- // available in both.
deps.embeddable.registerEmbeddableFactory(
SEARCHABLE_LIST_CONTAINER,
new SearchableListContainerFactory(async () => ({
- getEmbeddableFactory: (await core.getStartServices())[1].embeddable.getEmbeddableFactory,
+ embeddableServices: (await core.getStartServices())[1].embeddable,
}))
);
deps.embeddable.registerEmbeddableFactory(
LIST_CONTAINER,
new ListContainerFactory(async () => ({
- getEmbeddableFactory: (await core.getStartServices())[1].embeddable.getEmbeddableFactory,
+ embeddableServices: (await core.getStartServices())[1].embeddable,
}))
);
diff --git a/examples/embeddable_examples/public/searchable_list_container/searchable_list_container.tsx b/examples/embeddable_examples/public/searchable_list_container/searchable_list_container.tsx
index 06462937c768d..f6efb0b722c4c 100644
--- a/examples/embeddable_examples/public/searchable_list_container/searchable_list_container.tsx
+++ b/examples/embeddable_examples/public/searchable_list_container/searchable_list_container.tsx
@@ -40,11 +40,8 @@ export class SearchableListContainer extends Container, node);
+ ReactDOM.render(
+ ,
+ node
+ );
}
public destroy() {
diff --git a/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_component.tsx b/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_component.tsx
index b79f86e2a0192..49dbce74788bf 100644
--- a/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_component.tsx
+++ b/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_component.tsx
@@ -34,14 +34,15 @@ import {
withEmbeddableSubscription,
ContainerOutput,
EmbeddableOutput,
+ EmbeddableStart,
} from '../../../../src/plugins/embeddable/public';
-import { EmbeddableListItem } from '../list_container/embeddable_list_item';
import { SearchableListContainer, SearchableContainerInput } from './searchable_list_container';
interface Props {
embeddable: SearchableListContainer;
input: SearchableContainerInput;
output: ContainerOutput;
+ embeddableServices: EmbeddableStart;
}
interface State {
@@ -111,13 +112,27 @@ export class SearchableListContainerComponentInner extends Component {
+ const { input, embeddable } = this.props;
+ const checked: { [key: string]: boolean } = {};
+ Object.values(input.panels).map(panel => {
+ const child = embeddable.getChild(panel.explicitInput.id);
+ const output = child.getOutput();
+ if (hasHasMatchOutput(output) && output.hasMatch) {
+ checked[panel.explicitInput.id] = true;
+ }
+ });
+ this.setState({ checked });
+ };
+
private toggleCheck = (isChecked: boolean, id: string) => {
this.setState(prevState => ({ checked: { ...prevState.checked, [id]: isChecked } }));
};
public renderControls() {
+ const { input } = this.props;
return (
-
+
this.deleteChecked()}>
@@ -125,6 +140,17 @@ export class SearchableListContainerComponentInner extends Component
+
+
+ this.checkMatching()}
+ >
+ Check matching
+
+
+
- {embeddable.getTitle()}
-
- {this.renderControls()}
-
- {this.renderList()}
-
+
+
+ {embeddable.getTitle()}
+
+ {this.renderControls()}
+
+ {this.renderList()}
+
+
);
}
private renderList() {
+ const { embeddableServices, input, embeddable } = this.props;
let id = 0;
- const list = Object.values(this.props.input.panels).map(panel => {
- const embeddable = this.props.embeddable.getChild(panel.explicitInput.id);
- if (this.props.input.search && !this.state.hasMatch[panel.explicitInput.id]) return;
+ const list = Object.values(input.panels).map(panel => {
+ const childEmbeddable = embeddable.getChild(panel.explicitInput.id);
id++;
- return embeddable ? (
-
-
+ return childEmbeddable ? (
+
+
this.toggleCheck(e.target.checked, embeddable.id)}
+ data-test-subj={`todoCheckBox-${childEmbeddable.id}`}
+ disabled={!childEmbeddable}
+ id={childEmbeddable ? childEmbeddable.id : ''}
+ checked={this.state.checked[childEmbeddable.id]}
+ onChange={e => this.toggleCheck(e.target.checked, childEmbeddable.id)}
/>
-
+
@@ -183,6 +211,9 @@ export class SearchableListContainerComponentInner extends Component(SearchableListContainerComponentInner);
diff --git a/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_factory.ts b/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_factory.ts
index 382bb65e769ef..34ea43c29462a 100644
--- a/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_factory.ts
+++ b/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_factory.ts
@@ -29,7 +29,7 @@ import {
} from './searchable_list_container';
interface StartServices {
- getEmbeddableFactory: EmbeddableStart['getEmbeddableFactory'];
+ embeddableServices: EmbeddableStart;
}
export class SearchableListContainerFactory implements EmbeddableFactoryDefinition {
@@ -43,8 +43,8 @@ export class SearchableListContainerFactory implements EmbeddableFactoryDefiniti
}
public create = async (initialInput: SearchableContainerInput) => {
- const { getEmbeddableFactory } = await this.getStartServices();
- return new SearchableListContainer(initialInput, getEmbeddableFactory);
+ const { embeddableServices } = await this.getStartServices();
+ return new SearchableListContainer(initialInput, embeddableServices);
};
public getDisplayName() {
diff --git a/examples/embeddable_examples/public/todo/todo_component.tsx b/examples/embeddable_examples/public/todo/todo_component.tsx
index fbebfc98627b5..a4593bea3cc5e 100644
--- a/examples/embeddable_examples/public/todo/todo_component.tsx
+++ b/examples/embeddable_examples/public/todo/todo_component.tsx
@@ -51,12 +51,12 @@ function wrapSearchTerms(task: string, search?: string) {
export function TodoEmbeddableComponentInner({ input: { icon, title, task, search } }: Props) {
return (
-
+
{icon ? : }
-
+
{wrapSearchTerms(title || '', search)}
@@ -71,4 +71,8 @@ export function TodoEmbeddableComponentInner({ input: { icon, title, task, searc
);
}
-export const TodoEmbeddableComponent = withEmbeddableSubscription(TodoEmbeddableComponentInner);
+export const TodoEmbeddableComponent = withEmbeddableSubscription<
+ TodoInput,
+ EmbeddableOutput,
+ TodoEmbeddable
+>(TodoEmbeddableComponentInner);
diff --git a/examples/embeddable_explorer/public/app.tsx b/examples/embeddable_explorer/public/app.tsx
index 9c8568454855d..e18012b4b3d80 100644
--- a/examples/embeddable_explorer/public/app.tsx
+++ b/examples/embeddable_explorer/public/app.tsx
@@ -117,18 +117,7 @@ const EmbeddableExplorerApp = ({
{
title: 'Dynamically adding children to a container',
id: 'embeddablePanelExamplae',
- component: (
-
- ),
+ component: ,
},
];
diff --git a/examples/embeddable_explorer/public/embeddable_panel_example.tsx b/examples/embeddable_explorer/public/embeddable_panel_example.tsx
index b26111bed7ff2..54cd7c5b5b2c0 100644
--- a/examples/embeddable_explorer/public/embeddable_panel_example.tsx
+++ b/examples/embeddable_explorer/public/embeddable_panel_example.tsx
@@ -29,43 +29,19 @@ import {
EuiText,
} from '@elastic/eui';
import { EuiSpacer } from '@elastic/eui';
-import { OverlayStart, CoreStart, SavedObjectsStart, IUiSettingsClient } from 'kibana/public';
-import {
- EmbeddablePanel,
- EmbeddableStart,
- IEmbeddable,
-} from '../../../src/plugins/embeddable/public';
+import { EmbeddableStart, IEmbeddable } from '../../../src/plugins/embeddable/public';
import {
HELLO_WORLD_EMBEDDABLE,
TODO_EMBEDDABLE,
MULTI_TASK_TODO_EMBEDDABLE,
SEARCHABLE_LIST_CONTAINER,
} from '../../embeddable_examples/public';
-import { UiActionsStart } from '../../../src/plugins/ui_actions/public';
-import { Start as InspectorStartContract } from '../../../src/plugins/inspector/public';
-import { getSavedObjectFinder } from '../../../src/plugins/saved_objects/public';
interface Props {
- getAllEmbeddableFactories: EmbeddableStart['getEmbeddableFactories'];
- getEmbeddableFactory: EmbeddableStart['getEmbeddableFactory'];
- uiActionsApi: UiActionsStart;
- overlays: OverlayStart;
- notifications: CoreStart['notifications'];
- inspector: InspectorStartContract;
- savedObject: SavedObjectsStart;
- uiSettingsClient: IUiSettingsClient;
+ embeddableServices: EmbeddableStart;
}
-export function EmbeddablePanelExample({
- inspector,
- notifications,
- overlays,
- getAllEmbeddableFactories,
- getEmbeddableFactory,
- uiActionsApi,
- savedObject,
- uiSettingsClient,
-}: Props) {
+export function EmbeddablePanelExample({ embeddableServices }: Props) {
const searchableInput = {
id: '1',
title: 'My searchable todo list',
@@ -105,7 +81,7 @@ export function EmbeddablePanelExample({
useEffect(() => {
ref.current = true;
if (!embeddable) {
- const factory = getEmbeddableFactory(SEARCHABLE_LIST_CONTAINER);
+ const factory = embeddableServices.getEmbeddableFactory(SEARCHABLE_LIST_CONTAINER);
const promise = factory?.create(searchableInput);
if (promise) {
promise.then(e => {
@@ -134,22 +110,13 @@ export function EmbeddablePanelExample({
You can render your embeddable inside the EmbeddablePanel component. This adds some
extra rendering and offers a context menu with pluggable actions. Using EmbeddablePanel
- to render your embeddable means you get access to the "e;Add panel flyout"e;.
- Now you can see how to add embeddables to your container, and how
- "e;getExplicitInput"e; is used to grab input not provided by the container.
+ to render your embeddable means you get access to the "Add panel flyout". Now
+ you can see how to add embeddables to your container, and how
+ "getExplicitInput" is used to grab input not provided by the container.
{embeddable ? (
-
+
) : (
Loading...
)}
diff --git a/examples/embeddable_explorer/public/list_container_example.tsx b/examples/embeddable_explorer/public/list_container_example.tsx
index 969fdb0ca46db..98ad50418d3fe 100644
--- a/examples/embeddable_explorer/public/list_container_example.tsx
+++ b/examples/embeddable_explorer/public/list_container_example.tsx
@@ -29,7 +29,11 @@ import {
EuiText,
} from '@elastic/eui';
import { EuiSpacer } from '@elastic/eui';
-import { EmbeddableFactoryRenderer, EmbeddableStart } from '../../../src/plugins/embeddable/public';
+import {
+ EmbeddableFactoryRenderer,
+ EmbeddableStart,
+ ViewMode,
+} from '../../../src/plugins/embeddable/public';
import {
HELLO_WORLD_EMBEDDABLE,
TODO_EMBEDDABLE,
@@ -46,6 +50,7 @@ export function ListContainerExample({ getEmbeddableFactory }: Props) {
const listInput = {
id: 'hello',
title: 'My todo list',
+ viewMode: ViewMode.VIEW,
panels: {
'1': {
type: HELLO_WORLD_EMBEDDABLE,
@@ -76,6 +81,7 @@ export function ListContainerExample({ getEmbeddableFactory }: Props) {
const searchableInput = {
id: '1',
title: 'My searchable todo list',
+ viewMode: ViewMode.VIEW,
panels: {
'1': {
type: HELLO_WORLD_EMBEDDABLE,
@@ -150,7 +156,7 @@ export function ListContainerExample({ getEmbeddableFactory }: Props) {
- Check out the "e;Dynamically adding children"e; section, to see how to add
+ Check out the "Dynamically adding children" section, to see how to add
children to this container, and see it rendered inside an `EmbeddablePanel` component.
diff --git a/package.json b/package.json
index 46e0b9adfea25..bd0fec3a5c116 100644
--- a/package.json
+++ b/package.json
@@ -104,7 +104,8 @@
"examples/*",
"test/plugin_functional/plugins/*",
"test/interpreter_functional/plugins/*",
- "x-pack/test/functional_with_es_ssl/fixtures/plugins/*"
+ "x-pack/test/functional_with_es_ssl/fixtures/plugins/*",
+ "x-pack/test/plugin_api_integration/plugins/*"
],
"nohoist": [
"**/@types/*",
@@ -125,7 +126,7 @@
"@elastic/filesaver": "1.1.2",
"@elastic/good": "8.1.1-kibana2",
"@elastic/numeral": "2.4.0",
- "@elastic/request-crypto": "^1.0.2",
+ "@elastic/request-crypto": "1.1.2",
"@elastic/ui-ace": "0.2.3",
"@hapi/good-squeeze": "5.2.1",
"@hapi/wreck": "^15.0.2",
@@ -375,7 +376,7 @@
"@types/recompose": "^0.30.6",
"@types/redux-actions": "^2.6.1",
"@types/request": "^2.48.2",
- "@types/selenium-webdriver": "^4.0.5",
+ "@types/selenium-webdriver": "4.0.9",
"@types/semver": "^5.5.0",
"@types/sinon": "^7.0.13",
"@types/strip-ansi": "^3.0.0",
@@ -461,6 +462,7 @@
"load-grunt-config": "^3.0.1",
"mocha": "^7.1.1",
"mock-http-server": "1.3.0",
+ "ms-chromium-edge-driver": "^0.2.0",
"multistream": "^2.1.1",
"murmurhash3js": "3.0.1",
"mutation-observer": "^1.0.3",
@@ -479,7 +481,7 @@
"react-textarea-autosize": "^7.1.2",
"regenerate": "^1.4.0",
"sass-lint": "^1.12.1",
- "selenium-webdriver": "^4.0.0-alpha.5",
+ "selenium-webdriver": "^4.0.0-alpha.7",
"simple-git": "1.116.0",
"simplebar-react": "^2.1.0",
"sinon": "^7.4.2",
diff --git a/packages/kbn-optimizer/package.json b/packages/kbn-optimizer/package.json
index b648004760d7c..b3e5a8c518682 100644
--- a/packages/kbn-optimizer/package.json
+++ b/packages/kbn-optimizer/package.json
@@ -32,6 +32,7 @@
"json-stable-stringify": "^1.0.1",
"loader-utils": "^1.2.3",
"node-sass": "^4.13.0",
+ "normalize-path": "^3.0.0",
"postcss-loader": "^3.0.0",
"raw-loader": "^3.1.0",
"resolve-url-loader": "^3.1.1",
diff --git a/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap b/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap
index d52d89eebe2f1..4b4bb1282d939 100644
--- a/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap
+++ b/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap
@@ -57,6 +57,6 @@ OptimizerConfig {
}
`;
-exports[`builds expected bundles, saves bundle counts to metadata: bar bundle 1`] = `"var __kbnBundles__=typeof __kbnBundles__===\\"object\\"?__kbnBundles__:{};__kbnBundles__[\\"plugin/bar\\"]=function(modules){function webpackJsonpCallback(data){var chunkIds=data[0];var moreModules=data[1];var moduleId,chunkId,i=0,resolves=[];for(;i bundle.id === p.id)) {
+ return;
+ }
+
+ // ignore requests that don't include a /data/public, /kibana_react/public, or
+ // /kibana_utils/public segment as a cheap way to avoid doing path resolution
+ // for paths that couldn't possibly resolve to what we're looking for
+ const reqToStaticBundle = STATIC_BUNDLE_PLUGINS.some(p =>
+ request.includes(`/${p.dirname}/public`)
+ );
+ if (!reqToStaticBundle) {
+ return;
+ }
+
+ // determine the most acurate resolution string we can without running full resolution
+ const rootRelative = normalizePath(
+ Path.relative(bundle.sourceRoot, Path.resolve(context, request))
+ );
+ for (const { id, dirname } of STATIC_BUNDLE_PLUGINS) {
+ if (rootRelative === `src/plugins/${dirname}/public`) {
+ return `__kbnBundles__['plugin/${id}']`;
+ }
+ }
+
+ // import doesn't match a root public import
+ return undefined;
+}
+
export function getWebpackConfig(bundle: Bundle, worker: WorkerConfig) {
const commonConfig: webpack.Configuration = {
node: { fs: 'empty' },
@@ -63,7 +117,6 @@ export function getWebpackConfig(bundle: Bundle, worker: WorkerConfig) {
// When the entry point is loaded, assign it's exported `plugin`
// value to a key on the global `__kbnBundles__` object.
library: ['__kbnBundles__', `plugin/${bundle.id}`],
- libraryExport: 'plugin',
}
: {}),
},
@@ -72,9 +125,16 @@ export function getWebpackConfig(bundle: Bundle, worker: WorkerConfig) {
noEmitOnErrors: true,
},
- externals: {
- ...UiSharedDeps.externals,
- },
+ externals: [
+ UiSharedDeps.externals,
+ function(context, request, cb) {
+ try {
+ cb(undefined, dynamicExternals(bundle, context, request));
+ } catch (error) {
+ cb(error, undefined);
+ }
+ },
+ ],
plugins: [new CleanWebpackPlugin(), new DisallowedSyntaxPlugin()],
diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js
index 0cc1ad6326671..7a858deff41d3 100644
--- a/packages/kbn-pm/dist/index.js
+++ b/packages/kbn-pm/dist/index.js
@@ -79260,7 +79260,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(705);
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; });
-/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(928);
+/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(923);
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; });
/*
@@ -79445,9 +79445,9 @@ const pAll = __webpack_require__(707);
const arrify = __webpack_require__(709);
const globby = __webpack_require__(710);
const isGlob = __webpack_require__(604);
-const cpFile = __webpack_require__(913);
-const junk = __webpack_require__(925);
-const CpyError = __webpack_require__(926);
+const cpFile = __webpack_require__(908);
+const junk = __webpack_require__(920);
+const CpyError = __webpack_require__(921);
const defaultOptions = {
ignoreJunk: true
@@ -79697,8 +79697,8 @@ const fs = __webpack_require__(23);
const arrayUnion = __webpack_require__(711);
const glob = __webpack_require__(713);
const fastGlob = __webpack_require__(718);
-const dirGlob = __webpack_require__(906);
-const gitignore = __webpack_require__(909);
+const dirGlob = __webpack_require__(901);
+const gitignore = __webpack_require__(904);
const DEFAULT_FILTER = () => false;
@@ -81531,11 +81531,11 @@ module.exports.generateTasks = pkg.generateTasks;
Object.defineProperty(exports, "__esModule", { value: true });
var optionsManager = __webpack_require__(720);
var taskManager = __webpack_require__(721);
-var reader_async_1 = __webpack_require__(877);
-var reader_stream_1 = __webpack_require__(901);
-var reader_sync_1 = __webpack_require__(902);
-var arrayUtils = __webpack_require__(904);
-var streamUtils = __webpack_require__(905);
+var reader_async_1 = __webpack_require__(872);
+var reader_stream_1 = __webpack_require__(896);
+var reader_sync_1 = __webpack_require__(897);
+var arrayUtils = __webpack_require__(899);
+var streamUtils = __webpack_require__(900);
/**
* Synchronous API.
*/
@@ -82175,9 +82175,9 @@ var extend = __webpack_require__(838);
*/
var compilers = __webpack_require__(841);
-var parsers = __webpack_require__(873);
-var cache = __webpack_require__(874);
-var utils = __webpack_require__(875);
+var parsers = __webpack_require__(868);
+var cache = __webpack_require__(869);
+var utils = __webpack_require__(870);
var MAX_LENGTH = 1024 * 64;
/**
@@ -100710,9 +100710,9 @@ var toRegex = __webpack_require__(729);
*/
var compilers = __webpack_require__(858);
-var parsers = __webpack_require__(869);
-var Extglob = __webpack_require__(872);
-var utils = __webpack_require__(871);
+var parsers = __webpack_require__(864);
+var Extglob = __webpack_require__(867);
+var utils = __webpack_require__(866);
var MAX_LENGTH = 1024 * 64;
/**
@@ -101222,7 +101222,7 @@ var parsers = __webpack_require__(862);
* Module dependencies
*/
-var debug = __webpack_require__(864)('expand-brackets');
+var debug = __webpack_require__(801)('expand-brackets');
var extend = __webpack_require__(738);
var Snapdragon = __webpack_require__(768);
var toRegex = __webpack_require__(729);
@@ -101816,839 +101816,12 @@ exports.createRegex = function(pattern, include) {
/* 864 */
/***/ (function(module, exports, __webpack_require__) {
-/**
- * Detect Electron renderer process, which is node, but we should
- * treat as a browser.
- */
-
-if (typeof process !== 'undefined' && process.type === 'renderer') {
- module.exports = __webpack_require__(865);
-} else {
- module.exports = __webpack_require__(868);
-}
-
-
-/***/ }),
-/* 865 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/**
- * This is the web browser implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = __webpack_require__(866);
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = 'undefined' != typeof chrome
- && 'undefined' != typeof chrome.storage
- ? chrome.storage.local
- : localstorage();
-
-/**
- * Colors.
- */
-
-exports.colors = [
- 'lightseagreen',
- 'forestgreen',
- 'goldenrod',
- 'dodgerblue',
- 'darkorchid',
- 'crimson'
-];
-
-/**
- * Currently only WebKit-based Web Inspectors, Firefox >= v31,
- * and the Firebug extension (any Firefox version) are known
- * to support "%c" CSS customizations.
- *
- * TODO: add a `localStorage` variable to explicitly enable/disable colors
- */
-
-function useColors() {
- // NB: In an Electron preload script, document will be defined but not fully
- // initialized. Since we know we're in Chrome, we'll just detect this case
- // explicitly
- if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
- return true;
- }
-
- // is webkit? http://stackoverflow.com/a/16459606/376773
- // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
- return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
- // is firebug? http://stackoverflow.com/a/398120/376773
- (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
- // is firefox >= v31?
- // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
- (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
- // double check webkit in userAgent just in case we are in a worker
- (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
-}
-
-/**
- * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
- */
-
-exports.formatters.j = function(v) {
- try {
- return JSON.stringify(v);
- } catch (err) {
- return '[UnexpectedJSONParseError]: ' + err.message;
- }
-};
-
-
-/**
- * Colorize log arguments if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
- var useColors = this.useColors;
-
- args[0] = (useColors ? '%c' : '')
- + this.namespace
- + (useColors ? ' %c' : ' ')
- + args[0]
- + (useColors ? '%c ' : ' ')
- + '+' + exports.humanize(this.diff);
-
- if (!useColors) return;
-
- var c = 'color: ' + this.color;
- args.splice(1, 0, c, 'color: inherit')
-
- // the final "%c" is somewhat tricky, because there could be other
- // arguments passed either before or after the %c, so we need to
- // figure out the correct index to insert the CSS into
- var index = 0;
- var lastC = 0;
- args[0].replace(/%[a-zA-Z%]/g, function(match) {
- if ('%%' === match) return;
- index++;
- if ('%c' === match) {
- // we only are interested in the *last* %c
- // (the user may have provided their own)
- lastC = index;
- }
- });
-
- args.splice(lastC, 0, c);
-}
-
-/**
- * Invokes `console.log()` when available.
- * No-op when `console.log` is not a "function".
- *
- * @api public
- */
-
-function log() {
- // this hackery is required for IE8/9, where
- // the `console.log` function doesn't have 'apply'
- return 'object' === typeof console
- && console.log
- && Function.prototype.apply.call(console.log, console, arguments);
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
- try {
- if (null == namespaces) {
- exports.storage.removeItem('debug');
- } else {
- exports.storage.debug = namespaces;
- }
- } catch(e) {}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
- var r;
- try {
- r = exports.storage.debug;
- } catch(e) {}
-
- // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
- if (!r && typeof process !== 'undefined' && 'env' in process) {
- r = process.env.DEBUG;
- }
-
- return r;
-}
-
-/**
- * Enable namespaces listed in `localStorage.debug` initially.
- */
-
-exports.enable(load());
-
-/**
- * Localstorage attempts to return the localstorage.
- *
- * This is necessary because safari throws
- * when a user disables cookies/localstorage
- * and you attempt to access it.
- *
- * @return {LocalStorage}
- * @api private
- */
-
-function localstorage() {
- try {
- return window.localStorage;
- } catch (e) {}
-}
-
-
-/***/ }),
-/* 866 */
-/***/ (function(module, exports, __webpack_require__) {
-
-
-/**
- * This is the common logic for both the Node.js and web browser
- * implementations of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
-exports.coerce = coerce;
-exports.disable = disable;
-exports.enable = enable;
-exports.enabled = enabled;
-exports.humanize = __webpack_require__(867);
-
-/**
- * The currently active debug mode names, and names to skip.
- */
-
-exports.names = [];
-exports.skips = [];
-
-/**
- * Map of special "%n" handling functions, for the debug "format" argument.
- *
- * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
- */
-
-exports.formatters = {};
-
-/**
- * Previous log timestamp.
- */
-
-var prevTime;
-
-/**
- * Select a color.
- * @param {String} namespace
- * @return {Number}
- * @api private
- */
-
-function selectColor(namespace) {
- var hash = 0, i;
-
- for (i in namespace) {
- hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
- hash |= 0; // Convert to 32bit integer
- }
-
- return exports.colors[Math.abs(hash) % exports.colors.length];
-}
-
-/**
- * Create a debugger with the given `namespace`.
- *
- * @param {String} namespace
- * @return {Function}
- * @api public
- */
-
-function createDebug(namespace) {
-
- function debug() {
- // disabled?
- if (!debug.enabled) return;
-
- var self = debug;
-
- // set `diff` timestamp
- var curr = +new Date();
- var ms = curr - (prevTime || curr);
- self.diff = ms;
- self.prev = prevTime;
- self.curr = curr;
- prevTime = curr;
-
- // turn the `arguments` into a proper Array
- var args = new Array(arguments.length);
- for (var i = 0; i < args.length; i++) {
- args[i] = arguments[i];
- }
-
- args[0] = exports.coerce(args[0]);
-
- if ('string' !== typeof args[0]) {
- // anything else let's inspect with %O
- args.unshift('%O');
- }
-
- // apply any `formatters` transformations
- var index = 0;
- args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
- // if we encounter an escaped % then don't increase the array index
- if (match === '%%') return match;
- index++;
- var formatter = exports.formatters[format];
- if ('function' === typeof formatter) {
- var val = args[index];
- match = formatter.call(self, val);
-
- // now we need to remove `args[index]` since it's inlined in the `format`
- args.splice(index, 1);
- index--;
- }
- return match;
- });
-
- // apply env-specific formatting (colors, etc.)
- exports.formatArgs.call(self, args);
-
- var logFn = debug.log || exports.log || console.log.bind(console);
- logFn.apply(self, args);
- }
-
- debug.namespace = namespace;
- debug.enabled = exports.enabled(namespace);
- debug.useColors = exports.useColors();
- debug.color = selectColor(namespace);
-
- // env-specific initialization logic for debug instances
- if ('function' === typeof exports.init) {
- exports.init(debug);
- }
-
- return debug;
-}
-
-/**
- * Enables a debug mode by namespaces. This can include modes
- * separated by a colon and wildcards.
- *
- * @param {String} namespaces
- * @api public
- */
-
-function enable(namespaces) {
- exports.save(namespaces);
-
- exports.names = [];
- exports.skips = [];
-
- var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
- var len = split.length;
-
- for (var i = 0; i < len; i++) {
- if (!split[i]) continue; // ignore empty strings
- namespaces = split[i].replace(/\*/g, '.*?');
- if (namespaces[0] === '-') {
- exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
- } else {
- exports.names.push(new RegExp('^' + namespaces + '$'));
- }
- }
-}
-
-/**
- * Disable debug output.
- *
- * @api public
- */
-
-function disable() {
- exports.enable('');
-}
-
-/**
- * Returns true if the given mode name is enabled, false otherwise.
- *
- * @param {String} name
- * @return {Boolean}
- * @api public
- */
-
-function enabled(name) {
- var i, len;
- for (i = 0, len = exports.skips.length; i < len; i++) {
- if (exports.skips[i].test(name)) {
- return false;
- }
- }
- for (i = 0, len = exports.names.length; i < len; i++) {
- if (exports.names[i].test(name)) {
- return true;
- }
- }
- return false;
-}
-
-/**
- * Coerce `val`.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
-function coerce(val) {
- if (val instanceof Error) return val.stack || val.message;
- return val;
-}
-
-
-/***/ }),
-/* 867 */
-/***/ (function(module, exports) {
-
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- * - `long` verbose formatting [false]
- *
- * @param {String|Number} val
- * @param {Object} [options]
- * @throws {Error} throw an error if val is not a non-empty string or a number
- * @return {String|Number}
- * @api public
- */
-
-module.exports = function(val, options) {
- options = options || {};
- var type = typeof val;
- if (type === 'string' && val.length > 0) {
- return parse(val);
- } else if (type === 'number' && isNaN(val) === false) {
- return options.long ? fmtLong(val) : fmtShort(val);
- }
- throw new Error(
- 'val is not a non-empty string or a valid number. val=' +
- JSON.stringify(val)
- );
-};
-
-/**
- * Parse the given `str` and return milliseconds.
- *
- * @param {String} str
- * @return {Number}
- * @api private
- */
-
-function parse(str) {
- str = String(str);
- if (str.length > 100) {
- return;
- }
- var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
- str
- );
- if (!match) {
- return;
- }
- var n = parseFloat(match[1]);
- var type = (match[2] || 'ms').toLowerCase();
- switch (type) {
- case 'years':
- case 'year':
- case 'yrs':
- case 'yr':
- case 'y':
- return n * y;
- case 'days':
- case 'day':
- case 'd':
- return n * d;
- case 'hours':
- case 'hour':
- case 'hrs':
- case 'hr':
- case 'h':
- return n * h;
- case 'minutes':
- case 'minute':
- case 'mins':
- case 'min':
- case 'm':
- return n * m;
- case 'seconds':
- case 'second':
- case 'secs':
- case 'sec':
- case 's':
- return n * s;
- case 'milliseconds':
- case 'millisecond':
- case 'msecs':
- case 'msec':
- case 'ms':
- return n;
- default:
- return undefined;
- }
-}
-
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtShort(ms) {
- if (ms >= d) {
- return Math.round(ms / d) + 'd';
- }
- if (ms >= h) {
- return Math.round(ms / h) + 'h';
- }
- if (ms >= m) {
- return Math.round(ms / m) + 'm';
- }
- if (ms >= s) {
- return Math.round(ms / s) + 's';
- }
- return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtLong(ms) {
- return plural(ms, d, 'day') ||
- plural(ms, h, 'hour') ||
- plural(ms, m, 'minute') ||
- plural(ms, s, 'second') ||
- ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- */
-
-function plural(ms, n, name) {
- if (ms < n) {
- return;
- }
- if (ms < n * 1.5) {
- return Math.floor(ms / n) + ' ' + name;
- }
- return Math.ceil(ms / n) + ' ' + name + 's';
-}
-
-
-/***/ }),
-/* 868 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/**
- * Module dependencies.
- */
-
-var tty = __webpack_require__(478);
-var util = __webpack_require__(29);
-
-/**
- * This is the Node.js implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = __webpack_require__(866);
-exports.init = init;
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-
-/**
- * Colors.
- */
-
-exports.colors = [6, 2, 3, 4, 5, 1];
-
-/**
- * Build up the default `inspectOpts` object from the environment variables.
- *
- * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
- */
-
-exports.inspectOpts = Object.keys(process.env).filter(function (key) {
- return /^debug_/i.test(key);
-}).reduce(function (obj, key) {
- // camel-case
- var prop = key
- .substring(6)
- .toLowerCase()
- .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });
-
- // coerce string value into JS value
- var val = process.env[key];
- if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
- else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
- else if (val === 'null') val = null;
- else val = Number(val);
-
- obj[prop] = val;
- return obj;
-}, {});
-
-/**
- * The file descriptor to write the `debug()` calls to.
- * Set the `DEBUG_FD` env variable to override with another value. i.e.:
- *
- * $ DEBUG_FD=3 node script.js 3>debug.log
- */
-
-var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
-
-if (1 !== fd && 2 !== fd) {
- util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
-}
-
-var stream = 1 === fd ? process.stdout :
- 2 === fd ? process.stderr :
- createWritableStdioStream(fd);
-
-/**
- * Is stdout a TTY? Colored output is enabled when `true`.
- */
-
-function useColors() {
- return 'colors' in exports.inspectOpts
- ? Boolean(exports.inspectOpts.colors)
- : tty.isatty(fd);
-}
-
-/**
- * Map %o to `util.inspect()`, all on a single line.
- */
-
-exports.formatters.o = function(v) {
- this.inspectOpts.colors = this.useColors;
- return util.inspect(v, this.inspectOpts)
- .split('\n').map(function(str) {
- return str.trim()
- }).join(' ');
-};
-
-/**
- * Map %o to `util.inspect()`, allowing multiple lines if needed.
- */
-
-exports.formatters.O = function(v) {
- this.inspectOpts.colors = this.useColors;
- return util.inspect(v, this.inspectOpts);
-};
-
-/**
- * Adds ANSI color escape codes if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
- var name = this.namespace;
- var useColors = this.useColors;
-
- if (useColors) {
- var c = this.color;
- var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';
-
- args[0] = prefix + args[0].split('\n').join('\n' + prefix);
- args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
- } else {
- args[0] = new Date().toUTCString()
- + ' ' + name + ' ' + args[0];
- }
-}
-
-/**
- * Invokes `util.format()` with the specified arguments and writes to `stream`.
- */
-
-function log() {
- return stream.write(util.format.apply(util, arguments) + '\n');
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
- if (null == namespaces) {
- // If you set a process.env field to null or undefined, it gets cast to the
- // string 'null' or 'undefined'. Just delete instead.
- delete process.env.DEBUG;
- } else {
- process.env.DEBUG = namespaces;
- }
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
- return process.env.DEBUG;
-}
-
-/**
- * Copied from `node/src/node.js`.
- *
- * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
- * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
- */
-
-function createWritableStdioStream (fd) {
- var stream;
- var tty_wrap = process.binding('tty_wrap');
-
- // Note stream._type is used for test-module-load-list.js
-
- switch (tty_wrap.guessHandleType(fd)) {
- case 'TTY':
- stream = new tty.WriteStream(fd);
- stream._type = 'tty';
-
- // Hack to have stream not keep the event loop alive.
- // See https://github.com/joyent/node/issues/1726
- if (stream._handle && stream._handle.unref) {
- stream._handle.unref();
- }
- break;
-
- case 'FILE':
- var fs = __webpack_require__(23);
- stream = new fs.SyncWriteStream(fd, { autoClose: false });
- stream._type = 'fs';
- break;
-
- case 'PIPE':
- case 'TCP':
- var net = __webpack_require__(806);
- stream = new net.Socket({
- fd: fd,
- readable: false,
- writable: true
- });
-
- // FIXME Should probably have an option in net.Socket to create a
- // stream from an existing fd which is writable only. But for now
- // we'll just add this hack and set the `readable` member to false.
- // Test: ./node test/fixtures/echo.js < /etc/passwd
- stream.readable = false;
- stream.read = null;
- stream._type = 'pipe';
-
- // FIXME Hack to have stream not keep the event loop alive.
- // See https://github.com/joyent/node/issues/1726
- if (stream._handle && stream._handle.unref) {
- stream._handle.unref();
- }
- break;
-
- default:
- // Probably an error on in uv_guess_handle()
- throw new Error('Implement me. Unknown stream file type!');
- }
-
- // For supporting legacy API we put the FD here.
- stream.fd = fd;
-
- stream._isStdio = true;
-
- return stream;
-}
-
-/**
- * Init logic for `debug` instances.
- *
- * Create a new `inspectOpts` object in case `useColors` is set
- * differently for a particular `debug` instance.
- */
-
-function init (debug) {
- debug.inspectOpts = {};
-
- var keys = Object.keys(exports.inspectOpts);
- for (var i = 0; i < keys.length; i++) {
- debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
- }
-}
-
-/**
- * Enable namespaces listed in `process.env.DEBUG` initially.
- */
-
-exports.enable(load());
-
-
-/***/ }),
-/* 869 */
-/***/ (function(module, exports, __webpack_require__) {
-
"use strict";
var brackets = __webpack_require__(859);
-var define = __webpack_require__(870);
-var utils = __webpack_require__(871);
+var define = __webpack_require__(865);
+var utils = __webpack_require__(866);
/**
* Characters to use in text regex (we want to "not" match
@@ -102803,7 +101976,7 @@ module.exports = parsers;
/***/ }),
-/* 870 */
+/* 865 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -102841,7 +102014,7 @@ module.exports = function defineProperty(obj, prop, val) {
/***/ }),
-/* 871 */
+/* 866 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -102917,7 +102090,7 @@ utils.createRegex = function(str) {
/***/ }),
-/* 872 */
+/* 867 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -102928,7 +102101,7 @@ utils.createRegex = function(str) {
*/
var Snapdragon = __webpack_require__(768);
-var define = __webpack_require__(870);
+var define = __webpack_require__(865);
var extend = __webpack_require__(738);
/**
@@ -102936,7 +102109,7 @@ var extend = __webpack_require__(738);
*/
var compilers = __webpack_require__(858);
-var parsers = __webpack_require__(869);
+var parsers = __webpack_require__(864);
/**
* Customize Snapdragon parser and renderer
@@ -103002,7 +102175,7 @@ module.exports = Extglob;
/***/ }),
-/* 873 */
+/* 868 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -103092,14 +102265,14 @@ function textRegex(pattern) {
/***/ }),
-/* 874 */
+/* 869 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = new (__webpack_require__(850))();
/***/ }),
-/* 875 */
+/* 870 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -103117,7 +102290,7 @@ utils.define = __webpack_require__(837);
utils.diff = __webpack_require__(854);
utils.extend = __webpack_require__(838);
utils.pick = __webpack_require__(855);
-utils.typeOf = __webpack_require__(876);
+utils.typeOf = __webpack_require__(871);
utils.unique = __webpack_require__(741);
/**
@@ -103415,7 +102588,7 @@ utils.unixify = function(options) {
/***/ }),
-/* 876 */
+/* 871 */
/***/ (function(module, exports) {
var toString = Object.prototype.toString;
@@ -103550,7 +102723,7 @@ function isBuffer(val) {
/***/ }),
-/* 877 */
+/* 872 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -103569,9 +102742,9 @@ var __extends = (this && this.__extends) || (function () {
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
-var readdir = __webpack_require__(878);
-var reader_1 = __webpack_require__(891);
-var fs_stream_1 = __webpack_require__(895);
+var readdir = __webpack_require__(873);
+var reader_1 = __webpack_require__(886);
+var fs_stream_1 = __webpack_require__(890);
var ReaderAsync = /** @class */ (function (_super) {
__extends(ReaderAsync, _super);
function ReaderAsync() {
@@ -103632,15 +102805,15 @@ exports.default = ReaderAsync;
/***/ }),
-/* 878 */
+/* 873 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-const readdirSync = __webpack_require__(879);
-const readdirAsync = __webpack_require__(887);
-const readdirStream = __webpack_require__(890);
+const readdirSync = __webpack_require__(874);
+const readdirAsync = __webpack_require__(882);
+const readdirStream = __webpack_require__(885);
module.exports = exports = readdirAsyncPath;
exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath;
@@ -103724,7 +102897,7 @@ function readdirStreamStat (dir, options) {
/***/ }),
-/* 879 */
+/* 874 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -103732,11 +102905,11 @@ function readdirStreamStat (dir, options) {
module.exports = readdirSync;
-const DirectoryReader = __webpack_require__(880);
+const DirectoryReader = __webpack_require__(875);
let syncFacade = {
- fs: __webpack_require__(885),
- forEach: __webpack_require__(886),
+ fs: __webpack_require__(880),
+ forEach: __webpack_require__(881),
sync: true
};
@@ -103765,7 +102938,7 @@ function readdirSync (dir, options, internalOptions) {
/***/ }),
-/* 880 */
+/* 875 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -103774,9 +102947,9 @@ function readdirSync (dir, options, internalOptions) {
const Readable = __webpack_require__(27).Readable;
const EventEmitter = __webpack_require__(379).EventEmitter;
const path = __webpack_require__(16);
-const normalizeOptions = __webpack_require__(881);
-const stat = __webpack_require__(883);
-const call = __webpack_require__(884);
+const normalizeOptions = __webpack_require__(876);
+const stat = __webpack_require__(878);
+const call = __webpack_require__(879);
/**
* Asynchronously reads the contents of a directory and streams the results
@@ -104152,14 +103325,14 @@ module.exports = DirectoryReader;
/***/ }),
-/* 881 */
+/* 876 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
const path = __webpack_require__(16);
-const globToRegExp = __webpack_require__(882);
+const globToRegExp = __webpack_require__(877);
module.exports = normalizeOptions;
@@ -104336,7 +103509,7 @@ function normalizeOptions (options, internalOptions) {
/***/ }),
-/* 882 */
+/* 877 */
/***/ (function(module, exports) {
module.exports = function (glob, opts) {
@@ -104473,13 +103646,13 @@ module.exports = function (glob, opts) {
/***/ }),
-/* 883 */
+/* 878 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-const call = __webpack_require__(884);
+const call = __webpack_require__(879);
module.exports = stat;
@@ -104554,7 +103727,7 @@ function symlinkStat (fs, path, lstats, callback) {
/***/ }),
-/* 884 */
+/* 879 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -104615,14 +103788,14 @@ function callOnce (fn) {
/***/ }),
-/* 885 */
+/* 880 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
const fs = __webpack_require__(23);
-const call = __webpack_require__(884);
+const call = __webpack_require__(879);
/**
* A facade around {@link fs.readdirSync} that allows it to be called
@@ -104686,7 +103859,7 @@ exports.lstat = function (path, callback) {
/***/ }),
-/* 886 */
+/* 881 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -104715,7 +103888,7 @@ function syncForEach (array, iterator, done) {
/***/ }),
-/* 887 */
+/* 882 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -104723,12 +103896,12 @@ function syncForEach (array, iterator, done) {
module.exports = readdirAsync;
-const maybe = __webpack_require__(888);
-const DirectoryReader = __webpack_require__(880);
+const maybe = __webpack_require__(883);
+const DirectoryReader = __webpack_require__(875);
let asyncFacade = {
fs: __webpack_require__(23),
- forEach: __webpack_require__(889),
+ forEach: __webpack_require__(884),
async: true
};
@@ -104770,7 +103943,7 @@ function readdirAsync (dir, options, callback, internalOptions) {
/***/ }),
-/* 888 */
+/* 883 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -104797,7 +103970,7 @@ module.exports = function maybe (cb, promise) {
/***/ }),
-/* 889 */
+/* 884 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -104833,7 +104006,7 @@ function asyncForEach (array, iterator, done) {
/***/ }),
-/* 890 */
+/* 885 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -104841,11 +104014,11 @@ function asyncForEach (array, iterator, done) {
module.exports = readdirStream;
-const DirectoryReader = __webpack_require__(880);
+const DirectoryReader = __webpack_require__(875);
let streamFacade = {
fs: __webpack_require__(23),
- forEach: __webpack_require__(889),
+ forEach: __webpack_require__(884),
async: true
};
@@ -104865,16 +104038,16 @@ function readdirStream (dir, options, internalOptions) {
/***/ }),
-/* 891 */
+/* 886 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var path = __webpack_require__(16);
-var deep_1 = __webpack_require__(892);
-var entry_1 = __webpack_require__(894);
-var pathUtil = __webpack_require__(893);
+var deep_1 = __webpack_require__(887);
+var entry_1 = __webpack_require__(889);
+var pathUtil = __webpack_require__(888);
var Reader = /** @class */ (function () {
function Reader(options) {
this.options = options;
@@ -104940,13 +104113,13 @@ exports.default = Reader;
/***/ }),
-/* 892 */
+/* 887 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
-var pathUtils = __webpack_require__(893);
+var pathUtils = __webpack_require__(888);
var patternUtils = __webpack_require__(722);
var DeepFilter = /** @class */ (function () {
function DeepFilter(options, micromatchOptions) {
@@ -105030,7 +104203,7 @@ exports.default = DeepFilter;
/***/ }),
-/* 893 */
+/* 888 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105061,13 +104234,13 @@ exports.makeAbsolute = makeAbsolute;
/***/ }),
-/* 894 */
+/* 889 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
-var pathUtils = __webpack_require__(893);
+var pathUtils = __webpack_require__(888);
var patternUtils = __webpack_require__(722);
var EntryFilter = /** @class */ (function () {
function EntryFilter(options, micromatchOptions) {
@@ -105153,7 +104326,7 @@ exports.default = EntryFilter;
/***/ }),
-/* 895 */
+/* 890 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105173,8 +104346,8 @@ var __extends = (this && this.__extends) || (function () {
})();
Object.defineProperty(exports, "__esModule", { value: true });
var stream = __webpack_require__(27);
-var fsStat = __webpack_require__(896);
-var fs_1 = __webpack_require__(900);
+var fsStat = __webpack_require__(891);
+var fs_1 = __webpack_require__(895);
var FileSystemStream = /** @class */ (function (_super) {
__extends(FileSystemStream, _super);
function FileSystemStream() {
@@ -105224,14 +104397,14 @@ exports.default = FileSystemStream;
/***/ }),
-/* 896 */
+/* 891 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
-const optionsManager = __webpack_require__(897);
-const statProvider = __webpack_require__(899);
+const optionsManager = __webpack_require__(892);
+const statProvider = __webpack_require__(894);
/**
* Asynchronous API.
*/
@@ -105262,13 +104435,13 @@ exports.statSync = statSync;
/***/ }),
-/* 897 */
+/* 892 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
-const fsAdapter = __webpack_require__(898);
+const fsAdapter = __webpack_require__(893);
function prepare(opts) {
const options = Object.assign({
fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined),
@@ -105281,7 +104454,7 @@ exports.prepare = prepare;
/***/ }),
-/* 898 */
+/* 893 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105304,7 +104477,7 @@ exports.getFileSystemAdapter = getFileSystemAdapter;
/***/ }),
-/* 899 */
+/* 894 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105356,7 +104529,7 @@ exports.isFollowedSymlink = isFollowedSymlink;
/***/ }),
-/* 900 */
+/* 895 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105387,7 +104560,7 @@ exports.default = FileSystem;
/***/ }),
-/* 901 */
+/* 896 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105407,9 +104580,9 @@ var __extends = (this && this.__extends) || (function () {
})();
Object.defineProperty(exports, "__esModule", { value: true });
var stream = __webpack_require__(27);
-var readdir = __webpack_require__(878);
-var reader_1 = __webpack_require__(891);
-var fs_stream_1 = __webpack_require__(895);
+var readdir = __webpack_require__(873);
+var reader_1 = __webpack_require__(886);
+var fs_stream_1 = __webpack_require__(890);
var TransformStream = /** @class */ (function (_super) {
__extends(TransformStream, _super);
function TransformStream(reader) {
@@ -105477,7 +104650,7 @@ exports.default = ReaderStream;
/***/ }),
-/* 902 */
+/* 897 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105496,9 +104669,9 @@ var __extends = (this && this.__extends) || (function () {
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
-var readdir = __webpack_require__(878);
-var reader_1 = __webpack_require__(891);
-var fs_sync_1 = __webpack_require__(903);
+var readdir = __webpack_require__(873);
+var reader_1 = __webpack_require__(886);
+var fs_sync_1 = __webpack_require__(898);
var ReaderSync = /** @class */ (function (_super) {
__extends(ReaderSync, _super);
function ReaderSync() {
@@ -105558,7 +104731,7 @@ exports.default = ReaderSync;
/***/ }),
-/* 903 */
+/* 898 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105577,8 +104750,8 @@ var __extends = (this && this.__extends) || (function () {
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
-var fsStat = __webpack_require__(896);
-var fs_1 = __webpack_require__(900);
+var fsStat = __webpack_require__(891);
+var fs_1 = __webpack_require__(895);
var FileSystemSync = /** @class */ (function (_super) {
__extends(FileSystemSync, _super);
function FileSystemSync() {
@@ -105624,7 +104797,7 @@ exports.default = FileSystemSync;
/***/ }),
-/* 904 */
+/* 899 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105640,7 +104813,7 @@ exports.flatten = flatten;
/***/ }),
-/* 905 */
+/* 900 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105661,13 +104834,13 @@ exports.merge = merge;
/***/ }),
-/* 906 */
+/* 901 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
const path = __webpack_require__(16);
-const pathType = __webpack_require__(907);
+const pathType = __webpack_require__(902);
const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0];
@@ -105733,13 +104906,13 @@ module.exports.sync = (input, opts) => {
/***/ }),
-/* 907 */
+/* 902 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
const fs = __webpack_require__(23);
-const pify = __webpack_require__(908);
+const pify = __webpack_require__(903);
function type(fn, fn2, fp) {
if (typeof fp !== 'string') {
@@ -105782,7 +104955,7 @@ exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink');
/***/ }),
-/* 908 */
+/* 903 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105873,7 +105046,7 @@ module.exports = (obj, opts) => {
/***/ }),
-/* 909 */
+/* 904 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -105881,9 +105054,9 @@ module.exports = (obj, opts) => {
const fs = __webpack_require__(23);
const path = __webpack_require__(16);
const fastGlob = __webpack_require__(718);
-const gitIgnore = __webpack_require__(910);
-const pify = __webpack_require__(911);
-const slash = __webpack_require__(912);
+const gitIgnore = __webpack_require__(905);
+const pify = __webpack_require__(906);
+const slash = __webpack_require__(907);
const DEFAULT_IGNORE = [
'**/node_modules/**',
@@ -105981,7 +105154,7 @@ module.exports.sync = options => {
/***/ }),
-/* 910 */
+/* 905 */
/***/ (function(module, exports) {
// A simple implementation of make-array
@@ -106450,7 +105623,7 @@ module.exports = options => new IgnoreBase(options)
/***/ }),
-/* 911 */
+/* 906 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -106525,7 +105698,7 @@ module.exports = (input, options) => {
/***/ }),
-/* 912 */
+/* 907 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -106543,17 +105716,17 @@ module.exports = input => {
/***/ }),
-/* 913 */
+/* 908 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
const path = __webpack_require__(16);
const {constants: fsConstants} = __webpack_require__(23);
-const pEvent = __webpack_require__(914);
-const CpFileError = __webpack_require__(917);
-const fs = __webpack_require__(921);
-const ProgressEmitter = __webpack_require__(924);
+const pEvent = __webpack_require__(909);
+const CpFileError = __webpack_require__(912);
+const fs = __webpack_require__(916);
+const ProgressEmitter = __webpack_require__(919);
const cpFileAsync = async (source, destination, options, progressEmitter) => {
let readError;
@@ -106667,12 +105840,12 @@ module.exports.sync = (source, destination, options) => {
/***/ }),
-/* 914 */
+/* 909 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-const pTimeout = __webpack_require__(915);
+const pTimeout = __webpack_require__(910);
const symbolAsyncIterator = Symbol.asyncIterator || '@@asyncIterator';
@@ -106963,12 +106136,12 @@ module.exports.iterator = (emitter, event, options) => {
/***/ }),
-/* 915 */
+/* 910 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-const pFinally = __webpack_require__(916);
+const pFinally = __webpack_require__(911);
class TimeoutError extends Error {
constructor(message) {
@@ -107014,7 +106187,7 @@ module.exports.TimeoutError = TimeoutError;
/***/ }),
-/* 916 */
+/* 911 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -107036,12 +106209,12 @@ module.exports = (promise, onFinally) => {
/***/ }),
-/* 917 */
+/* 912 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-const NestedError = __webpack_require__(918);
+const NestedError = __webpack_require__(913);
class CpFileError extends NestedError {
constructor(message, nested) {
@@ -107055,10 +106228,10 @@ module.exports = CpFileError;
/***/ }),
-/* 918 */
+/* 913 */
/***/ (function(module, exports, __webpack_require__) {
-var inherits = __webpack_require__(919);
+var inherits = __webpack_require__(914);
var NestedError = function (message, nested) {
this.nested = nested;
@@ -107109,7 +106282,7 @@ module.exports = NestedError;
/***/ }),
-/* 919 */
+/* 914 */
/***/ (function(module, exports, __webpack_require__) {
try {
@@ -107117,12 +106290,12 @@ try {
if (typeof util.inherits !== 'function') throw '';
module.exports = util.inherits;
} catch (e) {
- module.exports = __webpack_require__(920);
+ module.exports = __webpack_require__(915);
}
/***/ }),
-/* 920 */
+/* 915 */
/***/ (function(module, exports) {
if (typeof Object.create === 'function') {
@@ -107151,16 +106324,16 @@ if (typeof Object.create === 'function') {
/***/ }),
-/* 921 */
+/* 916 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
const {promisify} = __webpack_require__(29);
const fs = __webpack_require__(22);
-const makeDir = __webpack_require__(922);
-const pEvent = __webpack_require__(914);
-const CpFileError = __webpack_require__(917);
+const makeDir = __webpack_require__(917);
+const pEvent = __webpack_require__(909);
+const CpFileError = __webpack_require__(912);
const stat = promisify(fs.stat);
const lstat = promisify(fs.lstat);
@@ -107257,7 +106430,7 @@ exports.copyFileSync = (source, destination, flags) => {
/***/ }),
-/* 922 */
+/* 917 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -107265,7 +106438,7 @@ exports.copyFileSync = (source, destination, flags) => {
const fs = __webpack_require__(23);
const path = __webpack_require__(16);
const {promisify} = __webpack_require__(29);
-const semver = __webpack_require__(923);
+const semver = __webpack_require__(918);
const defaults = {
mode: 0o777 & (~process.umask()),
@@ -107414,7 +106587,7 @@ module.exports.sync = (input, options) => {
/***/ }),
-/* 923 */
+/* 918 */
/***/ (function(module, exports) {
exports = module.exports = SemVer
@@ -109016,7 +108189,7 @@ function coerce (version, options) {
/***/ }),
-/* 924 */
+/* 919 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -109057,7 +108230,7 @@ module.exports = ProgressEmitter;
/***/ }),
-/* 925 */
+/* 920 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
@@ -109103,12 +108276,12 @@ exports.default = module.exports;
/***/ }),
-/* 926 */
+/* 921 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-const NestedError = __webpack_require__(927);
+const NestedError = __webpack_require__(922);
class CpyError extends NestedError {
constructor(message, nested) {
@@ -109122,7 +108295,7 @@ module.exports = CpyError;
/***/ }),
-/* 927 */
+/* 922 */
/***/ (function(module, exports, __webpack_require__) {
var inherits = __webpack_require__(29).inherits;
@@ -109178,7 +108351,7 @@ module.exports = NestedError;
/***/ }),
-/* 928 */
+/* 923 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
diff --git a/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts b/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts
index 66f17ab579ec3..f4b91d154cbb8 100644
--- a/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts
+++ b/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts
@@ -136,7 +136,7 @@ export const schema = Joi.object()
browser: Joi.object()
.keys({
type: Joi.string()
- .valid('chrome', 'firefox', 'ie')
+ .valid('chrome', 'firefox', 'ie', 'msedge')
.default('chrome'),
logPollingMs: Joi.number().default(100),
diff --git a/packages/kbn-ui-shared-deps/polyfills.js b/packages/kbn-ui-shared-deps/polyfills.js
index d2305d643e4d2..1f1392b02baff 100644
--- a/packages/kbn-ui-shared-deps/polyfills.js
+++ b/packages/kbn-ui-shared-deps/polyfills.js
@@ -20,6 +20,13 @@
require('core-js/stable');
require('regenerator-runtime/runtime');
require('custom-event-polyfill');
+
+if (typeof window.Event === 'object') {
+ // IE11 doesn't support unknown event types, required by react-use
+ // https://github.com/streamich/react-use/issues/73
+ window.Event = CustomEvent;
+}
+
require('whatwg-fetch');
require('abortcontroller-polyfill/dist/polyfill-patch-fetch');
require('./vendor/childnode_remove_polyfill');
diff --git a/src/core/public/chrome/ui/header/header_help_menu.tsx b/src/core/public/chrome/ui/header/header_help_menu.tsx
index 80a45b4c61f07..1023a561a0fe3 100644
--- a/src/core/public/chrome/ui/header/header_help_menu.tsx
+++ b/src/core/public/chrome/ui/header/header_help_menu.tsx
@@ -314,13 +314,14 @@ class HeaderHelpMenuUI extends Component {
return (
// @ts-ignore repositionOnScroll doesn't exist in EuiPopover