From 8f71351a9485f4871ef033c59ec26cfb33928338 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Wed, 7 Dec 2022 14:59:28 -0500 Subject: [PATCH 01/19] [Fleet] Improve package policy open API doc (#147144) --- .../plugins/fleet/common/openapi/bundled.json | 194 +++++------------- .../plugins/fleet/common/openapi/bundled.yaml | 124 +++-------- ...olicy.yaml => package_policy_request.yaml} | 21 +- .../openapi/paths/package_policies.yaml | 15 +- .../package_policies@{package_policy_id}.yaml | 22 +- 5 files changed, 109 insertions(+), 267 deletions(-) rename x-pack/plugins/fleet/common/openapi/components/schemas/{simplified_package_policy.yaml => package_policy_request.yaml} (78%) diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index 406907f9a7d4c..db8470ed48fd5 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -2959,35 +2959,7 @@ "content": { "application/json": { "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/simplified_package_policy" - }, - { - "deprecated": true, - "allOf": [ - { - "$ref": "#/components/schemas/new_package_policy" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - } - } - }, - { - "type": "object", - "properties": { - "force": { - "type": "boolean" - } - } - } - ] - } - ] + "$ref": "#/components/schemas/package_policy_request" } } } @@ -3276,7 +3248,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/update_package_policy" + "$ref": "#/components/schemas/package_policy_request" } } } @@ -3287,25 +3259,18 @@ "content": { "application/json": { "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/simplified_package_policy" + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/package_policy" }, - { - "type": "object", - "properties": { - "item": { - "$ref": "#/components/schemas/package_policy" - }, - "sucess": { - "type": "boolean" - } - }, - "required": [ - "item", - "sucess" - ] + "sucess": { + "type": "boolean" } + }, + "required": [ + "item", + "sucess" ] } } @@ -5524,8 +5489,8 @@ "created_at" ] }, - "simplified_package_policy": { - "title": "Simplified Package Policy", + "package_policy_request": { + "title": "Package Policy Request", "type": "object", "properties": { "id": { @@ -5534,30 +5499,36 @@ }, "name": { "type": "string", - "description": "Package policy name (should be unique)" + "description": "Package policy name (should be unique)", + "example": "nginx-123" }, "description": { "type": "string", - "description": "Package policy description" + "description": "Package policy description", + "example": "my description" }, "namespace": { "type": "string", - "description": "namespace by default \"default\"" + "description": "namespace by default \"default\"", + "example": "default" }, "policy_id": { "type": "string", - "description": "Agent policy ID where that package policy will be added" + "description": "Agent policy ID to which the package policy will be added", + "example": "agent-policy-id" }, "package": { "type": "object", "properties": { "name": { "type": "string", - "description": "Package name" + "description": "Package name", + "example": "nginx" }, "version": { "type": "string", - "description": "Package version" + "description": "Package version", + "example": "1.6.0" } }, "required": [ @@ -5572,6 +5543,26 @@ "inputs": { "type": "object", "description": "Package policy inputs (see integration documentation to know what inputs are available)", + "example": { + "nginx-logfile": { + "enabled": true, + "streams": { + "nginx.access": { + "enabled": true, + "vars": { + "paths": [ + "/var/log/nginx/access.log*" + ], + "tags": [ + "nginx-access" + ], + "preserve_original_event": false, + "ignore_older": "72h" + } + } + } + } + }, "additionalProperties": { "type": "object", "properties": { @@ -5770,99 +5761,6 @@ } } }, - "update_package_policy": { - "title": "Update package policy", - "type": "object", - "description": "", - "properties": { - "version": { - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "package": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "version": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "name", - "title", - "version" - ] - }, - "namespace": { - "type": "string" - }, - "output_id": { - "type": "string", - "description": "Not supported output can be set at the agent policy level only", - "deprecated": true - }, - "inputs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "processors": { - "type": "array", - "items": { - "type": "string" - } - }, - "streams": { - "type": "array", - "items": {} - }, - "config": { - "type": "object" - }, - "vars": { - "type": "object" - } - }, - "required": [ - "type", - "enabled", - "streams" - ] - } - }, - "policy_id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "force": { - "type": "boolean" - } - }, - "required": [ - "name", - "namespace", - "policy_id", - "enabled" - ] - }, "output": { "title": "Output", "type": "object", diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index cd4fdc3a45593..f95d51ceb00b5 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -1839,19 +1839,7 @@ paths: content: application/json: schema: - oneOf: - - $ref: '#/components/schemas/simplified_package_policy' - - deprecated: true - allOf: - - $ref: '#/components/schemas/new_package_policy' - - type: object - properties: - id: - type: string - - type: object - properties: - force: - type: boolean + $ref: '#/components/schemas/package_policy_request' parameters: - $ref: '#/components/parameters/kbn_xsrf' /package_policies/_bulk_get: @@ -2030,24 +2018,22 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/update_package_policy' + $ref: '#/components/schemas/package_policy_request' responses: '200': description: OK content: application/json: schema: - oneOf: - - $ref: '#/components/schemas/simplified_package_policy' - - type: object - properties: - item: - $ref: '#/components/schemas/package_policy' - sucess: - type: boolean - required: - - item - - sucess + type: object + properties: + item: + $ref: '#/components/schemas/package_policy' + sucess: + type: boolean + required: + - item + - sucess parameters: - $ref: '#/components/parameters/kbn_xsrf' delete: @@ -3515,8 +3501,8 @@ components: - api_key - active - created_at - simplified_package_policy: - title: Simplified Package Policy + package_policy_request: + title: Package Policy Request type: object properties: id: @@ -3525,24 +3511,30 @@ components: name: type: string description: Package policy name (should be unique) + example: nginx-123 description: type: string description: Package policy description + example: my description namespace: type: string description: namespace by default "default" + example: default policy_id: type: string description: Agent policy ID where that package policy will be added + example: agent-policy-id package: type: object properties: name: type: string description: Package name + example: nginx version: type: string description: Package version + example: 1.6.0 required: - name - version @@ -3556,6 +3548,19 @@ components: description: >- Package policy inputs (see integration documentation to know what inputs are available) + example: + nginx-logfile: + enabled: true + streams: + nginx.access: + enabled: true + vars: + paths: + - /var/log/nginx/access.log* + tags: + - nginx-access + preserve_original_event: false + ignore_older: 72h additionalProperties: type: object properties: @@ -3690,71 +3695,6 @@ components: type: array items: $ref: '#/components/schemas/full_agent_policy_input' - update_package_policy: - title: Update package policy - type: object - description: '' - properties: - version: - type: string - enabled: - type: boolean - package: - type: object - properties: - name: - type: string - version: - type: string - title: - type: string - required: - - name - - title - - version - namespace: - type: string - output_id: - type: string - description: Not supported output can be set at the agent policy level only - deprecated: true - inputs: - type: array - items: - type: object - properties: - type: - type: string - enabled: - type: boolean - processors: - type: array - items: - type: string - streams: - type: array - items: {} - config: - type: object - vars: - type: object - required: - - type - - enabled - - streams - policy_id: - type: string - name: - type: string - description: - type: string - force: - type: boolean - required: - - name - - namespace - - policy_id - - enabled output: title: Output type: object diff --git a/x-pack/plugins/fleet/common/openapi/components/schemas/simplified_package_policy.yaml b/x-pack/plugins/fleet/common/openapi/components/schemas/package_policy_request.yaml similarity index 78% rename from x-pack/plugins/fleet/common/openapi/components/schemas/simplified_package_policy.yaml rename to x-pack/plugins/fleet/common/openapi/components/schemas/package_policy_request.yaml index 6ff537386f05b..4f4f5489d82a2 100644 --- a/x-pack/plugins/fleet/common/openapi/components/schemas/simplified_package_policy.yaml +++ b/x-pack/plugins/fleet/common/openapi/components/schemas/package_policy_request.yaml @@ -1,4 +1,4 @@ -title: Simplified Package Policy +title: Package Policy Request type: object properties: id: @@ -7,24 +7,30 @@ properties: name: type: string description: Package policy name (should be unique) + example: nginx-123 description: type: string description: Package policy description + example: 'my description' namespace: type: string description: namespace by default "default" + example: 'default' policy_id: type: string description: Agent policy ID where that package policy will be added + example: 'agent-policy-id' package: type: object properties: name: type: string description: Package name + example: 'nginx' version: type: string description: Package version + example: '1.6.0' required: - name - version @@ -34,6 +40,19 @@ properties: inputs: type: object description: Package policy inputs (see integration documentation to know what inputs are available) + example: + nginx-logfile: + enabled: true + streams: + nginx.access: + enabled: true + vars: + paths: + - '/var/log/nginx/access.log*' + tags: + - nginx-access + preserve_original_event: false + ignore_older: 72h additionalProperties: type: object properties: diff --git a/x-pack/plugins/fleet/common/openapi/paths/package_policies.yaml b/x-pack/plugins/fleet/common/openapi/paths/package_policies.yaml index 10e4fba447bc5..ac609d2118fa4 100644 --- a/x-pack/plugins/fleet/common/openapi/paths/package_policies.yaml +++ b/x-pack/plugins/fleet/common/openapi/paths/package_policies.yaml @@ -45,19 +45,6 @@ post: content: application/json: schema: - oneOf: - - $ref: ../components/schemas/simplified_package_policy.yaml - # Using inputs as an array is deprecated - - deprecated: true - allOf: - - $ref: ../components/schemas/new_package_policy.yaml - - type: object - properties: - id: - type: string - - type: object - properties: - force: - type: boolean + $ref: ../components/schemas/package_policy_request.yaml parameters: - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/fleet/common/openapi/paths/package_policies@{package_policy_id}.yaml b/x-pack/plugins/fleet/common/openapi/paths/package_policies@{package_policy_id}.yaml index bf3e0e0a6eeff..bb4a76f1cd3df 100644 --- a/x-pack/plugins/fleet/common/openapi/paths/package_policies@{package_policy_id}.yaml +++ b/x-pack/plugins/fleet/common/openapi/paths/package_policies@{package_policy_id}.yaml @@ -27,24 +27,22 @@ put: content: application/json: schema: - $ref: ../components/schemas/update_package_policy.yaml + $ref: ../components/schemas/package_policy_request.yaml responses: '200': description: OK content: application/json: schema: - oneOf: - - $ref: ../components/schemas/simplified_package_policy.yaml - - type: object - properties: - item: - $ref: ../components/schemas/package_policy.yaml - sucess: - type: boolean - required: - - item - - sucess + type: object + properties: + item: + $ref: ../components/schemas/package_policy.yaml + sucess: + type: boolean + required: + - item + - sucess parameters: - $ref: ../components/headers/kbn_xsrf.yaml delete: From f0777b3bc152e6298317d22ef002a267fe8e87ae Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Wed, 7 Dec 2022 16:22:06 -0500 Subject: [PATCH 02/19] [Cases] Delete users actions and add audit log (#145632) This PR deletes users actions when the case is deleted. It makes a few improvements: - Uses point in time finder for the different case entities when deleting instead of requesting a single page of 10k results - Refactors the User actions class to receive the `unsecuredSavedObjectClient` as a parameter when initializing the class - Adds the audit log message when a user action is created - Leverages the bulk delete method from the saved object core library Fixes: https://github.com/elastic/kibana/issues/143657 https://github.com/elastic/kibana/issues/145124
User actions removed when deleting cases https://user-images.githubusercontent.com/56361221/204568129-525e176c-84af-4197-8f80-fc0801676226.mov
## Example Audit Log Messages ``` [2022-11-29T10:10:32.365-05:00][INFO ][plugins.security.audit.ecs] User created case id: f7138410-6ff7-11ed-860b-4fd7293e59c1 - user action id: f73256b0-6ff7-11ed-860b-4fd7293e59c1 [2022-11-29T10:11:08.716-05:00][INFO ][plugins.security.audit.ecs] User assigned uids: [u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0] to case id: f7138410-6ff7-11ed-860b-4fd7293e59c1 - user action id: 0cf9e670-6ff8-11ed-860b-4fd7293e59c1 ``` ## Testing To view the audit log message add these fields to your `kibana.dev.yml` file ``` xpack.security.audit.enabled: true xpack.security.audit.appender.type: 'console' xpack.security.audit.appender.layout.type: 'pattern' xpack.security.audit.appender.layout.highlight: true ``` Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../common/api/cases/user_actions/common.ts | 3 - .../cases/server/client/attachments/delete.ts | 2 - .../cases/server/client/cases/create.ts | 2 - .../cases/server/client/cases/delete.ts | 70 +- .../plugins/cases/server/client/cases/push.ts | 2 - .../cases/server/client/cases/update.ts | 2 - x-pack/plugins/cases/server/client/factory.ts | 19 +- .../cases/server/client/metrics/connectors.ts | 2 - .../cases/server/client/metrics/lifespan.ts | 2 - .../cases/server/client/user_actions/get.ts | 6 +- .../common/models/case_with_comments.ts | 3 - .../server/services/attachments/index.ts | 37 + .../cases/server/services/cases/index.ts | 17 + x-pack/plugins/cases/server/services/mocks.ts | 6 +- .../__snapshots__/audit_logger.test.ts.snap | 116 ++ .../__snapshots__/index.test.ts.snap | 70 + .../services/user_actions/abstract_builder.ts | 7 +- .../user_actions/audit_logger.test.ts | 49 + .../services/user_actions/audit_logger.ts | 44 + .../user_actions/builder_factory.test.ts | 1657 +++++++++++------ .../user_actions/builders/assignees.ts | 44 +- .../builders/audit_logger_utils.ts | 18 + .../services/user_actions/builders/comment.ts | 36 +- .../user_actions/builders/connector.ts | 27 +- .../user_actions/builders/create_case.ts | 26 +- .../user_actions/builders/delete_case.ts | 36 +- .../user_actions/builders/description.ts | 27 +- .../services/user_actions/builders/pushed.ts | 27 +- .../user_actions/builders/settings.ts | 27 +- .../user_actions/builders/severity.ts | 27 +- .../services/user_actions/builders/status.ts | 27 +- .../services/user_actions/builders/tags.ts | 41 +- .../services/user_actions/builders/title.ts | 27 +- .../services/user_actions/index.test.ts | 706 ++++++- .../server/services/user_actions/index.ts | 310 +-- .../server/services/user_actions/types.ts | 15 +- .../tests/common/cases/delete_cases.ts | 37 +- .../user_actions/get_all_user_actions.ts | 11 +- 38 files changed, 2617 insertions(+), 968 deletions(-) create mode 100644 x-pack/plugins/cases/server/services/user_actions/__snapshots__/audit_logger.test.ts.snap create mode 100644 x-pack/plugins/cases/server/services/user_actions/__snapshots__/index.test.ts.snap create mode 100644 x-pack/plugins/cases/server/services/user_actions/audit_logger.test.ts create mode 100644 x-pack/plugins/cases/server/services/user_actions/audit_logger.ts create mode 100644 x-pack/plugins/cases/server/services/user_actions/builders/audit_logger_utils.ts diff --git a/x-pack/plugins/cases/common/api/cases/user_actions/common.ts b/x-pack/plugins/cases/common/api/cases/user_actions/common.ts index 5297d2ca46833..62ab22f29b7db 100644 --- a/x-pack/plugins/cases/common/api/cases/user_actions/common.ts +++ b/x-pack/plugins/cases/common/api/cases/user_actions/common.ts @@ -34,9 +34,6 @@ export const Actions = { push_to_service: 'push_to_service', } as const; -export type ActionOperationKeys = keyof typeof Actions; -export type ActionOperationValues = typeof Actions[ActionOperationKeys]; - /* To the next developer, if you add/removed fields here * make sure to check this file (x-pack/plugins/cases/server/services/user_actions/helpers.ts) too */ diff --git a/x-pack/plugins/cases/server/client/attachments/delete.ts b/x-pack/plugins/cases/server/client/attachments/delete.ts index 3a1ad6a358b69..28fcaa9219243 100644 --- a/x-pack/plugins/cases/server/client/attachments/delete.ts +++ b/x-pack/plugins/cases/server/client/attachments/delete.ts @@ -87,7 +87,6 @@ export async function deleteAll( }); await userActionService.bulkCreateAttachmentDeletion({ - unsecuredSavedObjectsClient, caseId: caseID, attachments: comments.saved_objects.map((comment) => ({ id: comment.id, @@ -154,7 +153,6 @@ export async function deleteComment( await userActionService.createUserAction({ type: ActionTypes.comment, action: Actions.delete, - unsecuredSavedObjectsClient, caseId: id, attachmentId: attachmentID, payload: { attachment: { ...myComment.attributes } }, diff --git a/x-pack/plugins/cases/server/client/cases/create.ts b/x-pack/plugins/cases/server/client/cases/create.ts index 7a249400ccf8d..0da0f42b93f2f 100644 --- a/x-pack/plugins/cases/server/client/cases/create.ts +++ b/x-pack/plugins/cases/server/client/cases/create.ts @@ -40,7 +40,6 @@ export const create = async ( clientArgs: CasesClientArgs ): Promise => { const { - unsecuredSavedObjectsClient, services: { caseService, userActionService, licensingService, notificationService }, user, logger, @@ -105,7 +104,6 @@ export const create = async ( await userActionService.createUserAction({ type: ActionTypes.create_case, - unsecuredSavedObjectsClient, caseId: newCase.id, user, payload: { diff --git a/x-pack/plugins/cases/server/client/cases/delete.ts b/x-pack/plugins/cases/server/client/cases/delete.ts index 7f09bb46288c2..0b7a6a6839e5c 100644 --- a/x-pack/plugins/cases/server/client/cases/delete.ts +++ b/x-pack/plugins/cases/server/client/cases/delete.ts @@ -5,11 +5,13 @@ * 2.0. */ -import pMap from 'p-map'; import { Boom } from '@hapi/boom'; -import type { SavedObjectsFindResponse } from '@kbn/core/server'; -import type { CommentAttributes } from '../../../common/api'; -import { MAX_CONCURRENT_SEARCHES } from '../../../common/constants'; +import type { SavedObjectsBulkDeleteObject } from '@kbn/core/server'; +import { + CASE_COMMENT_SAVED_OBJECT, + CASE_SAVED_OBJECT, + CASE_USER_ACTION_SAVED_OBJECT, +} from '../../../common/constants'; import type { CasesClientArgs } from '..'; import { createCaseError } from '../../common/error'; import type { OwnerEntity } from '../../authorization'; @@ -23,7 +25,6 @@ import { Operations } from '../../authorization'; export async function deleteCases(ids: string[], clientArgs: CasesClientArgs): Promise { const { unsecuredSavedObjectsClient, - user, services: { caseService, attachmentService, userActionService }, logger, authorization, @@ -49,56 +50,27 @@ export async function deleteCases(ids: string[], clientArgs: CasesClientArgs): P entities: Array.from(entities.values()), }); - const deleteCasesMapper = async (id: string) => - caseService.deleteCase({ - id, - refresh: false, - }); - - // Ensuring we don't too many concurrent deletions running. - await pMap(ids, deleteCasesMapper, { - concurrency: MAX_CONCURRENT_SEARCHES, + const attachmentIds = await attachmentService.getAttachmentIdsForCases({ + caseIds: ids, + unsecuredSavedObjectsClient, }); - const getCommentsMapper = async (id: string) => - caseService.getAllCaseComments({ - id, - }); - - // Ensuring we don't too many concurrent get running. - const comments = await pMap(ids, getCommentsMapper, { - concurrency: MAX_CONCURRENT_SEARCHES, - }); + const userActionIds = await userActionService.getUserActionIdsForCases(ids); - /** - * This is a nested pMap.Mapper. - * Each element of the comments array contains all comments of a particular case. - * For that reason we need first to create a map that iterate over all cases - * and return a pMap that deletes the comments for that case - */ - const deleteCommentsMapper = async (commentRes: SavedObjectsFindResponse) => - pMap(commentRes.saved_objects, (comment) => - attachmentService.delete({ - unsecuredSavedObjectsClient, - attachmentId: comment.id, - refresh: false, - }) - ); + const bulkDeleteEntities: SavedObjectsBulkDeleteObject[] = [ + ...ids.map((id) => ({ id, type: CASE_SAVED_OBJECT })), + ...attachmentIds.map((id) => ({ id, type: CASE_COMMENT_SAVED_OBJECT })), + ...userActionIds.map((id) => ({ id, type: CASE_USER_ACTION_SAVED_OBJECT })), + ]; - // Ensuring we don't too many concurrent deletions running. - await pMap(comments, deleteCommentsMapper, { - concurrency: MAX_CONCURRENT_SEARCHES, + await caseService.bulkDeleteCaseEntities({ + entities: bulkDeleteEntities, + options: { refresh: 'wait_for' }, }); - await userActionService.bulkCreateCaseDeletion({ - unsecuredSavedObjectsClient, - cases: cases.saved_objects.map((caseInfo) => ({ - id: caseInfo.id, - owner: caseInfo.attributes.owner, - connectorId: caseInfo.attributes.connector.id, - })), - user, - }); + await userActionService.bulkAuditLogCaseDeletion( + cases.saved_objects.map((caseInfo) => caseInfo.id) + ); } catch (error) { throw createCaseError({ message: `Failed to delete cases ids: ${JSON.stringify(ids)}: ${error}`, diff --git a/x-pack/plugins/cases/server/client/cases/push.ts b/x-pack/plugins/cases/server/client/cases/push.ts index 2e020677faa6f..9f5e9adbb4815 100644 --- a/x-pack/plugins/cases/server/client/cases/push.ts +++ b/x-pack/plugins/cases/server/client/cases/push.ts @@ -259,7 +259,6 @@ export const push = async ( if (shouldMarkAsClosed) { await userActionService.createUserAction({ type: ActionTypes.status, - unsecuredSavedObjectsClient, payload: { status: CaseStatuses.closed }, user, caseId, @@ -274,7 +273,6 @@ export const push = async ( await userActionService.createUserAction({ type: ActionTypes.pushed, - unsecuredSavedObjectsClient, payload: { externalService }, user, caseId, diff --git a/x-pack/plugins/cases/server/client/cases/update.ts b/x-pack/plugins/cases/server/client/cases/update.ts index 3d6c595a55e03..6a304bf12e3e6 100644 --- a/x-pack/plugins/cases/server/client/cases/update.ts +++ b/x-pack/plugins/cases/server/client/cases/update.ts @@ -305,7 +305,6 @@ export const update = async ( clientArgs: CasesClientArgs ): Promise => { const { - unsecuredSavedObjectsClient, services: { caseService, userActionService, @@ -446,7 +445,6 @@ export const update = async ( }, [] as CaseResponse[]); await userActionService.bulkCreateUpdateCase({ - unsecuredSavedObjectsClient, originalCases: myCases.saved_objects, updatedCases: updatedCases.saved_objects, user, diff --git a/x-pack/plugins/cases/server/client/factory.ts b/x-pack/plugins/cases/server/client/factory.ts index b054903c8a2d0..9816f8444e399 100644 --- a/x-pack/plugins/cases/server/client/factory.ts +++ b/x-pack/plugins/cases/server/client/factory.ts @@ -14,7 +14,11 @@ import type { IBasePath, } from '@kbn/core/server'; import { SECURITY_EXTENSION_ID } from '@kbn/core-saved-objects-server'; -import type { SecurityPluginSetup, SecurityPluginStart } from '@kbn/security-plugin/server'; +import type { + AuditLogger, + SecurityPluginSetup, + SecurityPluginStart, +} from '@kbn/security-plugin/server'; import type { PluginStartContract as FeaturesPluginStart } from '@kbn/features-plugin/server'; import type { PluginStartContract as ActionsPluginStart } from '@kbn/actions-plugin/server'; import type { LensServerPluginSetup } from '@kbn/lens-plugin/server'; @@ -119,6 +123,7 @@ export class CasesClientFactory { unsecuredSavedObjectsClient, esClient: scopedClusterClient, request, + auditLogger, }); const userInfo = await this.getUserInfo(request); @@ -149,10 +154,12 @@ export class CasesClientFactory { unsecuredSavedObjectsClient, esClient, request, + auditLogger, }: { unsecuredSavedObjectsClient: SavedObjectsClientContract; esClient: ElasticsearchClient; request: KibanaRequest; + auditLogger: AuditLogger; }): CasesServices { this.validateInitialization(); @@ -190,10 +197,12 @@ export class CasesClientFactory { caseService, caseConfigureService: new CaseConfigureService(this.logger), connectorMappingsService: new ConnectorMappingsService(this.logger), - userActionService: new CaseUserActionService( - this.logger, - this.options.persistableStateAttachmentTypeRegistry - ), + userActionService: new CaseUserActionService({ + log: this.logger, + persistableStateAttachmentTypeRegistry: this.options.persistableStateAttachmentTypeRegistry, + unsecuredSavedObjectsClient, + auditLogger, + }), attachmentService, licensingService, notificationService, diff --git a/x-pack/plugins/cases/server/client/metrics/connectors.ts b/x-pack/plugins/cases/server/client/metrics/connectors.ts index e5ab7c2856048..5248efb30939e 100644 --- a/x-pack/plugins/cases/server/client/metrics/connectors.ts +++ b/x-pack/plugins/cases/server/client/metrics/connectors.ts @@ -18,7 +18,6 @@ export class Connectors extends SingleCaseBaseHandler { public async compute(): Promise { const { - unsecuredSavedObjectsClient, authorization, services: { userActionService }, logger, @@ -29,7 +28,6 @@ export class Connectors extends SingleCaseBaseHandler { ); const uniqueConnectors = await userActionService.getUniqueConnectors({ - unsecuredSavedObjectsClient, caseId: this.caseId, filter: authorizationFilter, }); diff --git a/x-pack/plugins/cases/server/client/metrics/lifespan.ts b/x-pack/plugins/cases/server/client/metrics/lifespan.ts index e040228622b0b..83e1b32d1bbc3 100644 --- a/x-pack/plugins/cases/server/client/metrics/lifespan.ts +++ b/x-pack/plugins/cases/server/client/metrics/lifespan.ts @@ -26,7 +26,6 @@ export class Lifespan extends SingleCaseBaseHandler { public async compute(): Promise { const { - unsecuredSavedObjectsClient, authorization, services: { userActionService }, logger, @@ -49,7 +48,6 @@ export class Lifespan extends SingleCaseBaseHandler { ); const statusUserActions = await userActionService.findStatusChanges({ - unsecuredSavedObjectsClient, caseId: this.caseId, filter: authorizationFilter, }); diff --git a/x-pack/plugins/cases/server/client/user_actions/get.ts b/x-pack/plugins/cases/server/client/user_actions/get.ts index 835029315e434..3b1addfe7c6c5 100644 --- a/x-pack/plugins/cases/server/client/user_actions/get.ts +++ b/x-pack/plugins/cases/server/client/user_actions/get.ts @@ -18,17 +18,13 @@ export const get = async ( clientArgs: CasesClientArgs ): Promise => { const { - unsecuredSavedObjectsClient, services: { userActionService }, logger, authorization, } = clientArgs; try { - const userActions = await userActionService.getAll({ - unsecuredSavedObjectsClient, - caseId, - }); + const userActions = await userActionService.getAll(caseId); await authorization.ensureAuthorized({ entities: userActions.saved_objects.map((userAction) => ({ diff --git a/x-pack/plugins/cases/server/common/models/case_with_comments.ts b/x-pack/plugins/cases/server/common/models/case_with_comments.ts index 5bff0757af718..1cc40b48d51e6 100644 --- a/x-pack/plugins/cases/server/common/models/case_with_comments.ts +++ b/x-pack/plugins/cases/server/common/models/case_with_comments.ts @@ -185,7 +185,6 @@ export class CaseCommentModel { await this.params.services.userActionService.createUserAction({ type: ActionTypes.comment, action: Actions.update, - unsecuredSavedObjectsClient: this.params.unsecuredSavedObjectsClient, caseId: this.caseInfo.id, attachmentId: comment.id, payload: { attachment: queryRestAttributes }, @@ -339,7 +338,6 @@ export class CaseCommentModel { await this.params.services.userActionService.createUserAction({ type: ActionTypes.comment, action: Actions.create, - unsecuredSavedObjectsClient: this.params.unsecuredSavedObjectsClient, caseId: this.caseInfo.id, attachmentId: comment.id, payload: { @@ -352,7 +350,6 @@ export class CaseCommentModel { private async bulkCreateCommentUserAction(attachments: Array<{ id: string } & CommentRequest>) { await this.params.services.userActionService.bulkCreateAttachmentCreation({ - unsecuredSavedObjectsClient: this.params.unsecuredSavedObjectsClient, caseId: this.caseInfo.id, attachments: attachments.map(({ id, ...attachment }) => ({ id, diff --git a/x-pack/plugins/cases/server/services/attachments/index.ts b/x-pack/plugins/cases/server/services/attachments/index.ts index 325038b016c45..bda8ab9333b1c 100644 --- a/x-pack/plugins/cases/server/services/attachments/index.ts +++ b/x-pack/plugins/cases/server/services/attachments/index.ts @@ -100,6 +100,43 @@ export class AttachmentService { private readonly persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry ) {} + public async getAttachmentIdsForCases({ + caseIds, + unsecuredSavedObjectsClient, + }: { + caseIds: string[]; + unsecuredSavedObjectsClient: SavedObjectsClientContract; + }) { + try { + this.log.debug(`Attempting to retrieve attachments associated with cases: [${caseIds}]`); + + const finder = unsecuredSavedObjectsClient.createPointInTimeFinder({ + type: CASE_COMMENT_SAVED_OBJECT, + hasReference: caseIds.map((id) => ({ id, type: CASE_SAVED_OBJECT })), + sortField: 'created_at', + sortOrder: 'asc', + /** + * We only care about the ids so to reduce the data returned we should limit the fields in the response. Core + * doesn't support retrieving no fields (id would always be returned anyway) so to limit it we'll only request + * the owner even though we don't need it. + */ + fields: ['owner'], + perPage: MAX_DOCS_PER_PAGE, + }); + + const ids: string[] = []; + + for await (const attachmentSavedObject of finder.find()) { + ids.push(...attachmentSavedObject.saved_objects.map((attachment) => attachment.id)); + } + + return ids; + } catch (error) { + this.log.error(`Error retrieving attachments associated with cases: [${caseIds}]: ${error}`); + throw error; + } + } + public async countAlertsAttachedToCase( params: AlertsAttachedToCaseArgs ): Promise { diff --git a/x-pack/plugins/cases/server/services/cases/index.ts b/x-pack/plugins/cases/server/services/cases/index.ts index 1ab431f85ba3c..86d89ff4ef869 100644 --- a/x-pack/plugins/cases/server/services/cases/index.ts +++ b/x-pack/plugins/cases/server/services/cases/index.ts @@ -15,6 +15,8 @@ import type { SavedObjectsUpdateResponse, SavedObjectsResolveResponse, SavedObjectsFindOptions, + SavedObjectsBulkDeleteObject, + SavedObjectsBulkDeleteOptions, } from '@kbn/core/server'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; @@ -308,6 +310,21 @@ export class CasesService { } } + public async bulkDeleteCaseEntities({ + entities, + options, + }: { + entities: SavedObjectsBulkDeleteObject[]; + options?: SavedObjectsBulkDeleteOptions; + }) { + try { + this.log.debug(`Attempting to bulk delete case entities ${JSON.stringify(entities)}`); + return await this.unsecuredSavedObjectsClient.bulkDelete(entities, options); + } catch (error) { + this.log.error(`Error bulk deleting case entities ${JSON.stringify(entities)}: ${error}`); + } + } + public async getCase({ id: caseId }: GetCaseArgs): Promise { try { this.log.debug(`Attempting to GET case ${caseId}`); diff --git a/x-pack/plugins/cases/server/services/mocks.ts b/x-pack/plugins/cases/server/services/mocks.ts index 46b9cd12830c5..125fbc7ec9650 100644 --- a/x-pack/plugins/cases/server/services/mocks.ts +++ b/x-pack/plugins/cases/server/services/mocks.ts @@ -75,16 +75,15 @@ export const connectorMappingsServiceMock = (): ConnectorMappingsServiceMock => export const createUserActionServiceMock = (): CaseUserActionServiceMock => { const service: PublicMethodsOf = { - bulkCreateCaseDeletion: jest.fn(), + bulkAuditLogCaseDeletion: jest.fn(), bulkCreateUpdateCase: jest.fn(), bulkCreateAttachmentDeletion: jest.fn(), bulkCreateAttachmentCreation: jest.fn(), createUserAction: jest.fn(), - create: jest.fn(), getAll: jest.fn(), - bulkCreate: jest.fn(), findStatusChanges: jest.fn(), getUniqueConnectors: jest.fn(), + getUserActionIdsForCases: jest.fn(), }; // the cast here is required because jest.Mocked tries to include private members and would throw an error @@ -117,6 +116,7 @@ export const createAttachmentServiceMock = (): AttachmentServiceMock => { getCaseCommentStats: jest.fn(), valueCountAlertsAttachedToCase: jest.fn(), executeCaseAggregations: jest.fn(), + getAttachmentIdsForCases: jest.fn(), }; // the cast here is required because jest.Mocked tries to include private members and would throw an error diff --git a/x-pack/plugins/cases/server/services/user_actions/__snapshots__/audit_logger.test.ts.snap b/x-pack/plugins/cases/server/services/user_actions/__snapshots__/audit_logger.test.ts.snap new file mode 100644 index 0000000000000..b419945a73616 --- /dev/null +++ b/x-pack/plugins/cases/server/services/user_actions/__snapshots__/audit_logger.test.ts.snap @@ -0,0 +1,116 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`UserActionAuditLogger logs add user action as event.type change 1`] = ` +Array [ + Object { + "event": Object { + "action": "action", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "123", + "type": "type", + }, + }, + "message": "id: idParam", + }, +] +`; + +exports[`UserActionAuditLogger logs create user action as event.type creation 1`] = ` +Array [ + Object { + "event": Object { + "action": "action", + "category": Array [ + "database", + ], + "type": Array [ + "creation", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "123", + "type": "type", + }, + }, + "message": "id: idParam", + }, +] +`; + +exports[`UserActionAuditLogger logs delete user action as event.type deletion 1`] = ` +Array [ + Object { + "event": Object { + "action": "action", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "123", + "type": "type", + }, + }, + "message": "id: idParam", + }, +] +`; + +exports[`UserActionAuditLogger logs push_to_service user action as event.type creation 1`] = ` +Array [ + Object { + "event": Object { + "action": "action", + "category": Array [ + "database", + ], + "type": Array [ + "creation", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "123", + "type": "type", + }, + }, + "message": "id: idParam", + }, +] +`; + +exports[`UserActionAuditLogger logs update user action as event.type change 1`] = ` +Array [ + Object { + "event": Object { + "action": "action", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "123", + "type": "type", + }, + }, + "message": "id: idParam", + }, +] +`; diff --git a/x-pack/plugins/cases/server/services/user_actions/__snapshots__/index.test.ts.snap b/x-pack/plugins/cases/server/services/user_actions/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000000000..6a576b04bc547 --- /dev/null +++ b/x-pack/plugins/cases/server/services/user_actions/__snapshots__/index.test.ts.snap @@ -0,0 +1,70 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CaseUserActionService methods createUserAction create case comment logs a comment user action of action: create 1`] = ` +Array [ + Object { + "event": Object { + "action": "case_user_action_create_comment", + "category": Array [ + "database", + ], + "type": Array [ + "creation", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "test-id", + "type": "cases-comments", + }, + }, + "message": "User created comment id: test-id for case id: 123 - user action id: created_user_action_id", + }, +] +`; + +exports[`CaseUserActionService methods createUserAction create case comment logs a comment user action of action: delete 1`] = ` +Array [ + Object { + "event": Object { + "action": "case_user_action_delete_comment", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "test-id", + "type": "cases-comments", + }, + }, + "message": "User deleted comment id: test-id for case id: 123 - user action id: created_user_action_id", + }, +] +`; + +exports[`CaseUserActionService methods createUserAction create case comment logs a comment user action of action: update 1`] = ` +Array [ + Object { + "event": Object { + "action": "case_user_action_update_comment", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "test-id", + "type": "cases-comments", + }, + }, + "message": "User changed comment id: test-id for case id: 123 - user action id: created_user_action_id", + }, +] +`; diff --git a/x-pack/plugins/cases/server/services/user_actions/abstract_builder.ts b/x-pack/plugins/cases/server/services/user_actions/abstract_builder.ts index 30f66bd9ece67..bbade0dbb74cd 100644 --- a/x-pack/plugins/cases/server/services/user_actions/abstract_builder.ts +++ b/x-pack/plugins/cases/server/services/user_actions/abstract_builder.ts @@ -19,9 +19,10 @@ import { ActionTypes, NONE_CONNECTOR_ID } from '../../../common/api'; import type { BuilderDeps, BuilderParameters, - BuilderReturnValue, CommonBuilderArguments, + SavedObjectParameters, UserActionParameters, + UserActionEvent, } from './types'; import type { PersistableStateAttachmentTypeRegistry } from '../../attachment_framework/persistable_state_registry'; @@ -98,7 +99,7 @@ export abstract class UserActionBuilder { attachmentId, connectorId, type, - }: CommonBuilderArguments): BuilderReturnValue => { + }: CommonBuilderArguments): SavedObjectParameters => { return { attributes: { ...this.getCommonUserActionAttributes({ user, owner }), @@ -121,5 +122,5 @@ export abstract class UserActionBuilder { public abstract build( args: UserActionParameters - ): BuilderReturnValue; + ): UserActionEvent; } diff --git a/x-pack/plugins/cases/server/services/user_actions/audit_logger.test.ts b/x-pack/plugins/cases/server/services/user_actions/audit_logger.test.ts new file mode 100644 index 0000000000000..6c8d02a80c20f --- /dev/null +++ b/x-pack/plugins/cases/server/services/user_actions/audit_logger.test.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Actions } from '../../../common/api'; +import type { AuditLogger } from '@kbn/security-plugin/server'; +import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks'; +import { UserActionAuditLogger } from './audit_logger'; +import type { EventDetails } from './types'; + +describe('UserActionAuditLogger', () => { + let mockLogger: jest.Mocked; + + beforeEach(() => { + mockLogger = auditLoggerMock.create(); + }); + + it.each([ + [Actions.add, 'change'], + [Actions.create, 'creation'], + [Actions.delete, 'deletion'], + [Actions.push_to_service, 'creation'], + [Actions.update, 'change'], + ])('logs %s user action as event.type %s', (action, type) => { + const eventDetails: EventDetails = { + getMessage: (id?: string) => `id: ${id}`, + action, + descriptiveAction: 'action', + savedObjectId: '123', + savedObjectType: 'type', + }; + + const logger = new UserActionAuditLogger(mockLogger); + logger.log(eventDetails, 'idParam'); + + expect(mockLogger.log.mock.calls[0]).toMatchSnapshot(); + }); + + it('does not call the internal audit logger when the event details are undefined', () => { + const logger = new UserActionAuditLogger(mockLogger); + + logger.log(); + + expect(mockLogger.log).not.toBeCalled(); + }); +}); diff --git a/x-pack/plugins/cases/server/services/user_actions/audit_logger.ts b/x-pack/plugins/cases/server/services/user_actions/audit_logger.ts new file mode 100644 index 0000000000000..adbe29901b9fd --- /dev/null +++ b/x-pack/plugins/cases/server/services/user_actions/audit_logger.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { EcsEventType } from '@kbn/logging'; +import type { AuditLogger } from '@kbn/security-plugin/server'; +import type { UserAction as Action } from '../../../common/api'; +import type { EventDetails } from './types'; + +const actionsToEcsType: Record = { + add: 'change', + delete: 'deletion', + create: 'creation', + push_to_service: 'creation', + update: 'change', +}; + +export class UserActionAuditLogger { + constructor(private readonly auditLogger: AuditLogger) {} + + public log(event?: EventDetails, storedUserActionId?: string) { + if (!event) { + return; + } + + this.auditLogger.log({ + message: event.getMessage(storedUserActionId), + event: { + action: event.descriptiveAction, + category: ['database'], + type: [actionsToEcsType[event.action]], + }, + kibana: { + saved_object: { + type: event.savedObjectType, + id: event.savedObjectId, + }, + }, + }); + } +} diff --git a/x-pack/plugins/cases/server/services/user_actions/builder_factory.test.ts b/x-pack/plugins/cases/server/services/user_actions/builder_factory.test.ts index 5ffd8a2e670a2..b1a0bb24007f0 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builder_factory.test.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builder_factory.test.ts @@ -25,12 +25,19 @@ import { casePayload, externalService } from './mocks'; describe('UserActionBuilder', () => { const persistableStateAttachmentTypeRegistry = createPersistableStateAttachmentTypeRegistryMock(); - const builderFactory = new BuilderFactory({ persistableStateAttachmentTypeRegistry }); const commonArgs = { caseId: '123', user: { full_name: 'Elastic User', username: 'elastic', email: 'elastic@elastic.co' }, owner: SECURITY_SOLUTION_OWNER, }; + let builderFactory: BuilderFactory; + + beforeEach(() => { + jest.clearAllMocks(); + builderFactory = new BuilderFactory({ + persistableStateAttachmentTypeRegistry, + }); + }); beforeAll(() => { jest.useFakeTimers(); @@ -41,690 +48,1134 @@ describe('UserActionBuilder', () => { jest.useRealTimers(); }); - it('builds a title user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.title)!; - const userAction = builder.build({ - payload: { title: 'test' }, - ...commonArgs, - }); + describe('parameters', () => { + it('builds a title user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.title)!; + const userAction = builder.build({ + payload: { title: 'test' }, + ...commonArgs, + }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { - "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "title": "test", + }, + "type": "title", }, - "owner": "securitySolution", - "payload": Object { - "title": "test", + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + ], + } + `); + }); + + it('builds a connector user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.connector)!; + const userAction = builder.build({ + payload: { + connector: { + id: '456', + name: 'ServiceNow SN', + type: ConnectorTypes.serviceNowSIR, + fields: { + category: 'Denial of Service', + destIp: true, + malwareHash: true, + malwareUrl: true, + priority: '2', + sourceIp: true, + subcategory: '45', + }, }, - "type": "title", }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - ], - } - `); - }); + ...commonArgs, + }); - it('builds a connector user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.connector)!; - const userAction = builder.build({ - payload: { - connector: { - id: '456', - name: 'ServiceNow SN', - type: ConnectorTypes.serviceNowSIR, - fields: { - category: 'Denial of Service', - destIp: true, - malwareHash: true, - malwareUrl: true, - priority: '2', - sourceIp: true, - subcategory: '45', + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "connector": Object { + "fields": Object { + "category": "Denial of Service", + "destIp": true, + "malwareHash": true, + "malwareUrl": true, + "priority": "2", + "sourceIp": true, + "subcategory": "45", + }, + "name": "ServiceNow SN", + "type": ".servicenow-sir", + }, + }, + "type": "connector", }, - }, - }, - ...commonArgs, + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + Object { + "id": "456", + "name": "connectorId", + "type": "action", + }, + ], + } + `); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { - "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", + it('builds a comment user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.comment)!; + const userAction = builder.build({ + action: Actions.update, + payload: { + attachment: { + comment: 'a comment!', + type: CommentType.user, + owner: SECURITY_SOLUTION_OWNER, }, - "owner": "securitySolution", - "payload": Object { - "connector": Object { - "fields": Object { - "category": "Denial of Service", - "destIp": true, - "malwareHash": true, - "malwareUrl": true, - "priority": "2", - "sourceIp": true, - "subcategory": "45", + }, + attachmentId: 'test-id', + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "comment": Object { + "comment": "a comment!", + "owner": "securitySolution", + "type": "user", }, - "name": "ServiceNow SN", - "type": ".servicenow-sir", }, + "type": "comment", }, - "type": "connector", + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + Object { + "id": "test-id", + "name": "associated-cases-comments", + "type": "cases-comments", + }, + ], + } + `); + }); + + it('builds an external reference attachment (savedObject) user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.comment)!; + const userAction = builder.build({ + action: Actions.update, + payload: { + attachment: externalReferenceAttachmentSO, }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - Object { - "id": "456", - "name": "connectorId", - "type": "action", + attachmentId: 'test-id', + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "comment": Object { + "externalReferenceAttachmentTypeId": ".test", + "externalReferenceMetadata": null, + "externalReferenceStorage": Object { + "soType": "test-so", + "type": "savedObject", + }, + "owner": "securitySolution", + "type": "externalReference", + }, + }, + "type": "comment", }, - ], - } - `); - }); + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + Object { + "id": "test-id", + "name": "associated-cases-comments", + "type": "cases-comments", + }, + Object { + "id": "my-id", + "name": "externalReferenceId", + "type": "test-so", + }, + ], + } + `); + }); - it('builds a comment user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.comment)!; - const userAction = builder.build({ - action: Actions.update, - payload: { - attachment: { - comment: 'a comment!', - type: CommentType.user, - owner: SECURITY_SOLUTION_OWNER, + it('builds an external reference attachment (elasticSearchDoc) user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.comment)!; + const userAction = builder.build({ + action: Actions.update, + payload: { + attachment: externalReferenceAttachmentES, }, - }, - attachmentId: 'test-id', - ...commonArgs, - }); + attachmentId: 'test-id', + ...commonArgs, + }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { - "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "comment": Object { - "comment": "a comment!", - "owner": "securitySolution", - "type": "user", + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", }, + "owner": "securitySolution", + "payload": Object { + "comment": Object { + "externalReferenceAttachmentTypeId": ".test", + "externalReferenceId": "my-id", + "externalReferenceMetadata": null, + "externalReferenceStorage": Object { + "type": "elasticSearchDoc", + }, + "owner": "securitySolution", + "type": "externalReference", + }, + }, + "type": "comment", }, - "type": "comment", + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + Object { + "id": "test-id", + "name": "associated-cases-comments", + "type": "cases-comments", + }, + ], + } + `); + }); + + it('builds a persistable state attachment user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.comment)!; + const userAction = builder.build({ + action: Actions.update, + payload: { + attachment: persistableStateAttachment, }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - Object { - "id": "test-id", - "name": "associated-cases-comments", - "type": "cases-comments", - }, - ], - } - `); - }); + attachmentId: 'test-id', + ...commonArgs, + }); - it('builds an external reference attachment (savedObject) user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.comment)!; - const userAction = builder.build({ - action: Actions.update, - payload: { - attachment: externalReferenceAttachmentSO, - }, - attachmentId: 'test-id', - ...commonArgs, + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "comment": Object { + "owner": "securitySolutionFixture", + "persistableStateAttachmentState": Object { + "foo": "foo", + }, + "persistableStateAttachmentTypeId": ".test", + "type": "persistableState", + }, + }, + "type": "comment", + }, + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + Object { + "id": "test-id", + "name": "associated-cases-comments", + "type": "cases-comments", + }, + Object { + "id": "testRef", + "name": "myTestReference", + "type": "test-so", + }, + ], + } + `); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { - "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", + it('builds a description user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.description)!; + const userAction = builder.build({ + payload: { description: 'test' }, + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "description": "test", + }, + "type": "description", }, - "owner": "securitySolution", - "payload": Object { - "comment": Object { - "externalReferenceAttachmentTypeId": ".test", - "externalReferenceMetadata": null, - "externalReferenceStorage": Object { - "soType": "test-so", - "type": "savedObject", + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + ], + } + `); + }); + + it('builds a pushed user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.pushed)!; + const userAction = builder.build({ + payload: { externalService }, + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "push_to_service", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "externalService": Object { + "connector_name": "ServiceNow SN", + "external_id": "external-id", + "external_title": "SIR0010037", + "external_url": "https://dev92273.service-now.com/nav_to.do?uri=sn_si_incident.do?sys_id=external-id", + "pushed_at": "2021-02-03T17:41:26.108Z", + "pushed_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic", + "username": "elastic", + }, }, - "owner": "securitySolution", - "type": "externalReference", }, + "type": "pushed", }, - "type": "comment", - }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + Object { + "id": "456", + "name": "pushConnectorId", + "type": "action", + }, + ], + } + `); + }); + + it('builds a tags user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.tags)!; + const userAction = builder.build({ + action: Actions.add, + payload: { tags: ['one', 'two'] }, + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "add", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "tags": Array [ + "one", + "two", + ], + }, + "type": "tags", }, - Object { - "id": "test-id", - "name": "associated-cases-comments", - "type": "cases-comments", + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + ], + } + `); + }); + + it('builds a status user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.status)!; + const userAction = builder.build({ + payload: { status: CaseStatuses.open }, + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "status": "open", + }, + "type": "status", }, - Object { - "id": "my-id", - "name": "externalReferenceId", - "type": "test-so", + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + ], + } + `); + }); + + it('builds a severity user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.severity)!; + const userAction = builder.build({ + payload: { severity: CaseSeverity.LOW }, + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "severity": "low", + }, + "type": "severity", }, - ], - } - `); - }); + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + ], + } + `); + }); + + it('builds an assign user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.assignees)!; + const userAction = builder.build({ + payload: { assignees: [{ uid: '1' }, { uid: '2' }] }, + ...commonArgs, + }); - it('builds an external reference attachment (elasticSearchDoc) user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.comment)!; - const userAction = builder.build({ - action: Actions.update, - payload: { - attachment: externalReferenceAttachmentES, - }, - attachmentId: 'test-id', - ...commonArgs, + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "add", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "assignees": Array [ + Object { + "uid": "1", + }, + Object { + "uid": "2", + }, + ], + }, + "type": "assignees", + }, + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + ], + } + `); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { - "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", + it('builds a settings user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.settings)!; + const userAction = builder.build({ + payload: { settings: { syncAlerts: true } }, + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "update", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "settings": Object { + "syncAlerts": true, + }, + }, + "type": "settings", }, - "owner": "securitySolution", - "payload": Object { - "comment": Object { - "externalReferenceAttachmentTypeId": ".test", - "externalReferenceId": "my-id", - "externalReferenceMetadata": null, - "externalReferenceStorage": Object { - "type": "elasticSearchDoc", + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + ], + } + `); + }); + + it('builds a create case user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.create_case)!; + const userAction = builder.build({ + payload: casePayload, + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "create", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object { + "assignees": Array [ + Object { + "uid": "1", + }, + ], + "connector": Object { + "fields": Object { + "category": "Denial of Service", + "destIp": true, + "malwareHash": true, + "malwareUrl": true, + "priority": "2", + "sourceIp": true, + "subcategory": "45", + }, + "name": "ServiceNow SN", + "type": ".servicenow-sir", }, + "description": "testing sir", "owner": "securitySolution", - "type": "externalReference", + "settings": Object { + "syncAlerts": true, + }, + "severity": "low", + "status": "open", + "tags": Array [ + "sir", + ], + "title": "Case SIR", }, + "type": "create_case", }, - "type": "comment", - }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - Object { - "id": "test-id", - "name": "associated-cases-comments", - "type": "cases-comments", + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + Object { + "id": "456", + "name": "connectorId", + "type": "action", + }, + ], + } + `); + }); + + it('builds a delete case user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.delete_case)!; + const userAction = builder.build({ + payload: {}, + connectorId: '456', + ...commonArgs, + }); + + expect(userAction.parameters).toMatchInlineSnapshot(` + Object { + "attributes": Object { + "action": "delete", + "created_at": "2022-01-09T22:00:00.000Z", + "created_by": Object { + "email": "elastic@elastic.co", + "full_name": "Elastic User", + "username": "elastic", + }, + "owner": "securitySolution", + "payload": Object {}, + "type": "delete_case", }, - ], - } - `); + "references": Array [ + Object { + "id": "123", + "name": "associated-cases", + "type": "cases", + }, + Object { + "id": "456", + "name": "connectorId", + "type": "action", + }, + ], + } + `); + }); }); - it('builds a persistable state attachment user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.comment)!; - const userAction = builder.build({ - action: Actions.update, - payload: { - attachment: persistableStateAttachment, - }, - attachmentId: 'test-id', - ...commonArgs, - }); + describe('eventDetails', () => { + it('builds a title user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.title)!; + const userAction = builder.build({ + payload: { title: 'test' }, + ...commonArgs, + }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "comment": Object { - "owner": "securitySolutionFixture", - "persistableStateAttachmentState": Object { - "foo": "foo", - }, - "persistableStateAttachmentTypeId": ".test", - "type": "persistableState", + "descriptiveAction": "case_user_action_update_case_title", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User updated the title for case id: 123 - user action id: 123"` + ); + }); + + it('logs a connector user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.connector)!; + const userAction = builder.build({ + payload: { + connector: { + id: '456', + name: 'ServiceNow SN', + type: ConnectorTypes.serviceNowSIR, + fields: { + category: 'Denial of Service', + destIp: true, + malwareHash: true, + malwareUrl: true, + priority: '2', + sourceIp: true, + subcategory: '45', }, }, - "type": "comment", }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - Object { - "id": "test-id", - "name": "associated-cases-comments", - "type": "cases-comments", - }, - Object { - "id": "testRef", - "name": "myTestReference", - "type": "test-so", - }, - ], - } - `); - }); + ...commonArgs, + }); - it('builds a description user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.description)!; - const userAction = builder.build({ - payload: { description: 'test' }, - ...commonArgs, + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "update", + "descriptiveAction": "case_user_action_update_case_connector", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User changed the case connector to id: 456 for case id: 123 - user action id: 123"` + ); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { - "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "description": "test", + it('logs a comment user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.comment)!; + const userAction = builder.build({ + action: Actions.update, + payload: { + attachment: { + comment: 'a comment!', + type: CommentType.user, + owner: SECURITY_SOLUTION_OWNER, }, - "type": "description", }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - ], - } - `); - }); + attachmentId: 'test-id', + ...commonArgs, + }); - it('builds a pushed user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.pushed)!; - const userAction = builder.build({ - payload: { externalService }, - ...commonArgs, + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "update", + "descriptiveAction": "case_user_action_update_comment", + "getMessage": [Function], + "savedObjectId": "test-id", + "savedObjectType": "cases-comments", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User changed comment id: test-id for case id: 123 - user action id: 123"` + ); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { - "action": "push_to_service", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "externalService": Object { - "connector_name": "ServiceNow SN", - "external_id": "external-id", - "external_title": "SIR0010037", - "external_url": "https://dev92273.service-now.com/nav_to.do?uri=sn_si_incident.do?sys_id=external-id", - "pushed_at": "2021-02-03T17:41:26.108Z", - "pushed_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic", - "username": "elastic", - }, - }, - }, - "type": "pushed", + it('logs an external reference attachment (savedObject) user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.comment)!; + const userAction = builder.build({ + action: Actions.create, + payload: { + attachment: externalReferenceAttachmentSO, }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - Object { - "id": "456", - "name": "pushConnectorId", - "type": "action", - }, - ], - } - `); - }); + attachmentId: 'test-id', + ...commonArgs, + }); - it('builds a tags user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.tags)!; - const userAction = builder.build({ - action: Actions.add, - payload: { tags: ['one', 'two'] }, - ...commonArgs, + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "create", + "descriptiveAction": "case_user_action_create_comment", + "getMessage": [Function], + "savedObjectId": "test-id", + "savedObjectType": "cases-comments", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User created comment id: test-id for case id: 123 - user action id: 123"` + ); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { - "action": "add", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "tags": Array [ - "one", - "two", - ], - }, - "type": "tags", + it('logs an external reference attachment (elasticSearchDoc) user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.comment)!; + const userAction = builder.build({ + action: Actions.update, + payload: { + attachment: externalReferenceAttachmentES, }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - ], - } - `); - }); + attachmentId: 'test-id', + ...commonArgs, + }); - it('builds a status user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.status)!; - const userAction = builder.build({ - payload: { status: CaseStatuses.open }, - ...commonArgs, + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "update", + "descriptiveAction": "case_user_action_update_comment", + "getMessage": [Function], + "savedObjectId": "test-id", + "savedObjectType": "cases-comments", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User changed comment id: test-id for case id: 123 - user action id: 123"` + ); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { - "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "status": "open", - }, - "type": "status", + it('logs a persistable state attachment user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.comment)!; + const userAction = builder.build({ + action: Actions.update, + payload: { + attachment: persistableStateAttachment, }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - ], - } - `); - }); + attachmentId: 'test-id', + ...commonArgs, + }); - it('builds a severity user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.severity)!; - const userAction = builder.build({ - payload: { severity: CaseSeverity.LOW }, - ...commonArgs, + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "update", + "descriptiveAction": "case_user_action_update_comment", + "getMessage": [Function], + "savedObjectId": "test-id", + "savedObjectType": "cases-comments", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User changed comment id: test-id for case id: 123 - user action id: 123"` + ); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { + it('logs a description user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.description)!; + const userAction = builder.build({ + payload: { description: 'test' }, + ...commonArgs, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "severity": "low", - }, - "type": "severity", - }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - ], - } - `); - }); + "descriptiveAction": "case_user_action_update_case_description", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User updated the description for case id: 123 - user action id: 123"` + ); + }); + + it('logs a pushed user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.pushed)!; + const userAction = builder.build({ + payload: { externalService }, + ...commonArgs, + }); - it('builds an assign user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.assignees)!; - const userAction = builder.build({ - payload: { assignees: [{ uid: '1' }, { uid: '2' }] }, - ...commonArgs, + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "push_to_service", + "descriptiveAction": "case_user_action_pushed_case", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User pushed case id: 123 to an external service with connector id: 456 - user action id: 123"` + ); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { + it('logs a tags user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.tags)!; + const userAction = builder.build({ + action: Actions.add, + payload: { tags: ['one', 'two'] }, + ...commonArgs, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { "action": "add", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "assignees": Array [ - Object { - "uid": "1", - }, - Object { - "uid": "2", - }, - ], - }, - "type": "assignees", - }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - ], - } - `); - }); + "descriptiveAction": "case_user_action_add_case_tags", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User added tags to case id: 123 - user action id: 123"` + ); + }); - it('builds a settings user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.settings)!; - const userAction = builder.build({ - payload: { settings: { syncAlerts: true } }, - ...commonArgs, + it('logs a tags change user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.tags)!; + const userAction = builder.build({ + action: Actions.update, + payload: { tags: ['one', 'two'] }, + ...commonArgs, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "update", + "descriptiveAction": "case_user_action_update_case_tags", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User changed tags for case id: 123 - user action id: 123"` + ); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { + it('logs a tags delete user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.tags)!; + const userAction = builder.build({ + action: Actions.delete, + payload: { tags: ['one', 'two'] }, + ...commonArgs, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "delete", + "descriptiveAction": "case_user_action_delete_case_tags", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User deleted tags in case id: 123 - user action id: 123"` + ); + }); + + it('logs a status user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.status)!; + const userAction = builder.build({ + payload: { status: CaseStatuses.open }, + ...commonArgs, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { "action": "update", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "settings": Object { - "syncAlerts": true, - }, - }, - "type": "settings", - }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - ], - } - `); - }); + "descriptiveAction": "case_user_action_update_case_status", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User updated the status for case id: 123 - user action id: 123"` + ); + }); + + it('logs a severity user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.severity)!; + const userAction = builder.build({ + payload: { severity: CaseSeverity.LOW }, + ...commonArgs, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "update", + "descriptiveAction": "case_user_action_update_case_severity", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User updated the severity for case id: 123 - user action id: 123"` + ); + }); + + it('logs an assign user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.assignees)!; + const userAction = builder.build({ + payload: { assignees: [{ uid: '1' }, { uid: '2' }] }, + ...commonArgs, + }); - it('builds a create case user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.create_case)!; - const userAction = builder.build({ - payload: casePayload, - ...commonArgs, + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "add", + "descriptiveAction": "case_user_action_add_case_assignees", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User assigned uids: [1,2] to case id: 123 - user action id: 123"` + ); + }); + + it('logs an unassign user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.assignees)!; + const userAction = builder.build({ + payload: { assignees: [{ uid: '1' }, { uid: '2' }] }, + ...commonArgs, + action: Actions.delete, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "delete", + "descriptiveAction": "case_user_action_delete_case_assignees", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User unassigned uids: [1,2] from case id: 123 - user action id: 123"` + ); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { + it('logs an assignee unknown action user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.assignees)!; + const userAction = builder.build({ + payload: { assignees: [{ uid: '1' }, { uid: '2' }] }, + ...commonArgs, + action: Actions.create, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { "action": "create", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object { - "assignees": Array [ - Object { - "uid": "1", - }, - ], - "connector": Object { - "fields": Object { - "category": "Denial of Service", - "destIp": true, - "malwareHash": true, - "malwareUrl": true, - "priority": "2", - "sourceIp": true, - "subcategory": "45", - }, - "name": "ServiceNow SN", - "type": ".servicenow-sir", - }, - "description": "testing sir", - "owner": "securitySolution", - "settings": Object { - "syncAlerts": true, - }, - "severity": "low", - "status": "open", - "tags": Array [ - "sir", - ], - "title": "Case SIR", - }, - "type": "create_case", - }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - Object { - "id": "456", - "name": "connectorId", - "type": "action", - }, - ], - } - `); - }); + "descriptiveAction": "case_user_action_create_case_assignees", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User changed uids: [1,2] for case id: 123 - user action id: 123"` + ); + }); + + it('logs a settings user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.settings)!; + const userAction = builder.build({ + payload: { settings: { syncAlerts: true } }, + ...commonArgs, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "update", + "descriptiveAction": "case_user_action_update_case_settings", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User updated the settings for case id: 123 - user action id: 123"` + ); + }); + + it('logs a create case user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.create_case)!; + const userAction = builder.build({ + payload: casePayload, + ...commonArgs, + }); - it('builds a delete case user action correctly', () => { - const builder = builderFactory.getBuilder(ActionTypes.delete_case)!; - const userAction = builder.build({ - payload: {}, - connectorId: '456', - ...commonArgs, + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { + "action": "create", + "descriptiveAction": "case_user_action_create_case", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User created case id: 123 - user action id: 123"` + ); }); - expect(userAction).toMatchInlineSnapshot(` - Object { - "attributes": Object { + it('logs a delete case user action correctly', () => { + const builder = builderFactory.getBuilder(ActionTypes.delete_case)!; + const userAction = builder.build({ + payload: {}, + connectorId: '456', + ...commonArgs, + }); + + expect(userAction.eventDetails).toMatchInlineSnapshot(` + Object { "action": "delete", - "created_at": "2022-01-09T22:00:00.000Z", - "created_by": Object { - "email": "elastic@elastic.co", - "full_name": "Elastic User", - "username": "elastic", - }, - "owner": "securitySolution", - "payload": Object {}, - "type": "delete_case", - }, - "references": Array [ - Object { - "id": "123", - "name": "associated-cases", - "type": "cases", - }, - Object { - "id": "456", - "name": "connectorId", - "type": "action", - }, - ], - } - `); + "descriptiveAction": "case_user_action_delete_case", + "getMessage": [Function], + "savedObjectId": "123", + "savedObjectType": "cases", + } + `); + expect(userAction.eventDetails.getMessage('123')).toMatchInlineSnapshot( + `"User deleted case id: 123"` + ); + }); }); }); diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/assignees.ts b/x-pack/plugins/cases/server/services/user_actions/builders/assignees.ts index 554f70de71bcf..ffd695e62df37 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/assignees.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/assignees.ts @@ -5,18 +5,54 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; +import type { UserAction } from '../../../../common/api'; import { ActionTypes, Actions } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; export class AssigneesUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'assignees'>): BuilderReturnValue { - return this.buildCommonUserAction({ + build(args: UserActionParameters<'assignees'>): UserActionEvent { + const action = args.action ?? Actions.add; + + const soParams = this.buildCommonUserAction({ ...args, - action: args.action ?? Actions.add, + action, valueKey: 'assignees', value: args.payload.assignees, type: ActionTypes.assignees, }); + + const uids = args.payload.assignees.map((assignee) => assignee.uid); + const verbMessage = getVerbMessage(action, uids); + + const getMessage = (id?: string) => + `User ${verbMessage} case id: ${args.caseId} - user action id: ${id}`; + + const event: EventDetails = { + getMessage, + action, + descriptiveAction: `case_user_action_${action}_case_assignees`, + savedObjectId: args.caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters: soParams, + eventDetails: event, + }; } } + +const getVerbMessage = (action: UserAction, uids: string[]) => { + const uidText = `uids: [${uids}]`; + + switch (action) { + case 'add': + return `assigned ${uidText} to`; + case 'delete': + return `unassigned ${uidText} from`; + default: + return `changed ${uidText} for`; + } +}; diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/audit_logger_utils.ts b/x-pack/plugins/cases/server/services/user_actions/builders/audit_logger_utils.ts new file mode 100644 index 0000000000000..4010c358ce601 --- /dev/null +++ b/x-pack/plugins/cases/server/services/user_actions/builders/audit_logger_utils.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { UserAction as Action } from '../../../../common/api'; + +const actionsToVerbs: Record = { + add: 'added', + delete: 'deleted', + create: 'created', + push_to_service: 'pushed', + update: 'changed', +}; + +export const getPastTenseVerb = (action: Action): string => actionsToVerbs[action]; diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/comment.ts b/x-pack/plugins/cases/server/services/user_actions/builders/comment.ts index a90a8b43b40ae..cce9fe13d4c48 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/comment.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/comment.ts @@ -6,15 +6,17 @@ */ import { uniqBy } from 'lodash'; +import { CASE_COMMENT_SAVED_OBJECT } from '../../../../common/constants'; import { extractPersistableStateReferencesFromSO } from '../../../attachment_framework/so_references'; import type { CommentUserAction } from '../../../../common/api'; import { ActionTypes, Actions } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; import { getAttachmentSOExtractor } from '../../so_references'; +import { getPastTenseVerb } from './audit_logger_utils'; export class CommentUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'comment'>): BuilderReturnValue { + build(args: UserActionParameters<'comment'>): UserActionEvent { const soExtractor = getAttachmentSOExtractor(args.payload.attachment); const { transformedFields, references: refsWithExternalRefId } = soExtractor.extractFieldsToReferences({ @@ -26,20 +28,46 @@ export class CommentUserActionBuilder extends UserActionBuilder { persistableStateAttachmentTypeRegistry: this.persistableStateAttachmentTypeRegistry, }); + const action = args.action ?? Actions.update; + const commentUserAction = this.buildCommonUserAction({ ...args, - action: args.action ?? Actions.update, + action, valueKey: 'comment', value: { ...transformedFields, ...extractedAttributes }, type: ActionTypes.comment, }); - return { + const parameters = { ...commentUserAction, references: uniqBy( [...commentUserAction.references, ...refsWithExternalRefId, ...extractedReferences], 'id' ), }; + + const verb = getPastTenseVerb(action); + + const getMessage = (id?: string) => + `User ${verb} comment id: ${commentId(args.attachmentId)} for case id: ${ + args.caseId + } - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: `case_user_action_${action}_comment`, + savedObjectId: args.attachmentId ?? args.caseId, + savedObjectType: CASE_COMMENT_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } + +const commentId = (id?: string) => { + return id ? id : 'unknown'; +}; diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/connector.ts b/x-pack/plugins/cases/server/services/user_actions/builders/connector.ts index 0009105b964f0..a54bd4cc562e3 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/connector.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/connector.ts @@ -5,19 +5,38 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; import { Actions, ActionTypes } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; export class ConnectorUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'connector'>): BuilderReturnValue { - return this.buildCommonUserAction({ + build(args: UserActionParameters<'connector'>): UserActionEvent { + const action = Actions.update; + + const parameters = this.buildCommonUserAction({ ...args, - action: Actions.update, + action, valueKey: 'connector', value: this.extractConnectorId(args.payload.connector), type: ActionTypes.connector, connectorId: args.payload.connector.id, }); + + const getMessage = (id?: string) => + `User changed the case connector to id: ${args.payload.connector.id} for case id: ${args.caseId} - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: 'case_user_action_update_case_connector', + savedObjectId: args.caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/create_case.ts b/x-pack/plugins/cases/server/services/user_actions/builders/create_case.ts index 6d83e9acb6383..28ba21fc81bf5 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/create_case.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/create_case.ts @@ -5,18 +5,21 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; import { Actions, ActionTypes, CaseStatuses } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; export class CreateCaseUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'create_case'>): BuilderReturnValue { + build(args: UserActionParameters<'create_case'>): UserActionEvent { const { payload, caseId, owner, user } = args; + const action = Actions.create; + const connectorWithoutId = this.extractConnectorId(payload.connector); - return { + const parameters = { attributes: { ...this.getCommonUserActionAttributes({ user, owner }), - action: Actions.create, + action, payload: { ...payload, connector: connectorWithoutId, status: CaseStatuses.open }, type: ActionTypes.create_case, }, @@ -25,5 +28,20 @@ export class CreateCaseUserActionBuilder extends UserActionBuilder { ...this.createConnectorReference(payload.connector.id), ], }; + + const getMessage = (id?: string) => `User created case id: ${caseId} - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: 'case_user_action_create_case', + savedObjectId: caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/delete_case.ts b/x-pack/plugins/cases/server/services/user_actions/builders/delete_case.ts index 2200fcc0af08b..75ec19ef22112 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/delete_case.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/delete_case.ts @@ -5,17 +5,26 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; +import type { UserAction } from '../../../../common/api'; import { Actions, ActionTypes } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { + SavedObjectParameters, + EventDetails, + UserActionParameters, + UserActionEvent, +} from '../types'; export class DeleteCaseUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'delete_case'>): BuilderReturnValue { + build(args: UserActionParameters<'delete_case'>): UserActionEvent { const { caseId, owner, user, connectorId } = args; - return { + const action = Actions.delete; + + const parameters: SavedObjectParameters = { attributes: { ...this.getCommonUserActionAttributes({ user, owner }), - action: Actions.delete, + action, payload: {}, type: ActionTypes.delete_case, }, @@ -24,5 +33,24 @@ export class DeleteCaseUserActionBuilder extends UserActionBuilder { ...this.createConnectorReference(connectorId ?? null), ], }; + + return { + parameters, + eventDetails: createDeleteEvent({ caseId, action }), + }; } } + +export const createDeleteEvent = ({ + caseId, + action, +}: { + caseId: string; + action: UserAction; +}): EventDetails => ({ + getMessage: () => `User deleted case id: ${caseId}`, + action, + descriptiveAction: 'case_user_action_delete_case', + savedObjectId: caseId, + savedObjectType: CASE_SAVED_OBJECT, +}); diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/description.ts b/x-pack/plugins/cases/server/services/user_actions/builders/description.ts index 95e506066ca6e..6f59694d83ab5 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/description.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/description.ts @@ -5,18 +5,37 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; import { Actions, ActionTypes } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; export class DescriptionUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'description'>): BuilderReturnValue { - return this.buildCommonUserAction({ + build(args: UserActionParameters<'description'>): UserActionEvent { + const action = Actions.update; + + const parameters = this.buildCommonUserAction({ ...args, - action: Actions.update, + action, valueKey: 'description', type: ActionTypes.description, value: args.payload.description, }); + + const getMessage = (id?: string) => + `User updated the description for case id: ${args.caseId} - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: 'case_user_action_update_case_description', + savedObjectId: args.caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/pushed.ts b/x-pack/plugins/cases/server/services/user_actions/builders/pushed.ts index 75a53a79de907..5c9fa6a73007f 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/pushed.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/pushed.ts @@ -5,19 +5,38 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; import { Actions, ActionTypes } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; export class PushedUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'pushed'>): BuilderReturnValue { - return this.buildCommonUserAction({ + build(args: UserActionParameters<'pushed'>): UserActionEvent { + const action = Actions.push_to_service; + + const parameters = this.buildCommonUserAction({ ...args, - action: Actions.push_to_service, + action, valueKey: 'externalService', value: this.extractConnectorIdFromExternalService(args.payload.externalService), type: ActionTypes.pushed, connectorId: args.payload.externalService.connector_id, }); + + const getMessage = (id?: string) => + `User pushed case id: ${args.caseId} to an external service with connector id: ${args.payload.externalService.connector_id} - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: 'case_user_action_pushed_case', + savedObjectId: args.caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/settings.ts b/x-pack/plugins/cases/server/services/user_actions/builders/settings.ts index d70f099539d65..0e3d4088fe6e5 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/settings.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/settings.ts @@ -5,18 +5,37 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; import { Actions, ActionTypes } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; export class SettingsUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'settings'>): BuilderReturnValue { - return this.buildCommonUserAction({ + build(args: UserActionParameters<'settings'>): UserActionEvent { + const action = Actions.update; + + const parameters = this.buildCommonUserAction({ ...args, - action: Actions.update, + action, valueKey: 'settings', value: args.payload.settings, type: ActionTypes.settings, }); + + const getMessage = (id?: string) => + `User updated the settings for case id: ${args.caseId} - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: 'case_user_action_update_case_settings', + savedObjectId: args.caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/severity.ts b/x-pack/plugins/cases/server/services/user_actions/builders/severity.ts index 480fc6ffc5014..0319187d4c7ba 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/severity.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/severity.ts @@ -5,18 +5,37 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; import { Actions, ActionTypes } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; export class SeverityUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'severity'>): BuilderReturnValue { - return this.buildCommonUserAction({ + build(args: UserActionParameters<'severity'>): UserActionEvent { + const action = Actions.update; + + const parameters = this.buildCommonUserAction({ ...args, - action: Actions.update, + action, valueKey: 'severity', value: args.payload.severity, type: ActionTypes.severity, }); + + const getMessage = (id?: string) => + `User updated the severity for case id: ${args.caseId} - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: 'case_user_action_update_case_severity', + savedObjectId: args.caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/status.ts b/x-pack/plugins/cases/server/services/user_actions/builders/status.ts index 1b3eaa9455d6b..ae2f6ff61bc94 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/status.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/status.ts @@ -5,18 +5,37 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; import { Actions, ActionTypes } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; export class StatusUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'status'>): BuilderReturnValue { - return this.buildCommonUserAction({ + build(args: UserActionParameters<'status'>): UserActionEvent { + const action = Actions.update; + + const parameters = this.buildCommonUserAction({ ...args, - action: Actions.update, + action, valueKey: 'status', value: args.payload.status, type: ActionTypes.status, }); + + const getMessage = (id?: string) => + `User updated the status for case id: ${args.caseId} - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: 'case_user_action_update_case_status', + savedObjectId: args.caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/tags.ts b/x-pack/plugins/cases/server/services/user_actions/builders/tags.ts index 053c7d3fa91de..1a9066cbbf224 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/tags.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/tags.ts @@ -5,18 +5,53 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; +import type { UserAction } from '../../../../common/api'; import { ActionTypes, Actions } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { UserActionParameters, BuilderReturnValue } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; +import { getPastTenseVerb } from './audit_logger_utils'; export class TagsUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'tags'>): BuilderReturnValue { - return this.buildCommonUserAction({ + build(args: UserActionParameters<'tags'>): UserActionEvent { + const action = args.action ?? Actions.add; + + const parameters = this.buildCommonUserAction({ ...args, action: args.action ?? Actions.add, valueKey: 'tags', value: args.payload.tags, type: ActionTypes.tags, }); + + const verb = getPastTenseVerb(action); + const preposition = getPreposition(action); + + const getMessage = (id?: string) => + `User ${verb} tags ${preposition} case id: ${args.caseId} - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: `case_user_action_${action}_case_tags`, + savedObjectId: args.caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } + +const getPreposition = (action: UserAction): string => { + switch (action) { + case Actions.add: + return 'to'; + case Actions.delete: + return 'in'; + default: + return 'for'; + } +}; diff --git a/x-pack/plugins/cases/server/services/user_actions/builders/title.ts b/x-pack/plugins/cases/server/services/user_actions/builders/title.ts index 3d5251d84b629..1802c38943d3b 100644 --- a/x-pack/plugins/cases/server/services/user_actions/builders/title.ts +++ b/x-pack/plugins/cases/server/services/user_actions/builders/title.ts @@ -5,18 +5,37 @@ * 2.0. */ +import { CASE_SAVED_OBJECT } from '../../../../common/constants'; import { Actions, ActionTypes } from '../../../../common/api'; import { UserActionBuilder } from '../abstract_builder'; -import type { BuilderReturnValue, UserActionParameters } from '../types'; +import type { EventDetails, UserActionParameters, UserActionEvent } from '../types'; export class TitleUserActionBuilder extends UserActionBuilder { - build(args: UserActionParameters<'title'>): BuilderReturnValue { - return this.buildCommonUserAction({ + build(args: UserActionParameters<'title'>): UserActionEvent { + const action = Actions.update; + + const parameters = this.buildCommonUserAction({ ...args, - action: Actions.update, + action, valueKey: 'title', value: args.payload.title, type: ActionTypes.title, }); + + const getMessage = (id?: string) => + `User updated the title for case id: ${args.caseId} - user action id: ${id}`; + + const eventDetails: EventDetails = { + getMessage, + action, + descriptiveAction: 'case_user_action_update_case_title', + savedObjectId: args.caseId, + savedObjectType: CASE_SAVED_OBJECT, + }; + + return { + parameters, + eventDetails, + }; } } diff --git a/x-pack/plugins/cases/server/services/user_actions/index.test.ts b/x-pack/plugins/cases/server/services/user_actions/index.test.ts index bf4ee5a1ea7c2..5ba80b05f7194 100644 --- a/x-pack/plugins/cases/server/services/user_actions/index.test.ts +++ b/x-pack/plugins/cases/server/services/user_actions/index.test.ts @@ -11,11 +11,13 @@ import { savedObjectsClientMock } from '@kbn/core/server/mocks'; import type { SavedObject, SavedObjectReference, + SavedObjectsBulkCreateObject, SavedObjectsFindResponse, SavedObjectsFindResult, SavedObjectsUpdateResponse, } from '@kbn/core/server'; import { ACTION_SAVED_OBJECT_TYPE } from '@kbn/actions-plugin/server'; +import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks'; import type { CaseAttributes, CaseUserActionAttributes, @@ -635,17 +637,38 @@ describe('CaseUserActionService', () => { describe('methods', () => { let service: CaseUserActionService; const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + unsecuredSavedObjectsClient.create.mockResolvedValue({ + id: 'created_user_action_id', + } as SavedObject); + + unsecuredSavedObjectsClient.bulkCreate.mockImplementation( + async (objects: SavedObjectsBulkCreateObject[]) => { + const savedObjects: SavedObject[] = []; + for (let i = 0; i < objects.length; i++) { + savedObjects.push({ id: i } as unknown as SavedObject); + } + + return { + saved_objects: savedObjects, + }; + } + ); const mockLogger = loggerMock.create(); const commonArgs = { - unsecuredSavedObjectsClient, caseId: '123', user: { full_name: 'Elastic User', username: 'elastic', email: 'elastic@elastic.co' }, owner: SECURITY_SOLUTION_OWNER, }; + const mockAuditLogger = auditLoggerMock.create(); beforeEach(() => { jest.clearAllMocks(); - service = new CaseUserActionService(mockLogger, persistableStateAttachmentTypeRegistry); + service = new CaseUserActionService({ + unsecuredSavedObjectsClient, + log: mockLogger, + persistableStateAttachmentTypeRegistry, + auditLogger: mockAuditLogger, + }); }); describe('createUserAction', () => { @@ -702,6 +725,38 @@ describe('CaseUserActionService', () => { ); }); + it('logs a create case user action', async () => { + await service.createUserAction({ + ...commonArgs, + payload: casePayload, + type: ActionTypes.create_case, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(1); + expect(mockAuditLogger.log.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "event": Object { + "action": "case_user_action_create_case", + "category": Array [ + "database", + ], + "type": Array [ + "creation", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "123", + "type": "cases", + }, + }, + "message": "User created case id: 123 - user action id: created_user_action_id", + }, + ] + `); + }); + describe('status', () => { it('creates an update status user action', async () => { await service.createUserAction({ @@ -727,6 +782,38 @@ describe('CaseUserActionService', () => { { references: [{ id: '123', name: 'associated-cases', type: 'cases' }] } ); }); + + it('logs an update status user action', async () => { + await service.createUserAction({ + ...commonArgs, + payload: { status: CaseStatuses.closed }, + type: ActionTypes.status, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(1); + expect(mockAuditLogger.log.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "event": Object { + "action": "case_user_action_update_case_status", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "123", + "type": "cases", + }, + }, + "message": "User updated the status for case id: 123 - user action id: created_user_action_id", + }, + ] + `); + }); }); describe('severity', () => { @@ -754,6 +841,38 @@ describe('CaseUserActionService', () => { { references: [{ id: '123', name: 'associated-cases', type: 'cases' }] } ); }); + + it('logs an update severity user action', async () => { + await service.createUserAction({ + ...commonArgs, + payload: { severity: CaseSeverity.MEDIUM }, + type: ActionTypes.severity, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(1); + expect(mockAuditLogger.log.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "event": Object { + "action": "case_user_action_update_case_severity", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "123", + "type": "cases", + }, + }, + "message": "User updated the severity for case id: 123 - user action id: created_user_action_id", + }, + ] + `); + }); }); describe('push', () => { @@ -800,6 +919,38 @@ describe('CaseUserActionService', () => { } ); }); + + it('logs a push user action', async () => { + await service.createUserAction({ + ...commonArgs, + payload: { externalService }, + type: ActionTypes.pushed, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(1); + expect(mockAuditLogger.log.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "event": Object { + "action": "case_user_action_pushed_case", + "category": Array [ + "database", + ], + "type": Array [ + "creation", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "123", + "type": "cases", + }, + }, + "message": "User pushed case id: 123 to an external service with connector id: 456 - user action id: created_user_action_id", + }, + ] + `); + }); }); describe('comment', () => { @@ -843,64 +994,77 @@ describe('CaseUserActionService', () => { ); } ); + + it.each([[Actions.create], [Actions.delete], [Actions.update]])( + 'logs a comment user action of action: %s', + async (action) => { + await service.createUserAction({ + ...commonArgs, + type: ActionTypes.comment, + action, + attachmentId: 'test-id', + payload: { attachment: comment }, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(1); + expect(mockAuditLogger.log.mock.calls[0]).toMatchSnapshot(); + } + ); }); }); }); - describe('bulkCreateCaseDeletion', () => { - it('creates a delete case user action', async () => { - await service.bulkCreateCaseDeletion({ - unsecuredSavedObjectsClient, - cases: [ - { id: '1', owner: SECURITY_SOLUTION_OWNER, connectorId: '3' }, - { id: '2', owner: SECURITY_SOLUTION_OWNER, connectorId: '4' }, - ], - user: commonArgs.user, - }); + describe('bulkAuditLogCaseDeletion', () => { + it('logs a delete case audit log message', async () => { + await service.bulkAuditLogCaseDeletion(['1', '2']); - expect(unsecuredSavedObjectsClient.bulkCreate).toHaveBeenCalledWith( - [ - { - attributes: { - action: 'delete', - created_at: '2022-01-09T22:00:00.000Z', - created_by: { - email: 'elastic@elastic.co', - full_name: 'Elastic User', - username: 'elastic', + expect(unsecuredSavedObjectsClient.bulkCreate).not.toHaveBeenCalled(); + + expect(mockAuditLogger.log).toHaveBeenCalledTimes(2); + expect(mockAuditLogger.log.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + Object { + "event": Object { + "action": "case_user_action_delete_case", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], }, - type: 'delete_case', - owner: 'securitySolution', - payload: {}, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User deleted case id: 1", }, - references: [ - { id: '1', name: 'associated-cases', type: 'cases' }, - { id: '3', name: 'connectorId', type: 'action' }, - ], - type: 'cases-user-actions', - }, - { - attributes: { - action: 'delete', - created_at: '2022-01-09T22:00:00.000Z', - created_by: { - email: 'elastic@elastic.co', - full_name: 'Elastic User', - username: 'elastic', + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_delete_case", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], }, - type: 'delete_case', - owner: 'securitySolution', - payload: {}, + "kibana": Object { + "saved_object": Object { + "id": "2", + "type": "cases", + }, + }, + "message": "User deleted case id: 2", }, - references: [ - { id: '2', name: 'associated-cases', type: 'cases' }, - { id: '4', name: 'connectorId', type: 'action' }, - ], - type: 'cases-user-actions', - }, - ], - { refresh: undefined } - ); + ], + ] + `); }); }); @@ -1073,6 +1237,181 @@ describe('CaseUserActionService', () => { ); }); + it('logs the correct user actions when bulk updating cases', async () => { + await service.bulkCreateUpdateCase({ + ...commonArgs, + originalCases, + updatedCases, + user: commonArgs.user, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(8); + expect(mockAuditLogger.log.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + Object { + "event": Object { + "action": "case_user_action_update_case_title", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User updated the title for case id: 1 - user action id: 0", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_update_case_status", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User updated the status for case id: 1 - user action id: 1", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_update_case_connector", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User changed the case connector to id: 456 for case id: 1 - user action id: 2", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_update_case_description", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "2", + "type": "cases", + }, + }, + "message": "User updated the description for case id: 2 - user action id: 3", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_add_case_tags", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "2", + "type": "cases", + }, + }, + "message": "User added tags to case id: 2 - user action id: 4", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_delete_case_tags", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "2", + "type": "cases", + }, + }, + "message": "User deleted tags in case id: 2 - user action id: 5", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_update_case_settings", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "2", + "type": "cases", + }, + }, + "message": "User updated the settings for case id: 2 - user action id: 6", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_update_case_severity", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "2", + "type": "cases", + }, + }, + "message": "User updated the severity for case id: 2 - user action id: 7", + }, + ], + ] + `); + }); + it('creates the correct user actions when an assignee is added', async () => { await service.bulkCreateUpdateCase({ ...commonArgs, @@ -1120,6 +1459,41 @@ describe('CaseUserActionService', () => { `); }); + it('logs the correct user actions when an assignee is added', async () => { + await service.bulkCreateUpdateCase({ + ...commonArgs, + originalCases, + updatedCases: updatedAssigneesCases, + user: commonArgs.user, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(1); + expect(mockAuditLogger.log.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + Object { + "event": Object { + "action": "case_user_action_add_case_assignees", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User assigned uids: [1] to case id: 1 - user action id: 0", + }, + ], + ] + `); + }); + it('creates the correct user actions when an assignee is removed', async () => { const casesWithAssigneeRemoved: Array> = [ { @@ -1177,6 +1551,51 @@ describe('CaseUserActionService', () => { `); }); + it('logs the correct user actions when an assignee is removed', async () => { + const casesWithAssigneeRemoved: Array> = [ + { + ...createCaseSavedObjectResponse(), + id: '1', + attributes: { + assignees: [], + }, + }, + ]; + + await service.bulkCreateUpdateCase({ + ...commonArgs, + originalCases: originalCasesWithAssignee, + updatedCases: casesWithAssigneeRemoved, + user: commonArgs.user, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(1); + expect(mockAuditLogger.log.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + Object { + "event": Object { + "action": "case_user_action_delete_case_assignees", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User unassigned uids: [1] from case id: 1 - user action id: 0", + }, + ], + ] + `); + }); + it('creates the correct user actions when assignees are added and removed', async () => { const caseAssignees: Array> = [ { @@ -1262,6 +1681,71 @@ describe('CaseUserActionService', () => { `); }); + it('logs the correct user actions when assignees are added and removed', async () => { + const caseAssignees: Array> = [ + { + ...createCaseSavedObjectResponse(), + id: '1', + attributes: { + assignees: [{ uid: '2' }], + }, + }, + ]; + + await service.bulkCreateUpdateCase({ + ...commonArgs, + originalCases: originalCasesWithAssignee, + updatedCases: caseAssignees, + user: commonArgs.user, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(2); + expect(mockAuditLogger.log.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + Object { + "event": Object { + "action": "case_user_action_add_case_assignees", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User assigned uids: [2] to case id: 1 - user action id: 0", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_delete_case_assignees", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User unassigned uids: [1] from case id: 1 - user action id: 1", + }, + ], + ] + `); + }); + it('creates the correct user actions when tags are added and removed', async () => { await service.bulkCreateUpdateCase({ ...commonArgs, @@ -1333,6 +1817,61 @@ describe('CaseUserActionService', () => { ] `); }); + + it('logs the correct user actions when tags are added and removed', async () => { + await service.bulkCreateUpdateCase({ + ...commonArgs, + originalCases, + updatedCases: updatedTagsCases, + user: commonArgs.user, + }); + + expect(mockAuditLogger.log).toBeCalledTimes(2); + expect(mockAuditLogger.log.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + Object { + "event": Object { + "action": "case_user_action_add_case_tags", + "category": Array [ + "database", + ], + "type": Array [ + "change", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User added tags to case id: 1 - user action id: 0", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_delete_case_tags", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "User deleted tags in case id: 1 - user action id: 1", + }, + ], + ] + `); + }); }); describe('bulkCreateAttachmentDeletion', () => { @@ -1395,20 +1934,58 @@ describe('CaseUserActionService', () => { { refresh: undefined } ); }); - }); - describe('create', () => { - it('creates user actions', async () => { - await service.create<{ title: string }>({ - unsecuredSavedObjectsClient, - attributes: { title: 'test' }, - references: [], + it('logs delete comment user action', async () => { + await service.bulkCreateAttachmentDeletion({ + ...commonArgs, + attachments, }); - expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledWith( - 'cases-user-actions', - { title: 'test' }, - { references: [] } - ); + + expect(mockAuditLogger.log).toBeCalledTimes(2); + expect(mockAuditLogger.log.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + Object { + "event": Object { + "action": "case_user_action_delete_comment", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases-comments", + }, + }, + "message": "User deleted comment id: 1 for case id: 123 - user action id: 0", + }, + ], + Array [ + Object { + "event": Object { + "action": "case_user_action_delete_comment", + "category": Array [ + "database", + ], + "type": Array [ + "deletion", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "2", + "type": "cases-comments", + }, + }, + "message": "User deleted comment id: 2 for case id: 123 - user action id: 1", + }, + ], + ] + `); }); }); @@ -1458,7 +2035,6 @@ describe('CaseUserActionService', () => { it('it returns an empty array if the response is not valid', async () => { const res = await service.getUniqueConnectors({ - unsecuredSavedObjectsClient, caseId: '123', }); @@ -1472,7 +2048,6 @@ describe('CaseUserActionService', () => { } as unknown as Promise); const res = await service.getUniqueConnectors({ - unsecuredSavedObjectsClient, caseId: '123', }); @@ -1485,7 +2060,6 @@ describe('CaseUserActionService', () => { it('it returns the unique connectors', async () => { await service.getUniqueConnectors({ - unsecuredSavedObjectsClient, caseId: '123', }); diff --git a/x-pack/plugins/cases/server/services/user_actions/index.ts b/x-pack/plugins/cases/server/services/user_actions/index.ts index 37642218364b9..c77aed7c6f95f 100644 --- a/x-pack/plugins/cases/server/services/user_actions/index.ts +++ b/x-pack/plugins/cases/server/services/user_actions/index.ts @@ -11,6 +11,7 @@ import type { Logger, SavedObject, SavedObjectReference, + SavedObjectsBulkResponse, SavedObjectsClientContract, SavedObjectsFindResponse, SavedObjectsUpdateResponse, @@ -18,6 +19,7 @@ import type { import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { KueryNode } from '@kbn/es-query'; +import type { AuditLogger } from '@kbn/security-plugin/server'; import { isCommentRequestTypePersistableState } from '../../../common/utils/attachments'; import { isConnectorUserAction, @@ -27,7 +29,6 @@ import { isCommentUserAction, } from '../../../common/utils/user_actions'; import type { - ActionOperationValues, ActionTypeValues, CaseAttributes, CaseUserActionAttributes, @@ -37,6 +38,7 @@ import type { CaseAssignees, CommentRequest, User, + UserAction as Action, } from '../../../common/api'; import { Actions, ActionTypes, NONE_CONNECTOR_ID } from '../../../common/api'; import { @@ -45,7 +47,6 @@ import { MAX_DOCS_PER_PAGE, CASE_COMMENT_SAVED_OBJECT, } from '../../../common/constants'; -import type { ClientArgs } from '..'; import { CASE_REF_NAME, COMMENT_REF_NAME, @@ -56,10 +57,11 @@ import { import { findConnectorIdReference } from '../transform'; import { buildFilter, combineFilters, arraysDifference } from '../../client/utils'; import type { + Attributes, BuilderParameters, - BuilderReturnValue, CommonArguments, CreateUserAction, + UserActionEvent, UserActionParameters, } from './types'; import { BuilderFactory } from './builder_factory'; @@ -69,31 +71,24 @@ import { injectPersistableReferencesToSO } from '../../attachment_framework/so_r import type { IndexRefresh } from '../types'; import { isAssigneesArray, isStringArray } from './type_guards'; import type { CaseSavedObject } from '../../common/types'; - -interface GetCaseUserActionArgs extends ClientArgs { - caseId: string; -} +import { UserActionAuditLogger } from './audit_logger'; +import { createDeleteEvent } from './builders/delete_case'; export interface UserActionItem { attributes: CaseUserActionAttributesWithoutConnectorId; references: SavedObjectReference[]; } -interface PostCaseUserActionArgs extends ClientArgs, IndexRefresh { - actions: BuilderReturnValue[]; +interface PostCaseUserActionArgs extends IndexRefresh { + actions: UserActionEvent[]; } -interface CreateUserActionES extends ClientArgs, IndexRefresh { +interface CreateUserActionES extends IndexRefresh { attributes: T; references: SavedObjectReference[]; } -type CommonUserActionArgs = ClientArgs & CommonArguments; - -interface BulkCreateCaseDeletionUserAction extends ClientArgs, IndexRefresh { - cases: Array<{ id: string; owner: string; connectorId: string }>; - user: User; -} +type CommonUserActionArgs = CommonArguments; interface GetUserActionItemByDifference extends CommonUserActionArgs { field: string; @@ -106,7 +101,7 @@ interface TypedUserActionDiffedItems extends GetUserActionItemByDifference { newValue: T[]; } -interface BulkCreateBulkUpdateCaseUserActions extends ClientArgs, IndexRefresh { +interface BulkCreateBulkUpdateCaseUserActions extends IndexRefresh { originalCases: CaseSavedObject[]; updatedCases: Array>; user: User; @@ -127,20 +122,35 @@ type CreatePayloadFunction = ( export class CaseUserActionService { private static readonly userActionFieldsAllowed: Set = new Set(Object.keys(ActionTypes)); + private readonly unsecuredSavedObjectsClient: SavedObjectsClientContract; private readonly builderFactory: BuilderFactory; + private readonly persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry; + private readonly log: Logger; + private readonly auditLogger: UserActionAuditLogger; + + constructor({ + log, + persistableStateAttachmentTypeRegistry, + unsecuredSavedObjectsClient, + auditLogger, + }: { + log: Logger; + persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry; + unsecuredSavedObjectsClient: SavedObjectsClientContract; + auditLogger: AuditLogger; + }) { + this.log = log; + this.unsecuredSavedObjectsClient = unsecuredSavedObjectsClient; + this.persistableStateAttachmentTypeRegistry = persistableStateAttachmentTypeRegistry; - constructor( - private readonly log: Logger, - private readonly persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry - ) { this.builderFactory = new BuilderFactory({ persistableStateAttachmentTypeRegistry: this.persistableStateAttachmentTypeRegistry, }); + + this.auditLogger = new UserActionAuditLogger(auditLogger); } - private getUserActionItemByDifference( - params: GetUserActionItemByDifference - ): BuilderReturnValue[] { + private getUserActionItemByDifference(params: GetUserActionItemByDifference): UserActionEvent[] { const { field, originalValue, newValue, caseId, owner, user } = params; if (!CaseUserActionService.userActionFieldsAllowed.has(field)) { @@ -228,7 +238,7 @@ export class CaseUserActionService { }: { commonArgs: CommonUserActionArgs; actionType: ActionType; - action: ActionOperationValues; + action: Action; createPayload: CreatePayloadFunction; modifiedItems?: Item[] | null; }) { @@ -251,91 +261,60 @@ export class CaseUserActionService { return userAction; } - public async bulkCreateCaseDeletion({ - unsecuredSavedObjectsClient, - cases, - user, - refresh, - }: BulkCreateCaseDeletionUserAction): Promise { - this.log.debug(`Attempting to create a create case user action`); - const userActionsWithReferences = cases.reduce((acc, caseInfo) => { - const userActionBuilder = this.builderFactory.getBuilder(ActionTypes.delete_case); - const deleteCaseUserAction = userActionBuilder?.build({ - action: Actions.delete, - caseId: caseInfo.id, - user, - owner: caseInfo.owner, - connectorId: caseInfo.connectorId, - payload: {}, - }); - - if (deleteCaseUserAction == null) { - return acc; - } - - return [...acc, deleteCaseUserAction]; - }, []); + public async bulkAuditLogCaseDeletion(caseIds: string[]) { + this.log.debug(`Attempting to log bulk case deletion`); - await this.bulkCreate({ - unsecuredSavedObjectsClient, - actions: userActionsWithReferences, - refresh, - }); + for (const id of caseIds) { + this.auditLogger.log(createDeleteEvent({ caseId: id, action: Actions.delete })); + } } public async bulkCreateUpdateCase({ - unsecuredSavedObjectsClient, originalCases, updatedCases, user, refresh, }: BulkCreateBulkUpdateCaseUserActions): Promise { - const userActionsWithReferences = updatedCases.reduce( - (acc, updatedCase) => { - const originalCase = originalCases.find(({ id }) => id === updatedCase.id); + const builtUserActions = updatedCases.reduce((acc, updatedCase) => { + const originalCase = originalCases.find(({ id }) => id === updatedCase.id); - if (originalCase == null) { - return acc; - } + if (originalCase == null) { + return acc; + } - const caseId = updatedCase.id; - const owner = originalCase.attributes.owner; - - const userActions: BuilderReturnValue[] = []; - const updatedFields = Object.keys(updatedCase.attributes); - - updatedFields - .filter((field) => CaseUserActionService.userActionFieldsAllowed.has(field)) - .forEach((field) => { - const originalValue = get(originalCase, ['attributes', field]); - const newValue = get(updatedCase, ['attributes', field]); - userActions.push( - ...this.getUserActionItemByDifference({ - unsecuredSavedObjectsClient, - field, - originalValue, - newValue, - user, - owner, - caseId, - }) - ); - }); - - return [...acc, ...userActions]; - }, - [] - ); + const caseId = updatedCase.id; + const owner = originalCase.attributes.owner; + + const userActions: UserActionEvent[] = []; + const updatedFields = Object.keys(updatedCase.attributes); + + updatedFields + .filter((field) => CaseUserActionService.userActionFieldsAllowed.has(field)) + .forEach((field) => { + const originalValue = get(originalCase, ['attributes', field]); + const newValue = get(updatedCase, ['attributes', field]); + userActions.push( + ...this.getUserActionItemByDifference({ + field, + originalValue, + newValue, + user, + owner, + caseId, + }) + ); + }); - await this.bulkCreate({ - unsecuredSavedObjectsClient, - actions: userActionsWithReferences, + return [...acc, ...userActions]; + }, []); + + await this.bulkCreateAndLog({ + userActions: builtUserActions, refresh, }); } private async bulkCreateAttachment({ - unsecuredSavedObjectsClient, caseId, attachments, user, @@ -343,43 +322,37 @@ export class CaseUserActionService { refresh, }: BulkCreateAttachmentUserAction): Promise { this.log.debug(`Attempting to create a bulk create case user action`); - const userActionsWithReferences = attachments.reduce( - (acc, attachment) => { - const userActionBuilder = this.builderFactory.getBuilder(ActionTypes.comment); - const commentUserAction = userActionBuilder?.build({ - action, - caseId, - user, - owner: attachment.owner, - attachmentId: attachment.id, - payload: { attachment: attachment.attachment }, - }); + const userActions = attachments.reduce((acc, attachment) => { + const userActionBuilder = this.builderFactory.getBuilder(ActionTypes.comment); + const commentUserAction = userActionBuilder?.build({ + action, + caseId, + user, + owner: attachment.owner, + attachmentId: attachment.id, + payload: { attachment: attachment.attachment }, + }); - if (commentUserAction == null) { - return acc; - } + if (commentUserAction == null) { + return acc; + } - return [...acc, commentUserAction]; - }, - [] - ); + return [...acc, commentUserAction]; + }, []); - await this.bulkCreate({ - unsecuredSavedObjectsClient, - actions: userActionsWithReferences, + await this.bulkCreateAndLog({ + userActions, refresh, }); } public async bulkCreateAttachmentDeletion({ - unsecuredSavedObjectsClient, caseId, attachments, user, refresh, }: BulkCreateAttachmentUserAction): Promise { await this.bulkCreateAttachment({ - unsecuredSavedObjectsClient, caseId, attachments, user, @@ -389,14 +362,12 @@ export class CaseUserActionService { } public async bulkCreateAttachmentCreation({ - unsecuredSavedObjectsClient, caseId, attachments, user, refresh, }: BulkCreateAttachmentUserAction): Promise { await this.bulkCreateAttachment({ - unsecuredSavedObjectsClient, caseId, attachments, user, @@ -406,7 +377,6 @@ export class CaseUserActionService { } public async createUserAction({ - unsecuredSavedObjectsClient, action, type, caseId, @@ -432,8 +402,7 @@ export class CaseUserActionService { }); if (userAction) { - const { attributes, references } = userAction; - await this.create({ unsecuredSavedObjectsClient, attributes, references, refresh }); + await this.createAndLog({ userAction, refresh }); } } catch (error) { this.log.error(`Error on creating user action of type: ${type}. Error: ${error}`); @@ -441,16 +410,13 @@ export class CaseUserActionService { } } - public async getAll({ - unsecuredSavedObjectsClient, - caseId, - }: GetCaseUserActionArgs): Promise> { + public async getAll(caseId: string): Promise> { try { const id = caseId; const type = CASE_SAVED_OBJECT; const userActions = - await unsecuredSavedObjectsClient.find({ + await this.unsecuredSavedObjectsClient.find({ type: CASE_USER_ACTION_SAVED_OBJECT, hasReference: { type, id }, page: 1, @@ -469,30 +435,87 @@ export class CaseUserActionService { } } - public async create({ - unsecuredSavedObjectsClient, + public async getUserActionIdsForCases(caseIds: string[]) { + try { + this.log.debug(`Attempting to retrieve user actions associated with cases: [${caseIds}]`); + + const finder = this.unsecuredSavedObjectsClient.createPointInTimeFinder({ + type: CASE_USER_ACTION_SAVED_OBJECT, + hasReference: caseIds.map((id) => ({ id, type: CASE_SAVED_OBJECT })), + sortField: 'created_at', + sortOrder: 'asc', + /** + * We only care about the ids so to reduce the data returned we should limit the fields in the response. Core + * doesn't support retrieving no fields (id would always be returned anyway) so to limit it we'll only request + * the owner even though we don't need it. + */ + fields: ['owner'], + perPage: MAX_DOCS_PER_PAGE, + }); + + const ids: string[] = []; + for await (const userActionSavedObject of finder.find()) { + ids.push(...userActionSavedObject.saved_objects.map((userAction) => userAction.id)); + } + + return ids; + } catch (error) { + this.log.error(`Error retrieving user action ids for cases: [${caseIds}]: ${error}`); + throw error; + } + } + + private async createAndLog({ + userAction, + refresh, + }: { + userAction: UserActionEvent; + } & IndexRefresh): Promise { + const createdUserAction = await this.create({ ...userAction.parameters, refresh }); + this.auditLogger.log(userAction.eventDetails, createdUserAction.id); + } + + private async create({ attributes, references, refresh, - }: CreateUserActionES): Promise { + }: CreateUserActionES): Promise> { try { this.log.debug(`Attempting to POST a new case user action`); - await unsecuredSavedObjectsClient.create(CASE_USER_ACTION_SAVED_OBJECT, attributes, { - references: references ?? [], - refresh, - }); + return await this.unsecuredSavedObjectsClient.create( + CASE_USER_ACTION_SAVED_OBJECT, + attributes, + { + references: references ?? [], + refresh, + } + ); } catch (error) { this.log.error(`Error on POST a new case user action: ${error}`); throw error; } } - public async bulkCreate({ - unsecuredSavedObjectsClient, + private async bulkCreateAndLog({ + userActions, + refresh, + }: { userActions: UserActionEvent[] } & IndexRefresh) { + const createdUserActions = await this.bulkCreate({ actions: userActions, refresh }); + + if (!createdUserActions) { + return; + } + + for (let i = 0; i < userActions.length; i++) { + this.auditLogger.log(userActions[i].eventDetails, createdUserActions.saved_objects[i].id); + } + } + + private async bulkCreate({ actions, refresh, - }: PostCaseUserActionArgs): Promise { + }: PostCaseUserActionArgs): Promise | undefined> { if (isEmpty(actions)) { return; } @@ -500,8 +523,11 @@ export class CaseUserActionService { try { this.log.debug(`Attempting to POST a new case user action`); - await unsecuredSavedObjectsClient.bulkCreate( - actions.map((action) => ({ type: CASE_USER_ACTION_SAVED_OBJECT, ...action })), + return await this.unsecuredSavedObjectsClient.bulkCreate( + actions.map((action) => ({ + type: CASE_USER_ACTION_SAVED_OBJECT, + ...action.parameters, + })), { refresh } ); } catch (error) { @@ -511,11 +537,9 @@ export class CaseUserActionService { } public async findStatusChanges({ - unsecuredSavedObjectsClient, caseId, filter, }: { - unsecuredSavedObjectsClient: SavedObjectsClientContract; caseId: string; filter?: KueryNode; }): Promise>> { @@ -539,7 +563,7 @@ export class CaseUserActionService { const combinedFilters = combineFilters([updateActionFilter, statusChangeFilter, filter]); const finder = - unsecuredSavedObjectsClient.createPointInTimeFinder( + this.unsecuredSavedObjectsClient.createPointInTimeFinder( { type: CASE_USER_ACTION_SAVED_OBJECT, hasReference: { type: CASE_SAVED_OBJECT, id: caseId }, @@ -569,10 +593,8 @@ export class CaseUserActionService { public async getUniqueConnectors({ caseId, filter, - unsecuredSavedObjectsClient, }: { caseId: string; - unsecuredSavedObjectsClient: SavedObjectsClientContract; filter?: KueryNode; }): Promise> { try { @@ -586,7 +608,7 @@ export class CaseUserActionService { const combinedFilter = combineFilters([connectorsFilter, filter]); - const response = await unsecuredSavedObjectsClient.find< + const response = await this.unsecuredSavedObjectsClient.find< CaseUserActionAttributesWithoutConnectorId, { references: { connectors: { ids: { buckets: Array<{ key: string }> } } } } >({ diff --git a/x-pack/plugins/cases/server/services/user_actions/types.ts b/x-pack/plugins/cases/server/services/user_actions/types.ts index 153c09704aaa7..be3fc602c132a 100644 --- a/x-pack/plugins/cases/server/services/user_actions/types.ts +++ b/x-pack/plugins/cases/server/services/user_actions/types.ts @@ -98,11 +98,24 @@ export interface Attributes { payload: Record; } -export interface BuilderReturnValue { +export interface SavedObjectParameters { attributes: Attributes; references: SavedObjectReference[]; } +export interface EventDetails { + getMessage: (storedUserActionId?: string) => string; + action: UserAction; + descriptiveAction: string; + savedObjectId: string; + savedObjectType: string; +} + +export interface UserActionEvent { + parameters: SavedObjectParameters; + eventDetails: EventDetails; +} + export type CommonBuilderArguments = CommonArguments & { action: UserAction; type: UserActionTypes; diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/delete_cases.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/delete_cases.ts index c9e850b360847..fd6e5ab18d5e2 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/delete_cases.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/delete_cases.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; -import { defaultUser, getPostCaseRequest, postCommentUserReq } from '../../../../common/lib/mock'; +import { getPostCaseRequest, postCommentUserReq } from '../../../../common/lib/mock'; import { deleteCasesByESQuery, deleteCasesUserActions, @@ -17,7 +17,6 @@ import { deleteCases, createComment, getComment, - removeServerGeneratedPropertiesFromUserAction, getCase, superUserSpace1Auth, getCaseUserActions, @@ -53,7 +52,22 @@ export default ({ getService }: FtrProviderContext): void => { expect(body).to.eql({}); }); - it(`should delete a case's comments when that case gets deleted`, async () => { + it('should delete multiple cases and their user actions', async () => { + const [case1, case2] = await Promise.all([ + createCase(supertest, getPostCaseRequest()), + createCase(supertest, getPostCaseRequest()), + ]); + + await deleteCases({ supertest, caseIDs: [case1.id, case2.id] }); + + const userActionsCase1 = await getCaseUserActions({ supertest, caseID: case1.id }); + expect(userActionsCase1.length).to.be(0); + + const userActionsCase2 = await getCaseUserActions({ supertest, caseID: case2.id }); + expect(userActionsCase2.length).to.be(0); + }); + + it(`should delete a case's comments and user actions when that case gets deleted`, async () => { const postedCase = await createCase(supertest, getPostCaseRequest()); const patchedCase = await createComment({ supertest, @@ -76,23 +90,16 @@ export default ({ getService }: FtrProviderContext): void => { commentId: patchedCase.comments![0].id, expectedHttpCode: 404, }); + + const userActions = await getCaseUserActions({ supertest, caseID: postedCase.id }); + expect(userActions.length).to.be(0); }); - it('should create a user action when deleting a case', async () => { + it('should delete all user actions when deleting a case', async () => { const postedCase = await createCase(supertest, getPostCaseRequest()); await deleteCases({ supertest, caseIDs: [postedCase.id] }); const userActions = await getCaseUserActions({ supertest, caseID: postedCase.id }); - const creationUserAction = removeServerGeneratedPropertiesFromUserAction(userActions[1]); - - expect(creationUserAction).to.eql({ - action: 'delete', - type: 'delete_case', - created_by: defaultUser, - case_id: postedCase.id, - comment_id: null, - payload: {}, - owner: 'securitySolutionFixture', - }); + expect(userActions.length).to.be(0); }); it('unhappy path - 404s when case is not there', async () => { diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_all_user_actions.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_all_user_actions.ts index aacb5f6c8ae17..c03831b57fd1e 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_all_user_actions.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_all_user_actions.ts @@ -68,19 +68,12 @@ export default ({ getService }: FtrProviderContext): void => { expect(createCaseUserAction.payload.connector).to.eql(postCaseReq.connector); }); - it('creates a delete case user action when a case is deleted', async () => { + it('deletes all user actions when a case is deleted', async () => { const theCase = await createCase(supertest, postCaseReq); await deleteCases({ supertest, caseIDs: [theCase.id] }); const userActions = await getCaseUserActions({ supertest, caseID: theCase.id }); - const userAction = userActions[1]; - - // One for creation and one for deletion - expect(userActions.length).to.eql(2); - - expect(userAction.action).to.eql('delete'); - expect(userAction.type).to.eql('delete_case'); - expect(userAction.payload).to.eql({}); + expect(userActions.length).to.be(0); }); it('creates a status update user action when changing the status', async () => { From 27077dfca04e0b33832f40ad34abd1950290cef2 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 7 Dec 2022 13:27:27 -0800 Subject: [PATCH 03/19] [ML] Add automated screenshot for finding anomalies page (#146916) --- .../anomaly_detection/finding_anomalies.ts | 38 +++++++++++++++++++ .../apps/ml_docs/anomaly_detection/index.ts | 1 + 2 files changed, 39 insertions(+) create mode 100644 x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/finding_anomalies.ts diff --git a/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/finding_anomalies.ts b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/finding_anomalies.ts new file mode 100644 index 0000000000000..96b6877aec598 --- /dev/null +++ b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/finding_anomalies.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +import { ECOMMERCE_INDEX_PATTERN } from '..'; + +export default function ({ getPageObject, getService }: FtrProviderContext) { + const elasticChart = getService('elasticChart'); + const ml = getService('ml'); + const commonScreenshots = getService('commonScreenshots'); + const screenshotDirectories = ['ml_docs', 'anomaly_detection']; + + describe('finding anomalies', function () { + after(async () => { + await elasticChart.setNewChartUiDebugFlag(false); + await ml.api.cleanMlIndices(); + }); + + it('ecommerce job wizards screenshot', async () => { + await ml.testExecution.logTestStep('navigate to job list'); + await ml.navigation.navigateToMl(); + await ml.navigation.navigateToJobManagement(); + + await ml.testExecution.logTestStep('load the wizards'); + await ml.jobManagement.navigateToNewJobSourceSelection(); + await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(ECOMMERCE_INDEX_PATTERN); + + await ml.testExecution.logTestStep('take screenshot'); + await commonScreenshots.removeFocusFromElement(); + await commonScreenshots.takeScreenshot('ml-create-job', screenshotDirectories); + }); + }); +} diff --git a/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/index.ts b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/index.ts index 4d092c36d6545..3d83fd1cfde70 100644 --- a/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/index.ts +++ b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./population_analysis')); loadTestFile(require.resolve('./custom_urls')); loadTestFile(require.resolve('./mapping_anomalies')); + loadTestFile(require.resolve('./finding_anomalies')); }); } From 8695086d3d08e601ecb1a9beabd0f587249cc833 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 7 Dec 2022 15:14:30 -0700 Subject: [PATCH 04/19] [maps] use control group time slider (#146486) PR replaces Maps time slider implementation with control time slider Screen Shot 2022-11-28 at 3 57 24 PM Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../embeddable/time_slider_embeddable.tsx | 8 +- x-pack/plugins/maps/kibana.json | 1 + .../map_container/index.ts | 7 +- .../map_container/map_container.tsx | 20 +- .../timeslider/_index.scss | 62 +--- .../connected_components/timeslider/index.ts | 9 +- .../timeslider/time_utils.test.ts | 30 -- .../timeslider/time_utils.ts | 84 ------ .../timeslider/timeslider.tsx | 283 +++++------------- .../translations/translations/fr-FR.json | 6 - .../translations/translations/ja-JP.json | 6 - .../translations/translations/zh-CN.json | 6 - 12 files changed, 94 insertions(+), 428 deletions(-) delete mode 100644 x-pack/plugins/maps/public/connected_components/timeslider/time_utils.test.ts delete mode 100644 x-pack/plugins/maps/public/connected_components/timeslider/time_utils.ts diff --git a/src/plugins/controls/public/time_slider/embeddable/time_slider_embeddable.tsx b/src/plugins/controls/public/time_slider/embeddable/time_slider_embeddable.tsx index 05a8a17a22908..e12320356dd66 100644 --- a/src/plugins/controls/public/time_slider/embeddable/time_slider_embeddable.tsx +++ b/src/plugins/controls/public/time_slider/embeddable/time_slider_embeddable.tsx @@ -49,6 +49,7 @@ export class TimeSliderControlEmbeddable extends Embeddable< private getTimezone: ControlsSettingsService['getTimezone']; private timefilter: ControlsDataService['timefilter']; + private prevTimeRange: TimeRange | undefined; private readonly waitForControlOutputConsumersToLoad$; private reduxEmbeddableTools: ReduxEmbeddableTools< @@ -129,9 +130,9 @@ export class TimeSliderControlEmbeddable extends Embeddable< return; } - const nextBounds = this.timeRangeToBounds(input.timeRange); - const { actions, dispatch, getState } = this.reduxEmbeddableTools; - if (!_.isEqual(nextBounds, getState().componentState.timeRangeBounds)) { + if (!_.isEqual(input.timeRange, this.prevTimeRange)) { + const { actions, dispatch } = this.reduxEmbeddableTools; + const nextBounds = this.timeRangeToBounds(input.timeRange); const ticks = getTicks(nextBounds[FROM_INDEX], nextBounds[TO_INDEX], this.getTimezone()); dispatch( actions.setTimeRangeBounds({ @@ -145,6 +146,7 @@ export class TimeSliderControlEmbeddable extends Embeddable< } private syncWithTimeRange() { + this.prevTimeRange = this.getInput().timeRange; const { actions, dispatch, getState } = this.reduxEmbeddableTools; const stepSize = getState().componentState.stepSize; const timesliceStartAsPercentageOfTimeRange = diff --git a/x-pack/plugins/maps/kibana.json b/x-pack/plugins/maps/kibana.json index 5945ee3d35d8b..2e1ad348a47b1 100644 --- a/x-pack/plugins/maps/kibana.json +++ b/x-pack/plugins/maps/kibana.json @@ -8,6 +8,7 @@ "kibanaVersion": "kibana", "configPath": ["xpack", "maps"], "requiredPlugins": [ + "controls", "unifiedSearch", "lens", "licensing", diff --git a/x-pack/plugins/maps/public/connected_components/map_container/index.ts b/x-pack/plugins/maps/public/connected_components/map_container/index.ts index 28671b13df5bc..f520f9cdc788e 100644 --- a/x-pack/plugins/maps/public/connected_components/map_container/index.ts +++ b/x-pack/plugins/maps/public/connected_components/map_container/index.ts @@ -9,7 +9,11 @@ import { AnyAction } from 'redux'; import { ThunkDispatch } from 'redux-thunk'; import { connect } from 'react-redux'; import { MapContainer } from './map_container'; -import { getFlyoutDisplay, getIsFullScreen } from '../../selectors/ui_selectors'; +import { + getFlyoutDisplay, + getIsFullScreen, + getIsTimesliderOpen, +} from '../../selectors/ui_selectors'; import { cancelAllInFlightRequests, exitFullScreen } from '../../actions'; import { areLayersLoaded, @@ -22,6 +26,7 @@ import { MapStoreState } from '../../reducers/store'; function mapStateToProps(state: MapStoreState) { return { + isTimesliderOpen: getIsTimesliderOpen(state), areLayersLoaded: areLayersLoaded(state), flyoutDisplay: getFlyoutDisplay(state), isFullScreen: getIsFullScreen(state), diff --git a/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx b/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx index ddfaa99dd41c9..51c7b8675f145 100644 --- a/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx +++ b/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx @@ -13,7 +13,6 @@ import uuid from 'uuid/v4'; import { Filter } from '@kbn/es-query'; import { ActionExecutionContext, Action } from '@kbn/ui-actions-plugin/public'; import { Observable } from 'rxjs'; -import moment from 'moment'; import { ExitFullScreenButton } from '@kbn/shared-ux-button-exit-full-screen'; import { MBMap } from '../mb_map'; import { RightSideControls } from '../right_side_controls'; @@ -21,7 +20,7 @@ import { Timeslider } from '../timeslider'; import { ToolbarOverlay } from '../toolbar_overlay'; import { EditLayerPanel } from '../edit_layer_panel'; import { AddLayerPanel } from '../add_layer_panel'; -import { getData, isScreenshotMode } from '../../kibana_services'; +import { isScreenshotMode } from '../../kibana_services'; import { RawValue } from '../../../common/constants'; import { FLYOUT_STATE } from '../../reducers/ui'; import { MapSettings } from '../../../common/descriptor_types'; @@ -41,6 +40,7 @@ export interface Props { exitFullScreen: () => void; flyoutDisplay: FLYOUT_STATE; isFullScreen: boolean; + isTimesliderOpen: boolean; indexPatternIds: string[]; mapInitError: string | null | undefined; renderTooltipContent?: RenderToolTipContent; @@ -154,13 +154,6 @@ export class MapContainer extends Component { }, 5000); }; - _updateGlobalTimeRange(data: number[]) { - getData().query.timefilter.timefilter.setTime({ - from: moment(data[0]).toISOString(), - to: moment(data[1]).toISOString(), - }); - } - render() { const { addFilters, @@ -241,13 +234,10 @@ export class MapContainer extends Component { /> )} + {this.props.isTimesliderOpen && ( + + )} - - - ) { return { - closeTimeslider: () => { - dispatch(closeTimeslider()); - }, - setTimeslice: (timeslice: Timeslice) => { + setTimeslice: (timeslice?: Timeslice) => { dispatch( setQuery({ forceRefresh: false, diff --git a/x-pack/plugins/maps/public/connected_components/timeslider/time_utils.test.ts b/x-pack/plugins/maps/public/connected_components/timeslider/time_utils.test.ts deleted file mode 100644 index 16973b5a84478..0000000000000 --- a/x-pack/plugins/maps/public/connected_components/timeslider/time_utils.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { getInterval } from './time_utils'; - -describe('getInterval', () => { - test('should provide interval of 1 day for 7 day range', () => { - expect(getInterval(1617630946622, 1618235746622)).toBe(86400000); - }); - - test('should provide interval of 3 hours for 24 hour range', () => { - expect(getInterval(1618150382531, 1618236782531)).toBe(10800000); - }); - - test('should provide interval of 90 minues for 12 hour range', () => { - expect(getInterval(1618193892632, 1618237092632)).toBe(5400000); - }); - - test('should provide interval of 30 minues for 4 hour range', () => { - expect(getInterval(1618222509189, 1618236909189)).toBe(1800000); - }); - - test('should provide interval of 10 minues for 1 hour range', () => { - expect(getInterval(1618233266459, 1618236866459)).toBe(600000); - }); -}); diff --git a/x-pack/plugins/maps/public/connected_components/timeslider/time_utils.ts b/x-pack/plugins/maps/public/connected_components/timeslider/time_utils.ts deleted file mode 100644 index 01f79114b13d0..0000000000000 --- a/x-pack/plugins/maps/public/connected_components/timeslider/time_utils.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import moment from 'moment-timezone'; -import { EuiRangeTick } from '@elastic/eui/src/components/form/range/range_ticks'; -import { calcAutoIntervalNear } from '@kbn/data-plugin/common'; -import { getUiSettings } from '../../kibana_services'; - -function getTimezone() { - const detectedTimezone = moment.tz.guess(); - const dateFormatTZ = getUiSettings().get('dateFormat:tz', 'Browser'); - - return dateFormatTZ === 'Browser' ? detectedTimezone : dateFormatTZ; -} - -function getScaledDateFormat(interval: number): string { - if (interval >= moment.duration(1, 'y').asMilliseconds()) { - return 'YYYY'; - } - - if (interval >= moment.duration(1, 'd').asMilliseconds()) { - return 'MMM D'; - } - - if (interval >= moment.duration(6, 'h').asMilliseconds()) { - return 'Do HH'; - } - - if (interval >= moment.duration(1, 'h').asMilliseconds()) { - return 'HH:mm'; - } - - if (interval >= moment.duration(1, 'm').asMilliseconds()) { - return 'HH:mm'; - } - - if (interval >= moment.duration(1, 's').asMilliseconds()) { - return 'mm:ss'; - } - - return 'ss.SSS'; -} - -export function epochToKbnDateFormat(epoch: number): string { - const dateFormat = getUiSettings().get('dateFormat', 'MMM D, YYYY @ HH:mm:ss.SSS'); - const timezone = getTimezone(); - return moment.tz(epoch, timezone).format(dateFormat); -} - -export function getInterval(min: number, max: number, steps = 6): number { - const duration = max - min; - let interval = calcAutoIntervalNear(steps, duration).asMilliseconds(); - // Sometimes auto interval is not quite right and returns 2X or 3X requested ticks - // Adjust the interval to get closer to the requested number of ticks - const actualSteps = duration / interval; - if (actualSteps > steps * 1.5) { - const factor = Math.round(actualSteps / steps); - interval *= factor; - } else if (actualSteps < 5) { - interval *= 0.5; - } - return interval; -} - -export function getTicks(min: number, max: number, interval: number): EuiRangeTick[] { - const format = getScaledDateFormat(interval); - const timezone = getTimezone(); - - let tick = Math.ceil(min / interval) * interval; - const ticks: EuiRangeTick[] = []; - while (tick < max) { - ticks.push({ - value: tick, - label: moment.tz(tick, timezone).format(format), - }); - tick += interval; - } - - return ticks; -} diff --git a/x-pack/plugins/maps/public/connected_components/timeslider/timeslider.tsx b/x-pack/plugins/maps/public/connected_components/timeslider/timeslider.tsx index d2ed9d640b140..75e474cc064fc 100644 --- a/x-pack/plugins/maps/public/connected_components/timeslider/timeslider.tsx +++ b/x-pack/plugins/maps/public/connected_components/timeslider/timeslider.tsx @@ -7,248 +7,105 @@ import _ from 'lodash'; import React, { Component } from 'react'; -import { EuiButtonIcon, EuiDualRange, EuiText } from '@elastic/eui'; -import { EuiRangeTick } from '@elastic/eui/src/components/form/range/range_ticks'; -import { i18n } from '@kbn/i18n'; import { Observable, Subscription } from 'rxjs'; +import { distinctUntilChanged } from 'rxjs/operators'; +import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { + ControlGroupContainer, + type ControlGroupInput, + type controlGroupInputBuilder, + LazyControlGroupRenderer, +} from '@kbn/controls-plugin/public'; +import { withSuspense } from '@kbn/presentation-util-plugin/public'; import { first } from 'rxjs/operators'; import type { TimeRange } from '@kbn/es-query'; -import { epochToKbnDateFormat, getInterval, getTicks } from './time_utils'; -import { getTimeFilter } from '../../kibana_services'; import { Timeslice } from '../../../common/descriptor_types'; +const ControlGroupRenderer = withSuspense(LazyControlGroupRenderer); + export interface Props { - closeTimeslider: () => void; - setTimeslice: (timeslice: Timeslice) => void; - isTimesliderOpen: boolean; + setTimeslice: (timeslice?: Timeslice) => void; timeRange: TimeRange; waitForTimesliceToLoad$: Observable; - updateGlobalTimeRange: (timeslice: number[]) => void; -} - -interface State { - isPaused: boolean; - max: number; - min: number; - range: number; - timeslice: [number, number]; - ticks: EuiRangeTick[]; -} - -function prettyPrintTimeslice(timeslice: [number, number]) { - return `${epochToKbnDateFormat(timeslice[0])} - ${epochToKbnDateFormat(timeslice[1])}`; } -// Why Timeslider and KeyedTimeslider? -// Using react 'key' property to ensure new KeyedTimeslider instance whenever props.timeRange changes -export function Timeslider(props: Props) { - return props.isTimesliderOpen ? ( - - ) : null; -} - -class KeyedTimeslider extends Component { +export class Timeslider extends Component { private _isMounted: boolean = false; - private _timeoutId: number | undefined; - private _subscription: Subscription | undefined; - - constructor(props: Props) { - super(props); - const timeRangeBounds = getTimeFilter().calculateBounds(props.timeRange); - if (timeRangeBounds.min === undefined || timeRangeBounds.max === undefined) { - throw new Error( - 'Unable to create Timeslider component, timeRangeBounds min or max are undefined' - ); - } - const min = timeRangeBounds.min.valueOf(); - const max = timeRangeBounds.max.valueOf(); - const interval = getInterval(min, max); - const timeslice: [number, number] = [min, max]; - - this.state = { - isPaused: true, - max, - min, - range: interval, - ticks: getTicks(min, max, interval), - timeslice, - }; - } + private _controlGroup?: ControlGroupContainer | undefined; + private readonly _subscriptions = new Subscription(); componentWillUnmount() { - this._onPause(); this._isMounted = false; + this._subscriptions.unsubscribe(); } - componentDidMount() { - this._isMounted = true; - // auto-select range between first tick and second tick - this._onChange([this.state.ticks[0].value, this.state.ticks[1].value]); + componentDidUpdate() { + if ( + this._controlGroup && + !_.isEqual(this._controlGroup.getInput().timeRange, this.props.timeRange) + ) { + this._controlGroup.updateInput({ + timeRange: this.props.timeRange, + }); + } } - _doesTimesliceCoverTimerange() { - return this.state.timeslice[0] === this.state.min && this.state.timeslice[1] === this.state.max; + componentDidMount() { + this._isMounted = true; } - _onDualControlChange = (value: [number | string, number | string]) => { - this.setState({ range: (value[1] as number) - (value[0] as number) }, () => { - this._onChange(value as [number, number]); - }); - }; - - _onChange = (value: [number, number]) => { - this.setState({ - timeslice: value, - }); - this._propagateChange(value); - }; - - _onNext = () => { - const from = - this._doesTimesliceCoverTimerange() || this.state.timeslice[1] === this.state.max - ? this.state.ticks[0].value - : this.state.timeslice[1]; - const to = from + this.state.range; - this._onChange([from, to <= this.state.max ? to : this.state.max]); - }; - - _onPrevious = () => { - const to = - this._doesTimesliceCoverTimerange() || this.state.timeslice[0] === this.state.min - ? this.state.ticks[this.state.ticks.length - 1].value - : this.state.timeslice[0]; - const from = to - this.state.range; - this._onChange([from < this.state.min ? this.state.min : from, to]); + _getInitialInput = async ( + initialInput: Partial, + builder: typeof controlGroupInputBuilder + ) => { + builder.addTimeSliderControl(initialInput); + return { + ...initialInput, + viewMode: ViewMode.VIEW, + timeRange: this.props.timeRange, + }; }; - _propagateChange = _.debounce((value: [number, number]) => { - if (this._isMounted) { - this.props.setTimeslice({ from: value[0], to: value[1] }); + _onLoadComplete = (controlGroup: ControlGroupContainer) => { + if (!this._isMounted) { + return; } - }, 300); - - _onPlay = () => { - this.setState({ isPaused: false }); - this._playNextFrame(); - }; - _onPause = () => { - this.setState({ isPaused: true }); - if (this._subscription) { - this._subscription.unsubscribe(); - this._subscription = undefined; - } - if (this._timeoutId) { - clearTimeout(this._timeoutId); - this._timeoutId = undefined; - } + this._controlGroup = controlGroup; + this._subscriptions.add( + this._controlGroup + .getOutput$() + .pipe( + distinctUntilChanged(({ timeslice: timesliceA }, { timeslice: timesliceB }) => + _.isEqual(timesliceA, timesliceB) + ) + ) + .subscribe(({ timeslice }) => { + // use waitForTimesliceToLoad$ observable to wait until next frame loaded + // .pipe(first()) waits until the first value is emitted from an observable and then automatically unsubscribes + this.props.waitForTimesliceToLoad$.pipe(first()).subscribe(() => { + this._controlGroup!.anyControlOutputConsumerLoading$.next(false); + }); + + this.props.setTimeslice( + timeslice === undefined + ? undefined + : { + from: timeslice[0], + to: timeslice[1], + } + ); + }) + ); }; - _playNextFrame() { - // advance to next frame - this._onNext(); - - // use waitForTimesliceToLoad$ observable to wait until next frame loaded - // .pipe(first()) waits until the first value is emitted from an observable and then automatically unsubscribes - this._subscription = this.props.waitForTimesliceToLoad$.pipe(first()).subscribe(() => { - if (this.state.isPaused) { - return; - } - - // use timeout to display frame for small time period before moving to next frame - this._timeoutId = window.setTimeout(() => { - if (this.state.isPaused) { - return; - } - this._playNextFrame(); - }, 1750); - }); - } - render() { return (
-
- - -
- {prettyPrintTimeslice(this.state.timeslice)} -
- - { - this.props.updateGlobalTimeRange(this.state.timeslice); - }} - iconType="calendar" - aria-label={i18n.translate('xpack.maps.timeslider.setGlobalTime', { - defaultMessage: 'Set global time to {timeslice}', - values: { timeslice: prettyPrintTimeslice(this.state.timeslice) }, - })} - title={i18n.translate('xpack.maps.timeslider.setGlobalTime', { - defaultMessage: 'Set global time to {timeslice}', - values: { timeslice: prettyPrintTimeslice(this.state.timeslice) }, - })} - /> - -
-
- - - -
-
-
- -
- -
+
); } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index f638218c3ddea..2e930593a89a0 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -18362,7 +18362,6 @@ "xpack.maps.tiles.resultsCompleteMsg": "{countPrefix}{count} documents trouvés.", "xpack.maps.tiles.resultsTrimmedMsg": "Résultats limités à {countPrefix}{count} documents.", "xpack.maps.tileStatusTracker.layerErrorMsg": "Impossible de charger {count} tuiles : {tileErrors}", - "xpack.maps.timeslider.setGlobalTime": "Définir l’heure globale sur {timeslice}", "xpack.maps.tooltip.joinPropertyTooltipContent": "La clé partagée \"{leftFieldName}\" est reliée à {rightSources}.", "xpack.maps.tooltip.pageNumerText": "{pageNumber} sur {total}", "xpack.maps.tooltipSelector.addLabelWithCount": "Ajouter {count}", @@ -18937,11 +18936,6 @@ "xpack.maps.tileMap.vis.title": "Carte de coordonnées", "xpack.maps.tiles.shapeCountMsg": " Ce nombre est approximatif.", "xpack.maps.tileStatusTracker.tileErrorMsg": "impossible de charger la tuile \"{tileZXYKey}\" : \"{status} {message}\"", - "xpack.maps.timeslider.closeLabel": "Fermer le curseur temporel", - "xpack.maps.timeslider.nextTimeWindowLabel": "Fenêtre temporelle suivante", - "xpack.maps.timeslider.pauseLabel": "Pause", - "xpack.maps.timeslider.playLabel": "Lecture", - "xpack.maps.timeslider.previousTimeWindowLabel": "Fenêtre temporelle précédente", "xpack.maps.timesliderToggleButton.closeLabel": "Fermer le curseur temporel", "xpack.maps.timesliderToggleButton.openLabel": "Ouvrir le curseur temporel", "xpack.maps.toolbarOverlay.drawBounds.initialGeometryLabel": "limites", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 81ada7b9c6f35..ac24d3519af44 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -18345,7 +18345,6 @@ "xpack.maps.tiles.resultsCompleteMsg": "{countPrefix}{count}個のドキュメントが見つかりました。", "xpack.maps.tiles.resultsTrimmedMsg": "結果は{countPrefix}{count}個のドキュメントに制限されています。", "xpack.maps.tileStatusTracker.layerErrorMsg": "{count}個のタイルを読み込めません:{tileErrors}", - "xpack.maps.timeslider.setGlobalTime": "グローバル時刻を{timeslice}に設定", "xpack.maps.tooltip.joinPropertyTooltipContent": "共有キー'{leftFieldName}'は{rightSources}と結合されます", "xpack.maps.tooltip.pageNumerText": "{total}ページ中 {pageNumber}ページ", "xpack.maps.tooltipSelector.addLabelWithCount": "{count} の追加", @@ -18920,11 +18919,6 @@ "xpack.maps.tileMap.vis.title": "座標マップ", "xpack.maps.tiles.shapeCountMsg": " この数は近似値です。", "xpack.maps.tileStatusTracker.tileErrorMsg": "タイル'{tileZXYKey}'を読み込めませんでした:'{status} {message}'", - "xpack.maps.timeslider.closeLabel": "時間スライダーを閉じる", - "xpack.maps.timeslider.nextTimeWindowLabel": "次の時間ウィンドウ", - "xpack.maps.timeslider.pauseLabel": "一時停止", - "xpack.maps.timeslider.playLabel": "再生", - "xpack.maps.timeslider.previousTimeWindowLabel": "前の時間ウィンドウ", "xpack.maps.timesliderToggleButton.closeLabel": "時間スライダーを閉じる", "xpack.maps.timesliderToggleButton.openLabel": "時間スライダーを開く", "xpack.maps.toolbarOverlay.drawBounds.initialGeometryLabel": "境界", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 6000d156083ad..10f9661290631 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -18370,7 +18370,6 @@ "xpack.maps.tiles.resultsCompleteMsg": "找到 {countPrefix}{count} 个文档。", "xpack.maps.tiles.resultsTrimmedMsg": "结果仅限于 {countPrefix}{count} 个文档。", "xpack.maps.tileStatusTracker.layerErrorMsg": "无法加载 {count} 个磁贴:{tileErrors}", - "xpack.maps.timeslider.setGlobalTime": "将全局时间设置为 {timeslice}", "xpack.maps.tooltip.joinPropertyTooltipContent": "共享密钥“{leftFieldName}”与 {rightSources} 联结", "xpack.maps.tooltip.pageNumerText": "第 {pageNumber} 页,共 {total} 页", "xpack.maps.tooltipSelector.addLabelWithCount": "添加 {count} 个", @@ -18945,11 +18944,6 @@ "xpack.maps.tileMap.vis.title": "坐标地图", "xpack.maps.tiles.shapeCountMsg": " 此计数为近似值。", "xpack.maps.tileStatusTracker.tileErrorMsg": "无法加载磁贴“{tileZXYKey}”:“{status} {message}”", - "xpack.maps.timeslider.closeLabel": "关闭时间滑块", - "xpack.maps.timeslider.nextTimeWindowLabel": "下一时间窗口", - "xpack.maps.timeslider.pauseLabel": "暂停", - "xpack.maps.timeslider.playLabel": "播放", - "xpack.maps.timeslider.previousTimeWindowLabel": "上一时间窗口", "xpack.maps.timesliderToggleButton.closeLabel": "关闭时间滑块", "xpack.maps.timesliderToggleButton.openLabel": "打开时间滑块", "xpack.maps.toolbarOverlay.drawBounds.initialGeometryLabel": "边界", From e674e113818d524118f49e49f2c8eba21413d1e2 Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Wed, 7 Dec 2022 15:10:03 -0800 Subject: [PATCH 05/19] skip failing suite #102283 Signed-off-by: Tyler Smalley --- x-pack/test/api_integration/apis/ml/modules/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/ml/modules/index.ts b/x-pack/test/api_integration/apis/ml/modules/index.ts index d28263b487701..6656183af8e6c 100644 --- a/x-pack/test/api_integration/apis/ml/modules/index.ts +++ b/x-pack/test/api_integration/apis/ml/modules/index.ts @@ -14,7 +14,8 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { const fleetPackages = ['apache', 'nginx']; const installedPackages: Array<{ pkgName: string; version: string }> = []; - describe('modules', function () { + // failing: https://github.com/elastic/kibana/issues/102283 + describe.skip('modules', function () { before(async () => { // use await kibanaServer.savedObjects.cleanStandardList(); to make sure the fleet setup is removed correctly after the tests await kibanaServer.savedObjects.cleanStandardList(); From 8b89a5bd5c49f2c1afa6382eac2cd2b18da6d97c Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 7 Dec 2022 16:48:19 -0800 Subject: [PATCH 06/19] [shared-ux] remove circular dependency in solution-nav (#147201) While working on another project I found a circular dependency between the `@kbn/shared-ux-page-solution-nav` and `@kbn/shared-ux-page-kibana-template-types` packages. My upcoming PR will prevent this from happening in the future, but for now this is just a small change to fix the issue. --- .../page/solution_nav/src/with_solution_nav.tsx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/shared-ux/page/solution_nav/src/with_solution_nav.tsx b/packages/shared-ux/page/solution_nav/src/with_solution_nav.tsx index d35834e7cdd9d..da73befdf519e 100644 --- a/packages/shared-ux/page/solution_nav/src/with_solution_nav.tsx +++ b/packages/shared-ux/page/solution_nav/src/with_solution_nav.tsx @@ -8,8 +8,12 @@ import React, { ComponentType, ReactNode, useState } from 'react'; import classNames from 'classnames'; -import { KibanaPageTemplateProps } from '@kbn/shared-ux-page-kibana-template-types'; -import { useIsWithinBreakpoints, useEuiTheme, useIsWithinMinBreakpoint } from '@elastic/eui'; +import { + useIsWithinBreakpoints, + useEuiTheme, + useIsWithinMinBreakpoint, + EuiPageSidebarProps, +} from '@elastic/eui'; import { SolutionNav, SolutionNavProps } from './solution_nav'; import { WithSolutionNavStyles } from './with_solution_nav.styles'; @@ -18,9 +22,11 @@ function getDisplayName(Component: ComponentType) { return Component.displayName || Component.name || 'UnnamedComponent'; } -type TemplateProps = Pick & { +export interface TemplateProps { children?: ReactNode; -}; + pageSideBar?: ReactNode; + pageSideBarProps?: EuiPageSidebarProps; +} type Props

= P & TemplateProps & { From 94c46eba45343892d46cb40bf90b471914e2809b Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 8 Dec 2022 00:48:19 -0500 Subject: [PATCH 07/19] [api-docs] 2022-12-08 Daily api_docs build (#147228) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/180 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.devdocs.json | 12 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_chat.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 4 +- api_docs/data_query.mdx | 4 +- api_docs/data_search.devdocs.json | 205 ++++++++++++++ api_docs/data_search.mdx | 4 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.devdocs.json | 42 ++- api_docs/kbn_apm_synthtrace.mdx | 4 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- api_docs/kbn_content_management_inspector.mdx | 2 +- .../kbn_content_management_table_list.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- .../kbn_core_injected_metadata_browser.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...core_saved_objects_api_server_internal.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_get_repo_files.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_monaco.devdocs.json | 259 +++++++++++++----- api_docs/kbn_monaco.mdx | 4 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_peggy.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- ...shared_ux_page_no_data_config.devdocs.json | 6 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- ...n_shared_ux_page_solution_nav.devdocs.json | 4 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 4 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_package_json.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_type_summarizer.mdx | 2 +- api_docs/kbn_type_summarizer_core.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.devdocs.json | 32 ++- api_docs/lens.mdx | 4 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.devdocs.json | 175 ++++++++++++ api_docs/observability.mdx | 4 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 22 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.devdocs.json | 18 +- api_docs/profiling.mdx | 7 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_field_list.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.devdocs.json | 15 - api_docs/vis_type_pie.mdx | 4 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.devdocs.json | 6 +- api_docs/vis_type_vislib.mdx | 4 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 458 files changed, 1141 insertions(+), 572 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index bc3dbbe17a621..d16b220fbc52c 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 0706f53b99d87..719b8060f78ed 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index b6c99301917c3..3065f13b19a3f 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 409d2c7cabf6a..6cae0aac4224c 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -3082,7 +3082,17 @@ "section": "def-server.BulkOperationError", "text": "BulkOperationError" }, - "[]; total: number; taskIdsFailedToBeDeleted: string[]; }>; bulkEdit: | ", + "RuleWithLegacyId", + ")[]; total: number; taskIdsFailedToBeDeleted: string[]; }>; bulkEdit: boolean" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.isAbsoluteTimeShift.$1", + "type": "string", + "tags": [], + "label": "val", + "description": [ + "the string to parse (it assumes it has been trimmed already)" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [ + "true if an absolute time shift" + ], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.isAutoInterval", @@ -16495,6 +16534,75 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.parseAbsoluteTimeShift", + "type": "Function", + "tags": [], + "label": "parseAbsoluteTimeShift", + "description": [ + "\nParses an absolute time shift string and returns its equivalent duration" + ], + "signature": [ + "(val: string, timeRange: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined) => { value: moment.Duration; reason: null; } | { value: \"invalid\"; reason: \"missingTimerange\" | \"notAbsoluteTimeShift\" | \"invalidDate\" | \"shiftAfterTimeRange\"; }" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.parseAbsoluteTimeShift.$1", + "type": "string", + "tags": [], + "label": "val", + "description": [ + "the string to parse" + ], + "signature": [ + "string" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "data", + "id": "def-common.parseAbsoluteTimeShift.$2", + "type": "Object", + "tags": [], + "label": "timeRange", + "description": [ + "the current date histogram interval" + ], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.parseEsInterval", @@ -17272,6 +17380,73 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "data", + "id": "def-common.validateAbsoluteTimeShift", + "type": "Function", + "tags": [], + "label": "validateAbsoluteTimeShift", + "description": [ + "\nRelaxed version of the parsing validation\nThis version of the validation applies the timeRange validation only when passed" + ], + "signature": [ + "(val: string, timeRange: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined) => \"missingTimerange\" | \"notAbsoluteTimeShift\" | \"invalidDate\" | \"shiftAfterTimeRange\" | undefined" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.validateAbsoluteTimeShift.$1", + "type": "string", + "tags": [], + "label": "val", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "data", + "id": "def-common.validateAbsoluteTimeShift.$2", + "type": "Object", + "tags": [], + "label": "timeRange", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [ + "the reason id if the absolute shift is not valid, undefined otherwise" + ], + "initialIsOpen": false } ], "interfaces": [ @@ -34940,6 +35115,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.REASON_ID_TYPES", + "type": "Type", + "tags": [], + "label": "REASON_ID_TYPES", + "description": [], + "signature": [ + "\"missingTimerange\" | \"notAbsoluteTimeShift\" | \"invalidDate\" | \"shiftAfterTimeRange\"" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.SAMPLER_AGG_NAME", @@ -40812,6 +41002,21 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.REASON_IDS", + "type": "Object", + "tags": [], + "label": "REASON_IDS", + "description": [], + "signature": [ + "{ readonly missingTimerange: \"missingTimerange\"; readonly notAbsoluteTimeShift: \"notAbsoluteTimeShift\"; readonly invalidDate: \"invalidDate\"; readonly shiftAfterTimeRange: \"shiftAfterTimeRange\"; }" + ], + "path": "src/plugins/data/common/search/aggs/utils/parse_time_shift.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.removeFilterFunction", diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index d46e3d8717cf5..3a87348fe124a 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-disco | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3269 | 119 | 2557 | 27 | +| 3279 | 119 | 2561 | 27 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index f64a65e3d3041..ea203222a4424 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 1ab12b52e9343..41df9c22d43b5 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 40818c0712d28..db6554be3585b 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index bd75a26b3a55f..7b04b1cc7b9e9 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 76681eb22fd84..79c9c406ff282 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 9390a895cb4c7..1e76211a95f1f 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 482d455281611..0a911e9c26b22 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 5d09767e68e8e..f5f9255595d74 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index e73ffbc64e29b..4997b8204e56e 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 49932fb02dec3..95f49388264c4 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 0ee593a0f0f69..7eda85a7439f1 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index c372fff589e45..5b767fe8b4187 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 5de1e544c511a..25d420842d1ff 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index b9d571acf264c..ca03db1187090 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 80da471d33b7e..f2a833aef2e74 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 21aee307763d2..62a4a1b1e287c 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 1be5dd9f66fd5..dd92bcb0a74a1 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index ebc7137d5d2b7..7b747091962a3 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 11c81100860ec..489e173a2b136 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index b210c0949ac25..ae4798b60f640 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index be9a1342de6a7..cb965b196f616 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 760c9b9b85571..ef3c7059f8161 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 7320a0804c594..a9fa21973dcba 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 47c59d750f269..5793f6737c28a 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 3e707b4cf8174..166da3294eda5 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 93174faee444c..c8136d7cc726c 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index acf4d6a16a952..4080f6cf922fc 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 79c2c425f3042..c5b45fc137775 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index eae8ecaf4c44f..3f4f7811e027d 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index d57c2333490e7..cef1299eea518 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index c65c8a4667f05..0663c5d8fe527 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index d6c2ef371a449..5cc82207ee658 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 9fae063de9331..eeca055c1e64f 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index c15174434f417..4492421da917c 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 699fd05437bd5..52946eccbcef5 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 4887e67e7540b..9abd88a680f6c 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 8eec341226c8a..1aa0cabf504d4 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index ce10a6d3a887a..cdce3a06412cc 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -12744,7 +12744,7 @@ "label": "data_stream", "description": [], "signature": [ - "{ dataset: string; type: string; elasticsearch?: { privileges?: { indices?: string[] | undefined; } | undefined; index_mode?: string | undefined; } | undefined; }" + "{ dataset: string; type: string; elasticsearch?: { privileges?: { indices?: string[] | undefined; } | undefined; index_mode?: string | undefined; source_mode?: string | undefined; } | undefined; }" ], "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index dbe1f861338e6..b24563dea1581 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index dd559086a535d..ec0ccf8b12af0 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 8a9752301a8fc..b08543ec0d75b 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index ca9719338caa4..638479010fa59 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 8a895f5280516..ae25ff15eccc1 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 4221e526363e6..7b08a70b4eaea 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 0ec5591904b00..6bbd69c28823e 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 41b58ab447a78..82563e09f4095 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 33ae0cc2eecd5..c48b692006c0b 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index edf1b998f8243..0e1c932cc1e45 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 6fda38b56d21c..1b4cabbb7232b 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 8311239b37a5f..48f8e63f68d37 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index bfbb951a66639..ff9e015817321 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 8553ddf4bfce8..73a2882b72aa0 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 0663c1d388be9..2f24eb7cdf1a6 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 1b41ac6e1a750..a141da72d50df 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 198d1f5ec90b1..c99e7401f7f88 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 5c80309b4d982..2caff35b86ae3 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 851028dee57a3..0575003700785 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index bb96f23eb58b0..6af9fa3901884 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 8fad38e55100f..1bfe4eb331f94 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.devdocs.json b/api_docs/kbn_apm_synthtrace.devdocs.json index c2a9713da0caf..c91af4fa61088 100644 --- a/api_docs/kbn_apm_synthtrace.devdocs.json +++ b/api_docs/kbn_apm_synthtrace.devdocs.json @@ -1062,7 +1062,9 @@ "section": "def-server.Fields", "text": "Fields" }, - " & Partial<{ 'timestamp.us'?: number | undefined; 'agent.name': string; 'agent.version': string; 'container.id': string; 'destination.address': string; 'destination.port': number; 'ecs.version': string; 'event.outcome': string; 'event.ingested': number; 'error.id': string; 'error.exception': ", + " & Partial<{ 'timestamp.us'?: number | undefined; 'agent.name': string; 'agent.version': string; 'client.geo.city_name': string; 'client.geo.continent_name': string; 'client.geo.country_iso_code': string; 'client.geo.country_name': string; 'client.geo.region_iso_code': string; 'client.geo.region_name': string; 'client.geo.location': ", + "GeoLocation", + "; 'client.ip': string; 'cloud.provider': string; 'cloud.project.name': string; 'cloud.service.name': string; 'cloud.availability_zone': string; 'cloud.machine.type': string; 'cloud.region': string; 'container.id': string; 'destination.address': string; 'destination.port': number; 'device.id': string; 'device.model.identifier': string; 'device.model.name': string; 'device.manufacturer': string; 'ecs.version': string; 'event.outcome': string; 'event.ingested': number; 'error.id': string; 'error.exception': ", { "pluginId": "@kbn/apm-synthtrace", "scope": "server", @@ -1070,9 +1072,9 @@ "section": "def-server.ApmException", "text": "ApmException" }, - "[]; 'error.grouping_name': string; 'error.grouping_key': string; 'host.name': string; 'host.architecture': string; 'host.hostname': string; 'http.request.method': string; 'http.response.status_code': number; 'kubernetes.pod.uid': string; 'kubernetes.pod.name': string; 'metricset.name': string; observer: ", + "[]; 'error.grouping_name': string; 'error.grouping_key': string; 'faas.id': string; 'faas.name': string; 'faas.coldstart': boolean; 'faas.execution': string; 'faas.trigger.type': string; 'faas.trigger.request_id': string; 'host.name': string; 'host.architecture': string; 'host.hostname': string; 'host.os.full': string; 'host.os.name': string; 'host.os.platform': string; 'host.os.type': string; 'host.os.version': string; 'http.request.method': string; 'http.response.status_code': number; 'kubernetes.pod.uid': string; 'kubernetes.pod.name': string; 'metricset.name': string; observer: ", "Observer", - "; 'parent.id': string; 'processor.event': string; 'processor.name': string; 'trace.id': string; 'transaction.name': string; 'transaction.type': string; 'transaction.id': string; 'transaction.duration.us': number; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; 'transaction.sampled': true; 'service.name': string; 'service.version': string; 'service.environment': string; 'service.language.name': string; 'service.node.name': string; 'service.runtime.name': string; 'service.runtime.version': string; 'service.framework.name': string; 'service.target.name': string; 'service.target.type': string; 'span.action': string; 'span.id': string; 'span.name': string; 'span.type': string; 'span.subtype': string; 'span.duration.us': number; 'span.destination.service.resource': string; 'span.destination.service.response_time.sum.us': number; 'span.destination.service.response_time.count': number; 'span.self_time.count': number; 'span.self_time.sum.us': number; 'span.links': { trace: { id: string; }; span: { id: string; }; }[]; 'cloud.provider': string; 'cloud.project.name': string; 'cloud.service.name': string; 'cloud.availability_zone': string; 'cloud.machine.type': string; 'cloud.region': string; 'host.os.platform': string; 'faas.id': string; 'faas.name': string; 'faas.coldstart': boolean; 'faas.execution': string; 'faas.trigger.type': string; 'faas.trigger.request_id': string; }> & Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; }>" + "; 'network.connection.type': string; 'network.connection.subtype': string; 'network.carrier.name': string; 'network.carrier.mcc': string; 'network.carrier.mnc': string; 'network.carrier.icc': string; 'parent.id': string; 'processor.event': string; 'processor.name': string; 'session.id': string; 'trace.id': string; 'transaction.name': string; 'transaction.type': string; 'transaction.id': string; 'transaction.duration.us': number; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; 'transaction.sampled': true; 'service.name': string; 'service.version': string; 'service.environment': string; 'service.language.name': string; 'service.node.name': string; 'service.runtime.name': string; 'service.runtime.version': string; 'service.framework.name': string; 'service.framework.version': string; 'service.target.name': string; 'service.target.type': string; 'span.action': string; 'span.id': string; 'span.name': string; 'span.type': string; 'span.subtype': string; 'span.duration.us': number; 'span.destination.service.resource': string; 'span.destination.service.response_time.sum.us': number; 'span.destination.service.response_time.count': number; 'span.self_time.count': number; 'span.self_time.sum.us': number; 'span.links': { trace: { id: string; }; span: { id: string; }; }[]; 'url.original': string; }> & Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; }>" ], "path": "packages/kbn-apm-synthtrace/src/lib/apm/apm_fields.ts", "deprecated": false, @@ -1110,6 +1112,24 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.apm.mobileApp", + "type": "Function", + "tags": [], + "label": "mobileApp", + "description": [], + "signature": [ + "{ (name: string, environment: string, agentName: MobileAgentName): ", + "MobileApp", + "; (options: { name: string; environment: string; agentName: MobileAgentName; }): ", + "MobileApp", + "; }" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/apm/index.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/apm-synthtrace", "id": "def-server.apm.browser", @@ -1158,7 +1178,9 @@ "section": "def-server.ApmFields", "text": "ApmFields" }, - "[]) => { 'metricset.name': string; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; _doc_count: number; '@timestamp'?: number | undefined; 'timestamp.us'?: number | undefined; 'agent.name'?: string | undefined; 'agent.version'?: string | undefined; 'container.id'?: string | undefined; 'destination.address'?: string | undefined; 'destination.port'?: number | undefined; 'ecs.version'?: string | undefined; 'event.outcome'?: string | undefined; 'event.ingested'?: number | undefined; 'error.id'?: string | undefined; 'error.exception'?: ", + "[]) => { 'metricset.name': string; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; _doc_count: number; '@timestamp'?: number | undefined; 'timestamp.us'?: number | undefined; 'agent.name'?: string | undefined; 'agent.version'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.location'?: ", + "GeoLocation", + " | undefined; 'client.ip'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.region'?: string | undefined; 'container.id'?: string | undefined; 'destination.address'?: string | undefined; 'destination.port'?: number | undefined; 'device.id'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'device.manufacturer'?: string | undefined; 'ecs.version'?: string | undefined; 'event.outcome'?: string | undefined; 'event.ingested'?: number | undefined; 'error.id'?: string | undefined; 'error.exception'?: ", { "pluginId": "@kbn/apm-synthtrace", "scope": "server", @@ -1166,9 +1188,9 @@ "section": "def-server.ApmException", "text": "ApmException" }, - "[] | undefined; 'error.grouping_name'?: string | undefined; 'error.grouping_key'?: string | undefined; 'host.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.hostname'?: string | undefined; 'http.request.method'?: string | undefined; 'http.response.status_code'?: number | undefined; 'kubernetes.pod.uid'?: string | undefined; 'kubernetes.pod.name'?: string | undefined; observer?: ", + "[] | undefined; 'error.grouping_name'?: string | undefined; 'error.grouping_key'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.trigger.type'?: string | undefined; 'faas.trigger.request_id'?: string | undefined; 'host.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.hostname'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'http.request.method'?: string | undefined; 'http.response.status_code'?: number | undefined; 'kubernetes.pod.uid'?: string | undefined; 'kubernetes.pod.name'?: string | undefined; observer?: ", "Observer", - " | undefined; 'parent.id'?: string | undefined; 'processor.event'?: string | undefined; 'processor.name'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.id'?: string | undefined; 'transaction.duration.us'?: number | undefined; 'transaction.sampled'?: true | undefined; 'service.name'?: string | undefined; 'service.version'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.runtime.name'?: string | undefined; 'service.runtime.version'?: string | undefined; 'service.framework.name'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.type'?: string | undefined; 'span.action'?: string | undefined; 'span.id'?: string | undefined; 'span.name'?: string | undefined; 'span.type'?: string | undefined; 'span.subtype'?: string | undefined; 'span.duration.us'?: number | undefined; 'span.destination.service.resource'?: string | undefined; 'span.destination.service.response_time.sum.us'?: number | undefined; 'span.destination.service.response_time.count'?: number | undefined; 'span.self_time.count'?: number | undefined; 'span.self_time.sum.us'?: number | undefined; 'span.links'?: { trace: { id: string; }; span: { id: string; }; }[] | undefined; 'cloud.provider'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.region'?: string | undefined; 'host.os.platform'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.trigger.type'?: string | undefined; 'faas.trigger.request_id'?: string | undefined; 'system.process.memory.size'?: number | undefined; 'system.memory.actual.free'?: number | undefined; 'system.memory.total'?: number | undefined; 'system.cpu.total.norm.pct'?: number | undefined; 'system.process.memory.rss.bytes'?: number | undefined; 'system.process.cpu.total.norm.pct'?: number | undefined; 'jvm.memory.heap.used'?: number | undefined; 'jvm.memory.non_heap.used'?: number | undefined; 'jvm.thread.count'?: number | undefined; 'faas.billed_duration'?: number | undefined; 'faas.timeout'?: number | undefined; 'faas.coldstart_duration'?: number | undefined; 'faas.duration'?: number | undefined; }[]" + " | undefined; 'network.connection.type'?: string | undefined; 'network.connection.subtype'?: string | undefined; 'network.carrier.name'?: string | undefined; 'network.carrier.mcc'?: string | undefined; 'network.carrier.mnc'?: string | undefined; 'network.carrier.icc'?: string | undefined; 'parent.id'?: string | undefined; 'processor.event'?: string | undefined; 'processor.name'?: string | undefined; 'session.id'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.id'?: string | undefined; 'transaction.duration.us'?: number | undefined; 'transaction.sampled'?: true | undefined; 'service.name'?: string | undefined; 'service.version'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.runtime.name'?: string | undefined; 'service.runtime.version'?: string | undefined; 'service.framework.name'?: string | undefined; 'service.framework.version'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.type'?: string | undefined; 'span.action'?: string | undefined; 'span.id'?: string | undefined; 'span.name'?: string | undefined; 'span.type'?: string | undefined; 'span.subtype'?: string | undefined; 'span.duration.us'?: number | undefined; 'span.destination.service.resource'?: string | undefined; 'span.destination.service.response_time.sum.us'?: number | undefined; 'span.destination.service.response_time.count'?: number | undefined; 'span.self_time.count'?: number | undefined; 'span.self_time.sum.us'?: number | undefined; 'span.links'?: { trace: { id: string; }; span: { id: string; }; }[] | undefined; 'url.original'?: string | undefined; 'system.process.memory.size'?: number | undefined; 'system.memory.actual.free'?: number | undefined; 'system.memory.total'?: number | undefined; 'system.cpu.total.norm.pct'?: number | undefined; 'system.process.memory.rss.bytes'?: number | undefined; 'system.process.cpu.total.norm.pct'?: number | undefined; 'jvm.memory.heap.used'?: number | undefined; 'jvm.memory.non_heap.used'?: number | undefined; 'jvm.thread.count'?: number | undefined; 'faas.billed_duration'?: number | undefined; 'faas.timeout'?: number | undefined; 'faas.coldstart_duration'?: number | undefined; 'faas.duration'?: number | undefined; }[]" ], "path": "packages/kbn-apm-synthtrace/src/lib/apm/index.ts", "deprecated": false, @@ -1214,7 +1236,9 @@ "section": "def-server.ApmFields", "text": "ApmFields" }, - "[]) => { \"metricset.name\": string; 'span.destination.service.response_time.sum.us': number; 'span.destination.service.response_time.count': number; '@timestamp'?: number | undefined; 'timestamp.us'?: number | undefined; 'agent.name'?: string | undefined; 'agent.version'?: string | undefined; 'container.id'?: string | undefined; 'destination.address'?: string | undefined; 'destination.port'?: number | undefined; 'ecs.version'?: string | undefined; 'event.outcome'?: string | undefined; 'event.ingested'?: number | undefined; 'error.id'?: string | undefined; 'error.exception'?: ", + "[]) => { \"metricset.name\": string; 'span.destination.service.response_time.sum.us': number; 'span.destination.service.response_time.count': number; '@timestamp'?: number | undefined; 'timestamp.us'?: number | undefined; 'agent.name'?: string | undefined; 'agent.version'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.location'?: ", + "GeoLocation", + " | undefined; 'client.ip'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.region'?: string | undefined; 'container.id'?: string | undefined; 'destination.address'?: string | undefined; 'destination.port'?: number | undefined; 'device.id'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'device.manufacturer'?: string | undefined; 'ecs.version'?: string | undefined; 'event.outcome'?: string | undefined; 'event.ingested'?: number | undefined; 'error.id'?: string | undefined; 'error.exception'?: ", { "pluginId": "@kbn/apm-synthtrace", "scope": "server", @@ -1222,9 +1246,9 @@ "section": "def-server.ApmException", "text": "ApmException" }, - "[] | undefined; 'error.grouping_name'?: string | undefined; 'error.grouping_key'?: string | undefined; 'host.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.hostname'?: string | undefined; 'http.request.method'?: string | undefined; 'http.response.status_code'?: number | undefined; 'kubernetes.pod.uid'?: string | undefined; 'kubernetes.pod.name'?: string | undefined; observer?: ", + "[] | undefined; 'error.grouping_name'?: string | undefined; 'error.grouping_key'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.trigger.type'?: string | undefined; 'faas.trigger.request_id'?: string | undefined; 'host.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.hostname'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'http.request.method'?: string | undefined; 'http.response.status_code'?: number | undefined; 'kubernetes.pod.uid'?: string | undefined; 'kubernetes.pod.name'?: string | undefined; observer?: ", "Observer", - " | undefined; 'parent.id'?: string | undefined; 'processor.event'?: string | undefined; 'processor.name'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.id'?: string | undefined; 'transaction.duration.us'?: number | undefined; 'transaction.duration.histogram'?: { values: number[]; counts: number[]; } | undefined; 'transaction.sampled'?: true | undefined; 'service.name'?: string | undefined; 'service.version'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.runtime.name'?: string | undefined; 'service.runtime.version'?: string | undefined; 'service.framework.name'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.type'?: string | undefined; 'span.action'?: string | undefined; 'span.id'?: string | undefined; 'span.name'?: string | undefined; 'span.type'?: string | undefined; 'span.subtype'?: string | undefined; 'span.duration.us'?: number | undefined; 'span.destination.service.resource'?: string | undefined; 'span.self_time.count'?: number | undefined; 'span.self_time.sum.us'?: number | undefined; 'span.links'?: { trace: { id: string; }; span: { id: string; }; }[] | undefined; 'cloud.provider'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.region'?: string | undefined; 'host.os.platform'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.trigger.type'?: string | undefined; 'faas.trigger.request_id'?: string | undefined; 'system.process.memory.size'?: number | undefined; 'system.memory.actual.free'?: number | undefined; 'system.memory.total'?: number | undefined; 'system.cpu.total.norm.pct'?: number | undefined; 'system.process.memory.rss.bytes'?: number | undefined; 'system.process.cpu.total.norm.pct'?: number | undefined; 'jvm.memory.heap.used'?: number | undefined; 'jvm.memory.non_heap.used'?: number | undefined; 'jvm.thread.count'?: number | undefined; 'faas.billed_duration'?: number | undefined; 'faas.timeout'?: number | undefined; 'faas.coldstart_duration'?: number | undefined; 'faas.duration'?: number | undefined; }[]" + " | undefined; 'network.connection.type'?: string | undefined; 'network.connection.subtype'?: string | undefined; 'network.carrier.name'?: string | undefined; 'network.carrier.mcc'?: string | undefined; 'network.carrier.mnc'?: string | undefined; 'network.carrier.icc'?: string | undefined; 'parent.id'?: string | undefined; 'processor.event'?: string | undefined; 'processor.name'?: string | undefined; 'session.id'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.id'?: string | undefined; 'transaction.duration.us'?: number | undefined; 'transaction.duration.histogram'?: { values: number[]; counts: number[]; } | undefined; 'transaction.sampled'?: true | undefined; 'service.name'?: string | undefined; 'service.version'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.runtime.name'?: string | undefined; 'service.runtime.version'?: string | undefined; 'service.framework.name'?: string | undefined; 'service.framework.version'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.type'?: string | undefined; 'span.action'?: string | undefined; 'span.id'?: string | undefined; 'span.name'?: string | undefined; 'span.type'?: string | undefined; 'span.subtype'?: string | undefined; 'span.duration.us'?: number | undefined; 'span.destination.service.resource'?: string | undefined; 'span.self_time.count'?: number | undefined; 'span.self_time.sum.us'?: number | undefined; 'span.links'?: { trace: { id: string; }; span: { id: string; }; }[] | undefined; 'url.original'?: string | undefined; 'system.process.memory.size'?: number | undefined; 'system.memory.actual.free'?: number | undefined; 'system.memory.total'?: number | undefined; 'system.cpu.total.norm.pct'?: number | undefined; 'system.process.memory.rss.bytes'?: number | undefined; 'system.process.cpu.total.norm.pct'?: number | undefined; 'jvm.memory.heap.used'?: number | undefined; 'jvm.memory.non_heap.used'?: number | undefined; 'jvm.thread.count'?: number | undefined; 'faas.billed_duration'?: number | undefined; 'faas.timeout'?: number | undefined; 'faas.coldstart_duration'?: number | undefined; 'faas.duration'?: number | undefined; }[]" ], "path": "packages/kbn-apm-synthtrace/src/lib/apm/index.ts", "deprecated": false, diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index fdaf7e17a7247..ccedd1ba70618 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Owner missing] for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 76 | 0 | 76 | 13 | +| 77 | 0 | 77 | 15 | ## Server diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index bb0a8c30ba7b6..863fd37e78ca9 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 19a5f1ad98ea9..3681f5a89e232 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 68ebca7534261..d110ecd016d99 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 12b71b74d943c..7b84d87c26494 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 1253b6e7356c6..2408fd1b5b214 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 37810fd10cd7b..680ae2bfa1377 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index c7a0357ba39e3..c6a8fd190af73 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 53bd40fe1a3a1..4af90e50e3293 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 16dd69cf9317e..1cc88ccde57ee 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 708ceb9b6c05a..ff06356a2dac1 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 3ed7da29772af..f9ae396315bd4 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index fd7a3358c5970..e1cd8c3aa768c 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_inspector.mdx b/api_docs/kbn_content_management_inspector.mdx index c48ec78d3145d..a8c0730274de0 100644 --- a/api_docs/kbn_content_management_inspector.mdx +++ b/api_docs/kbn_content_management_inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-inspector title: "@kbn/content-management-inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-inspector plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-inspector'] --- import kbnContentManagementInspectorObj from './kbn_content_management_inspector.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index 1df20fece5df8..9f09e0a513d89 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index e138442ddda8a..875de818de4f3 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 7b3f475c815bd..3794293d58751 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 6bdc7c9ae3833..6766a269c01f6 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index bd76c00f3956b..43f8030e3dd3f 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 83c5fe8f88193..0a02b89aeaecc 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index c623338681c61..827b6b6f41424 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index bae8feca61517..2bb4635c3f8ce 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index e0db4e3081f87..ba5d25993cf3b 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index fbb7b0b5d2b5e..b564eae6df7f7 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 6bcfc76965570..55d244f74a445 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index a403ceec9757f..acee2b4135d1d 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index c4674b146ceb0..ede459f998342 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 1d37c28ba0538..127b5f0931824 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 18e091e19fa70..6ad1a247a18a6 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index eee27b24d3a87..2e04759505460 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 501e2a8132fb6..4905076a6fb10 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 9d62b2053cd48..fca66f945653f 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index bb4763c496985..fd32b1567ea49 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 0b179701b2bed..72fd3912c1f45 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index a23dc6b94595c..8aefc1a4e5ccc 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 8494e6833af33..4a5a113c7fb90 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 1197ec3f49581..6a3d1fb392f77 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index ead8f251e06f5..3f87d6133765e 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 4fbd29fc8eb96..cc4a40b1d0856 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index eb0162b866ab6..dd27aebd8affa 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index e405cf5256531..f3bf9d48c79dc 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index d24971ac00b4b..34849151df6d2 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 8b67195a256b4..45d449c391b89 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index de5f355dbc3eb..cc304fb6e0e49 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 15ad044e228d2..fee356f36f657 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 97a0f29614524..2854b4991c5c2 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index efa4e081fea9b..378fc061fb0bb 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 401afc56835c9..48a86f2ecc671 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 0685587258be5..78b86ea1747b7 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index e3d0c922b753e..db8d686dfd2f7 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 02504301f8043..0ade7d0bedf52 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 97a0c2572ec7e..3ca423d822747 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 97c87063435e5..875a79b830759 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index db70417f5abe6..a311169bb707d 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 18a21a41197d1..aa829eb5af1ab 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 87f9413cc1b79..e3db0cb91f69d 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index f59073f470892..e3ad0f4b32da0 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index dcb694db9c788..0dbe495d2af91 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 66a42cf170fb8..ecb0528216d50 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 155c49ebe0c0e..ad6f4f59c5cb6 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 26daf043a5389..427736e24ab9f 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 56764e150126b..20ba82f1c86e8 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index e3afcaa5d1120..fa7a0d14c3b74 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 522a26b552a92..3d0ec76fefe5c 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 637063fc00cbf..5fceaa18261f5 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 4ad8cff0e44d0..48070b198cf09 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 719a3bcfb2fea..e3a3b2e9053e1 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 63dda315f6e63..105b5cc529624 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index dbeee26176bc5..9c90617eea6be 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 2b3318c8f682e..3ae9159df376c 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 0b461097533d8..d1e8a9a7ace0e 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index d5c4b5931d8d1..1e865809c32b0 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 51f1d143e50bb..9fb8f5cdd38c9 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index d332395077dfe..344eeb3905ed6 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index f649b1a5084dc..cbb033e64daab 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 3590e069264ea..ab53f41426d2f 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 99681132acd3f..f10198c7767b4 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index d7d58d0622bde..667d24ae601b7 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 415997e2e5d97..733eed156a215 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index a6cdf0088c229..430e5135d8f43 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index ca63095520e9e..1bdbc08b3e0f1 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 98d67894aa374..198fb0efd058a 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index 5c358e1bf3ee5..d5b1ba8eff546 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index a56485818b13e..adb7425b404bd 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 5db1c4d7c80ce..5623325298117 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index 589e3f65df79f..b9ce28b26de09 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] --- import kbnCoreInjectedMetadataBrowserObj from './kbn_core_injected_metadata_browser.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 30a3e3268391c..049881ccafb3f 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 1470dceb97475..0414e458c1e9b 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index b1007cdd878b1..060e3dc0b89b5 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index d1e8a310cbd48..bc95e1fede524 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 50624f64bbbdb..36de2a6fdcf30 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 85b789abdec82..19e0d73e87b61 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 1eeab2afa1890..46ec4e3d55bd6 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index b9913f64c82de..90961a021a9dd 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 21952c6855467..b9e44aa6db296 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 265cd19274dd6..ddc1fee1c9a90 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 8685a560e55e1..b9fa0553eadd9 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index cf39bf305fcc8..567b81e2398b4 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 0633547cd0e3d..fc5c03efbf86e 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 9e25af476a8ed..a1f14833111a0 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 82cadc3e70ca5..24edd4fd7db9f 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 5c8f5d210fe3a..ab09bdbce9061 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index a92671fc66e6f..daa80142440ee 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 524a6ba0799ba..f84109d617877 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index a534f7faac9c6..2b897ab8bd2d7 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index dd6205e5f2370..7718b79e3269e 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 38e27111a9a2c..313e7e0d33b1f 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index c1de6633c662c..8226ae0261625 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 5ac8c462cbdf0..2688e7cfff62f 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index a400d724ea5df..b558157b788ca 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index ffd99cc42ad2c..15c2aef58a153 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 0e293392196ef..863fcd416372c 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 1cbc299038109..7cb3f94a4d2ae 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index 5fc96cf686686..999c9711d93d6 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 594d990bd860f..48933e4b49584 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 752d43b5d06ac..1818e510e9808 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 924a88eaa189a..7d049953a1805 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index af54da408b8b8..a8a6093775a77 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 7161dd6089bc5..3b5fe7586bbd4 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 98b3ada83b6f7..f7df7fc55628d 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 8d99f5656f813..20de1df675f15 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index b1961c3ecd812..d2ecdbd943edd 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 52cd2903f08d8..05a44e1048b41 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index a4b699f0e1925..33ed01e540e7d 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 2b7aa07349f6f..09f39cef8606f 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index c55a87a284e78..f51d3393eb5bf 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 450fdf0f3b9b3..6bc31950f2371 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 67582471ad545..d37c347e49a0e 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 2b0b79781c939..d6e3ef6e3441b 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 57541aa7881aa..6f571ab6405fa 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index dcba6934248c6..2baee7f52199d 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 6617d3cb0917b..024145f6c7025 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index cf290fbc0847d..d75e2388a8d2f 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index 046fc83286c77..0c9fa19e0a21e 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index bbdd4ae995b98..1037858300e8a 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 1ce539d23e5cb..9b660a824af81 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index b58a03abf12f8..6011ab3c0c53b 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index a2d91cb312168..597ccde8de39d 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index b8b1440cb9e51..9fd151c1e8098 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 6beb73f5ea5f2..743effe2ec263 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 0d0a6ed6b5641..a8de657964689 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 172df432d6b25..384cd5373b06c 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 4c6131b8516c1..098f113d5e5ee 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 92a3c9e57cc03..4f74e4d55ef48 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 5eaec4116d746..af10ac080a940 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index a6345b834e246..3f509e0c08940 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 9ef1ba5516ed2..d6308322de08b 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index da490735f5d19..f60201fce4cef 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 0213334b956a8..f141f22774db4 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 281fa22114d0d..e041960a2a5e3 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 6b8f435287bc4..c87e29eaa59a6 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 6c2d9b8fe5398..490d64b62882a 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index a5b579a6409a2..4bf2ccfe09b4d 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index c358d75875604..0badc020a0eb4 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 7d2b54fb1e786..8057e87eb5cd6 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index d353ce845f2dc..9ceeb0bdb0f9a 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 2188bab8a59b2..a576b48cc523c 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index f2719144ca127..9141ef50719d7 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 0a3e003b4cbf9..415def8b8a0a7 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 9fdf4a8219f12..bd28003890d14 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 449e9c0f401c6..082a49aa5ed16 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index a21338ea0b94b..1a79381268566 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index f9a3628309597..b99c41f5a05e2 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index a6d403d73d330..ab42690b80ab3 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index f94ccd080d6e3..7f17431a56f72 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index fce8645543f33..faedf9fa701ac 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 36a60224ac046..bc84e1fae44d8 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 35fa845810eb5..7272dc59cb4b0 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 82e447bd4fedb..4a561c43f4aac 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 5f04661513e32..3aaced7b707aa 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 4d19ab132d457..fda56be800720 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 1c1b4012855dd..f53bdcaae17d0 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index ba35ce87392ed..f1a449d9b1d73 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index b6365638ea64b..60921a34e5c08 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index c5d35491c1d47..85274e244f6c8 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index bb62c790c9dc3..5d1d2de344049 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index dc2b497807641..04421466cda96 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index e82a9d1ace2c5..e3bf147690d6f 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index f3b30e4636862..c114bba5dab9d 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index c59217429a209..2bc0ff59420bd 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 32d8ab220e015..7c3ca77e40700 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 8ea0ecaa65676..c7a74b4774b9b 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index c0d757e2929a8..df0fd50ec32fa 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 227026103aa5d..36b0750e354a9 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_get_repo_files.mdx b/api_docs/kbn_get_repo_files.mdx index 6c46cb85de663..c0b5a21988711 100644 --- a/api_docs/kbn_get_repo_files.mdx +++ b/api_docs/kbn_get_repo_files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-get-repo-files title: "@kbn/get-repo-files" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/get-repo-files plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/get-repo-files'] --- import kbnGetRepoFilesObj from './kbn_get_repo_files.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index bf1243ea0cd52..8f3f23c2de39d 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 3b45c346f990b..b742a9ec4185d 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 398c30372675e..2106acf6e8162 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 024699e541abc..f34df6015260c 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 2dce5130032c1..1067f19777337 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 46fbb683c6fd6..6d6cf8c069e2d 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 61f983ef24b9e..14d495ad8995f 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 54c6c66b68d04..2627e2e58c155 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index ca22474813c34..97cfb60a00997 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index a4d5b8857f922..9c7b065d93a3e 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 2f4e3da459e79..1f6a30da69f48 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index d902f388c6655..7e6c69b911a85 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index d8df916ebee13..e708822aedfea 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 10aaf2d2201d2..7a7022f17e862 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 512a589a6763d..3f3d3acb9b655 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index d0798b73d5301..a0775d477a36a 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index f19e9a77aabf5..3bb564314ca3d 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 1f682cd736348..0e1fa4e3eeb7e 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 634d5bfe7035d..33f3d9f18b2d3 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index ae2e9b8272d94..1553c9b144f43 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 04c331017c417..612d7fbbe11fc 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 6f753874df262..3c937a50e66b4 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_monaco.devdocs.json b/api_docs/kbn_monaco.devdocs.json index 4bcaaaf4efbfd..c7fe8ddfb47bf 100644 --- a/api_docs/kbn_monaco.devdocs.json +++ b/api_docs/kbn_monaco.devdocs.json @@ -35,6 +35,14 @@ "section": "def-common.LangModuleType", "text": "LangModuleType" }, + " | ", + { + "pluginId": "@kbn/monaco", + "scope": "common", + "docId": "kibKbnMonacoPluginApi", + "section": "def-common.CustomLangModuleType", + "text": "CustomLangModuleType" + }, ") => void" ], "path": "packages/kbn-monaco/src/helpers.ts", @@ -44,7 +52,7 @@ { "parentPluginId": "@kbn/monaco", "id": "def-common.registerLanguage.$1", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "language", "description": [], @@ -55,6 +63,14 @@ "docId": "kibKbnMonacoPluginApi", "section": "def-common.LangModuleType", "text": "LangModuleType" + }, + " | ", + { + "pluginId": "@kbn/monaco", + "scope": "common", + "docId": "kibKbnMonacoPluginApi", + "section": "def-common.CustomLangModuleType", + "text": "CustomLangModuleType" } ], "path": "packages/kbn-monaco/src/helpers.ts", @@ -68,6 +84,60 @@ } ], "interfaces": [ + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.BaseWorkerDefinition", + "type": "Interface", + "tags": [], + "label": "BaseWorkerDefinition", + "description": [], + "path": "packages/kbn-monaco/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.BaseWorkerDefinition.getSyntaxErrors", + "type": "Function", + "tags": [], + "label": "getSyntaxErrors", + "description": [], + "signature": [ + "(modelUri: string) => Promise<", + { + "pluginId": "@kbn/monaco", + "scope": "common", + "docId": "kibKbnMonacoPluginApi", + "section": "def-common.EditorError", + "text": "EditorError" + }, + "[] | undefined>" + ], + "path": "packages/kbn-monaco/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.BaseWorkerDefinition.getSyntaxErrors.$1", + "type": "string", + "tags": [], + "label": "modelUri", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-monaco/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/monaco", "id": "def-common.CompleteLangModuleType", @@ -168,6 +238,53 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.CustomLangModuleType", + "type": "Interface", + "tags": [], + "label": "CustomLangModuleType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/monaco", + "scope": "common", + "docId": "kibKbnMonacoPluginApi", + "section": "def-common.CustomLangModuleType", + "text": "CustomLangModuleType" + }, + " extends ", + { + "pluginId": "@kbn/monaco", + "scope": "common", + "docId": "kibKbnMonacoPluginApi", + "section": "def-common.LangModuleType", + "text": "LangModuleType" + } + ], + "path": "packages/kbn-monaco/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.CustomLangModuleType.onLanguage", + "type": "Function", + "tags": [], + "label": "onLanguage", + "description": [], + "signature": [ + "() => void" + ], + "path": "packages/kbn-monaco/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/monaco", "id": "def-common.EditorError", @@ -268,7 +385,7 @@ "description": [], "signature": [ "languages", - ".IMonarchLanguage" + ".IMonarchLanguage | undefined" ], "path": "packages/kbn-monaco/src/types.ts", "deprecated": false, @@ -288,34 +405,6 @@ "path": "packages/kbn-monaco/src/types.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "@kbn/monaco", - "id": "def-common.LangModuleType.getSuggestionProvider", - "type": "Object", - "tags": [], - "label": "getSuggestionProvider", - "description": [], - "signature": [ - "Function | undefined" - ], - "path": "packages/kbn-monaco/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/monaco", - "id": "def-common.LangModuleType.getSyntaxErrors", - "type": "Object", - "tags": [], - "label": "getSyntaxErrors", - "description": [], - "signature": [ - "Function | undefined" - ], - "path": "packages/kbn-monaco/src/types.ts", - "deprecated": false, - "trackAdoption": false } ], "initialIsOpen": false @@ -573,6 +662,36 @@ ], "enums": [], "misc": [ + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.ESQL_LANG_ID", + "type": "string", + "tags": [], + "label": "ESQL_LANG_ID", + "description": [], + "signature": [ + "\"esql\"" + ], + "path": "packages/kbn-monaco/src/esql/lib/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.ESQL_THEME_ID", + "type": "string", + "tags": [], + "label": "ESQL_THEME_ID", + "description": [], + "signature": [ + "\"esqlTheme\"" + ], + "path": "packages/kbn-monaco/src/esql/lib/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/monaco", "id": "def-common.PainlessCompletionKind", @@ -605,46 +724,6 @@ } ], "objects": [ - { - "parentPluginId": "@kbn/monaco", - "id": "def-common.EsqlLang", - "type": "Object", - "tags": [], - "label": "EsqlLang", - "description": [], - "path": "packages/kbn-monaco/src/esql/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/monaco", - "id": "def-common.EsqlLang.ID", - "type": "string", - "tags": [], - "label": "ID", - "description": [], - "path": "packages/kbn-monaco/src/esql/index.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/monaco", - "id": "def-common.EsqlLang.lexerRules", - "type": "Object", - "tags": [], - "label": "lexerRules", - "description": [], - "signature": [ - "languages", - ".IMonarchLanguage" - ], - "path": "packages/kbn-monaco/src/esql/index.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/monaco", "id": "def-common.PainlessLang", @@ -817,6 +896,46 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.SQLLang", + "type": "Object", + "tags": [], + "label": "SQLLang", + "description": [], + "path": "packages/kbn-monaco/src/sql/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.SQLLang.ID", + "type": "string", + "tags": [], + "label": "ID", + "description": [], + "path": "packages/kbn-monaco/src/sql/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.SQLLang.lexerRules", + "type": "Object", + "tags": [], + "label": "lexerRules", + "description": [], + "signature": [ + "languages", + ".IMonarchLanguage" + ], + "path": "packages/kbn-monaco/src/sql/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/monaco", "id": "def-common.XJsonLang", diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 2f37f0945eee0..6bb3d41bd64ee 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Owner missing] for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 55 | 0 | 55 | 2 | +| 60 | 0 | 60 | 2 | ## Common diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 94a18337f9157..aee94cf8cbce9 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index c0941af42b9c6..a07101650d083 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 2a83fc4541a97..dd0fd41b965ef 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_peggy.mdx b/api_docs/kbn_peggy.mdx index 6040fd1034b17..cdf7c1370ead6 100644 --- a/api_docs/kbn_peggy.mdx +++ b/api_docs/kbn_peggy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-peggy title: "@kbn/peggy" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/peggy plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/peggy'] --- import kbnPeggyObj from './kbn_peggy.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 666a9a47ebbb3..b7d64df60d5c6 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 66170a55204c8..3ca5688c21c86 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 0188289fe07e9..73e2462094952 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 59a2f4792906e..eaee1b559db38 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 39c4185deddb5..9133c1377eb95 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index e7209d59cfc41..f1f9120c79261 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 9de4ceb5fd580..77d8a832af766 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index b3b9aed355d1e..43d909fc89ffb 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 993e01ec777db..a76bb26753df9 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 75895fad2ba94..115771988455d 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index a60946c6aa4ee..37b4b57615d14 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 80223b52da256..1ca7397a98be0 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 4c1da22178851..f7c384dc84217 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index df62854665aa9..fd2a78216be34 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 876ec8b2a2956..8f5b3978bd8ed 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 100ed0051283a..697b0af8dcea9 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index c7d728fcb2ef5..3e2a3678210e7 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 7ea1b13288615..43a7ba047c1b0 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 4b240593f4cab..cdc54f34e92a7 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 9315d257b7227..a295805f9dcee 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index a47a100287019..90df79701d76f 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 6fa33d5b3816c..fc8ba0f82395a 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 9a9c8df585f2c..50c4313aa41af 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 086e72c0c6a6d..1343f1ebfaa84 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 0f3b65d3edc04..feb39740f2c24 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index d961080164606..56f131d672912 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index f1e3416ad130d..6048a1503ed65 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 64743e058271f..02529f5eb1562 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index 6b1e441ae35d8..9fa4bf2141d3a 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 975aa866db568..ce448bac7fb10 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 9379ae75ac9e5..afd91c9a887a5 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index 655543a6fa8f5..01eca0aafc1fb 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index d60cdfeadfde7..ae66d93bbe208 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 9a249e5a86216..fe6d118da48b3 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 7c9ba99759244..3e9640d2b211d 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 9dee7a63f2789..f1e9b4932045a 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 959ddcacd783e..cbb08b48dd82b 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 4d403e0f3d7e4..2fa11f88060cc 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 86edf0db66f4e..20b134fb1115b 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 470d000fb88c7..d7a4d5296a1ca 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index dc6ea8ac3b521..8e57e2067217e 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index aea49e73ab154..d799655908e0d 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 19faa3fab5a0d..80b9a6f2bc428 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 9d04da757025e..f0b72cfe40b34 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 3f3f1e4998fe8..361ae6d2a4f75 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index e6c6e87cdb6dc..ecc73b2980485 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 7c0405c89904d..bfb6cda50579a 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 05befb33f8739..7b56803a06446 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.devdocs.json b/api_docs/kbn_shared_ux_page_no_data_config.devdocs.json index 73e12b09b9d23..56686c1327cb2 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.devdocs.json +++ b/api_docs/kbn_shared_ux_page_no_data_config.devdocs.json @@ -173,9 +173,9 @@ "label": "props", "description": [], "signature": [ - "P & Pick<", - "KibanaPageTemplateProps", - ", \"pageSideBar\" | \"pageSideBarProps\"> & { children?: React.ReactNode; } & { solutionNav: ", + "P & ", + "TemplateProps", + " & { solutionNav: ", { "pluginId": "@kbn/shared-ux-page-solution-nav", "scope": "common", diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 1780b12ce0164..de4c012609171 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index f0605f8beb159..073bc4a02f9e5 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index a4642227d6521..747e89a7670ca 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.devdocs.json b/api_docs/kbn_shared_ux_page_solution_nav.devdocs.json index 4d792171e0bbc..7580d764c8edc 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.devdocs.json +++ b/api_docs/kbn_shared_ux_page_solution_nav.devdocs.json @@ -78,7 +78,9 @@ "label": "withSolutionNav", "description": [], "signature": [ - "

(WrappedComponent: React.ComponentType

) => { (props: Props

): JSX.Element; displayName: string; }" + "

(WrappedComponent: React.ComponentType

) => { (props: Props

): JSX.Element; displayName: string; }" ], "path": "packages/shared-ux/page/solution_nav/src/with_solution_nav.tsx", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index cf2a439600f03..ecdd786f08fcc 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Owner missing] for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 5 | 0 | 3 | 0 | +| 5 | 0 | 3 | 1 | ## Common diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 1099afe206d37..7bc589e1f91c5 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 24d049e7ccb1c..77fc06ee54a15 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index ba8de80aa601b..0800d2782eebb 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 50427f3ec333b..631c31363e45c 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index 9da4bceb48b4b..856341d3c8724 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index b237179b16d74..8de2cc806aafa 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index fb7c50370645f..42ff1726f2622 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 981957afdbc08..117805b315520 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index fecfd1a7c50fe..4e2fae817bf94 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index da3283def477c..87c15a389ffe9 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-package-json plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] --- import kbnSortPackageJsonObj from './kbn_sort_package_json.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 5c8a0a4666187..116b31639670e 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 3d3700fe664ab..08a43817b5dd2 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index edc5a93e04ca5..7ff24f8533573 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 470a39f4e7ec8..ccf6dd8f1be6d 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 408d56d66292d..412dd4370b641 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 7a6aacff50a9b..d4381a626b2b8 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 947775ba20792..7661bf10788f5 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index a71f657104775..e10f102b5fd90 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index 632f176d939f1..59d6ac0e7370a 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] --- import kbnTypeSummarizerObj from './kbn_type_summarizer.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index 0a5bbca05708d..e31f2f3f0d7d5 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer-core plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] --- import kbnTypeSummarizerCoreObj from './kbn_type_summarizer_core.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index bae459deb6286..364a264633a06 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 123876b087342..9806e36fe1876 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 445b5c19378bd..69f17829eec96 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index cf2e76826a8e8..59175574d7dfa 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index b956387709362..11d126b41db53 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 996d9dc5fa885..575fd7c9c0335 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 0657a7a63b296..4d070f49d8f44 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 3104a7300bc52..152cb6467b704 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index c691771ac98cd..443df579969d1 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index dc33aca98f8d3..5f113ddcf0e6f 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index f35b57725e87a..644f6083ff6bf 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index b1c4b379be90a..671a5e0244f0b 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 4762dc2ec8807..30753b6ceae20 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -2330,7 +2330,15 @@ "section": "def-common.DataView", "text": "DataView" }, - ") => ", + ", dateRange?: ", + { + "pluginId": "lens", + "scope": "common", + "docId": "kibLensPluginApi", + "section": "def-common.DateRange", + "text": "DateRange" + }, + " | undefined) => ", { "pluginId": "lens", "scope": "public", @@ -2508,6 +2516,28 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "lens", + "id": "def-public.FormulaPublicApi.insertOrReplaceFormulaColumn.$5", + "type": "Object", + "tags": [], + "label": "dateRange", + "description": [], + "signature": [ + { + "pluginId": "lens", + "scope": "common", + "docId": "kibLensPluginApi", + "section": "def-common.DateRange", + "text": "DateRange" + }, + " | undefined" + ], + "path": "x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula_public_api.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 1a4f6cd59e2ab..f616758783f69 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualization | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 693 | 0 | 597 | 50 | +| 694 | 0 | 598 | 50 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index ef120704814a7..142b5d4fcba3b 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index dc36f02726766..a2d42dce0ff96 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index fa403e96ae21f..5205aca1c51a1 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index c9753a644e4cf..364583ce7a582 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 8cf643446054b..a7cf85af82ffe 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 7d99f166a7c2c..98fdf907a8418 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index a42028d92ed20..0e8dbfa9d3e18 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 0f71e564a0067..daff92fbd9253 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 3bcd2b7f0698a..ac221cc77dd9d 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 901a09433217f..2a045f17e5131 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index afb1e359b16b5..c0cde511d36ad 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index a210ece084704..a05ccf3aed8eb 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 5810c95b70253..c6d05d225771c 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 3561806b83ff6..e76854bbb52f0 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -830,6 +830,78 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityAlertSearchBar", + "type": "Function", + "tags": [], + "label": "ObservabilityAlertSearchBar", + "description": [], + "signature": [ + "(props: ", + "ObservabilityAlertSearchBarProps", + ") => JSX.Element" + ], + "path": "x-pack/plugins/observability/public/components/shared/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityAlertSearchBar.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "ObservabilityAlertSearchBarProps" + ], + "path": "x-pack/plugins/observability/public/components/shared/index.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityAlertSearchBarProvider", + "type": "Function", + "tags": [], + "label": "ObservabilityAlertSearchBarProvider", + "description": [], + "signature": [ + "({ children, data: { query: { timefilter: { timefilter: timeFilterService }, }, }, useToasts, triggersActionsUi: { getAlertsSearchBar: AlertsSearchBar }, }: React.PropsWithChildren<", + "Dependencies", + ">) => JSX.Element" + ], + "path": "x-pack/plugins/observability/public/components/shared/alert_search_bar/services.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityAlertSearchBarProvider.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n children,\n data: {\n query: {\n timefilter: { timefilter: timeFilterService },\n },\n },\n useToasts,\n triggersActionsUi: { getAlertsSearchBar: AlertsSearchBar },\n}", + "description": [], + "signature": [ + "React.PropsWithChildren<", + "Dependencies", + ">" + ], + "path": "x-pack/plugins/observability/public/components/shared/alert_search_bar/services.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "observability", "id": "def-public.Prompt", @@ -3438,6 +3510,54 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityPublicPluginsSetup.share", + "type": "CompoundType", + "tags": [], + "label": "share", + "description": [], + "signature": [ + "{ register: (shareMenuProvider: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.ShareMenuProvider", + "text": "ShareMenuProvider" + }, + ") => void; } & { url: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.BrowserUrlService", + "text": "BrowserUrlService" + }, + "; navigate(options: ", + "RedirectOptions", + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "server", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-server.SerializableRecord", + "text": "SerializableRecord" + }, + ">): void; setAnonymousAccessServiceProvider: (provider: () => ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.AnonymousAccessServiceContract", + "text": "AnonymousAccessServiceContract" + }, + ") => void; }" + ], + "path": "x-pack/plugins/observability/public/plugin.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "observability", "id": "def-public.ObservabilityPublicPluginsSetup.triggersActionsUi", @@ -3594,6 +3714,46 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityPublicPluginsStart.share", + "type": "CompoundType", + "tags": [], + "label": "share", + "description": [], + "signature": [ + "{ toggleShareContextMenu: (options: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.ShowShareMenuOptions", + "text": "ShowShareMenuOptions" + }, + ") => void; } & { url: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.BrowserUrlService", + "text": "BrowserUrlService" + }, + "; navigate(options: ", + "RedirectOptions", + "<", + { + "pluginId": "@kbn/utility-types", + "scope": "server", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-server.SerializableRecord", + "text": "SerializableRecord" + }, + ">): void; }" + ], + "path": "x-pack/plugins/observability/public/plugin.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "observability", "id": "def-public.ObservabilityPublicPluginsStart.triggersActionsUi", @@ -11764,6 +11924,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observability", + "id": "def-common.ruleDetailsLocatorID", + "type": "string", + "tags": [], + "label": "ruleDetailsLocatorID", + "description": [], + "signature": [ + "\"RULE_DETAILS_LOCATOR\"" + ], + "path": "x-pack/plugins/observability/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observability", "id": "def-common.SYNTHETICS_BLOCKED_TIMINGS", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 28201f51550e3..df317960f6629 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Observability UI](https://github.com/orgs/elastic/teams/observability-u | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 571 | 40 | 567 | 31 | +| 578 | 40 | 574 | 33 | ## Client diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index c873b152f21ab..7ba3a4f2f231f 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 15de6b78ad710..da13f780e79f1 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 33658 | 520 | 23440 | 1145 | +| 33682 | 520 | 23458 | 1150 | ## Plugin Directory @@ -52,7 +52,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 107 | 0 | 88 | 1 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 121 | 0 | 114 | 3 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 52 | 0 | 51 | 0 | -| | [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3269 | 119 | 2557 | 27 | +| | [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3279 | 119 | 2561 | 27 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 16 | 0 | 7 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Reusable data view field editor across Kibana | 60 | 0 | 30 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Data view management app | 2 | 0 | 2 | 0 | @@ -107,7 +107,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 0 | 0 | 0 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 624 | 3 | 424 | 8 | | | [Security Team](https://github.com/orgs/elastic/teams/security-team) | - | 3 | 0 | 3 | 1 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 693 | 0 | 597 | 50 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 694 | 0 | 598 | 50 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 8 | 0 | 8 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 3 | 0 | 3 | 0 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | @@ -122,11 +122,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 34 | 0 | 34 | 2 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 2 | 0 | 2 | 1 | -| | [Observability UI](https://github.com/orgs/elastic/teams/observability-ui) | - | 571 | 40 | 567 | 31 | +| | [Observability UI](https://github.com/orgs/elastic/teams/observability-ui) | - | 578 | 40 | 574 | 33 | | | [Security asset management](https://github.com/orgs/elastic/teams/security-asset-management) | - | 21 | 0 | 21 | 5 | | painlessLab | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 227 | 7 | 171 | 12 | -| | [profiling](https://github.com/orgs/elastic/teams/profiling-ui) | - | 14 | 2 | 14 | 0 | +| | [profiling](https://github.com/orgs/elastic/teams/profiling-ui) | - | 15 | 2 | 15 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 4 | 0 | 4 | 0 | | | [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Reporting Services enables applications to feature reports that the user can automate with Watcher and download later. | 36 | 0 | 16 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 21 | 0 | 21 | 0 | @@ -175,13 +175,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the heatmap implementation using the elastic-charts library. The goal is to eventually deprecate the old implementation and keep only this. Until then, the library used is defined by the Legacy heatmap charts library advanced setting. | 3 | 0 | 3 | 2 | | visTypeMarkdown | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds a markdown visualization type | 0 | 0 | 0 | 0 | | visTypeMetric | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the Metric aggregation-based visualization. | 0 | 0 | 0 | 0 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the pie chart implementation using the elastic-charts library. The goal is to eventually deprecate the old implementation and keep only this. Until then, the library used is defined by the Legacy charts library advanced setting. | 12 | 0 | 12 | 1 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the pie chart implementation using the elastic-charts library. The goal is to eventually deprecate the old implementation and keep only this. Until then, the library used is defined by the Legacy charts library advanced setting. | 11 | 0 | 11 | 1 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the datatable aggregation-based visualization. | 12 | 0 | 12 | 0 | | visTypeTagcloud | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the tagcloud visualization. It is based on elastic-charts wordcloud. | 0 | 0 | 0 | 0 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the timelion visualization. Also contains the backend for both timelion app and timelion visualization. | 2 | 0 | 2 | 2 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the TSVB visualization. TSVB has its one editor, works with index patterns and index strings and contains 6 types of charts: timeseries, topN, table. markdown, metric and gauge. | 10 | 1 | 10 | 3 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the vega visualization. Is the elastic version of vega and vega-lite libraries. | 2 | 0 | 2 | 0 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the vislib visualizations. These are the classical area/line/bar, pie, gauge/goal and heatmap charts. We want to replace them with elastic-charts. | 26 | 0 | 25 | 1 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the vislib visualizations. These are the classical area/line/bar, gauge/goal and heatmap charts. We want to replace them with elastic-charts. | 26 | 0 | 25 | 1 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line. | 53 | 0 | 50 | 5 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 797 | 12 | 767 | 18 | | watcher | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | @@ -202,7 +202,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | Kibana Core | - | 21 | 0 | 0 | 0 | | | Kibana Core | - | 18 | 0 | 2 | 0 | | | [Owner missing] | - | 17 | 0 | 17 | 0 | -| | [Owner missing] | Elastic APM trace data generator | 76 | 0 | 76 | 13 | +| | [Owner missing] | Elastic APM trace data generator | 77 | 0 | 77 | 15 | | | [Owner missing] | - | 11 | 0 | 11 | 0 | | | [Owner missing] | - | 10 | 0 | 10 | 0 | | | [Owner missing] | - | 4 | 0 | 3 | 0 | @@ -409,7 +409,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | Machine Learning UI | This package includes utility functions related to creating elasticsearch aggregation queries, data manipulation and verification. | 82 | 2 | 58 | 0 | | | Machine Learning UI | A type guard to check record like object structures. | 3 | 0 | 2 | 0 | | | Machine Learning UI | Creates a deterministic number based hash out of a string. | 2 | 0 | 1 | 0 | -| | [Owner missing] | - | 55 | 0 | 55 | 2 | +| | [Owner missing] | - | 60 | 0 | 60 | 2 | | | [Owner missing] | - | 47 | 0 | 46 | 10 | | | [Owner missing] | - | 51 | 5 | 34 | 0 | | | [Owner missing] | io ts utilities and types to be shared with plugins from the osquery project | 62 | 0 | 62 | 0 | @@ -465,7 +465,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Owner missing] | - | 11 | 0 | 9 | 0 | | | [Owner missing] | - | 24 | 0 | 24 | 0 | | | [Owner missing] | - | 27 | 0 | 26 | 0 | -| | [Owner missing] | - | 5 | 0 | 3 | 0 | +| | [Owner missing] | - | 5 | 0 | 3 | 1 | | | [Owner missing] | - | 25 | 0 | 10 | 0 | | | [Owner missing] | - | 17 | 0 | 16 | 0 | | | [Owner missing] | - | 2 | 0 | 1 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 38a4022b241ad..853be996619c1 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.devdocs.json b/api_docs/profiling.devdocs.json index 9652c44cfb99d..035a78aebe58c 100644 --- a/api_docs/profiling.devdocs.json +++ b/api_docs/profiling.devdocs.json @@ -13,7 +13,23 @@ "functions": [], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "profiling", + "id": "def-server.ProfilingConfig", + "type": "Type", + "tags": [], + "label": "ProfilingConfig", + "description": [], + "signature": [ + "{ readonly elasticsearch?: Readonly<{} & { username: string; password: string; hosts: string; }> | undefined; readonly enabled: boolean; }" + ], + "path": "x-pack/plugins/profiling/server/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [], "setup": { "parentPluginId": "profiling", diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index b32fa5d54ef9e..3fa6776a1c843 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; @@ -21,7 +21,7 @@ Contact [profiling](https://github.com/orgs/elastic/teams/profiling-ui) for ques | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 14 | 2 | 14 | 0 | +| 15 | 2 | 15 | 0 | ## Server @@ -31,6 +31,9 @@ Contact [profiling](https://github.com/orgs/elastic/teams/profiling-ui) for ques ### Start +### Consts, variables and types + + ## Common ### Functions diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 459333b9e23e0..b7e56abc94d60 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index a59c71d85d33d..f57b2cc147469 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 1148f83fb7f42..5d562d6185385 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 419b45a9c1add..7cbedc3c97f09 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 7f1a3b20364b4..438d81ea8f12b 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 3b8e5630ff01d..a5bdcf46e6113 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 354d5c72abdf7..957e82a7f0226 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 0c4f162dfc831..a616890c63fd3 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 724c78dd97095..567a6ac2badf4 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index b2786772448d3..97b22df6bdd41 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index f512252f05e82..7bd7a5ac90e17 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index fc38600f82a41..9e69a31dcbdb6 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index b8fc625e69eeb..acc1db440ea91 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 0f5e59b7548b4..cf7e42ea51a61 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 0bbe550101489..1206afb7eece1 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index dcebd55498fe5..f0e3c333d9458 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index f7dd29463c106..e0aa5e75714a2 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 4ab4583e0a572..c9f07d8476a07 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index d3aec2df50cc4..d9e72a901faed 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 386d4d3912a2b..1b28caf700042 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 2f1889b32389a..81f3766ee0d97 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 3881bcfa94e90..b78aba637baeb 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 714005b1e43cb..28f2601065878 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index b7a10129ae9a9..f3fb764316241 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index b4b14e5553508..6a7be74ea719a 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index d2b183ceddbc3..8305c1cf83d42 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index b9f51795ca55c..731ed603c2ade 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index f1a1335702f73..482878aa675f5 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 5663d3575d211..6fbb110400c77 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 138d4d4686528..3b1d164b98bed 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index e759076d5b4d6..807bf67b00b7b 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 03b2981c53bd9..54999262e22a1 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index e2ad04763af23..9c451a90c12f9 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index c7a8e59b0c1e7..47d213c3a43d0 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index ac8feec060974..583defb247b0e 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 45e161625ae54..78fa7ede18c62 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 512e730b0aee9..01cc5d9cf3658 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index a4a8b6452de58..e5088ee9dfdfb 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index b8b7d815d8a82..61f7dbce948c5 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 7c165dc46da7b..ae59b3963bdbc 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 9ffb9ff4d0d63..02873519e4be4 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 53d494c4f3403..43501f3d7edb7 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.devdocs.json b/api_docs/vis_type_pie.devdocs.json index dbc657689af05..18bc8c20b058c 100644 --- a/api_docs/vis_type_pie.devdocs.json +++ b/api_docs/vis_type_pie.devdocs.json @@ -241,21 +241,6 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false - }, - { - "parentPluginId": "visTypePie", - "id": "def-common.LEGACY_PIE_CHARTS_LIBRARY", - "type": "string", - "tags": [], - "label": "LEGACY_PIE_CHARTS_LIBRARY", - "description": [], - "signature": [ - "\"visualization:visualize:legacyPieChartsLibrary\"" - ], - "path": "src/plugins/vis_types/pie/common/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index f8a66456be7fa..16a97238a2c32 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualization | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 12 | 0 | 12 | 1 | +| 11 | 0 | 11 | 1 | ## Client diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index eae1fd7e013e7..9add7c7a351a9 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index d0efbcd35420e..dd785a58913b1 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 57956d3525bfe..07a7467cd46e4 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 2659d394fa84d..cf7c0266026fd 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.devdocs.json b/api_docs/vis_type_vislib.devdocs.json index 2ba5f096eecd3..780de832a2be4 100644 --- a/api_docs/vis_type_vislib.devdocs.json +++ b/api_docs/vis_type_vislib.devdocs.json @@ -40,7 +40,7 @@ "label": "type", "description": [], "signature": [ - "\"metric\" | \"goal\" | \"gauge\" | \"heatmap\" | \"pie\"" + "\"metric\" | \"goal\" | \"gauge\" | \"heatmap\"" ], "path": "src/plugins/vis_types/vislib/public/types.ts", "deprecated": false, @@ -359,7 +359,7 @@ "label": "VislibChartType", "description": [], "signature": [ - "\"metric\" | \"goal\" | \"gauge\" | \"heatmap\" | \"pie\"" + "\"metric\" | \"goal\" | \"gauge\" | \"heatmap\"" ], "path": "src/plugins/vis_types/vislib/public/types.ts", "deprecated": false, @@ -408,7 +408,7 @@ "label": "VislibChartType", "description": [], "signature": [ - "{ readonly Pie: \"pie\"; readonly Heatmap: \"heatmap\"; readonly Gauge: \"gauge\"; readonly Goal: \"goal\"; readonly Metric: \"metric\"; }" + "{ readonly Heatmap: \"heatmap\"; readonly Gauge: \"gauge\"; readonly Goal: \"goal\"; readonly Metric: \"metric\"; }" ], "path": "src/plugins/vis_types/vislib/public/types.ts", "deprecated": false, diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index c8dae0305ce90..0603b97022083 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,12 +8,12 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; -Contains the vislib visualizations. These are the classical area/line/bar, pie, gauge/goal and heatmap charts. We want to replace them with elastic-charts. +Contains the vislib visualizations. These are the classical area/line/bar, gauge/goal and heatmap charts. We want to replace them with elastic-charts. Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) for questions regarding this plugin. diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index f5e81ee08a2bd..ac1811b9d272b 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index c4b86fdc63492..ac4d22d9f16d8 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2022-12-07 +date: 2022-12-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 1f0ae32671eec4c5023b3974ab4a5a6f7e962072 Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Thu, 8 Dec 2022 08:39:38 +0100 Subject: [PATCH 08/19] [Discover] Render the sidebar even if documents fetching failed (#147179) This is a follow up PR for https://github.com/elastic/kibana/pull/144412 to fix how "Error" case is handled. Before: the sidebar was stuck in loading state: Screenshot 2022-12-07 at 13 16 21 After: the sidebar is rendered: Screenshot 2022-12-07 at 13 17 06 --- .../sidebar/discover_sidebar_responsive.tsx | 10 +++++ .../apps/discover/group1/_sidebar.ts | 40 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx index 13e1287022f3d..026ca50f9f818 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx @@ -168,6 +168,16 @@ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) }, }); break; + case FetchStatus.ERROR: + dispatchSidebarStateAction({ + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADED, + payload: { + dataView: selectedDataViewRef.current, + fieldCounts: {}, + isPlainRecord: isPlainRecordType, + }, + }); + break; default: break; } diff --git a/test/functional/apps/discover/group1/_sidebar.ts b/test/functional/apps/discover/group1/_sidebar.ts index 109e8aa37cd38..db3abf5046582 100644 --- a/test/functional/apps/discover/group1/_sidebar.ts +++ b/test/functional/apps/discover/group1/_sidebar.ts @@ -510,6 +510,46 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(allFields.includes('_bytes-runtimefield')).to.be(false); }); + it('should render even when retrieving documents failed with an error', async () => { + await PageObjects.header.waitUntilLoadingHasFinished(); + + await testSubjects.missingOrFail('discoverNoResultsError'); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.addRuntimeField('_invalid-runtimefield', `emit(‘’);`); + + await PageObjects.header.waitUntilLoadingHasFinished(); + + // error in fetching documents because of the invalid runtime field + await testSubjects.existOrFail('discoverNoResultsError'); + + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + // check that the sidebar is rendered + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '54 available fields. 0 empty fields. 3 meta fields.' + ); + let allFields = await PageObjects.discover.getAllFieldNames(); + expect(allFields.includes('_invalid-runtimefield')).to.be(true); + + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.existOrFail('discoverNoResultsError'); // still has error + + // check that the sidebar is rendered event after a refresh + allFields = await PageObjects.discover.getAllFieldNames(); + expect(allFields.includes('_invalid-runtimefield')).to.be(true); + + await PageObjects.discover.removeField('_invalid-runtimefield'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + await testSubjects.missingOrFail('discoverNoResultsError'); + }); + it('should work correctly when time range is updated', async function () { await esArchiver.loadIfNeeded( 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' From 431c32b894077fc5910380252086442083734fce Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Thu, 8 Dec 2022 09:14:33 +0100 Subject: [PATCH 09/19] [Fleet] cancel tasks when 3rd retry failed (#147190) ## Summary Related to https://github.com/elastic/kibana/issues/144161 Found that on a bulk update tags task failure, the task didn't stop after 3 retries (should be over in less then a minute), the retries kept happening for 2 hours. This change removes the retry task if 3 retries are reached. Also testing in cloud deployment to see if the tags error can be reproduced with this fix. I could reproduce the reported error locally, and seeing it goes away with this fix. To verify: - Add at least 50k agents with the `create_agents` script in kibana repo - open Kibana, select the 50k agents, and open Actions / Add tags - Try this in a few seconds: add 2 new tags, and remove one of them - Wait about 30s, the agents should reflect the changes - Check the logs to see that the tasks are removed after 3rd retry is reached or successful. - Check that there are no more running tasks. Any running task can be found in Kibana Console by running this query: `GET .kibana_task_manager/_search?q=task.taskType:"fleet:update_agent_tags:retry"` Locally simulated an error to test that the retry (and check) task is removed: ``` [2022-12-07T15:52:16.415+01:00][ERROR][plugins.fleet] Retry #3 of task fleet:update_agent_tags:retry:848984ab-c11d-4ebe-8d1f-606143dd656b failed: failing task [2022-12-07T15:52:16.416+01:00][WARN ][plugins.fleet] Stopping after 3rd retry. Error: failing task [2022-12-07T15:52:16.416+01:00][INFO ][plugins.fleet] Removing task fleet:update_agent_tags:retry:check:848984ab-c11d-4ebe-8d1f-606143dd656b [2022-12-07T15:52:16.416+01:00][INFO ][plugins.fleet] Removing task fleet:update_agent_tags:retry:848984ab-c11d-4ebe-8d1f-606143dd656b ``` --- .../plugins/fleet/server/services/agents/action_runner.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/x-pack/plugins/fleet/server/services/agents/action_runner.ts b/x-pack/plugins/fleet/server/services/agents/action_runner.ts index 41f9a44099b5f..18af331980238 100644 --- a/x-pack/plugins/fleet/server/services/agents/action_runner.ts +++ b/x-pack/plugins/fleet/server/services/agents/action_runner.ts @@ -113,6 +113,13 @@ export abstract class ActionRunner { if (this.retryParams.retryCount === 3) { const errorMessage = 'Stopping after 3rd retry. Error: ' + error.message; appContextService.getLogger().warn(errorMessage); + + // clean up tasks after 3rd retry reached + await Promise.all([ + this.bulkActionsResolver!.removeIfExists(this.checkTaskId!), + this.bulkActionsResolver!.removeIfExists(this.retryParams.taskId!), + ]); + return; } } else { From 8e3fbe22ae9d96ecc7ca2d6fa09de24f1dd90ccb Mon Sep 17 00:00:00 2001 From: Maja Grubic Date: Thu, 8 Dec 2022 13:20:46 +0100 Subject: [PATCH 10/19] [GlobalExperience] Global UI settings: API & service changes (#147069) ## Summary This is a follow-up on: https://github.com/elastic/kibana/pull/146270 This PR: 1. adds server-side service changes 2. registers new routes for global settings 3. add a new `UiSettingsGlobalClient` on the browser side, similarly to what was done on the server side There are no browser-side service changes yet, as this will be bigger change worthy of its own PR. ### Checklist Delete any items that are not applicable to this PR. ~- [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md)~ ~- [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials~ - [X] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ~- [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/))~ ~- [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US))~ ~- [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker)~ ~- [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server))~ ~- [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers)~ ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../src/core_setup.mock.ts | 1 + .../src/plugin_context.ts | 2 + .../ui_settings_api.test.ts.snap | 120 +++++++++++++ .../src/ui_settings_api.test.ts | 117 ++++++++++++ .../src/ui_settings_api.ts | 36 +++- .../src/ui_settings_client.test.ts | 6 +- .../src/ui_settings_client.ts | 149 +-------------- .../src/ui_settings_client_common.ts | 155 ++++++++++++++++ .../src/ui_settings_global_client.test.ts | 82 +++++++++ .../src/ui_settings_global_client.ts | 43 +++++ .../src/routes/delete.ts | 63 ++++--- .../src/routes/get.ts | 52 ++++-- .../src/routes/set.ts | 77 +++++--- .../src/routes/set_many.ts | 25 ++- .../src/saved_objects/ui_settings.ts | 2 +- .../src/types.ts | 4 +- .../src/ui_settings_route_handler_context.ts | 10 ++ .../src/ui_settings_service.test.mock.ts | 5 + .../src/ui_settings_service.test.ts | 74 ++++++++ .../src/ui_settings_service.ts | 59 ++++-- .../src/ui_settings_service.mock.ts | 2 + .../core-ui-settings-server/src/contracts.ts | 36 +++- .../src/request_handler_context.ts | 1 + .../ui_settings/doc_exists.ts | 169 +++++++++++++++++- .../ui_settings/lib/servers.ts | 3 + .../ui_settings/routes.test.ts | 27 +++ src/core/server/mocks.ts | 1 + 27 files changed, 1079 insertions(+), 242 deletions(-) create mode 100644 packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client_common.ts create mode 100644 packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_global_client.test.ts create mode 100644 packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_global_client.ts diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts index 0c4e25e846cab..5f922fef1502b 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/src/core_setup.mock.ts @@ -45,6 +45,7 @@ export function createCoreSetupMock({ const uiSettingsMock = { register: uiSettingsServiceMock.createSetupContract().register, + registerGlobal: uiSettingsServiceMock.createSetupContract().registerGlobal, }; const mock: CoreSetupMockType = { diff --git a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts index b937508094a84..9cd028c8c298c 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/plugin_context.ts @@ -250,6 +250,7 @@ export function createPluginSetupContext( }, uiSettings: { register: deps.uiSettings.register, + registerGlobal: deps.uiSettings.registerGlobal, }, getStartServices: () => plugin.startDependencies, deprecations: deps.deprecations.getRegistry(plugin.name), @@ -311,6 +312,7 @@ export function createPluginStartContext( }, uiSettings: { asScopedToClient: deps.uiSettings.asScopedToClient, + globalAsScopedToClient: deps.uiSettings.globalAsScopedToClient, }, coreUsageData: deps.coreUsageData, }; diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/__snapshots__/ui_settings_api.test.ts.snap b/packages/core/ui-settings/core-ui-settings-browser-internal/src/__snapshots__/ui_settings_api.test.ts.snap index b737c04a5f269..6599746d33bf1 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/__snapshots__/ui_settings_api.test.ts.snap +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/__snapshots__/ui_settings_api.test.ts.snap @@ -119,3 +119,123 @@ Array [ ], ] `; + +exports[`#batchSetGlobal Buffers are always clear of previously buffered changes: two requests, second only sends bar, not foo 1`] = ` +Array [ + Array [ + "/foo/bar/api/kibana/global_settings", + Object { + "headers": Object { + "accept": "application/json", + "content-type": "application/json", + "kbn-version": "kibanaVersion", + }, + "method": "POST", + }, + ], + Array [ + "/foo/bar/api/kibana/global_settings", + Object { + "headers": Object { + "accept": "application/json", + "content-type": "application/json", + "kbn-version": "kibanaVersion", + }, + "method": "POST", + }, + ], +] +`; + +exports[`#batchSetGlobal Overwrites previously buffered values with new values for the same key: two requests, foo=d in final 1`] = ` +Array [ + Array [ + "/foo/bar/api/kibana/global_settings", + Object { + "headers": Object { + "accept": "application/json", + "content-type": "application/json", + "kbn-version": "kibanaVersion", + }, + "method": "POST", + }, + ], + Array [ + "/foo/bar/api/kibana/global_settings", + Object { + "headers": Object { + "accept": "application/json", + "content-type": "application/json", + "kbn-version": "kibanaVersion", + }, + "method": "POST", + }, + ], +] +`; + +exports[`#batchSetGlobal buffers changes while first request is in progress, sends buffered changes after first request completes: final, includes both requests 1`] = ` +Array [ + Array [ + "/foo/bar/api/kibana/global_settings", + Object { + "headers": Object { + "accept": "application/json", + "content-type": "application/json", + "kbn-version": "kibanaVersion", + }, + "method": "POST", + }, + ], + Array [ + "/foo/bar/api/kibana/global_settings", + Object { + "headers": Object { + "accept": "application/json", + "content-type": "application/json", + "kbn-version": "kibanaVersion", + }, + "method": "POST", + }, + ], +] +`; + +exports[`#batchSetGlobal rejects all promises for batched requests that fail: promise rejections 1`] = ` +Array [ + Object { + "error": [Error: invalid], + "isRejected": true, + }, + Object { + "error": [Error: invalid], + "isRejected": true, + }, + Object { + "error": [Error: invalid], + "isRejected": true, + }, +] +`; + +exports[`#batchSetGlobal rejects on 301 1`] = `"Moved Permanently"`; + +exports[`#batchSetGlobal rejects on 404 response 1`] = `"Request failed with status code: 404"`; + +exports[`#batchSetGlobal rejects on 500 1`] = `"Request failed with status code: 500"`; + +exports[`#batchSetGlobal sends a single change immediately: single change 1`] = ` +Array [ + Array [ + "/foo/bar/api/kibana/global_settings", + Object { + "headers": Object { + "accept": "application/json", + "content-type": "application/json", + "kbn-version": "kibanaVersion", + }, + "method": "POST", + }, + ], +] +`; diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.test.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.test.ts index c250b78d68ce5..9fbbb4045583a 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.test.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.test.ts @@ -162,6 +162,123 @@ describe('#batchSet', () => { }); }); +describe('#batchSetGlobal', () => { + it('sends a single change immediately', async () => { + fetchMock.mock('*', { + body: { settings: {} }, + }); + + const { uiSettingsApi } = setup(); + await uiSettingsApi.batchSetGlobal('foo', 'bar'); + expect(fetchMock.calls()).toMatchSnapshot('single change'); + }); + + it('buffers changes while first request is in progress, sends buffered changes after first request completes', async () => { + fetchMock.mock('*', { + body: { settings: {} }, + }); + + const { uiSettingsApi } = setup(); + + uiSettingsApi.batchSetGlobal('foo', 'bar'); + const finalPromise = uiSettingsApi.batchSet('box', 'bar'); + + expect(uiSettingsApi.hasPendingChanges()).toBe(true); + await finalPromise; + expect(fetchMock.calls()).toMatchSnapshot('final, includes both requests'); + }); + + it('Overwrites previously buffered values with new values for the same key', async () => { + fetchMock.mock('*', { + body: { settings: {} }, + }); + + const { uiSettingsApi } = setup(); + + uiSettingsApi.batchSetGlobal('foo', 'a'); + uiSettingsApi.batchSetGlobal('foo', 'b'); + uiSettingsApi.batchSetGlobal('foo', 'c'); + await uiSettingsApi.batchSetGlobal('foo', 'd'); + + expect(fetchMock.calls()).toMatchSnapshot('two requests, foo=d in final'); + }); + + it('Buffers are always clear of previously buffered changes', async () => { + fetchMock.mock('*', { + body: { settings: {} }, + }); + + const { uiSettingsApi } = setup(); + uiSettingsApi.batchSetGlobal('foo', 'bar'); + uiSettingsApi.batchSetGlobal('bar', 'foo'); + await uiSettingsApi.batchSetGlobal('bar', 'box'); + + expect(fetchMock.calls()).toMatchSnapshot('two requests, second only sends bar, not foo'); + }); + + it('rejects on 404 response', async () => { + fetchMock.mock('*', { + status: 404, + body: 'not found', + }); + + const { uiSettingsApi } = setup(); + await expect(uiSettingsApi.batchSetGlobal('foo', 'bar')).rejects.toThrowErrorMatchingSnapshot(); + }); + + it('rejects on 301', async () => { + fetchMock.mock('*', { + status: 301, + body: 'redirect', + }); + + const { uiSettingsApi } = setup(); + await expect(uiSettingsApi.batchSetGlobal('foo', 'bar')).rejects.toThrowErrorMatchingSnapshot(); + }); + + it('rejects on 500', async () => { + fetchMock.mock('*', { + status: 500, + body: 'redirect', + }); + + const { uiSettingsApi } = setup(); + await expect(uiSettingsApi.batchSetGlobal('foo', 'bar')).rejects.toThrowErrorMatchingSnapshot(); + }); + + it('rejects all promises for batched requests that fail', async () => { + fetchMock.once('*', { + body: { settings: {} }, + }); + fetchMock.once( + '*', + { + status: 400, + body: { message: 'invalid' }, + }, + { + overwriteRoutes: false, + } + ); + + const { uiSettingsApi } = setup(); + // trigger the initial sync request, which enabled buffering + uiSettingsApi.batchSetGlobal('foo', 'bar'); + + // buffer some requests so they will be sent together + await expect( + Promise.all([ + settlePromise(uiSettingsApi.batchSetGlobal('foo', 'a')), + settlePromise(uiSettingsApi.batchSetGlobal('bar', 'b')), + settlePromise(uiSettingsApi.batchSetGlobal('baz', 'c')), + ]) + ).resolves.toMatchSnapshot('promise rejections'); + + // ensure only two requests were sent + expect(fetchMock.calls()).toHaveLength(2); + }); +}); + describe('#getLoadingCount$()', () => { it('emits the current number of active requests', async () => { fetchMock.once('*', { diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.ts index 2686307357723..98141eb1163b5 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_api.ts @@ -10,6 +10,7 @@ import { BehaviorSubject } from 'rxjs'; import type { HttpSetup } from '@kbn/core-http-browser'; import type { UiSettingsState } from '@kbn/core-ui-settings-browser'; +import { UiSettingsScope } from '@kbn/core-ui-settings-common'; export interface UiSettingsApiResponse { settings: UiSettingsState; @@ -64,7 +65,32 @@ export class UiSettingsApi { }, }; - this.flushPendingChanges(); + this.flushPendingChanges('namespace'); + }); + } + + public batchSetGlobal(key: string, value: any) { + return new Promise((resolve, reject) => { + const prev = this.pendingChanges || NOOP_CHANGES; + + this.pendingChanges = { + values: { + ...prev.values, + [key]: value, + }, + + callback(error, resp) { + prev.callback(error, resp); + + if (error) { + reject(error); + } else { + resolve(resp!); + } + }, + }; + + this.flushPendingChanges('global'); }); } @@ -97,7 +123,7 @@ export class UiSettingsApi { * progress) then another request will be started until all pending changes have been * sent to the server. */ - private async flushPendingChanges() { + private async flushPendingChanges(scope: UiSettingsScope) { if (!this.pendingChanges) { return; } @@ -111,10 +137,10 @@ export class UiSettingsApi { try { this.sendInProgress = true; - + const path = scope === 'namespace' ? '/api/kibana/settings' : '/api/kibana/global_settings'; changes.callback( undefined, - await this.sendRequest('POST', '/api/kibana/settings', { + await this.sendRequest('POST', path, { changes: changes.values, }) ); @@ -122,7 +148,7 @@ export class UiSettingsApi { changes.callback(error); } finally { this.sendInProgress = false; - this.flushPendingChanges(); + this.flushPendingChanges(scope); } } diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.test.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.test.ts index f8c5dbfc347dd..8e8a4af6aa00c 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.test.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.test.ts @@ -19,17 +19,21 @@ function setup(options: { defaults?: any; initialSettings?: any } = {}) { const batchSet = jest.fn(() => ({ settings: {}, })); + const batchSetGlobal = jest.fn(() => ({ + settings: {}, + })); done$ = new Subject(); const client = new UiSettingsClient({ defaults, initialSettings, api: { batchSet, + batchSetGlobal, } as any, done$, }); - return { client, batchSet }; + return { client, batchSet, batchSetGlobal }; } afterEach(() => { diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.ts index d5b6b7f1513b2..52e599cef6298 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.ts +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client.ts @@ -6,131 +6,15 @@ * Side Public License, v 1. */ -import { cloneDeep, defaultsDeep } from 'lodash'; -import { Observable, Subject, concat, defer, of } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; - -import { UserProvidedValues, PublicUiSettingsParams } from '@kbn/core-ui-settings-common'; -import { IUiSettingsClient, UiSettingsState } from '@kbn/core-ui-settings-browser'; - -import { UiSettingsApi } from './ui_settings_api'; - -interface UiSettingsClientParams { - api: UiSettingsApi; - defaults: Record; - initialSettings?: UiSettingsState; - done$: Observable; -} - -export class UiSettingsClient implements IUiSettingsClient { - private readonly update$ = new Subject<{ key: string; newValue: any; oldValue: any }>(); - private readonly updateErrors$ = new Subject(); - - private readonly api: UiSettingsApi; - private readonly defaults: Record; - private cache: Record; +import { defaultsDeep } from 'lodash'; +import { UiSettingsClientCommon, UiSettingsClientParams } from './ui_settings_client_common'; +export class UiSettingsClient extends UiSettingsClientCommon { constructor(params: UiSettingsClientParams) { - this.api = params.api; - this.defaults = cloneDeep(params.defaults); - this.cache = defaultsDeep({}, this.defaults, cloneDeep(params.initialSettings)); - - params.done$.subscribe({ - complete: () => { - this.update$.complete(); - this.updateErrors$.complete(); - }, - }); - } - - getAll() { - return cloneDeep(this.cache); - } - - get(key: string, defaultOverride?: T) { - const declared = this.isDeclared(key); - - if (!declared && defaultOverride !== undefined) { - return defaultOverride; - } - - if (!declared) { - throw new Error( - `Unexpected \`IUiSettingsClient.get("${key}")\` call on unrecognized configuration setting "${key}". -Setting an initial value via \`IUiSettingsClient.set("${key}", value)\` before attempting to retrieve -any custom setting value for "${key}" may fix this issue. -You can use \`IUiSettingsClient.get("${key}", defaultValue)\`, which will just return -\`defaultValue\` when the key is unrecognized.` - ); - } - - const type = this.cache[key].type; - const userValue = this.cache[key].userValue; - const defaultValue = defaultOverride !== undefined ? defaultOverride : this.cache[key].value; - const value = userValue == null ? defaultValue : userValue; - - if (type === 'json') { - return JSON.parse(value); - } - - if (type === 'number') { - return parseFloat(value); - } - - return value; - } - - get$(key: string, defaultOverride?: T) { - return concat( - defer(() => of(this.get(key, defaultOverride))), - this.update$.pipe( - filter((update) => update.key === key), - map(() => this.get(key, defaultOverride)) - ) - ); - } - - async set(key: string, value: any) { - return await this.update(key, value); + super(params); } - async remove(key: string) { - return await this.update(key, null); - } - - isDeclared(key: string) { - return key in this.cache; - } - - isDefault(key: string) { - return !this.isDeclared(key) || this.cache[key].userValue == null; - } - - isCustom(key: string) { - return this.isDeclared(key) && !('value' in this.cache[key]); - } - - isOverridden(key: string) { - return this.isDeclared(key) && Boolean(this.cache[key].isOverridden); - } - - getUpdate$() { - return this.update$.asObservable(); - } - - getUpdateErrors$() { - return this.updateErrors$.asObservable(); - } - - private assertUpdateAllowed(key: string) { - if (this.isOverridden(key)) { - throw new Error( - `Unable to update "${key}" because its value is overridden by the Kibana server` - ); - } - } - - private async update(key: string, newVal: any): Promise { + async update(key: string, newVal: any): Promise { this.assertUpdateAllowed(key); const declared = this.isDeclared(key); @@ -156,27 +40,4 @@ You can use \`IUiSettingsClient.get("${key}", defaultValue)\`, which will just r return false; } } - - private setLocally(key: string, newValue: any) { - this.assertUpdateAllowed(key); - - if (!this.isDeclared(key)) { - this.cache[key] = {}; - } - - const oldValue = this.get(key); - - if (newValue === null) { - delete this.cache[key].userValue; - } else { - const { type } = this.cache[key]; - if (type === 'json' && typeof newValue !== 'string') { - this.cache[key].userValue = JSON.stringify(newValue); - } else { - this.cache[key].userValue = newValue; - } - } - - this.update$.next({ key, newValue, oldValue }); - } } diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client_common.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client_common.ts new file mode 100644 index 0000000000000..17630ab5dda8d --- /dev/null +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_client_common.ts @@ -0,0 +1,155 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { cloneDeep, defaultsDeep } from 'lodash'; +import { Observable, Subject, concat, defer, of } from 'rxjs'; +import { filter, map } from 'rxjs/operators'; + +import { UserProvidedValues, PublicUiSettingsParams } from '@kbn/core-ui-settings-common'; +import { IUiSettingsClient, UiSettingsState } from '@kbn/core-ui-settings-browser'; + +import { UiSettingsApi } from './ui_settings_api'; + +export interface UiSettingsClientParams { + api: UiSettingsApi; + defaults: Record; + initialSettings?: UiSettingsState; + done$: Observable; +} + +export abstract class UiSettingsClientCommon implements IUiSettingsClient { + protected readonly update$ = new Subject<{ key: string; newValue: any; oldValue: any }>(); + protected readonly updateErrors$ = new Subject(); + + protected readonly api: UiSettingsApi; + protected readonly defaults: Record; + protected cache: Record; + + constructor(params: UiSettingsClientParams) { + this.api = params.api; + this.defaults = cloneDeep(params.defaults); + this.cache = defaultsDeep({}, this.defaults, cloneDeep(params.initialSettings)); + + params.done$.subscribe({ + complete: () => { + this.update$.complete(); + this.updateErrors$.complete(); + }, + }); + } + + getAll() { + return cloneDeep(this.cache); + } + + get(key: string, defaultOverride?: T) { + const declared = this.isDeclared(key); + if (!declared && defaultOverride !== undefined) { + return defaultOverride; + } + + if (!declared) { + throw new Error( + `Unexpected \`IUiSettingsClient.get("${key}")\` call on unrecognized configuration setting "${key}". +Setting an initial value via \`IUiSettingsClient.set("${key}", value)\` before attempting to retrieve +any custom setting value for "${key}" may fix this issue. +You can use \`IUiSettingsClient.get("${key}", defaultValue)\`, which will just return +\`defaultValue\` when the key is unrecognized.` + ); + } + + const type = this.cache[key].type; + const userValue = this.cache[key].userValue; + const defaultValue = defaultOverride !== undefined ? defaultOverride : this.cache[key].value; + const value = userValue == null ? defaultValue : userValue; + if (type === 'json') { + return JSON.parse(value); + } + + if (type === 'number') { + return parseFloat(value); + } + + return value; + } + + get$(key: string, defaultOverride?: T) { + return concat( + defer(() => of(this.get(key, defaultOverride))), + this.update$.pipe( + filter((update) => update.key === key), + map(() => this.get(key, defaultOverride)) + ) + ); + } + + async set(key: string, value: any) { + return await this.update(key, value); + } + + async remove(key: string) { + return await this.update(key, null); + } + + isDeclared(key: string) { + return key in this.cache; + } + + isDefault(key: string) { + return !this.isDeclared(key) || this.cache[key].userValue == null; + } + + isCustom(key: string) { + return this.isDeclared(key) && !('value' in this.cache[key]); + } + + isOverridden(key: string) { + return this.isDeclared(key) && Boolean(this.cache[key].isOverridden); + } + + getUpdate$() { + return this.update$.asObservable(); + } + + getUpdateErrors$() { + return this.updateErrors$.asObservable(); + } + + protected assertUpdateAllowed(key: string) { + if (this.isOverridden(key)) { + throw new Error( + `Unable to update "${key}" because its value is overridden by the Kibana server` + ); + } + } + + protected abstract update(key: string, newVal: any): Promise; + + protected setLocally(key: string, newValue: any) { + this.assertUpdateAllowed(key); + + if (!this.isDeclared(key)) { + this.cache[key] = {}; + } + + const oldValue = this.get(key); + + if (newValue === null) { + delete this.cache[key].userValue; + } else { + const { type } = this.cache[key]; + if (type === 'json' && typeof newValue !== 'string') { + this.cache[key].userValue = JSON.stringify(newValue); + } else { + this.cache[key].userValue = newValue; + } + } + + this.update$.next({ key, newValue, oldValue }); + } +} diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_global_client.test.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_global_client.test.ts new file mode 100644 index 0000000000000..d1931ef916058 --- /dev/null +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_global_client.test.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Subject } from 'rxjs'; +import { take, toArray } from 'rxjs/operators'; + +import { UiSettingsGlobalClient } from './ui_settings_global_client'; + +let done$: Subject; + +function setup(options: { defaults?: any; initialSettings?: any } = {}) { + const { defaults = { dateFormat: { value: 'Browser' } }, initialSettings = {} } = options; + + const batchSetGlobal = jest.fn(() => ({ + settings: {}, + })); + done$ = new Subject(); + const client = new UiSettingsGlobalClient({ + defaults, + initialSettings, + api: { + batchSetGlobal, + } as any, + done$, + }); + + return { client, batchSetGlobal }; +} + +afterEach(() => { + done$.complete(); +}); + +describe('#get$', () => { + it('emits the default override if no value is set, or if the value is removed', async () => { + const { client } = setup(); + + setTimeout(() => { + client.set('dateFormat', 'new format'); + }, 10); + + setTimeout(() => { + client.remove('dateFormat'); + }, 20); + + const values = await client + .get$('dateFormat', 'my default') + .pipe(take(3), toArray()) + .toPromise(); + + expect(values).toEqual(['my default', 'new format', 'my default']); + }); +}); + +describe('#set', () => { + it('resolves to false on failure', async () => { + const { client, batchSetGlobal } = setup(); + + batchSetGlobal.mockImplementation(() => { + throw new Error('Error in request'); + }); + + await expect(client.set('foo', 'bar')).resolves.toBe(false); + }); +}); + +describe('#remove', () => { + it('resolves to false on failure', async () => { + const { client, batchSetGlobal } = setup(); + + batchSetGlobal.mockImplementation(() => { + throw new Error('Error in request'); + }); + + await expect(client.remove('dateFormat')).resolves.toBe(false); + }); +}); diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_global_client.ts b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_global_client.ts new file mode 100644 index 0000000000000..9ca11cf950022 --- /dev/null +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/src/ui_settings_global_client.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { defaultsDeep } from 'lodash'; +import { UiSettingsClientCommon, UiSettingsClientParams } from './ui_settings_client_common'; + +export class UiSettingsGlobalClient extends UiSettingsClientCommon { + constructor(params: UiSettingsClientParams) { + super(params); + } + + async update(key: string, newVal: any): Promise { + this.assertUpdateAllowed(key); + + const declared = this.isDeclared(key); + const defaults = this.defaults; + + const oldVal = declared ? this.cache[key].userValue : undefined; + + const unchanged = oldVal === newVal; + if (unchanged) { + return true; + } + + const initialVal = declared ? this.get(key) : undefined; + this.setLocally(key, newVal); + + try { + const { settings } = await this.api.batchSetGlobal(key, newVal); + this.cache = defaultsDeep({}, defaults, settings); + return true; + } catch (error) { + this.setLocally(key, initialVal); + this.updateErrors$.next(error); + return false; + } + } +} diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/delete.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/delete.ts index 4147358d4e1ee..b9aed6153e796 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/delete.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/delete.ts @@ -9,8 +9,11 @@ import { schema } from '@kbn/config-schema'; import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-utils-server'; +import { IUiSettingsClient } from '@kbn/core-ui-settings-server'; +import { KibanaRequest, KibanaResponseFactory } from '@kbn/core-http-server'; import type { InternalUiSettingsRouter } from '../internal_types'; import { CannotOverrideError } from '../ui_settings_errors'; +import { InternalUiSettingsRequestHandlerContext } from '../internal_types'; const validate = { params: schema.object({ @@ -19,33 +22,47 @@ const validate = { }; export function registerDeleteRoute(router: InternalUiSettingsRouter) { - router.delete( - { path: '/api/kibana/settings/{key}', validate }, - async (context, request, response) => { - try { - const uiSettingsClient = (await context.core).uiSettings.client; - - await uiSettingsClient.remove(request.params.key); + const deleteFromRequest = async ( + uiSettingsClient: IUiSettingsClient, + context: InternalUiSettingsRequestHandlerContext, + request: KibanaRequest, unknown, unknown, 'delete'>, + response: KibanaResponseFactory + ) => { + try { + await uiSettingsClient.remove(request.params.key); - return response.ok({ - body: { - settings: await uiSettingsClient.getUserProvided(), - }, + return response.ok({ + body: { + settings: await uiSettingsClient.getUserProvided(), + }, + }); + } catch (error) { + if (SavedObjectsErrorHelpers.isSavedObjectsClientError(error)) { + return response.customError({ + body: error, + statusCode: error.output.statusCode, }); - } catch (error) { - if (SavedObjectsErrorHelpers.isSavedObjectsClientError(error)) { - return response.customError({ - body: error, - statusCode: error.output.statusCode, - }); - } - - if (error instanceof CannotOverrideError) { - return response.badRequest({ body: error }); - } + } - throw error; + if (error instanceof CannotOverrideError) { + return response.badRequest({ body: error }); } + + throw error; + } + }; + router.delete( + { path: '/api/kibana/settings/{key}', validate }, + async (context, request, response) => { + const uiSettingsClient = (await context.core).uiSettings.client; + return await deleteFromRequest(uiSettingsClient, context, request, response); + } + ); + router.delete( + { path: '/api/kibana/global_settings/{key}', validate }, + async (context, request, response) => { + const uiSettingsClient = (await context.core).uiSettings.globalClient; + return await deleteFromRequest(uiSettingsClient, context, request, response); } ); } diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/get.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/get.ts index 2603526c37503..11a45ee2f87c9 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/get.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/get.ts @@ -7,29 +7,47 @@ */ import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-utils-server'; +import { IUiSettingsClient } from '@kbn/core-ui-settings-server'; +import { KibanaRequest, KibanaResponseFactory } from '@kbn/core-http-server'; +import { InternalUiSettingsRequestHandlerContext } from '../internal_types'; import type { InternalUiSettingsRouter } from '../internal_types'; export function registerGetRoute(router: InternalUiSettingsRouter) { + const getFromRequest = async ( + uiSettingsClient: IUiSettingsClient, + context: InternalUiSettingsRequestHandlerContext, + request: KibanaRequest, + response: KibanaResponseFactory + ) => { + try { + return response.ok({ + body: { + settings: await uiSettingsClient.getUserProvided(), + }, + }); + } catch (error) { + if (SavedObjectsErrorHelpers.isSavedObjectsClientError(error)) { + return response.customError({ + body: error, + statusCode: error.output.statusCode, + }); + } + + throw error; + } + }; router.get( { path: '/api/kibana/settings', validate: false }, async (context, request, response) => { - try { - const uiSettingsClient = (await context.core).uiSettings.client; - return response.ok({ - body: { - settings: await uiSettingsClient.getUserProvided(), - }, - }); - } catch (error) { - if (SavedObjectsErrorHelpers.isSavedObjectsClientError(error)) { - return response.customError({ - body: error, - statusCode: error.output.statusCode, - }); - } - - throw error; - } + const uiSettingsClient = (await context.core).uiSettings.client; + return await getFromRequest(uiSettingsClient, context, request, response); + } + ); + router.get( + { path: '/api/kibana/global_settings', validate: false }, + async (context, request, response) => { + const uiSettingsClient = (await context.core).uiSettings.globalClient; + return await getFromRequest(uiSettingsClient, context, request, response); } ); } diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/set.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/set.ts index 61493be876ad7..9f13f86946074 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/set.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/set.ts @@ -7,9 +7,13 @@ */ import { schema, ValidationError } from '@kbn/config-schema'; - +import { KibanaRequest, KibanaResponseFactory } from '@kbn/core-http-server'; import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-utils-server'; -import type { InternalUiSettingsRouter } from '../internal_types'; +import { IUiSettingsClient } from '@kbn/core-ui-settings-server'; +import type { + InternalUiSettingsRequestHandlerContext, + InternalUiSettingsRouter, +} from '../internal_types'; import { CannotOverrideError } from '../ui_settings_errors'; const validate = { @@ -22,36 +26,55 @@ const validate = { }; export function registerSetRoute(router: InternalUiSettingsRouter) { - router.post( - { path: '/api/kibana/settings/{key}', validate }, - async (context, request, response) => { - try { - const uiSettingsClient = (await context.core).uiSettings.client; + const setFromRequest = async ( + uiSettingsClient: IUiSettingsClient, + context: InternalUiSettingsRequestHandlerContext, + request: KibanaRequest< + Readonly<{} & { key: string }>, + unknown, + Readonly<{ value?: any } & {}>, + 'post' + >, + response: KibanaResponseFactory + ) => { + try { + const { key } = request.params; + const { value } = request.body; - const { key } = request.params; - const { value } = request.body; + await uiSettingsClient.set(key, value); - await uiSettingsClient.set(key, value); - - return response.ok({ - body: { - settings: await uiSettingsClient.getUserProvided(), - }, + return response.ok({ + body: { + settings: await uiSettingsClient.getUserProvided(), + }, + }); + } catch (error) { + if (SavedObjectsErrorHelpers.isSavedObjectsClientError(error)) { + return response.customError({ + body: error, + statusCode: error.output.statusCode, }); - } catch (error) { - if (SavedObjectsErrorHelpers.isSavedObjectsClientError(error)) { - return response.customError({ - body: error, - statusCode: error.output.statusCode, - }); - } - - if (error instanceof CannotOverrideError || error instanceof ValidationError) { - return response.badRequest({ body: error }); - } + } - throw error; + if (error instanceof CannotOverrideError || error instanceof ValidationError) { + return response.badRequest({ body: error }); } + + throw error; + } + }; + router.post( + { path: '/api/kibana/settings/{key}', validate }, + async (context, request, response) => { + const uiSettingsClient = (await context.core).uiSettings.client; + return await setFromRequest(uiSettingsClient, context, request, response); + } + ); + router.post( + { path: '/api/kibana/global_settings/{key}', validate }, + async (context, request, response) => { + const uiSettingsClient = (await context.core).uiSettings.globalClient; + return await setFromRequest(uiSettingsClient, context, request, response); } ); } diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/set_many.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/set_many.ts index 3bbe14c4a0076..71e94ac039304 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/set_many.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/routes/set_many.ts @@ -7,10 +7,12 @@ */ import { schema, ValidationError } from '@kbn/config-schema'; - import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-utils-server'; +import { KibanaRequest, KibanaResponseFactory } from '@kbn/core-http-server'; +import { IUiSettingsClient } from '@kbn/core-ui-settings-server'; import type { InternalUiSettingsRouter } from '../internal_types'; import { CannotOverrideError } from '../ui_settings_errors'; +import { InternalUiSettingsRequestHandlerContext } from '../internal_types'; const validate = { body: schema.object({ @@ -19,10 +21,13 @@ const validate = { }; export function registerSetManyRoute(router: InternalUiSettingsRouter) { - router.post({ path: '/api/kibana/settings', validate }, async (context, request, response) => { + const setManyFromRequest = async ( + uiSettingsClient: IUiSettingsClient, + context: InternalUiSettingsRequestHandlerContext, + request: KibanaRequest, 'post'>, + response: KibanaResponseFactory + ) => { try { - const uiSettingsClient = (await context.core).uiSettings.client; - const { changes } = request.body; await uiSettingsClient.setMany(changes); @@ -46,5 +51,17 @@ export function registerSetManyRoute(router: InternalUiSettingsRouter) { throw error; } + }; + router.post({ path: '/api/kibana/settings', validate }, async (context, request, response) => { + const uiSettingsClient = (await context.core).uiSettings.client; + return await setManyFromRequest(uiSettingsClient, context, request, response); }); + + router.post( + { path: '/api/kibana/global_settings', validate }, + async (context, request, response) => { + const uiSettingsClient = (await context.core).uiSettings.globalClient; + return await setManyFromRequest(uiSettingsClient, context, request, response); + } + ); } diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/saved_objects/ui_settings.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/saved_objects/ui_settings.ts index 399e14eaf0dee..ba6abf0442497 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/saved_objects/ui_settings.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/saved_objects/ui_settings.ts @@ -65,7 +65,7 @@ export const uiSettingsGlobalType: SavedObjectsType = { }; }, getTitle(obj) { - return `Global Setting [${obj.id}]`; + return `Global Settings [${obj.id}]`; }, }, }; diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/types.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/types.ts index 1f0069540d9c3..b47df20d50bea 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/types.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/types.ts @@ -11,8 +11,8 @@ import type { UiSettingsServiceSetup, UiSettingsServiceStart, } from '@kbn/core-ui-settings-server'; -import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; -import { UiSettingsParams } from '@kbn/core-ui-settings-common'; +import type { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import type { UiSettingsParams } from '@kbn/core-ui-settings-common'; import type { Logger } from '@kbn/logging'; /** @internal */ diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_route_handler_context.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_route_handler_context.ts index ca7f680c0e628..58b268040a8ca 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_route_handler_context.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_route_handler_context.ts @@ -19,6 +19,7 @@ import type { InternalUiSettingsServiceStart } from './types'; */ export class CoreUiSettingsRouteHandlerContext implements UiSettingsRequestHandlerContext { #client?: IUiSettingsClient; + #globalClient?: IUiSettingsClient; constructor( private readonly uiSettingsStart: InternalUiSettingsServiceStart, @@ -33,4 +34,13 @@ export class CoreUiSettingsRouteHandlerContext implements UiSettingsRequestHandl } return this.#client; } + + public get globalClient() { + if (this.#globalClient == null) { + this.#globalClient = this.uiSettingsStart.globalAsScopedToClient( + this.savedObjectsRouterHandlerContext.client + ); + } + return this.#globalClient; + } } diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.test.mock.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.test.mock.ts index d5afb4beaa4a3..5a32208407b48 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.test.mock.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.test.mock.ts @@ -11,6 +11,11 @@ jest.doMock('./clients/ui_settings_client', () => ({ UiSettingsClient: MockUiSettingsClientConstructor, })); +export const MockUiSettingsGlobalClientConstructor = jest.fn(); +jest.doMock('./clients/ui_settings_global_client', () => ({ + UiSettingsGlobalClient: MockUiSettingsGlobalClientConstructor, +})); + export const MockUiSettingsDefaultsClientConstructor = jest.fn(); jest.doMock('./clients/ui_settings_defaults_client', () => ({ UiSettingsDefaultsClient: MockUiSettingsDefaultsClientConstructor, diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.test.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.test.ts index 3b40945e4e9f5..23438e2ab74af 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.test.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.test.ts @@ -13,6 +13,7 @@ import { mockCoreContext } from '@kbn/core-base-server-mocks'; import { httpServiceMock } from '@kbn/core-http-server-mocks'; import { MockUiSettingsClientConstructor, + MockUiSettingsGlobalClientConstructor, MockUiSettingsDefaultsClientConstructor, getCoreSettingsMock, } from './ui_settings_service.test.mock'; @@ -53,6 +54,7 @@ describe('uiSettings', () => { afterEach(() => { MockUiSettingsClientConstructor.mockClear(); + MockUiSettingsGlobalClientConstructor.mockClear(); getCoreSettingsMock.mockClear(); }); @@ -95,6 +97,20 @@ describe('uiSettings', () => { `"uiSettings for the key [foo] has been already registered"` ); }); + + it('throws if registers the same key twice to global settings', async () => { + const setup = await service.setup(setupDeps); + setup.registerGlobal(defaults); + expect(() => setup.registerGlobal(defaults)).toThrowErrorMatchingInlineSnapshot( + `"Global uiSettings for the key [foo] has been already registered"` + ); + }); + + it('does not throw when registering a global and namespaced setting with the same name', async () => { + const setup = await service.setup(setupDeps); + setup.register(defaults); + expect(() => setup.registerGlobal(defaults)).not.toThrow(); + }); }); }); @@ -118,6 +134,20 @@ describe('uiSettings', () => { ); }); + it('throws if validation schema is not provided for global settings', async () => { + const { registerGlobal } = await service.setup(setupDeps); + registerGlobal({ + // @ts-expect-error schema is required key + custom: { + value: 42, + }, + }); + + await expect(service.start()).rejects.toMatchInlineSnapshot( + `[Error: Validation schema is not provided for [custom] Global UI Setting]` + ); + }); + it('validates registered definitions', async () => { const { register } = await service.setup(setupDeps); register({ @@ -132,6 +162,20 @@ describe('uiSettings', () => { ); }); + it('validates registered definitions for global settings', async () => { + const { registerGlobal } = await service.setup(setupDeps); + registerGlobal({ + custom: { + value: 42, + schema: schema.string(), + }, + }); + + await expect(service.start()).rejects.toMatchInlineSnapshot( + `[Error: expected value of type [string] but got [number]]` + ); + }); + it('validates overrides', async () => { const coreContext = mockCoreContext.create(); coreContext.configService.atPath.mockReturnValueOnce( @@ -201,5 +245,35 @@ describe('uiSettings', () => { expect(MockUiSettingsClientConstructor.mock.calls[0][0].defaults).not.toBe(defaults); }); }); + + describe('#asScopedToGlobalClient', () => { + it('passes saved object type "config-global" to UiSettingsGlobalClient', async () => { + await service.setup(setupDeps); + const start = await service.start(); + start.globalAsScopedToClient(savedObjectsClient); + + expect(MockUiSettingsGlobalClientConstructor).toBeCalledTimes(1); + expect(MockUiSettingsGlobalClientConstructor.mock.calls[0][0].type).toBe('config-global'); + }); + + it('passes overrides to UiSettingsGlobalClient', async () => { + await service.setup(setupDeps); + const start = await service.start(); + start.globalAsScopedToClient(savedObjectsClient); + + expect(MockUiSettingsGlobalClientConstructor).toBeCalledTimes(1); + expect(MockUiSettingsGlobalClientConstructor.mock.calls[0][0].overrides).toEqual({}); + }); + + it('passes a copy of set defaults to UiSettingsGlobalClient', async () => { + const setup = await service.setup(setupDeps); + setup.register(defaults); + const start = await service.start(); + start.globalAsScopedToClient(savedObjectsClient); + + expect(MockUiSettingsGlobalClientConstructor).toBeCalledTimes(1); + expect(MockUiSettingsGlobalClientConstructor.mock.calls[0][0].defaults).toEqual({}); + }); + }); }); }); diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.ts b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.ts index e5dc650fd003f..77d494188d20a 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.ts +++ b/packages/core/ui-settings/core-ui-settings-server-internal/src/ui_settings_service.ts @@ -14,9 +14,9 @@ import type { CoreContext, CoreService } from '@kbn/core-base-server-internal'; import type { InternalHttpServiceSetup } from '@kbn/core-http-server-internal'; import type { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; import type { InternalSavedObjectsServiceSetup } from '@kbn/core-saved-objects-server-internal'; -import type { UiSettingsParams } from '@kbn/core-ui-settings-common'; +import type { UiSettingsParams, UiSettingsScope } from '@kbn/core-ui-settings-common'; import { UiSettingsConfigType, uiSettingsConfig as uiConfigDefinition } from './ui_settings_config'; -import { UiSettingsClient } from './clients/ui_settings_client'; +import { UiSettingsClient, UiSettingsClientFactory, UiSettingsGlobalClient } from './clients'; import type { InternalUiSettingsServicePreboot, InternalUiSettingsServiceSetup, @@ -32,6 +32,11 @@ export interface SetupDeps { http: InternalHttpServiceSetup; savedObjects: InternalSavedObjectsServiceSetup; } +type ClientType = T extends 'global' + ? UiSettingsGlobalClient + : T extends 'namespace' + ? UiSettingsClient + : never; /** @internal */ export class UiSettingsService @@ -41,6 +46,7 @@ export class UiSettingsService private readonly config$: Observable; private readonly isDist: boolean; private readonly uiSettingsDefaults = new Map(); + private readonly uiSettingsGlobalDefaults = new Map(); private overrides: Record = {}; constructor(private readonly coreContext: CoreContext) { @@ -78,7 +84,8 @@ export class UiSettingsService this.overrides = config.overrides; return { - register: this.register.bind(this), + register: this.register, + registerGlobal: this.registerGlobal, }; } @@ -87,36 +94,52 @@ export class UiSettingsService this.validatesOverrides(); return { - asScopedToClient: this.getScopedClientFactory(), + asScopedToClient: this.getScopedClientFactory('namespace'), + globalAsScopedToClient: this.getScopedClientFactory('global'), }; } public async stop() {} - private getScopedClientFactory(): ( - savedObjectsClient: SavedObjectsClientContract - ) => UiSettingsClient { + private getScopedClientFactory( + scope: UiSettingsScope + ): (savedObjectsClient: SavedObjectsClientContract) => ClientType { const { version, buildNum } = this.coreContext.env.packageInfo; - return (savedObjectsClient: SavedObjectsClientContract) => - new UiSettingsClient({ - type: 'config', + return (savedObjectsClient: SavedObjectsClientContract): ClientType => { + const isNamespaceScope = scope === 'namespace'; + + const options = { + type: (isNamespaceScope ? 'config' : 'config-global') as 'config' | 'config-global', id: version, buildNum, savedObjectsClient, - defaults: mapToObject(this.uiSettingsDefaults), - overrides: this.overrides, + defaults: isNamespaceScope + ? mapToObject(this.uiSettingsDefaults) + : mapToObject(this.uiSettingsGlobalDefaults), + overrides: isNamespaceScope ? this.overrides : {}, log: this.log, - }); + }; + return UiSettingsClientFactory.create(options) as ClientType; + }; } - private register(settings: Record = {}) { + private register = (settings: Record = {}) => { Object.entries(settings).forEach(([key, value]) => { if (this.uiSettingsDefaults.has(key)) { throw new Error(`uiSettings for the key [${key}] has been already registered`); } this.uiSettingsDefaults.set(key, value); }); - } + }; + + private registerGlobal = (settings: Record = {}) => { + Object.entries(settings).forEach(([key, value]) => { + if (this.uiSettingsGlobalDefaults.has(key)) { + throw new Error(`Global uiSettings for the key [${key}] has been already registered`); + } + this.uiSettingsGlobalDefaults.set(key, value); + }); + }; private validatesDefinitions() { for (const [key, definition] of this.uiSettingsDefaults) { @@ -125,6 +148,12 @@ export class UiSettingsService } definition.schema.validate(definition.value, {}, `ui settings defaults [${key}]`); } + for (const [key, definition] of this.uiSettingsGlobalDefaults) { + if (!definition.schema) { + throw new Error(`Validation schema is not provided for [${key}] Global UI Setting`); + } + definition.schema.validate(definition.value, {}); + } } private validatesOverrides() { diff --git a/packages/core/ui-settings/core-ui-settings-server-mocks/src/ui_settings_service.mock.ts b/packages/core/ui-settings/core-ui-settings-server-mocks/src/ui_settings_service.mock.ts index 8a8c3fddd1765..5d4b4c62ebb1e 100644 --- a/packages/core/ui-settings/core-ui-settings-server-mocks/src/ui_settings_service.mock.ts +++ b/packages/core/ui-settings/core-ui-settings-server-mocks/src/ui_settings_service.mock.ts @@ -48,6 +48,7 @@ const createPrebootMock = () => { const createSetupMock = () => { const mocked: jest.Mocked = { register: jest.fn(), + registerGlobal: jest.fn(), }; return mocked; @@ -56,6 +57,7 @@ const createSetupMock = () => { const createStartMock = () => { const mocked: jest.Mocked = { asScopedToClient: jest.fn(), + globalAsScopedToClient: jest.fn(), }; mocked.asScopedToClient.mockReturnValue(createClientMock()); diff --git a/packages/core/ui-settings/core-ui-settings-server/src/contracts.ts b/packages/core/ui-settings/core-ui-settings-server/src/contracts.ts index b078da6a4ec46..2048f2fb790b1 100644 --- a/packages/core/ui-settings/core-ui-settings-server/src/contracts.ts +++ b/packages/core/ui-settings/core-ui-settings-server/src/contracts.ts @@ -13,7 +13,7 @@ import type { IUiSettingsClient } from './ui_settings_client'; /** @public */ export interface UiSettingsServiceSetup { /** - * Sets settings with default values for the uiSettings. + * Sets settings with default values for the uiSettings * @param settings * * @example @@ -30,6 +30,24 @@ export interface UiSettingsServiceSetup { * ``` */ register(settings: Record): void; + /** + * Sets settings with default values for the global uiSettings + * @param settings + * + * @example + * ```ts + * setup(core: CoreSetup){ + * core.uiSettings.register([{ + * foo: { + * name: i18n.translate('my foo settings'), + * value: true, + * description: 'add some awesomeness', + * }, + * }]); + * } + * ``` + */ + registerGlobal(settings: Record): void; } /** @public */ @@ -49,4 +67,20 @@ export interface UiSettingsServiceStart { * ``` */ asScopedToClient(savedObjectsClient: SavedObjectsClientContract): IUiSettingsClient; + + /** + * Creates a global {@link IUiSettingsClient} with provided *scoped* saved objects client. + * + * This should only be used in the specific case where the client needs to be accessed + * from outside of the scope of a {@link RequestHandler}. + * + * @example + * ```ts + * start(core: CoreStart) { + * const soClient = core.savedObjects.getScopedClient(arbitraryRequest); + * const uiSettingsClient = core.uiSettings.asScopedToGlobalClient(soClient); + * } + * ``` + */ + globalAsScopedToClient(savedObjectsClient: SavedObjectsClientContract): IUiSettingsClient; } diff --git a/packages/core/ui-settings/core-ui-settings-server/src/request_handler_context.ts b/packages/core/ui-settings/core-ui-settings-server/src/request_handler_context.ts index 32c59539abf94..ed507e6eca2cd 100644 --- a/packages/core/ui-settings/core-ui-settings-server/src/request_handler_context.ts +++ b/packages/core/ui-settings/core-ui-settings-server/src/request_handler_context.ts @@ -14,4 +14,5 @@ import type { IUiSettingsClient } from './ui_settings_client'; */ export interface UiSettingsRequestHandlerContext { client: IUiSettingsClient; + globalClient: IUiSettingsClient; } diff --git a/src/core/server/integration_tests/ui_settings/doc_exists.ts b/src/core/server/integration_tests/ui_settings/doc_exists.ts index 8710be3e02c9e..60a0a5ca59c9f 100644 --- a/src/core/server/integration_tests/ui_settings/doc_exists.ts +++ b/src/core/server/integration_tests/ui_settings/doc_exists.ts @@ -12,7 +12,7 @@ export const docExistsSuite = (savedObjectsIndex: string) => () => { async function setup(options: { initialSettings?: Record } = {}) { const { initialSettings } = options; - const { uiSettings, esClient, supertest } = getServices(); + const { uiSettings, uiSettingsGlobal, esClient, supertest } = getServices(); // delete the kibana index to ensure we start fresh await esClient.deleteByQuery({ @@ -27,9 +27,10 @@ export const docExistsSuite = (savedObjectsIndex: string) => () => { if (initialSettings) { await uiSettings.setMany(initialSettings); + await uiSettingsGlobal.setMany(uiSettingsGlobal); } - return { uiSettings, supertest }; + return { uiSettings, uiSettingsGlobal, supertest }; } describe('get route', () => { @@ -190,4 +191,168 @@ export const docExistsSuite = (savedObjectsIndex: string) => () => { }); }); }); + + describe('global', () => { + describe('get route', () => { + it('returns a 200 and includes userValues', async () => { + const defaultIndex = chance.word({ length: 10 }); + + const { supertest } = await setup({ + initialSettings: { + defaultIndex, + }, + }); + + const { body } = await supertest('get', '/api/kibana/global_settings').expect(200); + + expect(body).toMatchObject({ + settings: { + buildNum: { + userValue: expect.any(Number), + }, + defaultIndex: { + userValue: defaultIndex, + }, + foo: { + userValue: 'bar', + isOverridden: true, + }, + }, + }); + }); + }); + + describe('set route', () => { + it('returns a 200 and all values including update', async () => { + const { supertest } = await setup(); + + const defaultIndex = chance.word(); + + const { body } = await supertest('post', '/api/kibana/global_settings/defaultIndex') + .send({ + value: defaultIndex, + }) + .expect(200); + + expect(body).toMatchObject({ + settings: { + buildNum: { + userValue: expect.any(Number), + }, + defaultIndex: { + userValue: defaultIndex, + }, + foo: { + userValue: 'bar', + isOverridden: true, + }, + }, + }); + }); + + it('returns a 400 if trying to set overridden value', async () => { + const { supertest } = await setup(); + + const { body } = await supertest('delete', '/api/kibana/global_settings/foo') + .send({ + value: 'baz', + }) + .expect(400); + + expect(body).toEqual({ + error: 'Bad Request', + message: 'Unable to update "foo" because it is overridden', + statusCode: 400, + }); + }); + }); + + describe('setMany route', () => { + it('returns a 200 and all values including updates', async () => { + const { supertest } = await setup(); + + const defaultIndex = chance.word(); + const { body } = await supertest('post', '/api/kibana/global_settings') + .send({ + changes: { + defaultIndex, + }, + }) + .expect(200); + + expect(body).toMatchObject({ + settings: { + buildNum: { + userValue: expect.any(Number), + }, + defaultIndex: { + userValue: defaultIndex, + }, + foo: { + userValue: 'bar', + isOverridden: true, + }, + }, + }); + }); + + it('returns a 400 if trying to set overridden value', async () => { + const { supertest } = await setup(); + + const { body } = await supertest('post', '/api/kibana/global_settings') + .send({ + changes: { + foo: 'baz', + }, + }) + .expect(400); + + expect(body).toEqual({ + error: 'Bad Request', + message: 'Unable to update "foo" because it is overridden', + statusCode: 400, + }); + }); + }); + + describe('delete route', () => { + it('returns a 200 and deletes the setting', async () => { + const defaultIndex = chance.word({ length: 10 }); + + const { uiSettingsGlobal, supertest } = await setup({ + initialSettings: { defaultIndex }, + }); + + expect(await uiSettingsGlobal.get('defaultIndex')).toBe(defaultIndex); + + const { body } = await supertest( + 'delete', + '/api/kibana/global_settings/defaultIndex' + ).expect(200); + + expect(body).toMatchObject({ + settings: { + buildNum: { + userValue: expect.any(Number), + }, + foo: { + userValue: 'bar', + isOverridden: true, + }, + }, + }); + }); + it('returns a 400 if deleting overridden value', async () => { + const { supertest } = await setup(); + + const { body } = await supertest('delete', '/api/kibana/global_settings/foo').expect(400); + + expect(body).toEqual({ + error: 'Bad Request', + message: 'Unable to update "foo" because it is overridden', + statusCode: 400, + }); + }); + }); + }); }; diff --git a/src/core/server/integration_tests/ui_settings/lib/servers.ts b/src/core/server/integration_tests/ui_settings/lib/servers.ts index 64d3fa170a796..a02b2fb86b119 100644 --- a/src/core/server/integration_tests/ui_settings/lib/servers.ts +++ b/src/core/server/integration_tests/ui_settings/lib/servers.ts @@ -28,6 +28,7 @@ interface AllServices { savedObjectsClient: SavedObjectsClientContract; esClient: Client; uiSettings: IUiSettingsClient; + uiSettingsGlobal: IUiSettingsClient; supertest: (method: HttpMethod, path: string) => supertest.Test; } @@ -62,12 +63,14 @@ export function getServices() { ); const uiSettings = kbn.coreStart.uiSettings.asScopedToClient(savedObjectsClient); + const uiSettingsGlobal = kbn.coreStart.uiSettings.globalAsScopedToClient(savedObjectsClient); services = { supertest: (method: HttpMethod, path: string) => getSupertest(kbn.root, method, path), esClient, savedObjectsClient, uiSettings, + uiSettingsGlobal, }; return services; diff --git a/src/core/server/integration_tests/ui_settings/routes.test.ts b/src/core/server/integration_tests/ui_settings/routes.test.ts index 50adc8003aca3..ba806d04079ee 100644 --- a/src/core/server/integration_tests/ui_settings/routes.test.ts +++ b/src/core/server/integration_tests/ui_settings/routes.test.ts @@ -55,5 +55,32 @@ describe('ui settings service', () => { ); }); }); + + describe('global', () => { + describe('set', () => { + it('validates value', async () => { + const response = await request + .post(root, '/api/kibana/global_settings/custom') + .send({ value: 100 }) + .expect(400); + + expect(response.body.message).toBe( + '[validation [custom]]: expected value of type [string] but got [number]' + ); + }); + }); + describe('set many', () => { + it('validates value', async () => { + const response = await request + .post(root, '/api/kibana/global_settings') + .send({ changes: { custom: 100, foo: 'bar' } }) + .expect(400); + + expect(response.body.message).toBe( + '[validation [custom]]: expected value of type [string] but got [number]' + ); + }); + }); + }); }); }); diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts index 028465ebfb8ac..b2e1deb4e3c07 100644 --- a/src/core/server/mocks.ts +++ b/src/core/server/mocks.ts @@ -124,6 +124,7 @@ function createCoreRequestHandlerContextMock() { }, uiSettings: { client: uiSettingsServiceMock.createClient(), + globalClient: uiSettingsServiceMock.createClient(), }, deprecations: { client: deprecationsServiceMock.createClient(), From 796f51ea93f625283d6b40beb62c292b0ad882fe Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Thu, 8 Dec 2022 14:10:21 +0100 Subject: [PATCH 11/19] Bump qs dependencies to newest allowed versions (#147173) --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0be569086145b..6babf50c28b21 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22282,16 +22282,16 @@ qs@6.9.7: integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== qs@^6.10.0, qs@^6.5.1, qs@^6.7.0: - version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== query-string@^6.13.2: version "6.13.2" From 134118a18b396cbf39d0048c7a5823fa3df496d0 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Thu, 8 Dec 2022 14:10:41 +0100 Subject: [PATCH 12/19] Bump simple-git from v3.10.0 to v3.15.1 (#147174) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 76fabd9bcaf72..bb17f46d141a4 100644 --- a/package.json +++ b/package.json @@ -1115,7 +1115,7 @@ "rxjs-marbles": "^7.0.1", "sass-loader": "^10.3.1", "selenium-webdriver": "^4.6.1", - "simple-git": "^3.10.0", + "simple-git": "^3.15.1", "sinon": "^7.4.2", "sort-package-json": "^1.53.1", "source-map": "^0.7.3", diff --git a/yarn.lock b/yarn.lock index 6babf50c28b21..7a18be0fc1642 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24482,10 +24482,10 @@ simple-get@^4.0.0, simple-get@^4.0.1: once "^1.3.1" simple-concat "^1.0.0" -simple-git@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.10.0.tgz#f20031dd121d3c49e215ef0186a102bece3f89b2" - integrity sha512-2w35xrS5rVtAW0g67LqtxCZN5cdddz/woQRfS0OJXaljXEoTychZ4jnE+CQgra/wX4ZvHeiChTUMenCwfIYEYw== +simple-git@^3.15.1: + version "3.15.1" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.15.1.tgz#57f595682cb0c2475d5056da078a05c8715a25ef" + integrity sha512-73MVa5984t/JP4JcQt0oZlKGr42ROYWC3BcUZfuHtT3IHKPspIvL0cZBnvPXF7LL3S/qVeVHVdYYmJ3LOTw4Rg== dependencies: "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1" From a731a2d4dffa313919f5f0cf13b281b99d9f31ea Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Thu, 8 Dec 2022 09:03:03 -0500 Subject: [PATCH 13/19] [Security Solution] Fix Endpoint list integration tests (#147153) ## Summary > **Note** > Will merge this after: https://github.com/elastic/kibana/pull/147149 Fix the Endpoint list tests by removing a dependency on the Kibana version. Resolves: https://github.com/elastic/kibana/issues/141298 ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../apps/endpoint/endpoint_list.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts index 730486ccf94f5..92ce0a8aaf6d9 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts @@ -40,7 +40,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { 'Warning', 'Linux', '10.2.17.24, 10.56.215.200,10.254.196.130', - '8.5.0', + 'x', 'x', '', ], @@ -51,7 +51,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { 'Success', 'Linux', '10.138.79.131, 10.170.160.154', - '8.5.0', + 'x', 'x', '', ], @@ -62,7 +62,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { 'Warning', 'Linux', '10.87.11.145, 10.117.106.109,10.242.136.97', - '8.5.0', + 'x', 'x', '', ], @@ -75,6 +75,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { for (let i = 1; i < tableData.length; i++) { tableData[i][1] = 'x'; tableData[i][2] = 'x'; + tableData[i][6] = 'x'; tableData[i][7] = 'x'; } @@ -96,8 +97,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); - // Version specific: https://github.com/elastic/kibana/issues/141298 - describe.skip('when there is data,', () => { + describe('when there is data,', () => { before(async () => { indexedData = await endpointTestResources.loadEndpointData({ numHosts: 3 }); await pageObjects.endpoint.navigateToEndpointList(); From dd8eb8b2935c6a18cd81dca6edfeafe4e165415d Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Thu, 8 Dec 2022 15:30:07 +0100 Subject: [PATCH 14/19] [Infrastructure UI] Host View: Store pagination and sorting info in the URL state (#146984) Closes #146583 ## Summary This PR adds table sorting and pagination to the url state. It uses a separate reducer for that because that way we can avoid expanding the other state and will avoid rerendering on change. ## Testing 1. Open the host view 2. Select different rows per page and different sorting column 3. Copy the URL and paste it into a different browser tab - the table sorting, rows per page, and current page should be persisted image --- .../metrics/hosts/components/hosts_table.tsx | 35 ++++++++++- .../hooks/use_table_properties_url_state.ts | 62 +++++++++++++++++++ 2 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_table_properties_url_state.ts diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/hosts_table.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/hosts_table.tsx index a15b1a3016ddb..611666c135a6b 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/hosts_table.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/hosts_table.tsx @@ -5,9 +5,10 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback } from 'react'; import { EuiInMemoryTable } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { isEqual } from 'lodash'; import { HostsTableColumns } from './hosts_table_columns'; import { NoData } from '../../../../components/empty_states'; import { InfraLoadingPanel } from '../../../../components/loading'; @@ -17,6 +18,7 @@ import type { SnapshotMetricType } from '../../../../../common/inventory_models/ import type { InfraTimerangeInput } from '../../../../../common/http_api'; import { useUnifiedSearchContext } from '../hooks/use_unified_search'; import { useSourceContext } from '../../../../containers/metrics_source'; +import { useTableProperties } from '../hooks/use_table_properties_url_state'; const HOST_METRICS: Array<{ type: SnapshotMetricType }> = [ { type: 'rx' }, @@ -30,6 +32,7 @@ const HOST_METRICS: Array<{ type: SnapshotMetricType }> = [ export const HostsTable = () => { const { sourceId } = useSourceContext(); const { buildQuery, dateRangeTimestamp, panelFilters } = useUnifiedSearchContext(); + const [properties, setProperties] = useTableProperties(); const timeRange: InfraTimerangeInput = { from: dateRangeTimestamp.from, @@ -59,6 +62,24 @@ export const HostsTable = () => { const items = useHostTable(nodes); const noData = items.length === 0; + const onTableChange = useCallback( + ({ page = {}, sort = {} }) => { + const { index: pageIndex, size: pageSize } = page; + const { field, direction } = sort; + + const sorting = field && direction ? { field, direction } : true; + const pagination = pageIndex >= 0 && pageSize !== 0 ? { pageIndex, pageSize } : true; + + if (!isEqual(properties.sorting, sorting)) { + setProperties({ sorting }); + } + if (!isEqual(properties.pagination, pagination)) { + setProperties({ pagination }); + } + }, + [setProperties, properties.pagination, properties.sorting] + ); + return ( <> {loading || !panelFilters ? ( @@ -88,7 +109,17 @@ export const HostsTable = () => { /> ) : ( - + )} ); diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_table_properties_url_state.ts b/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_table_properties_url_state.ts new file mode 100644 index 0000000000000..980fdf19a684c --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_table_properties_url_state.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as rt from 'io-ts'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { constant, identity } from 'fp-ts/lib/function'; +import { useUrlState } from '../../../../utils/use_url_state'; + +export const GET_DEFAULT_TABLE_PROPERTIES = { + sorting: true, + pagination: true, +}; +const HOST_TABLE_PROPERTIES_URL_STATE_KEY = 'tableProperties'; + +type Action = rt.TypeOf; +type PropertiesUpdater = (newProps: Action) => void; + +export const useTableProperties = (): [TableProperties, PropertiesUpdater] => { + const [urlState, setUrlState] = useUrlState({ + defaultState: GET_DEFAULT_TABLE_PROPERTIES, + decodeUrlState, + encodeUrlState, + urlStateKey: HOST_TABLE_PROPERTIES_URL_STATE_KEY, + }); + + const setProperties = (newProps: Action) => setUrlState({ ...urlState, ...newProps }); + + return [urlState, setProperties]; +}; + +const PaginationRT = rt.union([ + rt.boolean, + rt.partial({ pageIndex: rt.number, pageSize: rt.number }), +]); +const SortingRT = rt.union([rt.boolean, rt.type({ field: rt.string, direction: rt.any })]); + +const SetSortingRT = rt.partial({ + sorting: SortingRT, +}); + +const SetPaginationRT = rt.partial({ + pagination: PaginationRT, +}); + +const ActionRT = rt.intersection([SetSortingRT, SetPaginationRT]); + +const TablePropertiesRT = rt.type({ + pagination: PaginationRT, + sorting: SortingRT, +}); + +type TableProperties = rt.TypeOf; + +const encodeUrlState = TablePropertiesRT.encode; +const decodeUrlState = (value: unknown) => { + return pipe(TablePropertiesRT.decode(value), fold(constant(undefined), identity)); +}; From 22e5040a9bafbccfb4f4c53a6115acdd822e3e18 Mon Sep 17 00:00:00 2001 From: Bhavya RM Date: Thu, 8 Dec 2022 09:37:02 -0500 Subject: [PATCH 15/19] Unskip dashboard_unsaved_state.ts test (#147215) --- .../apps/dashboard/group1/dashboard_unsaved_state.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/functional/apps/dashboard/group1/dashboard_unsaved_state.ts b/test/functional/apps/dashboard/group1/dashboard_unsaved_state.ts index 2447a122a77aa..f3e290e8b8e45 100644 --- a/test/functional/apps/dashboard/group1/dashboard_unsaved_state.ts +++ b/test/functional/apps/dashboard/group1/dashboard_unsaved_state.ts @@ -23,8 +23,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { let unsavedPanelCount = 0; const testQuery = 'Test Query'; - // FLAKY https://github.com/elastic/kibana/issues/112812 - describe.skip('dashboard unsaved state', () => { + describe('dashboard unsaved state', () => { before(async () => { await kibanaServer.savedObjects.cleanStandardList(); await kibanaServer.importExport.load( From 12e9e35eb642b3c1ba4f9c45a08929fba763da9d Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Thu, 8 Dec 2022 16:00:20 +0100 Subject: [PATCH 16/19] Properly re-expose `close` method from the `createPointInTimeFinderDecryptedAsInternalUser` API. (#147241) --- .../server/saved_objects/index.test.ts | 27 +++++++++++++++++++ .../server/saved_objects/index.ts | 2 +- .../server/hidden_saved_object_routes.ts | 2 ++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.test.ts b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.test.ts index dc2afe6e41957..d3bf05d486d82 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.test.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.test.ts @@ -293,5 +293,32 @@ describe('#setupSavedObjects', () => { expect(res.saved_objects[0].error).toHaveProperty('message', 'Test failure'); } }); + + it('properly re-exposes `close` method of the underlying point in time finder ', async () => { + // The finder that underlying repository returns is an instance of a `PointInTimeFinder` class that cannot, and + // unlike object literal it cannot be "copied" with the spread operator. We should make sure we properly re-expose + // `close` function. + const mockClose = jest.fn(); + mockSavedObjectsRepository.createPointInTimeFinder = jest.fn().mockImplementation(() => { + class MockPointInTimeFinder { + async close() { + mockClose(); + } + async *find() {} + } + + return new MockPointInTimeFinder(); + }); + + const finder = await setupContract().createPointInTimeFinderDecryptedAsInternalUser({ + type: 'known-type', + }); + + expect(finder.find).toBeInstanceOf(Function); + expect(finder.close).toBeInstanceOf(Function); + + await finder.close(); + expect(mockClose).toHaveBeenCalledTimes(1); + }); }); }); diff --git a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.ts b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.ts index 6be6fae9f5d31..b7a7da6ba7585 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.ts @@ -177,7 +177,7 @@ export function setupSavedObjects({ } } - return { ...finder, find: () => encryptedFinder() }; + return { find: () => encryptedFinder(), close: finder.close.bind(finder) }; }, }; }; diff --git a/x-pack/test/encrypted_saved_objects_api_integration/fixtures/api_consumer_plugin/server/hidden_saved_object_routes.ts b/x-pack/test/encrypted_saved_objects_api_integration/fixtures/api_consumer_plugin/server/hidden_saved_object_routes.ts index 7b4a79aee2223..9f1c0dee955fa 100644 --- a/x-pack/test/encrypted_saved_objects_api_integration/fixtures/api_consumer_plugin/server/hidden_saved_object_routes.ts +++ b/x-pack/test/encrypted_saved_objects_api_integration/fixtures/api_consumer_plugin/server/hidden_saved_object_routes.ts @@ -68,6 +68,8 @@ export function registerHiddenSORoutes( savedObjects = [...savedObjects, ...result.saved_objects]; } + await finder.close(); + try { return response.ok({ body: { saved_objects: savedObjects }, From d9d8c2fe104283216bb70e9f003d36b8c71a6602 Mon Sep 17 00:00:00 2001 From: Janki Salvi <117571355+js-jankisalvi@users.noreply.github.com> Date: Thu, 8 Dec 2022 16:05:07 +0100 Subject: [PATCH 17/19] [Cases - ON Week] updated useDeleteComment hook with React query (#146901) ## Summary This PR refactors `useDeleteComment` hook with React query. ![image](https://user-images.githubusercontent.com/117571355/205352831-7189d756-f4a3-43a5-af5b-bcfa6eb8f9ec.png) ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../use_user_actions_handler.test.tsx | 28 ++++- .../user_actions/use_user_actions_handler.tsx | 2 +- .../cases/public/containers/constants.ts | 1 + .../containers/use_delete_comment.test.tsx | 115 ++++++++++-------- .../public/containers/use_delete_comment.tsx | 112 ++++------------- 5 files changed, 112 insertions(+), 146 deletions(-) diff --git a/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.test.tsx b/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.test.tsx index 06f958f6149cc..2a073a1c42afa 100644 --- a/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.test.tsx +++ b/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.test.tsx @@ -5,11 +5,13 @@ * 2.0. */ +import React from 'react'; import { renderHook, act } from '@testing-library/react-hooks'; import { basicCase } from '../../containers/mock'; import { useUpdateComment } from '../../containers/use_update_comment'; import { useRefreshCaseViewPage } from '../case_view/use_on_refresh_case_view_page'; +import { TestProviders } from '../../common/mock'; import { useLensDraftComment } from '../markdown_editor/plugins/lens/use_lens_draft_comment'; import { NEW_COMMENT_ID } from './constants'; import { useUserActionsHandler } from './use_user_actions_handler'; @@ -26,6 +28,8 @@ const patchComment = jest.fn(); const clearDraftComment = jest.fn(); const openLensModal = jest.fn(); +const wrapper: React.FC = ({ children }) => {children}; + describe('useUserActionsHandler', () => { beforeAll(() => { jest.useFakeTimers({ legacyFakeTimers: true }); @@ -52,7 +56,9 @@ describe('useUserActionsHandler', () => { }); it('should save a comment', async () => { - const { result } = renderHook(() => useUserActionsHandler()); + const { result } = renderHook(() => useUserActionsHandler(), { + wrapper, + }); result.current.handleSaveComment({ id: 'test-id', version: 'test-version' }, 'a comment'); expect(patchComment).toHaveBeenCalledWith({ @@ -64,14 +70,18 @@ describe('useUserActionsHandler', () => { }); it('should refresh the case case after updating', async () => { - const { result } = renderHook(() => useUserActionsHandler()); + const { result } = renderHook(() => useUserActionsHandler(), { + wrapper, + }); result.current.handleUpdate(basicCase); expect(useRefreshCaseViewPage()).toHaveBeenCalled(); }); it('should handle markdown edit', async () => { - const { result } = renderHook(() => useUserActionsHandler()); + const { result } = renderHook(() => useUserActionsHandler(), { + wrapper, + }); act(() => { result.current.handleManageMarkdownEditId('test-id'); @@ -82,7 +92,9 @@ describe('useUserActionsHandler', () => { }); it('should remove id from the markdown edit ids', async () => { - const { result } = renderHook(() => useUserActionsHandler()); + const { result } = renderHook(() => useUserActionsHandler(), { + wrapper, + }); act(() => { result.current.handleManageMarkdownEditId('test-id'); @@ -98,7 +110,9 @@ describe('useUserActionsHandler', () => { }); it('should outline a comment', async () => { - const { result } = renderHook(() => useUserActionsHandler()); + const { result } = renderHook(() => useUserActionsHandler(), { + wrapper, + }); act(() => { result.current.handleOutlineComment('test-id'); @@ -115,7 +129,9 @@ describe('useUserActionsHandler', () => { it('should quote', async () => { const addQuote = jest.fn(); - const { result } = renderHook(() => useUserActionsHandler()); + const { result } = renderHook(() => useUserActionsHandler(), { + wrapper, + }); result.current.commentRefs.current[NEW_COMMENT_ID] = { addQuote, diff --git a/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.tsx b/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.tsx index 2b80426e26e93..f6bf5372eedc0 100644 --- a/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.tsx +++ b/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.tsx @@ -43,7 +43,7 @@ export const useUserActionsHandler = (): UseUserActionsHandler => { useLensDraftComment(); const handlerTimeoutId = useRef(0); const { isLoadingIds, patchComment } = useUpdateComment(); - const { deleteComment } = useDeleteComment(); + const { mutate: deleteComment } = useDeleteComment(); const [selectedOutlineCommentId, setSelectedOutlineCommentId] = useState(''); const [manageMarkdownEditIds, setManageMarkdownEditIds] = useState([]); const refreshCaseViewPage = useRefreshCaseViewPage(); diff --git a/x-pack/plugins/cases/public/containers/constants.ts b/x-pack/plugins/cases/public/containers/constants.ts index b9e7dea71c3f6..f54363a7989d4 100644 --- a/x-pack/plugins/cases/public/containers/constants.ts +++ b/x-pack/plugins/cases/public/containers/constants.ts @@ -37,4 +37,5 @@ export const casesQueriesKeys = { export const casesMutationsKeys = { deleteCases: ['delete-cases'] as const, updateCases: ['update-cases'] as const, + deleteComment: ['delete-comment'] as const, }; diff --git a/x-pack/plugins/cases/public/containers/use_delete_comment.test.tsx b/x-pack/plugins/cases/public/containers/use_delete_comment.test.tsx index dd280e8abb0bf..2fe3a2f21eaa1 100644 --- a/x-pack/plugins/cases/public/containers/use_delete_comment.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_delete_comment.test.tsx @@ -5,12 +5,15 @@ * 2.0. */ +import React from 'react'; import { act, renderHook } from '@testing-library/react-hooks'; import type { UseDeleteComment } from './use_delete_comment'; import { useDeleteComment } from './use_delete_comment'; import * as api from './api'; import { basicCaseId } from './mock'; +import { TestProviders } from '../common/mock'; import { useRefreshCaseViewPage } from '../components/case_view/use_on_refresh_case_view_page'; +import { useToasts } from '../common/lib/kibana'; jest.mock('../common/lib/kibana'); jest.mock('./api'); @@ -18,81 +21,95 @@ jest.mock('../components/case_view/use_on_refresh_case_view_page'); const commentId = 'ab124'; +const wrapper: React.FC = ({ children }) => {children}; + describe('useDeleteComment', () => { + const addSuccess = jest.fn(); + const addError = jest.fn(); + + (useToasts as jest.Mock).mockReturnValue({ addSuccess, addError }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useDeleteComment() - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ - isError: false, - deleteComment: result.current.deleteComment, - }); + const { result } = renderHook(() => useDeleteComment(), { + wrapper, }); + + expect(result.current).toBeTruthy(); }); it('calls deleteComment with correct arguments - case', async () => { const spyOnDeleteComment = jest.spyOn(api, 'deleteComment'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useDeleteComment() - ); - await waitForNextUpdate(); + const { waitForNextUpdate, result } = renderHook( + () => useDeleteComment(), + { + wrapper, + } + ); - result.current.deleteComment({ + act(() => { + result.current.mutate({ caseId: basicCaseId, commentId, }); - await waitForNextUpdate(); - expect(spyOnDeleteComment).toBeCalledWith({ - caseId: basicCaseId, - commentId, - signal: expect.any(AbortSignal), - }); - expect(result.current.isError).toBe(false); + }); + + await waitForNextUpdate(); + + expect(spyOnDeleteComment).toBeCalledWith({ + caseId: basicCaseId, + commentId, + signal: expect.any(AbortSignal), }); }); it('refreshes the case page view after delete', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useDeleteComment() - ); - await waitForNextUpdate(); + const { waitForNextUpdate, result } = renderHook( + () => useDeleteComment(), + { + wrapper, + } + ); - result.current.deleteComment({ - caseId: basicCaseId, - commentId, - }); - await waitForNextUpdate(); - expect(useRefreshCaseViewPage()).toBeCalled(); + result.current.mutate({ + caseId: basicCaseId, + commentId, }); + + await waitForNextUpdate(); + + expect(useRefreshCaseViewPage()).toBeCalled(); }); it('sets isError when fails to delete a case', async () => { const spyOnDeleteComment = jest.spyOn(api, 'deleteComment'); spyOnDeleteComment.mockRejectedValue(new Error('Not possible :O')); - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useDeleteComment() - ); - await waitForNextUpdate(); + const { waitForNextUpdate, result } = renderHook( + () => useDeleteComment(), + { + wrapper, + } + ); - result.current.deleteComment({ - caseId: basicCaseId, - commentId, - }); - await waitForNextUpdate(); - expect(spyOnDeleteComment).toBeCalledWith({ - caseId: basicCaseId, - commentId, - signal: expect.any(AbortSignal), - }); + result.current.mutate({ + caseId: basicCaseId, + commentId, + }); + + await waitForNextUpdate(); - expect(result.current.isError).toBe(true); + expect(spyOnDeleteComment).toBeCalledWith({ + caseId: basicCaseId, + commentId, + signal: expect.any(AbortSignal), }); + + expect(addError).toHaveBeenCalled(); + expect(result.current.isError).toBe(true); }); }); diff --git a/x-pack/plugins/cases/public/containers/use_delete_comment.tsx b/x-pack/plugins/cases/public/containers/use_delete_comment.tsx index 8c0d9d204d6cc..58de861baf383 100644 --- a/x-pack/plugins/cases/public/containers/use_delete_comment.tsx +++ b/x-pack/plugins/cases/public/containers/use_delete_comment.tsx @@ -5,106 +5,38 @@ * 2.0. */ -import { useReducer, useCallback, useRef, useEffect } from 'react'; -import { useToasts } from '../common/lib/kibana'; +import { useMutation } from '@tanstack/react-query'; +import { casesMutationsKeys } from './constants'; +import type { ServerError } from '../types'; import { useRefreshCaseViewPage } from '../components/case_view/use_on_refresh_case_view_page'; +import { useCasesToast } from '../common/use_cases_toast'; import { deleteComment } from './api'; import * as i18n from './translations'; -interface CommentDeleteState { - isError: boolean; -} -interface CommentDelete { - commentId: string; -} - -type Action = - | { type: 'FETCH_INIT'; payload: string } - | { type: 'FETCH_SUCCESS'; payload: CommentDelete } - | { type: 'FETCH_FAILURE'; payload: string }; - -const dataFetchReducer = (state: CommentDeleteState, action: Action): CommentDeleteState => { - switch (action.type) { - case 'FETCH_INIT': - return { - ...state, - isError: false, - }; - - case 'FETCH_SUCCESS': - return { - ...state, - isError: false, - }; - case 'FETCH_FAILURE': - return { - ...state, - isError: true, - }; - default: - return state; - } -}; - -interface DeleteComment { +interface MutationArgs { caseId: string; commentId: string; } -export interface UseDeleteComment extends CommentDeleteState { - deleteComment: ({ caseId, commentId }: DeleteComment) => void; -} - -export const useDeleteComment = (): UseDeleteComment => { - const [state, dispatch] = useReducer(dataFetchReducer, { - isError: false, - }); - const toasts = useToasts(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); +export const useDeleteComment = () => { + const { showErrorToast } = useCasesToast(); const refreshCaseViewPage = useRefreshCaseViewPage(); - const dispatchDeleteComment = useCallback( - async ({ caseId, commentId }: DeleteComment) => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - dispatch({ type: 'FETCH_INIT', payload: commentId }); - - await deleteComment({ - caseId, - commentId, - signal: abortCtrlRef.current.signal, - }); - - if (!isCancelledRef.current) { - refreshCaseViewPage(); - dispatch({ type: 'FETCH_SUCCESS', payload: { commentId } }); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - toasts.addError( - error.body && error.body.message ? new Error(error.body.message) : error, - { title: i18n.ERROR_TITLE } - ); - } - dispatch({ type: 'FETCH_FAILURE', payload: commentId }); - } - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [] - ); - - useEffect( - () => () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); + return useMutation( + ({ caseId, commentId }: MutationArgs) => { + const abortCtrlRef = new AbortController(); + return deleteComment({ caseId, commentId, signal: abortCtrlRef.signal }); }, - [] + { + mutationKey: casesMutationsKeys.deleteComment, + onSuccess: () => { + refreshCaseViewPage(); + }, + onError: (error: ServerError) => { + showErrorToast(error, { title: i18n.ERROR_TITLE }); + }, + } ); - - return { ...state, deleteComment: dispatchDeleteComment }; }; + +export type UseDeleteComment = ReturnType; From 3a5c613c7f4efc184560f48295f5bf35fe1e25c8 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Thu, 8 Dec 2022 08:14:07 -0700 Subject: [PATCH 18/19] [Security Solution] Create rule from timeline (#143020) --- .../detection_rules/custom_query_rule.cy.ts | 5 +- .../e2e/detection_rules/new_terms_rule.cy.ts | 4 +- .../e2e/detection_rules/override.cy.ts | 4 +- .../e2e/detection_rules/threshold_rule.cy.ts | 4 +- .../cypress/screens/create_new_rule.ts | 5 + .../cypress/tasks/create_new_rule.ts | 34 +- .../pages/rule_creation/translations.ts | 8 - .../components/rules/query_bar/index.test.tsx | 104 ++++-- .../components/rules/query_bar/index.tsx | 32 +- .../rules/step_define_rule/index.test.tsx | 25 ++ .../rules/step_define_rule/index.tsx | 79 +++-- .../rules/use_rule_from_timeline.test.ts | 323 ++++++++++++++++++ .../rules/use_rule_from_timeline.tsx | 220 ++++++++++++ .../components/open_timeline/index.test.tsx | 30 +- .../components/open_timeline/index.tsx | 15 + .../open_timeline/open_timeline.test.tsx | 16 + .../open_timeline/open_timeline.tsx | 11 +- .../open_timeline_modal/index.test.tsx | 11 +- .../timelines_table/actions_columns.tsx | 21 +- .../open_timeline/timelines_table/index.tsx | 8 + .../components/open_timeline/translations.ts | 7 + .../components/open_timeline/types.ts | 13 +- 22 files changed, 841 insertions(+), 138 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts create mode 100644 x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.tsx diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts index 9938dd176574a..9511e96956979 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts @@ -215,10 +215,7 @@ describe('Custom query rules', () => { cy.get(INVESTIGATION_NOTES_TOGGLE).click({ force: true }); cy.get(ABOUT_INVESTIGATION_NOTES).should('have.text', INVESTIGATION_NOTES_MARKDOWN); cy.get(DEFINITION_DETAILS).within(() => { - getDetails(INDEX_PATTERNS_DETAILS).should( - 'have.text', - ruleFields.defaultIndexPatterns.join('') - ); + getDetails(INDEX_PATTERNS_DETAILS).should('have.text', 'auditbeat-*'); getDetails(CUSTOM_QUERY_DETAILS).should('have.text', ruleFields.ruleQuery); getDetails(RULE_TYPE_DETAILS).should('have.text', 'Query'); getDetails(TIMELINE_TEMPLATE_DETAILS).should('have.text', 'None'); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/new_terms_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/new_terms_rule.cy.ts index 2c0507ca38157..6d8ad918b98c8 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/new_terms_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/new_terms_rule.cy.ts @@ -7,7 +7,7 @@ import { formatMitreAttackDescription } from '../../helpers/rules'; import type { Mitre } from '../../objects/rule'; -import { getNewTermsRule, getIndexPatterns } from '../../objects/rule'; +import { getNewTermsRule } from '../../objects/rule'; import { ALERT_DATA_GRID } from '../../screens/alerts'; import { @@ -128,7 +128,7 @@ describe('New Terms rules', () => { cy.get(INVESTIGATION_NOTES_TOGGLE).click({ force: true }); cy.get(ABOUT_INVESTIGATION_NOTES).should('have.text', INVESTIGATION_NOTES_MARKDOWN); cy.get(DEFINITION_DETAILS).within(() => { - getDetails(INDEX_PATTERNS_DETAILS).should('have.text', getIndexPatterns().join('')); + getDetails(INDEX_PATTERNS_DETAILS).should('have.text', 'auditbeat-*'); getDetails(CUSTOM_QUERY_DETAILS).should('have.text', this.rule.customQuery); getDetails(RULE_TYPE_DETAILS).should('have.text', 'New Terms'); getDetails(TIMELINE_TEMPLATE_DETAILS).should('have.text', 'None'); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/override.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/override.cy.ts index 68973fdc56941..c67b7b3fcc57b 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/override.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/override.cy.ts @@ -7,7 +7,7 @@ import { formatMitreAttackDescription } from '../../helpers/rules'; import type { Mitre, OverrideRule } from '../../objects/rule'; -import { getIndexPatterns, getNewOverrideRule, getSeveritiesOverride } from '../../objects/rule'; +import { getNewOverrideRule, getSeveritiesOverride } from '../../objects/rule'; import type { CompleteTimeline } from '../../objects/timeline'; import { NUMBER_OF_ALERTS, ALERT_GRID_CELL } from '../../screens/alerts'; @@ -146,7 +146,7 @@ describe('Detection rules, override', () => { cy.get(INVESTIGATION_NOTES_TOGGLE).click({ force: true }); cy.get(ABOUT_INVESTIGATION_NOTES).should('have.text', INVESTIGATION_NOTES_MARKDOWN); cy.get(DEFINITION_DETAILS).within(() => { - getDetails(INDEX_PATTERNS_DETAILS).should('have.text', getIndexPatterns().join('')); + getDetails(INDEX_PATTERNS_DETAILS).should('have.text', 'auditbeat-*'); getDetails(CUSTOM_QUERY_DETAILS).should('have.text', this.rule.customQuery); getDetails(RULE_TYPE_DETAILS).should('have.text', 'Query'); getDetails(TIMELINE_TEMPLATE_DETAILS).should('have.text', 'None'); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/threshold_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/threshold_rule.cy.ts index 59efa1cced40c..2b6032caf7c41 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/threshold_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/threshold_rule.cy.ts @@ -7,7 +7,7 @@ import { formatMitreAttackDescription } from '../../helpers/rules'; import type { Mitre } from '../../objects/rule'; -import { getIndexPatterns, getNewThresholdRule } from '../../objects/rule'; +import { getNewThresholdRule } from '../../objects/rule'; import { ALERT_GRID_CELL, NUMBER_OF_ALERTS } from '../../screens/alerts'; @@ -124,7 +124,7 @@ describe('Detection rules, threshold', () => { cy.get(INVESTIGATION_NOTES_TOGGLE).click({ force: true }); cy.get(ABOUT_INVESTIGATION_NOTES).should('have.text', INVESTIGATION_NOTES_MARKDOWN); cy.get(DEFINITION_DETAILS).within(() => { - getDetails(INDEX_PATTERNS_DETAILS).should('have.text', getIndexPatterns().join('')); + getDetails(INDEX_PATTERNS_DETAILS).should('have.text', 'auditbeat-*'); getDetails(CUSTOM_QUERY_DETAILS).should('have.text', rule.customQuery); getDetails(RULE_TYPE_DETAILS).should('have.text', 'Threshold'); getDetails(TIMELINE_TEMPLATE_DETAILS).should('have.text', 'None'); diff --git a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts index 1d59f2ce83ce1..add4bdb9087e5 100644 --- a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts @@ -228,3 +228,8 @@ export const savedQueryByName = (savedQueryName: string) => export const APPLY_SELECTED_SAVED_QUERY_BUTTON = '[data-test-subj="saved-query-management-apply-changes-button"]'; + +export const RULE_INDICES = + '[data-test-subj="detectionEngineStepDefineRuleIndices"] [data-test-subj="comboBoxInput"]'; + +export const ALERTS_INDEX_BUTTON = 'span[title=".alerts-security.alerts-default"] button'; diff --git a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts index fe3809f1d3cc7..3660f7c3d836d 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts @@ -105,6 +105,8 @@ import { ACTIONS_THROTTLE_INPUT, CONTINUE_BUTTON, CREATE_WITHOUT_ENABLING_BTN, + RULE_INDICES, + ALERTS_INDEX_BUTTON, } from '../screens/create_new_rule'; import { INDEX_SELECTOR, @@ -239,6 +241,7 @@ export const importSavedQuery = (timelineId: string) => { cy.get(IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK).click(); cy.get(TIMELINE(timelineId)).click(); cy.get(CUSTOM_QUERY_INPUT).should('not.be.empty'); + removeAlertsIndex(); }; export const fillRuleName = (ruleName: string = ruleFields.ruleName) => { @@ -344,6 +347,9 @@ const fillCustomQuery = (rule: CustomRule | OverrideRule) => { cy.get(IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK).click(); cy.get(TIMELINE(rule.timeline.id)).click(); cy.get(CUSTOM_QUERY_INPUT).should('have.value', rule.customQuery); + if (rule.dataSource.type === 'indexPatterns') { + removeAlertsIndex(); + } } else { cy.get(CUSTOM_QUERY_INPUT) .first() @@ -351,6 +357,17 @@ const fillCustomQuery = (rule: CustomRule | OverrideRule) => { } }; +// called after import rule from saved timeline +// if alerts index is created, it is included in the timeline +// to be consistent in multiple test runs, remove it if it's there +export const removeAlertsIndex = () => { + cy.get(RULE_INDICES).then(($body) => { + if ($body.find(ALERTS_INDEX_BUTTON).length > 0) { + cy.get(ALERTS_INDEX_BUTTON).click(); + } + }); +}; + export const continueWithNextSection = () => { cy.get(CONTINUE_BUTTON).should('exist').click(); }; @@ -690,20 +707,3 @@ export const checkLoadQueryDynamically = () => { export const uncheckLoadQueryDynamically = () => { cy.get(LOAD_QUERY_DYNAMICALLY_CHECKBOX).click({ force: true }).should('not.be.checked'); }; - -export const defineSection = { importSavedQuery }; -export const aboutSection = { - fillRuleName, - fillDescription, - fillSeverity, - fillRiskScore, - fillRuleTags, - expandAdvancedSettings, - fillReferenceUrls, - fillFalsePositiveExamples, - fillThreat, - fillThreatTechnique, - fillThreatSubtechnique, - fillNote, -}; -export const scheduleSection = { fillFrom }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/translations.ts index 124c3c3805217..eb435f4ed54a7 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/translations.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/translations.ts @@ -28,14 +28,6 @@ export const RULE_PREVIEW_TITLE = i18n.translate( } ); -export const RULE_PREVIEW_DESCRIPTION = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.rulePreviewDescription', - { - defaultMessage: - 'Rule preview reflects the current configuration of your rule settings and exceptions, click refresh icon to see the updated preview.', - } -); - export const CANCEL_BUTTON_LABEL = i18n.translate( 'xpack.securitySolution.detectionEngine.createRule.cancelButtonLabel', { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/query_bar/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/query_bar/index.test.tsx index 793e138cebfa4..88073254bfbbe 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/query_bar/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/query_bar/index.test.tsx @@ -6,7 +6,6 @@ */ import React from 'react'; -import { mount } from 'enzyme'; import { QueryBarDefineRule } from '.'; import { @@ -16,7 +15,11 @@ import { } from '../../../../common/mock'; import { useGetAllTimeline, getAllTimeline } from '../../../../timelines/containers/all'; import { mockHistory, Router } from '../../../../common/mock/router'; +import { render, act, fireEvent } from '@testing-library/react'; +import { resolveTimeline } from '../../../../timelines/containers/api'; +import { mockTimeline } from '../../../../../server/lib/timeline/__mocks__/create_timelines'; +jest.mock('../../../../timelines/containers/api'); jest.mock('../../../../common/lib/kibana', () => { const actual = jest.requireActual('../../../../common/lib/kibana'); return { @@ -48,6 +51,7 @@ jest.mock('../../../../timelines/containers/all', () => { describe('QueryBarDefineRule', () => { beforeEach(() => { + jest.clearAllMocks(); (useGetAllTimeline as unknown as jest.Mock).mockReturnValue({ fetchAllTimeline: jest.fn(), timelines: getAllTimeline('', mockOpenTimelineQueryResults.timeline ?? []), @@ -55,61 +59,87 @@ describe('QueryBarDefineRule', () => { totalCount: mockOpenTimelineQueryResults.totalCount, refetch: jest.fn(), }); + (resolveTimeline as jest.Mock).mockResolvedValue({ + data: { + timeline: { mockTimeline }, + }, + }); }); it('renders correctly', () => { - const Component = () => { - const field = useFormFieldMock(); + const field = useFormFieldMock(); - return ( - - ); - }; - const wrapper = mount( + const { getByTestId } = render( - + ); - expect(wrapper.find('[data-test-subj="query-bar-define-rule"]').exists()).toBeTruthy(); + expect(getByTestId('query-bar-define-rule')).toBeInTheDocument(); }); - it('renders import query from saved timeline modal actions hidden correctly', () => { - const Component = () => { + it('renders import query from saved timeline modal actions hidden correctly', async () => { + await act(async () => { const field = useFormFieldMock(); - return ( - + const { queryByTestId } = render( + + + + + ); - }; - const wrapper = mount( + + expect(queryByTestId('open-duplicate')).not.toBeInTheDocument(); + expect(queryByTestId('create-from-template')).not.toBeInTheDocument(); + }); + }); + + it('calls onOpenTimeline correctly', async () => { + const field = useFormFieldMock(); + const onOpenTimeline = jest.fn(); + + const { getByTestId } = render( - + ); + getByTestId('open-timeline-modal').click(); - expect(wrapper.find('[data-test-subj="open-duplicate"]').exists()).toBeFalsy(); - expect(wrapper.find('[data-test-subj="create-from-template"]').exists()).toBeFalsy(); + await act(async () => { + fireEvent.click(getByTestId('title-10849df0-7b44-11e9-a608-ab3d811609')); + }); + expect(onOpenTimeline).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/query_bar/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/query_bar/index.tsx index ec198514f7e82..c68194187e4b7 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/query_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/query_bar/index.tsx @@ -17,9 +17,6 @@ import type { BrowserFields } from '../../../../common/containers/source'; import { OpenTimelineModal } from '../../../../timelines/components/open_timeline/open_timeline_modal'; import type { ActionTimelineToShow } from '../../../../timelines/components/open_timeline/types'; import { QueryBar } from '../../../../common/components/query_bar'; -import { buildGlobalQuery } from '../../../../timelines/components/timeline/helpers'; -import { getDataProviderFilter } from '../../../../timelines/components/timeline/query_bar'; -import { convertKueryToElasticSearchQuery } from '../../../../common/lib/kuery'; import { useKibana } from '../../../../common/lib/kibana'; import type { TimelineModel } from '../../../../timelines/store/timeline/model'; import { useSavedQueryServices } from '../../../../common/utils/saved_query_services'; @@ -54,6 +51,7 @@ export interface QueryBarDefineRuleProps { */ onSavedQueryError?: () => void; defaultSavedQuery?: SavedQuery | undefined; + onOpenTimeline?: (timeline: TimelineModel) => void; } const actionTimelineToHide: ActionTimelineToShow[] = ['duplicate', 'createFrom']; @@ -88,6 +86,7 @@ export const QueryBarDefineRule = ({ onValidityChange, isDisabled, resetToSavedQuery, + onOpenTimeline, onSavedQueryError, }: QueryBarDefineRuleProps) => { const { value: fieldValue, setValue: setFieldValue } = field as FieldHook; @@ -234,31 +233,12 @@ export const QueryBarDefineRule = ({ onCloseTimelineSearch(); }, [onCloseTimelineSearch]); - const onOpenTimeline = useCallback( + const onOpenTimelineCb = useCallback( (timeline: TimelineModel) => { setLoadingTimeline(false); - const newQuery = { - query: timeline.kqlQuery.filterQuery?.kuery?.expression ?? '', - language: timeline.kqlQuery.filterQuery?.kuery?.kind ?? 'kuery', - }; - const dataProvidersDsl = - timeline.dataProviders != null && timeline.dataProviders.length > 0 - ? convertKueryToElasticSearchQuery( - buildGlobalQuery(timeline.dataProviders, browserFields), - indexPattern - ) - : ''; - const newFilters = timeline.filters ?? []; - setFieldValue({ - filters: - dataProvidersDsl !== '' - ? [...newFilters, getDataProviderFilter(dataProvidersDsl)] - : newFilters, - query: newQuery, - saved_id: null, - }); + onOpenTimeline?.(timeline); }, - [browserFields, indexPattern, setFieldValue] + [onOpenTimeline] ); const onMutation = () => { @@ -324,7 +304,7 @@ export const QueryBarDefineRule = ({ hideActions={actionTimelineToHide} modalTitle={i18n.IMPORT_TIMELINE_MODAL} onClose={onCloseTimelineModal} - onOpen={onOpenTimeline} + onOpen={onOpenTimelineCb} /> ) : null} diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.test.tsx index 4e41ac0f996ea..524cd562dd1a7 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.test.tsx @@ -10,6 +10,7 @@ import { shallow } from 'enzyme'; import { StepDefineRule, aggregatableFields } from '.'; import { stepDefineDefaultValue } from '../../../pages/detection_engine/rules/utils'; +import { mockBrowserFields } from '../../../../common/containers/source/mock'; jest.mock('../../../../common/lib/kibana'); jest.mock('../../../../common/hooks/use_selector', () => { @@ -19,6 +20,21 @@ jest.mock('../../../../common/hooks/use_selector', () => { useDeepEqualSelector: () => ({ kibanaDataViews: [{ id: 'world' }], sourcererScope: 'my-selected-dataview-id', + selectedDataView: { + id: 'security-solution', + browserFields: mockBrowserFields, + patternList: [], + }, + }), + }; +}); +jest.mock('../../../../common/components/link_to', () => { + const originalModule = jest.requireActual('../../../../common/components/link_to'); + return { + ...originalModule, + getTimelineUrl: jest.fn(), + useFormatUrl: jest.fn().mockReturnValue({ + formatUrl: jest.fn().mockImplementation((path: string) => path), }), }; }); @@ -36,6 +52,15 @@ jest.mock('react-router-dom', () => { return { ...actual, useLocation: jest.fn().mockReturnValue({ pathname: '/alerts' }) }; }); +jest.mock('react-redux', () => { + const original = jest.requireActual('react-redux'); + + return { + ...original, + useDispatch: jest.fn(), + }; +}); + test('aggregatableFields', function () { expect( aggregatableFields([ diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx index 45db51db150f6..554eb0df47774 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx @@ -28,6 +28,7 @@ import usePrevious from 'react-use/lib/usePrevious'; import type { SavedQuery } from '@kbn/data-plugin/public'; import type { DataViewBase } from '@kbn/es-query'; import { FormattedMessage } from '@kbn/i18n-react'; +import { useRuleFromTimeline } from '../../../containers/detection_engine/rules/use_rule_from_timeline'; import { isMlRule } from '../../../../../common/machine_learning/helpers'; import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions'; import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license'; @@ -146,7 +147,7 @@ const StepDefineRuleComponent: FC = ({ schema, }); - const { getFields, getFormData, reset, validate } = form; + const { getFields, getFormData, reset, setFieldValue, validate } = form; const [formData] = useFormData({ form, watch: [ @@ -178,6 +179,17 @@ const StepDefineRuleComponent: FC = ({ } }, }); + + const handleSetRuleFromTimeline = useCallback( + ({ index: timelineIndex, queryBar: timelineQueryBar }) => { + setFieldValue('index', timelineIndex); + setFieldValue('queryBar', timelineQueryBar); + }, + [setFieldValue] + ); + const { onOpenTimeline, loading: timelineQueryLoading } = + useRuleFromTimeline(handleSetRuleFromTimeline); + const { index: formIndex, ruleType: formRuleType, @@ -187,18 +199,19 @@ const StepDefineRuleComponent: FC = ({ threatMapping: formThreatMapping, machineLearningJobId: formMachineLearningJobId, dataSourceType: formDataSourceType, - newTermsFields: formNewTermsFields, + newTermsFields, shouldLoadQueryDynamically: formShouldLoadQueryDynamically, } = formData; const [isQueryBarValid, setIsQueryBarValid] = useState(false); const [isThreatQueryBarValid, setIsThreatQueryBarValid] = useState(false); const index = formIndex || initialState.index; - const dataView = formDataViewId || initialState.dataViewId; + const dataViewId = formDataViewId || initialState.dataViewId; const threatIndex = formThreatIndex || initialState.threatIndex; const ruleType = formRuleType || initialState.ruleType; const dataSourceType = formDataSourceType || initialState.dataSourceType; const machineLearningJobId = formMachineLearningJobId ?? initialState.machineLearningJobId; + const queryBar = formQuery ?? initialState.queryBar; const [isPreviewValid, setIsPreviewValid] = useState(false); useEffect(() => { @@ -212,23 +225,24 @@ const StepDefineRuleComponent: FC = ({ isQueryBarValid, isThreatQueryBarValid, index, - dataViewId: formDataViewId, + dataViewId, dataSourceType, threatIndex, threatMapping: formThreatMapping, machineLearningJobId, - queryBar: formQuery ?? initialState.queryBar, - newTermsFields: formNewTermsFields, + queryBar, + newTermsFields, }); setIsPreviewValid(!isDisabled); }, [ dataSourceType, formDataViewId, - formNewTermsFields, + newTermsFields, formQuery, + dataViewId, formThreatMapping, index, - initialState.queryBar, + queryBar, isQueryBarValid, isThreatQueryBarValid, machineLearningJobId, @@ -263,8 +277,8 @@ const StepDefineRuleComponent: FC = ({ if (dataSourceType === DataSourceType.DataView) { const fetchDataView = async () => { - if (dataView != null) { - const dv = await data.dataViews.get(dataView); + if (dataViewId != null) { + const dv = await data.dataViews.get(dataViewId); setDataViewTitle(dv.title); setIndexPattern(dv); } @@ -272,7 +286,7 @@ const StepDefineRuleComponent: FC = ({ fetchDataView(); } - }, [dataSourceType, isIndexPatternLoading, data, dataView, initIndexPattern]); + }, [dataSourceType, isIndexPatternLoading, data, dataViewId, initIndexPattern]); // Callback for when user toggles between Data Views and Index Patterns const onChangeDataSource = useCallback( @@ -334,8 +348,8 @@ const StepDefineRuleComponent: FC = ({ * * from '*:*' back to '' if the type is switched back from "threat_match" to another one */ useEffect(() => { - const { queryBar } = getFields(); - if (queryBar == null) { + const { queryBar: currentQuery } = getFields(); + if (currentQuery == null) { return; } @@ -351,15 +365,15 @@ const StepDefineRuleComponent: FC = ({ // NOTE: It's important to do a deep object comparison by value. // Don't do it by reference because the forms lib can change it internally. - // 2. We call queryBar.reset() in both cases to not trigger validation errors + // 2. We call currentQuery.reset() in both cases to not trigger validation errors // as the user has not entered data into those areas yet. // If the user switched rule type to "threat_match" from any other one, // but hasn't changed the custom query used for normal rules (''), // we reset the custom query to the default used for "threat_match" rules ('*:*'). if (isThreatMatchRule(ruleType) && !isThreatMatchRule(previousRuleType)) { - if (isEqual(queryBar.value, defaultCustomQuery.forNormalRules)) { - queryBar.reset({ + if (isEqual(currentQuery.value, defaultCustomQuery.forNormalRules)) { + currentQuery.reset({ defaultValue: defaultCustomQuery.forThreatMatchRules, }); return; @@ -370,8 +384,8 @@ const StepDefineRuleComponent: FC = ({ // but hasn't changed the custom query used for "threat_match" rules ('*:*'), // we reset the custom query to another default value (''). if (!isThreatMatchRule(ruleType) && isThreatMatchRule(previousRuleType)) { - if (isEqual(queryBar.value, defaultCustomQuery.forThreatMatchRules)) { - queryBar.reset({ + if (isEqual(currentQuery.value, defaultCustomQuery.forThreatMatchRules)) { + currentQuery.reset({ defaultValue: defaultCustomQuery.forNormalRules, }); } @@ -451,11 +465,6 @@ const StepDefineRuleComponent: FC = ({ ), [aggFields] ); - const SourcererFlex = styled(EuiFlexItem)` - align-items: flex-end; - `; - - SourcererFlex.displayName = 'SourcererFlex'; const ThreatMatchInputChildren = useCallback( ({ threatMapping }) => ( @@ -585,6 +594,8 @@ const StepDefineRuleComponent: FC = ({ euiFieldProps: { fullWidth: true, placeholder: '', + isDisabled: timelineQueryLoading, + isLoading: timelineQueryLoading, }, }} /> @@ -594,6 +605,7 @@ const StepDefineRuleComponent: FC = ({ ); }, [ + timelineQueryLoading, dataSourceType, onChangeDataSource, dataViewIndexPatternToggleButtonOptions, @@ -626,30 +638,33 @@ const StepDefineRuleComponent: FC = ({ browserFields, idAria: 'detectionEngineStepDefineRuleQueryBar', indexPattern, - isDisabled: isLoading || formShouldLoadQueryDynamically, + isDisabled: isLoading || formShouldLoadQueryDynamically || timelineQueryLoading, resetToSavedQuery: formShouldLoadQueryDynamically, - isLoading: isIndexPatternLoading, + isLoading: isIndexPatternLoading || timelineQueryLoading, dataTestSubj: 'detectionEngineStepDefineRuleQueryBar', openTimelineSearch, onValidityChange: setIsQueryBarValid, onCloseTimelineSearch: handleCloseTimelineSearch, onSavedQueryError: handleSavedQueryError, defaultSavedQuery, + onOpenTimeline, } as QueryBarDefineRuleProps } /> ), [ - browserFields, - handleCloseTimelineSearch, handleOpenTimelineSearch, + formShouldLoadQueryDynamically, + browserFields, indexPattern, - isIndexPatternLoading, isLoading, + timelineQueryLoading, + isIndexPatternLoading, openTimelineSearch, - formShouldLoadQueryDynamically, + handleCloseTimelineSearch, handleSavedQueryError, defaultSavedQuery, + onOpenTimeline, ] ); const onOptionsChange = useCallback((field: FieldsEqlOptions, value: string | undefined) => { @@ -761,7 +776,7 @@ const StepDefineRuleComponent: FC = ({ = ({ 'data-test-subj': 'detectionEngineStepDefineRuleShouldLoadQueryDynamically', euiFieldProps: { disabled: isLoading, - label: formQuery?.title - ? i18n.getSavedQueryCheckboxLabel(formQuery.title) + label: queryBar?.title + ? i18n.getSavedQueryCheckboxLabel(queryBar.title) : undefined, }, }} diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts new file mode 100644 index 0000000000000..1ed56a518662a --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts @@ -0,0 +1,323 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { act, renderHook } from '@testing-library/react-hooks'; + +import { useRuleFromTimeline } from './use_rule_from_timeline'; +import { useGetInitialUrlParamValue } from '../../../../common/utils/global_query_string/helpers'; +import { resolveTimeline } from '../../../../timelines/containers/api'; +import { useSourcererDataView } from '../../../../common/containers/sourcerer'; +import { mockSourcererScope } from '../../../../common/containers/sourcerer/mocks'; +import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; +import { useAppToastsMock } from '../../../../common/hooks/use_app_toasts.mock'; +import { mockTimeline } from '../../../../../server/lib/timeline/__mocks__/create_timelines'; +import type { TimelineModel } from '../../../..'; + +jest.mock('../../../../common/utils/global_query_string/helpers'); +jest.mock('../../../../timelines/containers/api'); +jest.mock('../../../../common/hooks/use_app_toasts'); +jest.mock('../../../../common/containers/sourcerer'); +jest.mock('../../../../common/components/link_to', () => { + const originalModule = jest.requireActual('../../../../common/components/link_to'); + return { + ...originalModule, + getTimelineUrl: jest.fn(), + useFormatUrl: jest.fn().mockReturnValue({ + formatUrl: jest.fn().mockImplementation((path: string) => path), + }), + }; +}); + +const mockDispatch = jest.fn(); +jest.mock('react-redux', () => { + const original = jest.requireActual('react-redux'); + return { + ...original, + useDispatch: () => mockDispatch, + }; +}); + +const timelineId = 'eb2781c0-1df5-11eb-8589-2f13958b79f7'; + +const selectedTimeline = { + data: { + timeline: { + ...mockTimeline, + id: timelineId, + savedObjectId: timelineId, + indexNames: ['awesome-*'], + dataViewId: 'custom-data-view-id', + kqlQuery: { + filterQuery: { + serializedQuery: + '{"bool":{"filter":[{"bool":{"should":[{"exists":{"field":"host.name"}}],"minimum_should_match":1}},{"bool":{"should":[{"exists":{"field":"user.name"}}],"minimum_should_match":1}}]}}', + kuery: { + expression: 'host.name:* AND user.name:*', + kind: 'kuery', + }, + }, + }, + dataProviders: [ + { + excluded: false, + and: [], + kqlQuery: '', + name: 'Stephs-MBP.lan', + queryMatch: { + field: 'host.name', + value: 'Stephs-MBP.lan', + operator: ':', + }, + id: 'draggable-badge-default-draggable-process_stopped-timeline-1-NH9UwoMB2HTqQ3G4wUFM-host_name-Stephs-MBP_lan', + enabled: true, + }, + { + excluded: false, + and: [], + kqlQuery: '', + name: '--lang=en-US', + queryMatch: { + field: 'process.args', + value: '--lang=en-US', + operator: ':', + }, + id: 'draggable-badge-default-draggable-process_started-timeline-1-args-5---lang=en-US-MH9TwoMB2HTqQ3G4_UH--process_args---lang=en-US', + enabled: true, + }, + ], + }, + }, +}; + +describe('useRuleFromTimeline', () => { + let appToastsMock: jest.Mocked>; + const setRuleQuery = jest.fn(); + beforeEach(() => { + jest.clearAllMocks(); + appToastsMock = useAppToastsMock.create(); + (useAppToasts as jest.Mock).mockReturnValue(appToastsMock); + (useGetInitialUrlParamValue as jest.Mock).mockReturnValue(() => ({ + decodedParam: timelineId, + })); + (resolveTimeline as jest.Mock).mockResolvedValue(selectedTimeline); + }); + + describe('initial data view === rule from timeline data view', () => { + beforeEach(() => { + (useSourcererDataView as jest.Mock).mockReturnValue({ + ...mockSourcererScope, + dataViewId: 'custom-data-view-id', + selectedPatterns: ['awesome-*'], + }); + }); + + it('does not reset timeline sourcerer if it originally had same data view as the timeline used in the rule', async () => { + const { result, waitForNextUpdate } = renderHook(() => useRuleFromTimeline(setRuleQuery)); + expect(result.current.loading).toEqual(true); + await waitForNextUpdate(); + expect(setRuleQuery).toHaveBeenCalled(); + expect(mockDispatch).toHaveBeenCalledTimes(2); + }); + }); + + describe('initial data view !== rule from timeline data view', () => { + beforeEach(() => { + (useSourcererDataView as jest.Mock) + .mockReturnValueOnce({ + ...mockSourcererScope, + dataViewId: 'security-solution', + selectedPatterns: ['auditbeat-*'], + }) + .mockReturnValue({ + ...mockSourcererScope, + dataViewId: 'custom-data-view-id', + selectedPatterns: ['awesome-*'], + }); + }); + it('if no timeline id in URL, loading: false and query not set', async () => { + (useGetInitialUrlParamValue as jest.Mock).mockReturnValue(() => ({ + decodedParam: undefined, + })); + const { result } = renderHook(() => useRuleFromTimeline(setRuleQuery)); + + expect(result.current.loading).toEqual(false); + expect(setRuleQuery).not.toHaveBeenCalled(); + }); + + it('if timeline id in URL, set active timeline data view to from timeline data view', async () => { + const { result, waitForNextUpdate } = renderHook(() => useRuleFromTimeline(setRuleQuery)); + expect(result.current.loading).toEqual(true); + await waitForNextUpdate(); + expect(setRuleQuery).toHaveBeenCalled(); + + expect(mockDispatch).toHaveBeenCalledTimes(4); + expect(mockDispatch).toHaveBeenNthCalledWith(1, { + type: 'x-pack/security_solution/local/timeline/UPDATE_LOADING', + payload: { + id: 'timeline-1', + isLoading: true, + }, + }); + + expect(mockDispatch).toHaveBeenNthCalledWith(2, { + type: 'x-pack/security_solution/local/sourcerer/SET_SELECTED_DATA_VIEW', + payload: { + id: 'timeline', + selectedDataViewId: selectedTimeline.data.timeline.dataViewId, + selectedPatterns: selectedTimeline.data.timeline.indexNames, + }, + }); + expect(mockDispatch).toHaveBeenNthCalledWith(3, { + type: 'x-pack/security_solution/local/timeline/UPDATE_LOADING', + payload: { + id: 'timeline-1', + isLoading: false, + }, + }); + }); + + it('when from timeline data view id === selected data view id and browser fields is not empty, set rule data to match from timeline query', async () => { + const { result, waitForNextUpdate } = renderHook(() => useRuleFromTimeline(setRuleQuery)); + expect(result.current.loading).toEqual(true); + await waitForNextUpdate(); + expect(result.current.loading).toEqual(false); + expect(setRuleQuery).toHaveBeenCalledWith({ + index: ['awesome-*'], + queryBar: { + filters: [ + { + bool: { + should: [ + { + bool: { + should: [{ match_phrase: { 'host.name': 'Stephs-MBP.lan' } }], + minimum_should_match: 1, + }, + }, + { + bool: { + should: [{ match_phrase: { 'process.args': '--lang=en-US' } }], + minimum_should_match: 1, + }, + }, + ], + minimum_should_match: 1, + }, + meta: { + alias: 'timeline-filter-drop-area', + controlledBy: 'timeline-filter-drop-area', + negate: false, + disabled: false, + type: 'custom', + key: 'bool', + value: + '{"bool":{"should":[{"bool":{"should":[{"match_phrase":{"host.name":"Stephs-MBP.lan"}}],"minimum_should_match":1}},{"bool":{"should":[{"match_phrase":{"process.args":"--lang=en-US"}}],"minimum_should_match":1}}],"minimum_should_match":1}}', + }, + $state: { store: 'appState' }, + }, + ], + query: { query: 'host.name:* AND user.name:*', language: 'kuery' }, + saved_id: null, + }, + }); + }); + + it('Sets rule from timeline query via callback', async () => { + (useGetInitialUrlParamValue as jest.Mock).mockReturnValue(() => ({ + decodedParam: undefined, + })); + const { result } = renderHook(() => useRuleFromTimeline(setRuleQuery)); + expect(result.current.loading).toEqual(false); + await act(async () => { + result.current.onOpenTimeline(selectedTimeline.data.timeline as unknown as TimelineModel); + }); + + // not loading anything as an external call to onOpenTimeline provides the timeline + expect(result.current.loading).toEqual(false); + expect(setRuleQuery).toHaveBeenCalledWith({ + index: ['awesome-*'], + queryBar: { + filters: [ + { + bool: { + should: [ + { + bool: { + should: [{ match_phrase: { 'host.name': 'Stephs-MBP.lan' } }], + minimum_should_match: 1, + }, + }, + { + bool: { + should: [{ match_phrase: { 'process.args': '--lang=en-US' } }], + minimum_should_match: 1, + }, + }, + ], + minimum_should_match: 1, + }, + meta: { + alias: 'timeline-filter-drop-area', + controlledBy: 'timeline-filter-drop-area', + negate: false, + disabled: false, + type: 'custom', + key: 'bool', + value: + '{"bool":{"should":[{"bool":{"should":[{"match_phrase":{"host.name":"Stephs-MBP.lan"}}],"minimum_should_match":1}},{"bool":{"should":[{"match_phrase":{"process.args":"--lang=en-US"}}],"minimum_should_match":1}}],"minimum_should_match":1}}', + }, + $state: { store: 'appState' }, + }, + ], + query: { query: 'host.name:* AND user.name:*', language: 'kuery' }, + saved_id: null, + }, + }); + }); + + it('Handles error when query is malformed', async () => { + (useGetInitialUrlParamValue as jest.Mock).mockReturnValue(() => ({ + decodedParam: undefined, + })); + const { result } = renderHook(() => useRuleFromTimeline(setRuleQuery)); + expect(result.current.loading).toEqual(false); + const tl = { + ...selectedTimeline.data.timeline, + dataProviders: [ + { + property: 'bad', + }, + ], + }; + await act(async () => { + result.current.onOpenTimeline(tl as unknown as TimelineModel); + }); + + // not loading anything as an external call to onOpenTimeline provides the timeline + expect(result.current.loading).toEqual(false); + expect(setRuleQuery).not.toHaveBeenCalled(); + expect(appToastsMock.addError).toHaveBeenCalled(); + expect(appToastsMock.addError.mock.calls[0][0]).toEqual( + TypeError('dataProvider.and is not iterable') + ); + }); + + it('resets timeline sourcerer if it originally had different data view from the timeline used in the rule', async () => { + const { waitForNextUpdate } = renderHook(() => useRuleFromTimeline(setRuleQuery)); + await waitForNextUpdate(); + expect(setRuleQuery).toHaveBeenCalled(); + expect(mockDispatch).toHaveBeenNthCalledWith(4, { + type: 'x-pack/security_solution/local/sourcerer/SET_SELECTED_DATA_VIEW', + payload: { + id: 'timeline', + selectedDataViewId: 'security-solution', + selectedPatterns: ['auditbeat-*'], + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.tsx new file mode 100644 index 0000000000000..e77fe4e92b7a3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.tsx @@ -0,0 +1,220 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isEmpty } from 'lodash/fp'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useDispatch } from 'react-redux'; +import { i18n } from '@kbn/i18n'; +import { convertKueryToElasticSearchQuery } from '../../../../common/lib/kuery'; +import { updateIsLoading } from '../../../../timelines/store/timeline/actions'; +import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; +import { useSourcererDataView } from '../../../../common/containers/sourcerer'; +import type { TimelineModel } from '../../../..'; +import type { FieldValueQueryBar } from '../../../components/rules/query_bar'; +import { sourcererActions } from '../../../../common/store/sourcerer'; +import { + dispatchUpdateTimeline, + queryTimelineById, +} from '../../../../timelines/components/open_timeline/helpers'; +import { useGetInitialUrlParamValue } from '../../../../common/utils/global_query_string/helpers'; +import { buildGlobalQuery } from '../../../../timelines/components/timeline/helpers'; +import { getDataProviderFilter } from '../../../../timelines/components/timeline/query_bar'; +import { SourcererScopeName } from '../../../../common/store/sourcerer/model'; + +export const RULE_FROM_TIMELINE_URL_PARAM = 'createRuleFromTimeline'; + +export interface RuleFromTimeline { + loading: boolean; + onOpenTimeline: (timeline: TimelineModel) => void; +} + +export const initialState = { + index: [], + queryBar: { + query: { query: '', language: 'kuery' }, + filters: [], + saved_id: null, + }, +}; + +type SetRuleQuery = ({ + index, + queryBar, +}: { + index: string[]; + queryBar: FieldValueQueryBar; +}) => void; + +/** + * When returned property updated === true, + * the index and queryBar properties have been updated from timeline data + * queried either from id in the url param or by passing a timeline to returned callback onOpenTimeline + */ +export const useRuleFromTimeline = (setRuleQuery: SetRuleQuery): RuleFromTimeline => { + const dispatch = useDispatch(); + const { addError } = useAppToasts(); + const { browserFields, dataViewId, selectedPatterns } = useSourcererDataView( + SourcererScopeName.timeline + ); + + // selectedTimeline = timeline to set rule from + const [selectedTimeline, setRuleFromTimeline] = useState(null); + + const [loading, setLoading] = useState(false); + + const onOpenTimeline = useCallback( + (timeline: TimelineModel) => { + // will already be true if timeline set from url + setLoading(true); + setRuleFromTimeline(timeline); + + if (timeline.dataViewId !== dataViewId && !isEmpty(timeline.indexNames)) { + // let sourcerer manage the selected browser fields by setting timeline scope to the selected timeline data view + // sourcerer handles the logic of if the fields have been fetched or need to be fetched + dispatch( + sourcererActions.setSelectedDataView({ + id: SourcererScopeName.timeline, + selectedDataViewId: timeline.dataViewId, + selectedPatterns: timeline.indexNames, + }) + ); + } + }, + [dataViewId, dispatch] + ); + + // start browser field management + const [originalDataView] = useState({ dataViewId, selectedPatterns }); + + const selectedDataViewBrowserFields = useMemo( + () => + selectedTimeline == null || + isEmpty(browserFields) || + (selectedTimeline.dataViewId !== null && + dataViewId !== null && + dataViewId !== selectedTimeline.dataViewId) + ? null + : browserFields, + [browserFields, dataViewId, selectedTimeline] + ); + // end browser field management + + // start set rule + const handleSetRuleFromTimeline = useCallback(() => { + if (selectedTimeline == null || selectedDataViewBrowserFields == null) return; + + const newQuery = { + query: selectedTimeline.kqlQuery.filterQuery?.kuery?.expression ?? '', + language: selectedTimeline.kqlQuery.filterQuery?.kuery?.kind ?? 'kuery', + }; + const newFilters = selectedTimeline.filters ?? []; + try { + const dataProvidersDsl = + selectedTimeline.dataProviders != null && selectedTimeline.dataProviders.length > 0 + ? convertKueryToElasticSearchQuery( + buildGlobalQuery(selectedTimeline.dataProviders, selectedDataViewBrowserFields), + { fields: [], title: selectedPatterns.join(',') } + ) + : ''; + + setLoading(false); + + setRuleQuery({ + index: selectedPatterns, + queryBar: { + filters: + dataProvidersDsl !== '' + ? [...newFilters, getDataProviderFilter(dataProvidersDsl)] + : newFilters, + query: newQuery, + saved_id: null, + }, + }); + } catch (error) { + setLoading(false); + addError(error, { + toastMessage: i18n.translate('xpack.securitySolution.ruleFromTimeline.error.toastMessage', { + defaultMessage: 'Failed to create rule from timeline with id: {id}', + values: { + id: selectedTimeline.id, + }, + }), + title: i18n.translate('xpack.securitySolution.ruleFromTimeline.error.title', { + defaultMessage: 'Failed to import rule from timeline', + }), + }); + } + + // reset timeline data view once complete + if (originalDataView.dataViewId !== dataViewId) { + dispatch( + sourcererActions.setSelectedDataView({ + id: SourcererScopeName.timeline, + selectedDataViewId: originalDataView.dataViewId, + selectedPatterns: originalDataView.selectedPatterns, + }) + ); + } + }, [ + addError, + dataViewId, + dispatch, + originalDataView.dataViewId, + originalDataView.selectedPatterns, + selectedDataViewBrowserFields, + selectedPatterns, + selectedTimeline, + setRuleQuery, + ]); + + useEffect(() => { + // ensure browser fields are correct before updating the rule + if (selectedDataViewBrowserFields != null) { + handleSetRuleFromTimeline(); + } + }, [handleSetRuleFromTimeline, selectedDataViewBrowserFields]); + // end set rule + + // start handle set rule from timeline id + const getInitialUrlParamValue = useGetInitialUrlParamValue(RULE_FROM_TIMELINE_URL_PARAM); + const { decodedParam: timelineIdFromUrl } = useMemo(getInitialUrlParamValue, [ + getInitialUrlParamValue, + ]); + + const getTimelineById = useCallback( + (timelineId: string) => { + if (selectedTimeline == null || timelineId !== selectedTimeline.id) { + queryTimelineById({ + timelineId, + onOpenTimeline, + updateIsLoading: ({ + id: currentTimelineId, + isLoading, + }: { + id: string; + isLoading: boolean; + }) => dispatch(updateIsLoading({ id: currentTimelineId, isLoading })), + updateTimeline: dispatchUpdateTimeline(dispatch), + }); + } + }, + [dispatch, onOpenTimeline, selectedTimeline] + ); + + const [urlStateInitialized, setUrlStateInitialized] = useState(false); + + useEffect(() => { + if (timelineIdFromUrl != null && !urlStateInitialized) { + setUrlStateInitialized(true); + getTimelineById(timelineIdFromUrl); + setLoading(true); + } + }, [getTimelineById, timelineIdFromUrl, urlStateInitialized]); + // end handle set rule from timeline id + + return { loading, onOpenTimeline }; +}; diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx index 273c6f30947eb..32ab4d7d50adf 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx @@ -55,9 +55,17 @@ jest.mock('../../containers/all', () => { useGetAllTimeline: jest.fn(), }; }); - -jest.mock('../../../common/lib/kibana'); -jest.mock('../../../common/components/link_to'); +const mockNavigateTo = jest.fn(); +jest.mock('../../../common/lib/kibana', () => { + const actual = jest.requireActual('../../../common/lib/kibana'); + return { + ...actual, + useNavigation: () => ({ + getAppUrl: jest.fn(), + navigateTo: mockNavigateTo, + }), + }; +}); jest.mock('../../../common/components/link_to', () => { const originalModule = jest.requireActual('../../../common/components/link_to'); @@ -656,4 +664,20 @@ describe('StatefulOpenTimeline', () => { expect((queryTimelineById as jest.Mock).mock.calls[0][0].duplicate).toEqual(true); }); }); + + test('navigates to create rule page with timeline id in URL when Create rule from timeline click', async () => { + const wrapper = mount( + + + + ); + + wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); + wrapper.find('[data-test-subj="create-rule-from-timeline"]').first().simulate('click'); + }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx index 628d2bf14d5e5..970a6482065af 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx @@ -8,6 +8,10 @@ import React, { useEffect, useState, useCallback, useMemo } from 'react'; import { useDispatch } from 'react-redux'; +import { RULE_FROM_TIMELINE_URL_PARAM } from '../../../detections/containers/detection_engine/rules/use_rule_from_timeline'; +import { encodeRisonUrlState } from '../../../common/utils/global_query_string/helpers'; +import { useNavigation } from '../../../common/lib/kibana'; +import { SecurityPageName } from '../../../../common/constants'; import { useShallowEqualSelector } from '../../../common/hooks/use_selector'; import type { SortFieldTimeline } from '../../../../common/types/timeline'; import { TimelineId } from '../../../../common/types/timeline'; @@ -40,6 +44,7 @@ import type { OpenTimelineResult, OnToggleShowNotes, OnDeleteOneTimeline, + OnCreateRuleFromTimeline, } from './types'; import { DEFAULT_SORT_FIELD, DEFAULT_SORT_DIRECTION } from './constants'; import { useTimelineTypes } from './use_timeline_types'; @@ -273,6 +278,15 @@ export const StatefulOpenTimelineComponent = React.memo( }, [] ); + const { navigateTo } = useNavigation(); + const onCreateRule: OnCreateRuleFromTimeline = useCallback( + (savedObjectId) => + navigateTo({ + deepLinkId: SecurityPageName.rulesCreate, + path: `?${RULE_FROM_TIMELINE_URL_PARAM}=${encodeRisonUrlState(savedObjectId)}`, + }), + [navigateTo] + ); /** Resets the selection state such that all timelines are unselected */ const resetSelectionState = useCallback(() => { @@ -324,6 +338,7 @@ export const StatefulOpenTimelineComponent = React.memo( itemIdToExpandedNotesRowMap={itemIdToExpandedNotesRowMap} importDataModalToggle={importDataModalToggle} onAddTimelinesToFavorites={undefined} + onCreateRule={onCreateRule} onDeleteSelected={onDeleteSelected} onlyFavorites={onlyFavorites} onOpenTimeline={openTimeline} diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx index 05aa0c105d5a3..fe673db139042 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx @@ -411,6 +411,22 @@ describe('OpenTimeline', () => { ).toEqual(['createFrom', 'duplicate', 'export', 'selectable', 'delete']); }); + test('it should include createRule in timeline actions if onCreateRule is passed', () => { + const defaultProps = { + ...getDefaultTestProps(mockResults), + timelineStatus: TimelineStatus.active, + }; + const wrapper = mountWithIntl( + + + + ); + + expect( + wrapper.find('[data-test-subj="timelines-table"]').first().prop('actionTimelineToShow') + ).toEqual(['createFrom', 'duplicate', 'createRule', 'export', 'selectable', 'delete']); + }); + test("it should render selected count if timelineStatus is active (selecting custom templates' tab)", () => { const defaultProps = { ...getDefaultTestProps(mockResults), diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx index 8fee5fcc0da3b..9d3ecf0492806 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx @@ -44,6 +44,7 @@ export const OpenTimeline = React.memo( isLoading, itemIdToExpandedNotesRowMap, importDataModalToggle, + onCreateRule, onDeleteSelected, onlyFavorites, onOpenTimeline, @@ -148,7 +149,12 @@ export const OpenTimeline = React.memo( }, [setImportDataModalToggle, refetch]); const actionTimelineToShow = useMemo(() => { - const timelineActions: ActionTimelineToShow[] = ['createFrom', 'duplicate']; + const createRule: ActionTimelineToShow[] = ['createRule']; + const timelineActions: ActionTimelineToShow[] = [ + 'createFrom', + 'duplicate', + ...(onCreateRule != null ? createRule : []), + ]; if (timelineStatus !== TimelineStatus.immutable) { timelineActions.push('export'); @@ -164,7 +170,7 @@ export const OpenTimeline = React.memo( } return timelineActions; - }, [onDeleteSelected, deleteTimelines, timelineStatus]); + }, [onCreateRule, timelineStatus, onDeleteSelected, deleteTimelines]); const SearchRowContent = useMemo(() => <>{templateTimelineFilter}, [templateTimelineFilter]); @@ -257,6 +263,7 @@ export const OpenTimeline = React.memo( loading={isLoading} itemIdToExpandedNotesRowMap={itemIdToExpandedNotesRowMap} enableExportTimelineDownloader={enableExportTimelineDownloader} + onCreateRule={onCreateRule} onOpenDeleteTimelineModal={onOpenDeleteTimelineModal} onOpenTimeline={onOpenTimeline} onSelectionChange={onSelectionChange} diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx index 91785b05c5bf5..00cec44b290be 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx @@ -15,7 +15,16 @@ import { useGetAllTimeline, getAllTimeline } from '../../../containers/all'; import { useTimelineStatus } from '../use_timeline_status'; import { OpenTimelineModal } from '.'; -jest.mock('../../../../common/lib/kibana'); +jest.mock('../../../../common/lib/kibana', () => { + const actual = jest.requireActual('../../../../common/lib/kibana'); + return { + ...actual, + useNavigation: jest.fn().mockReturnValue({ + getAppUrl: jest.fn(), + navigateTo: jest.fn(), + }), + }; +}); jest.mock('../../../containers/all', () => { const originalModule = jest.requireActual('../../../containers/all'); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx index 2cbccd3cb2355..29d3c560cc74c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx @@ -9,6 +9,7 @@ import type { ActionTimelineToShow, DeleteTimelines, EnableExportTimelineDownloader, + OnCreateRuleFromTimeline, OnOpenTimeline, OpenTimelineResult, OnOpenDeleteTimelineModal, @@ -16,7 +17,6 @@ import type { } from '../types'; import * as i18n from '../translations'; import { TimelineStatus, TimelineType } from '../../../../../common/types/timeline'; - /** * Returns the action columns (e.g. delete, open duplicate timeline) */ @@ -26,12 +26,14 @@ export const getActionsColumns = ({ enableExportTimelineDownloader, onOpenDeleteTimelineModal, onOpenTimeline, + onCreateRule, }: { actionTimelineToShow: ActionTimelineToShow[]; deleteTimelines?: DeleteTimelines; enableExportTimelineDownloader?: EnableExportTimelineDownloader; onOpenDeleteTimelineModal?: OnOpenDeleteTimelineModal; onOpenTimeline: OnOpenTimeline; + onCreateRule?: OnCreateRuleFromTimeline; }): [TimelineActionsOverflowColumns] => { const createTimelineFromTemplate = { name: i18n.CREATE_TIMELINE_FROM_TEMPLATE, @@ -132,6 +134,22 @@ export const getActionsColumns = ({ available: () => actionTimelineToShow.includes('delete') && deleteTimelines != null, }; + const createRuleFromTimeline = { + name: i18n.CREATE_RULE_FROM_TIMELINE, + icon: 'indexEdit', + onClick: (selectedTimeline: OpenTimelineResult) => { + if (onCreateRule != null && selectedTimeline.savedObjectId) + onCreateRule(selectedTimeline.savedObjectId); + }, + enabled: (timeline: OpenTimelineResult) => + onCreateRule != null && + timeline.savedObjectId != null && + timeline.status !== TimelineStatus.immutable, + description: i18n.CREATE_RULE_FROM_TIMELINE, + 'data-test-subj': 'create-rule-from-timeline', + available: () => actionTimelineToShow.includes('createRule') && onCreateRule != null, + }; + return [ { width: '80px', @@ -142,6 +160,7 @@ export const getActionsColumns = ({ openAsDuplicateTemplateColumn, exportTimelineAction, deleteTimelineColumn, + createRuleFromTimeline, ], }, ]; diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/index.tsx index 32a63bdf6c5b6..9dfc3d1670b0d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/index.tsx @@ -13,6 +13,7 @@ import * as i18n from '../translations'; import type { ActionTimelineToShow, DeleteTimelines, + OnCreateRuleFromTimeline, OnOpenTimeline, OnSelectionChange, OnTableChange, @@ -54,6 +55,7 @@ export const getTimelinesTableColumns = ({ deleteTimelines, enableExportTimelineDownloader, itemIdToExpandedNotesRowMap, + onCreateRule, onOpenDeleteTimelineModal, onOpenTimeline, onToggleShowNotes, @@ -64,6 +66,7 @@ export const getTimelinesTableColumns = ({ deleteTimelines?: DeleteTimelines; enableExportTimelineDownloader?: EnableExportTimelineDownloader; itemIdToExpandedNotesRowMap: Record; + onCreateRule?: OnCreateRuleFromTimeline; onOpenDeleteTimelineModal?: OnOpenDeleteTimelineModal; onOpenTimeline: OnOpenTimeline; onSelectionChange: OnSelectionChange; @@ -82,6 +85,7 @@ export const getTimelinesTableColumns = ({ ...getIconHeaderColumns({ timelineType }), ...(actionTimelineToShow.length ? getActionsColumns({ + onCreateRule, actionTimelineToShow, deleteTimelines, enableExportTimelineDownloader, @@ -99,6 +103,7 @@ export interface TimelinesTableProps { loading: boolean; itemIdToExpandedNotesRowMap: Record; enableExportTimelineDownloader?: EnableExportTimelineDownloader; + onCreateRule?: OnCreateRuleFromTimeline; onOpenDeleteTimelineModal?: OnOpenDeleteTimelineModal; onOpenTimeline: OnOpenTimeline; onSelectionChange: OnSelectionChange; @@ -128,6 +133,7 @@ export const TimelinesTable = React.memo( loading: isLoading, itemIdToExpandedNotesRowMap, enableExportTimelineDownloader, + onCreateRule, onOpenDeleteTimelineModal, onOpenTimeline, onSelectionChange, @@ -178,6 +184,7 @@ export const TimelinesTable = React.memo( deleteTimelines, itemIdToExpandedNotesRowMap, enableExportTimelineDownloader, + onCreateRule, onOpenDeleteTimelineModal, onOpenTimeline, onSelectionChange, @@ -190,6 +197,7 @@ export const TimelinesTable = React.memo( deleteTimelines, itemIdToExpandedNotesRowMap, enableExportTimelineDownloader, + onCreateRule, onOpenDeleteTimelineModal, onOpenTimeline, onSelectionChange, diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/translations.ts index 98e9300b9661a..a49d301b61154 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/translations.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/translations.ts @@ -116,6 +116,13 @@ export const ONLY_FAVORITES = i18n.translate( } ); +export const CREATE_RULE_FROM_TIMELINE = i18n.translate( + 'xpack.securitySolution.open.timeline.createRuleFromTimelineTooltip', + { + defaultMessage: 'Create rule from timeline', + } +); + export const CREATE_TEMPLATE_FROM_TIMELINE = i18n.translate( 'xpack.securitySolution.open.timeline.createTemplateFromTimelineTooltip', { diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts index 625e30bb9727e..723d9ebc605df 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts @@ -78,6 +78,9 @@ export interface EuiSearchBarQuery { /** Performs IO to delete the specified timelines */ export type DeleteTimelines = (timelineIds: string[], variables?: AllTimelinesVariables) => void; +/** Invoked when the user clicks the action create rule from timeline */ +export type OnCreateRuleFromTimeline = (savedObjectId: string) => void; + /** Invoked when the user clicks the action make the selected timelines favorites */ export type OnAddTimelinesToFavorites = () => void; @@ -126,7 +129,13 @@ export interface OnTableChangeParams { /** Invoked by the EUI table implementation when the user interacts with the table */ export type OnTableChange = (tableChange: OnTableChangeParams) => void; -export type ActionTimelineToShow = 'createFrom' | 'duplicate' | 'delete' | 'export' | 'selectable'; +export type ActionTimelineToShow = + | 'createFrom' + | 'duplicate' + | 'delete' + | 'export' + | 'selectable' + | 'createRule'; export interface OpenTimelineProps { /** Invoked when the user clicks the delete (trash) icon on an individual timeline */ @@ -141,6 +150,8 @@ export interface OpenTimelineProps { itemIdToExpandedNotesRowMap: Record; /** Display import timelines modal*/ importDataModalToggle?: boolean; + /** If this callback is specified, a "Create rule from timeline" button will be displayed, and this callback will be invoked when the button is clicked */ + onCreateRule?: OnCreateRuleFromTimeline; /** If this callback is specified, a "Favorite Selected" button will be displayed, and this callback will be invoked when the button is clicked */ onAddTimelinesToFavorites?: OnAddTimelinesToFavorites; /** If this callback is specified, a "Delete Selected" button will be displayed, and this callback will be invoked when the button is clicked */ From cc12631d350d013cb0197fc4e495a118cc5348e7 Mon Sep 17 00:00:00 2001 From: Janki Salvi <117571355+js-jankisalvi@users.noreply.github.com> Date: Thu, 8 Dec 2022 16:16:19 +0100 Subject: [PATCH 19/19] [Cases - ON Week] refactor useGetFeatureIds with React query (#146728) ## Summary This PR refactors `useGetFeatureIds` hook with React query. image ![image](https://user-images.githubusercontent.com/117571355/205101126-7902da1a-0e8b-498b-9d65-59f13df2f0d2.png) ![image](https://user-images.githubusercontent.com/117571355/205100918-2ef87d23-8c50-4f3c-80c8-9068bf2199f3.png) ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../case_view/components/case_view_alerts.tsx | 8 +- .../cases/public/containers/constants.ts | 3 + .../containers/use_get_feature_ids.test.tsx | 72 +++++++++--------- .../public/containers/use_get_feature_ids.tsx | 74 +++++-------------- 4 files changed, 60 insertions(+), 97 deletions(-) diff --git a/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.tsx b/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.tsx index ccf5579dc1c7e..1c0369524e03a 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.tsx @@ -35,17 +35,17 @@ export const CaseViewAlerts = ({ caseData }: CaseViewAlertsProps) => { [caseData.comments] ); - const { isLoading: isLoadingAlertFeatureIds, alertFeatureIds } = + const { isLoading: isLoadingAlertFeatureIds, data: alertFeatureIds } = useGetFeatureIds(alertRegistrationContexts); const alertStateProps = { alertsTableConfigurationRegistry: triggersActionsUi.alertsTableConfigurationRegistry, configurationId: caseData.owner, id: `case-details-alerts-${caseData.owner}`, - flyoutSize: (alertFeatureIds.includes('siem') ? 'm' : 's') as EuiFlyoutSize, - featureIds: alertFeatureIds, + flyoutSize: (alertFeatureIds?.includes('siem') ? 'm' : 's') as EuiFlyoutSize, + featureIds: alertFeatureIds ?? [], query: alertIdsQuery, - showExpandToDetails: alertFeatureIds.includes('siem'), + showExpandToDetails: Boolean(alertFeatureIds?.includes('siem')), }; if (alertIdsQuery.ids.values.length === 0) { diff --git a/x-pack/plugins/cases/public/containers/constants.ts b/x-pack/plugins/cases/public/containers/constants.ts index f54363a7989d4..2e57a17be08ec 100644 --- a/x-pack/plugins/cases/public/containers/constants.ts +++ b/x-pack/plugins/cases/public/containers/constants.ts @@ -14,6 +14,7 @@ export const casesQueriesKeys = { all: ['cases'] as const, users: ['users'] as const, connectors: ['connectors'] as const, + alerts: ['alerts'] as const, connectorsList: () => [...casesQueriesKeys.connectors, 'list'] as const, casesList: () => [...casesQueriesKeys.all, 'list'] as const, casesMetrics: () => [...casesQueriesKeys.casesList(), 'metrics'] as const, @@ -32,6 +33,8 @@ export const casesQueriesKeys = { connectorTypes: () => [...casesQueriesKeys.connectors, 'types'] as const, license: () => [...casesQueriesKeys.connectors, 'license'] as const, tags: () => [...casesQueriesKeys.all, 'tags'] as const, + alertFeatureIds: (alertRegistrationContexts: string[]) => + [...casesQueriesKeys.alerts, 'features', alertRegistrationContexts] as const, }; export const casesMutationsKeys = { diff --git a/x-pack/plugins/cases/public/containers/use_get_feature_ids.test.tsx b/x-pack/plugins/cases/public/containers/use_get_feature_ids.test.tsx index 3d4382bc709ab..9ac53b3726d38 100644 --- a/x-pack/plugins/cases/public/containers/use_get_feature_ids.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_feature_ids.test.tsx @@ -5,9 +5,11 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; -import React from 'react'; -import { TestProviders } from '../common/mock'; +import { renderHook } from '@testing-library/react-hooks'; +import { waitFor } from '@testing-library/dom'; +import { useToasts } from '../common/lib/kibana'; +import type { AppMockRenderer } from '../common/mock'; +import { createAppMockRenderer } from '../common/mock'; import { useGetFeatureIds } from './use_get_feature_ids'; import * as api from './api'; @@ -15,56 +17,54 @@ jest.mock('./api'); jest.mock('../common/lib/kibana'); describe('useGetFeaturesIds', () => { + const addSuccess = jest.fn(); + const addError = jest.fn(); + + (useToasts as jest.Mock).mockReturnValue({ addSuccess, addError }); + + let appMockRender: AppMockRenderer; + beforeEach(() => { + appMockRender = createAppMockRenderer(); jest.clearAllMocks(); - jest.restoreAllMocks(); }); - it('inits with empty data', async () => { - jest.spyOn(api, 'getFeatureIds').mockRejectedValue([]); - const { result } = renderHook(() => useGetFeatureIds(['context1']), { - wrapper: ({ children }) => {children}, - }); + it('returns the features ids correctly', async () => { + const spy = jest.spyOn(api, 'getFeatureIds').mockRejectedValue([]); - await act(async () => { - expect(result.current.alertFeatureIds).toEqual([]); - expect(result.current.isLoading).toEqual(true); - expect(result.current.isError).toEqual(false); + const { waitForNextUpdate } = renderHook(() => useGetFeatureIds(['context1']), { + wrapper: appMockRender.AppWrapper, }); - }); - it('fetches data and returns it correctly', async () => { - const spy = jest.spyOn(api, 'getFeatureIds'); - const { result } = renderHook(() => useGetFeatureIds(['context1']), { - wrapper: ({ children }) => {children}, - }); + await waitForNextUpdate(); - await act(async () => { + await waitFor(() => { expect(spy).toHaveBeenCalledWith( { registrationContext: ['context1'] }, expect.any(AbortSignal) ); }); - - await act(async () => { - expect(result.current.alertFeatureIds).toEqual(['siem', 'observability']); - expect(result.current.isLoading).toEqual(false); - expect(result.current.isError).toEqual(false); - }); }); - it('sets isError to true when an error occurs', async () => { - const spy = jest.spyOn(api, 'getFeatureIds'); - spy.mockImplementation(() => { - throw new Error('Something went wrong'); - }); + it('shows a toast error when the api return an error', async () => { + (useToasts as jest.Mock).mockReturnValue({ addError }); + + const spy = jest + .spyOn(api, 'getFeatureIds') + .mockRejectedValue(new Error('Something went wrong')); - const { result } = renderHook(() => useGetFeatureIds(['context1']), { - wrapper: ({ children }) => {children}, + const { waitForNextUpdate } = renderHook(() => useGetFeatureIds(['context1']), { + wrapper: appMockRender.AppWrapper, }); - expect(result.current.alertFeatureIds).toEqual([]); - expect(result.current.isLoading).toEqual(false); - expect(result.current.isError).toEqual(true); + await waitForNextUpdate(); + + await waitFor(() => { + expect(spy).toHaveBeenCalledWith( + { registrationContext: ['context1'] }, + expect.any(AbortSignal) + ); + expect(addError).toHaveBeenCalled(); + }); }); }); diff --git a/x-pack/plugins/cases/public/containers/use_get_feature_ids.tsx b/x-pack/plugins/cases/public/containers/use_get_feature_ids.tsx index 082e0539792ff..e5da391950c35 100644 --- a/x-pack/plugins/cases/public/containers/use_get_feature_ids.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_feature_ids.tsx @@ -5,70 +5,30 @@ * 2.0. */ -import { useCallback, useEffect, useState, useRef } from 'react'; +import { useQuery } from '@tanstack/react-query'; import type { ValidFeatureId } from '@kbn/rule-data-utils'; - +import type { ServerError } from '../types'; +import { useCasesToast } from '../common/use_cases_toast'; import * as i18n from './translations'; -import { useToasts } from '../common/lib/kibana'; import { getFeatureIds } from './api'; +import { casesQueriesKeys } from './constants'; -const initialStatus = { - isLoading: true, - alertFeatureIds: [] as ValidFeatureId[], - isError: false, -}; - -export const useGetFeatureIds = ( - alertRegistrationContexts: string[] -): { - isLoading: boolean; - isError: boolean; - alertFeatureIds: ValidFeatureId[]; -} => { - const toasts = useToasts(); - const isCancelledRef = useRef(false); - const abortCtrlRef = useRef(new AbortController()); - const [status, setStatus] = useState(initialStatus); - - const fetchFeatureIds = useCallback( - async (registrationContext: string[]) => { - setStatus({ isLoading: true, alertFeatureIds: [], isError: false }); - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); +export const useGetFeatureIds = (alertRegistrationContexts: string[]) => { + const { showErrorToast } = useCasesToast(); - const query = { registrationContext }; - const response = await getFeatureIds(query, abortCtrlRef.current.signal); - - if (!isCancelledRef.current) { - setStatus({ isLoading: false, alertFeatureIds: response, isError: false }); - } - } catch (error) { - if (!isCancelledRef.current) { - setStatus({ isLoading: false, alertFeatureIds: [], isError: true }); - if (error.name !== 'AbortError') { - toasts.addError( - error.body && error.body.message ? new Error(error.body.message) : error, - { title: i18n.ERROR_TITLE } - ); - } - } - } + return useQuery( + casesQueriesKeys.alertFeatureIds(alertRegistrationContexts), + () => { + const abortCtrlRef = new AbortController(); + const query = { registrationContext: alertRegistrationContexts }; + return getFeatureIds(query, abortCtrlRef.signal); }, - [toasts] + { + onError: (error: ServerError) => { + showErrorToast(error, { title: i18n.ERROR_TITLE }); + }, + } ); - - useEffect(() => { - fetchFeatureIds(alertRegistrationContexts); - return () => { - isCancelledRef.current = true; - abortCtrlRef.current.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, alertRegistrationContexts); - - return status; }; export type UseGetFeatureIds = typeof useGetFeatureIds;