diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b88935d43b3c1..5ae8101da74fe 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -480,7 +480,13 @@ packages/kbn-managed-vscode-config @elastic/kibana-operations packages/kbn-managed-vscode-config-cli @elastic/kibana-operations packages/kbn-management/cards_navigation @elastic/platform-deployment-management src/plugins/management @elastic/platform-deployment-management +packages/kbn-management/settings/components/field_input @elastic/platform-deployment-management @elastic/appex-sharedux +packages/kbn-management/settings/components/field_row @elastic/platform-deployment-management @elastic/appex-sharedux +packages/kbn-management/settings/field_definition @elastic/platform-deployment-management @elastic/appex-sharedux +packages/kbn-management/settings/setting_ids @elastic/appex-sharedux @elastic/platform-deployment-management packages/kbn-management/settings/section_registry @elastic/appex-sharedux @elastic/platform-deployment-management +packages/kbn-management/settings/types @elastic/platform-deployment-management @elastic/appex-sharedux +packages/kbn-management/settings/utilities @elastic/platform-deployment-management @elastic/appex-sharedux packages/kbn-management/storybook/config @elastic/platform-deployment-management test/plugin_functional/plugins/management_test_plugin @elastic/kibana-app-services packages/kbn-mapbox-gl @elastic/kibana-gis @@ -547,6 +553,7 @@ examples/preboot_example @elastic/kibana-security @elastic/kibana-core src/plugins/presentation_util @elastic/kibana-presentation x-pack/plugins/profiling_data_access @elastic/profiling-ui x-pack/plugins/profiling @elastic/profiling-ui +packages/kbn-profiling-utils @elastic/profiling-ui x-pack/packages/kbn-random-sampling @elastic/kibana-visualizations packages/kbn-react-field @elastic/kibana-data-discovery packages/react/kibana_context/common @elastic/appex-sharedux @@ -633,9 +640,13 @@ packages/kbn-securitysolution-utils @elastic/security-detection-engine packages/kbn-server-http-tools @elastic/kibana-core packages/kbn-server-route-repository @elastic/apm-ui x-pack/plugins/serverless @elastic/appex-sharedux +packages/serverless/settings/common @elastic/appex-sharedux @elastic/platform-deployment-management x-pack/plugins/serverless_observability @elastic/appex-sharedux @elastic/apm-ui +packages/serverless/settings/observability_project @elastic/appex-sharedux @elastic/apm-ui @elastic/platform-deployment-management packages/serverless/project_switcher @elastic/appex-sharedux x-pack/plugins/serverless_search @elastic/enterprise-search-frontend +packages/serverless/settings/search_project @elastic/enterprise-search-frontend @elastic/platform-deployment-management +packages/serverless/settings/security_project @elastic/security-solution @elastic/platform-deployment-management packages/serverless/storybook/config @elastic/appex-sharedux packages/serverless/types @elastic/appex-sharedux test/plugin_functional/plugins/session_notifications @elastic/kibana-core @@ -1012,7 +1023,7 @@ x-pack/plugins/infra/server/lib/alerting @elastic/actionable-observability /.buildkite/ @elastic/kibana-operations /kbn_pm/ @elastic/kibana-operations /x-pack/dev-tools @elastic/kibana-operations -catalog-info.yaml @elastic/kibana-operations @elastic/kibana-tech-leads +/catalog-info.yaml @elastic/kibana-operations @elastic/kibana-tech-leads # Appex QA /src/dev/code_coverage @elastic/appex-qa @@ -1316,6 +1327,7 @@ x-pack/test/security_solution_cypress/config.ts @elastic/security-engineering-pr x-pack/test/security_solution_cypress/runner.ts @elastic/security-engineering-productivity x-pack/test/security_solution_cypress/serverless_config.ts @elastic/security-engineering-productivity x-pack/test/security_solution_cypress/cypress/tags.ts @elastic/security-engineering-productivity +x-pack/plugins/security_solution/scripts/run_cypress @MadameSheema @patrykkopycinski @oatkiller @maximpn @banderror ## Security Solution sub teams - adaptive-workload-protection x-pack/plugins/security_solution/public/common/components/sessions_viewer @elastic/kibana-cloud-security-posture diff --git a/.gitignore b/.gitignore index 0107ffdef5e19..3a5dda1378c2e 100644 --- a/.gitignore +++ b/.gitignore @@ -94,6 +94,8 @@ npm-debug.log* ## @cypress/snapshot from apm plugin /snapshots.js /apm-diagnostics*.json +/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/snapshots/*.actual.png +/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/snapshots/*.diff.png # transpiled cypress config x-pack/plugins/fleet/cypress.config.d.ts diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index b9e0ea3bd2a03..f769dec9bbb68 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: 2023-09-08 +date: 2023-09-12 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 2c2850e645dc3..116f4400fabad 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: 2023-09-08 +date: 2023-09-12 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 bd656f15d0ab7..7d901d917e219 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 61 | 1 | 3 | 0 | +| 61 | 1 | 3 | 1 | ## Client diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 4f9441fe039f5..8ea4ec8b4e045 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index 8bd384647c099..e04ccc487115e 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -4809,9 +4809,13 @@ "TypeC", "<{ entryTransactionId: ", "StringC", - "; }>]>; }> | undefined; handler: ({}: ", + "; }>, ", + "PartialC", + "<{ maxTraceItems: ", + "Type", + "; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { path: { traceId: string; }; query: { start: number; end: number; } & { entryTransactionId: string; }; }; }) => Promise<{ traceItems: ", + " & { params: { path: { traceId: string; }; query: { start: number; end: number; } & { entryTransactionId: string; } & { maxTraceItems?: number | undefined; }; }; }) => Promise<{ traceItems: ", "TraceItems", "; entryTransaction?: ", "Transaction", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 4f53bd10a2801..934942ef4dc7d 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 15ffcff9abc22..7fbbbeaf32cb2 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.devdocs.json b/api_docs/asset_manager.devdocs.json index fcc5f81df2922..7f2baa50411c4 100644 --- a/api_docs/asset_manager.devdocs.json +++ b/api_docs/asset_manager.devdocs.json @@ -22,7 +22,7 @@ "label": "AssetManagerConfig", "description": [], "signature": [ - "{ readonly alphaEnabled?: boolean | undefined; readonly sourceIndices: Readonly<{} & { metrics: string; traces: string; logs: string; serviceMetrics: string; serviceLogs: string; }>; readonly lockedSource: \"assets\" | \"signals\"; }" + "{ readonly alphaEnabled?: boolean | undefined; readonly sourceIndices: Readonly<{} & { metrics: string; logs: string; }>; readonly lockedSource: \"assets\" | \"signals\"; }" ], "path": "x-pack/plugins/asset_manager/server/types.ts", "deprecated": false, diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 6d78302f57c7c..e8a7ead0e3f42 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index c5e9339917668..dfcf86d1f4c1a 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index a125c9e3bc8fd..d3f3b85c98c7c 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 418ef78fe36d0..6bb63e47bd7e7 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index a592c4bfad9fa..da249a675d670 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 220ce7b794894..c25aae50c77bd 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index de64b15cb76c2..bb1ca8d19cb37 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_chat.mdx b/api_docs/cloud_chat.mdx index 5440ae863e79b..7c6de64c57979 100644 --- a/api_docs/cloud_chat.mdx +++ b/api_docs/cloud_chat.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChat title: "cloudChat" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChat plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_chat_provider.mdx b/api_docs/cloud_chat_provider.mdx index 8998256b5ce68..42a3f24a762ad 100644 --- a/api_docs/cloud_chat_provider.mdx +++ b/api_docs/cloud_chat_provider.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChatProvider title: "cloudChatProvider" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChatProvider plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChatProvider'] --- import cloudChatProviderObj from './cloud_chat_provider.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 73720f0f5e7a5..a8b3bc251e514 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index c8bb28ae40d21..df824682c02b6 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index c5913e6847851..a7858aded45bb 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index c5b04814190fc..d48e404e6e148 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 58e89dc822ad1..cad065ce06831 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index eb698c55484da..53afb192e7202 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 24c9a3a9b9cb7..7b6a95ddce80b 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index ab49925960161..95b1a1250f2f1 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 30e6b76d6e094..37a8b7fa72fc3 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 3f686f8ccaf8b..db134448b466a 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index ab9fe1acf38bc..6bfaae8c55aa0 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index b40d23731df97..440af861a8bee 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index ad9b6a84efa62..2be5a1621bac9 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 8a487529aeabd..9b9fe14e12357 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: 2023-09-08 +date: 2023-09-12 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 8cc70599758b9..5f108a797d849 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: 2023-09-08 +date: 2023-09-12 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 19179bcd857cb..61eb6fc5cb6a4 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: 2023-09-08 +date: 2023-09-12 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 cd8385997d9bf..cba5d81775e3d 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: 2023-09-08 +date: 2023-09-12 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 b0e19ec63cace..8eba1bc28a3ff 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: 2023-09-08 +date: 2023-09-12 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 9c19d94256029..c34b6f9df39e8 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -66,7 +66,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | discover | - | | | data, discover, imageEmbeddable, embeddable | - | | | @kbn/core-saved-objects-browser-mocks, discover, @kbn/core-saved-objects-browser-internal | - | -| | advancedSettings, discover | - | +| | advancedSettings, discover, @kbn/management-settings-field-definition | - | | | @kbn/core-saved-objects-api-server-internal | - | | | @kbn/core-saved-objects-api-server-internal | - | | | @kbn/core-saved-objects-api-server-internal, canvas, @kbn/core-saved-objects-browser-internal | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 105960f2baeb3..20316bc8c6342 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -304,6 +304,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/management-settings-field-definition + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [get_definition.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-management/settings/field_definition/get_definition.ts#:~:text=metric) | - | + + + ## @kbn/react-kibana-context-styled | Deprecated API | Reference location(s) | Remove By | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 66cb187a50623..823c6845fe56f 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 2899ab82c4f30..eae382ca25802 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: 2023-09-08 +date: 2023-09-12 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 44a37c29c05e6..3b3259d0cbc12 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: 2023-09-08 +date: 2023-09-12 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 e845dab4f5d4f..f53d71e4c0be1 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index fd3c723717a24..fad333d7c3bca 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 29f288b9ccc27..bb5346454d87d 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 3dd86a1699e67..e5863f17a000a 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: 2023-09-08 +date: 2023-09-12 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 89ac3f34d57a7..0de54d19b9480 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: 2023-09-08 +date: 2023-09-12 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 ae9ef108a8191..0b47459c13d30 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: 2023-09-08 +date: 2023-09-12 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 4ba6b1b59828e..233483ada4ae3 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: 2023-09-08 +date: 2023-09-12 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 7871fc44e2c52..7b2cadda5bf1b 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: 2023-09-08 +date: 2023-09-12 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 f3c3aba720f68..d2c76e5b124f1 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: 2023-09-08 +date: 2023-09-12 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 db2178a379d0a..b35f24c255122 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index e41f09638c474..e8e9396cf034e 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 722dbf00719af..18c79a3fa66f5 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: 2023-09-08 +date: 2023-09-12 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 9b99ef71fe03e..782170289107b 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: 2023-09-08 +date: 2023-09-12 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 d7ae0c3b14a87..81d344911c4c6 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: 2023-09-08 +date: 2023-09-12 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 d6f8357886699..8586f6f34e582 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: 2023-09-08 +date: 2023-09-12 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 77e022ab5456e..552babe91435a 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: 2023-09-08 +date: 2023-09-12 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 6c6b7d5dcd859..44f6b30d3a7e3 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: 2023-09-08 +date: 2023-09-12 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 5cebde5950fcd..a68aa0869d79d 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: 2023-09-08 +date: 2023-09-12 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 b5af00049d0f0..7385e62cde7df 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: 2023-09-08 +date: 2023-09-12 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 266c8c7db0ff3..623f5a94ce8ca 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: 2023-09-08 +date: 2023-09-12 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 4f8117542c747..515c8f1d93fe2 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: 2023-09-08 +date: 2023-09-12 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 f81318a61a762..14f3bd8ffdcd9 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: 2023-09-08 +date: 2023-09-12 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 b3853b1a70a43..7e5715c6125bd 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: 2023-09-08 +date: 2023-09-12 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 0b61b3b5f389b..81c150e4528da 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: 2023-09-08 +date: 2023-09-12 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 ffe8a542e4349..81a08a37a641c 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: 2023-09-08 +date: 2023-09-12 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 1c463d8bd0d40..f7bf9d3871408 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: 2023-09-08 +date: 2023-09-12 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 1f68c374415c0..89069da507e73 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: 2023-09-08 +date: 2023-09-12 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 961fbbc3f2b6c..146fb1ad8ac04 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: 2023-09-08 +date: 2023-09-12 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 8394270ea771b..fd565572e57b2 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: 2023-09-08 +date: 2023-09-12 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 735e98f3eecb4..cde19e16fd9f2 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index d4054644ef4de..008869ed1c103 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: 2023-09-08 +date: 2023-09-12 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 eb5235ebe3720..864f7cb701e52 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: 2023-09-08 +date: 2023-09-12 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 c7e9498868d0a..4bfd5c20c791b 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.devdocs.json b/api_docs/home.devdocs.json index e39bab658985d..ffae4fbc9f5a5 100644 --- a/api_docs/home.devdocs.json +++ b/api_docs/home.devdocs.json @@ -693,6 +693,54 @@ "path": "src/plugins/home/public/services/feature_catalogue/feature_catalogue_registry.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "home", + "id": "def-public.FeatureCatalogueSolution.isVisible", + "type": "Function", + "tags": [], + "label": "isVisible", + "description": [ + "Optional function to control visibility of this solution." + ], + "signature": [ + "((capabilities: ", + { + "pluginId": "@kbn/core-capabilities-common", + "scope": "common", + "docId": "kibKbnCoreCapabilitiesCommonPluginApi", + "section": "def-common.Capabilities", + "text": "Capabilities" + }, + ") => boolean) | undefined" + ], + "path": "src/plugins/home/public/services/feature_catalogue/feature_catalogue_registry.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "home", + "id": "def-public.FeatureCatalogueSolution.isVisible.$1", + "type": "Object", + "tags": [], + "label": "capabilities", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-capabilities-common", + "scope": "common", + "docId": "kibKbnCoreCapabilitiesCommonPluginApi", + "section": "def-common.Capabilities", + "text": "Capabilities" + } + ], + "path": "src/plugins/home/public/services/feature_catalogue/feature_catalogue_registry.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 2b6ec6564ac17..89fbe9790ab9b 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 147 | 0 | 108 | 0 | +| 149 | 0 | 109 | 0 | ## Client diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 8b0e101713972..7246a3b40891e 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 9a7be0da2d344..9b7d3e033496c 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: 2023-09-08 +date: 2023-09-12 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 c06b56857d3da..209b95be63202 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: 2023-09-08 +date: 2023-09-12 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 e20529504e9e4..f56a7753b1a71 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: 2023-09-08 +date: 2023-09-12 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 61dae0d52bc07..2576a9ad71871 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: 2023-09-08 +date: 2023-09-12 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 9576c3c7c47cc..c40f1d90d78fb 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: 2023-09-08 +date: 2023-09-12 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 2696872c9ab7d..54b791d6d6439 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: 2023-09-08 +date: 2023-09-12 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 aa050c2e56732..201210befdb4d 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: 2023-09-08 +date: 2023-09-12 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 65009c98e3998..990f6c875d5ea 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index f0057aa1f6403..4bc2833b5410f 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index bc0ae73975ce3..cd2f05ea8cd2d 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index c21ba1c197503..d6fa40ced889a 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 640f71f170e9f..6e0fe1dfd8d22 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index cb84088e44a22..1c7a6f69af4d7 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.devdocs.json b/api_docs/kbn_analytics_client.devdocs.json index 08169d4866da6..b9707eeb74ff3 100644 --- a/api_docs/kbn_analytics_client.devdocs.json +++ b/api_docs/kbn_analytics_client.devdocs.json @@ -750,6 +750,10 @@ "plugin": "infra", "path": "x-pack/plugins/infra/public/services/telemetry/telemetry_client.ts" }, + { + "plugin": "apm", + "path": "x-pack/plugins/apm/public/services/telemetry/telemetry_client.ts" + }, { "plugin": "globalSearchBar", "path": "x-pack/plugins/global_search_bar/public/telemetry/event_reporter.ts" @@ -870,6 +874,14 @@ "plugin": "security", "path": "x-pack/plugins/security/server/analytics/analytics_service.test.ts" }, + { + "plugin": "apm", + "path": "x-pack/plugins/apm/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "apm", + "path": "x-pack/plugins/apm/public/services/telemetry/telemetry_service.test.ts" + }, { "plugin": "infra", "path": "x-pack/plugins/infra/public/services/telemetry/telemetry_service.test.ts" diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index a9805e5088d48..8ef3bf7cbfc5e 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: 2023-09-08 +date: 2023-09-12 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 ffdc84a2be77e..d8031106fc184 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: 2023-09-08 +date: 2023-09-12 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 1841304ecfa9b..14f2ce75c31ab 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: 2023-09-08 +date: 2023-09-12 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 3405383589761..342266ca1b6ca 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: 2023-09-08 +date: 2023-09-12 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 34a8f04f4c472..64e95993ed8d7 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: 2023-09-08 +date: 2023-09-12 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 8901ff1ab8da8..32eed44407a28 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: 2023-09-08 +date: 2023-09-12 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 d842542a01675..00c606eef262a 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: 2023-09-08 +date: 2023-09-12 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.mdx b/api_docs/kbn_apm_synthtrace.mdx index 84bd7b4fb2ac1..30890218752fe 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 749ab885e4c2d..894ca4efc02c3 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 29360ae39f660..feecd076a50e1 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: 2023-09-08 +date: 2023-09-12 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 f7720406d1bf2..eabebcbcad8ca 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: 2023-09-08 +date: 2023-09-12 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 152571482ac85..e9a8e296cfec9 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 5b31aef812c0f..7ce9cdfc75946 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index 12443a3bddfcb..d533f759f552a 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index adb8324d93ddb..e2bbd222f478c 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: 2023-09-08 +date: 2023-09-12 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 4ef3a04fb1c37..a249173c4dc60 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: 2023-09-08 +date: 2023-09-12 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 93de39c51aa09..c18c56f5e3ebb 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: 2023-09-08 +date: 2023-09-12 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 82e20528eb252..0ad31951aa038 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: 2023-09-08 +date: 2023-09-12 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 70a5e6d36e0f6..e14c623146071 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index db55867ac0d88..5b1f7661fadce 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mocks.mdx b/api_docs/kbn_code_editor_mocks.mdx index 4354c411cf926..6aa7a61140c19 100644 --- a/api_docs/kbn_code_editor_mocks.mdx +++ b/api_docs/kbn_code_editor_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mocks title: "@kbn/code-editor-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mocks plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mocks'] --- import kbnCodeEditorMocksObj from './kbn_code_editor_mocks.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index eb06303c41100..8e3cf8cc19745 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: 2023-09-08 +date: 2023-09-12 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 ca3d971195845..bf35bb0bae403 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: 2023-09-08 +date: 2023-09-12 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 61853bd87aebd..521b6af3fbb54 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: 2023-09-08 +date: 2023-09-12 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 22e4c6d7e968c..809925aacafb4 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 9d4a5a5329538..3ddbb29dab1fe 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index f1cfb688d74cb..5b693f3203530 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 3fc90f95c25c4..246ec97ac60e1 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 99ad7eacb4ab6..22e9602c9848f 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 0ca92f06ea2e6..8d640591dfbfd 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 855c2d3a2d470..fb19b2722811c 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: 2023-09-08 +date: 2023-09-12 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 e02d5005a2706..4a2479339cdc9 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: 2023-09-08 +date: 2023-09-12 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 d72b5d17c714b..03a2d807d608c 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: 2023-09-08 +date: 2023-09-12 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 481dbeff75d8b..2c92d56ed82d0 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: 2023-09-08 +date: 2023-09-12 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 d1d4c99e9fbc9..35550fe4ac6b3 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: 2023-09-08 +date: 2023-09-12 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 ee268d87becf9..0b02b2278d415 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: 2023-09-08 +date: 2023-09-12 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 200c493802aa9..fa7201dd3c0a4 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: 2023-09-08 +date: 2023-09-12 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 9100a7bc09077..709dd2cb65b7a 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: 2023-09-08 +date: 2023-09-12 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 72baff86f857f..fd39cd1e5d026 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: 2023-09-08 +date: 2023-09-12 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 0071f4ad7e761..96d46f1ff82fd 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: 2023-09-08 +date: 2023-09-12 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 a27d7e55742f0..5c3bbcfb54b1c 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: 2023-09-08 +date: 2023-09-12 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 5dabac7f426a4..94943f1609c27 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: 2023-09-08 +date: 2023-09-12 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 5218078d521c2..88c9a6f9d46c0 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: 2023-09-08 +date: 2023-09-12 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 310f861dfaa49..9c026eb2fbd00 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: 2023-09-08 +date: 2023-09-12 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 e0478f7488fa4..906b1d0faecc3 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: 2023-09-08 +date: 2023-09-12 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 ce95be0e114e7..3eede6580c1ff 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: 2023-09-08 +date: 2023-09-12 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 5bf84a3b88421..3b7695c8b9e5f 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: 2023-09-08 +date: 2023-09-12 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 c0cd5499fa5da..960f84c66596f 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: 2023-09-08 +date: 2023-09-12 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 e3657747b22be..eafa0c070d64c 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: 2023-09-08 +date: 2023-09-12 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 8d168e0906326..f8bc8816b403c 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: 2023-09-08 +date: 2023-09-12 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 0abc0b2258458..b6cffdb054444 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: 2023-09-08 +date: 2023-09-12 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 948aebef80793..d1306a2e1c770 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: 2023-09-08 +date: 2023-09-12 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 ccc5d573adfbc..768fdb6ec92b9 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: 2023-09-08 +date: 2023-09-12 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 593ea1034e171..5cef2d6c9a47c 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: 2023-09-08 +date: 2023-09-12 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_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index a93df98f96875..6c8f7fcdf06fd 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 3e27fdb249169..4f465fa7e77dc 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 39189f77795dd..33183dff8a1e7 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 9768092827418..78627d9cd6ff8 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index ebd0b06ab43d2..801e8875eb89b 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index f94edebbad938..dfe7f3e008634 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 3670ead1fda2e..35e1b62fae435 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 222c2abdb89e3..ec8b5d41d1b90 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: 2023-09-08 +date: 2023-09-12 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 8b4f65106b364..568684a7ed1b2 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: 2023-09-08 +date: 2023-09-12 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 653ec5b94c7bd..3c2077ac5c9ce 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: 2023-09-08 +date: 2023-09-12 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 4394e0424ca70..66c6d98643c51 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: 2023-09-08 +date: 2023-09-12 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 3b6468d8cd783..08027643bb569 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: 2023-09-08 +date: 2023-09-12 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 f9b7ad0e8e8ab..72cadd2b28a2b 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: 2023-09-08 +date: 2023-09-12 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 feb9f01c7761a..931303a1862cd 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: 2023-09-08 +date: 2023-09-12 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 85bd1b78da71c..5bffbb6c006f7 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: 2023-09-08 +date: 2023-09-12 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 9464ee2e493f4..25f24ade5d1e4 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: 2023-09-08 +date: 2023-09-12 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 5dd4226b66b60..9d241d30746d2 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: 2023-09-08 +date: 2023-09-12 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 fd1a2428df995..3f7758329c5da 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: 2023-09-08 +date: 2023-09-12 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 2826aa0354906..427ceda5e1c53 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: 2023-09-08 +date: 2023-09-12 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 05762a08155e2..10d34fc7145bd 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: 2023-09-08 +date: 2023-09-12 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 4d13a8d4de86b..95f96db44431b 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: 2023-09-08 +date: 2023-09-12 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 e19eb659072ee..ed6a74ddf6f82 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: 2023-09-08 +date: 2023-09-12 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 60ac849241e1e..2c3d5c020cd28 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: 2023-09-08 +date: 2023-09-12 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 4fe8316d4356e..3ef6f666cffc3 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: 2023-09-08 +date: 2023-09-12 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 5011a2f28cfa8..c498f2281fc02 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: 2023-09-08 +date: 2023-09-12 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 2c74e7259cb8a..d61d47d93930f 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: 2023-09-08 +date: 2023-09-12 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 84332fc496461..247db7882ed85 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: 2023-09-08 +date: 2023-09-12 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 ec0a95450a5ec..77d9ceaa9d3c0 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: 2023-09-08 +date: 2023-09-12 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 e175e66f365db..669e7426797aa 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: 2023-09-08 +date: 2023-09-12 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 101b01486e271..0b541d9b8e11e 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: 2023-09-08 +date: 2023-09-12 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 19288cba030ef..074c9871fecdd 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: 2023-09-08 +date: 2023-09-12 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 b9c14a45a136c..09b01925db957 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: 2023-09-08 +date: 2023-09-12 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 a039a1dc3bf84..f9e7348f255ec 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: 2023-09-08 +date: 2023-09-12 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 a3267c00d8347..d062156d3954f 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: 2023-09-08 +date: 2023-09-12 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 3e3824c52d9a3..ba027e9763dcd 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: 2023-09-08 +date: 2023-09-12 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 48129ca13af5c..09f8ca4c46104 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: 2023-09-08 +date: 2023-09-12 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 63d8da93ba46b..7882f0088aace 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: 2023-09-08 +date: 2023-09-12 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 49b9419215b19..c93ddf9eadeb7 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: 2023-09-08 +date: 2023-09-12 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 b26a92a05635b..d9344703a1eaa 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: 2023-09-08 +date: 2023-09-12 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 67ae74d716b4d..0c8023b60b734 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: 2023-09-08 +date: 2023-09-12 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 516514f140a32..d0f719603edb6 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: 2023-09-08 +date: 2023-09-12 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 1b6a2f0ceeefd..ef933f443ae03 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: 2023-09-08 +date: 2023-09-12 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 b8fa7f8a42f69..e6eddcaa97a2b 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: 2023-09-08 +date: 2023-09-12 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 3d6a7c95bc350..a70f1d958f27c 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: 2023-09-08 +date: 2023-09-12 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 6a2eb40ed5800..2918f743edd3a 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: 2023-09-08 +date: 2023-09-12 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 f0356876f6ebd..889b027188406 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: 2023-09-08 +date: 2023-09-12 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 78ea22a2b5c52..18394c44a9d89 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: 2023-09-08 +date: 2023-09-12 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 a5f084f4c4807..6ee2f64396918 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: 2023-09-08 +date: 2023-09-12 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 abbbe440d31b9..939881a2ca2fe 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: 2023-09-08 +date: 2023-09-12 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 5ddf3c9777b2e..49ef380d9ae91 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: 2023-09-08 +date: 2023-09-12 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 dcabb76ea5591..bf7cda6935568 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: 2023-09-08 +date: 2023-09-12 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 3c3104294bcf8..0cfcf35c4bc3c 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: 2023-09-08 +date: 2023-09-12 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 f989989436520..ceaed89ee3b37 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: 2023-09-08 +date: 2023-09-12 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_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 2ce94ed031bd7..ce6e48b6e9315 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: 2023-09-08 +date: 2023-09-12 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 b2be359b8ffdb..de228bd584509 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: 2023-09-08 +date: 2023-09-12 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 cfb385b109f8c..dd4a2372f2670 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: 2023-09-08 +date: 2023-09-12 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 99cd41bc1d62d..1837040dbad2a 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: 2023-09-08 +date: 2023-09-12 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 95755ec481eac..35c8c66258c77 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: 2023-09-08 +date: 2023-09-12 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 9f2bbe895dd41..b4a94f4128919 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: 2023-09-08 +date: 2023-09-12 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 6e0615f55c861..aeea9e18730df 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: 2023-09-08 +date: 2023-09-12 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 956e484f335f4..d47e7103012ac 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: 2023-09-08 +date: 2023-09-12 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 a604b946fadeb..e45f3ec2ffefe 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: 2023-09-08 +date: 2023-09-12 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 b783eee1bba20..54fa7e6298f69 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: 2023-09-08 +date: 2023-09-12 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 c5cff2e93f858..5bc22e3da8cbf 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: 2023-09-08 +date: 2023-09-12 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 0b9351349b958..fa2f6c3f5f16f 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: 2023-09-08 +date: 2023-09-12 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 34fbd10ef9bae..4d8dda4d1788d 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: 2023-09-08 +date: 2023-09-12 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 07d7a363caf8c..2fb057d10a8e2 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: 2023-09-08 +date: 2023-09-12 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 4379582e67297..400cc8707c7d6 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: 2023-09-08 +date: 2023-09-12 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 3d87b370b3fd0..7a53dc5c044e3 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: 2023-09-08 +date: 2023-09-12 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 86e5358c13a3a..2480a071ce56a 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: 2023-09-08 +date: 2023-09-12 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 5cfdc2bf4c900..b73065de470c3 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: 2023-09-08 +date: 2023-09-12 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 4443ac1d041a3..8b9bd8f098fd0 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: 2023-09-08 +date: 2023-09-12 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 adab241388357..d954dce2f2b2b 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: 2023-09-08 +date: 2023-09-12 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 13e05a8013bfe..9763bb576a19d 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: 2023-09-08 +date: 2023-09-12 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 0e3681b7696b0..fcf14abc66907 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: 2023-09-08 +date: 2023-09-12 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 73594a3464965..5b05388fe50b9 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: 2023-09-08 +date: 2023-09-12 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 36ca2945429fc..c5068f5d36bc3 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: 2023-09-08 +date: 2023-09-12 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 4bce0b56a52d8..fe537a156e974 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: 2023-09-08 +date: 2023-09-12 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 986c5954057b8..dbedde8326fa0 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: 2023-09-08 +date: 2023-09-12 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 0f1600d4ab4f8..182fa629af08e 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: 2023-09-08 +date: 2023-09-12 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 beb36919ffdf8..1ae2c41237ecb 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: 2023-09-08 +date: 2023-09-12 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 268a5f35cf70d..05002f137bb92 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: 2023-09-08 +date: 2023-09-12 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 161d4ae981f4a..ccfb5286d38c1 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: 2023-09-08 +date: 2023-09-12 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 1f087597d6c7e..feb0df5014cb4 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: 2023-09-08 +date: 2023-09-12 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 f27897e997aaf..62280c0c12da1 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: 2023-09-08 +date: 2023-09-12 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 47951ccaed847..2cbc7f9ca6d1f 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: 2023-09-08 +date: 2023-09-12 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 7512482a16705..f30a21ec790b1 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: 2023-09-08 +date: 2023-09-12 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 1fdc697e78df0..82b10036e143b 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: 2023-09-08 +date: 2023-09-12 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 d50dd24ab4566..a50be8c4fd1dd 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: 2023-09-08 +date: 2023-09-12 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 68f36d72a4f76..f6441d6d0b127 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: 2023-09-08 +date: 2023-09-12 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 c37d7d9586515..eb1703990791c 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: 2023-09-08 +date: 2023-09-12 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 f3f835d242a4a..771990875640a 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: 2023-09-08 +date: 2023-09-12 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_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index ec196f622ea2e..a01a46be63ecd 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: 2023-09-08 +date: 2023-09-12 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 dde1394588271..001c44618d0c3 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: 2023-09-08 +date: 2023-09-12 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 e7e2cd91dd02d..027646fe0f9ac 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: 2023-09-08 +date: 2023-09-12 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 56e06aff87150..4651012b8d142 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: 2023-09-08 +date: 2023-09-12 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 44590b477dc23..77294bc412292 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: 2023-09-08 +date: 2023-09-12 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 35b69642632df..50d29aa340d3d 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: 2023-09-08 +date: 2023-09-12 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 7e792fc3e084d..46a80f8959085 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: 2023-09-08 +date: 2023-09-12 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 e2bafbf02e4a7..231f0c02bee79 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: 2023-09-08 +date: 2023-09-12 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 d89a199baf3e7..3b4ecdf7b9bdb 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: 2023-09-08 +date: 2023-09-12 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.devdocs.json b/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json index 4788fa89a6be4..4706f5a6e2e38 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json @@ -843,6 +843,8 @@ "IndexNotGreenTimeout", " | ", "ClusterShardLimitExceeded", + " | ", + "OperationNotSupported", ", ", "AcknowledgeResponse", ">" 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 40ba4ffe4cc3b..8903a502bfadc 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 125 | 0 | 91 | 46 | +| 125 | 0 | 91 | 47 | ## Common 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 8a6fd132f31a2..abdceac9b19ec 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: 2023-09-08 +date: 2023-09-12 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 085933be10c50..145d5e170fd62 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: 2023-09-08 +date: 2023-09-12 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 d292f5668de3e..4d271c4731a11 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: 2023-09-08 +date: 2023-09-12 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 60d6a97391a8f..9e6dcb77e9195 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: 2023-09-08 +date: 2023-09-12 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 15544cba67cdb..fc7cd5b1cc5b1 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: 2023-09-08 +date: 2023-09-12 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 b8bee1a38954e..b474628c4e6ab 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: 2023-09-08 +date: 2023-09-12 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 a7965c78b553c..b5d224491a0d9 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: 2023-09-08 +date: 2023-09-12 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 cc01485b8b32f..b936f1cad4950 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: 2023-09-08 +date: 2023-09-12 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 7ff12c396b239..d50758bd95481 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: 2023-09-08 +date: 2023-09-12 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 0016f37f4b9db..fbbc9bca14735 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: 2023-09-08 +date: 2023-09-12 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 f88e7cf3fc25a..4325a8b9d0a47 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: 2023-09-08 +date: 2023-09-12 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 7de852497511c..0d8c915fc6da6 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: 2023-09-08 +date: 2023-09-12 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 e043468204dc3..70bfe3aae8693 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: 2023-09-08 +date: 2023-09-12 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 4903c5b8cff74..b4511ef51975f 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: 2023-09-08 +date: 2023-09-12 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 46abc1816d89a..79df374c28e3a 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: 2023-09-08 +date: 2023-09-12 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 14b3af1c332ae..4028e66a556aa 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: 2023-09-08 +date: 2023-09-12 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_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index d61539fb97da4..4ee1059f282fa 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: 2023-09-08 +date: 2023-09-12 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.devdocs.json b/api_docs/kbn_core_ui_settings_browser.devdocs.json index f39807e781468..4804d0fac6dac 100644 --- a/api_docs/kbn_core_ui_settings_browser.devdocs.json +++ b/api_docs/kbn_core_ui_settings_browser.devdocs.json @@ -554,7 +554,15 @@ "section": "def-common.UiSettingsScope", "text": "UiSettingsScope" }, - " | undefined; order?: number | undefined; name?: string | undefined; description?: string | undefined; category?: string[] | undefined; optionLabels?: Record | undefined; requiresPageReload?: boolean | undefined; readonly?: boolean | undefined; sensitive?: boolean | undefined; deprecation?: ", + " | undefined; order?: number | undefined; name?: string | undefined; description?: string | undefined; category?: string[] | undefined; optionLabels?: Record | undefined; requiresPageReload?: boolean | undefined; readonly?: boolean | undefined; readonlyMode?: ", + { + "pluginId": "@kbn/core-ui-settings-common", + "scope": "common", + "docId": "kibKbnCoreUiSettingsCommonPluginApi", + "section": "def-common.ReadonlyModeType", + "text": "ReadonlyModeType" + }, + " | undefined; sensitive?: boolean | undefined; deprecation?: ", { "pluginId": "@kbn/core-ui-settings-common", "scope": "common", diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 59815be0c9364..66e9d39800be8 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: 2023-09-08 +date: 2023-09-12 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 5014865f74325..dbabbf0a55f92 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: 2023-09-08 +date: 2023-09-12 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 7e8f393532d94..ee1d96f201645 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: 2023-09-08 +date: 2023-09-12 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.devdocs.json b/api_docs/kbn_core_ui_settings_common.devdocs.json index 252e14a65d219..16e4a9397621c 100644 --- a/api_docs/kbn_core_ui_settings_common.devdocs.json +++ b/api_docs/kbn_core_ui_settings_common.devdocs.json @@ -213,6 +213,29 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-ui-settings-common", + "id": "def-common.UiSettingsParams.readonlyMode", + "type": "CompoundType", + "tags": [], + "label": "readonlyMode", + "description": [ + "a flag indicating the level of restriction of the readonly settings {@link ReadonlyModeType}" + ], + "signature": [ + { + "pluginId": "@kbn/core-ui-settings-common", + "scope": "common", + "docId": "kibKbnCoreUiSettingsCommonPluginApi", + "section": "def-common.ReadonlyModeType", + "text": "ReadonlyModeType" + }, + " | undefined" + ], + "path": "packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-ui-settings-common", "id": "def-common.UiSettingsParams.sensitive", @@ -345,6 +368,10 @@ { "plugin": "discover", "path": "src/plugins/discover/server/ui_settings.ts" + }, + { + "plugin": "@kbn/management-settings-field-definition", + "path": "packages/kbn-management/settings/field_definition/get_definition.ts" } ] }, @@ -431,6 +458,23 @@ ], "enums": [], "misc": [ + { + "parentPluginId": "@kbn/core-ui-settings-common", + "id": "def-common.ReadonlyModeType", + "type": "Type", + "tags": [], + "label": "ReadonlyModeType", + "description": [ + "\nType for the readonly mode of the readonly settings.\n'strict' indicates that the value cannot be changed through API and is not displayed in the UI\n'ui' indicates that the value is just not displayed in the UI" + ], + "signature": [ + "\"strict\" | \"ui\"" + ], + "path": "packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-ui-settings-common", "id": "def-common.TIMEZONE_OPTIONS", diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 2ca5980a9f8d7..8b9b496609e84 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 25 | 0 | 4 | 0 | +| 27 | 0 | 4 | 0 | ## Common diff --git a/api_docs/kbn_core_ui_settings_server.devdocs.json b/api_docs/kbn_core_ui_settings_server.devdocs.json index e4d4c0c5eedd1..9db8a89dd3d1f 100644 --- a/api_docs/kbn_core_ui_settings_server.devdocs.json +++ b/api_docs/kbn_core_ui_settings_server.devdocs.json @@ -525,6 +525,40 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-ui-settings-server", + "id": "def-common.UiSettingsServiceSetup.setAllowlist", + "type": "Function", + "tags": [], + "label": "setAllowlist", + "description": [ + "\nSets an allowlist of setting keys." + ], + "signature": [ + "(keys: string[]) => void" + ], + "path": "packages/core/ui-settings/core-ui-settings-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-ui-settings-server", + "id": "def-common.UiSettingsServiceSetup.setAllowlist.$1", + "type": "Array", + "tags": [], + "label": "keys", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/core/ui-settings/core-ui-settings-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 8d6a2e09426ab..e6563f5f7e730 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 32 | 1 | 16 | 0 | +| 34 | 1 | 17 | 0 | ## Common diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index f70acadef78dd..3fd46b711a04a 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: 2023-09-08 +date: 2023-09-12 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 2469efec0f41f..6c9f2ccee8d62 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: 2023-09-08 +date: 2023-09-12 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 e5b5791caa1db..00cc70e786a4c 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: 2023-09-08 +date: 2023-09-12 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 bc1bf4814be37..49757b6f75eaa 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: 2023-09-08 +date: 2023-09-12 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 544caf1fcfdec..543ce65ee4c81 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: 2023-09-08 +date: 2023-09-12 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_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 00592bbbafa2d..d51d21ac260c9 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index 96dc9b825486e..3c7b6d0c59f05 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 2e365d6911d8b..95c53619109b7 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index a229cc2acfe9f..978ca8c7e9baa 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: 2023-09-08 +date: 2023-09-12 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 8419e90b391da..ed2a6e799801a 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index d59814ab6757d..03b957e3c9f1b 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 23613cdd7aee6..9ef75da2c9de0 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 3af4569c84a77..c71356cd9304e 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index e602fce25553f..76f2ac58f8b7e 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 3f420fffbc4e6..2580a8aa326dc 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 62fba60542f67..510cb451ce1b2 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index d7d9edc414629..1af83f0011ab3 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index bbd75a908c5c0..a83c88b424fa4 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 6918c3932512b..afb641c1780cb 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index a312e575e1ea6..8a47342716dbb 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 1a2b7c1298ef5..92cf9d528aa73 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 41dde9d18b03a..70fbd6df2921d 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index ff27bb7f9be34..d6829a3eb36af 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index b21d133bffa6d..fc8fa93ebdd0b 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: 2023-09-08 +date: 2023-09-12 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 e4721b18ccf0a..37a99d2af044c 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: 2023-09-08 +date: 2023-09-12 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 92a8afddeda11..ff2feeec50f54 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: 2023-09-08 +date: 2023-09-12 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 7b88610ec4d64..c93f53a0f0c0e 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 267732ef33f39..0478522785d51 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 51f94f4b7c44a..f9afe57ee80e3 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: 2023-09-08 +date: 2023-09-12 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 e6e553327753a..f1da93bae2504 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 62bcd6686c772..75bd3ffca5292 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index d65c2ac2766df..ebfc3717cb907 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index ea7ece235603a..90978dba36fd3 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index a52961733a2e8..415c11e459383 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 1880a44121010..aceeaa83e8ddd 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 15a1111af3ce3..d65666ae26616 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: 2023-09-08 +date: 2023-09-12 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 3d02571c7355a..11fd9ddc53201 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: 2023-09-08 +date: 2023-09-12 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 26b63d9bd77f0..1539ce53d1519 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: 2023-09-08 +date: 2023-09-12 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 0d71589efd79f..37af94302d29d 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: 2023-09-08 +date: 2023-09-12 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 ab7a2440525f9..daab931a6854d 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: 2023-09-08 +date: 2023-09-12 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 c38728f98ac0c..512dabb1a42e3 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 13b3a66005607..ba47b7261b0a9 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 8e87541ab0ea0..f948ff6b51a3e 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 825c0801bded5..2b28057bccfd4 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 74ca04c73badb..2e0f25a31f262 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: 2023-09-08 +date: 2023-09-12 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 1eb4bfa716542..5a072165e09f4 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: 2023-09-08 +date: 2023-09-12 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 59bc0a9754c72..fccc0db06353d 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: 2023-09-08 +date: 2023-09-12 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 820cc3710724a..fa31ed7ca7436 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 86503bb9bff58..f2945e91c4c98 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 525bddfb895d8..0213d9cf372bc 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_generate_csv_types.mdx b/api_docs/kbn_generate_csv_types.mdx index 1caa2e7b2bd03..c9cf611bccc4f 100644 --- a/api_docs/kbn_generate_csv_types.mdx +++ b/api_docs/kbn_generate_csv_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv-types title: "@kbn/generate-csv-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv-types plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv-types'] --- import kbnGenerateCsvTypesObj from './kbn_generate_csv_types.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index cf1975454e96e..16d6c53bf8188 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: 2023-09-08 +date: 2023-09-12 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 9600dd46a80ca..447f19a11f64c 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: 2023-09-08 +date: 2023-09-12 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 8c39d54ddd698..3fcefee6eaeb4 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: 2023-09-08 +date: 2023-09-12 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 a3b0a2812807b..57310fd29cee3 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: 2023-09-08 +date: 2023-09-12 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 aa0c49b749e2a..9bfa6d175ef5d 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: 2023-09-08 +date: 2023-09-12 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 74cd18c9dab4c..95b3348353044 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: 2023-09-08 +date: 2023-09-12 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 9fcc5425de1c8..bf511f730692b 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: 2023-09-08 +date: 2023-09-12 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 d18705af1269f..724cf2e63ecc7 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: 2023-09-08 +date: 2023-09-12 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 eeea7bea92146..1db38de200b22 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 3035a337946ef..7be114217863d 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index c01768df43c45..27a614798fe3b 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: 2023-09-08 +date: 2023-09-12 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 7af1037d76619..f9642279de432 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: 2023-09-08 +date: 2023-09-12 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 583672426f870..bee594dcc6ad9 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: 2023-09-08 +date: 2023-09-12 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 4efc45e105d70..6de4795ea9f24 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 581b14bee0ffe..ece674a9c623f 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 0711d461174fb..6f6850a7eefcc 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: 2023-09-08 +date: 2023-09-12 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 84c6d415da610..47f4bbcf3c3b1 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 26cb9ab606a5f..1d32c78f3f29e 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 6baf076ca4f02..f06e544f9a6be 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: 2023-09-08 +date: 2023-09-12 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 6c0dd6dd3dabb..a1a3d9889a5ae 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: 2023-09-08 +date: 2023-09-12 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 5285f1d65f197..59937e4ea4c0c 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 4bdb2d0e46815..db16509d7c6ac 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.devdocs.json b/api_docs/kbn_management_settings_components_field_input.devdocs.json new file mode 100644 index 0000000000000..06abcd536d7b3 --- /dev/null +++ b/api_docs/kbn_management_settings_components_field_input.devdocs.json @@ -0,0 +1,482 @@ +{ + "id": "@kbn/management-settings-components-field-input", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInput", + "type": "Function", + "tags": [], + "label": "FieldInput", + "description": [ + "\nAn input that allows one to change a setting in Kibana.\n" + ], + "signature": [ + "(props: ", + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.FieldInputProps", + "text": "FieldInputProps" + }, + ") => JSX.Element" + ], + "path": "packages/kbn-management/settings/components/field_input/field_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInput.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [ + "The props for the {@link FieldInput } component." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.FieldInputProps", + "text": "FieldInputProps" + }, + "" + ], + "path": "packages/kbn-management/settings/components/field_input/field_input.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputKibanaDependencies", + "type": "Interface", + "tags": [], + "label": "FieldInputKibanaDependencies", + "description": [ + "\nAn interface containing a collection of Kibana plugins and services required to\nrender this component." + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputKibanaDependencies.toasts", + "type": "Object", + "tags": [], + "label": "toasts", + "description": [ + "The portion of the {@link ToastsStart} contract used by this component." + ], + "signature": [ + "{ addDanger: (toastOrTitle: ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.ToastInput", + "text": "ToastInput" + }, + ", options?: any) => ", + { + "pluginId": "@kbn/core-notifications-browser", + "scope": "common", + "docId": "kibKbnCoreNotificationsBrowserPluginApi", + "section": "def-common.Toast", + "text": "Toast" + }, + "; }" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputProps", + "type": "Interface", + "tags": [], + "label": "FieldInputProps", + "description": [ + "\nThe props that are passed to the {@link FieldInput} component." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.FieldInputProps", + "text": "FieldInputProps" + }, + "" + ], + "path": "packages/kbn-management/settings/components/field_input/field_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputProps.field", + "type": "Object", + "tags": [], + "label": "field", + "description": [ + "The {@link FieldDefinition} for the component." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + " | null>" + ], + "path": "packages/kbn-management/settings/components/field_input/field_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputProps.unsavedChange", + "type": "Object", + "tags": [], + "label": "unsavedChange", + "description": [ + "An {@link UnsavedFieldChange} for the component, if any." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + " | undefined" + ], + "path": "packages/kbn-management/settings/components/field_input/field_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputProps.onChange", + "type": "Function", + "tags": [], + "label": "onChange", + "description": [ + "The `onChange` handler for the input." + ], + "signature": [ + "(params: ", + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.OnChangeParams", + "text": "OnChangeParams" + }, + ") => void" + ], + "path": "packages/kbn-management/settings/components/field_input/field_input.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputProps.onChange.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.OnChangeParams", + "text": "OnChangeParams" + }, + "" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputProps.isDisabled", + "type": "CompoundType", + "tags": [], + "label": "isDisabled", + "description": [ + "True if the input is disabled, false otherwise." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-management/settings/components/field_input/field_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputProps.isInvalid", + "type": "CompoundType", + "tags": [], + "label": "isInvalid", + "description": [ + "True if the value within the input is invalid, false otherwise." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-management/settings/components/field_input/field_input.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputServices", + "type": "Interface", + "tags": [], + "label": "FieldInputServices", + "description": [ + "\nContextual services used by a {@link FieldInput} component." + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputServices.showDanger", + "type": "Function", + "tags": [], + "label": "showDanger", + "description": [ + "\nDisplays a danger toast message." + ], + "signature": [ + "(value: string) => void" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputServices.showDanger.$1", + "type": "string", + "tags": [], + "label": "value", + "description": [ + "The message to display." + ], + "signature": [ + "string" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.OnChangeParams", + "type": "Interface", + "tags": [], + "label": "OnChangeParams", + "description": [ + "\nParameters for the {@link OnChangeFn} handler." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.OnChangeParams", + "text": "OnChangeParams" + }, + "" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.OnChangeParams.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [ + "The value provided to the handler." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.KnownTypeToValue", + "text": "KnownTypeToValue" + }, + " | null | undefined" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.OnChangeParams.error", + "type": "string", + "tags": [], + "label": "error", + "description": [ + "An error message, if one occurred." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.OnChangeParams.isInvalid", + "type": "CompoundType", + "tags": [], + "label": "isInvalid", + "description": [ + "True if the format of a change is not valid, false otherwise." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.OnChangeFn", + "type": "Type", + "tags": [], + "label": "OnChangeFn", + "description": [ + "\nA function that is called when the value of a {@link FieldInput} changes." + ], + "signature": [ + "(params: ", + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.OnChangeParams", + "text": "OnChangeParams" + }, + ") => void" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.OnChangeFn.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [ + "The {@link OnChangeParams } parameters passed to the handler." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.OnChangeParams", + "text": "OnChangeParams" + }, + "" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx new file mode 100644 index 0000000000000..eea57589ebe01 --- /dev/null +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnManagementSettingsComponentsFieldInputPluginApi +slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input +title: "@kbn/management-settings-components-field-input" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/management-settings-components-field-input plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] +--- +import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; + + + +Contact [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 20 | 0 | 1 | 0 | + +## Common + +### Functions + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_management_settings_components_field_row.devdocs.json b/api_docs/kbn_management_settings_components_field_row.devdocs.json new file mode 100644 index 0000000000000..117654406892d --- /dev/null +++ b/api_docs/kbn_management_settings_components_field_row.devdocs.json @@ -0,0 +1,277 @@ +{ + "id": "@kbn/management-settings-components-field-row", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRow", + "type": "Function", + "tags": [], + "label": "FieldRow", + "description": [ + "\nComponent for displaying a {@link FieldDefinition} in a form row, using a {@link FieldInput}." + ], + "signature": [ + "(props: ", + { + "pluginId": "@kbn/management-settings-components-field-row", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldRowPluginApi", + "section": "def-common.FieldRowProps", + "text": "FieldRowProps" + }, + ") => JSX.Element" + ], + "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRow.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [ + "The {@link FieldRowProps } for the {@link FieldRow } component." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-components-field-row", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldRowPluginApi", + "section": "def-common.FieldRowProps", + "text": "FieldRowProps" + }, + "" + ], + "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRowProps", + "type": "Interface", + "tags": [], + "label": "FieldRowProps", + "description": [ + "\nProps for a {@link FieldRow} component." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-components-field-row", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldRowPluginApi", + "section": "def-common.FieldRowProps", + "text": "FieldRowProps" + }, + "" + ], + "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRowProps.isSavingEnabled", + "type": "boolean", + "tags": [], + "label": "isSavingEnabled", + "description": [ + "True if saving settings is enabled, false otherwise." + ], + "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRowProps.onChange", + "type": "Function", + "tags": [], + "label": "onChange", + "description": [ + "The {@link OnChangeFn} handler." + ], + "signature": [ + "(id: string, change: ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + ") => void" + ], + "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRowProps.onChange.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-management/settings/components/field_row/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRowProps.onChange.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "" + ], + "path": "packages/kbn-management/settings/components/field_row/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRowProps.onClear", + "type": "Function", + "tags": [], + "label": "onClear", + "description": [ + "\nThe onClear handler, if a value is cleared to an empty or default state." + ], + "signature": [ + "((id: string) => void) | undefined" + ], + "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRowProps.onClear.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "The id relating to the field to clear." + ], + "signature": [ + "string" + ], + "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRowProps.field", + "type": "Object", + "tags": [], + "label": "field", + "description": [ + "The {@link FieldDefinition} corresponding the setting." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + " | null>" + ], + "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-row", + "id": "def-common.FieldRowProps.unsavedChange", + "type": "Object", + "tags": [], + "label": "unsavedChange", + "description": [ + "The {@link UnsavedFieldChange} corresponding to any unsaved change to the field." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + " | undefined" + ], + "path": "packages/kbn-management/settings/components/field_row/field_row.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx new file mode 100644 index 0000000000000..98d151b7e5126 --- /dev/null +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnManagementSettingsComponentsFieldRowPluginApi +slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row +title: "@kbn/management-settings-components-field-row" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/management-settings-components-field-row plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] +--- +import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; + + + +Contact [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 11 | 0 | 2 | 0 | + +## Common + +### Functions + + +### Interfaces + + diff --git a/api_docs/kbn_management_settings_field_definition.devdocs.json b/api_docs/kbn_management_settings_field_definition.devdocs.json new file mode 100644 index 0000000000000..f19d32aba14fa --- /dev/null +++ b/api_docs/kbn_management_settings_field_definition.devdocs.json @@ -0,0 +1,969 @@ +{ + "id": "@kbn/management-settings-field-definition", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.getFieldDefinition", + "type": "Function", + "tags": [], + "label": "getFieldDefinition", + "description": [ + "\nCreate a {@link FieldDefinition} from a {@link UiSettingMetadata} object for use\nin the UI.\n" + ], + "signature": [ + "(parameters: GetDefinitionParams) => ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + " | null>" + ], + "path": "packages/kbn-management/settings/field_definition/get_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.getFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "parameters", + "description": [ + "The {@link GetDefinitionParams } for creating the {@link FieldDefinition }." + ], + "signature": [ + "GetDefinitionParams" + ], + "path": "packages/kbn-management/settings/field_definition/get_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isArrayFieldDefinition", + "type": "Function", + "tags": [], + "label": "isArrayFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link ArrayFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.ArrayFieldDefinition", + "text": "ArrayFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isArrayFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isArrayFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isArrayFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link ArrayUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.ArrayUnsavedFieldChange", + "text": "ArrayUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isArrayFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isBooleanFieldDefinition", + "type": "Function", + "tags": [], + "label": "isBooleanFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link BooleanFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.BooleanFieldDefinition", + "text": "BooleanFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isBooleanFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isBooleanFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isBooleanFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link BooleanUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.BooleanUnsavedFieldChange", + "text": "BooleanUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isBooleanFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isColorFieldDefinition", + "type": "Function", + "tags": [], + "label": "isColorFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link ColorFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.ColorFieldDefinition", + "text": "ColorFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isColorFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isColorFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isColorFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link ColorUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.ColorUnsavedFieldChange", + "text": "ColorUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isColorFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isImageFieldDefinition", + "type": "Function", + "tags": [], + "label": "isImageFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link ImageFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.ImageFieldDefinition", + "text": "ImageFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isImageFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isImageFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isImageFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link ImageUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.ImageUnsavedFieldChange", + "text": "ImageUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isImageFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isJsonFieldDefinition", + "type": "Function", + "tags": [], + "label": "isJsonFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link JsonFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.JsonFieldDefinition", + "text": "JsonFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isJsonFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isJsonFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isJsonFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link JsonUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.JsonUnsavedFieldChange", + "text": "JsonUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isJsonFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isMarkdownFieldDefinition", + "type": "Function", + "tags": [], + "label": "isMarkdownFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link MarkdownFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.MarkdownFieldDefinition", + "text": "MarkdownFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isMarkdownFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isMarkdownFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isMarkdownFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link MarkdownUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.MarkdownUnsavedFieldChange", + "text": "MarkdownUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isMarkdownFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isNumberFieldDefinition", + "type": "Function", + "tags": [], + "label": "isNumberFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link NumberFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.NumberFieldDefinition", + "text": "NumberFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isNumberFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isNumberFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isNumberFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link NumberUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.NumberUnsavedFieldChange", + "text": "NumberUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isNumberFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isSelectFieldDefinition", + "type": "Function", + "tags": [], + "label": "isSelectFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link SelectFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.SelectFieldDefinition", + "text": "SelectFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isSelectFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isSelectFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isSelectFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link SelectUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.SelectUnsavedFieldChange", + "text": "SelectUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isSelectFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isStringFieldDefinition", + "type": "Function", + "tags": [], + "label": "isStringFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link StringFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.StringFieldDefinition", + "text": "StringFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isStringFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isStringFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isStringFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link StringUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.StringUnsavedFieldChange", + "text": "StringUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isStringFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isUndefinedFieldDefinition", + "type": "Function", + "tags": [], + "label": "isUndefinedFieldDefinition", + "description": [ + "\nReturns `true` if the given {@link FieldDefinition} is an {@link UndefinedFieldDefinition},\n`false` otherwise." + ], + "signature": [ + "(d: Definition) => d is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UndefinedFieldDefinition", + "text": "UndefinedFieldDefinition" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isUndefinedFieldDefinition.$1", + "type": "Object", + "tags": [], + "label": "d", + "description": [ + "The {@link FieldDefinition } to check." + ], + "signature": [ + "Definition" + ], + "path": "packages/kbn-management/settings/field_definition/is/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isUndefinedFieldUnsavedChange", + "type": "Function", + "tags": [], + "label": "isUndefinedFieldUnsavedChange", + "description": [ + "\nReturns `true` if the given {@link FieldUnsavedChange} is an {@link UndefinedUnsavedFieldChange},\n`false` otherwise." + ], + "signature": [ + "(c?: Change | undefined) => c is ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UndefinedUnsavedFieldChange", + "text": "UndefinedUnsavedFieldChange" + } + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-field-definition", + "id": "def-common.isUndefinedFieldUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "c", + "description": [ + "The {@link FieldUnsavedChange } to check." + ], + "signature": [ + "Change | undefined" + ], + "path": "packages/kbn-management/settings/field_definition/is/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx new file mode 100644 index 0000000000000..ef4e437056cdb --- /dev/null +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnManagementSettingsFieldDefinitionPluginApi +slug: /kibana-dev-docs/api/kbn-management-settings-field-definition +title: "@kbn/management-settings-field-definition" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/management-settings-field-definition plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] +--- +import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; + + + +Contact [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 42 | 0 | 0 | 0 | + +## Common + +### Functions + + diff --git a/api_docs/kbn_management_settings_ids.devdocs.json b/api_docs/kbn_management_settings_ids.devdocs.json new file mode 100644 index 0000000000000..65f9349533995 --- /dev/null +++ b/api_docs/kbn_management_settings_ids.devdocs.json @@ -0,0 +1,1933 @@ +{ + "id": "@kbn/management-settings-ids", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.ACCESSIBILITY_DISABLE_ANIMATIONS_ID", + "type": "string", + "tags": [], + "label": "ACCESSIBILITY_DISABLE_ANIMATIONS_ID", + "description": [], + "signature": [ + "\"accessibility:disableAnimations\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.AUTOCOMPLETE_USE_TIME_RANGE_ID", + "type": "string", + "tags": [], + "label": "AUTOCOMPLETE_USE_TIME_RANGE_ID", + "description": [], + "signature": [ + "\"autocomplete:useTimeRange\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.AUTOCOMPLETE_VALUE_SUGGESTION_METHOD_ID", + "type": "string", + "tags": [], + "label": "AUTOCOMPLETE_VALUE_SUGGESTION_METHOD_ID", + "description": [], + "signature": [ + "\"autocomplete:valueSuggestionMethod\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.BANNERS_BACKGROUND_COLOR_ID", + "type": "string", + "tags": [], + "label": "BANNERS_BACKGROUND_COLOR_ID", + "description": [], + "signature": [ + "\"banners:backgroundColor\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.BANNERS_PLACEMENT_ID", + "type": "string", + "tags": [], + "label": "BANNERS_PLACEMENT_ID", + "description": [], + "signature": [ + "\"banners:placement\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.BANNERS_TEXT_COLOR_ID", + "type": "string", + "tags": [], + "label": "BANNERS_TEXT_COLOR_ID", + "description": [], + "signature": [ + "\"banners:textColor\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.BANNERS_TEXT_CONTENT_ID", + "type": "string", + "tags": [], + "label": "BANNERS_TEXT_CONTENT_ID", + "description": [], + "signature": [ + "\"banners:textContent\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.CONTEXT_DEFAULT_SIZE_ID", + "type": "string", + "tags": [], + "label": "CONTEXT_DEFAULT_SIZE_ID", + "description": [], + "signature": [ + "\"context:defaultSize\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.CONTEXT_STEP_ID", + "type": "string", + "tags": [], + "label": "CONTEXT_STEP_ID", + "description": [], + "signature": [ + "\"context:step\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.CONTEXT_TIE_BREAKER_FIELDS_ID", + "type": "string", + "tags": [], + "label": "CONTEXT_TIE_BREAKER_FIELDS_ID", + "description": [], + "signature": [ + "\"context:tieBreakerFields\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.COURIER_CUSTOM_REQUEST_PREFERENCE_ID", + "type": "string", + "tags": [], + "label": "COURIER_CUSTOM_REQUEST_PREFERENCE_ID", + "description": [], + "signature": [ + "\"courier:customRequestPreference\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX_ID", + "type": "string", + "tags": [], + "label": "COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX_ID", + "description": [], + "signature": [ + "\"courier:ignoreFilterIfFieldNotInIndex\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.COURIER_MAX_CONCURRENT_SHARD_REQUEST_ID", + "type": "string", + "tags": [], + "label": "COURIER_MAX_CONCURRENT_SHARD_REQUEST_ID", + "description": [], + "signature": [ + "\"courier:maxConcurrentShardRequests\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.COURIER_SET_REQUEST_PREFERENCE_ID", + "type": "string", + "tags": [], + "label": "COURIER_SET_REQUEST_PREFERENCE_ID", + "description": [], + "signature": [ + "\"courier:setRequestPreference\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.CSV_QUOTE_VALUES_ID", + "type": "string", + "tags": [], + "label": "CSV_QUOTE_VALUES_ID", + "description": [], + "signature": [ + "\"csv:quoteValues\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.CSV_SEPARATOR_ID", + "type": "string", + "tags": [], + "label": "CSV_SEPARATOR_ID", + "description": [], + "signature": [ + "\"csv:separator\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DATE_FORMAT_DOW_ID", + "type": "string", + "tags": [], + "label": "DATE_FORMAT_DOW_ID", + "description": [], + "signature": [ + "\"dateFormat:dow\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DATE_FORMAT_ID", + "type": "string", + "tags": [], + "label": "DATE_FORMAT_ID", + "description": [], + "signature": [ + "\"dateFormat\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DATE_FORMAT_NANOS_ID", + "type": "string", + "tags": [], + "label": "DATE_FORMAT_NANOS_ID", + "description": [], + "signature": [ + "\"dateNanosFormat\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DATE_FORMAT_SCALED_ID", + "type": "string", + "tags": [], + "label": "DATE_FORMAT_SCALED_ID", + "description": [], + "signature": [ + "\"dateFormat:scaled\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DATE_FORMAT_TZ_ID", + "type": "string", + "tags": [], + "label": "DATE_FORMAT_TZ_ID", + "description": [], + "signature": [ + "\"dateFormat:tz\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DEFAULT_COLUMNS_ID", + "type": "string", + "tags": [], + "label": "DEFAULT_COLUMNS_ID", + "description": [], + "signature": [ + "\"defaultColumns\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DEFAULT_INDEX_ID", + "type": "string", + "tags": [], + "label": "DEFAULT_INDEX_ID", + "description": [], + "signature": [ + "\"defaultIndex\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DEFAULT_ROUTE_ID", + "type": "string", + "tags": [], + "label": "DEFAULT_ROUTE_ID", + "description": [], + "signature": [ + "\"defaultRoute\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISABLE_BATCH_COMPRESSION_ID", + "type": "string", + "tags": [], + "label": "DISABLE_BATCH_COMPRESSION_ID", + "description": [], + "signature": [ + "\"bfetch:disableCompression\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISABLE_REQUEST_BATCHING_ID", + "type": "string", + "tags": [], + "label": "DISABLE_REQUEST_BATCHING_ID", + "description": [], + "signature": [ + "\"bfetch:disable\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_ENABLE_SQL_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_ENABLE_SQL_ID", + "description": [], + "signature": [ + "\"discover:enableSql\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_MAX_DOC_FIELDS_DISPLAYED_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_MAX_DOC_FIELDS_DISPLAYED_ID", + "description": [], + "signature": [ + "\"discover:maxDocFieldsDisplayed\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_MODIFY_COLUMNS_ON_SWITCH_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_MODIFY_COLUMNS_ON_SWITCH_ID", + "description": [], + "signature": [ + "\"discover:modifyColumnsOnSwitch\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_ROW_HEIGHT_OPTION_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_ROW_HEIGHT_OPTION_ID", + "description": [], + "signature": [ + "\"discover:rowHeightOption\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_SAMPLE_ROWS_PER_PAGE_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_SAMPLE_ROWS_PER_PAGE_ID", + "description": [], + "signature": [ + "\"discover:sampleRowsPerPage\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_SAMPLE_SIZE_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_SAMPLE_SIZE_ID", + "description": [], + "signature": [ + "\"discover:sampleSize\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_SEARCH_FIELDS_FROM_SOURCE_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_SEARCH_FIELDS_FROM_SOURCE_ID", + "description": [], + "signature": [ + "\"discover:searchFieldsFromSource\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_SEARCH_ON_PAGE_LOAD_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_SEARCH_ON_PAGE_LOAD_ID", + "description": [], + "signature": [ + "\"discover:searchOnPageLoad\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_SHOW_FIELD_STATISTICS_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_SHOW_FIELD_STATISTICS_ID", + "description": [], + "signature": [ + "\"discover:showFieldStatistics\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_SHOW_LEGACY_FIELD_TOP_VALUES_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_SHOW_LEGACY_FIELD_TOP_VALUES_ID", + "description": [], + "signature": [ + "\"discover:showLegacyFieldTopValues\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_SHOW_MULTI_FIELDS_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_SHOW_MULTI_FIELDS_ID", + "description": [], + "signature": [ + "\"discover:showMultiFields\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DISCOVER_SORT_DEFAULT_ORDER_ID", + "type": "string", + "tags": [], + "label": "DISCOVER_SORT_DEFAULT_ORDER_ID", + "description": [], + "signature": [ + "\"discover:sort:defaultOrder\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DOC_TABLE_HIDE_TIME_COLUMNS_ID", + "type": "string", + "tags": [], + "label": "DOC_TABLE_HIDE_TIME_COLUMNS_ID", + "description": [], + "signature": [ + "\"doc_table:hideTimeColumn\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DOC_TABLE_HIGHLIGHT_ID", + "type": "string", + "tags": [], + "label": "DOC_TABLE_HIGHLIGHT_ID", + "description": [], + "signature": [ + "\"doc_table:highlight\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.DOC_TABLE_LEGACY_ID", + "type": "string", + "tags": [], + "label": "DOC_TABLE_LEGACY_ID", + "description": [], + "signature": [ + "\"doc_table:legacy\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FIELDS_POPULAR_LIMIT_ID", + "type": "string", + "tags": [], + "label": "FIELDS_POPULAR_LIMIT_ID", + "description": [], + "signature": [ + "\"fields:popularLimit\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FILE_UPLOAD_MAX_SIZE_ID", + "type": "string", + "tags": [], + "label": "FILE_UPLOAD_MAX_SIZE_ID", + "description": [], + "signature": [ + "\"fileUpload:maxFileSize\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FILTER_EDITOR_SUGGEST_VALUES_ID", + "type": "string", + "tags": [], + "label": "FILTER_EDITOR_SUGGEST_VALUES_ID", + "description": [], + "signature": [ + "\"filterEditor:suggestValues\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FILTERS_PINNED_BY_DEFAULT_ID", + "type": "string", + "tags": [], + "label": "FILTERS_PINNED_BY_DEFAULT_ID", + "description": [], + "signature": [ + "\"filters:pinnedByDefault\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FORMAT_BYTES_DEFAULT_PATTERN_ID", + "type": "string", + "tags": [], + "label": "FORMAT_BYTES_DEFAULT_PATTERN_ID", + "description": [], + "signature": [ + "\"format:bytes:defaultPattern\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FORMAT_CURRENCY_DEFAULT_PATTERN_ID", + "type": "string", + "tags": [], + "label": "FORMAT_CURRENCY_DEFAULT_PATTERN_ID", + "description": [], + "signature": [ + "\"format:currency:defaultPattern\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FORMAT_DEFAULT_TYPE_MAP_ID", + "type": "string", + "tags": [], + "label": "FORMAT_DEFAULT_TYPE_MAP_ID", + "description": [], + "signature": [ + "\"format:defaultTypeMap\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FORMAT_NUMBER_DEFAULT_LOCALE_ID", + "type": "string", + "tags": [], + "label": "FORMAT_NUMBER_DEFAULT_LOCALE_ID", + "description": [], + "signature": [ + "\"format:number:defaultLocale\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FORMAT_NUMBER_DEFAULT_PATTERN_ID", + "type": "string", + "tags": [], + "label": "FORMAT_NUMBER_DEFAULT_PATTERN_ID", + "description": [], + "signature": [ + "\"format:number:defaultPattern\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.FORMAT_PERCENT_DEFAULT_PATTERN_ID", + "type": "string", + "tags": [], + "label": "FORMAT_PERCENT_DEFAULT_PATTERN_ID", + "description": [], + "signature": [ + "\"format:percent:defaultPattern\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.HIDE_ANNOUNCEMENTS_ID", + "type": "string", + "tags": [], + "label": "HIDE_ANNOUNCEMENTS_ID", + "description": [], + "signature": [ + "\"hideAnnouncements\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.HISTOGRAM_BAR_TARGET_ID", + "type": "string", + "tags": [], + "label": "HISTOGRAM_BAR_TARGET_ID", + "description": [], + "signature": [ + "\"histogram:barTarget\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.HISTOGRAM_MAX_BARS_ID", + "type": "string", + "tags": [], + "label": "HISTOGRAM_MAX_BARS_ID", + "description": [], + "signature": [ + "\"histogram:maxBars\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.HISTORY_LIMIT_ID", + "type": "string", + "tags": [], + "label": "HISTORY_LIMIT_ID", + "description": [], + "signature": [ + "\"history:limit\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.LABS_CANVAS_BY_VALUE_EMBEDDABLE_ID", + "type": "string", + "tags": [], + "label": "LABS_CANVAS_BY_VALUE_EMBEDDABLE_ID", + "description": [], + "signature": [ + "\"labs:canvas:byValueEmbeddable\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.LABS_CANVAS_ENABLE_UI_ID", + "type": "string", + "tags": [], + "label": "LABS_CANVAS_ENABLE_UI_ID", + "description": [], + "signature": [ + "\"labs:canvas:enable_ui\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.LABS_DASHBOARD_CONTROLS_ID", + "type": "string", + "tags": [], + "label": "LABS_DASHBOARD_CONTROLS_ID", + "description": [], + "signature": [ + "\"labs:dashboard:dashboardControls\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.LABS_DASHBOARD_DEFER_BELOW_FOLD_ID", + "type": "string", + "tags": [], + "label": "LABS_DASHBOARD_DEFER_BELOW_FOLD_ID", + "description": [], + "signature": [ + "\"labs:dashboard:deferBelowFold\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.LABS_DASHBOARDS_ENABLE_UI_ID", + "type": "string", + "tags": [], + "label": "LABS_DASHBOARDS_ENABLE_UI_ID", + "description": [], + "signature": [ + "\"labs:dashboard:enable_ui\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.META_FIELDS_ID", + "type": "string", + "tags": [], + "label": "META_FIELDS_ID", + "description": [], + "signature": [ + "\"metaFields\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.METRICS_ALLOW_CHECKING_FOR_FAILED_SHARDS_ID", + "type": "string", + "tags": [], + "label": "METRICS_ALLOW_CHECKING_FOR_FAILED_SHARDS_ID", + "description": [], + "signature": [ + "\"metrics:allowCheckingForFailedShards\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.METRICS_ALLOW_STRING_INDICES_ID", + "type": "string", + "tags": [], + "label": "METRICS_ALLOW_STRING_INDICES_ID", + "description": [], + "signature": [ + "\"metrics:allowStringIndices\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.METRICS_MAX_BUCKETS_ID", + "type": "string", + "tags": [], + "label": "METRICS_MAX_BUCKETS_ID", + "description": [], + "signature": [ + "\"metrics:max_buckets\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.ML_ANOMALY_DETECTION_RESULTS_ENABLE_TIME_DEFAULTS_ID", + "type": "string", + "tags": [], + "label": "ML_ANOMALY_DETECTION_RESULTS_ENABLE_TIME_DEFAULTS_ID", + "description": [], + "signature": [ + "\"ml:anomalyDetection:results:enableTimeDefaults\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.ML_ANOMALY_DETECTION_RESULTS_TIME_DEFAULTS_ID", + "type": "string", + "tags": [], + "label": "ML_ANOMALY_DETECTION_RESULTS_TIME_DEFAULTS_ID", + "description": [], + "signature": [ + "\"ml:anomalyDetection:results:timeDefaults\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.NOTIFICATIONS_BANNER_ID", + "type": "string", + "tags": [], + "label": "NOTIFICATIONS_BANNER_ID", + "description": [], + "signature": [ + "\"notifications:banner\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.NOTIFICATIONS_LIFETIME_BANNER_ID", + "type": "string", + "tags": [], + "label": "NOTIFICATIONS_LIFETIME_BANNER_ID", + "description": [], + "signature": [ + "\"notifications:lifetime:banner\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.NOTIFICATIONS_LIFETIME_ERROR_ID", + "type": "string", + "tags": [], + "label": "NOTIFICATIONS_LIFETIME_ERROR_ID", + "description": [], + "signature": [ + "\"notifications:lifetime:error\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.NOTIFICATIONS_LIFETIME_INFO_ID", + "type": "string", + "tags": [], + "label": "NOTIFICATIONS_LIFETIME_INFO_ID", + "description": [], + "signature": [ + "\"notifications:lifetime:info\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.NOTIFICATIONS_LIFETIME_WARNING_ID", + "type": "string", + "tags": [], + "label": "NOTIFICATIONS_LIFETIME_WARNING_ID", + "description": [], + "signature": [ + "\"notifications:lifetime:warning\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_AGENT_EXPLORER_VIEW_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_AGENT_EXPLORER_VIEW_ID", + "description": [], + "signature": [ + "\"observability:apmAgentExplorerView\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_AWS_LAMBDA_PRICE_FACTOR_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_AWS_LAMBDA_PRICE_FACTOR_ID", + "description": [], + "signature": [ + "\"observability:apmAWSLambdaPriceFactor\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_AWS_LAMBDA_REQUEST_COST_PER_MILLION_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_AWS_LAMBDA_REQUEST_COST_PER_MILLION_ID", + "description": [], + "signature": [ + "\"observability:apmAWSLambdaRequestCostPerMillion\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_DEFAULT_SERVICE_ENVIRONMENT_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_DEFAULT_SERVICE_ENVIRONMENT_ID", + "description": [], + "signature": [ + "\"observability:apmDefaultServiceEnvironment\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_ENABLE_CRITICAL_PATH_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_ENABLE_CRITICAL_PATH_ID", + "description": [], + "signature": [ + "\"observability:apmEnableCriticalPath\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_LABS_BUTTON_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_LABS_BUTTON_ID", + "description": [], + "signature": [ + "\"observability:apmLabsButton\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_PROGRESSIVE_LOADING_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_PROGRESSIVE_LOADING_ID", + "description": [], + "signature": [ + "\"observability:apmProgressiveLoading\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_SERVICE_GROUP_MAX_NUMBER_OF_SERVCIE_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_SERVICE_GROUP_MAX_NUMBER_OF_SERVCIE_ID", + "description": [], + "signature": [ + "\"observability:apmServiceGroupMaxNumberOfServices\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_SERVICE_INVENTORY_OPTIMIZED_SORTING_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_SERVICE_INVENTORY_OPTIMIZED_SORTING_ID", + "description": [], + "signature": [ + "\"observability:apmServiceInventoryOptimizedSorting\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_APM_TRACE_EXPLORER_TAB_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_APM_TRACE_EXPLORER_TAB_ID", + "description": [], + "signature": [ + "\"observability:apmTraceExplorerTab\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_ENABLE_AWS_LAMBDA_METRICS_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_ENABLE_AWS_LAMBDA_METRICS_ID", + "description": [], + "signature": [ + "\"observability:enableAwsLambdaMetrics\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_ENABLE_COMPARISON_BY_DEFAULT_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_ENABLE_COMPARISON_BY_DEFAULT_ID", + "description": [], + "signature": [ + "\"observability:enableComparisonByDefault\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_ENABLE_INFRASTRUCTURE_HOSTS_VIEW_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_ENABLE_INFRASTRUCTURE_HOSTS_VIEW_ID", + "description": [], + "signature": [ + "\"observability:enableInfrastructureHostsView\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_ENABLE_INSPECT_ES_QUERIES_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_ENABLE_INSPECT_ES_QUERIES_ID", + "description": [], + "signature": [ + "\"observability:enableInspectEsQueries\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_MAX_SUGGESTIONS_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_MAX_SUGGESTIONS_ID", + "description": [], + "signature": [ + "\"observability:maxSuggestions\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.OBSERVABILITY_PROFILING_ELASTICSEARCH_PLUGIN_ID", + "type": "string", + "tags": [], + "label": "OBSERVABILITY_PROFILING_ELASTICSEARCH_PLUGIN_ID", + "description": [], + "signature": [ + "\"observability:profilingElasticsearchPlugin\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.QUERY_ALLOW_LEADING_WILDCARDS_ID", + "type": "string", + "tags": [], + "label": "QUERY_ALLOW_LEADING_WILDCARDS_ID", + "description": [], + "signature": [ + "\"query:allowLeadingWildcards\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.QUERY_STRING_OPTIONS_ID", + "type": "string", + "tags": [], + "label": "QUERY_STRING_OPTIONS_ID", + "description": [], + "signature": [ + "\"query:queryString:options\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.ROLLUPS_ENABLE_INDEX_PATTERNS_ID", + "type": "string", + "tags": [], + "label": "ROLLUPS_ENABLE_INDEX_PATTERNS_ID", + "description": [], + "signature": [ + "\"rollups.enableIndexPatterns\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SAVED_OBJECTS_LISTING_LIMIT_ID", + "type": "string", + "tags": [], + "label": "SAVED_OBJECTS_LISTING_LIMIT_ID", + "description": [], + "signature": [ + "\"savedObjects:listingLimit\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SAVED_OBJECTS_PER_PAGE_ID", + "type": "string", + "tags": [], + "label": "SAVED_OBJECTS_PER_PAGE_ID", + "description": [], + "signature": [ + "\"savedObjects:perPage\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SEARCH_INCLUDE_FROZEN_ID", + "type": "string", + "tags": [], + "label": "SEARCH_INCLUDE_FROZEN_ID", + "description": [], + "signature": [ + "\"search:includeFrozen\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SEARCH_QUERY_LANGUAGE_ID", + "type": "string", + "tags": [], + "label": "SEARCH_QUERY_LANGUAGE_ID", + "description": [], + "signature": [ + "\"search:queryLanguage\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SEARCH_TIMEOUT_ID", + "type": "string", + "tags": [], + "label": "SEARCH_TIMEOUT_ID", + "description": [], + "signature": [ + "\"search:timeout\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_DEFAULT_ANOMALY_SCORE_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_DEFAULT_ANOMALY_SCORE_ID", + "description": [], + "signature": [ + "\"securitySolution:defaultAnomalyScore\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_DEFAULT_INDEX_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_DEFAULT_INDEX_ID", + "description": [], + "signature": [ + "\"securitySolution:defaultIndex\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_DEFAULT_THREAT_INDEX_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_DEFAULT_THREAT_INDEX_ID", + "description": [], + "signature": [ + "\"securitySolution:defaultThreatIndex\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_ENABLE_CCS_WARNING_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_ENABLE_CCS_WARNING_ID", + "description": [], + "signature": [ + "\"securitySolution:enableCcsWarning\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_ENABLE_GROUPED_NAV_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_ENABLE_GROUPED_NAV_ID", + "description": [], + "signature": [ + "\"securitySolution:enableGroupedNav\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_ENABLE_NEWS_FEED_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_ENABLE_NEWS_FEED_ID", + "description": [], + "signature": [ + "\"securitySolution:enableNewsFeed\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_IP_REPUTATION_LINKS_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_IP_REPUTATION_LINKS_ID", + "description": [], + "signature": [ + "\"securitySolution:ipReputationLinks\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_NEWS_FEED_URL_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_NEWS_FEED_URL_ID", + "description": [], + "signature": [ + "\"securitySolution:newsFeedUrl\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_REFRESH_INTERVAL_DEFAULTS_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_REFRESH_INTERVAL_DEFAULTS_ID", + "description": [], + "signature": [ + "\"securitySolution:refreshIntervalDefaults\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_RULES_TABLE_REFRESH_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_RULES_TABLE_REFRESH_ID", + "description": [], + "signature": [ + "\"securitySolution:rulesTableRefresh\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID", + "description": [], + "signature": [ + "\"securitySolution:showRelatedIntegrations\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SECURITY_SOLUTION_TIME_DEFAULTS_ID", + "type": "string", + "tags": [], + "label": "SECURITY_SOLUTION_TIME_DEFAULTS_ID", + "description": [], + "signature": [ + "\"securitySolution:timeDefaults\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SHORT_DOTS_ENABLE_ID", + "type": "string", + "tags": [], + "label": "SHORT_DOTS_ENABLE_ID", + "description": [], + "signature": [ + "\"shortDots:enable\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.SORT_OPTIONS_ID", + "type": "string", + "tags": [], + "label": "SORT_OPTIONS_ID", + "description": [], + "signature": [ + "\"sort:options\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.STATE_STORE_IN_SESSION_STORAGE_ID", + "type": "string", + "tags": [], + "label": "STATE_STORE_IN_SESSION_STORAGE_ID", + "description": [], + "signature": [ + "\"state:storeInSessionStorage\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.THEME_DARK_MODE_ID", + "type": "string", + "tags": [], + "label": "THEME_DARK_MODE_ID", + "description": [], + "signature": [ + "\"theme:darkMode\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.TIMELION_ES_DEFAULT_INDEX_ID", + "type": "string", + "tags": [], + "label": "TIMELION_ES_DEFAULT_INDEX_ID", + "description": [], + "signature": [ + "\"timelion:es.default_index\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.TIMELION_ES_TIME_FIELD_ID", + "type": "string", + "tags": [], + "label": "TIMELION_ES_TIME_FIELD_ID", + "description": [], + "signature": [ + "\"timelion:es.timefield\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.TIMELION_MAX_BUCKETS_ID", + "type": "string", + "tags": [], + "label": "TIMELION_MAX_BUCKETS_ID", + "description": [], + "signature": [ + "\"timelion:max_buckets\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.TIMELION_MIN_INTERVAL_ID", + "type": "string", + "tags": [], + "label": "TIMELION_MIN_INTERVAL_ID", + "description": [], + "signature": [ + "\"timelion:min_interval\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.TIMELION_TARGET_BUCKETS_ID", + "type": "string", + "tags": [], + "label": "TIMELION_TARGET_BUCKETS_ID", + "description": [], + "signature": [ + "\"timelion:target_buckets\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.TIMEPICKER_QUICK_RANGES_ID", + "type": "string", + "tags": [], + "label": "TIMEPICKER_QUICK_RANGES_ID", + "description": [], + "signature": [ + "\"timepicker:quickRanges\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.TIMEPICKER_REFRESH_INTERVAL_DEFAULTS_ID", + "type": "string", + "tags": [], + "label": "TIMEPICKER_REFRESH_INTERVAL_DEFAULTS_ID", + "description": [], + "signature": [ + "\"timepicker:refreshIntervalDefaults\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.TIMEPICKER_TIME_DEFAULTS_ID", + "type": "string", + "tags": [], + "label": "TIMEPICKER_TIME_DEFAULTS_ID", + "description": [], + "signature": [ + "\"timepicker:timeDefaults\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.TRUNCATE_MAX_HEIGHT_ID", + "type": "string", + "tags": [], + "label": "TRUNCATE_MAX_HEIGHT_ID", + "description": [], + "signature": [ + "\"truncate:maxHeight\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.VISUALIZATION_COLOR_MAPPING_ID", + "type": "string", + "tags": [], + "label": "VISUALIZATION_COLOR_MAPPING_ID", + "description": [], + "signature": [ + "\"visualization:colorMapping\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.VISUALIZATION_ENABLE_LABS_ID", + "type": "string", + "tags": [], + "label": "VISUALIZATION_ENABLE_LABS_ID", + "description": [], + "signature": [ + "\"visualize:enableLabs\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.VISUALIZATION_HEATMAP_MAX_BUCKETS_ID", + "type": "string", + "tags": [], + "label": "VISUALIZATION_HEATMAP_MAX_BUCKETS_ID", + "description": [], + "signature": [ + "\"visualization:heatmap:maxBuckets\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.VISUALIZATION_LEGACY_GAUGE_CHARTS_LIBRARY_ID", + "type": "string", + "tags": [], + "label": "VISUALIZATION_LEGACY_GAUGE_CHARTS_LIBRARY_ID", + "description": [], + "signature": [ + "\"visualization:visualize:legacyGaugeChartsLibrary\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.VISUALIZATION_LEGACY_HEATMAP_CHARTS_LIBRARY_ID", + "type": "string", + "tags": [], + "label": "VISUALIZATION_LEGACY_HEATMAP_CHARTS_LIBRARY_ID", + "description": [], + "signature": [ + "\"visualization:visualize:legacyHeatmapChartsLibrary\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.VISUALIZATION_USE_LEGACY_TIME_AXIS_ID", + "type": "string", + "tags": [], + "label": "VISUALIZATION_USE_LEGACY_TIME_AXIS_ID", + "description": [], + "signature": [ + "\"visualization:useLegacyTimeAxis\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-ids", + "id": "def-common.XPACK_REPORTING_CUSTOM_PDF_LOGO_ID", + "type": "string", + "tags": [], + "label": "XPACK_REPORTING_CUSTOM_PDF_LOGO_ID", + "description": [], + "signature": [ + "\"xpackReporting:customPdfLogo\"" + ], + "path": "packages/kbn-management/settings/setting_ids/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx new file mode 100644 index 0000000000000..5b79473f1f83d --- /dev/null +++ b/api_docs/kbn_management_settings_ids.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnManagementSettingsIdsPluginApi +slug: /kibana-dev-docs/api/kbn-management-settings-ids +title: "@kbn/management-settings-ids" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/management-settings-ids plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] +--- +import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; + + + +Contact [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 127 | 0 | 127 | 0 | + +## Common + +### Consts, variables and types + + diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index bd9929305278c..03b7078179654 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.devdocs.json b/api_docs/kbn_management_settings_types.devdocs.json new file mode 100644 index 0000000000000..e9c76c4189fca --- /dev/null +++ b/api_docs/kbn_management_settings_types.devdocs.json @@ -0,0 +1,1523 @@ +{ + "id": "@kbn/management-settings-types", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition", + "type": "Interface", + "tags": [], + "label": "FieldDefinition", + "description": [ + "\nA {@link FieldDefinition} adapts a {@link UiSettingMetadata} object to be more\neasily consumed by the UI. It contains additional information about the field\nthat is determined from a given UiSettingMetadata object, (which is a type\nrepresenting a UiSetting)." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.ariaAttributes", + "type": "Object", + "tags": [], + "label": "ariaAttributes", + "description": [ + "UX ARIA attributes derived from the setting." + ], + "signature": [ + "{ ariaLabel: string; ariaDescribedBy?: string | undefined; }" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.categories", + "type": "Array", + "tags": [], + "label": "categories", + "description": [ + "A list of categories related to the field." + ], + "signature": [ + "string[]" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.defaultValue", + "type": "Uncategorized", + "tags": [], + "label": "defaultValue", + "description": [ + "The default value of the field from Kibana." + ], + "signature": [ + "V | undefined" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.defaultValueDisplay", + "type": "string", + "tags": [], + "label": "defaultValueDisplay", + "description": [ + "The text-based display of the default value, for use in the UI." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.deprecation", + "type": "Object", + "tags": [ + "see" + ], + "label": "deprecation", + "description": [ + "\nDeprecation information for the field" + ], + "signature": [ + { + "pluginId": "@kbn/core-ui-settings-common", + "scope": "common", + "docId": "kibKbnCoreUiSettingsCommonPluginApi", + "section": "def-common.DeprecationSettings", + "text": "DeprecationSettings" + }, + " | undefined" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [ + "A description of the field." + ], + "signature": [ + "string | React.ReactElement> | undefined" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.displayName", + "type": "string", + "tags": [], + "label": "displayName", + "description": [ + "The name of the field suitable for display in the UX." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.groupId", + "type": "string", + "tags": [], + "label": "groupId", + "description": [ + "The grouping identifier for the field." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.id", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "The unique identifier of the field, typically separated by `:`" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.isCustom", + "type": "boolean", + "tags": [], + "label": "isCustom", + "description": [ + "True if the field is a custom setting, false otherwise." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.isDefaultValue", + "type": "boolean", + "tags": [], + "label": "isDefaultValue", + "description": [ + "True if the current saved setting matches the default setting." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.isOverridden", + "type": "boolean", + "tags": [], + "label": "isOverridden", + "description": [ + "True if the setting is overridden in Kibana, false otherwise." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.isReadOnly", + "type": "boolean", + "tags": [], + "label": "isReadOnly", + "description": [ + "True if the setting is read-only, false otherwise." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.metric", + "type": "Object", + "tags": [], + "label": "metric", + "description": [ + "Metric information when one interacts with the field." + ], + "signature": [ + "{ name?: string | undefined; type?: string | undefined; } | undefined" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "The name of the field suitable for use in the UX." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.options", + "type": "Object", + "tags": [], + "label": "options", + "description": [ + "Option information if the field represents a `select` setting." + ], + "signature": [ + "{ values: string[] | number[]; labels: Record; } | undefined" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.order", + "type": "number", + "tags": [], + "label": "order", + "description": [ + "A rank order for the field relative to other fields." + ], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.requiresPageReload", + "type": "boolean", + "tags": [], + "label": "requiresPageReload", + "description": [ + "True if the browser must be reloaded for the setting to take effect, false otherwise." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.savedValue", + "type": "Uncategorized", + "tags": [], + "label": "savedValue", + "description": [ + "The current saved value of the setting." + ], + "signature": [ + "V | undefined" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.type", + "type": "Uncategorized", + "tags": [ + "see" + ], + "label": "type", + "description": [ + "\nThe type of setting the field represents." + ], + "signature": [ + "T" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.FieldDefinition.unsavedFieldId", + "type": "string", + "tags": [], + "label": "unsavedFieldId", + "description": [ + "An identifier of the field when it has an unsaved change." + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SelectFieldDefinition", + "type": "Interface", + "tags": [], + "label": "SelectFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `select` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.SelectFieldDefinition", + "text": "SelectFieldDefinition" + }, + " extends ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"select\", string | null>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SelectFieldDefinition.options", + "type": "Object", + "tags": [], + "label": "options", + "description": [ + "Options are required when this definition is used." + ], + "signature": [ + "{ values: string[] | number[]; labels: Record; }" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UiSettingMetadata", + "type": "Interface", + "tags": [], + "label": "UiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} type, whose fields\nare not only optional, but also not strongly typed to\n{@link @kbn/core-ui-settings-common#UiSettingsType}.\n" + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + " extends UiSetting" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UiSettingMetadata.type", + "type": "Uncategorized", + "tags": [ + "see" + ], + "label": "type", + "description": [ + "\nThe type of setting being represented." + ], + "signature": [ + "T" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UiSettingMetadata.value", + "type": "Uncategorized", + "tags": [], + "label": "value", + "description": [ + "The default value in Kibana for the setting." + ], + "signature": [ + "V | undefined" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UiSettingMetadata.userValue", + "type": "Uncategorized", + "tags": [], + "label": "userValue", + "description": [ + "The value saved by the user." + ], + "signature": [ + "V | undefined" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UnsavedFieldChange", + "type": "Interface", + "tags": [], + "label": "UnsavedFieldChange", + "description": [ + "\nA {@link UnsavedFieldChange} represents local changes to a field that have not\nyet been saved." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UnsavedFieldChange.type", + "type": "Uncategorized", + "tags": [ + "see" + ], + "label": "type", + "description": [ + "\nThe type of setting." + ], + "signature": [ + "T" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UnsavedFieldChange.error", + "type": "CompoundType", + "tags": [], + "label": "error", + "description": [ + "An error message, if any, from the change." + ], + "signature": [ + "string | null | undefined" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UnsavedFieldChange.isInvalid", + "type": "CompoundType", + "tags": [], + "label": "isInvalid", + "description": [ + "True if the change is invalid for the field, false otherwise." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UnsavedFieldChange.unsavedValue", + "type": "CompoundType", + "tags": [], + "label": "unsavedValue", + "description": [ + "The current unsaved value stored in the field." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.KnownTypeToValue", + "text": "KnownTypeToValue" + }, + " | null | undefined" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ArrayFieldDefinition", + "type": "Type", + "tags": [], + "label": "ArrayFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `array` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"array\", (string | number)[] | null>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ArraySettingType", + "type": "Type", + "tags": [], + "label": "ArraySettingType", + "description": [ + "\nA narrowing type representing all {@link SettingType} values that correspond\nto an `array` primitive type value." + ], + "signature": [ + "\"array\"" + ], + "path": "packages/kbn-management/settings/types/setting_type.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ArrayUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "ArrayUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `array` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"array\", (string | number)[] | null>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ArrayUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "ArrayUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `number` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"array\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.BooleanFieldDefinition", + "type": "Type", + "tags": [], + "label": "BooleanFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `boolean` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"boolean\", boolean | null>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.BooleanSettingType", + "type": "Type", + "tags": [], + "label": "BooleanSettingType", + "description": [ + "\nA narrowing type representing all {@link SettingType} values that correspond\nto an `boolean` primitive type value." + ], + "signature": [ + "\"boolean\"" + ], + "path": "packages/kbn-management/settings/types/setting_type.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.BooleanUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "BooleanUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `boolean` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"boolean\", boolean | null>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.BooleanUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "BooleanUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `boolean` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"boolean\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ColorFieldDefinition", + "type": "Type", + "tags": [], + "label": "ColorFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `color` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"color\", string | null>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ColorUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "ColorUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `color` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"color\", string | null>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ColorUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "ColorUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `color` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"color\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ImageFieldDefinition", + "type": "Type", + "tags": [], + "label": "ImageFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `image` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"image\", string | null>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ImageUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "ImageUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `image` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"image\", string | null>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.ImageUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "ImageUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `image` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"image\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.JsonFieldDefinition", + "type": "Type", + "tags": [], + "label": "JsonFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `json` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"json\", string | null>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.JsonUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "JsonUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `json` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"json\", string | null>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.JsonUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "JsonUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `json` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"json\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.KnownTypeToMetadata", + "type": "Type", + "tags": [], + "label": "KnownTypeToMetadata", + "description": [ + "\nThis is a narrowing type, which finds the correct {@link UiSettingMetadata}\ntype based on a given {@link SettingType}." + ], + "signature": [ + "T extends \"array\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.ArrayUiSettingMetadata", + "text": "ArrayUiSettingMetadata" + }, + " : T extends \"boolean\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.BooleanUiSettingMetadata", + "text": "BooleanUiSettingMetadata" + }, + " : T extends \"color\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.ColorUiSettingMetadata", + "text": "ColorUiSettingMetadata" + }, + " : T extends \"image\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.ImageUiSettingMetadata", + "text": "ImageUiSettingMetadata" + }, + " : T extends \"json\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.JsonUiSettingMetadata", + "text": "JsonUiSettingMetadata" + }, + " : T extends \"markdown\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.MarkdownUiSettingMetadata", + "text": "MarkdownUiSettingMetadata" + }, + " : T extends \"number\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.NumberUiSettingMetadata", + "text": "NumberUiSettingMetadata" + }, + " : T extends \"select\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.SelectUiSettingMetadata", + "text": "SelectUiSettingMetadata" + }, + " : T extends \"string\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.StringUiSettingMetadata", + "text": "StringUiSettingMetadata" + }, + " : T extends \"undefined\" ? ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UndefinedUiSettingMetadata", + "text": "UndefinedUiSettingMetadata" + }, + " : never" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.KnownTypeToValue", + "type": "Type", + "tags": [], + "label": "KnownTypeToValue", + "description": [ + "\nThis is a narrowing type, which finds the correct primitive type based on a\ngiven {@link SettingType}." + ], + "signature": [ + "T extends \"string\" | \"color\" | \"image\" | \"select\" | \"json\" | \"markdown\" ? string : T extends \"boolean\" ? boolean : T extends \"number\" | \"bigint\" ? number : T extends \"array\" ? (string | number)[] : T extends \"undefined\" ? undefined : never" + ], + "path": "packages/kbn-management/settings/types/setting_type.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.MarkdownFieldDefinition", + "type": "Type", + "tags": [], + "label": "MarkdownFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `markdown` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"markdown\", string | null>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.MarkdownUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "MarkdownUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `markdown` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"markdown\", string | null>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.MarkdownUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "MarkdownUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `markdown` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"markdown\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.NumberFieldDefinition", + "type": "Type", + "tags": [], + "label": "NumberFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `number` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"number\", number | null>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.NumberSettingType", + "type": "Type", + "tags": [], + "label": "NumberSettingType", + "description": [ + "\nA narrowing type representing all {@link SettingType} values that correspond\nto an `number` primitive type value." + ], + "signature": [ + "\"number\"" + ], + "path": "packages/kbn-management/settings/types/setting_type.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.NumberUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "NumberUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `number` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"number\", number | null>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.NumberUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "NumberUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `number` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"number\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SelectUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "SelectUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `select` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"select\", string | null>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SelectUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "SelectUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `select` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"select\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.SettingType", + "type": "Type", + "tags": [], + "label": "SettingType", + "description": [ + "\nThis is a local type equivalent to {@link UiSettingsType} for flexibility." + ], + "signature": [ + "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"image\" | \"select\" | \"json\" | \"markdown\" | \"array\"" + ], + "path": "packages/kbn-management/settings/types/setting_type.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.StringFieldDefinition", + "type": "Type", + "tags": [], + "label": "StringFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `string` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"string\", string | null>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.StringSettingType", + "type": "Type", + "tags": [], + "label": "StringSettingType", + "description": [ + "\nA narrowing type representing all {@link SettingType} values that correspond\nto an `string` primitive type value." + ], + "signature": [ + "\"string\" | \"color\" | \"image\" | \"select\" | \"json\" | \"markdown\"" + ], + "path": "packages/kbn-management/settings/types/setting_type.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.StringUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "StringUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `string` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"string\", string | null>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.StringUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "StringUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `string` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"string\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UndefinedFieldDefinition", + "type": "Type", + "tags": [], + "label": "UndefinedFieldDefinition", + "description": [ + "\nThis is a {@link FieldDefinition} representing {@link UiSetting} `undefined` type\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + "<\"undefined\", null | undefined>" + ], + "path": "packages/kbn-management/settings/types/field_definition.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UndefinedSettingType", + "type": "Type", + "tags": [], + "label": "UndefinedSettingType", + "description": [ + "\nA narrowing type representing all {@link SettingType} values that correspond\nto an `undefined` type value." + ], + "signature": [ + "\"undefined\"" + ], + "path": "packages/kbn-management/settings/types/setting_type.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UndefinedUiSettingMetadata", + "type": "Type", + "tags": [], + "label": "UndefinedUiSettingMetadata", + "description": [ + "\nThis is an type-safe abstraction over the {@link UiSetting} `undefined` type." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UiSettingMetadata", + "text": "UiSettingMetadata" + }, + "<\"undefined\", null | undefined>" + ], + "path": "packages/kbn-management/settings/types/metadata.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.UndefinedUnsavedFieldChange", + "type": "Type", + "tags": [], + "label": "UndefinedUnsavedFieldChange", + "description": [ + "\nThis is a {@link UnsavedFieldChange} representing an unsaved change to a\n{@link FieldDefinition} which has a {@link UiSetting} `undefined` value\nfor use in the UI." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + "<\"undefined\">" + ], + "path": "packages/kbn-management/settings/types/unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-types", + "id": "def-common.Value", + "type": "Type", + "tags": [], + "label": "Value", + "description": [ + "\nA type representing all possible values corresponding to a given {@link SettingType}." + ], + "signature": [ + "string | number | boolean | (string | number)[] | null | undefined" + ], + "path": "packages/kbn-management/settings/types/setting_type.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx new file mode 100644 index 0000000000000..6639e9367400c --- /dev/null +++ b/api_docs/kbn_management_settings_types.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnManagementSettingsTypesPluginApi +slug: /kibana-dev-docs/api/kbn-management-settings-types +title: "@kbn/management-settings-types" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/management-settings-types plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] +--- +import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; + + + +Contact [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 71 | 0 | 0 | 0 | + +## Common + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_management_settings_utilities.devdocs.json b/api_docs/kbn_management_settings_utilities.devdocs.json new file mode 100644 index 0000000000000..462a359ec8b85 --- /dev/null +++ b/api_docs/kbn_management_settings_utilities.devdocs.json @@ -0,0 +1,788 @@ +{ + "id": "@kbn/management-settings-utilities", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [ + "\nConvenience function that, given a {@link FieldDefinition} and an {@link UnsavedFieldChange},\nreturns the value to be displayed in the input field, and a boolean indicating whether the\nvalue is an unsaved value.\n" + ], + "signature": [ + "(field: F<\"array\">, change: C<\"array\">) => [string[], boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [ + "The field to compare." + ], + "signature": [ + "F<\"array\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [ + "The unsaved change to compare." + ], + "signature": [ + "C<\"array\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F<\"color\">, change: C<\"color\">) => [string, boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F<\"color\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C<\"color\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F<\"boolean\">, change: C<\"boolean\">) => [boolean, boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F<\"boolean\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C<\"boolean\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F<\"image\">, change: C<\"image\">) => [string, boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F<\"image\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C<\"image\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F<\"json\">, change: C<\"json\">) => [string, boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F<\"json\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C<\"json\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F<\"markdown\">, change: C<\"markdown\">) => [string, boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F<\"markdown\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C<\"markdown\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F<\"number\">, change: C<\"number\">) => [number, boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F<\"number\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C<\"number\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F<\"select\">, change: C<\"select\">) => [string, boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F<\"select\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C<\"select\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F<\"string\">, change: C<\"string\">) => [string, boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F<\"string\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C<\"string\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F<\"undefined\">, change: C<\"undefined\">) => [string | null | undefined, boolean]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F<\"undefined\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C<\"undefined\">" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue", + "type": "Function", + "tags": [], + "label": "getInputValue", + "description": [], + "signature": [ + "(field: F, change: C) => (boolean | ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.KnownTypeToValue", + "text": "KnownTypeToValue" + }, + " | null | undefined)[]" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "F" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.getInputValue.$2", + "type": "Object", + "tags": [], + "label": "change", + "description": [], + "signature": [ + "C" + ], + "path": "packages/kbn-management/settings/utilities/get_input_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.hasUnsavedChange", + "type": "Function", + "tags": [], + "label": "hasUnsavedChange", + "description": [ + "\nCompares a given {@link FieldDefinition} to an {@link UnsavedFieldChange} to determine\nif the field has an unsaved change in the UI.\n" + ], + "signature": [ + "(field: Pick<", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + " | null>, \"savedValue\">, unsavedChange?: Pick<", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + ", \"unsavedValue\"> | undefined) => boolean" + ], + "path": "packages/kbn-management/settings/utilities/has_unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.hasUnsavedChange.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [ + "The field to compare." + ], + "signature": [ + "Pick<", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + " | null>, \"savedValue\">" + ], + "path": "packages/kbn-management/settings/utilities/has_unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.hasUnsavedChange.$2", + "type": "Object", + "tags": [], + "label": "unsavedChange", + "description": [ + "The unsaved change to compare." + ], + "signature": [ + "Pick<", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.UnsavedFieldChange", + "text": "UnsavedFieldChange" + }, + ", \"unsavedValue\"> | undefined" + ], + "path": "packages/kbn-management/settings/utilities/has_unsaved_change.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.isUnsavedValue", + "type": "Function", + "tags": [], + "label": "isUnsavedValue", + "description": [ + "\nConvenience function to compare a given {@link FieldDefinition} to an {@link UnsavedFieldChange}\nto determine if the value in the unsaved change is a different value from what is saved.\n" + ], + "signature": [ + "(field: ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + " | null>, unsavedValue?: ", + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.KnownTypeToValue", + "text": "KnownTypeToValue" + }, + " | null | undefined) => boolean" + ], + "path": "packages/kbn-management/settings/utilities/is_unsaved_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.isUnsavedValue.$1", + "type": "Object", + "tags": [], + "label": "field", + "description": [ + "The field to compare." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.FieldDefinition", + "text": "FieldDefinition" + }, + " | null>" + ], + "path": "packages/kbn-management/settings/utilities/is_unsaved_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-utilities", + "id": "def-common.isUnsavedValue.$2", + "type": "CompoundType", + "tags": [], + "label": "unsavedValue", + "description": [ + "The unsaved value to compare." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-types", + "scope": "common", + "docId": "kibKbnManagementSettingsTypesPluginApi", + "section": "def-common.KnownTypeToValue", + "text": "KnownTypeToValue" + }, + " | null | undefined" + ], + "path": "packages/kbn-management/settings/utilities/is_unsaved_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx new file mode 100644 index 0000000000000..c0f827d4fa2eb --- /dev/null +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnManagementSettingsUtilitiesPluginApi +slug: /kibana-dev-docs/api/kbn-management-settings-utilities +title: "@kbn/management-settings-utilities" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/management-settings-utilities plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] +--- +import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; + + + +Contact [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 39 | 0 | 30 | 0 | + +## Common + +### Functions + + diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index b629de5b97080..5eb7918c3f059 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 1ca426fde6739..915db4f03fbb0 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index df57b8003d0b3..d62d677cdbb9d 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 613afe8855559..e8fce8a857bf1 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: 2023-09-08 +date: 2023-09-12 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_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index cb10341c2b494..8b5c9882de1e2 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 2dcb8b11942f8..534a7c32dd9cd 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index ce3c64a75e683..642dafc1dc025 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index ac4518ffac189..f0c45d8a02ee4 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 6572f79406269..00fef314f2e20 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index cd155fe3c758d..e706e8f0bf453 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index f0fb0f130d9e2..0b9accd88de8b 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 3102c95267cab..56885607645be 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index afc7be8e651af..9adefe3925137 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index e45308f78effd..3f53ab0bb538f 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: 2023-09-08 +date: 2023-09-12 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_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 3b6c5571fca02..272c6f165863b 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index ab568fd385037..1da930b6ae27c 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index d1f17b743099b..42579df3f9a2d 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 3efdc587a1703..1268beebfc153 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index e28a3952caeb7..f26e95da0257e 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index a7ba7e8b9efe0..f6a1d69330e47 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 3075b65c8ecac..0c2e5aebfe1fd 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 5a099b020bbab..2b5a30c59020f 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 37a1c35cd4c2c..68d9f4f2f1523 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 01e326ca4f865..a1078bb9221cf 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 260bb193ea3c4..a07f497fea7a4 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.devdocs.json b/api_docs/kbn_monaco.devdocs.json index a02324fc33509..c7d87a27c0872 100644 --- a/api_docs/kbn_monaco.devdocs.json +++ b/api_docs/kbn_monaco.devdocs.json @@ -892,6 +892,61 @@ "children": [], "returnComment": [] }, + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.ESQLLang.languageConfiguration", + "type": "Object", + "tags": [], + "label": "languageConfiguration", + "description": [], + "path": "packages/kbn-monaco/src/esql/language.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.ESQLLang.languageConfiguration.brackets", + "type": "Array", + "tags": [], + "label": "brackets", + "description": [], + "signature": [ + "[string, string][]" + ], + "path": "packages/kbn-monaco/src/esql/language.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.ESQLLang.languageConfiguration.autoClosingPairs", + "type": "Array", + "tags": [], + "label": "autoClosingPairs", + "description": [], + "signature": [ + "{ open: string; close: string; }[]" + ], + "path": "packages/kbn-monaco/src/esql/language.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.ESQLLang.languageConfiguration.surroundingPairs", + "type": "Array", + "tags": [], + "label": "surroundingPairs", + "description": [], + "signature": [ + "{ open: string; close: string; }[]" + ], + "path": "packages/kbn-monaco/src/esql/language.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, { "parentPluginId": "@kbn/monaco", "id": "def-common.ESQLLang.getSuggestionProvider", diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index aac09909f4ae0..d1e23ccae95b2 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 74 | 0 | 72 | 3 | +| 78 | 0 | 76 | 3 | ## Common diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index adf5bb4ba1fb3..a81de38a2c2c7 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 640b1fa43af2f..9e4d1455bfe98 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 98e82243327c3..570f8f39c2a24 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: 2023-09-08 +date: 2023-09-12 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 5b892ff847f33..215c5231b5c37 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: 2023-09-08 +date: 2023-09-12 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 e718baf04fa02..12b5b64455563 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: 2023-09-08 +date: 2023-09-12 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_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 7264c3e306935..18758d2fd8fb9 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: 2023-09-08 +date: 2023-09-12 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 c7a3fb0e6d5f3..8f977f0538d04 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: 2023-09-08 +date: 2023-09-12 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 e4ed56f60eb33..954a5d08bb73c 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index be2b9a97528fa..c77bb9da208d4 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 94db9b37450a3..ed95221eaac3c 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 0f2ba928ee271..ecb05234f67e8 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 045d4a05ebc26..39776e48e360b 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 21d296e3f8871..474b844a12824 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 75fcecca678cb..70e495b760ac2 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index ec5edbf23d91e..ee79f439037c7 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index bdd0c759f222b..aeba7bf723a71 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 5a0f8e881f6aa..5e3df0f22f60d 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index bce772f950a9d..e848039fa9e3d 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index f565a5d9dd655..e0016968e00d7 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 64d936997d9dd..7bda0f53bc2ed 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index cfa4ec1a0a4f9..b478bf5d1ed96 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 001f81b523080..d083b86230d94 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 9d3ceb3f5b8b9..dd18c560498ec 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 38d81b1eb3f77..0e5f469ced3d1 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index f63bd19649362..cfefb9ad3bc3d 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.devdocs.json b/api_docs/kbn_search_api_panels.devdocs.json index d2169d84164c5..52bb065a5c52b 100644 --- a/api_docs/kbn_search_api_panels.devdocs.json +++ b/api_docs/kbn_search_api_panels.devdocs.json @@ -68,7 +68,15 @@ "section": "def-common.LanguageDefinition", "text": "LanguageDefinition" }, - ") => string | undefined" + ", args?: ", + { + "pluginId": "@kbn/search-api-panels", + "scope": "common", + "docId": "kibKbnSearchApiPanelsPluginApi", + "section": "def-common.LanguageDefinitionSnippetArguments", + "text": "LanguageDefinitionSnippetArguments" + }, + " | undefined) => string | undefined" ], "path": "packages/kbn-search-api-panels/utils.ts", "deprecated": false, @@ -95,6 +103,28 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "@kbn/search-api-panels", + "id": "def-common.getConsoleRequest.$2", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-api-panels", + "scope": "common", + "docId": "kibKbnSearchApiPanelsPluginApi", + "section": "def-common.LanguageDefinitionSnippetArguments", + "text": "LanguageDefinitionSnippetArguments" + }, + " | undefined" + ], + "path": "packages/kbn-search-api-panels/utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [], @@ -621,27 +651,30 @@ "children": [ { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.advancedConfig", + "id": "def-common.LanguageDefinition.name", "type": "string", "tags": [], - "label": "advancedConfig", + "label": "name", "description": [], - "signature": [ - "string | undefined" - ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.apiReference", - "type": "string", + "id": "def-common.LanguageDefinition.id", + "type": "Enum", "tags": [], - "label": "apiReference", + "label": "id", "description": [], "signature": [ - "string | undefined" + { + "pluginId": "@kbn/search-api-panels", + "scope": "common", + "docId": "kibKbnSearchApiPanelsPluginApi", + "section": "def-common.Languages", + "text": "Languages" + } ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, @@ -649,35 +682,24 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.basicConfig", + "id": "def-common.LanguageDefinition.iconType", "type": "string", "tags": [], - "label": "basicConfig", + "label": "iconType", "description": [], - "signature": [ - "string | undefined" - ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.configureClient", - "type": "CompoundType", + "id": "def-common.LanguageDefinition.docLink", + "type": "string", "tags": [], - "label": "configureClient", + "label": "docLink", "description": [], "signature": [ - "string | ((args: ", - { - "pluginId": "@kbn/search-api-panels", - "scope": "common", - "docId": "kibKbnSearchApiPanelsPluginApi", - "section": "def-common.LanguageDefinitionSnippetArguments", - "text": "LanguageDefinitionSnippetArguments" - }, - ") => string)" + "string | undefined" ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, @@ -685,24 +707,27 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.docLink", - "type": "string", + "id": "def-common.LanguageDefinition.configureClient", + "type": "CompoundType", "tags": [], - "label": "docLink", + "label": "configureClient", "description": [], + "signature": [ + "CodeSnippet | undefined" + ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.github", - "type": "Object", + "id": "def-common.LanguageDefinition.ingestData", + "type": "CompoundType", "tags": [], - "label": "github", + "label": "ingestData", "description": [], "signature": [ - "{ link: string; label: string; } | undefined" + "CodeSnippet | undefined" ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, @@ -710,30 +735,27 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.iconType", - "type": "string", + "id": "def-common.LanguageDefinition.ingestDataIndex", + "type": "CompoundType", "tags": [], - "label": "iconType", + "label": "ingestDataIndex", "description": [], + "signature": [ + "CodeSnippet | undefined" + ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.id", - "type": "Enum", + "id": "def-common.LanguageDefinition.installClient", + "type": "string", "tags": [], - "label": "id", + "label": "installClient", "description": [], "signature": [ - { - "pluginId": "@kbn/search-api-panels", - "scope": "common", - "docId": "kibKbnSearchApiPanelsPluginApi", - "section": "def-common.Languages", - "text": "Languages" - } + "string | undefined" ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, @@ -741,21 +763,13 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.ingestData", + "id": "def-common.LanguageDefinition.buildSearchQuery", "type": "CompoundType", "tags": [], - "label": "ingestData", + "label": "buildSearchQuery", "description": [], "signature": [ - "string | ((args: ", - { - "pluginId": "@kbn/search-api-panels", - "scope": "common", - "docId": "kibKbnSearchApiPanelsPluginApi", - "section": "def-common.LanguageDefinitionSnippetArguments", - "text": "LanguageDefinitionSnippetArguments" - }, - ") => string)" + "CodeSnippet | undefined" ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, @@ -763,21 +777,13 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.ingestDataIndex", + "id": "def-common.LanguageDefinition.testConnection", "type": "CompoundType", "tags": [], - "label": "ingestDataIndex", + "label": "testConnection", "description": [], "signature": [ - "string | ((args: ", - { - "pluginId": "@kbn/search-api-panels", - "scope": "common", - "docId": "kibKbnSearchApiPanelsPluginApi", - "section": "def-common.LanguageDefinitionSnippetArguments", - "text": "LanguageDefinitionSnippetArguments" - }, - ") => string)" + "CodeSnippet | undefined" ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, @@ -785,21 +791,24 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.installClient", + "id": "def-common.LanguageDefinition.advancedConfig", "type": "string", "tags": [], - "label": "installClient", + "label": "advancedConfig", "description": [], + "signature": [ + "string | undefined" + ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.languageStyling", + "id": "def-common.LanguageDefinition.apiReference", "type": "string", "tags": [], - "label": "languageStyling", + "label": "apiReference", "description": [], "signature": [ "string | undefined" @@ -810,32 +819,27 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.name", + "id": "def-common.LanguageDefinition.basicConfig", "type": "string", "tags": [], - "label": "name", + "label": "basicConfig", "description": [], + "signature": [ + "string | undefined" + ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.buildSearchQuery", - "type": "CompoundType", + "id": "def-common.LanguageDefinition.github", + "type": "Object", "tags": [], - "label": "buildSearchQuery", + "label": "github", "description": [], "signature": [ - "string | ((args: ", - { - "pluginId": "@kbn/search-api-panels", - "scope": "common", - "docId": "kibKbnSearchApiPanelsPluginApi", - "section": "def-common.LanguageDefinitionSnippetArguments", - "text": "LanguageDefinitionSnippetArguments" - }, - ") => string)" + "{ link: string; label: string; } | undefined" ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, @@ -843,21 +847,13 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.LanguageDefinition.testConnection", - "type": "CompoundType", + "id": "def-common.LanguageDefinition.languageStyling", + "type": "string", "tags": [], - "label": "testConnection", + "label": "languageStyling", "description": [], "signature": [ - "string | ((args: ", - { - "pluginId": "@kbn/search-api-panels", - "scope": "common", - "docId": "kibKbnSearchApiPanelsPluginApi", - "section": "def-common.LanguageDefinitionSnippetArguments", - "text": "LanguageDefinitionSnippetArguments" - }, - ") => string)" + "string | undefined" ], "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 2de372d2b4595..15956b78bfa5a 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 67 | 0 | 67 | 0 | +| 68 | 0 | 68 | 0 | ## Common diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 8bad8381c2233..684a29baf95d6 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index bf28678b4f23b..731860e25b054 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 7019fff836806..a490720588d95 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index c4d1064b2dc86..e62d76902651b 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 646f3f12a38cd..9cb3b19a47015 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 823cd657eb63b..f25bb1c10c79d 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 1f4eac047be1e..9daa24cda7e59 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index df7aea4a5fde4..4d8ab31a786df 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index e5f0a3c344281..1256eb0c23610 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 96f723b0c0c01..4a7168472dce9 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: 2023-09-08 +date: 2023-09-12 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 abcbf295a7955..926b98b1efa81 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: 2023-09-08 +date: 2023-09-12 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_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 52caed30acc04..33cd8dd2c768c 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 6c7dbc12a40f6..9e5deb1638288 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: 2023-09-08 +date: 2023-09-12 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 62a178f12a3f0..a04e30344019e 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: 2023-09-08 +date: 2023-09-12 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 3bc840d7eedcd..ade10f96214e5 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: 2023-09-08 +date: 2023-09-12 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 3a1542e72162d..da351c7be4d09 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: 2023-09-08 +date: 2023-09-12 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 00fec9a131570..089abb8d6bd37 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: 2023-09-08 +date: 2023-09-12 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 92551aacca7a3..01ee5588d20ff 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: 2023-09-08 +date: 2023-09-12 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 0e5a3cf35b19f..8def886fcfd32 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: 2023-09-08 +date: 2023-09-12 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 dedd674fdd873..9a9a1714dc894 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: 2023-09-08 +date: 2023-09-12 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 4b52381bd4a11..c7a598f972254 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: 2023-09-08 +date: 2023-09-12 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 e80a4f7ff6b2e..89036687b1b23 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: 2023-09-08 +date: 2023-09-12 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 c5a6bc389a207..06387a153b5c7 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: 2023-09-08 +date: 2023-09-12 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 00ca9d842f924..dc8410d29b4f3 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: 2023-09-08 +date: 2023-09-12 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 62c8ca4a596fb..a975e2ae56d9b 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: 2023-09-08 +date: 2023-09-12 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 7d11309c453da..7e553f9de10e1 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.devdocs.json b/api_docs/kbn_serverless_common_settings.devdocs.json new file mode 100644 index 0000000000000..7a9606cbc24d0 --- /dev/null +++ b/api_docs/kbn_serverless_common_settings.devdocs.json @@ -0,0 +1,43 @@ +{ + "id": "@kbn/serverless-common-settings", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/serverless-common-settings", + "id": "def-common.ALL_COMMON_SETTINGS", + "type": "Array", + "tags": [], + "label": "ALL_COMMON_SETTINGS", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/serverless/settings/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx new file mode 100644 index 0000000000000..a446dcad2999d --- /dev/null +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnServerlessCommonSettingsPluginApi +slug: /kibana-dev-docs/api/kbn-serverless-common-settings +title: "@kbn/serverless-common-settings" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/serverless-common-settings plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] +--- +import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; + + + +Contact [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 1 | 0 | 1 | 0 | + +## Common + +### Consts, variables and types + + diff --git a/api_docs/kbn_serverless_observability_settings.devdocs.json b/api_docs/kbn_serverless_observability_settings.devdocs.json new file mode 100644 index 0000000000000..35b798a42f024 --- /dev/null +++ b/api_docs/kbn_serverless_observability_settings.devdocs.json @@ -0,0 +1,43 @@ +{ + "id": "@kbn/serverless-observability-settings", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/serverless-observability-settings", + "id": "def-common.OBSERVABILITY_PROJECT_SETTINGS", + "type": "Array", + "tags": [], + "label": "OBSERVABILITY_PROJECT_SETTINGS", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/serverless/settings/observability_project/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx new file mode 100644 index 0000000000000..869df8a96f801 --- /dev/null +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnServerlessObservabilitySettingsPluginApi +slug: /kibana-dev-docs/api/kbn-serverless-observability-settings +title: "@kbn/serverless-observability-settings" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/serverless-observability-settings plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] +--- +import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; + + + +Contact [@elastic/appex-sharedux @elastic/apm-ui @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 1 | 0 | 1 | 0 | + +## Common + +### Consts, variables and types + + diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index e397c924a291b..0b611a3f17bd9 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.devdocs.json b/api_docs/kbn_serverless_search_settings.devdocs.json new file mode 100644 index 0000000000000..772c029aea954 --- /dev/null +++ b/api_docs/kbn_serverless_search_settings.devdocs.json @@ -0,0 +1,43 @@ +{ + "id": "@kbn/serverless-search-settings", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/serverless-search-settings", + "id": "def-common.SEARCH_PROJECT_SETTINGS", + "type": "Array", + "tags": [], + "label": "SEARCH_PROJECT_SETTINGS", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/serverless/settings/search_project/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx new file mode 100644 index 0000000000000..451825d91581a --- /dev/null +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnServerlessSearchSettingsPluginApi +slug: /kibana-dev-docs/api/kbn-serverless-search-settings +title: "@kbn/serverless-search-settings" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/serverless-search-settings plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] +--- +import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; + + + +Contact [@elastic/enterprise-search-frontend @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/enterprise-search-frontend ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 1 | 0 | 1 | 0 | + +## Common + +### Consts, variables and types + + diff --git a/api_docs/kbn_serverless_security_settings.devdocs.json b/api_docs/kbn_serverless_security_settings.devdocs.json new file mode 100644 index 0000000000000..fd54e257a28c8 --- /dev/null +++ b/api_docs/kbn_serverless_security_settings.devdocs.json @@ -0,0 +1,43 @@ +{ + "id": "@kbn/serverless-security-settings", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/serverless-security-settings", + "id": "def-common.SECURITY_PROJECT_SETTINGS", + "type": "Array", + "tags": [], + "label": "SECURITY_PROJECT_SETTINGS", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/serverless/settings/security_project/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx new file mode 100644 index 0000000000000..34e8505586a64 --- /dev/null +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnServerlessSecuritySettingsPluginApi +slug: /kibana-dev-docs/api/kbn-serverless-security-settings +title: "@kbn/serverless-security-settings" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/serverless-security-settings plugin +date: 2023-09-12 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] +--- +import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; + + + +Contact [@elastic/security-solution @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/security-solution ) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 1 | 0 | 1 | 0 | + +## Common + +### Consts, variables and types + + diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index b9dd1969cbdd5..51c738dee60ec 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 475efd731a720..2618360284b51 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: 2023-09-08 +date: 2023-09-12 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 61bfd36cf5444..277c6c5369e1e 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: 2023-09-08 +date: 2023-09-12 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 4d2915cbc89fa..bf920f2b8c115 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: 2023-09-08 +date: 2023-09-12 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 d6e995300a288..c7de2b98eed64 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: 2023-09-08 +date: 2023-09-12 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 72430e134bb43..c1924fb9f2d1f 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: 2023-09-08 +date: 2023-09-12 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 802da92334e7a..7df7db6897887 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: 2023-09-08 +date: 2023-09-12 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 27524f3ba3722..6b7fa939ccd49 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: 2023-09-08 +date: 2023-09-12 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 dd9b219ccd73f..cbc5d756c076f 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: 2023-09-08 +date: 2023-09-12 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_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 78fc7e6f55cfb..49b5f9945894f 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index ecf604de7092b..88cf4ff211fe2 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: 2023-09-08 +date: 2023-09-12 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 446043b3ea4ff..5fd7d146b9697 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: 2023-09-08 +date: 2023-09-12 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 9957ffe614443..ab3e83679ad86 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: 2023-09-08 +date: 2023-09-12 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 0dcadb784c622..bbe7ac6387687 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: 2023-09-08 +date: 2023-09-12 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_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 3f8529272fa51..9a56676638195 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 4493ee8488fb3..4ea8828d99496 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 502f65c32a1a3..13d98cae50fd6 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 927aba1979274..3c7ab7e9fd75c 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: 2023-09-08 +date: 2023-09-12 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 f5dd2e9ebd035..2792aae291073 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: 2023-09-08 +date: 2023-09-12 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 ae73b81d0dea6..bff2136f90c28 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: 2023-09-08 +date: 2023-09-12 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 94082d9c30a24..0e5e9088ec5e0 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: 2023-09-08 +date: 2023-09-12 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 898842b15b5f0..e23c62a91ae64 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: 2023-09-08 +date: 2023-09-12 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 9e4d6a188b6b5..28a5b72227b49 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: 2023-09-08 +date: 2023-09-12 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 d624dace866a5..e63f97fa9f938 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: 2023-09-08 +date: 2023-09-12 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 6f04104be0f31..5352facabfd78 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: 2023-09-08 +date: 2023-09-12 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 23aaffa6a7c40..300ae4533116a 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: 2023-09-08 +date: 2023-09-12 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 a773ee61ed0ce..7adbfa8474326 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: 2023-09-08 +date: 2023-09-12 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 e9e19630758ad..99995775d67ae 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: 2023-09-08 +date: 2023-09-12 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 cd01372e32cc4..661bf1190b99c 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: 2023-09-08 +date: 2023-09-12 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.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index d0a6a0cc1ebbd..ef911298e80d5 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: 2023-09-08 +date: 2023-09-12 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 c512c71fde930..dd58e503fe240 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: 2023-09-08 +date: 2023-09-12 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 780f549fac678..79a09f01a8717 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: 2023-09-08 +date: 2023-09-12 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.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index d28759bd6d1f2..88a0aabb12cb0 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; 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 a8b4a07595c06..589db794b95fb 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: 2023-09-08 +date: 2023-09-12 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 d293cfe6431bf..02cd0b1bfa8d3 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: 2023-09-08 +date: 2023-09-12 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 3fec089bdf793..ff2e8b9748eed 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: 2023-09-08 +date: 2023-09-12 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 144c99678ede5..cc72de0669173 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: 2023-09-08 +date: 2023-09-12 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 214a70c0e6113..163ea98669c23 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: 2023-09-08 +date: 2023-09-12 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 77ab39655789c..8251b5e3b70d3 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: 2023-09-08 +date: 2023-09-12 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 2f390b9a0a34a..d97a4e8b96a99 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: 2023-09-08 +date: 2023-09-12 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 8c74f092513e6..309b05d5b1b8e 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 82c0eafcfb495..c9d114e6521b0 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index e07a6f1a37690..22efab0f420ce 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 44aea43b0ccb9..b74681e3f725d 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: 2023-09-08 +date: 2023-09-12 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 93f47be252054..9e82d5d3d4d10 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: 2023-09-08 +date: 2023-09-12 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 3cbba13b8bbb4..87f13147190fe 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: 2023-09-08 +date: 2023-09-12 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 55c67fbdec2ba..03e96306cdc6c 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: 2023-09-08 +date: 2023-09-12 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 36fa47f98cf8b..98dd558fc3b20 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: 2023-09-08 +date: 2023-09-12 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 b8be9ac84864b..d17622f24a2c9 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: 2023-09-08 +date: 2023-09-12 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 5ec024b155baa..0eb933113dcd3 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index b422548328b6a..5730d58ec55ad 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index b0537618c323d..68b4c84a31404 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index c84a7a8ed3d67..9636d92984bb9 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 65b49d400b582..9d129ba2f3b12 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: 2023-09-08 +date: 2023-09-12 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_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 35c794c5a8fe8..a346a96551118 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index c4088aa99fdd6..41db14019f1e4 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: 2023-09-08 +date: 2023-09-12 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 939de1797681f..b1f6d91a387cb 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 048a4f2d9ee12..2f8025640d2f7 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 2ef06c3636786..df09ce83c9a9f 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 7a5de4487cb2f..6e240b12f467a 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 1a6d7ff9927e0..1de92fc708a6b 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 630d143c954a9..e258f23a78a89 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index b344b0debe42e..f87eca61d0110 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: 2023-09-08 +date: 2023-09-12 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 010a490f21186..255e7091c1ffa 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: 2023-09-08 +date: 2023-09-12 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 726f64fbae4e6..d806f2246d29c 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: 2023-09-08 +date: 2023-09-12 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 622e6b2ed0ac3..2ab41d7c9b22a 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index af22b74387b39..1812b6a216504 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index bed6508d4b2de..d7d62d1c90002 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: 2023-09-08 +date: 2023-09-12 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 82fa92364dccb..78b882febff5c 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: 2023-09-08 +date: 2023-09-12 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 6a6ee577def49..4efa853b5e629 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: 2023-09-08 +date: 2023-09-12 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 055439dfb1e41..614e5784d0c36 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: 2023-09-08 +date: 2023-09-12 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 0ffe4e969ad5d..a33479e97de02 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index f2f0d10d99577..736230a7449fa 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index c36050d51922b..f2c805865bfe8 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: 2023-09-08 +date: 2023-09-12 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 185859ab2a35e..ec621b8f15af1 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: 2023-09-08 +date: 2023-09-12 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 941dcc45d7c68..c9493739d67f3 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: 2023-09-08 +date: 2023-09-12 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 dd678def074d4..a52d007b7917d 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index ad6d9e7276a15..cd9cb59e049c5 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index ad2c3e2a63aba..1c152a74556c1 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 43e37757a6c9d..ec14f26dc32d7 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: 2023-09-08 +date: 2023-09-12 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 5c4deefc68f38..288d07088a666 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: 2023-09-08 +date: 2023-09-12 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 843b37b1d0440..f02fa14743c72 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: 2023-09-08 +date: 2023-09-12 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 33d72757a8395..c2105c60b8c03 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: 2023-09-08 +date: 2023-09-12 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 bc80ed07e10fd..176eb7adc367e 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: 2023-09-08 +date: 2023-09-12 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 4e8b72a8b72ec..2331dc2fc2d4b 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: 2023-09-08 +date: 2023-09-12 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 80a3f99e8d7ee..0b0eab77347e7 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: 2023-09-08 +date: 2023-09-12 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 de4865b1d3456..53201b623d7e7 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 1b99a1a684e71..fb965deff2126 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index a4583a80124b2..78f8b9eaf95c2 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: 2023-09-08 +date: 2023-09-12 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 4fb36eb62dee5..1d3257949d761 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -3178,6 +3178,20 @@ "path": "x-pack/plugins/observability/public/plugin.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityPublicPluginsStart.aiops", + "type": "Object", + "tags": [], + "label": "aiops", + "description": [], + "signature": [ + "AiopsPluginStart" + ], + "path": "x-pack/plugins/observability/public/plugin.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 673f211cda9ef..7196f2b92b67f 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 542 | 2 | 533 | 14 | +| 543 | 2 | 534 | 14 | ## Client diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 99e85e15499a2..c0370fca7dcbd 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index dd7862b1ad8ce..8fe7c510db4d0 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.devdocs.json b/api_docs/observability_shared.devdocs.json index 2bfd9c96c19c3..03a774e515760 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -1319,7 +1319,7 @@ "label": "useLinkProps", "description": [], "signature": [ - "({ app, pathname, hash, search }: ", + "({ app, pathname, hash, search, state }: ", { "pluginId": "observabilityShared", "scope": "public", @@ -1347,7 +1347,7 @@ "id": "def-public.useLinkProps.$1", "type": "Object", "tags": [], - "label": "{ app, pathname, hash, search }", + "label": "{ app, pathname, hash, search, state }", "description": [], "signature": [ { @@ -1837,6 +1837,20 @@ "path": "x-pack/plugins/observability_shared/public/hooks/use_link_props.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.LinkDescriptor.state", + "type": "Unknown", + "tags": [], + "label": "state", + "description": [], + "signature": [ + "unknown" + ], + "path": "x-pack/plugins/observability_shared/public/hooks/use_link_props.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 73ff4052f0f60..bd2bd933054f0 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 277 | 1 | 276 | 11 | +| 278 | 1 | 277 | 11 | ## Client diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 38c04192172b6..1e931239869d7 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 988d81adfab7b..9007e08b5d676 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 5d1dfe8b2d0b1..328a2c0568ab8 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 675 | 566 | 39 | +| 685 | 576 | 43 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 74239 | 223 | 63615 | 1515 | +| 74568 | 223 | 63790 | 1517 | ## Plugin Directory @@ -29,7 +29,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] |--------------|----------------|-----------|--------------|----------|---------------|--------| | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 269 | 0 | 263 | 31 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 17 | 1 | 15 | 2 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 61 | 1 | 3 | 0 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 61 | 1 | 3 | 1 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 793 | 1 | 762 | 49 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | The user interface for Elastic APM | 29 | 0 | 29 | 119 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 9 | 0 | 9 | 0 | @@ -103,7 +103,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | graph | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 0 | 0 | 0 | 0 | | grokdebugger | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) | Guided onboarding framework | 58 | 0 | 57 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 147 | 0 | 108 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 149 | 0 | 109 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 3 | 0 | 3 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 194 | 0 | 189 | 4 | @@ -135,11 +135,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 542 | 2 | 533 | 14 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 543 | 2 | 534 | 14 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 42 | 0 | 39 | 7 | | observabilityLogExplorer | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin exposes and registers observability log consumption features. | 0 | 0 | 0 | 0 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 15 | 0 | 15 | 0 | -| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 277 | 1 | 276 | 11 | +| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 278 | 1 | 277 | 11 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 24 | 0 | 24 | 7 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 2 | 0 | 2 | 0 | | | [@elastic/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). | 218 | 2 | 164 | 11 | @@ -163,7 +163,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 172 | 0 | 106 | 32 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 6 | 0 | 6 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | The core Serverless plugin, providing APIs to Serverless Project plugins. | 17 | 0 | 16 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | The core Serverless plugin, providing APIs to Serverless Project plugins. | 19 | 0 | 18 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Serverless customizations for observability. | 6 | 0 | 6 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Serverless customizations for search. | 6 | 0 | 6 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 134 | 0 | 134 | 8 | @@ -378,7 +378,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 73 | 0 | 40 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 0 | 23 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 125 | 0 | 91 | 46 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 125 | 0 | 91 | 47 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 12 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 547 | 1 | 121 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 69 | 0 | 69 | 4 | @@ -399,8 +399,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 30 | 1 | 18 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 1 | 11 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 25 | 0 | 4 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 1 | 16 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 27 | 0 | 4 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 34 | 1 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 18 | 1 | 17 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 155 | 0 | 144 | 0 | @@ -474,7 +474,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 6 | 0 | 1 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 10 | 0 | 10 | 1 | +| | [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) | - | 20 | 0 | 1 | 0 | +| | [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) | - | 11 | 0 | 2 | 0 | +| | [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) | - | 42 | 0 | 0 | 0 | +| | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 127 | 0 | 127 | 0 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 20 | 0 | 11 | 0 | +| | [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) | - | 71 | 0 | 0 | 0 | +| | [@elastic/platform-deployment-management @elastic/appex-sharedux](https://github.com/orgs/elastic/teams/platform-deployment-management ) | - | 39 | 0 | 30 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 2 | 0 | 0 | 0 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 582 | 1 | 1 | 0 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 2 | 0 | 2 | 0 | @@ -500,7 +506,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 2 | 0 | 1 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 8 | 0 | 8 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 31 | 1 | 24 | 1 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 74 | 0 | 72 | 3 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 78 | 0 | 76 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 55 | 1 | 50 | 0 | | | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 13 | 0 | 13 | 3 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 45 | 0 | 45 | 10 | @@ -526,7 +532,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 16 | 0 | 16 | 1 | | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 107 | 0 | 104 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 67 | 0 | 67 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 68 | 0 | 68 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 1678 | 0 | 1678 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 16 | 0 | 8 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 14 | 0 | 14 | 6 | @@ -553,7 +559,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 31 | 0 | 29 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 54 | 0 | 51 | 1 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 31 | 0 | 30 | 1 | +| | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 1 | 0 | 1 | 0 | +| | [@elastic/appex-sharedux @elastic/apm-ui @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 7 | 1 | +| | [@elastic/enterprise-search-frontend @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/enterprise-search-frontend ) | - | 1 | 0 | 1 | 0 | +| | [@elastic/security-solution @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/security-solution ) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 2 | 0 | 2 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 2 | 2 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 440d6a35f47a9..47d6a5cac600d 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 9153db2179991..a186c436db7d7 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index abfa3f2256fdc..e8dcc62280326 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 9912ee09f1b6c..f690793b01ce3 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: 2023-09-08 +date: 2023-09-12 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 7260df76aaf24..0141ca1a2217c 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: 2023-09-08 +date: 2023-09-12 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 109aab02b4460..4f64c5c128dcb 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: 2023-09-08 +date: 2023-09-12 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 65913eafd985c..53727e1a59aa3 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: 2023-09-08 +date: 2023-09-12 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 0ec41f127bc43..42dd68d9bcdf6 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: 2023-09-08 +date: 2023-09-12 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 bdb739bff786d..599a81017a7d8 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: 2023-09-08 +date: 2023-09-12 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 abab89329687e..5ba8370ec43e3 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: 2023-09-08 +date: 2023-09-12 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 fc6efb8b93154..1613f16bb8875 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: 2023-09-08 +date: 2023-09-12 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 f67f2441029af..f7c66d1ce0b28 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: 2023-09-08 +date: 2023-09-12 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 51663467ef133..c3ca3fb2acf98 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: 2023-09-08 +date: 2023-09-12 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 b99575ee33c3b..4a2a3575076cd 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: 2023-09-08 +date: 2023-09-12 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 240577805446e..c075bb89c2578 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: 2023-09-08 +date: 2023-09-12 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 a95e21ddae58d..f6b9d527ab6d4 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: 2023-09-08 +date: 2023-09-12 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 03fd746234c6d..cf85842c5f5f1 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: 2023-09-08 +date: 2023-09-12 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 a1bc669b94bac..c7a2a2456f96e 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index bdf1d4c542bc9..6e03110f568d0 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 88a4eb9913d27..f0a8c3de6865e 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.devdocs.json b/api_docs/serverless.devdocs.json index 4a9258ba58353..6275b9f9b0688 100644 --- a/api_docs/serverless.devdocs.json +++ b/api_docs/serverless.devdocs.json @@ -274,7 +274,40 @@ "path": "x-pack/plugins/serverless/server/types.ts", "deprecated": false, "trackAdoption": false, - "children": [], + "children": [ + { + "parentPluginId": "serverless", + "id": "def-server.ServerlessPluginSetup.setupProjectSettings", + "type": "Function", + "tags": [], + "label": "setupProjectSettings", + "description": [], + "signature": [ + "(keys: string[]) => void" + ], + "path": "x-pack/plugins/serverless/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "serverless", + "id": "def-server.ServerlessPluginSetup.setupProjectSettings.$1", + "type": "Array", + "tags": [], + "label": "keys", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/serverless/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], "lifecycle": "setup", "initialIsOpen": true }, diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 3e097cfc8b1fe..794161bb60566 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 17 | 0 | 16 | 0 | +| 19 | 0 | 18 | 0 | ## Client diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 5c5066d92bd6c..ba6ca937cc4fb 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 58c1e5c5967ad..e11a1314be5de 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index e845460cc0b3c..6512cc62ed6f5 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: 2023-09-08 +date: 2023-09-12 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 f04ded318e8b4..a19e38b5ef39a 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: 2023-09-08 +date: 2023-09-12 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 8a51e91c48b48..65eb4d438d69e 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: 2023-09-08 +date: 2023-09-12 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 0f87d24eaffc5..28cccfb0621ea 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: 2023-09-08 +date: 2023-09-12 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 77c77a5cc8866..062ec84b4ef01 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: 2023-09-08 +date: 2023-09-12 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 109ddb4373ed2..cb17ccee5d5fd 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: 2023-09-08 +date: 2023-09-12 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 faf5ccaa001f7..d04bb8ad46910 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: 2023-09-08 +date: 2023-09-12 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 cb3600310e57c..b0cbe13556f6d 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: 2023-09-08 +date: 2023-09-12 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 a258b079360b6..273ec1494f2d7 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: 2023-09-08 +date: 2023-09-12 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 1474f0cbc9c54..5c4169e0bbc35 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: 2023-09-08 +date: 2023-09-12 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 bfe621313fbe2..4706a4ef9fd30 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 2c69aa13be21e..c32eeb9556348 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 4356437d44b58..99f0f9d47cb28 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: 2023-09-08 +date: 2023-09-12 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 7fb6e77b8b58a..b9dd955669318 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: 2023-09-08 +date: 2023-09-12 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 05ce78d0fc72d..8b8042465ce92 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: 2023-09-08 +date: 2023-09-12 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 ecac7993727d0..7f98d3c611e44 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: 2023-09-08 +date: 2023-09-12 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 7c91194264494..91039c258e654 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: 2023-09-08 +date: 2023-09-12 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 c70ad78e55c9c..6339b7aa190e0 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index c0053cf6566cd..a30f08e6ac871 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 06ab25a2682ca..b3469a4c03e8b 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: 2023-09-08 +date: 2023-09-12 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 277496e0f06fc..9b245eedcbe1b 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: 2023-09-08 +date: 2023-09-12 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 9e3948302acf1..aecd79b2a386f 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 77d962dad1765..fa5458327720b 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 737d328cd6a31..eb792f6eae078 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: 2023-09-08 +date: 2023-09-12 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 224c6df3968dd..1cc6169d99376 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: 2023-09-08 +date: 2023-09-12 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 7e72205528a8f..923dcf4fc31d9 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: 2023-09-08 +date: 2023-09-12 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 817a0aba40550..0e49f4764cc85 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: 2023-09-08 +date: 2023-09-12 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 aa5f31854a9af..70eed9b79515a 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: 2023-09-08 +date: 2023-09-12 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 895510784daaa..d783cf6242bba 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 58dabba1c3302..04154e2b428a8 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 703f2fe02c462..115bdf3b94975 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: 2023-09-08 +date: 2023-09-12 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 72e62f5a1542e..e601e02929e8a 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: 2023-09-08 +date: 2023-09-12 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 9a31d12b1fd7b..f396e8437e0d8 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: 2023-09-08 +date: 2023-09-12 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 e38a2de9610a5..22bf0da00b8ea 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index e06939c91f044..cc536cb602447 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 6eebe21d02876..762294e4846d1 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: 2023-09-08 +date: 2023-09-12 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 05a0acef1ca7f..b5d02375cb38a 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: 2023-09-08 +date: 2023-09-12 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index 9e41408f9600b..ce93c4bed937e 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -3,6 +3,7 @@ ## Disable plugins enterpriseSearch.enabled: false xpack.cloudSecurityPosture.enabled: false +xpack.infra.enabled: false xpack.securitySolution.enabled: false xpack.uptime.enabled: false xpack.legacy_uptime.enabled: false diff --git a/config/serverless.security.yml b/config/serverless.security.yml index bd92af2ecb7c4..a17b2592f0db1 100644 --- a/config/serverless.security.yml +++ b/config/serverless.security.yml @@ -3,6 +3,7 @@ ## Disable plugins enterpriseSearch.enabled: false xpack.apm.enabled: false +xpack.infra.enabled: false xpack.observability.enabled: false xpack.uptime.enabled: false xpack.legacy_uptime.enabled: false diff --git a/config/serverless.yml b/config/serverless.yml index 31791f5183d4a..3bcd531bb74f3 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -6,6 +6,7 @@ xpack.fleet.internal.fleetServerStandalone: true xpack.fleet.internal.disableILMPolicies: true xpack.fleet.internal.disableProxies: true xpack.fleet.internal.activeAgentsSoftLimit: 25000 +xpack.fleet.internal.onlyAllowAgentUpgradeToKnownVersions: true # Cloud links xpack.cloud.base_url: "https://cloud.elastic.co" diff --git a/docs/api-generated/connectors/connector-apis-passthru.asciidoc b/docs/api-generated/connectors/connector-apis-passthru.asciidoc index 004946cfdb335..3c98b232a798c 100644 --- a/docs/api-generated/connectors/connector-apis-passthru.asciidoc +++ b/docs/api-generated/connectors/connector-apis-passthru.asciidoc @@ -1012,6 +1012,7 @@ Any modifications made to this file will be overwritten.
  • config_properties_servicenow_itom - Connector request properties for a ServiceNow ITSM connector
  • config_properties_swimlane - Connector request properties for a Swimlane connector
  • config_properties_webhook - Connector request properties for a Webhook connector
  • +
  • config_properties_xmatters - Connector request properties for an xMatters connector
  • connector_response_properties - Connector response properties
  • connector_response_properties_cases_webhook - Connector request properties for a Webhook - Case Management connector
  • connector_response_properties_email - Connector response properties for an email connector
  • @@ -1096,7 +1097,9 @@ Any modifications made to this file will be overwritten.
  • secrets_properties_slack_api - Connector secrets properties for a Web API Slack connector
  • secrets_properties_slack_webhook - Connector secrets properties for a Webhook Slack connector
  • secrets_properties_swimlane - Connector secrets properties for a Swimlane connector
  • +
  • secrets_properties_teams - Connector secrets properties for a Microsoft Teams connector
  • secrets_properties_webhook - Connector secrets properties for a Webhook connector
  • +
  • secrets_properties_xmatters - Connector secrets properties for an xMatters connector
  • updateConnector_400_response -
  • update_connector_request_cases_webhook - Update Webhook - Case Managment connector request
  • update_connector_request_index - Update index connector request
  • @@ -1110,6 +1113,8 @@ Any modifications made to this file will be overwritten.
  • update_connector_request_slack_api - Update Slack connector request
  • update_connector_request_slack_webhook - Update Slack connector request
  • update_connector_request_swimlane - Update Swimlane connector request
  • +
  • update_connector_request_teams - Update Microsoft Teams connector request
  • +
  • update_connector_request_xmatters - Update xMatters connector request
  • @@ -1179,12 +1184,12 @@ Any modifications made to this file will be overwritten.

    Create_connector_request_body_properties - Create connector request body properties Up

    The properties vary depending on the connector type.
    -
    config
    map[String, oas_any_type_not_mapped] Defines properties for connectors when type is .xmatters.
    +
    config
    connector_type_id
    String The type of connector.
    Enum:
    .xmatters
    name
    String The display name for the connector.
    -
    secrets
    map[String, oas_any_type_not_mapped] Defines secrets for connectors when type is .xmatters.
    +
    secrets
    @@ -1335,9 +1340,9 @@ Any modifications made to this file will be overwritten.

    Update_connector_request_body_properties - Update connector request body properties Up

    The properties vary depending on the connector type.
    -
    config
    +
    config
    name
    String The display name for the connector.
    -
    secrets
    +
    secrets
    @@ -1484,11 +1489,19 @@ Any modifications made to this file will be overwritten.
    certificate
    full
    none
    +
    +

    config_properties_xmatters - Connector request properties for an xMatters connector Up

    +
    Defines properties for connectors when type is .xmatters.
    +
    +
    configUrl (optional)
    String The request URL for the Elastic Alerts trigger in xMatters. It is applicable only when usesBasic is true.
    +
    usesBasic (optional)
    Boolean Specifies whether the connector uses HTTP basic authentication (true) or URL authentication (false).
    +
    +

    connector_response_properties - Connector response properties Up

    The properties vary depending on the connector type.
    -
    config
    map[String, oas_any_type_not_mapped] Defines properties for connectors when type is .xmatters.
    +
    config
    connector_type_id
    String The type of connector.
    Enum:
    .xmatters
    @@ -1726,7 +1739,8 @@ Any modifications made to this file will be overwritten.

    connector_response_properties_teams - Connector response properties for a Microsoft Teams connector Up

    -
    connector_type_id
    String The type of connector.
    +
    config (optional)
    +
    connector_type_id
    String The type of connector.
    Enum:
    .teams
    id
    String The identifier for the connector.
    @@ -1773,7 +1787,7 @@ Any modifications made to this file will be overwritten.

    connector_response_properties_xmatters - Connector response properties for an xMatters connector Up

    -
    config
    map[String, oas_any_type_not_mapped] Defines properties for connectors when type is .xmatters.
    +
    config
    connector_type_id
    String The type of connector.
    Enum:
    .xmatters
    @@ -1974,7 +1988,7 @@ Any modifications made to this file will be overwritten.
    Enum:
    .teams
    name
    String The display name for the connector.
    -
    secrets
    map[String, oas_any_type_not_mapped] Defines secrets for connectors when type is .teams.
    +
    secrets
    @@ -2005,12 +2019,12 @@ Any modifications made to this file will be overwritten.

    create_connector_request_xmatters - Create xMatters connector request Up

    The xMatters connector uses the xMatters Workflow for Elastic to send actionable alerts to on-call xMatters resources.
    -
    config
    map[String, oas_any_type_not_mapped] Defines properties for connectors when type is .xmatters.
    +
    config
    connector_type_id
    String The type of connector.
    Enum:
    .xmatters
    name
    String The display name for the connector.
    -
    secrets
    map[String, oas_any_type_not_mapped] Defines secrets for connectors when type is .xmatters.
    +
    secrets
    @@ -2433,6 +2447,13 @@ Any modifications made to this file will be overwritten.
    apiToken (optional)
    String Swimlane API authentication token.
    +
    +

    secrets_properties_teams - Connector secrets properties for a Microsoft Teams connector Up

    +
    Defines secrets for connectors when type is .teams.
    +
    +
    webhookUrl
    String The URL of the incoming webhook. If you are using the xpack.actions.allowedHosts setting, add the hostname to the allowed hosts.
    +
    +

    secrets_properties_webhook - Connector secrets properties for a Webhook connector Up

    Defines secrets for connectors when type is .webhook.
    @@ -2444,6 +2465,15 @@ Any modifications made to this file will be overwritten.
    user (optional)
    String The username for HTTP basic authentication. If hasAuth is set to true and authType is webhook-authentication-basic, this property is required.
    +
    +

    secrets_properties_xmatters - Connector secrets properties for an xMatters connector Up

    +
    Defines secrets for connectors when type is .xmatters.
    +
    +
    password (optional)
    String A user name for HTTP basic authentication. It is applicable only when usesBasic is true.
    +
    secretsUrl (optional)
    String The request URL for the Elastic Alerts trigger in xMatters with the API key included in the URL. It is applicable only when usesBasic is false.
    +
    user (optional)
    String A password for HTTP basic authentication. It is applicable only when usesBasic is true.
    +
    +

    updateConnector_400_response - Up

    @@ -2556,5 +2586,22 @@ Any modifications made to this file will be overwritten.
    secrets
    + + ++++ diff --git a/docs/management/connectors/action-types/cases-webhook.asciidoc b/docs/management/connectors/action-types/cases-webhook.asciidoc index d2d72fddb3348..537bfffb88daa 100644 --- a/docs/management/connectors/action-types/cases-webhook.asciidoc +++ b/docs/management/connectors/action-types/cases-webhook.asciidoc @@ -1,9 +1,12 @@ -[role="xpack"] [[cases-webhook-action-type]] == {webhook-cm} connector and action ++++ {webhook-cm} ++++ +:frontmatter-description: Add a connector that can send requests to case management web services. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [configure] The {webhook-cm} connector uses https://github.com/axios/axios[axios] to send POST, PUT, and GET requests to a case management RESTful API web service. @@ -105,62 +108,6 @@ Create comment object:: (Optional) A JSON payload sent to the create comment URL + NOTE: Due to Mustache template variables (the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated in this step. The JSON is validated once the mustache variables have been placed and when REST method runs. We recommend manually ensuring that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. -[float] -[[preconfigured-cases-webhook-configuration]] -=== Create preconfigured connectors - -If you are running {kib} on-prem, you can define connectors by -adding `xpack.actions.preconfigured` settings to your `kibana.yml` file. -For example: - -[source,text] --- -xpack.actions.preconfigured: - my-case-management-webhook: - name: Case Management Webhook Connector - actionTypeId: .cases-webhook - config: - hasAuth: true - headers: - 'content-type': 'application/json' - createIncidentUrl: 'https://testing-jira.atlassian.net/rest/api/2/issue' - createIncidentMethod: 'post' - createIncidentJson: '{"fields":{"summary":{{{case.title}}},"description":{{{case.description}}},"labels":{{{case.tags}}}' - getIncidentUrl: 'https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}' - getIncidentResponseExternalTitleKey: 'key' - viewIncidentUrl: 'https://testing-jira.atlassian.net/browse/{{{external.system.title}}}' - updateIncidentUrl: 'https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}' - updateIncidentMethod: 'put' - updateIncidentJson: '{"fields":{"summary":{{{case.title}}},"description":{{{case.description}}},"labels":{{{case.tags}}}' - createCommentMethod: 'post', - createCommentUrl: 'https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment', - createCommentJson: '{"body": {{{case.comment}}}}', - secrets: - user: testuser - password: passwordvalue --- - -`config`:: Defines information for the connector type. -`hasAuth`::: A boolean that corresponds to *Requires authentication*. If `true`, this connector will require values for `user` and `password` inside the secrets configuration. Defaults to `true`. -`headers`::: A `record` that corresponds to *Headers*. -`createIncidentUrl`::: A URL string that corresponds to *Create Case URL*. -`createIncidentMethod`::: A string that corresponds to *Create Case Method*. -`createIncidentJson`::: A stringified JSON with Mustache variables that corresponds to *Create Case JSON*. -`createIncidentResponseKey`::: A string from the response body of the create case method that corresponds to the *External Service Id*. -`getIncidentUrl`::: A URL string with an *External Service Id* Mustache variable that corresponds to *Get Case URL*. -`getIncidentResponseExternalTitleKey`::: A string from the response body of the get case method that corresponds to the *External Service Title*. -`viewIncidentUrl`::: A URL string with either the *External Service Id* or *External Service Title* Mustache variable that corresponds to *View Case URL*. -`updateIncidentUrl`::: A URL string that corresponds to *Update Case URL*. -`updateIncidentMethod`::: A string that corresponds to *Update Case Method*. -`updateIncidentJson`::: A stringified JSON with Mustache variables that corresponds to *Update Case JSON*. -`createCommentUrl`::: A URL string that corresponds to *Create Comment URL*. -`createCommentMethod`::: A string that corresponds to *Create Comment Method*. -`createCommentJson`::: A stringified JSON with Mustache variables that corresponds to *Create Comment JSON*. - -`secrets`:: Defines sensitive information for the connector type. -`user`::: A string that corresponds to *User*. Required if `hasAuth` is set to `true`. -`password`::: A string that corresponds to *Password*. Required if `hasAuth` is set to `true`. - [float] [[cases-webhook-action-configuration]] === Test connectors diff --git a/docs/management/connectors/action-types/jira.asciidoc b/docs/management/connectors/action-types/jira.asciidoc index e57fdd87b432f..9833d2a08ec71 100644 --- a/docs/management/connectors/action-types/jira.asciidoc +++ b/docs/management/connectors/action-types/jira.asciidoc @@ -25,6 +25,7 @@ or as needed when you're creating a rule. For example: [role="screenshot"] image::management/connectors/images/jira-connector.png[Jira connector] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[jira-connector-configuration]] @@ -38,38 +39,6 @@ Project key:: Jira project key. Email:: The account email for HTTP Basic authentication. API token:: Jira API authentication token for HTTP Basic authentication. -[float] -[[preconfigured-jira-configuration]] -=== Create preconfigured connectors - -If you are running {kib} on-prem, you can define connectors by -adding `xpack.actions.preconfigured` settings to your `kibana.yml` file. -For example: - -[source,text] --- -xpack.actions.preconfigured: - my-jira: - name: preconfigured-jira-connector-type - actionTypeId: .jira - config: - apiUrl: https://elastic.atlassian.net - projectKey: ES - secrets: - email: testuser - apiToken: tokenkeystorevalue --- - -Config defines information for the connector type. - -`apiUrl`:: An address that corresponds to *URL*. -`projectKey`:: A key that corresponds to *Project Key*. - -Secrets defines sensitive information for the connector type. - -`email`:: A string that corresponds to *Email*. -`apiToken`:: A string that corresponds to *API Token*. Should be stored in the <>. - [float] [[jira-action-configuration]] === Test connectors @@ -77,9 +46,9 @@ Secrets defines sensitive information for the connector type. You can test connectors with the <> or as you're creating or editing the connector in {kib}. For example: - [role="screenshot"] image::management/connectors/images/jira-params-test.png[Jira params test] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. Jira actions have the following configuration properties. diff --git a/docs/management/connectors/action-types/teams.asciidoc b/docs/management/connectors/action-types/teams.asciidoc index fd4798be97e56..174b0173cb08a 100644 --- a/docs/management/connectors/action-types/teams.asciidoc +++ b/docs/management/connectors/action-types/teams.asciidoc @@ -3,6 +3,10 @@ ++++ Microsoft Teams ++++ +:frontmatter-description: Add a connector that can send messages to a Microsoft Teams channel. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [configure] The Microsoft Teams connector uses https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook[Incoming Webhooks]. @@ -25,28 +29,6 @@ Microsoft Teams connectors have the following configuration properties: Name:: The name of the connector. Webhook URL:: The URL of the incoming webhook. See https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook#add-an-incoming-webhook-to-a-teams-channel[Add Incoming Webhooks] for instructions on generating this URL. If you are using the <> setting, make sure the hostname is added to the allowed hosts. -[float] -[[preconfigured-teams-configuration]] -=== Create preconfigured connectors - -If you are running {kib} on-prem, you can define connectors by -adding `xpack.actions.preconfigured` settings to your `kibana.yml` file. -For example: - -[source,text] --- -xpack.actions.preconfigured: - my-teams: - name: preconfigured-teams-connector-type - actionTypeId: .teams - secrets: - webhookUrl: 'https://outlook.office.com/webhook/abcd@0123456/IncomingWebhook/abcdefgh/ijklmnopqrstuvwxyz' --- - -Secrets defines sensitive information for the connector type. - -`webhookUrl`:: A string that corresponds to *Webhook URL*. - [float] [[teams-action-configuration]] === Test connectors diff --git a/docs/management/connectors/action-types/xmatters.asciidoc b/docs/management/connectors/action-types/xmatters.asciidoc index fce6edd35ab8b..ebc230bf0b39b 100644 --- a/docs/management/connectors/action-types/xmatters.asciidoc +++ b/docs/management/connectors/action-types/xmatters.asciidoc @@ -3,6 +3,10 @@ ++++ xMatters ++++ +:frontmatter-description: Add a connector that can send alerts to xMatters. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [configure] The xMatters connector uses the https://help.xmatters.com/integrations/#cshid=Elastic[xMatters Workflow for Elastic] to send actionable alerts to on-call xMatters resources. @@ -15,9 +19,11 @@ or as needed when you're creating a rule. You must choose between basic and URL [role="screenshot"] image::management/connectors/images/xmatters-connector-basic.png[xMatters connector with basic authentication] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [role="screenshot"] image::management/connectors/images/xmatters-connector-url.png[xMatters connector with url authentication] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[xmatters-connector-configuration]] @@ -27,59 +33,12 @@ xMatters connectors have the following configuration properties: Name:: The name of the connector. Authentication Type:: The type of authentication used in the request made to xMatters. -URL:: The request URL for the Elastic Alerts trigger in xMatters. If you are using the <> setting, make sure the hostname is added to the allowed hosts. -Username:: Username for HTTP Basic Authentication. -Password:: Password for HTTP Basic Authentication. - -[float] -[[preconfigured-xmatters-configuration]] -=== Create preconfigured connectors - -If you are running {kib} on-prem, you can define connectors by -adding `xpack.actions.preconfigured` settings to your `kibana.yml` file. -For example: - -Connector using Basic Authentication -[source,text] --- -xpack.actions.preconfigured: - my-xmatters: - name: preconfigured-xmatters-connector-type - actionTypeId: .xmatters - config: - configUrl: https://test.host - usesBasic: true - secrets: - user: testuser - password: passwordkeystorevalue --- - -Connector using URL Authentication -[source,text] --- -xpack.actions.preconfigured: - my-xmatters: - name: preconfigured-xmatters-connector-type - actionTypeId: .xmatters - config: - usesBasic: false - secrets: - secretsUrl: https://test.host?apiKey=1234-abcd --- - -Config defines information for the connector type: - -`configUrl`:: A URL string that corresponds to *URL*. Only used if `usesBasic` is true. - -`usesBasic`:: A boolean that corresponds to *Authentication Type*. If `true`, this connector will require values for `user` and `password` inside the secrets configuration. Defaults to `true`. - -Secrets defines sensitive information for the connector type: - -`user`:: A string that corresponds to *User*. Required if `usesBasic` is set to `true`. - -`password`:: A string that corresponds to *Password*. Should be stored in the <>. Required if `usesBasic` is set to `true`. - -`secretsUrl`:: A URL string that corresponds to *URL*. Only used if `usesBasic` is false, indicating the API key is included in the URL. +URL:: +The request URL for the Elastic Alerts trigger in xMatters. +If you are using URL authentication, include the API key in the URL. For example, `https://example.com?apiKey=1234-abcd`. +If you are using the <> setting, make sure the hostname is added to the allowed hosts. +Username:: Username for HTTP basic authentication. +Password:: Password for HTTP basic authentication. [float] [[xmatters-action-configuration]] @@ -90,10 +49,11 @@ as you're creating or editing the connector in {kib}. For example: [role="screenshot"] image::management/connectors/images/xmatters-params-test.png[xMatters params test] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. xMatters rules have the following properties: -Severity:: Severity of the rule. +Severity:: Severity of the rule. Tags:: Comma-separated list of tags for the rule as provided by the user in Elastic. [float] diff --git a/docs/management/connectors/images/jira-connector.png b/docs/management/connectors/images/jira-connector.png index fc9a8ab31f876..5060364661296 100644 Binary files a/docs/management/connectors/images/jira-connector.png and b/docs/management/connectors/images/jira-connector.png differ diff --git a/docs/management/connectors/images/jira-params-test.png b/docs/management/connectors/images/jira-params-test.png index 78d51e823fb61..5db0bae22d35f 100644 Binary files a/docs/management/connectors/images/jira-params-test.png and b/docs/management/connectors/images/jira-params-test.png differ diff --git a/docs/management/connectors/images/xmatters-connector-basic.png b/docs/management/connectors/images/xmatters-connector-basic.png index 7e6437cab9e78..95e5bf8a82b0c 100644 Binary files a/docs/management/connectors/images/xmatters-connector-basic.png and b/docs/management/connectors/images/xmatters-connector-basic.png differ diff --git a/docs/management/connectors/images/xmatters-connector-url.png b/docs/management/connectors/images/xmatters-connector-url.png index a916fd7870fe8..185aaa0223af2 100644 Binary files a/docs/management/connectors/images/xmatters-connector-url.png and b/docs/management/connectors/images/xmatters-connector-url.png differ diff --git a/docs/management/connectors/images/xmatters-params-test.png b/docs/management/connectors/images/xmatters-params-test.png index 5f12050ada953..6d7af4d9a5fce 100644 Binary files a/docs/management/connectors/images/xmatters-params-test.png and b/docs/management/connectors/images/xmatters-params-test.png differ diff --git a/docs/management/connectors/pre-configured-connectors.asciidoc b/docs/management/connectors/pre-configured-connectors.asciidoc index c2c63ae913384..d271653d7aa28 100644 --- a/docs/management/connectors/pre-configured-connectors.asciidoc +++ b/docs/management/connectors/pre-configured-connectors.asciidoc @@ -107,11 +107,13 @@ Index names must start with `kibana-alert-history-` to take advantage of the pre === Examples * <> +* <> * <> * <> * <> * <> - +* <> +* <> [float] [[preconfigured-index-configuration]] @@ -132,6 +134,47 @@ xpack.actions.preconfigured: <1> The {es} index to be written to. <2> A field that indicates when the document was indexed. +[float] +[[preconfigured-jira-configuration]] +==== Jira connectors + +The following example creates a <>: + +[source,text] +-- +xpack.actions.preconfigured: + my-jira: + name: preconfigured-jira-connector-type + actionTypeId: .jira + config: + apiUrl: https://elastic.atlassian.net <1> + projectKey: ES <2> + secrets: + email: testuser <3> + apiToken: tokenkeystorevalue <4> +-- +<1> The Jira instance URL. +<2> The Jira project key. +<3> The account email for HTTP basic authentication. +<4> The API authentication token for HTTP basic authentication. NOTE: This value should be stored in the <>. + +[float] +[[preconfigured-teams-configuration]] +==== Microsoft Teams connectors + +The following example creates a <>: + +[source,text] +-- +xpack.actions.preconfigured: + my-teams: + name: preconfigured-teams-connector-type + actionTypeId: .teams + secrets: + webhookUrl: 'https://outlook.office.com/webhook/abcd@0123456/IncomingWebhook/abcdefgh/ijklmnopqrstuvwxyz' <1> +-- +<1> The URL of the incoming webhook. + [float] [[preconfigured-opsgenie-configuration]] ==== {opsgenie} connectors @@ -216,4 +259,94 @@ xpack.actions.preconfigured: <5> A valid user name. Required if `hasAuth` is set to `true`. <6> A valid password. Required if `hasAuth` is set to `true`. NOTE: This value should be stored in the <>. -NOTE: SSL authentication is not supported in preconfigured webhook connectors. \ No newline at end of file +NOTE: SSL authentication is not supported in preconfigured webhook connectors. + + +[float] +[[preconfigured-cases-webhook-configuration]] +==== {webhook-cm} connectors + +The following example creates a <>: + +[source,text] +-- +xpack.actions.preconfigured: + my-case-management-webhook: + name: Case Management Webhook Connector + actionTypeId: .cases-webhook + config: + hasAuth: true <1> + headers: <2> + 'content-type': 'application/json' + createIncidentUrl: 'https://testing-jira.atlassian.net/rest/api/2/issue' <3> + createIncidentMethod: 'post' <4> + createIncidentJson: '{"fields":{"summary":{{{case.title}}},"description":{{{case.description}}},"labels":{{{case.tags}}}' <5> + getIncidentUrl: 'https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}' <6> + getIncidentResponseExternalTitleKey: 'key' <7> + viewIncidentUrl: 'https://testing-jira.atlassian.net/browse/{{{external.system.title}}}' <8> + updateIncidentUrl: 'https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}' <9> + updateIncidentMethod: 'put' <10> + updateIncidentJson: '{"fields":{"summary":{{{case.title}}},"description":{{{case.description}}},"labels":{{{case.tags}}}' <11> + createCommentMethod: 'post', <12> + createCommentUrl: 'https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment', <13> + createCommentJson: '{"body": {{{case.comment}}}}', <14> + secrets: + user: testuser <15> + password: passwordvalue <16> +-- +<1> If `true`, this connector will require values for `user` and `password` inside the secrets configuration. +<2> A set of key-value pairs sent as headers with the request. +<3> A REST API URL string to create a case in the third-party system. +<4> The REST API HTTP request method to create a case in the third-party system. +<5> A stringified JSON payload with Mustache variables that is sent to the create case URL to create a case. +<6> A REST API URL string with an external service ID Mustache variable to get the case from the third-party system. +<7> A string from the response body of the get case method that corresponds to the external service title. +<8> A URL string with either the external service ID or external service title Mustache variable to view a case in the external system. +<9> The REST API URL to update the case by ID in the third-party system. +<10> The REST API HTTP request method to update the case in the third-party system. +<11> A stringified JSON payload with Mustache variables that is sent to the update case URL to update a case. +<12> The REST API HTTP request method to create a case comment in the third-party system. +<13> A REST API URL string to create a case comment by ID in the third-party system. +<14> A stringified JSON payload with Mustache variables that is sent to the create comment URL to create a case comment. +<15> A user name, which is required when `hasAuth` is `true`. +<16> A password, which is required when `hasAuth` is `true`. + +[float] +[[preconfigured-xmatters-configuration]] +==== xMatters connectors + +The following example creates an <> with basic authentication: + +[source,text] +-- +xpack.actions.preconfigured: +my-xmatters: + name: preconfigured-xmatters-connector-type + actionTypeId: .xmatters + config: + configUrl: https://test.host <1> + usesBasic: true <2> + secrets: + user: testuser <3> + password: passwordkeystorevalue <4> +-- +<1> The request URL for the Elastic Alerts trigger in xMatters. +<2> Indicates whether the connector uses HTTP basic authentication. If `true`, you must provide `user` and `password` values. Defaults to `true`. +<3> A user name for authentication, which is required when `usesBasic` is `true`. +<4> A password for authentication, which is required when `usesBasic` is `true`. NOTE: This value should be stored in the <>. + +The following example creates an xMatters connector with URL authentication: + +[source,text] +-- +xpack.actions.preconfigured: + my-xmatters: + name: preconfigured-xmatters-connector-type + actionTypeId: .xmatters + config: + usesBasic: false <1> + secrets: + secretsUrl: https://test.host?apiKey=1234-abcd <2> +-- +<1> Indicates whether the connector uses HTTP basic authentication. Set to `false` to use URL authentication. Defaults to `true`. +<2> The request URL for the Elastic Alerts trigger in xMatters with the API key included in the URL. diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index a009b8bdc7b41..ba4332c6eb756 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -262,18 +262,89 @@ The configuration details, which are specific to the type of preconfigured conne A configuration URL that varies by connector: + -- +* For a <>, specifies the Jira instance URL. * For an <>, specifies the {opsgenie} URL. For example, `https://api.opsgenie.com` or `https://api.eu.opsgenie.com`. * For a <>, specifies the PagerDuty event URL. Defaults to `https://events.pagerduty.com/v2/enqueue`. NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts. -- +`xpack.actions.preconfigured..config.configUrl`:: +For an <> with basic authentication, specifies the request URL for the Elastic Alerts trigger in xMatters. + +`xpack.actions.preconfigured..config.createCommentJson`:: +For a <>, specifies a stringified JSON payload with Mustache variables that is sent to the create comment URL to create a case comment. The required variable is `case.description`. ++ +NOTE: The JSON is validated after the Mustache variables have been placed when the REST method runs. You should manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. + +`xpack.actions.preconfigured..config.createCommentMethod`:: +For a <>, specifies the REST API HTTP request method to create a case comment in the third-party system. +For example: `post`, `put`(default), or `patch`. + +`xpack.actions.preconfigured..config.createCommentUrl`:: +For a <>, specifies a REST API URL string to create a case comment by ID in the third-party system. ++ +NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts. + +`xpack.actions.preconfigured..config.createIncidentJson`:: +For a <>, specifies a stringified JSON payload with Mustache variables that is sent to the create case URL to create a case. Required variables are `case.title` and `case.description`. ++ +NOTE: The JSON is validated after the Mustache variables have been placed when the REST method runs. You should manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. + +`xpack.actions.preconfigured..config.createIncidentMethod`:: +For a <>, specifies the REST API HTTP request method to create a case in the third-party system, either `post`(default), `put`, or `patch`. + +`xpack.actions.preconfigured..config.createIncidentUrl`:: +For a <>, specifies a REST API URL string to create a case in the third-party system. ++ +NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts. + +`xpack.actions.preconfigured..config.createIncidentResponseKey`:: +For a <>, specifies a string from the response body of the create case method that corresponds to the external service identifier. + `xpack.actions.preconfigured..config.executionTimeField`:: For an <>, a field that indicates when the document was indexed. +`xpack.actions.preconfigured..config.getIncidentResponseExternalTitleKey`:: +For a <>, specifies a string from the response body of the get case method that corresponds to the external service title. + +`xpack.actions.preconfigured..config.getIncidentUrl`:: +For a <>, specifies a REST API URL string with an external service ID Mustache variable to get the case from the third-party system. ++ +NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts. + +`xpack.actions.preconfigured..config.hasAuth`:: +For a <>, specifies whether a user and password are required inside the secrets configuration. Defaults to `true`. + +`xpack.actions.preconfigured..config.headers`:: +For a <>, specifies a set of key-value pairs sent as headers with the request. + `xpack.actions.preconfigured..config.index`:: For an <>, specifies the {es} index. +`xpack.actions.preconfigured..config.projectKey`:: +For a <>, specifies the Jira project key. + +`xpack.actions.preconfigured..config.updateIncidentJson`:: +For a <>, specifies a stringified JSON payload with Mustache variables that is sent to the update case URL to update a case. Required variables are `case.title` and `case.description`. ++ +NOTE: The JSON is validated after the Mustache variables have been placed when the REST method runs. You should manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. + +`xpack.actions.preconfigured..config.updateIncidentMethod`:: +For a <>, specifies the REST API HTTP request method to update the case in the third-party system. +For example: `post`, `put`(default), or `patch`. + +`xpack.actions.preconfigured..config.updateIncidentUrl`:: +For a <>, specifies the REST API URL to update the case by ID in the third-party system. ++ +NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts. + +`xpack.actions.preconfigured..config.usesBasic`:: +For an <>, specifies whether it uses HTTP basic authentication. Defaults to `true`. + +`xpack.actions.preconfigured..config.viewIncidentUrl`:: +For a <>, specifies a URL string with either the external service ID or external service title Mustache variable to view a case in the external system. + `xpack.actions.preconfigured..name`:: The name of the preconfigured connector. @@ -289,9 +360,42 @@ An API key secret that varies by connector: * For an <>, specifies the {opsgenie} API authentication key for HTTP basic authentication. -- +`xpack.actions.preconfigured..secrets.apiToken`:: +For a <>, specifies the API authentication token for HTTP basic authentication. + +`xpack.actions.preconfigured..secrets.email`:: +For a <>, specifies the account email for HTTP basic authentication. + +`xpack.actions.preconfigured..secrets.password`:: +A password secret that varies by connector: ++ +-- +* For a <>, specifies a password that is required when `xpack.actions.preconfigured..config.hasAuth` is `true`. +* For an <>, specifies a password that is required when `xpack.actions.preconfigured..config.usesBasic` is `true`. +-- + `xpack.actions.preconfigured..secrets.routingKey`:: For a <>, specifies the 32 character PagerDuty Integration Key for an integration on a service, also referred to as the routing key. +`xpack.actions.preconfigured..secrets.secretsUrl`:: +For an <> with URL authentication, specifies the request URL for the Elastic Alerts trigger in xMatters with the API key included in the URL. +It is used only when `xpack.actions.preconfigured..config.usesBasic` is `false`. ++ +NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure this hostname is added to the allowed hosts. + +`xpack.actions.preconfigured..secrets.user`:: +A user name secret that varies by connector: ++ +-- +* For a <>, specifies a user name that is required when `xpack.actions.preconfigured..config.hasAuth` is `true`. +* For an <>, specifies a user name that is required when `xpack.actions.preconfigured..config.usesBasic` is `true`. +-- +`xpack.actions.preconfigured..secrets.webhookUrl`:: +For a <>, specifies the URL of the incoming webhook. ++ +NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname is added to the allowed hosts. + + [float] [[alert-settings]] === Alerting settings diff --git a/docs/user/api.asciidoc b/docs/user/api.asciidoc index f71b32fa5b9ba..32e4115fe59dc 100644 --- a/docs/user/api.asciidoc +++ b/docs/user/api.asciidoc @@ -53,6 +53,8 @@ Calls to the API endpoints require different operations. To interact with the {k * *PUT* - Updates the existing information. +* *PATCH* - Applies partial modifications to the existing information. + * *DELETE* - Removes the information. [float] diff --git a/examples/unified_field_list_examples/public/field_list_sidebar.tsx b/examples/unified_field_list_examples/public/field_list_sidebar.tsx index 121132e89b810..9e71071d327ce 100644 --- a/examples/unified_field_list_examples/public/field_list_sidebar.tsx +++ b/examples/unified_field_list_examples/public/field_list_sidebar.tsx @@ -33,6 +33,8 @@ const getCreationOptions: UnifiedFieldListSidebarContainerProps['getCreationOpti originatingApp: PLUGIN_ID, localStorageKeyPrefix: 'examples', timeRangeUpdatesType: 'timefilter', + compressed: true, + showSidebarToggleButton: true, disablePopularFields: true, }; }; diff --git a/package.json b/package.json index 20507f57e6134..fa7ceb4edd592 100644 --- a/package.json +++ b/package.json @@ -500,7 +500,13 @@ "@kbn/logstash-plugin": "link:x-pack/plugins/logstash", "@kbn/management-cards-navigation": "link:packages/kbn-management/cards_navigation", "@kbn/management-plugin": "link:src/plugins/management", + "@kbn/management-settings-components-field-input": "link:packages/kbn-management/settings/components/field_input", + "@kbn/management-settings-components-field-row": "link:packages/kbn-management/settings/components/field_row", + "@kbn/management-settings-field-definition": "link:packages/kbn-management/settings/field_definition", + "@kbn/management-settings-ids": "link:packages/kbn-management/settings/setting_ids", "@kbn/management-settings-section-registry": "link:packages/kbn-management/settings/section_registry", + "@kbn/management-settings-types": "link:packages/kbn-management/settings/types", + "@kbn/management-settings-utilities": "link:packages/kbn-management/settings/utilities", "@kbn/management-test-plugin": "link:test/plugin_functional/plugins/management_test_plugin", "@kbn/mapbox-gl": "link:packages/kbn-mapbox-gl", "@kbn/maps-custom-raster-source-plugin": "link:x-pack/examples/third_party_maps_source_example", @@ -558,6 +564,7 @@ "@kbn/presentation-util-plugin": "link:src/plugins/presentation_util", "@kbn/profiling-data-access-plugin": "link:x-pack/plugins/profiling_data_access", "@kbn/profiling-plugin": "link:x-pack/plugins/profiling", + "@kbn/profiling-utils": "link:packages/kbn-profiling-utils", "@kbn/random-sampling": "link:x-pack/packages/kbn-random-sampling", "@kbn/react-field": "link:packages/kbn-react-field", "@kbn/react-kibana-context-common": "link:packages/react/kibana_context/common", @@ -638,9 +645,13 @@ "@kbn/server-http-tools": "link:packages/kbn-server-http-tools", "@kbn/server-route-repository": "link:packages/kbn-server-route-repository", "@kbn/serverless": "link:x-pack/plugins/serverless", + "@kbn/serverless-common-settings": "link:packages/serverless/settings/common", "@kbn/serverless-observability": "link:x-pack/plugins/serverless_observability", + "@kbn/serverless-observability-settings": "link:packages/serverless/settings/observability_project", "@kbn/serverless-project-switcher": "link:packages/serverless/project_switcher", "@kbn/serverless-search": "link:x-pack/plugins/serverless_search", + "@kbn/serverless-search-settings": "link:packages/serverless/settings/search_project", + "@kbn/serverless-security-settings": "link:packages/serverless/settings/security_project", "@kbn/serverless-types": "link:packages/serverless/types", "@kbn/session-notifications-plugin": "link:test/plugin_functional/plugins/session_notifications", "@kbn/session-view-plugin": "link:x-pack/plugins/session_view", @@ -1074,7 +1085,7 @@ "@cypress/webpack-preprocessor": "^5.12.2", "@elastic/eslint-plugin-eui": "0.0.2", "@elastic/makelogs": "^6.1.1", - "@elastic/synthetics": "^1.3.0", + "@elastic/synthetics": "^1.4.0", "@emotion/babel-preset-css-prop": "^11.11.0", "@emotion/jest": "^11.11.0", "@frsource/cypress-plugin-visual-regression-diff": "^3.3.10", @@ -1531,7 +1542,7 @@ "pirates": "^4.0.1", "piscina": "^3.2.0", "pixelmatch": "^5.3.0", - "playwright": "^1.35.0", + "playwright": "=1.37.0", "pngjs": "^3.4.0", "postcss": "^8.4.14", "postcss-loader": "^4.2.0", diff --git a/packages/content-management/content_editor/src/__jest__/tests.helpers.tsx b/packages/content-management/content_editor/src/__jest__/tests.helpers.tsx index b2bc4c9850f49..d71b237010c1c 100644 --- a/packages/content-management/content_editor/src/__jest__/tests.helpers.tsx +++ b/packages/content-management/content_editor/src/__jest__/tests.helpers.tsx @@ -7,14 +7,11 @@ */ import React from 'react'; import type { ComponentType } from 'react'; -import { of } from 'rxjs'; import { TagSelector, TagList } from '../mocks'; import { ContentEditorProvider } from '../services'; import type { Services } from '../services'; -const theme$ = of({ darkMode: false }); - export const getMockServices = (overrides?: Partial) => { const services = { openFlyout: jest.fn(() => ({ @@ -24,7 +21,6 @@ export const getMockServices = (overrides?: Partial) => { TagList, TagSelector, notifyError: () => undefined, - theme$, ...overrides, }; diff --git a/packages/content-management/content_editor/src/components/editor_loader.tsx b/packages/content-management/content_editor/src/components/editor_loader.tsx index ee621949b5ba8..b15009f3b4db1 100644 --- a/packages/content-management/content_editor/src/components/editor_loader.tsx +++ b/packages/content-management/content_editor/src/components/editor_loader.tsx @@ -7,21 +7,11 @@ */ import React, { useState, useCallback, useEffect } from 'react'; -import { EuiFlyoutHeader, EuiFlyoutBody, EuiFlyoutFooter, EuiThemeProvider } from '@elastic/eui'; -import useObservable from 'react-use/lib/useObservable'; -import { Observable, of } from 'rxjs'; - -import { Theme } from '../services'; +import { EuiFlyoutHeader, EuiFlyoutBody, EuiFlyoutFooter } from '@elastic/eui'; import type { Props } from './editor_flyout_content_container'; -const themeDefault = { darkMode: false }; - -export const ContentEditorLoader: React.FC }> = ({ - theme$, - ...rest -}) => { +export const ContentEditorLoader: React.FC = (props) => { const [Editor, setEditor] = useState | null>(null); - const { darkMode } = useObservable(theme$ ?? of(themeDefault), themeDefault); const loadEditor = useCallback(async () => { const { ContentEditorFlyoutContentContainer } = await import( @@ -36,9 +26,7 @@ export const ContentEditorLoader: React.FC }, [loadEditor]); return Editor ? ( - - - + ) : ( <> diff --git a/packages/content-management/content_editor/src/open_content_editor.tsx b/packages/content-management/content_editor/src/open_content_editor.tsx index e2521eaa996c1..37d06be73aeb4 100644 --- a/packages/content-management/content_editor/src/open_content_editor.tsx +++ b/packages/content-management/content_editor/src/open_content_editor.tsx @@ -20,7 +20,7 @@ export type OpenContentEditorParams = Pick< export function useOpenContentEditor() { const services = useServices(); - const { openFlyout, theme$ } = services; + const { openFlyout } = services; const flyout = useRef(null); return useCallback( @@ -35,12 +35,7 @@ export function useOpenContentEditor() { }; flyout.current = openFlyout( - , + , { maxWidth: 600, size: 'm', @@ -51,6 +46,6 @@ export function useOpenContentEditor() { return closeFlyout; }, - [openFlyout, services, theme$] + [openFlyout, services] ); } diff --git a/packages/content-management/content_editor/src/services.tsx b/packages/content-management/content_editor/src/services.tsx index 6b5536a2961e5..9eb75c0cb3d04 100644 --- a/packages/content-management/content_editor/src/services.tsx +++ b/packages/content-management/content_editor/src/services.tsx @@ -38,7 +38,6 @@ export interface Services { notifyError: NotifyFn; TagList?: FC<{ references: SavedObjectsReference[] }>; TagSelector?: React.FC; - theme$: Observable; } const ContentEditorContext = React.createContext(null); @@ -111,6 +110,7 @@ export const ContentEditorKibanaProvider: FC = }) => { const { core, toMountPoint, savedObjectsTagging } = services; const { openFlyout: coreOpenFlyout } = core.overlays; + const { theme$ } = core.theme; const TagList = useMemo(() => { const Comp: Services['TagList'] = ({ references }) => { @@ -126,9 +126,9 @@ export const ContentEditorKibanaProvider: FC = const openFlyout = useCallback( (node: ReactNode, options: OverlayFlyoutOpenOptions) => { - return coreOpenFlyout(toMountPoint(node), options); + return coreOpenFlyout(toMountPoint(node, { theme$ }), options); }, - [toMountPoint, coreOpenFlyout] + [coreOpenFlyout, toMountPoint, theme$] ); return ( @@ -139,7 +139,6 @@ export const ContentEditorKibanaProvider: FC = }} TagList={TagList} TagSelector={savedObjectsTagging?.ui.components.SavedObjectSaveModalTagSelector} - theme$={core.theme.theme$} > {children} diff --git a/packages/content-management/table_list_view_table/src/__jest__/tests.helpers.tsx b/packages/content-management/table_list_view_table/src/__jest__/tests.helpers.tsx index a81ba92b07f5a..5fb8b605d9202 100644 --- a/packages/content-management/table_list_view_table/src/__jest__/tests.helpers.tsx +++ b/packages/content-management/table_list_view_table/src/__jest__/tests.helpers.tsx @@ -7,7 +7,7 @@ */ import React from 'react'; import type { ComponentType } from 'react'; -import { from, of } from 'rxjs'; +import { from } from 'rxjs'; import { ContentEditorProvider } from '@kbn/content-management-content-editor'; import { TagList } from '../mocks'; @@ -31,13 +31,11 @@ export const getMockServices = (overrides?: Partial) => { return services; }; -const theme$ = of({ darkMode: false }); - export function WithServices

    (Comp: ComponentType

    , overrides: Partial = {}) { return (props: P) => { const services = getMockServices(overrides); return ( - undefined} theme$={theme$}> + undefined}> diff --git a/packages/core/http/core-http-router-server-internal/src/router.ts b/packages/core/http/core-http-router-server-internal/src/router.ts index c265a7590d958..5177464796291 100644 --- a/packages/core/http/core-http-router-server-internal/src/router.ts +++ b/packages/core/http/core-http-router-server-internal/src/router.ts @@ -201,7 +201,6 @@ export class Router( uiSettings: { register: deps.uiSettings.register, registerGlobal: deps.uiSettings.registerGlobal, + setAllowlist: deps.uiSettings.setAllowlist, }, userSettings: { setUserProfileSettings: deps.userSettings.setUserProfileSettings, diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_config.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_config.ts index 747b184c1a2f0..f09746325ce98 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_config.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/saved_objects_config.ts @@ -45,7 +45,7 @@ const migrationSchema = schema.object({ * The delay that the migrator will wait for, in seconds, when updating the * index mapping's meta to let the other nodes pickup the changes. */ - metaPickupSyncDelaySec: schema.number({ min: 1, defaultValue: 120 }), + metaPickupSyncDelaySec: schema.number({ min: 1, defaultValue: 5 }), /** * The document migration phase will be run from instances with any of the specified roles. * diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/clone_index.test.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/clone_index.test.ts index 73cba7294aa63..1fcf778602454 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/clone_index.test.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/clone_index.test.ts @@ -73,7 +73,7 @@ describe('cloneIndex', () => { `); }); - it('calls client.indices.clone with the correct parameter for serverless ES', async () => { + it('resolve left with operation_not_supported for serverless ES', async () => { const statelessCapabilities = elasticsearchServiceMock.createCapabilities({ serverless: true }); const task = cloneIndex({ client, @@ -81,27 +81,14 @@ describe('cloneIndex', () => { target: 'my_target_index', esCapabilities: statelessCapabilities, }); - try { - await task(); - } catch (e) { - /** ignore */ - } - expect(client.indices.clone.mock.calls[0][0]).toMatchInlineSnapshot(` + const result = await task(); + expect(result).toMatchInlineSnapshot(` Object { - "index": "my_source_index", - "settings": Object { - "index": Object { - "blocks.write": false, - "mapping": Object { - "total_fields": Object { - "limit": 1500, - }, - }, - }, + "_tag": "Left", + "left": Object { + "operationName": "clone", + "type": "operation_not_supported", }, - "target": "my_target_index", - "timeout": "60s", - "wait_for_active_shards": "all", } `); }); diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/clone_index.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/clone_index.ts index 9bce341d242b3..7334f17191df0 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/clone_index.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/clone_index.ts @@ -18,7 +18,7 @@ import { catchRetryableEsClientErrors, type RetryableEsClientError, } from './catch_retryable_es_client_errors'; -import type { IndexNotFound, AcknowledgeResponse } from '.'; +import type { IndexNotFound, AcknowledgeResponse, OperationNotSupported } from '.'; import { type IndexNotGreenTimeout, waitForIndexStatus } from './wait_for_index_status'; import { DEFAULT_TIMEOUT, @@ -58,25 +58,41 @@ export const cloneIndex = ({ target, timeout = DEFAULT_TIMEOUT, }: CloneIndexParams): TaskEither.TaskEither< - RetryableEsClientError | IndexNotFound | IndexNotGreenTimeout | ClusterShardLimitExceeded, + | RetryableEsClientError + | IndexNotFound + | IndexNotGreenTimeout + | ClusterShardLimitExceeded + | OperationNotSupported, CloneIndexResponse > => { const cloneTask: TaskEither.TaskEither< - RetryableEsClientError | IndexNotFound | ClusterShardLimitExceeded, + RetryableEsClientError | IndexNotFound | ClusterShardLimitExceeded | OperationNotSupported, AcknowledgeResponse > = () => { - const indexSettings = { - // The source we're cloning from will have a write block set, so - // we need to remove it to allow writes to our newly cloned index - 'blocks.write': false, - // Increase the fields limit beyond the default of 1000 - mapping: { - total_fields: { limit: 1500 }, - }, - // settings not being supported on serverless ES - ...(esCapabilities.serverless - ? {} - : { + // clone is not supported on serverless + if (esCapabilities.serverless) { + return Promise.resolve( + Either.left({ + type: 'operation_not_supported' as const, + operationName: 'clone', + }) + ); + } + + return client.indices + .clone({ + index: source, + target, + wait_for_active_shards: WAIT_FOR_ALL_SHARDS_TO_BE_ACTIVE, + settings: { + index: { + // The source we're cloning from will have a write block set, so + // we need to remove it to allow writes to our newly cloned index + 'blocks.write': false, + // Increase the fields limit beyond the default of 1000 + mapping: { + total_fields: { limit: 1500 }, + }, // The rest of the index settings should have already been applied // to the source index and will be copied to the clone target. But // we repeat it here for explicitness. @@ -88,16 +104,7 @@ export const cloneIndex = ({ refresh_interval: '1s', // Bump priority so that recovery happens before newer indices priority: 10, - }), - }; - - return client.indices - .clone({ - index: source, - target, - wait_for_active_shards: WAIT_FOR_ALL_SHARDS_TO_BE_ACTIVE, - settings: { - index: indexSettings, + }, }, timeout, }) diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/es_errors.test.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/es_errors.test.ts index a68cc62e76c50..ae53e993c411f 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/es_errors.test.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/es_errors.test.ts @@ -106,6 +106,15 @@ describe('isClusterShardLimitExceeded', () => { }) ).toEqual(true); }); + it('returns true with illegal_argument_exception and reason is maximum normal shards open', () => { + expect( + isClusterShardLimitExceeded({ + type: 'illegal_argument_exception', + reason: + 'Validation Failed: 1: this action would add [2] shards, but this cluster currently has [3]/[1] maximum normal shards open;', + }) + ).toEqual(true); + }); it('returns false for validation_exception with another reason', () => { expect( isClusterShardLimitExceeded({ diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/es_errors.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/es_errors.ts index c4eeebd7df216..735bdabf789c7 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/es_errors.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/es_errors.ts @@ -27,8 +27,10 @@ export const isIndexNotFoundException = (errorCause?: estypes.ErrorCause): boole }; export const isClusterShardLimitExceeded = (errorCause?: estypes.ErrorCause): boolean => { + // traditional ES: validation_exception. serverless ES: illegal_argument_exception return ( - errorCause?.type === 'validation_exception' && + (errorCause?.type === 'validation_exception' || + errorCause?.type === 'illegal_argument_exception') && errorCause?.reason?.match( /this action would add .* shards, but this cluster currently has .* maximum normal shards open/ ) !== null diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/index.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/index.ts index 270926a10cbab..c06cd5f05c135 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/index.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/index.ts @@ -136,6 +136,11 @@ export interface IndexNotFound { index: string; } +export interface OperationNotSupported { + type: 'operation_not_supported'; + operationName: string; +} + export interface WaitForReindexTaskFailure { readonly cause: { type: string; reason: string }; } @@ -179,6 +184,7 @@ export interface ActionErrorTypeMap { synchronization_failed: SynchronizationFailed; actual_mappings_incomplete: ActualMappingsIncomplete; compared_mappings_changed: ComparedMappingsChanged; + operation_not_supported: OperationNotSupported; } /** diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/model/model.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/model/model.ts index 2264ca388c975..563b138fdb45f 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/model/model.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/model/model.ts @@ -1167,6 +1167,12 @@ export const model = (currentState: State, resW: ResponseType): controlState: 'FATAL', reason: `${CLUSTER_SHARD_LIMIT_EXCEEDED_REASON} See ${stateP.migrationDocLinks.clusterShardLimitExceeded}`, }; + } else if (isTypeof(left, 'operation_not_supported')) { + return { + ...stateP, + controlState: 'FATAL', + reason: `Action failed due to unsupported operation: ${left.operationName}`, + }; } else { throwBadResponse(stateP, left); } diff --git a/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_serverless_root.ts b/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_serverless_root.ts index 3e12b16832714..5802002edb71c 100644 --- a/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_serverless_root.ts +++ b/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_serverless_root.ts @@ -12,6 +12,7 @@ import { Client, HttpConnection } from '@elastic/elasticsearch'; import { Cluster } from '@kbn/es'; import { REPO_ROOT } from '@kbn/repo-info'; import { ToolingLog } from '@kbn/tooling-log'; +import { esTestConfig } from '@kbn/test'; import { CliArgs } from '@kbn/config'; import { createRoot, type TestElasticsearchUtils, type TestKibanaUtils } from './create_root'; @@ -25,6 +26,8 @@ export interface TestServerlessUtils { startKibana: (abortSignal?: AbortSignal) => Promise; } +const ES_BASE_PATH_DIR = Path.join(REPO_ROOT, '.es/es_test_serverless'); + /** * See docs in {@link TestUtils}. This function provides the same utilities but * configured for serverless. @@ -36,9 +39,11 @@ export function createTestServerlessInstances({ }: { adjustTimeout: (timeout: number) => void; }): TestServerlessUtils { + adjustTimeout?.(150_000); + const esUtils = createServerlessES(); const kbUtils = createServerlessKibana(); - adjustTimeout?.(120_000); + return { startES: async () => { const { stop, getClient } = await esUtils.start(); @@ -63,26 +68,31 @@ export function createTestServerlessInstances({ }; } -const ES_BASE_PATH_DIR = Path.join(REPO_ROOT, '.es/es_test_serverless'); function createServerlessES() { const log = new ToolingLog({ level: 'info', writeTo: process.stdout, }); const es = new Cluster({ log }); + const esPort = esTestConfig.getPort(); return { es, start: async () => { await es.runServerless({ basePath: ES_BASE_PATH_DIR, + port: esPort, teardown: true, background: true, clean: true, kill: true, waitForReady: true, + // security is enabled by default, if needed kibana requires serviceAccountToken + esArgs: ['xpack.security.enabled=false'], }); + const client = getServerlessESClient({ port: esPort }); + return { - getClient: getServerlessESClient, + getClient: () => client, stop: async () => { await es.stop(); }, @@ -91,10 +101,9 @@ function createServerlessES() { }; } -const getServerlessESClient = () => { +const getServerlessESClient = ({ port }: { port: number }) => { return new Client({ - // node ports not configurable from - node: 'http://localhost:9200', + node: `http://localhost:${port}`, Connection: HttpConnection, }); }; @@ -108,6 +117,9 @@ const getServerlessDefault = () => { strictClientVersionCheck: false, }, }, + elasticsearch: { + hosts: [`http://localhost:${esTestConfig.getPort()}`], + }, migrations: { algorithm: 'zdt', zdt: { @@ -134,6 +146,7 @@ const getServerlessDefault = () => { }, }; }; + function createServerlessKibana(settings = {}, cliArgs: Partial = {}) { return createRoot(defaultsDeep(settings, getServerlessDefault()), { ...cliArgs, 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 index ac74201e0f307..65a3c44861ed5 100644 --- 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 @@ -116,6 +116,10 @@ You can use \`IUiSettingsClient.get("${key}", defaultValue)\`, which will just r return this.isDeclared(key) && Boolean(this.cache[key].isOverridden); } + isStrictReadonly(key: string) { + return this.isDeclared(key) && Boolean(this.cache[key].readonlyMode === 'strict'); + } + getUpdate$() { return this.update$.asObservable(); } @@ -130,6 +134,9 @@ You can use \`IUiSettingsClient.get("${key}", defaultValue)\`, which will just r `Unable to update "${key}" because its value is overridden by the Kibana server` ); } + if (this.isStrictReadonly(key)) { + throw new Error(`Unable to update "${key}" because this setting is not in the allowlist.`); + } } protected abstract update(key: string, newVal: any): Promise; diff --git a/packages/core/ui-settings/core-ui-settings-common/index.ts b/packages/core/ui-settings/core-ui-settings-common/index.ts index f04a41613f76f..02604e122a2ae 100644 --- a/packages/core/ui-settings/core-ui-settings-common/index.ts +++ b/packages/core/ui-settings/core-ui-settings-common/index.ts @@ -8,6 +8,7 @@ export type { UiSettingsType, + ReadonlyModeType, DeprecationSettings, UiSettingsParams, UserProvidedValues, diff --git a/packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts b/packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts index 9a4cf094433d4..2655eda8b94b9 100644 --- a/packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts +++ b/packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts @@ -25,6 +25,14 @@ export type UiSettingsType = | 'image' | 'color'; +/** + * Type for the readonly mode of the readonly settings. + * 'strict' indicates that the value cannot be changed through API and is not displayed in the UI + * 'ui' indicates that the value is just not displayed in the UI + * @public + * */ +export type ReadonlyModeType = 'strict' | 'ui'; + /** * UiSettings deprecation field options. * @public @@ -57,6 +65,8 @@ export interface UiSettingsParams { requiresPageReload?: boolean; /** a flag indicating that value cannot be changed */ readonly?: boolean; + /** a flag indicating the level of restriction of the readonly settings {@link ReadonlyModeType} */ + readonlyMode?: ReadonlyModeType; /** * a flag indicating that value might contain user sensitive data. * used by telemetry to mask the value of the setting when sent. 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 23438e2ab74af..72450e86eadb1 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 @@ -112,6 +112,18 @@ describe('uiSettings', () => { expect(() => setup.registerGlobal(defaults)).not.toThrow(); }); }); + + describe('#setAllowlist', () => { + // Skipped because we disabled this multi-call check temporarily + it.skip('throws if setAllowlist is called twice', async () => { + const { setAllowlist } = await service.setup(setupDeps); + setAllowlist(['mySetting']); + + expect(() => setAllowlist(['newSetting'])).toThrowErrorMatchingInlineSnapshot( + `"The uiSettings allowlist has already been set up. Instead of calling setAllowlist(), add your settings to packages/serverless/settings"` + ); + }); + }); }); describe('#start', () => { @@ -213,6 +225,59 @@ describe('uiSettings', () => { await customizedService.start(); }); + + it('throws when the allowlist contains unregistered settings', async () => { + const { setAllowlist } = await service.setup(setupDeps); + setAllowlist(['mySetting']); + + await expect(service.start()).rejects.toMatchInlineSnapshot( + `[Error: The uiSetting with key [mySetting] is in the allowlist but is not registered. Make sure to remove it from the allowlist in /packages/serverless/settings]` + ); + }); + }); + + describe('#applyAllowlist', () => { + const settingId = 'mySetting'; + const testSetting = { + name: 'My setting', + value: 10, + readonly: true, + schema: schema.number(), + }; + + it('allowlisted readonly settings have "ui" readonly mode', async () => { + const { register, setAllowlist } = await service.setup(setupDeps); + register({ [settingId]: testSetting }); + setAllowlist([settingId]); + + const expectedSetting = { + ...testSetting, + readonlyMode: 'ui', + }; + + const start = await service.start(); + start.asScopedToClient(savedObjectsClient); + expect(MockUiSettingsClientConstructor.mock.calls[0][0].defaults).toEqual({ + [settingId]: expectedSetting, + }); + }); + + it('non-allowlisted settings have "strict" readonly mode', async () => { + const { register, setAllowlist } = await service.setup(setupDeps); + register({ [settingId]: testSetting }); + setAllowlist([]); + + const expectedSetting = { + ...testSetting, + readonlyMode: 'strict', + }; + + const start = await service.start(); + start.asScopedToClient(savedObjectsClient); + expect(MockUiSettingsClientConstructor.mock.calls[0][0].defaults).toEqual({ + [settingId]: expectedSetting, + }); + }); }); describe('#asScopedToClient', () => { 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 3352ab0ab63b0..63b3ef7f66262 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 @@ -15,7 +15,11 @@ 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, UiSettingsScope } from '@kbn/core-ui-settings-common'; +import type { + ReadonlyModeType, + UiSettingsParams, + UiSettingsScope, +} from '@kbn/core-ui-settings-common'; import { UiSettingsConfigType, uiSettingsConfig as uiConfigDefinition } from './ui_settings_config'; import { UiSettingsClient, UiSettingsClientFactory, UiSettingsGlobalClient } from './clients'; import type { @@ -47,14 +51,17 @@ export class UiSettingsService private readonly log: Logger; private readonly config$: Observable; private readonly isDist: boolean; + private readonly isDev: boolean; private readonly uiSettingsDefaults = new Map(); private readonly uiSettingsGlobalDefaults = new Map(); private overrides: Record = {}; + private allowlist: Set | null = null; constructor(private readonly coreContext: CoreContext) { this.log = coreContext.logger.get('ui-settings-service'); this.isDist = coreContext.env.packageInfo.dist; this.config$ = coreContext.configService.atPath(uiConfigDefinition.path); + this.isDev = coreContext.env.mode.dev; } public async preboot(): Promise { @@ -94,10 +101,19 @@ export class UiSettingsService return { register: this.register, registerGlobal: this.registerGlobal, + setAllowlist: this.setAllowlist, }; } public async start(): Promise { + if (this.allowlist) { + // If we are in development mode, check if all settings in the allowlist are registered + if (this.isDev) { + this.validateAllowlist(); + } + this.applyAllowlist(this.uiSettingsDefaults, false); + this.applyAllowlist(this.uiSettingsGlobalDefaults, true); + } this.validatesDefinitions(); this.validatesOverrides(); @@ -148,6 +164,55 @@ export class UiSettingsService }); }; + private setAllowlist = (keys: string[]) => { + // Disabling this check for now since it causes some test failures + // if (this.allowlist) { + // throw new Error( + // `The uiSettings allowlist has already been set up. Instead of calling setAllowlist(), add your settings to packages/serverless/settings` + // ); + // } + this.allowlist = new Set(keys); + }; + + private validateAllowlist() { + this.allowlist?.forEach((key) => { + if (!this.uiSettingsDefaults.has(key) && !this.uiSettingsGlobalDefaults.has(key)) { + throw new Error( + `The uiSetting with key [${key}] is in the allowlist but is not registered. Make sure to remove it from the allowlist in /packages/serverless/settings` + ); + } + }); + } + + private setReadonlyMode(key: string, mode: ReadonlyModeType, isGlobal: boolean) { + if (isGlobal) { + const definition = this.uiSettingsGlobalDefaults.get(key); + if (definition) { + this.uiSettingsGlobalDefaults.set(key, { ...definition, readonlyMode: mode }); + } + } else { + const definition = this.uiSettingsDefaults.get(key); + if (definition) { + this.uiSettingsDefaults.set(key, { ...definition, readonlyMode: mode }); + } + } + } + + private applyAllowlist(settingsDefaults: Map, isGlobal: boolean) { + for (const [key, definition] of settingsDefaults) { + // Settings in the allowlist that are already read-only should have 'ui' readonly mode + if (this.allowlist?.has(key) && definition.readonly === true) { + this.setReadonlyMode(key, 'ui', isGlobal); + } + + // Setting that are not in the allowlist should have 'strict' readonly mode + if (!this.allowlist?.has(key)) { + definition.readonly = true; + this.setReadonlyMode(key, 'strict', isGlobal); + } + } + } + private validatesDefinitions() { for (const [key, definition] of this.uiSettingsDefaults) { if (!definition.schema) { 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 5d4b4c62ebb1e..280d75319a8bf 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 @@ -49,6 +49,7 @@ const createSetupMock = () => { const mocked: jest.Mocked = { register: jest.fn(), registerGlobal: jest.fn(), + setAllowlist: jest.fn(), }; return mocked; 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 18d25a9031b24..65bae4100e4ad 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 @@ -48,6 +48,19 @@ export interface UiSettingsServiceSetup { * ``` */ registerGlobal(settings: Record): void; + + /** + * Sets an allowlist of setting keys. + * @param keys + * + * @example + * ```ts + * setup(core: CoreSetup){ + * core.uiSettings.setAllowlist(['csv:quoteValues', 'dateFormat:dow']); + * } + * ``` + */ + setAllowlist(keys: string[]): void; } /** @public */ diff --git a/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace_long.ts b/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace_long.ts index 693e1945f6097..cd4b719494b56 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace_long.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/distributed_trace_long.ts @@ -49,7 +49,7 @@ const scenario: Scenario = async (runOptions: RunOptions) => { timestamp, children: (_) => { _.service({ - repeat: 10, + repeat: 80, serviceInstance: synthNode, transactionName: 'GET /nodejs/products', latency: 100, @@ -60,7 +60,7 @@ const scenario: Scenario = async (runOptions: RunOptions) => { transactionName: 'GET /go', children: (_) => { _.service({ - repeat: 20, + repeat: 50, serviceInstance: synthJava, transactionName: 'GET /java', children: (_) => { @@ -83,7 +83,7 @@ const scenario: Scenario = async (runOptions: RunOptions) => { serviceInstance: synthNode, transactionName: 'GET /nodejs/users', latency: 100, - repeat: 10, + repeat: 40, children: (_) => { _.service({ serviceInstance: synthGo, @@ -91,7 +91,7 @@ const scenario: Scenario = async (runOptions: RunOptions) => { latency: 50, children: (_) => { _.service({ - repeat: 10, + repeat: 40, serviceInstance: synthDotnet, transactionName: 'GET /dotnet/cases/4', latency: 50, diff --git a/packages/kbn-dom-drag-drop/src/drag_drop.test.tsx b/packages/kbn-dom-drag-drop/src/drag_drop.test.tsx index 54965548aa264..09de21fbe3dc9 100644 --- a/packages/kbn-dom-drag-drop/src/drag_drop.test.tsx +++ b/packages/kbn-dom-drag-drop/src/drag_drop.test.tsx @@ -119,6 +119,28 @@ describe('DragDrop', () => { }); }); + test('dragstart sets dragClassName as expected', async () => { + const dndDispatch = jest.fn(); + const component = mount( + + + + + + ); + const dragDrop = component.find('[data-test-subj="testDragDrop"]').at(0); + + expect(dragDrop.getDOMNode().querySelector('.dragTest')).toBeNull(); + dragDrop.simulate('dragstart', { dataTransfer }); + expect(dragDrop.getDOMNode().querySelector('.dragTest')).toBeDefined(); + + act(() => { + jest.runAllTimers(); + }); + + expect(dragDrop.getDOMNode().querySelector('.dragTest')).toBeNull(); + }); + test('drop resets all the things', async () => { const preventDefault = jest.fn(); const stopPropagation = jest.fn(); diff --git a/packages/kbn-dom-drag-drop/src/drag_drop.tsx b/packages/kbn-dom-drag-drop/src/drag_drop.tsx index ab4158ad31543..b20570ee6969c 100644 --- a/packages/kbn-dom-drag-drop/src/drag_drop.tsx +++ b/packages/kbn-dom-drag-drop/src/drag_drop.tsx @@ -42,6 +42,10 @@ interface BaseProps { * The CSS class(es) for the root element. */ className?: string; + /** + * CSS class to apply when the item is being dragged + */ + dragClassName?: string; /** * The event handler that fires when an item @@ -212,6 +216,7 @@ const removeSelection = () => { const DragInner = memo(function DragInner({ dataTestSubj, className, + dragClassName, value, children, dndDispatch, @@ -305,6 +310,18 @@ const DragInner = memo(function DragInner({ // so we know we have DraggableProps if we reach this code. if (e && 'dataTransfer' in e) { e.dataTransfer.setData('text', value.humanData.label); + + // Apply an optional class to the element being dragged so the ghost + // can be styled. We must add it to the actual element for a single + // frame before removing it so the ghost picks up the styling. + const current = e.currentTarget; + + if (dragClassName && !current.classList.contains(dragClassName)) { + current.classList.add(dragClassName); + requestAnimationFrame(() => { + current.classList.remove(dragClassName); + }); + } } // Chrome causes issues if you try to render from within a diff --git a/packages/kbn-es/src/cli_commands/docker.ts b/packages/kbn-es/src/cli_commands/docker.ts index aad68bf0a1dae..3bbabe0e3f10c 100644 --- a/packages/kbn-es/src/cli_commands/docker.ts +++ b/packages/kbn-es/src/cli_commands/docker.ts @@ -28,7 +28,7 @@ export const docker: Command = { --image Full path to image of ES to run, has precedence over tag. [default: ${DOCKER_IMG}] --password Sets password for elastic user [default: ${password}] --port The port to bind to on 127.0.0.1 [default: ${DEFAULT_PORT}] - --ssl Sets up SSL and enables security plugin on Elasticsearch + --ssl Sets up HTTP and Transport SSL and enables security plugin on Elasticsearch --kill Kill running ES nodes if detected -E Additional key=value settings to pass to Elasticsearch -D Override Docker command diff --git a/packages/kbn-es/src/cli_commands/serverless.ts b/packages/kbn-es/src/cli_commands/serverless.ts index 51cc1b619017a..152ed48abfd76 100644 --- a/packages/kbn-es/src/cli_commands/serverless.ts +++ b/packages/kbn-es/src/cli_commands/serverless.ts @@ -26,7 +26,7 @@ export const serverless: Command = { --image Full path of ESS image to run, has precedence over tag. [default: ${SERVERLESS_IMG}] --clean Remove existing file system object store before running --port The port to bind to on 127.0.0.1 [default: ${DEFAULT_PORT}] - --ssl Sets up SSL and enables security plugin on Elasticsearch + --ssl Enable HTTP SSL on Elasticsearch --kill Kill running ESS nodes if detected --background Start ESS without attaching to the first node's logs -E Additional key=value settings to pass to Elasticsearch diff --git a/packages/kbn-es/src/ess_resources/secrets.json b/packages/kbn-es/src/ess_resources/secrets.json index ceb7366ee5321..a70e5cf711c19 100644 --- a/packages/kbn-es/src/ess_resources/secrets.json +++ b/packages/kbn-es/src/ess_resources/secrets.json @@ -4,7 +4,6 @@ "compatibility": "8.11.0" }, "string_secrets": { - "xpack.security.http.ssl.keystore.secure_password": "storepass", "xpack.security.transport.ssl.keystore.secure_password": "storepass", "xpack.security.authc.realms.jwt.jwt1.client_authentication.shared_secret": "my_super_secret" } diff --git a/packages/kbn-es/src/ess_resources/secrets_ssl.json b/packages/kbn-es/src/ess_resources/secrets_ssl.json new file mode 100644 index 0000000000000..ceb7366ee5321 --- /dev/null +++ b/packages/kbn-es/src/ess_resources/secrets_ssl.json @@ -0,0 +1,11 @@ +{ + "metadata": { + "version": "1", + "compatibility": "8.11.0" + }, + "string_secrets": { + "xpack.security.http.ssl.keystore.secure_password": "storepass", + "xpack.security.transport.ssl.keystore.secure_password": "storepass", + "xpack.security.authc.realms.jwt.jwt1.client_authentication.shared_secret": "my_super_secret" + } +} \ No newline at end of file diff --git a/packages/kbn-es/src/paths.ts b/packages/kbn-es/src/paths.ts index 76cf4271c7ce8..823b8d6b59361 100644 --- a/packages/kbn-es/src/paths.ts +++ b/packages/kbn-es/src/paths.ts @@ -35,6 +35,8 @@ export const ESS_ROLE_MAPPING_PATH = resolve(__dirname, './ess_resources/role_ma export const ESS_SECRETS_PATH = resolve(__dirname, './ess_resources/secrets.json'); +export const ESS_SECRETS_SSL_PATH = resolve(__dirname, './ess_resources/secrets_ssl.json'); + export const ESS_JWKS_PATH = resolve(__dirname, './ess_resources/jwks.json'); export const ESS_RESOURCES_PATHS = [ diff --git a/packages/kbn-es/src/utils/docker.test.ts b/packages/kbn-es/src/utils/docker.test.ts index 905f51e2d67c3..e499e691b6b8d 100644 --- a/packages/kbn-es/src/utils/docker.test.ts +++ b/packages/kbn-es/src/utils/docker.test.ts @@ -9,6 +9,7 @@ import mockFs from 'mock-fs'; import { existsSync } from 'fs'; import { stat } from 'fs/promises'; +import { basename } from 'path'; import { DOCKER_IMG, @@ -27,10 +28,11 @@ import { stopServerlessCluster, teardownServerlessClusterSync, verifyDockerInstalled, + getESp12Volume, } from './docker'; import { ToolingLog, ToolingLogCollectingWriter } from '@kbn/tooling-log'; import { ES_P12_PATH } from '@kbn/dev-utils'; -import { ESS_RESOURCES_PATHS } from '../paths'; +import { ESS_CONFIG_PATH, ESS_RESOURCES_PATHS, ESS_SECRETS_PATH, ESS_JWKS_PATH } from '../paths'; jest.mock('execa'); const execa = jest.requireMock('execa'); @@ -68,9 +70,23 @@ afterEach(() => { jest.clearAllMocks(); }); +const essResources = ESS_RESOURCES_PATHS.reduce((acc, path) => { + acc.push(`${path}:${ESS_CONFIG_PATH}${basename(path)}`); + + return acc; +}, []); + const volumeCmdTest = async (volumeCmd: string[]) => { - expect(volumeCmd).toHaveLength(2); - expect(volumeCmd).toEqual(expect.arrayContaining(['--volume', `${baseEsPath}:/objectstore:z`])); + expect(volumeCmd).toHaveLength(20); + expect(volumeCmd).toEqual( + expect.arrayContaining([ + ...getESp12Volume(), + ...essResources, + `${baseEsPath}:/objectstore:z`, + `${ESS_SECRETS_PATH}:${ESS_CONFIG_PATH}secrets/secrets.json:z`, + `${ESS_JWKS_PATH}:${ESS_CONFIG_PATH}secrets/jwks.json:z`, + ]) + ); // extract only permission from mode // eslint-disable-next-line no-bitwise @@ -341,13 +357,10 @@ describe('resolveEsArgs()', () => { `); }); - test('should add SSL args and enable security when SSL is passed', () => { - const esArgs = resolveEsArgs([...defaultEsArgs, ['xpack.security.enabled', 'false']], { - ssl: true, - }); + test('should add SSL args when SSL is passed', () => { + const esArgs = resolveEsArgs(defaultEsArgs, { ssl: true }); - expect(esArgs).toHaveLength(20); - expect(esArgs).not.toEqual(expect.arrayContaining(['xpack.security.enabled=false'])); + expect(esArgs).toHaveLength(10); expect(esArgs).toMatchInlineSnapshot(` Array [ "--env", @@ -355,21 +368,11 @@ describe('resolveEsArgs()', () => { "--env", "qux=zip", "--env", - "xpack.security.enabled=true", - "--env", "xpack.security.http.ssl.enabled=true", "--env", "xpack.security.http.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elasticsearch.p12", "--env", "xpack.security.http.ssl.verification_mode=certificate", - "--env", - "xpack.security.transport.ssl.enabled=true", - "--env", - "xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elasticsearch.p12", - "--env", - "xpack.security.transport.ssl.verification_mode=certificate", - "--env", - "xpack.security.operator_privileges.enabled=true", ] `); }); diff --git a/packages/kbn-es/src/utils/docker.ts b/packages/kbn-es/src/utils/docker.ts index 085854e4ecb40..83c3e58d8322b 100644 --- a/packages/kbn-es/src/utils/docker.ts +++ b/packages/kbn-es/src/utils/docker.ts @@ -29,6 +29,7 @@ import { ESS_JWKS_PATH, ESS_CONFIG_PATH, ESS_FILES_PATH, + ESS_SECRETS_SSL_PATH, } from '../paths'; import { ELASTIC_SERVERLESS_SUPERUSER, @@ -153,44 +154,49 @@ const DEFAULT_SERVERLESS_ESARGS: Array<[string, string]> = [ ['xpack.ml.enabled', 'true'], - ['xpack.security.enabled', 'false'], -]; - -const DEFAULT_SSL_ESARGS: Array<[string, string]> = [ ['xpack.security.enabled', 'true'], - ['xpack.security.http.ssl.enabled', 'true'], + // JWT realm settings are to closer emulate a real ES serverless env + ['xpack.security.authc.realms.jwt.jwt1.allowed_audiences', 'elasticsearch'], - ['xpack.security.http.ssl.keystore.path', `${ESS_CONFIG_PATH}certs/elasticsearch.p12`], + ['xpack.security.authc.realms.jwt.jwt1.allowed_issuer', 'https://kibana.elastic.co/jwt/'], - ['xpack.security.http.ssl.verification_mode', 'certificate'], + ['xpack.security.authc.realms.jwt.jwt1.claims.principal', 'sub'], - ['xpack.security.transport.ssl.enabled', 'true'], + ['xpack.security.authc.realms.jwt.jwt1.client_authentication.type', 'shared_secret'], - ['xpack.security.transport.ssl.keystore.path', `${ESS_CONFIG_PATH}certs/elasticsearch.p12`], + ['xpack.security.authc.realms.jwt.jwt1.order', '-98'], - ['xpack.security.transport.ssl.verification_mode', 'certificate'], + ['xpack.security.authc.realms.jwt.jwt1.pkc_jwkset_path', `${ESS_CONFIG_PATH}secrets/jwks.json`], ['xpack.security.operator_privileges.enabled', 'true'], -]; -const SERVERLESS_SSL_ESARGS: Array<[string, string]> = [ - ['xpack.security.authc.realms.jwt.jwt1.client_authentication.type', 'shared_secret'], + ['xpack.security.transport.ssl.enabled', 'true'], - ['xpack.security.authc.realms.jwt.jwt1.order', '-98'], + ['xpack.security.transport.ssl.keystore.path', `${ESS_CONFIG_PATH}certs/elasticsearch.p12`], - ['xpack.security.authc.realms.jwt.jwt1.allowed_issuer', 'https://kibana.elastic.co/jwt/'], + ['xpack.security.transport.ssl.verification_mode', 'certificate'], +]; - ['xpack.security.authc.realms.jwt.jwt1.allowed_audiences', 'elasticsearch'], +const DEFAULT_SSL_ESARGS: Array<[string, string]> = [ + ['xpack.security.http.ssl.enabled', 'true'], - ['xpack.security.authc.realms.jwt.jwt1.pkc_jwkset_path', `${ESS_CONFIG_PATH}secrets/jwks.json`], + ['xpack.security.http.ssl.keystore.path', `${ESS_CONFIG_PATH}certs/elasticsearch.p12`], - ['xpack.security.authc.realms.jwt.jwt1.claims.principal', 'sub'], + ['xpack.security.http.ssl.verification_mode', 'certificate'], ]; const DOCKER_SSL_ESARGS: Array<[string, string]> = [ + ['xpack.security.enabled', 'true'], + ['xpack.security.http.ssl.keystore.password', ES_P12_PASSWORD], + ['xpack.security.transport.ssl.enabled', 'true'], + + ['xpack.security.transport.ssl.keystore.path', `${ESS_CONFIG_PATH}certs/elasticsearch.p12`], + + ['xpack.security.transport.ssl.verification_mode', 'certificate'], + ['xpack.security.transport.ssl.keystore.password', ES_P12_PASSWORD], ]; @@ -418,13 +424,6 @@ export function resolveEsArgs( args.forEach((arg) => { const [key, ...value] = arg.split('='); - // Guide the user to use SSL flag instead of manual setup - if (key === 'xpack.security.enabled' && value?.[0] === 'true') { - throw createCliError( - 'Use the --ssl flag to automatically enable and set up the security plugin.' - ); - } - esArgs.set(key.trim(), value.join('=').trim()); }); } @@ -436,7 +435,7 @@ export function resolveEsArgs( return Array.from(esArgs).flatMap((e) => ['--env', e.join('=')]); } -function getESp12Volume() { +export function getESp12Volume() { return ['--volume', `${ES_P12_PATH}:${ESS_CONFIG_PATH}certs/elasticsearch.p12`]; } @@ -492,24 +491,22 @@ export async function setupServerlessVolumes(log: ToolingLog, options: Serverles volumeCmds.push(...fileCmds); } - if (ssl) { - const essResources = ESS_RESOURCES_PATHS.reduce((acc, path) => { - acc.push('--volume', `${path}:${ESS_CONFIG_PATH}${basename(path)}`); + const essResources = ESS_RESOURCES_PATHS.reduce((acc, path) => { + acc.push('--volume', `${path}:${ESS_CONFIG_PATH}${basename(path)}`); - return acc; - }, []); + return acc; + }, []); - volumeCmds.push( - ...getESp12Volume(), - ...essResources, + volumeCmds.push( + ...getESp12Volume(), + ...essResources, - '--volume', - `${ESS_SECRETS_PATH}:${ESS_CONFIG_PATH}secrets/secrets.json:z`, + '--volume', + `${ssl ? ESS_SECRETS_SSL_PATH : ESS_SECRETS_PATH}:${ESS_CONFIG_PATH}secrets/secrets.json:z`, - '--volume', - `${ESS_JWKS_PATH}:${ESS_CONFIG_PATH}secrets/jwks.json:z` - ); - } + '--volume', + `${ESS_JWKS_PATH}:${ESS_CONFIG_PATH}secrets/jwks.json:z` + ); return volumeCmds; } @@ -577,13 +574,7 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO ...node, image, params: node.params.concat( - resolveEsArgs( - DEFAULT_SERVERLESS_ESARGS.concat( - node.esArgs ?? [], - options.ssl ? SERVERLESS_SSL_ESARGS : [] - ), - options - ), + resolveEsArgs(DEFAULT_SERVERLESS_ESARGS.concat(node.esArgs ?? []), options), i === 0 ? portCmd : [], volumeCmd ), @@ -593,20 +584,15 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO ); log.success(`Serverless ES cluster running. - Stop the cluster: ${chalk.bold(`docker container stop ${nodeNames.join(' ')}`)} + Login with username ${chalk.bold.cyan(ELASTIC_SERVERLESS_SUPERUSER)} or ${chalk.bold.cyan( + SYSTEM_INDICES_SUPERUSER + )} and password ${chalk.bold.magenta(ELASTIC_SERVERLESS_SUPERUSER_PASSWORD)} + Stop the cluster: ${chalk.bold(`docker container stop ${nodeNames.join(' ')}`)} `); if (options.ssl) { - log.success(`SSL and Security have been enabled for ES. - Login through your browser with username ${chalk.bold.cyan( - ELASTIC_SERVERLESS_SUPERUSER - )} or ${chalk.bold.cyan(SYSTEM_INDICES_SUPERUSER)} and password ${chalk.bold.magenta( - ELASTIC_SERVERLESS_SUPERUSER_PASSWORD - )}. - `); - - log.warning(`Kibana should be started with the SSL flag so that it can authenticate with ES. - See packages/kbn-es/src/ess_resources/README.md for additional information on authentication. + log.warning(`SSL has been enabled for ES. Kibana should be started with the SSL flag so that it can authenticate with ES. + See packages/kbn-es/src/ess_resources/README.md for additional information on authentication. `); } @@ -620,9 +606,9 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO const client = getESClient({ node: esNodeUrl, + auth: { bearer: kibanaDevServiceAccount.token }, ...(options.ssl ? { - auth: { bearer: kibanaDevServiceAccount.token }, tls: { ca: [fs.readFileSync(CA_CERT_PATH)], // NOTE: Even though we've added ca into the tls options, we are using 127.0.0.1 instead of localhost diff --git a/packages/kbn-management/settings/components/field_input/README.mdx b/packages/kbn-management/settings/components/field_input/README.mdx new file mode 100644 index 0000000000000..8deb8f1981c76 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/README.mdx @@ -0,0 +1,12 @@ +--- +id: management/settings/components/fieldInput +slug: /management/settings/components/field-input +title: Management Settings Field Input Component +description: A package containing a component for rendering and manipulating the raw value of a UiSetting in Field Row. +tags: ['management', 'settings'] +date: 2023-08-31 +--- + +## Description + +This package contains a component for rendering and manipulating the raw value of a UiSetting. It's used primarily by the `FieldRow` component to drive unsaved or reset changes. \ No newline at end of file diff --git a/packages/kbn-management/settings/components/field_input/__stories__/array_input.stories.tsx b/packages/kbn-management/settings/components/field_input/__stories__/array_input.stories.tsx new file mode 100644 index 0000000000000..cd1198343aa14 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/array_input.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getInputStory, getStory } from './common'; + +export default getStory('Array Input', 'An input with an array value.'); +export const ArrayInput = getInputStory('array' as const); diff --git a/packages/kbn-management/settings/components/field_input/__stories__/boolean_input.stories.tsx b/packages/kbn-management/settings/components/field_input/__stories__/boolean_input.stories.tsx new file mode 100644 index 0000000000000..ace55571e5793 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/boolean_input.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getInputStory, getStory } from './common'; + +export default getStory('Boolean Input', 'An input with a boolean value.'); +export const BooleanInput = getInputStory('boolean' as const); diff --git a/packages/kbn-management/settings/components/field_input/__stories__/color_input.stories.tsx b/packages/kbn-management/settings/components/field_input/__stories__/color_input.stories.tsx new file mode 100644 index 0000000000000..ba32182db8a3d --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/color_input.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getInputStory, getStory } from './common'; + +export default getStory('Color Input', 'An input with a color value.'); +export const ColorInput = getInputStory('color' as const); diff --git a/packages/kbn-management/settings/components/field_input/__stories__/common.tsx b/packages/kbn-management/settings/components/field_input/__stories__/common.tsx new file mode 100644 index 0000000000000..c3e167323d59f --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/common.tsx @@ -0,0 +1,120 @@ +/* + * 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 React from 'react'; +import type { ComponentMeta } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; + +import { EuiPanel } from '@elastic/eui'; +import { UiSettingsType } from '@kbn/core-ui-settings-common'; +import { SettingType, UiSettingMetadata } from '@kbn/management-settings-types'; +import { + useFieldDefinition, + getDefaultValue, +} from '@kbn/management-settings-field-definition/storybook'; + +import { FieldInputProvider } from '../services'; +import { FieldInput as Component, FieldInput } from '../field_input'; +import { InputProps, OnChangeFn } from '../types'; + +/** + * Props for a {@link FieldInput} Storybook story. + */ +export type StoryProps = Pick, 'value' | 'isDisabled'>; + +/** + * Interface defining available {@link https://storybook.js.org/docs/react/writing-stories/parameters parameters} + * for a {@link FieldInput} Storybook story. + */ +interface Params { + argTypes?: Record; + settingFields?: Partial>; +} + +/** + * Interface defining types for available {@link https://storybook.js.org/docs/react/writing-stories/args arguments} + * for a {@link FieldInput} Storybook story. + */ +export interface Args { + /** True if the field is disabled, false otherwise. */ + isDisabled: boolean; +} + +/** + * Default argument values for a {@link FieldInput} Storybook story. + */ +export const storyArgs = { + /** True if the field is disabled, false otherwise. */ + isDisabled: false, +}; + +/** + * Utility function for returning a {@link FieldInput} Storybook story + * definition. + * @param title The title displayed in the Storybook UI. + * @param description The description of the story. + * @returns A Storybook Story. + */ +export const getStory = (title: string, description: string) => + ({ + title: `Settings/Field Input/${title}`, + description, + argTypes: { + isDisabled: { + name: 'Is field disabled?', + }, + value: { + name: 'Current saved value', + }, + }, + decorators: [ + (Story) => ( + + + + + + ), + ], + } as ComponentMeta); + +/** + * Utility function for returning a {@link FieldInput} Storybook story. + * @param type The type of the UiSetting for this {@link FieldRow}. + * @param params Additional, optional {@link https://storybook.js.org/docs/react/writing-stories/parameters parameters}. + * @returns A Storybook Story. + */ +export const getInputStory = (type: SettingType, params: Params = {}) => { + const Story = ({ value, isDisabled = false }: StoryProps) => { + const setting: UiSettingMetadata = { + type, + value, + userValue: value, + ...params.settingFields, + }; + + const [field, unsavedChange, onChangeFn] = useFieldDefinition(setting); + + const onChange: OnChangeFn = (newChange) => { + onChangeFn(newChange); + }; + return ( + + ); + }; + + Story.args = { + value: getDefaultValue(type), + ...params.argTypes, + ...storyArgs, + }; + + return Story; +}; diff --git a/packages/kbn-management/settings/components/field_input/__stories__/image_input.stories.tsx b/packages/kbn-management/settings/components/field_input/__stories__/image_input.stories.tsx new file mode 100644 index 0000000000000..28a87465c680a --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/image_input.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getInputStory, getStory } from './common'; + +export default getStory('Image Input', 'An input with an image value.'); +export const ImageInput = getInputStory('image' as const); diff --git a/packages/kbn-management/settings/components/field_input/__stories__/json_input.stories.tsx b/packages/kbn-management/settings/components/field_input/__stories__/json_input.stories.tsx new file mode 100644 index 0000000000000..f00fca4e5e9a5 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/json_input.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getInputStory, getStory } from './common'; + +export default getStory('JSON Input', 'An input with a JSON value.'); +export const JSONInput = getInputStory('json' as const); diff --git a/packages/kbn-management/settings/components/field_input/__stories__/markdown_input.stories.tsx b/packages/kbn-management/settings/components/field_input/__stories__/markdown_input.stories.tsx new file mode 100644 index 0000000000000..ef0f9d358462f --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/markdown_input.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getInputStory, getStory } from './common'; + +export default getStory('Markdown Input', 'An input with a markdown value.'); +export const MarkdownInput = getInputStory('markdown' as const); diff --git a/packages/kbn-management/settings/components/field_input/__stories__/number_input.stories.tsx b/packages/kbn-management/settings/components/field_input/__stories__/number_input.stories.tsx new file mode 100644 index 0000000000000..1d6aaa8952a3f --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/number_input.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getInputStory, getStory } from './common'; + +export default getStory('Number Input', 'An input with a number value.'); +export const NumberInput = getInputStory('number' as const); diff --git a/packages/kbn-management/settings/components/field_input/__stories__/select_input.stories.tsx b/packages/kbn-management/settings/components/field_input/__stories__/select_input.stories.tsx new file mode 100644 index 0000000000000..c7571494e7ca8 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/select_input.stories.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getInputStory, getStory } from './common'; + +const argTypes = { + value: { + name: 'Current saved value', + control: { + type: 'select', + options: ['option1', 'option2', 'option3'], + }, + }, +}; + +const settingFields = { + optionLabels: { option1: 'Option 1', option2: 'Option 2', option3: 'Option 3' }, + options: ['option1', 'option2', 'option3'], +}; + +export default getStory('Select Input', 'An input with multiple values.'); +export const SelectInput = getInputStory('select' as const, { argTypes, settingFields }); diff --git a/packages/kbn-management/settings/components/field_input/__stories__/text_input.stories.tsx b/packages/kbn-management/settings/components/field_input/__stories__/text_input.stories.tsx new file mode 100644 index 0000000000000..39de404bde404 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/__stories__/text_input.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getInputStory, getStory } from './common'; + +export default getStory('String Input', 'An input with a string value.'); +export const StringInput = getInputStory('string' as const); diff --git a/packages/kbn-management/settings/components/field_input/code_editor.tsx b/packages/kbn-management/settings/components/field_input/code_editor.tsx new file mode 100644 index 0000000000000..3f46778917fdd --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/code_editor.tsx @@ -0,0 +1,108 @@ +/* + * 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. + */ + +// This component was ported directly from `advancedSettings`, and hasn't really +// been vetted. It has, however, been refactored to be compliant with our +// current standards. +// +// @see src/plugins/advanced_settings/public/management_app/components/field/field_code_editor.tsx +// + +import React, { useCallback } from 'react'; +import { monaco, XJsonLang } from '@kbn/monaco'; +import { + CodeEditor as KibanaReactCodeEditor, + MarkdownLang, + type CodeEditorProps as KibanaReactCodeEditorProps, +} from '@kbn/kibana-react-plugin/public'; + +type Props = Pick; +type Options = KibanaReactCodeEditorProps['options']; + +export interface CodeEditorProps extends Props { + type: 'markdown' | 'json'; + isReadOnly: boolean; + name: string; +} + +const MIN_DEFAULT_LINES_COUNT = 6; +const MAX_DEFAULT_LINES_COUNT = 30; + +export const CodeEditor = ({ onChange, type, isReadOnly, name, ...props }: CodeEditorProps) => { + // setting editor height based on lines height and count to stretch and fit its content + const setEditorCalculatedHeight = useCallback( + (editor: monaco.editor.IStandaloneCodeEditor) => { + const editorElement = editor.getDomNode(); + + if (!editorElement) { + return; + } + + const lineHeight = editor.getOption(monaco.editor.EditorOption.lineHeight); + let lineCount = editor.getModel()?.getLineCount() || MIN_DEFAULT_LINES_COUNT; + if (lineCount < MIN_DEFAULT_LINES_COUNT) { + lineCount = MIN_DEFAULT_LINES_COUNT; + } else if (lineCount > MAX_DEFAULT_LINES_COUNT) { + lineCount = MAX_DEFAULT_LINES_COUNT; + } + const height = lineHeight * lineCount; + + editorElement.id = name; + editorElement.style.height = `${height}px`; + editor.layout(); + }, + [name] + ); + + const trimEditorBlankLines = useCallback((editor: monaco.editor.IStandaloneCodeEditor) => { + const editorModel = editor.getModel(); + + if (!editorModel) { + return; + } + const trimmedValue = editorModel.getValue().trim(); + editorModel.setValue(trimmedValue); + }, []); + + const editorDidMount = useCallback( + (editor) => { + setEditorCalculatedHeight(editor); + + editor.onDidChangeModelContent(() => { + setEditorCalculatedHeight(editor); + }); + + editor.onDidBlurEditorWidget(() => { + trimEditorBlankLines(editor); + }); + }, + [setEditorCalculatedHeight, trimEditorBlankLines] + ); + + const options: Options = { + readOnly: isReadOnly, + lineNumbers: 'off', + scrollBeyondLastLine: false, + automaticLayout: true, + folding: false, + tabSize: 2, + scrollbar: { + alwaysConsumeMouseWheel: false, + }, + wordWrap: 'on', + wrappingIndent: 'indent', + }; + + return ( + + ); +}; diff --git a/packages/kbn-management/settings/components/field_input/field_input.test.tsx b/packages/kbn-management/settings/components/field_input/field_input.test.tsx new file mode 100644 index 0000000000000..9bbac96b7c12c --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/field_input.test.tsx @@ -0,0 +1,201 @@ +/* + * 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 React from 'react'; +import { render, fireEvent } from '@testing-library/react'; +import { FieldInput, FieldInputProps } from './field_input'; +import { FieldDefinition, SettingType, UnsavedFieldChange } from '@kbn/management-settings-types'; +import { TEST_SUBJ_PREFIX_FIELD } from './input'; +import { wrap } from './mocks'; +import { CodeEditorProps } from './code_editor'; + +const name = 'test'; + +jest.mock('./code_editor', () => ({ + CodeEditor: ({ value, onChange }: CodeEditorProps) => ( + { + if (onChange) { + onChange(e.target.value, e as any); + } + }} + /> + ), +})); + +describe('FieldInput', () => { + const getDefaultProps = (type: SettingType): FieldInputProps => { + let options; + if (type === 'select') { + options = { + labels: { + option1: 'Option 1', + option2: 'Option 2', + option3: 'Option 3', + }, + values: ['option1', 'option2', 'option3'], + }; + } + + const props: FieldInputProps = { + field: { + id: 'test', + name, + type, + ariaAttributes: { + ariaLabel: 'Test', + }, + options, + } as FieldDefinition, + onChange: jest.fn(), + }; + + return props; + }; + + it('renders without errors', () => { + const { container } = render(wrap()); + expect(container).toBeInTheDocument(); + }); + + it('renders a TextInput for a string field', () => { + const props = getDefaultProps('string'); + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${name}`); + expect(input).toBeInTheDocument(); + }); + + it('renders a NumberInput for a number field', () => { + const props = getDefaultProps('number'); + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${name}`); + expect(input).toBeInTheDocument(); + }); + + it('renders a BooleanInput for a boolean field', () => { + const props = getDefaultProps('boolean'); + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${name}`); + expect(input).toBeInTheDocument(); + }); + + it('renders a ColorInput for a color field', () => { + const props = getDefaultProps('color'); + const { getByTestId } = render(wrap()); + const input = getByTestId(`euiColorPickerAnchor ${TEST_SUBJ_PREFIX_FIELD}-${name}`); + expect(input).toBeInTheDocument(); + }); + + it('renders a ImageInput for a color field', () => { + const props = getDefaultProps('image'); + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${name}`); + expect(input).toBeInTheDocument(); + }); + + it('renders a JsonInput for a json field', () => { + const props = getDefaultProps('json'); + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${name}`); + expect(input).toBeInTheDocument(); + }); + + it('renders a MarkdownInput for a markdown field', () => { + const props = getDefaultProps('markdown'); + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${name}`); + expect(input).toBeInTheDocument(); + }); + + it('renders a SelectInput for an select field', () => { + const props = { + ...getDefaultProps('select'), + value: 'option2', + }; + + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${name}`); + expect(input).toBeInTheDocument(); + }); + + it('calls the onChange prop when the value changes', () => { + const props = getDefaultProps('string'); + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${name}`); + fireEvent.change(input, { target: { value: 'new value' } }); + expect(props.onChange).toHaveBeenCalledWith({ value: 'new value' }); + }); + + it('disables the input when isDisabled prop is true', () => { + const props = getDefaultProps('string'); + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${name}`); + expect(input).toBeDisabled(); + }); + + it('throws an error if the field and unsavedChange types do not match', () => { + const consoleMock = jest.spyOn(console, 'error').mockImplementation(() => {}); + + [ + 'array', + 'boolean', + 'color', + 'image', + 'json', + 'markdown', + 'string', + 'select', + 'undefined', + ].forEach((type) => { + expect(() => + render( + wrap( + } + /> + ) + ) + ).toThrowError(`Unsaved change for ${type} mismatch: number`); + }); + + expect(() => + render( + wrap( + } + /> + ) + ) + ).toThrowError(`Unsaved change for number mismatch: string`); + + consoleMock.mockRestore(); + }); + + it('throws an error if type is unknown or incompatible', () => { + const consoleMock = jest.spyOn(console, 'error').mockImplementation(() => {}); + const defaultProps = getDefaultProps('string'); + const props = { + ...defaultProps, + field: { + ...defaultProps.field, + type: 'foobar', + }, + } as unknown as FieldInputProps<'string'>; + + expect(() => render(wrap())).toThrowError( + 'Unknown or incompatible field type: foobar' + ); + + consoleMock.mockRestore(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/field_input.tsx b/packages/kbn-management/settings/components/field_input/field_input.tsx new file mode 100644 index 0000000000000..301be48ee5141 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/field_input.tsx @@ -0,0 +1,250 @@ +/* + * 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 React from 'react'; + +import type { + FieldDefinition, + SettingType, + UnsavedFieldChange, +} from '@kbn/management-settings-types'; + +import { + isArrayFieldDefinition, + isBooleanFieldDefinition, + isColorFieldDefinition, + isImageFieldDefinition, + isJsonFieldDefinition, + isMarkdownFieldDefinition, + isNumberFieldDefinition, + isSelectFieldDefinition, + isStringFieldDefinition, + isUndefinedFieldDefinition, +} from '@kbn/management-settings-field-definition'; + +import { + isArrayFieldUnsavedChange, + isBooleanFieldUnsavedChange, + isColorFieldUnsavedChange, + isImageFieldUnsavedChange, + isJsonFieldUnsavedChange, + isMarkdownFieldUnsavedChange, + isNumberFieldUnsavedChange, + isSelectFieldUnsavedChange, + isStringFieldUnsavedChange, + isUndefinedFieldUnsavedChange, +} from '@kbn/management-settings-field-definition/is'; + +import { getInputValue } from '@kbn/management-settings-utilities'; + +import { + BooleanInput, + CodeEditorInput, + ColorPickerInput, + ImageInput, + NumberInput, + SelectInput, + TextInput, + ArrayInput, + TextInputProps, +} from './input'; + +import { OnChangeFn } from './types'; + +/** + * The props that are passed to the {@link FieldInput} component. + */ +export interface FieldInputProps { + /** The {@link FieldDefinition} for the component. */ + field: FieldDefinition; + /** An {@link UnsavedFieldChange} for the component, if any. */ + unsavedChange?: UnsavedFieldChange; + /** The `onChange` handler for the input. */ + onChange: OnChangeFn; + /** True if the input is disabled, false otherwise. */ + isDisabled?: boolean; + /** True if the value within the input is invalid, false otherwise. */ + isInvalid?: boolean; +} + +/** + * Build and return an `Error` if the type of the {@link UnsavedFieldChange} does not + * match the type of the {@link FieldDefinition}. + */ +const getMismatchError = (type: SettingType, unsavedType?: SettingType) => + new Error(`Unsaved change for ${type} mismatch: ${unsavedType}`); + +/** + * An input that allows one to change a setting in Kibana. + * + * @param props The props for the {@link FieldInput} component. + */ +export const FieldInput = (props: FieldInputProps) => { + const { + field, + unsavedChange, + isDisabled = false, + isInvalid = false, + onChange: onChangeProp, + } = props; + const { id, name, ariaAttributes } = field; + + const inputProps = { + ...ariaAttributes, + id, + isDisabled, + isInvalid, + name, + }; + + // These checks might seem excessive or redundant, but they are necessary to ensure that + // the types are honored correctly using type guards. These checks get compiled down to + // checks against the `type` property-- which we were doing in the previous code, albeit + // in an unenforceable way. + // + // Based on the success of a check, we can render the `FieldInput` in a indempotent and + // type-safe way. + // + if (isArrayFieldDefinition(field)) { + // If the composing component mistakenly provides an incompatible `UnsavedFieldChange`, + // we can throw an `Error`. We might consider switching to a `console.error` and not + // rendering the input, but that might be less helpful. + if (!isArrayFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value] = getInputValue(field, unsavedChange); + + // This is a safe cast because we've already checked that the type is correct in both + // the `FieldDefinition` and the `UnsavedFieldChange`... no need for a further + // type guard. + const onChange = onChangeProp as OnChangeFn<'array'>; + + return ; + } + + if (isBooleanFieldDefinition(field)) { + if (!isBooleanFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value] = getInputValue(field, unsavedChange); + const onChange = onChangeProp as OnChangeFn<'boolean'>; + + return ; + } + + if (isColorFieldDefinition(field)) { + if (!isColorFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value] = getInputValue(field, unsavedChange); + const onChange = onChangeProp as OnChangeFn<'color'>; + + return ; + } + + if (isImageFieldDefinition(field)) { + if (!isImageFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value, unsaved] = getInputValue(field, unsavedChange); + const onChange = onChangeProp as OnChangeFn<'image'>; + + return ( + + ); + } + + if (isJsonFieldDefinition(field)) { + if (!isJsonFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value] = getInputValue(field, unsavedChange); + const onChange = onChangeProp as OnChangeFn<'json'>; + + return ( + + ); + } + + if (isMarkdownFieldDefinition(field)) { + if (!isMarkdownFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value] = getInputValue(field, unsavedChange); + const onChange = onChangeProp as OnChangeFn<'markdown'>; + + return ( + + ); + } + + if (isNumberFieldDefinition(field)) { + if (!isNumberFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value] = getInputValue(field, unsavedChange); + const onChange = onChangeProp as OnChangeFn<'number'>; + + return ; + } + + if (isSelectFieldDefinition(field)) { + if (!isSelectFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value] = getInputValue(field, unsavedChange); + const onChange = onChangeProp as OnChangeFn<'select'>; + const { + options: { values: optionValues, labels: optionLabels }, + } = field; + + return ; + } + + if (isStringFieldDefinition(field)) { + if (!isStringFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value] = getInputValue(field, unsavedChange); + const onChange = onChangeProp as OnChangeFn<'string'>; + + return ; + } + + if (isUndefinedFieldDefinition(field)) { + if (!isUndefinedFieldUnsavedChange(unsavedChange)) { + throw getMismatchError(field.type, unsavedChange?.type); + } + + const [value] = getInputValue(field, unsavedChange); + return ; + } + + throw new Error(`Unknown or incompatible field type: ${field.type}`); +}; diff --git a/packages/kbn-management/settings/components/field_input/index.ts b/packages/kbn-management/settings/components/field_input/index.ts new file mode 100644 index 0000000000000..8570f9af23c93 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ + +export { FieldInput, type FieldInputProps } from './field_input'; + +export type { + FieldInputKibanaDependencies, + FieldInputServices, + OnChangeFn, + OnChangeParams, +} from './types'; diff --git a/packages/kbn-management/settings/components/field_input/input/array_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/array_input.test.tsx new file mode 100644 index 0000000000000..2b420d39ee2a5 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/array_input.test.tsx @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { act, fireEvent, render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { ArrayInput } from './array_input'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; +import { wrap } from '../mocks'; + +const name = 'Some array field'; +const id = 'some:array:field'; + +describe('ArrayInput', () => { + const defaultProps = { + id, + name, + ariaLabel: 'Test', + onChange: jest.fn(), + value: ['foo', 'bar'], + }; + + beforeEach(() => { + defaultProps.onChange.mockClear(); + }); + + it('renders without errors', () => { + const { container } = render(wrap()); + expect(container).toBeInTheDocument(); + }); + + it('renders an array of strings', () => { + render(wrap()); + expect(screen.getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`)).toHaveValue('foo, bar'); + }); + + it('formats array when blurred', () => { + render(wrap()); + const input = screen.getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.focus(input); + userEvent.type(input, ',baz'); + expect(input).toHaveValue('foo, bar,baz'); + input.blur(); + expect(input).toHaveValue('foo, bar, baz'); + }); + + it('only calls onChange when blurred ', () => { + render(wrap()); + const input = screen.getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + + fireEvent.focus(input); + userEvent.type(input, ',baz'); + + expect(input).toHaveValue('foo, bar,baz'); + expect(defaultProps.onChange).not.toHaveBeenCalled(); + + act(() => { + input.blur(); + }); + + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: ['foo', 'bar', 'baz'] }); + }); + + it('disables the input when isDisabled prop is true', () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toBeDisabled(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/input/array_input.tsx b/packages/kbn-management/settings/components/field_input/input/array_input.tsx new file mode 100644 index 0000000000000..d5e4d8f202ec5 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/array_input.tsx @@ -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 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 React, { useEffect, useState } from 'react'; +import { EuiFieldText } from '@elastic/eui'; + +import { InputProps } from '../types'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +/** + * Props for an {@link ArrayFieldInput} component. + */ +export type ArrayInputProps = InputProps<'array'>; + +const REGEX = /,\s+/g; + +/** + * Component for manipulating an `array` field. + */ +export const ArrayInput = ({ + id, + name, + onChange: onChangeProp, + ariaLabel, + isDisabled = false, + value: valueProp, + ariaDescribedBy, +}: ArrayInputProps) => { + const [value, setValue] = useState(valueProp?.join(', ')); + + useEffect(() => { + setValue(valueProp?.join(', ')); + }, [valueProp]); + + // In the past, each keypress would invoke the `onChange` callback. This + // is likely wasteful, so we've switched it to `onBlur` instead. + const onBlur = (event: React.ChangeEvent) => { + const blurValue = event.target.value + .replace(REGEX, ',') + .split(',') + .filter((v) => v !== ''); + onChangeProp({ value: blurValue }); + setValue(blurValue.join(', ')); + }; + + return ( + setValue(event.target.value)} + {...{ name, onBlur, value }} + /> + ); +}; diff --git a/packages/kbn-management/settings/components/field_input/input/boolean_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/boolean_input.test.tsx new file mode 100644 index 0000000000000..6c713261f11ca --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/boolean_input.test.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { act, fireEvent, render, screen } from '@testing-library/react'; + +import { BooleanInput } from './boolean_input'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +import { wrap } from '../mocks'; + +const name = 'Some boolean field'; +const id = 'some:boolean:field'; + +describe('BooleanInput', () => { + const defaultProps = { + id, + name, + ariaLabel: name, + onChange: jest.fn(), + }; + + beforeEach(() => { + defaultProps.onChange.mockClear(); + }); + + it('renders true', () => { + render(wrap()); + expect(screen.getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`)).toBeChecked(); + }); + + it('renders false', () => { + render(wrap()); + expect(screen.getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`)).not.toBeChecked(); + }); + + it('calls onChange when toggled', () => { + render(wrap()); + const input = screen.getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(defaultProps.onChange).not.toHaveBeenCalled(); + + act(() => { + fireEvent.click(input); + }); + + expect(defaultProps.onChange).toBeCalledWith({ value: false }); + + act(() => { + fireEvent.click(input); + }); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/input/boolean_input.tsx b/packages/kbn-management/settings/components/field_input/input/boolean_input.tsx new file mode 100644 index 0000000000000..d95073c096dd6 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/boolean_input.tsx @@ -0,0 +1,53 @@ +/* + * 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 React from 'react'; + +import { EuiSwitch, EuiSwitchProps } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import type { InputProps } from '../types'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +/** + * Props for a {@link BooleanInput} component. + */ +export type BooleanInputProps = InputProps<'boolean'>; + +/** + * Component for manipulating a `boolean` field. + */ +export const BooleanInput = ({ + id, + ariaDescribedBy, + ariaLabel, + isDisabled: disabled = false, + name, + onChange: onChangeProp, + value, +}: BooleanInputProps) => { + const onChange: EuiSwitchProps['onChange'] = (event) => + onChangeProp({ value: event.target.checked }); + + return ( + + ) : ( + + ) + } + aria-label={ariaLabel} + aria-describedby={ariaDescribedBy} + checked={!!value} + data-test-subj={`${TEST_SUBJ_PREFIX_FIELD}-${id}`} + {...{ disabled, name, onChange }} + /> + ); +}; diff --git a/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx b/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx new file mode 100644 index 0000000000000..b5d0f2da8a86c --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/code_editor_input.tsx @@ -0,0 +1,103 @@ +/* + * 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 React from 'react'; + +import { i18n } from '@kbn/i18n'; +import { SettingType } from '@kbn/management-settings-types'; + +import { CodeEditor } from '../code_editor'; +import type { InputProps, OnChangeFn } from '../types'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +type Type = Extract; + +/** + * Props for a {@link CodeEditorInput} component. + */ +export interface CodeEditorInputProps extends InputProps { + /** The default value of the {@link CodeEditor} component. */ + defaultValue?: string; + /** + * The `onChange` event handler, expanded to include both `markdown` + * and `json` + */ + onChange: OnChangeFn; + /** + * The {@link UiSettingType}, expanded to include both `markdown` + * and `json` + */ + type: Type; +} + +/** + * Component for manipulating a `json` or `markdown` field. + * + * TODO: clintandrewhall - `kibana_react` `CodeEditor` does not support `disabled`. + */ +export const CodeEditorInput = ({ + ariaDescribedBy, + ariaLabel, + defaultValue, + id, + isDisabled = false, + onChange: onChangeProp, + type, + value: valueProp = '', +}: CodeEditorInputProps) => { + const onChange = (newValue: string) => { + let newUnsavedValue; + let errorParams = {}; + + switch (type) { + case 'json': + const isJsonArray = Array.isArray(JSON.parse(defaultValue || '{}')); + newUnsavedValue = newValue || (isJsonArray ? '[]' : '{}'); + + try { + JSON.parse(newUnsavedValue); + } catch (e) { + errorParams = { + error: i18n.translate('management.settings.field.codeEditorSyntaxErrorMessage', { + defaultMessage: 'Invalid JSON syntax', + }), + isInvalid: true, + }; + } + break; + default: + newUnsavedValue = newValue; + } + + // TODO: clintandrewhall - should we make this onBlur instead of onChange? + onChangeProp({ + value: newUnsavedValue, + ...errorParams, + }); + }; + + // nit: we have to do this because, while the `UiSettingsService` might return + // `null`, the {@link CodeEditor} component doesn't accept `null` as a value. + // + // @see packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts + // + const value = valueProp === null ? '' : valueProp; + + return ( +

    + +
    + ); +}; diff --git a/packages/kbn-management/settings/components/field_input/input/color_picker_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/color_picker_input.test.tsx new file mode 100644 index 0000000000000..d50b58481a885 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/color_picker_input.test.tsx @@ -0,0 +1,50 @@ +/* + * 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 React from 'react'; +import { render, fireEvent } from '@testing-library/react'; +import { ColorPickerInput } from './color_picker_input'; +import { wrap } from '../mocks'; + +const name = 'Some color field'; +const id = 'some:color:field'; + +describe('ColorPickerInput', () => { + const defaultProps = { + id, + name, + ariaLabel: 'Test', + onChange: jest.fn(), + value: '#000000', + }; + + it('renders without errors', () => { + const { container } = render(wrap()); + expect(container).toBeInTheDocument(); + }); + + it('renders the value prop', () => { + const { getByRole } = render(wrap()); + const input = getByRole('textbox'); + expect(input).toHaveValue('#000000'); + }); + + it('calls the onChange prop when the value changes', () => { + const { getByRole } = render(wrap()); + const input = getByRole('textbox'); + const newValue = '#ffffff'; + fireEvent.change(input, { target: { value: newValue } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: newValue }); + }); + + it('disables the input when isDisabled prop is true', () => { + const { getByRole } = render(wrap()); + const input = getByRole('textbox'); + expect(input).toBeDisabled(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/input/color_picker_input.tsx b/packages/kbn-management/settings/components/field_input/input/color_picker_input.tsx new file mode 100644 index 0000000000000..b5c5f7d4de616 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/color_picker_input.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { EuiColorPicker, EuiColorPickerProps } from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; +import { InputProps } from '../types'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +/** + * Props for a {@link ColorPickerInput} component. + */ +export type ColorPickerInputProps = InputProps<'color'>; + +const invalidMessage = i18n.translate('management.settings.fieldInput.color.invalidMessage', { + defaultMessage: 'Provide a valid color value', +}); + +/** + * Component for manipulating a `color` field. + */ +export const ColorPickerInput = ({ + ariaDescribedBy, + ariaLabel, + id, + isDisabled = false, + isInvalid = false, + onChange: onChangeProp, + name, + value: color, +}: ColorPickerInputProps) => { + const onChange: EuiColorPickerProps['onChange'] = (newColor, { isValid }) => { + if (newColor !== '' && !isValid) { + onChangeProp({ value: newColor, isInvalid: true, error: invalidMessage }); + } else { + onChangeProp({ value: newColor }); + } + }; + + return ( + + ); +}; diff --git a/packages/kbn-management/settings/components/field_input/input/image_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/image_input.test.tsx new file mode 100644 index 0000000000000..041d0aba44714 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/image_input.test.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { render } from '@testing-library/react'; +import { ImageInput } from './image_input'; +import { wrap } from '../mocks'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; +import { act } from 'react-dom/test-utils'; +import userEvent from '@testing-library/user-event'; + +const name = 'Some image field'; +const id = 'some:image:field'; + +describe('ImageInput', () => { + const defaultProps = { + id, + name, + ariaLabel: 'Test', + onChange: jest.fn(), + hasChanged: false, + isDefaultValue: false, + }; + + it('renders without errors', () => { + const { container } = render(wrap()); + expect(container).toBeInTheDocument(); + }); + + it('calls the onChange prop when a file is selected', async () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`) as HTMLInputElement; + const file = new File(['(⌐□_□)'], 'test.png', { type: 'image/png' }); + + act(() => { + userEvent.upload(input, [file]); + }); + + expect(input.files?.length).toBe(1); + + // This doesn't work for some reason. + // expect(defaultProps.onChange).toHaveBeenCalledWith({ value: file }); + }); + + it('disables the input when isDisabled prop is true', () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toBeDisabled(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/input/image_input.tsx b/packages/kbn-management/settings/components/field_input/input/image_input.tsx new file mode 100644 index 0000000000000..b118c538e7b34 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/image_input.tsx @@ -0,0 +1,108 @@ +/* + * 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 React from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiFilePicker, EuiImage } from '@elastic/eui'; + +import type { InputProps } from '../types'; +import { useServices } from '../services'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +/** + * Props for a {@link ImageInput} component. + */ +export interface ImageInputProps extends InputProps<'image'> { + /** Indicate if the image has changed from the saved setting in the UI. */ + hasChanged: boolean; + /** Indicate if the image value is the default value in Kibana. */ + isDefaultValue: boolean; +} + +const getImageAsBase64 = async (file: Blob): Promise => { + const reader = new FileReader(); + reader.readAsDataURL(file); + + return new Promise((resolve, reject) => { + reader.onload = () => { + resolve(reader.result!); + }; + reader.onerror = (err) => { + reject(err); + }; + }); +}; + +const errorMessage = i18n.translate('management.settings.field.imageChangeErrorMessage', { + defaultMessage: 'Image could not be saved', +}); + +/** + * Component for manipulating an `image` field. + */ +export const ImageInput = React.forwardRef( + ( + { + ariaDescribedBy, + ariaLabel, + id, + isDisabled, + isDefaultValue, + onChange: onChangeProp, + name, + value, + hasChanged, + }, + ref + ) => { + const { showDanger } = useServices(); + + const onChange = async (files: FileList | null) => { + if (files === null || !files.length) { + onChangeProp({ value: '' }); + return null; + } + + const file = files[0]; + + try { + let base64Image = ''; + + if (file instanceof File) { + base64Image = String(await getImageAsBase64(file)); + } + + onChangeProp({ value: base64Image }); + } catch (err) { + showDanger(errorMessage); + onChangeProp({ value: '', error: errorMessage }); + } + }; + + const a11yProps = { + 'aria-label': ariaLabel, + 'aria-describedby': ariaDescribedBy, + }; + + // TODO: this check will be a bug, if a default image is ever actually + // defined in Kibana. + if (value && !isDefaultValue && !hasChanged) { + return ; + } else { + return ( + + ); + } + } +); diff --git a/packages/kbn-management/settings/components/field_input/input/index.ts b/packages/kbn-management/settings/components/field_input/input/index.ts new file mode 100644 index 0000000000000..2790604feb9e9 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/index.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 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. + */ + +export { ArrayInput, type ArrayInputProps } from './array_input'; +export { CodeEditorInput, type CodeEditorInputProps } from './code_editor_input'; +export { BooleanInput, type BooleanInputProps } from './boolean_input'; +export { ColorPickerInput, type ColorPickerInputProps } from './color_picker_input'; +export { ImageInput, type ImageInputProps } from './image_input'; +export { NumberInput, type NumberInputProps } from './number_input'; +export { SelectInput, type SelectInputProps } from './select_input'; +export { TextInput, type TextInputProps } from './text_input'; + +export const TEST_SUBJ_PREFIX_FIELD = 'management-settings-editField'; diff --git a/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx new file mode 100644 index 0000000000000..04108a3259738 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/json_editor_input.test.tsx @@ -0,0 +1,118 @@ +/* + * 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 React from 'react'; +import { render, fireEvent, waitFor } from '@testing-library/react'; + +import { CodeEditorInput } from './code_editor_input'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; +import { CodeEditorProps } from '../code_editor'; + +const name = 'Some json field'; +const id = 'some:json:field'; +const initialValue = '{"foo":"bar"}'; + +jest.mock('../code_editor', () => ({ + CodeEditor: ({ value, onChange }: CodeEditorProps) => ( + { + if (onChange) { + onChange(e.target.value, e as any); + } + }} + /> + ), +})); + +describe('JsonEditorInput', () => { + const defaultProps = { + id, + name, + ariaLabel: 'Test', + onChange: jest.fn(), + value: initialValue, + type: 'json' as 'json', + }; + + beforeEach(() => { + defaultProps.onChange.mockClear(); + }); + + it('renders without errors', () => { + const { container } = render(); + expect(container).toBeInTheDocument(); + }); + + it('renders the value prop', () => { + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toHaveValue(initialValue); + }); + + it('calls the onChange prop when the object value changes', () => { + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '{"bar":"foo"}' } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: '{"bar":"foo"}' }); + }); + + it('calls the onChange prop when the object value changes with no value', () => { + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '' } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: '{}' }); + }); + + it('calls the onChange prop with an error when the object value changes to invalid JSON', () => { + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '{"bar" "foo"}' } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ + value: '{"bar" "foo"}', + error: 'Invalid JSON syntax', + isInvalid: true, + }); + }); + + it('calls the onChange prop when the array value changes', () => { + const props = { ...defaultProps, defaultValue: '["bar", "foo"]', value: undefined }; + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '["foo", "bar", "baz"]' } }); + waitFor(() => + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: '["foo", "bar", "baz"]' }) + ); + }); + + it('calls the onChange prop when the array value changes with no value', () => { + const props = { + ...defaultProps, + defaultValue: '["bar", "foo"]', + value: '["bar", "foo"]', + }; + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '' } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: '[]' }); + }); + + it('calls the onChange prop with an array when the array value changes to invalid JSON', () => { + const props = { ...defaultProps, defaultValue: '["bar", "foo"]', value: undefined }; + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '["bar", "foo" | "baz"]' } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ + value: '["bar", "foo" | "baz"]', + error: 'Invalid JSON syntax', + isInvalid: true, + }); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/input/markdown_editor_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/markdown_editor_input.test.tsx new file mode 100644 index 0000000000000..4df09c3e5df71 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/markdown_editor_input.test.tsx @@ -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 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 React from 'react'; +import { render, fireEvent } from '@testing-library/react'; + +import { CodeEditorInput } from './code_editor_input'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; +import { CodeEditorProps } from '../code_editor'; + +const name = 'Some json field'; +const id = 'some:json:field'; +const initialValue = '# A Markdown Title'; + +jest.mock('../code_editor', () => ({ + CodeEditor: ({ value, onChange }: CodeEditorProps) => ( + { + if (onChange) { + onChange(e.target.value, e as any); + } + }} + /> + ), +})); + +describe('JsonEditorInput', () => { + const defaultProps = { + id, + name, + ariaLabel: 'Test', + onChange: jest.fn(), + value: initialValue, + type: 'markdown' as 'markdown', + }; + + it('renders without errors', () => { + const { container } = render(); + expect(container).toBeInTheDocument(); + }); + + it('renders the value prop', () => { + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toHaveValue(initialValue); + }); + + it('calls the onChange prop when the value changes', () => { + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '# New Markdown Title' } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: '# New Markdown Title' }); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/input/number_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/number_input.test.tsx new file mode 100644 index 0000000000000..2df3bbc96254f --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/number_input.test.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { render, fireEvent, waitFor } from '@testing-library/react'; +import { NumberInput } from './number_input'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; +import { wrap } from '../mocks'; + +const name = 'Some number field'; +const id = 'some:number:field'; + +describe('NumberInput', () => { + const defaultProps = { + id, + name, + ariaLabel: 'Test', + onChange: jest.fn(), + value: 12345, + }; + + it('renders without errors', () => { + const { container } = render(wrap()); + expect(container).toBeInTheDocument(); + }); + + it('renders the value prop', () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toHaveValue(defaultProps.value); + }); + + it('calls the onChange prop when the value changes', () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: '54321' } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: 54321 }); + }); + + it('disables the input when isDisabled prop is true', () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toBeDisabled(); + }); + + it('recovers if value is null', () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + waitFor(() => expect(input).toHaveValue(undefined)); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/input/number_input.tsx b/packages/kbn-management/settings/components/field_input/input/number_input.tsx new file mode 100644 index 0000000000000..8d4862fa5e52e --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/number_input.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { EuiFieldNumber } from '@elastic/eui'; +import { InputProps } from '../types'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +/** + * Props for a {@link NumberInput} component. + */ +export type NumberInputProps = InputProps<'number'>; + +/** + * Component for manipulating a `number` field. + */ +export const NumberInput = ({ + ariaDescribedBy, + ariaLabel, + id, + isDisabled: disabled = false, + name, + onChange: onChangeProp, + value: valueProp, +}: NumberInputProps) => { + const onChange = (event: React.ChangeEvent) => + onChangeProp({ value: Number(event.target.value) }); + + // nit: we have to do this because, while the `UiSettingsService` might return + // `null`, the {@link EuiFieldNumber} component doesn't accept `null` as a + // value. + // + // @see packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts + // + const value = valueProp === null ? undefined : valueProp; + + return ( + + ); +}; diff --git a/packages/kbn-management/settings/components/field_input/input/select_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/select_input.test.tsx new file mode 100644 index 0000000000000..fe6fa934ab5bb --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/select_input.test.tsx @@ -0,0 +1,90 @@ +/* + * 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 React from 'react'; +import { render, fireEvent } from '@testing-library/react'; +import { SelectInput, SelectInputProps } from './select_input'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; +import { wrap } from '../mocks'; + +const name = 'Some select field'; +const id = 'some:select:field'; + +describe('SelectInput', () => { + const defaultProps = { + id, + name, + ariaLabel: 'Test', + onChange: jest.fn(), + optionLabels: { + option1: 'Option 1', + option2: 'Option 2', + option3: 'Option 3', + }, + optionValues: ['option1', 'option2', 'option3'], + value: 'option2', + }; + + it('renders without errors', () => { + const { container } = render(wrap()); + expect(container).toBeInTheDocument(); + }); + + it('renders the value prop', () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toHaveValue('option2'); + }); + + it('calls the onChange prop when the value changes', () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: 'option3' } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: 'option3' }); + }); + + it('disables the input when isDisabled prop is true', () => { + const { getByTestId } = render(wrap()); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toBeDisabled(); + }); + + it('throws when optionValues is not provided', () => { + const consoleMock = jest.spyOn(console, 'error').mockImplementation(() => {}); + const props = { + ...defaultProps, + optionLabels: undefined as any, + optionValues: [], + } as SelectInputProps; + + expect(() => render(wrap())).toThrowError( + 'non-empty `optionValues` are required for `SelectInput`.' + ); + consoleMock.mockRestore(); + }); + + it('recovers if optionLabel is missing', () => { + const props = { + ...defaultProps, + optionLabels: {}, + } as SelectInputProps; + const { container } = render(wrap()); + + expect(container).toBeInTheDocument(); + }); + + it('recovers if value is null', () => { + const props = { + ...defaultProps, + value: null, + } as SelectInputProps; + const { container } = render(wrap()); + + expect(container).toBeInTheDocument(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/input/select_input.tsx b/packages/kbn-management/settings/components/field_input/input/select_input.tsx new file mode 100644 index 0000000000000..4ca8fdf21532d --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/select_input.tsx @@ -0,0 +1,71 @@ +/* + * 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 React, { useMemo } from 'react'; +import { EuiSelect } from '@elastic/eui'; +import { InputProps } from '../types'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +/** + * Props for a {@link SelectInput} component. + */ +export interface SelectInputProps extends InputProps<'select'> { + /** Specify the option labels to their values. */ + optionLabels: Record; + /** Specify the option values. */ + optionValues: Array; +} + +/** + * Component for manipulating a `select` field. + */ +export const SelectInput = ({ + ariaDescribedBy, + ariaLabel, + id, + isDisabled = false, + onChange: onChangeProp, + optionLabels = {}, + optionValues: optionsProp, + value: valueProp, +}: SelectInputProps) => { + if (optionsProp.length === 0) { + throw new Error('non-empty `optionValues` are required for `SelectInput`.'); + } + + const options = useMemo( + () => + optionsProp?.map((option) => ({ + text: optionLabels.hasOwnProperty(option) ? optionLabels[option] : option, + value: option, + })), + [optionsProp, optionLabels] + ); + + const onChange = (event: React.ChangeEvent) => { + onChangeProp({ value: event.target.value }); + }; + + // nit: we have to do this because, while the `UiSettingsService` might return + // `null`, the {@link EuiSelect} component doesn't accept `null` as a value. + // + // @see packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts + // + const value = valueProp === null ? undefined : valueProp; + + return ( + + ); +}; diff --git a/packages/kbn-management/settings/components/field_input/input/text_input.test.tsx b/packages/kbn-management/settings/components/field_input/input/text_input.test.tsx new file mode 100644 index 0000000000000..d4dee9f32cdf6 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/text_input.test.tsx @@ -0,0 +1,50 @@ +/* + * 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 React from 'react'; +import { render, fireEvent } from '@testing-library/react'; + +import { TextInput } from './text_input'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +const name = 'Some text field'; +const id = 'some:text:field'; + +describe('TextInput', () => { + const defaultProps = { + id, + name, + ariaLabel: 'Test', + onChange: jest.fn(), + value: 'initial value', + }; + + it('renders without errors', () => { + const { container } = render(); + expect(container).toBeInTheDocument(); + }); + + it('renders the value prop', () => { + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toHaveValue('initial value'); + }); + + it('calls the onChange prop when the value changes', () => { + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + fireEvent.change(input, { target: { value: 'new value' } }); + expect(defaultProps.onChange).toHaveBeenCalledWith({ value: 'new value' }); + }); + + it('disables the input when isDisabled prop is true', () => { + const { getByTestId } = render(); + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${id}`); + expect(input).toBeDisabled(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_input/input/text_input.tsx b/packages/kbn-management/settings/components/field_input/input/text_input.tsx new file mode 100644 index 0000000000000..aa1dc913eeeea --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/input/text_input.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { EuiFieldText } from '@elastic/eui'; + +import { InputProps } from '../types'; +import { TEST_SUBJ_PREFIX_FIELD } from '.'; + +/** + * Props for a {@link TextInput} component. + */ +export type TextInputProps = InputProps<'string'>; + +/** + * Component for manipulating a `string` field. + */ +export const TextInput = ({ + name, + onChange: onChangeProp, + ariaLabel, + id, + isDisabled = false, + value: valueProp, + ariaDescribedBy, +}: TextInputProps) => { + const value = valueProp || ''; + const onChange = (event: React.ChangeEvent) => + onChangeProp({ value: event.target.value }); + + return ( + + ); +}; diff --git a/packages/kbn-management/settings/components/field_input/kibana.jsonc b/packages/kbn-management/settings/components/field_input/kibana.jsonc new file mode 100644 index 0000000000000..625ab3cc564b9 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/management-settings-components-field-input", + "owner": "@elastic/platform-deployment-management @elastic/appex-sharedux" +} diff --git a/packages/kbn-management/settings/components/field_input/mocks/context.mock.tsx b/packages/kbn-management/settings/components/field_input/mocks/context.mock.tsx new file mode 100644 index 0000000000000..daf926561bc84 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/mocks/context.mock.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React, { ReactChild } from 'react'; +import { I18nProvider } from '@kbn/i18n-react'; + +import { KibanaRootContextProvider } from '@kbn/react-kibana-context-root'; +import { themeServiceMock } from '@kbn/core-theme-browser-mocks'; +import { I18nStart } from '@kbn/core-i18n-browser'; + +import { FieldInputProvider } from '../services'; +import { FieldInputServices } from '../types'; + +const createRootMock = () => { + const i18n: I18nStart = { + Context: ({ children }) => {children}, + }; + const theme = themeServiceMock.createStartContract(); + return { + i18n, + theme, + }; +}; + +export const createFieldInputServicesMock = (): FieldInputServices => ({ + showDanger: jest.fn(), +}); + +export const TestWrapper = ({ + children, + services = createFieldInputServicesMock(), +}: { + children: ReactChild; + services?: FieldInputServices; +}) => { + return ( + + {children} + + ); +}; + +export const wrap = ( + component: JSX.Element, + services: FieldInputServices = createFieldInputServicesMock() +) => ( + + {component} + +); diff --git a/packages/kbn-management/settings/components/field_input/mocks/index.ts b/packages/kbn-management/settings/components/field_input/mocks/index.ts new file mode 100644 index 0000000000000..8eb7547c59584 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/mocks/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { TestWrapper, createFieldInputServicesMock, wrap } from './context.mock'; + +export type { FieldInputProvider } from '../services'; +export type { FieldInputServices } from '../types'; diff --git a/packages/kbn-management/settings/components/field_input/package.json b/packages/kbn-management/settings/components/field_input/package.json new file mode 100644 index 0000000000000..ca9dda8f8b384 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/management-settings-components-field-input", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/components/field_input/services.tsx b/packages/kbn-management/settings/components/field_input/services.tsx new file mode 100644 index 0000000000000..b76c9b7a9a6a5 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/services.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React, { FC, useContext } from 'react'; +import type { FieldInputServices, FieldInputKibanaDependencies } from './types'; + +const FieldInputContext = React.createContext(null); + +/** + * React Provider that provides services to a {@link FieldInput} component and its dependents. + */ +export const FieldInputProvider: FC = ({ children, ...services }) => { + // Typescript types are widened to accept more than what is needed. Take only what is necessary + // so the context remains clean. + const { showDanger } = services; + + return {children}; +}; + +/** + * Kibana-specific Provider that maps Kibana plugins and services to a {@link FieldInputProvider}. + */ +export const FieldInputKibanaProvider: FC = ({ + children, + toasts, +}) => { + return ( + toasts.addDanger(message), + }} + > + {children} + + ); +}; + +/** + * React hook for accessing pre-wired services. + * + * @see {@link FieldInputServices} + */ +export const useServices = () => { + const context = useContext(FieldInputContext); + + if (!context) { + throw new Error( + 'FieldInputContext is missing. Ensure your component or React root is wrapped with FieldInputProvider.' + ); + } + + return context; +}; diff --git a/packages/kbn-management/settings/components/field_input/setup_tests.ts b/packages/kbn-management/settings/components/field_input/setup_tests.ts new file mode 100644 index 0000000000000..8d1acb9232934 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/setup_tests.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +// eslint-disable-next-line import/no-extraneous-dependencies +import '@testing-library/jest-dom'; diff --git a/packages/kbn-management/settings/components/field_input/tsconfig.json b/packages/kbn-management/settings/components/field_input/tsconfig.json new file mode 100644 index 0000000000000..a6fe848abc2a9 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/tsconfig.json @@ -0,0 +1,32 @@ +{ + "extends": "../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/management-settings-types", + "@kbn/management-settings-field-definition", + "@kbn/monaco", + "@kbn/kibana-react-plugin", + "@kbn/management-settings-utilities", + "@kbn/i18n-react", + "@kbn/i18n", + "@kbn/core-notifications-browser", + "@kbn/core-ui-settings-common", + "@kbn/react-kibana-context-root", + "@kbn/core-theme-browser-mocks", + "@kbn/core-i18n-browser", + ] +} diff --git a/packages/kbn-management/settings/components/field_input/types.ts b/packages/kbn-management/settings/components/field_input/types.ts new file mode 100644 index 0000000000000..73e676785e6b9 --- /dev/null +++ b/packages/kbn-management/settings/components/field_input/types.ts @@ -0,0 +1,64 @@ +/* + * 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 { SettingType } from '@kbn/management-settings-types'; +import { ToastsStart } from '@kbn/core-notifications-browser'; +import { KnownTypeToValue } from '@kbn/management-settings-types'; + +/** + * Contextual services used by a {@link FieldInput} component. + */ +export interface FieldInputServices { + /** + * Displays a danger toast message. + * @param value The message to display. + */ + showDanger: (value: string) => void; +} + +/** + * An interface containing a collection of Kibana plugins and services required to + * render this component. + */ +export interface FieldInputKibanaDependencies { + /** The portion of the {@link ToastsStart} contract used by this component. */ + toasts: Pick; +} + +/** + * Props passed to a {@link FieldInput} component. + */ +export interface InputProps | null> { + id: string; + ariaDescribedBy?: string; + ariaLabel: string; + isDisabled?: boolean; + isInvalid?: boolean; + value?: V; + name: string; + /** The `onChange` handler. */ + onChange: OnChangeFn; +} + +/** + * Parameters for the {@link OnChangeFn} handler. + */ +export interface OnChangeParams { + /** The value provided to the handler. */ + value?: KnownTypeToValue | null; + /** An error message, if one occurred. */ + error?: string; + /** True if the format of a change is not valid, false otherwise. */ + isInvalid?: boolean; +} + +/** + * A function that is called when the value of a {@link FieldInput} changes. + * @param params The {@link OnChangeParams} parameters passed to the handler. + */ +export type OnChangeFn = (params: OnChangeParams) => void; diff --git a/packages/kbn-management/settings/components/field_row/README.mdx b/packages/kbn-management/settings/components/field_row/README.mdx new file mode 100644 index 0000000000000..6fe238938407c --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/README.mdx @@ -0,0 +1,37 @@ +--- +id: management/settings/components/fieldRow +slug: /management/settings/components/field-row +title: Management Settings Field Row Component +description: A package containing a component for rendering and manipulating a UiSetting in the Advanced Settings UI. +tags: ['management', 'settings'] +date: 2023-08-31 +--- + +## Description + +This package contains a component for rendering and manipulating a single UiSetting in the Advanced Settings UI. + +For reference, this is an example of the current Advanced Settings UI: + +
    Advanced Settings as a form.
    + +*Advanced Settings as a form.* + +## Implementation + +A `FormRow` represents a single UiSetting, and is responsible for rendering the UiSetting's label, description, and equivalent value input. It displays the state of any unsaved change, (e.g. error). It also handles the logic for updating the UiSetting's value in a consuming component through the `onChange` handler. + +
    Anatomy of a `FormRow`
    + +*Anatomy of a `FormRow`* + +## Notes + +- This implementation was extracted from the `advancedSettings` plugin. +- The type for a `UiSettingMetadata` is limited due to the permissive nature of the [`UiSettingsParam` type](packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts). +- The source includes notations of several bugs which will surface if the assumptions about default settings from Kibana change. + +## Testing + +- Code coverage stands at 95%. +- Storybook stories are included. Run `yarn storybook management` to view them. \ No newline at end of file diff --git a/packages/kbn-management/settings/components/field_row/__stories__/array_field.stories.tsx b/packages/kbn-management/settings/components/field_row/__stories__/array_field.stories.tsx new file mode 100644 index 0000000000000..dfe384fdd2349 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/array_field.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getFieldRowStory, getStory } from './common'; + +export default getStory('Array Row', 'A setting with an array of values.'); +export const ArrayRow = getFieldRowStory('array' as const); diff --git a/packages/kbn-management/settings/components/field_row/__stories__/boolean_field.stories.tsx b/packages/kbn-management/settings/components/field_row/__stories__/boolean_field.stories.tsx new file mode 100644 index 0000000000000..0d663a26cb5f8 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/boolean_field.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getStory, getFieldRowStory } from './common'; + +export default getStory('Boolean Row', 'A setting with a boolean value.'); +export const BooleanRow = getFieldRowStory('boolean' as const); diff --git a/packages/kbn-management/settings/components/field_row/__stories__/color_picker_field.stories.tsx b/packages/kbn-management/settings/components/field_row/__stories__/color_picker_field.stories.tsx new file mode 100644 index 0000000000000..61b0033d19175 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/color_picker_field.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getFieldRowStory, getStory } from './common'; + +export default getStory('Color Row', 'A setting with an base64 image value.'); +export const ColorRow = getFieldRowStory('color' as const); diff --git a/packages/kbn-management/settings/components/field_row/__stories__/common.tsx b/packages/kbn-management/settings/components/field_row/__stories__/common.tsx new file mode 100644 index 0000000000000..a18592ca867b2 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/common.tsx @@ -0,0 +1,150 @@ +/* + * 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 React from 'react'; +import type { ComponentMeta } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; +import { EuiPanel } from '@elastic/eui'; +import { SettingType } from '@kbn/management-settings-types'; + +import { KnownTypeToMetadata, UiSettingMetadata } from '@kbn/management-settings-types/metadata'; +import { + useFieldDefinition, + getDefaultValue, + getUserValue, +} from '@kbn/management-settings-field-definition/storybook'; +import { FieldRow as Component, FieldRow } from '../field_row'; +import { FieldRowProvider } from '../services'; +import { OnChangeFn } from '../types'; + +/** + * Props for a {@link FieldInput} Storybook story. + */ +export interface StoryProps + extends Pick, 'userValue' | 'value'> { + /** Simulate if the UiSetting is custom. */ + isCustom: boolean; + /** Simulate if the UiSetting is deprecated. */ + isDeprecated: boolean; + /** Simulate if the UiSetting is overriden. */ + isOverridden: boolean; + /** Simulate if saving settings is enabled in the UI. */ + isSavingEnabled: boolean; +} + +/** + * Utility function for returning a {@link FieldRow} Storybook story + * definition. + * @param title The title displayed in the Storybook UI. + * @param description The description of the Story. + * @returns A Storybook Story. + */ +export const getStory = ( + title: string, + description: string, + argTypes: Record = {} +) => + ({ + title: `Settings/Field Row/${title}`, + description, + argTypes: { + userValue: { + name: 'Current saved value', + }, + value: { + name: 'Default value from Kibana', + }, + isSavingEnabled: { + name: 'Saving is enabled?', + }, + isCustom: { + name: 'Setting is custom?', + }, + isDeprecated: { + name: 'Setting is deprecated?', + }, + isOverridden: { + name: 'Setting is overridden?', + }, + ...argTypes, + }, + decorators: [ + (Story) => ( + + + + + + ), + ], + } as ComponentMeta); + +/** + * Default argument values for a {@link FieldInput} Storybook story. + */ +export const storyArgs = { + /** True if the saving settings is disabled, false otherwise. */ + isSavingEnabled: true, + /** True if the UiSetting is custom, false otherwise. */ + isCustom: false, + /** True if the UiSetting is deprecated, false otherwise. */ + isDeprecated: false, + /** True if the UiSetting is overridden, false otherwise. */ + isOverridden: false, +}; + +/** + * Utility function for returning a {@link FieldRow} Storybook story. + * @param type The type of the UiSetting for this {@link FieldRow}. + * @returns A Storybook Story. + */ +export const getFieldRowStory = ( + type: SettingType, + settingFields: Partial> +) => { + const Story = ({ + isCustom, + isDeprecated, + isOverridden, + isSavingEnabled, + userValue, + value, + }: StoryProps) => { + const setting: UiSettingMetadata = { + type, + value, + userValue, + name: `Some ${type} setting`, + ...settingFields, + }; + + const [field, unsavedChange, onChangeFn] = useFieldDefinition(setting, { + isCustom, + isDeprecated, + isOverridden, + }); + + const onChange: OnChangeFn = (_key, change) => { + const { error, isInvalid, unsavedValue } = change; + onChangeFn({ error: error === null ? undefined : error, isInvalid, value: unsavedValue }); + }; + + return ; + }; + + Story.args = { + userValue: getUserValue(type), + value: getDefaultValue(type), + ...storyArgs, + }; + + return Story; +}; diff --git a/packages/kbn-management/settings/components/field_row/__stories__/image_field.stories.tsx b/packages/kbn-management/settings/components/field_row/__stories__/image_field.stories.tsx new file mode 100644 index 0000000000000..26975a2c8e4af --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/image_field.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getFieldRowStory, getStory } from './common'; + +export default getStory('Image Row', 'A setting with an base64 image value.'); +export const ImageRow = getFieldRowStory('image' as const); diff --git a/packages/kbn-management/settings/components/field_row/__stories__/json_field.stories.tsx b/packages/kbn-management/settings/components/field_row/__stories__/json_field.stories.tsx new file mode 100644 index 0000000000000..8a941a3abd804 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/json_field.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getFieldRowStory, getStory } from './common'; + +export default getStory('JSON Row', 'A setting with a JSON value.'); +export const JSONRow = getFieldRowStory('json' as const); diff --git a/packages/kbn-management/settings/components/field_row/__stories__/markdown_field.stories.tsx b/packages/kbn-management/settings/components/field_row/__stories__/markdown_field.stories.tsx new file mode 100644 index 0000000000000..0a858d5ec5ae7 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/markdown_field.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getFieldRowStory, getStory } from './common'; + +export default getStory('Markdown Row', 'A setting with a Markdown value.'); +export const MarkdownRow = getFieldRowStory('markdown' as const); diff --git a/packages/kbn-management/settings/components/field_row/__stories__/number_field.stories.tsx b/packages/kbn-management/settings/components/field_row/__stories__/number_field.stories.tsx new file mode 100644 index 0000000000000..dc97a11386afc --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/number_field.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getFieldRowStory, getStory } from './common'; + +export default getStory('Number Row', 'A setting with a numeric value.'); +export const NumberRow = getFieldRowStory('number' as const); diff --git a/packages/kbn-management/settings/components/field_row/__stories__/select_field.stories.tsx b/packages/kbn-management/settings/components/field_row/__stories__/select_field.stories.tsx new file mode 100644 index 0000000000000..299297f341282 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/select_field.stories.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getFieldRowStory, getStory } from './common'; + +const argTypes = { + value: { + name: 'Current saved value', + control: { + type: 'select', + options: ['option1', 'option2', 'option3'], + }, + }, +}; + +const settingFields = { + optionLabels: { option1: 'Option 1', option2: 'Option 2', option3: 'Option 3' }, + options: ['option1', 'option2', 'option3'], +}; + +export default getStory('Select Row', 'A setting with a boolean value.', argTypes); +export const SelectRow = getFieldRowStory('select' as const, settingFields); diff --git a/packages/kbn-management/settings/components/field_row/__stories__/text_field.stories.tsx b/packages/kbn-management/settings/components/field_row/__stories__/text_field.stories.tsx new file mode 100644 index 0000000000000..09ca6ada1d88d --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/__stories__/text_field.stories.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { getFieldRowStory, getStory } from './common'; + +export default getStory('String Row', 'A setting with a string value.'); +export const StringRow = getFieldRowStory('string' as const); diff --git a/packages/kbn-management/settings/components/field_row/assets/form_row.png b/packages/kbn-management/settings/components/field_row/assets/form_row.png new file mode 100644 index 0000000000000..e880adf032d8e Binary files /dev/null and b/packages/kbn-management/settings/components/field_row/assets/form_row.png differ diff --git a/packages/kbn-management/settings/components/field_row/assets/page.png b/packages/kbn-management/settings/components/field_row/assets/page.png new file mode 100644 index 0000000000000..9654e548193d4 Binary files /dev/null and b/packages/kbn-management/settings/components/field_row/assets/page.png differ diff --git a/packages/kbn-management/settings/components/field_row/description/default_value.test.tsx b/packages/kbn-management/settings/components/field_row/description/default_value.test.tsx new file mode 100644 index 0000000000000..49bb85fb3cdcd --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/description/default_value.test.tsx @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { render } from '@testing-library/react'; +import { FieldDefaultValue, DATA_TEST_SUBJ_DEFAULT_DISPLAY_PREFIX } from './default_value'; +import { wrap } from '../mocks'; + +describe('FieldDefaultValue', () => { + it('renders without errors', () => { + const { container } = render( + wrap( + + ) + ); + + expect(container).toBeInTheDocument(); + }); + + it('renders nothing if the default value is set', () => { + const { container } = render( + wrap( + + ) + ); + + expect(container).toBeEmptyDOMElement(); + }); + + it('does not render a code block for string fields', () => { + const { queryByTestId, getByText } = render( + wrap( + + ) + ); + const input = queryByTestId(`${DATA_TEST_SUBJ_DEFAULT_DISPLAY_PREFIX}-test`); + expect(input).not.toBeInTheDocument(); + const label = getByText('hello world'); + expect(label).toBeInTheDocument(); + }); + + it('renders a code block for JSON fields', () => { + const { getByTestId } = render( + wrap( + + ) + ); + const input = getByTestId(`${DATA_TEST_SUBJ_DEFAULT_DISPLAY_PREFIX}-test`); + expect(input).toBeInTheDocument(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_row/description/default_value.tsx b/packages/kbn-management/settings/components/field_row/description/default_value.tsx new file mode 100644 index 0000000000000..75fb9c4c7bdc4 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/description/default_value.tsx @@ -0,0 +1,65 @@ +/* + * 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 React from 'react'; +import { EuiCode, EuiCodeBlock, EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { + isJsonFieldDefinition, + isMarkdownFieldDefinition, +} from '@kbn/management-settings-field-definition'; +import { FieldDefinition, SettingType } from '@kbn/management-settings-types'; + +export const DATA_TEST_SUBJ_DEFAULT_DISPLAY_PREFIX = 'default-display-block'; +/** + * Props for a {@link FieldDefaultValue} component. + */ +export interface FieldDefaultValueProps { + /** The {@link FieldDefinition} corresponding the setting. */ + field: Pick, 'id' | 'type' | 'isDefaultValue' | 'defaultValueDisplay'>; +} + +/** + * Component for displaying the default value of a {@link FieldDefinition} + * in the {@link FieldRow}. + */ +export const FieldDefaultValue = ({ field }: FieldDefaultValueProps) => { + if (field.isDefaultValue) { + return null; + } + + const { defaultValueDisplay: display, id } = field; + + let value = {display}; + + if (isJsonFieldDefinition(field) || isMarkdownFieldDefinition(field)) { + value = ( + = 500 ? 300 : undefined} + > + {display} + + ); + } + + return ( + + + + ); +}; diff --git a/packages/kbn-management/settings/components/field_row/description/deprecation.test.tsx b/packages/kbn-management/settings/components/field_row/description/deprecation.test.tsx new file mode 100644 index 0000000000000..73e70df48e48f --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/description/deprecation.test.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { render } from '@testing-library/react'; +import { FieldDeprecation } from './deprecation'; +import { wrap } from '../mocks'; + +describe('FieldDeprecation', () => { + const defaultProps = { + field: { + name: 'test', + type: 'string', + deprecation: undefined, + }, + }; + + it('renders without errors', () => { + const { container } = render( + wrap( + + ) + ); + expect(container).toBeInTheDocument(); + }); + + it('renders nothing if there is no deprecation', () => { + const { container } = render(wrap()); + expect(container.firstChild).toBeNull(); + }); + + it('renders a warning badge if there is a deprecation', () => { + const { getByText } = render( + wrap( + + ) + ); + const badge = getByText('Deprecated'); + expect(badge).toBeInTheDocument(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_row/description/deprecation.tsx b/packages/kbn-management/settings/components/field_row/description/deprecation.tsx new file mode 100644 index 0000000000000..664f9e3e96047 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/description/deprecation.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ +/* + * 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 React from 'react'; +import { EuiBadge, EuiToolTip } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { FieldDefinition, SettingType } from '@kbn/management-settings-types'; +import { useServices } from '../services'; + +export const DATA_TEST_SUBJ_DEPRECATION_PREFIX = 'description-block-deprecation'; + +type Field = Pick, 'id' | 'deprecation' | 'name'>; + +/** + * Props for a {@link FieldDeprecation} component. + */ +export interface FieldDeprecationProps { + /** The {@link FieldDefinition} corresponding the setting. */ + field: Field; +} + +/** + * + */ +export const FieldDeprecation = ({ field }: FieldDeprecationProps) => { + const { links } = useServices(); + const { deprecation, name, id } = field; + + if (!deprecation) { + return null; + } + + return ( +
    + + { + window.open(links[deprecation!.docLinksKey], '_blank'); + }} + onClickAriaLabel={i18n.translate('management.settings.field.deprecationClickAreaLabel', { + defaultMessage: 'Click to view deprecation documentation for {name}.', + values: { + name, + }, + })} + > + Deprecated + + +
    + ); +}; diff --git a/packages/kbn-management/settings/components/field_row/description/description.test.tsx b/packages/kbn-management/settings/components/field_row/description/description.test.tsx new file mode 100644 index 0000000000000..859a530f3ccdd --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/description/description.test.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { render } from '@testing-library/react'; +import { FieldDescription } from './description'; +import { FieldDefinition } from '@kbn/management-settings-types'; +import { wrap } from '../mocks'; + +const description = 'hello world description'; + +describe('FieldDescription', () => { + const defaultProps = { + field: { + defaultValue: null, + defaultValueDisplay: 'null', + id: 'test', + isDefaultValue: false, + name: 'test', + savedValue: 'hello world', + type: 'string', + } as FieldDefinition<'string'>, + }; + + it('renders without errors', () => { + const { getByText } = render( + wrap( + + ) + ); + expect(getByText(description)).toBeInTheDocument(); + }); + + it('renders no description without one', () => { + const { queryByText } = render(wrap()); + expect(queryByText(description)).toBeNull(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_row/description/description.tsx b/packages/kbn-management/settings/components/field_row/description/description.tsx new file mode 100644 index 0000000000000..86529f366a321 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/description/description.tsx @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React, { ReactElement } from 'react'; + +import { FieldDefinition, SettingType, UnsavedFieldChange } from '@kbn/management-settings-types'; +import { EuiText } from '@elastic/eui'; + +import { useFieldStyles } from '../field_row.styles'; +import { FieldDeprecation } from './deprecation'; +import { FieldDefaultValue } from './default_value'; + +export const DATA_TEST_SUBJ_DESCRIPTION = 'settings-description'; + +type Field = Pick< + FieldDefinition, + | 'defaultValue' + | 'defaultValueDisplay' + | 'description' + | 'id' + | 'isDefaultValue' + | 'name' + | 'savedValue' + | 'type' +>; + +/** + * Props for a {@link FieldDescription} component. + */ +export interface FieldDescriptionProps { + field: Field; + unsavedChange?: UnsavedFieldChange; +} + +/** + * Component for displaying the description of a {@link FieldDefinition}. + */ +export const FieldDescription = ({ + field, + unsavedChange, +}: FieldDescriptionProps) => { + const { cssDescription } = useFieldStyles({ field, unsavedChange }); + const { description, name } = field; + + // TODO - this does *not* match the `UiSetting` type. + // @see packages/core/ui-settings/core-ui-settings-common/src/ui_settings.ts + let content: ReactElement | string | undefined = description; + + if (!React.isValidElement(content)) { + content = ( +
    + ); + } + + if (content) { + content = ( + + {content} + + ); + } + + return ( +
    + + {content} + +
    + ); +}; diff --git a/packages/kbn-management/settings/components/field_row/description/index.ts b/packages/kbn-management/settings/components/field_row/description/index.ts new file mode 100644 index 0000000000000..e0b513037b6d1 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/description/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { FieldDescription, type FieldDescriptionProps } from './description'; diff --git a/packages/kbn-management/settings/components/field_row/field_row.styles.ts b/packages/kbn-management/settings/components/field_row/field_row.styles.ts new file mode 100644 index 0000000000000..ece92a9fbd1aa --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/field_row.styles.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/react'; +import { UnsavedFieldChange, FieldDefinition, SettingType } from '@kbn/management-settings-types'; +import { hasUnsavedChange } from '@kbn/management-settings-utilities'; + +/** + * Parameters for the {@link useFieldStyles} hook. + */ +export interface Params { + /** The {@link FieldDefinition} corresponding the setting. */ + field: Pick, 'savedValue'>; + /** The {@link UnsavedFieldChange} corresponding to any unsaved change to the field. */ + unsavedChange?: UnsavedFieldChange; +} + +/** + * A React hook that provides stateful `css` classes for the {@link FieldRow} component. + */ +export const useFieldStyles = ({ field, unsavedChange }: Params) => { + const { + euiTheme: { size, colors }, + } = useEuiTheme(); + + const unsaved = hasUnsavedChange(field, unsavedChange); + const error = unsavedChange?.error; + + return { + cssFieldFormGroup: css` + + * { + margin-top: ${size.base}; + } + `, + cssFieldTitle: css` + font-weight: bold; + padding-left: ${size.s}; + margin-left: -${size.s}; + + ${unsaved ? `box-shadow: -${size.xs} 0 ${colors.warning};` : ''} + + ${error ? `box-shadow: -${size.xs} 0 ${colors.danger};` : ''} + `, + cssDescription: css` + & > div { + margin-bottom: ${size.s}; + } + `, + }; +}; diff --git a/packages/kbn-management/settings/components/field_row/field_row.test.tsx b/packages/kbn-management/settings/components/field_row/field_row.test.tsx new file mode 100644 index 0000000000000..481cb43b6fcf9 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/field_row.test.tsx @@ -0,0 +1,481 @@ +/* + * 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 React from 'react'; +import { fireEvent, render, waitFor } from '@testing-library/react'; + +import { SettingType } from '@kbn/management-settings-types'; +import { getFieldDefinition } from '@kbn/management-settings-field-definition'; +import { KnownTypeToMetadata } from '@kbn/management-settings-types/metadata'; + +import { DATA_TEST_SUBJ_SCREEN_READER_MESSAGE, FieldRow } from './field_row'; +import { wrap } from './mocks'; + +import { TEST_SUBJ_PREFIX_FIELD } from '@kbn/management-settings-components-field-input/input'; +import { DATA_TEST_SUBJ_OVERRIDDEN_PREFIX } from './input_footer/overridden_message'; +import { DATA_TEST_SUBJ_RESET_PREFIX } from './input_footer/reset_link'; + +const defaults = { + requiresPageReload: false, + readonly: false, + category: ['category'], +}; + +const defaultValues: Record = { + array: ['example_value'], + boolean: true, + color: '#FF00CC', + image: '', + json: "{ foo: 'bar2' }", + markdown: 'Hello World', + number: 1, + select: 'apple', + string: 'hello world', + undefined: 'undefined', +}; + +const defaultInputValues: Record = { + array: 'example_value', + boolean: true, + color: '#FF00CC', + image: '', + json: '{"hello": "world"}', + markdown: '**bold**', + number: 1, + select: 'apple', + string: 'hello world', + undefined: 'undefined', +}; + +const userValues: Record = { + array: ['user', 'value'], + boolean: false, + image: 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', + json: '{"hello": "world"}', + markdown: '**bold**', + number: 10, + select: 'banana', + string: 'foo', + color: '#FACF0C', + undefined: 'something', +}; + +const userInputValues: Record = { + array: 'user, value', + boolean: false, + image: 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', + json: '{"hello": "world"}', + markdown: '**bold**', + number: 10, + select: 'banana', + string: 'foo', + color: '#FACF0C', + undefined: 'something', +}; + +type Settings = { + [key in SettingType]: KnownTypeToMetadata; +}; + +const settings: Omit = { + array: { + description: 'Description for Array test setting', + name: 'array:test:setting', + type: 'array', + userValue: undefined, + value: defaultValues.array, + ...defaults, + }, + boolean: { + description: 'Description for Boolean test setting', + name: 'boolean:test:setting', + type: 'boolean', + userValue: undefined, + value: defaultValues.boolean, + ...defaults, + }, + color: { + description: 'Description for Color test setting', + name: 'color:test:setting', + type: 'color', + userValue: undefined, + value: defaultValues.color, + ...defaults, + }, + image: { + description: 'Description for Image test setting', + name: 'image:test:setting', + type: 'image', + userValue: undefined, + value: defaultValues.image, + ...defaults, + }, + // This is going to take a lot of mocks to test. + // + // json: { + // name: 'json:test:setting', + // description: 'Description for Json test setting', + // type: 'json', + // userValue: '{"foo": "bar"}', + // value: '{}', + // ...defaults, + // }, + // + // This is going to take a lot of mocks to test. + // + // markdown: { + // name: 'markdown:test:setting', + // description: 'Description for Markdown test setting', + // type: 'markdown', + // userValue: undefined, + // value: '', + // ...defaults, + // }, + number: { + description: 'Description for Number test setting', + name: 'number:test:setting', + type: 'number', + userValue: undefined, + value: defaultValues.number, + ...defaults, + }, + select: { + description: 'Description for Select test setting', + name: 'select:test:setting', + options: ['apple', 'orange', 'banana'], + optionLabels: { + apple: 'Apple', + orange: 'Orange', + banana: 'Banana', + }, + type: 'select', + userValue: undefined, + value: defaultValues.select, + ...defaults, + }, + string: { + description: 'Description for String test setting', + name: 'string:test:setting', + type: 'string', + userValue: undefined, + value: defaultValues.string, + ...defaults, + }, + undefined: { + description: 'Description for Undefined test setting', + name: 'undefined:test:setting', + type: 'undefined', + userValue: undefined, + value: defaultValues.undefined, + ...defaults, + }, +}; + +const handleChange = jest.fn(); + +describe('Field', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + (Object.keys(settings) as SettingType[]).forEach((type) => { + if (type === 'json' || type === 'markdown') { + return; + } + + const setting = settings[type]; + const id = settings[type].name || type; + const inputTestSubj = `${TEST_SUBJ_PREFIX_FIELD}-${id}`; + + describe(`for ${type} setting`, () => { + it('should render', () => { + const { container } = render( + wrap( + + ) + ); + + expect(container).toBeInTheDocument(); + }); + + it('should render default value if there is no user value set', () => { + const { getByTestId } = render( + wrap( + + ) + ); + + if (type === 'boolean') { + expect(getByTestId(inputTestSubj)).toHaveAttribute('aria-checked', 'true'); + } else if (type === 'color') { + expect(getByTestId(`euiColorPickerAnchor ${inputTestSubj}`)).toHaveValue( + defaultInputValues[type] + ); + } else if (type === 'number') { + expect(getByTestId(inputTestSubj)).toHaveValue(defaultInputValues[type]); + } else if (type === 'image') { + expect(getByTestId(inputTestSubj)).toBeInTheDocument(); + expect(getByTestId(inputTestSubj)).toHaveAttribute('type', 'file'); + } else { + expect(getByTestId(inputTestSubj)).toHaveValue(String(defaultInputValues[type]) as any); + } + }); + + it('should render as read only with help text if overridden', async () => { + const { getByTestId } = render( + wrap( + + ) + ); + if (type === 'color') { + expect(getByTestId(`euiColorPickerAnchor ${inputTestSubj}`)).toBeDisabled(); + } else { + expect(getByTestId(inputTestSubj)).toBeDisabled(); + } + + expect(getByTestId(`${DATA_TEST_SUBJ_OVERRIDDEN_PREFIX}-${id}`)).toBeInTheDocument(); + }); + + it('should render as read only if saving is disabled', () => { + const { getByTestId } = render( + wrap( + + ) + ); + if (type === 'color') { + expect(getByTestId(`euiColorPickerAnchor ${inputTestSubj}`)).toBeDisabled(); + } else { + expect(getByTestId(inputTestSubj)).toBeDisabled(); + } + }); + + it('should render user value if there is user value is set', async () => { + const { getByTestId, getByAltText } = render( + wrap( + + ) + ); + + if (type === 'boolean') { + expect(getByTestId(inputTestSubj)).toHaveAttribute('aria-checked', 'false'); + } else if (type === 'color') { + expect(getByTestId(`euiColorPickerAnchor ${inputTestSubj}`)).toHaveValue( + userValues[type] + ); + } else if (type === 'number') { + expect(getByTestId(inputTestSubj)).toHaveValue(userValues[type]); + } else if (type === 'image') { + expect(getByAltText(id)).toBeInTheDocument(); + expect(getByAltText(id)).toHaveAttribute('src', userValues[type]); + } else { + expect(getByTestId(inputTestSubj)).toHaveValue(String(userInputValues[type]) as any); + } + }); + + it('should render custom setting icon if it is custom', () => { + const { getByText } = render( + wrap( + + ) + ); + + expect(getByText('Custom setting')).toBeInTheDocument(); + }); + + it('should render unsaved value if there are unsaved changes', () => { + const { getByTestId, getByAltText } = render( + wrap( + + ) + ); + + if (type === 'boolean') { + expect(getByTestId(inputTestSubj)).toHaveAttribute('aria-checked', 'false'); + } else if (type === 'color') { + expect(getByTestId(`euiColorPickerAnchor ${inputTestSubj}`)).toHaveValue( + userInputValues[type] + ); + } else if (type === 'number') { + expect(getByTestId(inputTestSubj)).toHaveValue(userInputValues[type]); + } else if (type === 'image') { + expect(getByAltText(id)).toBeInTheDocument(); + expect(getByAltText(id)).toHaveAttribute('src', userValues[type]); + } else { + expect(getByTestId(inputTestSubj)).toHaveValue(String(userInputValues[type]) as any); + } + }); + + it('should reset when reset link is clicked', () => { + const field = getFieldDefinition({ + id, + setting: { + ...setting, + userValue: userValues[type], + }, + }); + + const { getByTestId } = render( + wrap() + ); + + const input = getByTestId(`${DATA_TEST_SUBJ_RESET_PREFIX}-${field.id}`); + fireEvent.click(input); + expect(handleChange).toHaveBeenCalledWith(field.id, { + type, + unsavedValue: field.defaultValue, + }); + }); + }); + }); + + it('should fire onChange when input changes', () => { + const setting = settings.string; + const field = getFieldDefinition({ id: setting.name || setting.type, setting }); + + const { getByTestId } = render( + wrap() + ); + + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${field.id}`); + fireEvent.change(input, { target: { value: 'new value' } }); + expect(handleChange).toHaveBeenCalledWith(field.id, { + type: 'string', + unsavedValue: 'new value', + }); + }); + + it('should fire onChange with an error when input changes with invalid value', () => { + const setting = settings.color; + const field = getFieldDefinition({ id: setting.name || setting.type, setting }); + + const { getByTestId } = render( + wrap() + ); + + const input = getByTestId(`euiColorPickerAnchor ${TEST_SUBJ_PREFIX_FIELD}-${field.id}`); + fireEvent.change(input, { target: { value: '#1234' } }); + + expect(handleChange).toHaveBeenCalledWith(field.id, { + type: 'color', + error: 'Provide a valid color value', + isInvalid: true, + unsavedValue: '#1234', + }); + }); + + it('should show screen reader content with an unsaved change.', () => { + const setting = settings.color; + const field = getFieldDefinition({ id: setting.name || setting.type, setting }); + + const { getByText, getByTestId } = render( + wrap( + + ) + ); + + expect(getByText('Setting is currently not saved.')).toBeInTheDocument(); + const input = getByTestId(`euiColorPickerAnchor ${TEST_SUBJ_PREFIX_FIELD}-${field.id}`); + fireEvent.change(input, { target: { value: '#1235' } }); + waitFor(() => expect(input).toHaveValue('#1235')); + waitFor(() => + expect(getByTestId(`${DATA_TEST_SUBJ_SCREEN_READER_MESSAGE}-${field.id}`)).toBe( + 'Provide a valid color value' + ) + ); + }); + + it('should clear the unsaved value if the new value matches the saved value', () => { + const setting = settings.string; + const field = getFieldDefinition({ + id: setting.name || setting.type, + setting: { + ...setting, + userValue: 'saved value', + }, + }); + + const unsavedChange = { + type: 'string' as const, + unsavedValue: 'new value', + }; + + const { getByTestId } = render( + wrap( + + ) + ); + + const input = getByTestId(`${TEST_SUBJ_PREFIX_FIELD}-${field.id}`); + fireEvent.change(input, { target: { value: field.savedValue } }); + expect(handleChange).toHaveBeenCalledWith(field.id, { + type: 'string', + unsavedValue: undefined, + }); + }); +}); diff --git a/packages/kbn-management/settings/components/field_row/field_row.tsx b/packages/kbn-management/settings/components/field_row/field_row.tsx new file mode 100644 index 0000000000000..c7f90af8c90fd --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/field_row.tsx @@ -0,0 +1,160 @@ +/* + * 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 React from 'react'; + +import { + EuiScreenReaderOnly, + EuiDescribedFormGroup, + EuiFormRow, + EuiErrorBoundary, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import type { + FieldDefinition, + SettingType, + UnsavedFieldChange, +} from '@kbn/management-settings-types'; +import { isImageFieldDefinition } from '@kbn/management-settings-field-definition'; +import { FieldInput, type OnChangeParams } from '@kbn/management-settings-components-field-input'; +import { isUnsavedValue } from '@kbn/management-settings-utilities'; + +import { FieldDescription } from './description'; +import { FieldTitle } from './title'; +import { FieldInputFooter } from './input_footer'; +import { useFieldStyles } from './field_row.styles'; +import { OnChangeFn } from './types'; + +export const DATA_TEST_SUBJ_SCREEN_READER_MESSAGE = 'fieldRowScreenReaderMessage'; + +/** + * Props for a {@link FieldRow} component. + */ +export interface FieldRowProps { + /** True if saving settings is enabled, false otherwise. */ + isSavingEnabled: boolean; + /** The {@link OnChangeFn} handler. */ + onChange: OnChangeFn; + /** + * The onClear handler, if a value is cleared to an empty or default state. + * @param id The id relating to the field to clear. + */ + onClear?: (id: string) => void; + /** The {@link FieldDefinition} corresponding the setting. */ + field: FieldDefinition; + /** The {@link UnsavedFieldChange} corresponding to any unsaved change to the field. */ + unsavedChange?: UnsavedFieldChange; +} + +/** + * Component for displaying a {@link FieldDefinition} in a form row, using a {@link FieldInput}. + * @param props The {@link FieldRowProps} for the {@link FieldRow} component. + */ +export const FieldRow = (props: FieldRowProps) => { + const { isSavingEnabled, onChange: onChangeProp, field, unsavedChange } = props; + const { id, name, groupId, isOverridden, type, unsavedFieldId } = field; + const { cssFieldFormGroup } = useFieldStyles({ + field, + unsavedChange, + }); + + const onChange = (changes: UnsavedFieldChange) => { + onChangeProp(name, changes); + }; + + const resetField = () => { + const { defaultValue: unsavedValue } = field; + return onChange({ type, unsavedValue }); + }; + + const onFieldChange = ({ isInvalid, error, value: unsavedValue }: OnChangeParams) => { + if (error) { + isInvalid = true; + } + + const change = { + type, + isInvalid, + error, + }; + + if (!isUnsavedValue(field, unsavedValue)) { + onChange(change); + } else { + onChange({ + ...change, + unsavedValue, + }); + } + }; + + const title = ; + const description = ; + const error = unsavedChange?.error; + const isInvalid = unsavedChange?.isInvalid; + let unsavedScreenReaderMessage = null; + + const helpText = ( + + ); + + if (unsavedChange) { + unsavedScreenReaderMessage = ( + +

    + {error + ? error + : i18n.translate('management.settings.field.settingIsUnsaved', { + defaultMessage: 'Setting is currently not saved.', + })} +

    +
    + ); + } + + return ( + + + + <> + + {unsavedScreenReaderMessage} + + + + + ); +}; diff --git a/packages/kbn-management/settings/components/field_row/index.ts b/packages/kbn-management/settings/components/field_row/index.ts new file mode 100644 index 0000000000000..f54eadd4467ed --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { FieldRow, type FieldRowProps as FieldProps } from './field_row'; diff --git a/packages/kbn-management/settings/components/field_row/input_footer/change_image_link.test.tsx b/packages/kbn-management/settings/components/field_row/input_footer/change_image_link.test.tsx new file mode 100644 index 0000000000000..3c01240a9e9ea --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/input_footer/change_image_link.test.tsx @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { render } from '@testing-library/react'; +import { ChangeImageLink } from './change_image_link'; +import { ImageFieldDefinition } from '@kbn/management-settings-types'; +import { wrap } from '../mocks'; +import { IMAGE } from '@kbn/management-settings-field-definition/storybook'; + +describe('ChangeImageLink', () => { + const defaultProps = { + field: { + name: 'test', + type: 'image', + ariaAttributes: { + ariaLabel: 'test', + }, + } as ImageFieldDefinition, + onChange: jest.fn(), + onCancel: jest.fn(), + onReset: jest.fn(), + unsavedChange: undefined, + }; + + it('does not render no saved value and no unsaved change', () => { + const { container } = render( + wrap() + ); + expect(container.firstChild).toBeNull(); + }); + + it('renders with a saved value and no unsaved change', () => { + const { container } = render( + wrap( + + ) + ); + expect(container.firstChild).not.toBeNull(); + }); + + it('renders if there is a saved value and the unsaved value is undefined', () => { + const { container } = render( + wrap( + + ) + ); + expect(container.firstChild).not.toBeNull(); + }); + + it('renders nothing when there is an unsaved change', () => { + const { container } = render( + wrap( + + ) + ); + expect(container.firstChild).toBeNull(); + }); + + it('renders an aria-label', () => { + const { getByLabelText } = render( + wrap( + + ) + ); + const link = getByLabelText('Change test'); + expect(link).not.toBeNull(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_row/input_footer/change_image_link.tsx b/packages/kbn-management/settings/components/field_row/input_footer/change_image_link.tsx new file mode 100644 index 0000000000000..c4e6df6b4521b --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/input_footer/change_image_link.tsx @@ -0,0 +1,86 @@ +/* + * 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 React from 'react'; +import { EuiLink } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { FieldDefinition, SettingType, UnsavedFieldChange } from '@kbn/management-settings-types'; +import { hasUnsavedChange } from '@kbn/management-settings-utilities'; +import { OnChangeFn } from '@kbn/management-settings-components-field-input'; +import { + isImageFieldDefinition, + isImageFieldUnsavedChange, +} from '@kbn/management-settings-field-definition'; + +type Field = Pick< + FieldDefinition, + 'name' | 'defaultValue' | 'type' | 'savedValue' | 'savedValue' | 'ariaAttributes' +>; +/** + * Props for a {@link ChangeImageLink} component. + */ +export interface ChangeImageLinkProps { + /** The {@link ImageFieldDefinition} corresponding the setting. */ + field: Field; + /** The {@link OnChangeFn} event handler. */ + onChange: OnChangeFn; + /** The {@link UnsavedFieldChange} corresponding to any unsaved change to the field. */ + unsavedChange?: UnsavedFieldChange; +} + +/** + * Component for rendering a link to change the image in a {@link FieldRow} of + * an {@link ImageFieldDefinition}. + */ +export const ChangeImageLink = ({ + field, + onChange, + unsavedChange, +}: ChangeImageLinkProps) => { + if (hasUnsavedChange(field, unsavedChange)) { + return null; + } + + const { unsavedValue } = unsavedChange || {}; + const { + savedValue, + ariaAttributes: { ariaLabel }, + name, + defaultValue, + } = field; + + if (unsavedValue || !savedValue) { + return null; + } + + if (isImageFieldDefinition(field) && isImageFieldUnsavedChange(unsavedChange)) { + return ( + + onChange({ value: defaultValue })} + data-test-subj={`management-settings-changeImage-${name}`} + > + + + + ); + } + + return null; +}; diff --git a/packages/kbn-management/settings/components/field_row/input_footer/index.ts b/packages/kbn-management/settings/components/field_row/input_footer/index.ts new file mode 100644 index 0000000000000..d840b892b9bd8 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/input_footer/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { FieldInputFooter, type FieldInputFooterProps } from './input_footer'; diff --git a/packages/kbn-management/settings/components/field_row/input_footer/input_footer.tsx b/packages/kbn-management/settings/components/field_row/input_footer/input_footer.tsx new file mode 100644 index 0000000000000..5a2e12f39f6b2 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/input_footer/input_footer.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; + +import type { + FieldDefinition, + SettingType, + UnsavedFieldChange, +} from '@kbn/management-settings-types'; + +import { OnChangeFn } from '@kbn/management-settings-components-field-input'; + +import { FieldResetLink } from './reset_link'; +import { ChangeImageLink } from './change_image_link'; +import { FieldOverriddenMessage } from './overridden_message'; + +export const DATA_TEST_SUBJ_FOOTER_PREFIX = 'field-row-input-footer'; + +type Field = Pick< + FieldDefinition, + 'id' | 'name' | 'isOverridden' | 'type' | 'ariaAttributes' | 'isDefaultValue' +>; + +/** + * Props for a {@link FieldInputFooter} component. + */ +export interface FieldInputFooterProps { + /** The {@link FieldDefinition} corresponding the setting. */ + field: Field; + /** The {@link UnsavedFieldChange} corresponding to any unsaved change to the field. */ + unsavedChange?: UnsavedFieldChange; + /** The {@link OnChangeFn} handler. */ + onChange: OnChangeFn; + /** A handler for when a field is reset to its default or saved value. */ + onReset: () => void; + /** True if saving this setting is enabled, false otherwise. */ + isSavingEnabled: boolean; +} + +export const FieldInputFooter = ({ + isSavingEnabled, + field, + onReset, + ...props +}: FieldInputFooterProps) => { + if (field.isOverridden) { + return ; + } + + if (isSavingEnabled) { + return ( + + + + + ); + } + + return null; +}; diff --git a/packages/kbn-management/settings/components/field_row/input_footer/overridden_message.test.tsx b/packages/kbn-management/settings/components/field_row/input_footer/overridden_message.test.tsx new file mode 100644 index 0000000000000..ab894cf013174 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/input_footer/overridden_message.test.tsx @@ -0,0 +1,34 @@ +/* + * 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 React from 'react'; +import { render } from '@testing-library/react'; +import { FieldOverriddenMessage } from './overridden_message'; +import { FieldDefinition } from '@kbn/management-settings-types'; + +describe('FieldOverriddenMessage', () => { + const defaultProps = { + field: { + name: 'test', + type: 'string', + isOverridden: false, + } as FieldDefinition<'string'>, + }; + + it('renders without errors', () => { + const { container } = render( + + ); + expect(container).toBeInTheDocument(); + }); + + it('renders nothing if the field is not overridden', () => { + const { container } = render(); + expect(container.firstChild).toBeNull(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_row/input_footer/overridden_message.tsx b/packages/kbn-management/settings/components/field_row/input_footer/overridden_message.tsx new file mode 100644 index 0000000000000..bff68afb370c2 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/input_footer/overridden_message.tsx @@ -0,0 +1,42 @@ +/* + * 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 React from 'react'; +import { EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import type { FieldDefinition, SettingType } from '@kbn/management-settings-types'; + +type Field = Pick, 'id' | 'isOverridden' | 'name'>; + +export const DATA_TEST_SUBJ_OVERRIDDEN_PREFIX = 'field-row-input-overridden-message'; + +/** + * Props for a {@link FieldOverriddenMessage} component. + */ +export interface FieldOverriddenMessageProps { + /** The {@link FieldDefinition} corresponding the setting. */ + field: Field; +} + +export const FieldOverriddenMessage = ({ + field, +}: FieldOverriddenMessageProps) => { + if (!field.isOverridden) { + return null; + } + + return ( + + + + ); +}; diff --git a/packages/kbn-management/settings/components/field_row/input_footer/reset_link.test.tsx b/packages/kbn-management/settings/components/field_row/input_footer/reset_link.test.tsx new file mode 100644 index 0000000000000..52cf165ab9b9f --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/input_footer/reset_link.test.tsx @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; +import { render, fireEvent } from '@testing-library/react'; + +import { FieldDefinition } from '@kbn/management-settings-types'; + +import { wrap } from '../mocks'; +import { FieldResetLink } from './reset_link'; + +describe('FieldResetLink', () => { + const defaultProps = { + field: { + name: 'test', + type: 'string', + isDefaultValue: false, + ariaAttributes: {}, + } as FieldDefinition<'string'>, + onReset: jest.fn(), + }; + + it('renders without errors', () => { + const { container } = render(wrap()); + expect(container).toBeInTheDocument(); + }); + + it('renders nothing if the field is already at its default value', () => { + const { container } = render( + wrap( + + ) + ); + expect(container.firstChild).toBeNull(); + }); + + it('renders a link to reset the field if it is not at its default value', () => { + const { getByText } = render(wrap()); + const link = getByText('Reset to default'); + expect(link).toBeInTheDocument(); + }); + + it('calls the onReset prop when the link is clicked', () => { + const { getByText } = render(wrap()); + const link = getByText('Reset to default'); + fireEvent.click(link); + expect(defaultProps.onReset).toHaveBeenCalled(); + }); +}); diff --git a/packages/kbn-management/settings/components/field_row/input_footer/reset_link.tsx b/packages/kbn-management/settings/components/field_row/input_footer/reset_link.tsx new file mode 100644 index 0000000000000..2703a4121107d --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/input_footer/reset_link.tsx @@ -0,0 +1,64 @@ +/* + * 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 React from 'react'; +import { EuiLink } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { FieldDefinition, SettingType } from '@kbn/management-settings-types'; + +/** + * Props for a {@link FieldResetLink} component. + */ +export interface FieldResetLinkProps { + /** The {@link FieldDefinition} corresponding the setting. */ + field: Pick, 'id' | 'isDefaultValue' | 'ariaAttributes'>; + /** A handler for when a field is reset to its default or saved value. */ + onReset: () => void; +} + +export const DATA_TEST_SUBJ_RESET_PREFIX = 'management-settings-resetField'; +/** + * Component for rendering a link to reset a {@link FieldDefinition} to its default + * or saved value. + */ +export const FieldResetLink = ({ + onReset, + field, +}: FieldResetLinkProps) => { + if (field.isDefaultValue) { + return null; + } + + const { + id, + ariaAttributes: { ariaLabel }, + } = field; + + return ( + + + + +     + + ); +}; diff --git a/packages/kbn-management/settings/components/field_row/kibana.jsonc b/packages/kbn-management/settings/components/field_row/kibana.jsonc new file mode 100644 index 0000000000000..ceec221d6a2d2 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/management-settings-components-field-row", + "owner": "@elastic/platform-deployment-management @elastic/appex-sharedux" +} diff --git a/packages/kbn-management/settings/components/field_row/mocks/context.tsx b/packages/kbn-management/settings/components/field_row/mocks/context.tsx new file mode 100644 index 0000000000000..f8109b6dd08b1 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/mocks/context.tsx @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React, { ReactChild } from 'react'; +import { I18nProvider } from '@kbn/i18n-react'; + +import { KibanaRootContextProvider } from '@kbn/react-kibana-context-root'; +import { themeServiceMock } from '@kbn/core-theme-browser-mocks'; +import { I18nStart } from '@kbn/core-i18n-browser'; + +import { createFieldInputServicesMock } from '@kbn/management-settings-components-field-input/mocks'; +import { FieldInputServices } from '@kbn/management-settings-components-field-input/mocks'; +import { FieldRowProvider } from '../services'; +import { FieldRowServices } from '../types'; + +const createRootMock = () => { + const i18n: I18nStart = { + Context: ({ children }) => {children}, + }; + const theme = themeServiceMock.createStartContract(); + return { + i18n, + theme, + }; +}; + +export const createFieldRowServicesMock = (): FieldRowServices => ({ + ...createFieldInputServicesMock(), + links: { deprecationKey: 'link/to/deprecation/docs' }, +}); + +export const TestWrapper = ({ + children, + services = createFieldRowServicesMock(), +}: { + children: ReactChild; + services?: FieldRowServices; +}) => { + return ( + + {children} + + ); +}; + +export const wrap = ( + component: JSX.Element, + services: FieldInputServices = createFieldRowServicesMock() +) => {component}; diff --git a/packages/kbn-management/settings/components/field_row/mocks/index.ts b/packages/kbn-management/settings/components/field_row/mocks/index.ts new file mode 100644 index 0000000000000..2fbe57cd37108 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/mocks/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { TestWrapper, createFieldRowServicesMock, wrap } from './context'; diff --git a/packages/kbn-management/settings/components/field_row/package.json b/packages/kbn-management/settings/components/field_row/package.json new file mode 100644 index 0000000000000..aa5daf8a30cd7 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/management-settings-components-field-row", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/components/field_row/services.tsx b/packages/kbn-management/settings/components/field_row/services.tsx new file mode 100644 index 0000000000000..7d9fab6d87035 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/services.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { + FieldInputKibanaProvider, + FieldInputProvider, +} from '@kbn/management-settings-components-field-input/services'; +import React, { FC, useContext } from 'react'; + +import type { FieldRowServices, FieldRowKibanaDependencies, Services } from './types'; + +const FieldRowContext = React.createContext(null); + +/** + * React Provider that provides services to a {@link FieldRow} component and its dependents. + */ +export const FieldRowProvider: FC = ({ children, ...services }) => { + // Typescript types are widened to accept more than what is needed. Take only what is necessary + // so the context remains clean. + const { links, showDanger } = services; + + return ( + + {children} + + ); +}; + +/** + * Kibana-specific Provider that maps Kibana plugins and services to a {@link FieldRowProvider}. + */ +export const FieldRowKibanaProvider: FC = ({ + children, + docLinks, + toasts, +}) => { + return ( + + {children} + + ); +}; + +/** + * React hook for accessing pre-wired services. + */ +export const useServices = () => { + const context = useContext(FieldRowContext); + + if (!context) { + throw new Error( + 'FieldRowContext is missing. Ensure your component or React root is wrapped with FieldRowProvider.' + ); + } + + return context; +}; diff --git a/packages/kbn-management/settings/components/field_row/setup_tests.ts b/packages/kbn-management/settings/components/field_row/setup_tests.ts new file mode 100644 index 0000000000000..8d1acb9232934 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/setup_tests.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +// eslint-disable-next-line import/no-extraneous-dependencies +import '@testing-library/jest-dom'; diff --git a/packages/kbn-management/settings/components/field_row/title/icon_custom.tsx b/packages/kbn-management/settings/components/field_row/title/icon_custom.tsx new file mode 100644 index 0000000000000..d773eb136b3b0 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/title/icon_custom.tsx @@ -0,0 +1,48 @@ +/* + * 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 React from 'react'; + +import { EuiIconTip } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { FieldDefinition, SettingType } from '@kbn/management-settings-types'; + +/** + * Props for a {@link FieldTitle} component. + */ +export interface TitleProps { + /** The {@link FieldDefinition} corresponding the setting. */ + field: Pick, 'isCustom'>; +} + +/** + * + */ +export const FieldTitleCustomIcon = ({ field }: TitleProps) => { + if (!field.isCustom) { + return null; + } + + return ( + + } + /> + ); +}; diff --git a/packages/kbn-management/settings/components/field_row/title/icon_unsaved.tsx b/packages/kbn-management/settings/components/field_row/title/icon_unsaved.tsx new file mode 100644 index 0000000000000..bf44a0686d60e --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/title/icon_unsaved.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 React from 'react'; + +import { EuiIconTip } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { FieldDefinition, UnsavedFieldChange, SettingType } from '@kbn/management-settings-types'; +import { hasUnsavedChange } from '@kbn/management-settings-utilities'; + +/** + * Props for a {@link FieldTitle} component. + */ +export interface TitleProps { + /** The {@link FieldDefinition} corresponding the setting. */ + field: Pick, 'id' | 'type' | 'isOverridden' | 'savedValue'>; + /** The {@link UnsavedFieldChange} corresponding to any unsaved change to the field. */ + unsavedChange?: UnsavedFieldChange; +} + +/** + * + */ +export const FieldTitleUnsavedIcon = ({ + field, + unsavedChange, +}: TitleProps) => { + if (!unsavedChange || !hasUnsavedChange(field, unsavedChange)) { + return null; + } + + const { isInvalid } = unsavedChange; + + const invalidLabel = i18n.translate('management.settings.field.invalidIconLabel', { + defaultMessage: 'Invalid', + }); + + const unsavedLabel = i18n.translate('management.settings.field.unsavedIconLabel', { + defaultMessage: 'Unsaved', + }); + + const unsavedIconLabel = unsavedChange.isInvalid ? invalidLabel : unsavedLabel; + + return ( + + ); +}; diff --git a/packages/kbn-management/settings/components/field_row/title/index.ts b/packages/kbn-management/settings/components/field_row/title/index.ts new file mode 100644 index 0000000000000..f2a757252e699 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/title/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { FieldTitle, type TitleProps } from './title'; diff --git a/packages/kbn-management/settings/components/field_row/title/title.tsx b/packages/kbn-management/settings/components/field_row/title/title.tsx new file mode 100644 index 0000000000000..36c6042394287 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/title/title.tsx @@ -0,0 +1,61 @@ +/* + * 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 React from 'react'; +import type { Interpolation, Theme } from '@emotion/react'; + +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { FieldDefinition, UnsavedFieldChange, SettingType } from '@kbn/management-settings-types'; + +import { useFieldStyles } from '../field_row.styles'; +import { FieldTitleCustomIcon } from './icon_custom'; +import { FieldTitleUnsavedIcon } from './icon_unsaved'; + +/** + * Props for a {@link FieldTitle} component. + */ +export interface TitleProps { + /** The {@link FieldDefinition} corresponding the setting. */ + field: FieldDefinition; + /** Emotion-based `css` for the root React element. */ + css?: Interpolation; + /** Classname for the root React element. */ + className?: string; + /** The {@link UnsavedFieldChange} corresponding to any unsaved change to the field. */ + unsavedChange?: UnsavedFieldChange; +} + +/** + * Component for displaying the `displayName` and status of a {@link FieldDefinition} in + * the {@link FieldRow}. + */ +export const FieldTitle = ({ + field, + unsavedChange, + ...props +}: TitleProps) => { + const { cssFieldTitle } = useFieldStyles({ + field, + unsavedChange, + }); + + return ( + + +

    {field.displayName}

    +
    + + + + + + +
    + ); +}; diff --git a/packages/kbn-management/settings/components/field_row/tsconfig.json b/packages/kbn-management/settings/components/field_row/tsconfig.json new file mode 100644 index 0000000000000..173fbd57d08b6 --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/tsconfig.json @@ -0,0 +1,33 @@ +{ + "extends": "../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react", + "@kbn/ambient-ui-types", + "@kbn/ambient-storybook-types", + "@emotion/react/types/css-prop" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/management-settings-types", + "@kbn/management-settings-field-definition", + "@kbn/i18n", + "@kbn/i18n-react", + "@kbn/management-settings-utilities", + "@kbn/management-settings-components-field-input", + "@kbn/core-doc-links-browser", + "@kbn/react-kibana-context-root", + "@kbn/core-theme-browser-mocks", + "@kbn/core-i18n-browser", + ] +} diff --git a/packages/kbn-management/settings/components/field_row/types.ts b/packages/kbn-management/settings/components/field_row/types.ts new file mode 100644 index 0000000000000..9eec1eb234f2c --- /dev/null +++ b/packages/kbn-management/settings/components/field_row/types.ts @@ -0,0 +1,52 @@ +/* + * 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 { DocLinksStart } from '@kbn/core-doc-links-browser'; + +import type { + FieldInputServices, + FieldInputKibanaDependencies, +} from '@kbn/management-settings-components-field-input'; +import { SettingType, UnsavedFieldChange } from '@kbn/management-settings-types'; + +/** + * Contextual services used by a {@link FieldRow} component. + */ +export interface Services { + links: { [key: string]: string }; +} + +/** + * Contextual services used by a {@link FieldRow} component and its dependents. + */ +export type FieldRowServices = FieldInputServices & Services; + +/** + * An interface containing a collection of Kibana plugins and services required to + * render a {@link FieldRow} component. + */ +export interface KibanaDependencies { + docLinks: { + links: { + management: DocLinksStart['links']['management']; + }; + }; +} + +/** + * An interface containing a collection of Kibana plugins and services required to + * render a {@link FieldRow} component and its dependents. + */ +export type FieldRowKibanaDependencies = KibanaDependencies & FieldInputKibanaDependencies; + +/** + * An `onChange` handler for a {@link FieldRow} component. + * @param id A unique id corresponding to the particular setting being changed. + * @param change The {@link UnsavedFieldChange} corresponding to any unsaved change to the field. + */ +export type OnChangeFn = (id: string, change: UnsavedFieldChange) => void; diff --git a/packages/kbn-management/settings/field_definition/README.mdx b/packages/kbn-management/settings/field_definition/README.mdx new file mode 100644 index 0000000000000..c26b5d850358c --- /dev/null +++ b/packages/kbn-management/settings/field_definition/README.mdx @@ -0,0 +1,14 @@ +--- +id: management/settings/fieldDefinition +slug: /management/settings/field-definition +title: Management Settings Field Definition +description: A package containing utilities for creating and examining Field Definitions from Advanced Settings. +tags: ['management', 'settings'] +date: 2023-08-31 +--- + +## Description + +This package contains utilities for creating and examining Field Definitions from Advanced Settings. + +Since a raw `UiSetting` is not type-safe and can be difficult to work with in the UX, this `FieldDefinition` provides a type-safe abstraction over the raw `UiSetting` _and_ provides additional UI-centric information derived from the setting. diff --git a/packages/kbn-management/settings/field_definition/get_definition.ts b/packages/kbn-management/settings/field_definition/get_definition.ts new file mode 100644 index 0000000000000..e6b29e6f437ca --- /dev/null +++ b/packages/kbn-management/settings/field_definition/get_definition.ts @@ -0,0 +1,151 @@ +/* + * 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. + */ +/* + * 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 words from 'lodash/words'; +import isEqual from 'lodash/isEqual'; + +import { Query } from '@elastic/eui'; +import { FieldDefinition, SettingType } from '@kbn/management-settings-types'; +import { UiSettingMetadata } from '@kbn/management-settings-types/metadata'; + +/** + * The portion of the setting name that defines the category of the setting. + */ +export const CATEGORY_FIELD = 'category'; + +/** + * The default category for a setting, if not supplied. + */ +export const DEFAULT_CATEGORY = 'general'; + +const mapWords = (name?: string): string => + words(name ?? '') + .map((word) => word.toLowerCase()) + .join(' '); + +/** + * Derive the aria-label for a given setting based on its name and category. + */ +const getAriaLabel = (name: string = '') => { + const query = Query.parse(name); + + if (query.hasOrFieldClause(CATEGORY_FIELD)) { + const categories = query.getOrFieldClause(CATEGORY_FIELD); + const termValue = mapWords(query.removeOrFieldClauses(CATEGORY_FIELD).text); + + if (!categories || !Array.isArray(categories.value)) { + return termValue; + } + + let categoriesQuery = Query.parse(''); + categories.value.forEach((v) => { + categoriesQuery = categoriesQuery.addOrFieldValue(CATEGORY_FIELD, v); + }); + + return `${termValue} ${categoriesQuery.text}`; + } + + return mapWords(name); +}; + +/** + * Parameters for converting a {@link UiSettingMetadata} object into a {@link FieldDefinition} + * for use in the UI. + * @internal + */ +interface GetDefinitionParams { + /** The id of the field. */ + id: string; + /** The source setting from Kibana. */ + setting: UiSettingMetadata; + /** Optional parameters */ + params?: { + /** True if the setting it custom, false otherwise */ + isCustom?: boolean; + /** True if the setting is overridden in Kibana, false otherwise. */ + isOverridden?: boolean; + }; +} + +/** + * Create a {@link FieldDefinition} from a {@link UiSettingMetadata} object for use + * in the UI. + * + * @param parameters The {@link GetDefinitionParams} for creating the {@link FieldDefinition}. + */ +export const getFieldDefinition = ( + parameters: GetDefinitionParams +): FieldDefinition => { + const { id, setting, params = { isCustom: false, isOverridden: false } } = parameters; + + const { + category, + deprecation, + description, + metric, + name, + optionLabels, + options: optionValues, + order, + readonly, + requiresPageReload, + type, + userValue: savedValue, + value: defaultValue, + } = setting; + + const { isCustom, isOverridden } = params; + const categories = category && category.length ? category : [DEFAULT_CATEGORY]; + + const options = { + values: optionValues || [], + labels: optionLabels || {}, + }; + + const defaultValueDisplay = + defaultValue === undefined || defaultValue === null || defaultValue === '' + ? 'null' + : String(defaultValue); + + const definition: FieldDefinition = { + ariaAttributes: { + ariaLabel: getAriaLabel(name), + // ariaDescribedBy: unsavedChange.value ? `${groupId} ${unsavedId}` : undefined, + }, + categories, + defaultValue, + defaultValueDisplay, + deprecation, + description, + displayName: name || id, + groupId: `${name || id}-group`, + id, + isCustom: isCustom || false, + isDefaultValue: isEqual(defaultValue, setting.userValue), + isOverridden: isOverridden || false, + isReadOnly: !!readonly, + metric, + name: name || id, + options, + order, + requiresPageReload: !!requiresPageReload, + savedValue, + type, + unsavedFieldId: `${id}-unsaved`, + }; + + // TODO: clintandrewhall - add validation (e.g. `select` contains non-empty `options`) + return definition; +}; diff --git a/packages/kbn-management/settings/field_definition/index.ts b/packages/kbn-management/settings/field_definition/index.ts new file mode 100644 index 0000000000000..2cd44db7df3b4 --- /dev/null +++ b/packages/kbn-management/settings/field_definition/index.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { + isArrayFieldDefinition, + isArrayFieldUnsavedChange, + isBooleanFieldDefinition, + isBooleanFieldUnsavedChange, + isColorFieldDefinition, + isColorFieldUnsavedChange, + isImageFieldDefinition, + isImageFieldUnsavedChange, + isJsonFieldDefinition, + isJsonFieldUnsavedChange, + isMarkdownFieldDefinition, + isMarkdownFieldUnsavedChange, + isNumberFieldDefinition, + isNumberFieldUnsavedChange, + isSelectFieldDefinition, + isSelectFieldUnsavedChange, + isStringFieldDefinition, + isStringFieldUnsavedChange, + isUndefinedFieldDefinition, + isUndefinedFieldUnsavedChange, +} from './is'; + +export { getFieldDefinition } from './get_definition'; diff --git a/packages/kbn-management/settings/field_definition/is/field_definition.ts b/packages/kbn-management/settings/field_definition/is/field_definition.ts new file mode 100644 index 0000000000000..52c6e83468177 --- /dev/null +++ b/packages/kbn-management/settings/field_definition/is/field_definition.ts @@ -0,0 +1,114 @@ +/* + * 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. + */ + +// This file is enormous and looks a bit excessive, but it's actually a collection +// of type guards. +// +// In the past, the UI would key off of the `type` property of a UISetting to do +// its work. This was not at all type-safe, and it was easy to make mistakes. +// +// These type guards narrow a given {@link FieldDefinition} to its correct Typescript +// interface. What's interesting is that these guards compile to checking the `type` +// property of the object-- just as we did before-- but with the benefit of Typescript. + +import { + ArrayFieldDefinition, + BooleanFieldDefinition, + ColorFieldDefinition, + FieldDefinition, + ImageFieldDefinition, + JsonFieldDefinition, + MarkdownFieldDefinition, + NumberFieldDefinition, + SelectFieldDefinition, + SettingType, + StringFieldDefinition, + UndefinedFieldDefinition, +} from '@kbn/management-settings-types'; + +/** Simplifed type for a {@link FieldDefinition} */ +type Definition = Pick, 'type'>; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link ArrayFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isArrayFieldDefinition = (d: Definition): d is ArrayFieldDefinition => + d.type === 'array'; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link BooleanFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isBooleanFieldDefinition = (d: Definition): d is BooleanFieldDefinition => + d.type === 'boolean'; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link ColorFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isColorFieldDefinition = (d: Definition): d is ColorFieldDefinition => + d.type === 'color'; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link ImageFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isImageFieldDefinition = (d: Definition): d is ImageFieldDefinition => + d.type === 'image'; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link JsonFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isJsonFieldDefinition = (d: Definition): d is JsonFieldDefinition => d.type === 'json'; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link MarkdownFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isMarkdownFieldDefinition = (d: Definition): d is MarkdownFieldDefinition => + d.type === 'markdown'; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link NumberFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isNumberFieldDefinition = (d: Definition): d is NumberFieldDefinition => + d.type === 'number'; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link SelectFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isSelectFieldDefinition = (d: Definition): d is SelectFieldDefinition => + d.type === 'select'; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link StringFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isStringFieldDefinition = (d: Definition): d is StringFieldDefinition => + d.type === 'string'; + +/** + * Returns `true` if the given {@link FieldDefinition} is an {@link UndefinedFieldDefinition}, + * `false` otherwise. + * @param d The {@link FieldDefinition} to check. + */ +export const isUndefinedFieldDefinition = (d: Definition): d is UndefinedFieldDefinition => + d.type === 'undefined'; diff --git a/packages/kbn-management/settings/field_definition/is/index.ts b/packages/kbn-management/settings/field_definition/is/index.ts new file mode 100644 index 0000000000000..ad5eb46cd3f53 --- /dev/null +++ b/packages/kbn-management/settings/field_definition/is/index.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { + isArrayFieldUnsavedChange, + isBooleanFieldUnsavedChange, + isColorFieldUnsavedChange, + isImageFieldUnsavedChange, + isJsonFieldUnsavedChange, + isMarkdownFieldUnsavedChange, + isNumberFieldUnsavedChange, + isSelectFieldUnsavedChange, + isStringFieldUnsavedChange, + isUndefinedFieldUnsavedChange, +} from './unsaved_change'; + +export { + isArrayFieldDefinition, + isBooleanFieldDefinition, + isColorFieldDefinition, + isImageFieldDefinition, + isJsonFieldDefinition, + isMarkdownFieldDefinition, + isNumberFieldDefinition, + isSelectFieldDefinition, + isStringFieldDefinition, + isUndefinedFieldDefinition, +} from './field_definition'; diff --git a/packages/kbn-management/settings/field_definition/is/unsaved_change.ts b/packages/kbn-management/settings/field_definition/is/unsaved_change.ts new file mode 100644 index 0000000000000..6af63db17e36a --- /dev/null +++ b/packages/kbn-management/settings/field_definition/is/unsaved_change.ts @@ -0,0 +1,115 @@ +/* + * 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. + */ + +// This file is enormous and looks a bit excessive, but it's actually a collection +// of type guards. +// +// In the past, the UI would key off of the `type` property of a UISetting to do +// its work. This was not at all type-safe, and it was easy to make mistakes. +// +// These type guards narrow a given {@link UnsavedFieldChange} to its correct Typescript +// interface. What's interesting is that these guards compile to checking the `type` +// property of the object-- just as we did before-- but with the benefit of Typescript. + +import { + ArrayUnsavedFieldChange, + BooleanUnsavedFieldChange, + ColorUnsavedFieldChange, + ImageUnsavedFieldChange, + JsonUnsavedFieldChange, + MarkdownUnsavedFieldChange, + NumberUnsavedFieldChange, + SelectUnsavedFieldChange, + StringUnsavedFieldChange, + UndefinedUnsavedFieldChange, + SettingType, + UnsavedFieldChange, +} from '@kbn/management-settings-types'; + +/** Simplifed type for a {@link UnsavedFieldChange} */ +type Change = UnsavedFieldChange; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link ArrayUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isArrayFieldUnsavedChange = (c?: Change): c is ArrayUnsavedFieldChange => + !c || c.type === undefined || c.type === 'array'; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link BooleanUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isBooleanFieldUnsavedChange = (c?: Change): c is BooleanUnsavedFieldChange => + !c || c.type === undefined || c.type === 'boolean'; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link ColorUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isColorFieldUnsavedChange = (c?: Change): c is ColorUnsavedFieldChange => + !c || c.type === undefined || c.type === 'color'; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link ImageUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isImageFieldUnsavedChange = (c?: Change): c is ImageUnsavedFieldChange => + !c || c.type === undefined || c.type === 'image'; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link JsonUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isJsonFieldUnsavedChange = (c?: Change): c is JsonUnsavedFieldChange => + !c || c.type === undefined || c.type === 'json'; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link MarkdownUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isMarkdownFieldUnsavedChange = (c?: Change): c is MarkdownUnsavedFieldChange => + !c || c.type === undefined || c.type === 'markdown'; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link NumberUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isNumberFieldUnsavedChange = (c?: Change): c is NumberUnsavedFieldChange => + !c || c.type === undefined || c.type === 'number'; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link SelectUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isSelectFieldUnsavedChange = (c?: Change): c is SelectUnsavedFieldChange => + !c || c.type === undefined || c.type === 'select'; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link StringUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isStringFieldUnsavedChange = (c?: Change): c is StringUnsavedFieldChange => + !c || c.type === undefined || c.type === 'string'; + +/** + * Returns `true` if the given {@link FieldUnsavedChange} is an {@link UndefinedUnsavedFieldChange}, + * `false` otherwise. + * @param c The {@link FieldUnsavedChange} to check. + */ +export const isUndefinedFieldUnsavedChange = (c?: Change): c is UndefinedUnsavedFieldChange => + !c || c.type === undefined || c.type === 'undefined'; diff --git a/packages/kbn-management/settings/field_definition/kibana.jsonc b/packages/kbn-management/settings/field_definition/kibana.jsonc new file mode 100644 index 0000000000000..687f04662bbe4 --- /dev/null +++ b/packages/kbn-management/settings/field_definition/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/management-settings-field-definition", + "owner": "@elastic/platform-deployment-management @elastic/appex-sharedux" +} diff --git a/packages/kbn-management/settings/field_definition/package.json b/packages/kbn-management/settings/field_definition/package.json new file mode 100644 index 0000000000000..63a4f90a3ee16 --- /dev/null +++ b/packages/kbn-management/settings/field_definition/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/management-settings-field-definition", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/field_definition/storybook/field_definition.ts b/packages/kbn-management/settings/field_definition/storybook/field_definition.ts new file mode 100644 index 0000000000000..022b2e3e98050 --- /dev/null +++ b/packages/kbn-management/settings/field_definition/storybook/field_definition.ts @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { useState } from 'react'; +import isEqual from 'lodash/isEqual'; + +import { action } from '@storybook/addon-actions'; + +import type { + FieldDefinition, + KnownTypeToValue, + SettingType, + UnsavedFieldChange, +} from '@kbn/management-settings-types'; + +import { UiSettingMetadata } from '@kbn/management-settings-types/metadata'; +import { getFieldDefinition } from '../get_definition'; + +/** + * Expand a typed {@link UiSettingMetadata} object with common {@link UiSettingMetadata} properties. + */ +const expandSetting = ( + setting: UiSettingMetadata +): UiSettingMetadata => { + const { type } = setting; + return { + ...setting, + category: ['categoryOne', 'categoryTwo'], + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu odio velit. Integer et mauris quis ligula elementum commodo. Morbi eu ipsum diam. Nulla auctor orci eget egestas vehicula. Aliquam gravida, dolor eu posuere vulputate, neque enim viverra odio, id viverra ipsum quam et ipsum.', + name: `Some ${type} setting`, + requiresPageReload: false, + }; +}; + +interface OnChangeParams { + value?: KnownTypeToValue | null; + isInvalid?: boolean; + error?: string; +} + +type OnChangeFn = (params: OnChangeParams | null) => void; + +/** + * Hook to build and maintain a {@link FieldDefinition} for a given {@link UiSettingMetadata} object + * for use in Storybook. It provides the {@link FieldDefinition}, a stateful + * {@link UnsavedFieldChange} object, and an {@link OnChangeFn} to update the unsaved change based + * on the action taken within a {@link FieldInput} or {@link FieldRow}. + */ +export const useFieldDefinition = ( + baseSetting: UiSettingMetadata, + params: { isCustom?: boolean; isOverridden?: boolean; isDeprecated?: boolean } = {} +): [FieldDefinition, UnsavedFieldChange, OnChangeFn] => { + const setting = { + ...expandSetting(baseSetting), + deprecation: params.isDeprecated + ? { message: 'This setting is deprecated', docLinksKey: 'storybook' } + : undefined, + }; + + const field = getFieldDefinition({ + id: setting.name?.split(' ').join(':').toLowerCase() || setting.type, + setting, + params, + }); + + const { type, savedValue } = field; + + const [unsavedChange, setUnsavedChange] = useState>({ type }); + + const onChange: OnChangeFn = (change) => { + if (!change) { + return; + } + + const { value, error, isInvalid } = change; + + if (isEqual(value, savedValue)) { + setUnsavedChange({ type }); + } else { + setUnsavedChange({ type, unsavedValue: value, error, isInvalid }); + } + + const formattedSavedValue = type === 'image' ? String(savedValue).slice(0, 25) : savedValue; + const formattedUnsavedValue = type === 'image' ? String(value).slice(0, 25) : value; + + action('onChange')({ + type, + unsavedValue: formattedUnsavedValue, + savedValue: formattedSavedValue, + }); + }; + + return [field, unsavedChange, onChange]; +}; diff --git a/packages/kbn-management/settings/field_definition/storybook/index.ts b/packages/kbn-management/settings/field_definition/storybook/index.ts new file mode 100644 index 0000000000000..b372e1db1cf1b --- /dev/null +++ b/packages/kbn-management/settings/field_definition/storybook/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { getDefaultValue, getUserValue, IMAGE } from './values'; +export { useFieldDefinition } from './field_definition'; diff --git a/packages/kbn-management/settings/field_definition/storybook/values.ts b/packages/kbn-management/settings/field_definition/storybook/values.ts new file mode 100644 index 0000000000000..875f3eb11205a --- /dev/null +++ b/packages/kbn-management/settings/field_definition/storybook/values.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { SettingType } from '@kbn/management-settings-types'; + +const LOREM = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu odio velit. Integer et mauris quis ligula elementum commodo. Morbi eu ipsum diam. Nulla auctor orci eget egestas vehicula. Aliquam gravida, dolor eu posuere vulputate, neque enim viverra odio, id viverra ipsum quam et ipsum.'; + +const JSON_DEFAULT = `{ + "foo": "bar" +}`; + +const JSON_USER = `{ + "foo": "baz", + "bar": "qux" +}`; + +const MARKDOWN = `# Heading 1 + +${LOREM.split('. ') + .map((sentence) => `- ${sentence}.`) + .join('\n')} +`; + +/** + * A predefined Image as a Base64 string. + */ +export const IMAGE = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAADMElEQVR4nOzVwQnAIBQFQYXff81RUkQCOyDj1YOPnbXWPmeTRef+/3O/OyBjzh3CD95BfqICMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMK0CMO0TAAD//2Anhf4QtqobAAAAAElFTkSuQmCC +`; + +/** + * Given a {@link SettingType}, returns a compatible user-defined value. + */ +export const getUserValue = (type: SettingType) => { + switch (type) { + case 'array': + return ['foo', 'bar']; + case 'boolean': + return true; + case 'color': + return '#654321'; + case 'image': + return IMAGE; + case 'json': + return JSON_USER; + case 'markdown': + return MARKDOWN; + case 'number': + return 54321; + case 'select': + return 'option2'; + case 'string': + default: + return 'some user value'; + } +}; + +/** + * Given a {@link SettingType}, returns a compatible default value. + */ +export const getDefaultValue = (type: SettingType) => { + switch (type) { + case 'array': + return ['foo', 'bar', 'baz']; + case 'boolean': + return false; + case 'color': + return '#123456'; + case 'image': + return ''; + case 'json': + return JSON_DEFAULT; + case 'markdown': + return ''; + case 'number': + return 12345; + case 'select': + return 'option1'; + case 'string': + default: + return 'some default'; + } +}; diff --git a/packages/kbn-management/settings/field_definition/tsconfig.json b/packages/kbn-management/settings/field_definition/tsconfig.json new file mode 100644 index 0000000000000..4b85716365f5a --- /dev/null +++ b/packages/kbn-management/settings/field_definition/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/management-settings-types", + ] +} diff --git a/packages/kbn-management/settings/section_registry/jest.config.js b/packages/kbn-management/settings/jest.config.js similarity index 55% rename from packages/kbn-management/settings/section_registry/jest.config.js rename to packages/kbn-management/settings/jest.config.js index f183446f77bc6..f9df4c078fa83 100644 --- a/packages/kbn-management/settings/section_registry/jest.config.js +++ b/packages/kbn-management/settings/jest.config.js @@ -8,12 +8,10 @@ module.exports = { preset: '@kbn/test', - rootDir: '../../../..', - roots: ['/packages/kbn-management/settings/section_registry'], - coverageDirectory: - '/target/kibana-coverage/jest/packages/kbn-management/settings/section_registry', + rootDir: '../../..', + roots: ['/packages/kbn-management/settings'], + coverageDirectory: '/target/kibana-coverage/jest/packages/kbn-management/settings', coverageReporters: ['text', 'html'], - collectCoverageFrom: [ - '/packages/kbn-management/settings/section_registry/**/*.{ts,tsx}', - ], + collectCoverageFrom: ['/packages/kbn-management/settings/**/*.{ts,tsx}'], + coveragePathIgnorePatterns: ['__stories__', '.stories.tsx', 'storybook', 'mocks'], }; diff --git a/packages/kbn-management/settings/setting_ids/README.mdx b/packages/kbn-management/settings/setting_ids/README.mdx new file mode 100644 index 0000000000000..e3109e2bcf1b5 --- /dev/null +++ b/packages/kbn-management/settings/setting_ids/README.mdx @@ -0,0 +1,39 @@ +--- +id: kbn-management/settings/ids +slug: /kbn-management/settings/setting_ids/ +title: Setting ID's +description: ID's of all advanced settings. +tags: ['management', 'settings'] +date: 2023-09-04 +--- + +This package contains the id's of all advanced settings. + +When registering an advanced setting, add its id to this package and import it for use in the setting definition: + +**packages/kbn-management/settings/setting_ids/index.ts** + +```ts +export const MY_SETTING_ID = 'mySetting'; +``` + +**src/plugins/my_plugin/server/plugin.ts** + +```ts +import { MY_SETTING_ID } from '@kbn/management-settings-ids'; + +export class MyPlugin implements Plugin { + public setup(core: CoreSetup, dependencies: SetupDependencies) { + core.uiSettings.register({ + [MY_SETTING_ID]: { + name: 'My setting', + value: 10, + schema: schema.number(), + }, + ... + }); + + return {}; + } +} +``` diff --git a/packages/kbn-management/settings/setting_ids/index.ts b/packages/kbn-management/settings/setting_ids/index.ts new file mode 100644 index 0000000000000..1069050ccd304 --- /dev/null +++ b/packages/kbn-management/settings/setting_ids/index.ts @@ -0,0 +1,178 @@ +/* + * 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. + */ + +// General settings +export const DISABLE_REQUEST_BATCHING_ID = 'bfetch:disable'; +export const DISABLE_BATCH_COMPRESSION_ID = 'bfetch:disableCompression'; +export const CSV_QUOTE_VALUES_ID = 'csv:quoteValues'; +export const CSV_SEPARATOR_ID = 'csv:separator'; +export const DATE_FORMAT_ID = 'dateFormat'; +export const DATE_FORMAT_DOW_ID = 'dateFormat:dow'; +export const DATE_FORMAT_SCALED_ID = 'dateFormat:scaled'; +export const DATE_FORMAT_TZ_ID = 'dateFormat:tz'; +export const DATE_FORMAT_NANOS_ID = 'dateNanosFormat'; +export const DEFAULT_INDEX_ID = 'defaultIndex'; +export const DEFAULT_ROUTE_ID = 'defaultRoute'; +export const FIELDS_POPULAR_LIMIT_ID = 'fields:popularLimit'; +export const FILE_UPLOAD_MAX_SIZE_ID = 'fileUpload:maxFileSize'; +export const FILTER_EDITOR_SUGGEST_VALUES_ID = 'filterEditor:suggestValues'; +export const FILTERS_PINNED_BY_DEFAULT_ID = 'filters:pinnedByDefault'; +export const FORMAT_BYTES_DEFAULT_PATTERN_ID = 'format:bytes:defaultPattern'; +export const FORMAT_CURRENCY_DEFAULT_PATTERN_ID = 'format:currency:defaultPattern'; +export const FORMAT_DEFAULT_TYPE_MAP_ID = 'format:defaultTypeMap'; +export const FORMAT_NUMBER_DEFAULT_LOCALE_ID = 'format:number:defaultLocale'; +export const FORMAT_NUMBER_DEFAULT_PATTERN_ID = 'format:number:defaultPattern'; +export const FORMAT_PERCENT_DEFAULT_PATTERN_ID = 'format:percent:defaultPattern'; +export const HIDE_ANNOUNCEMENTS_ID = 'hideAnnouncements'; +export const HISTOGRAM_BAR_TARGET_ID = 'histogram:barTarget'; +export const HISTOGRAM_MAX_BARS_ID = 'histogram:maxBars'; +export const HISTORY_LIMIT_ID = 'history:limit'; +export const META_FIELDS_ID = 'metaFields'; +export const METRICS_ALLOW_CHECKING_FOR_FAILED_SHARDS_ID = 'metrics:allowCheckingForFailedShards'; +export const METRICS_ALLOW_STRING_INDICES_ID = 'metrics:allowStringIndices'; +export const METRICS_MAX_BUCKETS_ID = 'metrics:max_buckets'; +export const QUERY_ALLOW_LEADING_WILDCARDS_ID = 'query:allowLeadingWildcards'; +export const QUERY_STRING_OPTIONS_ID = 'query:queryString:options'; +export const SAVED_OBJECTS_LISTING_LIMIT_ID = 'savedObjects:listingLimit'; +export const SAVED_OBJECTS_PER_PAGE_ID = 'savedObjects:perPage'; +export const SEARCH_QUERY_LANGUAGE_ID = 'search:queryLanguage'; +export const SHORT_DOTS_ENABLE_ID = 'shortDots:enable'; +export const SORT_OPTIONS_ID = 'sort:options'; +export const STATE_STORE_IN_SESSION_STORAGE_ID = 'state:storeInSessionStorage'; +export const THEME_DARK_MODE_ID = 'theme:darkMode'; +export const TIMEPICKER_QUICK_RANGES_ID = 'timepicker:quickRanges'; +export const TIMEPICKER_REFRESH_INTERVAL_DEFAULTS_ID = 'timepicker:refreshIntervalDefaults'; +export const TIMEPICKER_TIME_DEFAULTS_ID = 'timepicker:timeDefaults'; + +// Presentation labs settings +export const LABS_CANVAS_BY_VALUE_EMBEDDABLE_ID = 'labs:canvas:byValueEmbeddable'; +export const LABS_CANVAS_ENABLE_UI_ID = 'labs:canvas:enable_ui'; +export const LABS_DASHBOARD_CONTROLS_ID = 'labs:dashboard:dashboardControls'; +export const LABS_DASHBOARD_DEFER_BELOW_FOLD_ID = 'labs:dashboard:deferBelowFold'; +export const LABS_DASHBOARDS_ENABLE_UI_ID = 'labs:dashboard:enable_ui'; + +// Accessibility settings +export const ACCESSIBILITY_DISABLE_ANIMATIONS_ID = 'accessibility:disableAnimations'; + +// Autocomplete settings +export const AUTOCOMPLETE_USE_TIME_RANGE_ID = 'autocomplete:useTimeRange'; +export const AUTOCOMPLETE_VALUE_SUGGESTION_METHOD_ID = 'autocomplete:valueSuggestionMethod'; + +// Banner settings +export const BANNERS_PLACEMENT_ID = 'banners:placement'; +export const BANNERS_TEXT_CONTENT_ID = 'banners:textContent'; +export const BANNERS_TEXT_COLOR_ID = 'banners:textColor'; +export const BANNERS_BACKGROUND_COLOR_ID = 'banners:backgroundColor'; + +// Discover settings +export const CONTEXT_DEFAULT_SIZE_ID = 'context:defaultSize'; +export const CONTEXT_STEP_ID = 'context:step'; +export const CONTEXT_TIE_BREAKER_FIELDS_ID = 'context:tieBreakerFields'; +export const DEFAULT_COLUMNS_ID = 'defaultColumns'; +export const DISCOVER_ENABLE_SQL_ID = 'discover:enableSql'; +export const DISCOVER_MAX_DOC_FIELDS_DISPLAYED_ID = 'discover:maxDocFieldsDisplayed'; +export const DISCOVER_MODIFY_COLUMNS_ON_SWITCH_ID = 'discover:modifyColumnsOnSwitch'; +export const DISCOVER_ROW_HEIGHT_OPTION_ID = 'discover:rowHeightOption'; +export const DISCOVER_SAMPLE_ROWS_PER_PAGE_ID = 'discover:sampleRowsPerPage'; +export const DISCOVER_SAMPLE_SIZE_ID = 'discover:sampleSize'; +export const DISCOVER_SEARCH_FIELDS_FROM_SOURCE_ID = 'discover:searchFieldsFromSource'; +export const DISCOVER_SEARCH_ON_PAGE_LOAD_ID = 'discover:searchOnPageLoad'; +export const DISCOVER_SHOW_FIELD_STATISTICS_ID = 'discover:showFieldStatistics'; +export const DISCOVER_SHOW_LEGACY_FIELD_TOP_VALUES_ID = 'discover:showLegacyFieldTopValues'; +export const DISCOVER_SHOW_MULTI_FIELDS_ID = 'discover:showMultiFields'; +export const DISCOVER_SORT_DEFAULT_ORDER_ID = 'discover:sort:defaultOrder'; +export const DOC_TABLE_HIDE_TIME_COLUMNS_ID = 'doc_table:hideTimeColumn'; +export const DOC_TABLE_HIGHLIGHT_ID = 'doc_table:highlight'; +export const DOC_TABLE_LEGACY_ID = 'doc_table:legacy'; +export const TRUNCATE_MAX_HEIGHT_ID = 'truncate:maxHeight'; + +// Machine learning settings +export const ML_ANOMALY_DETECTION_RESULTS_ENABLE_TIME_DEFAULTS_ID = + 'ml:anomalyDetection:results:enableTimeDefaults'; +export const ML_ANOMALY_DETECTION_RESULTS_TIME_DEFAULTS_ID = + 'ml:anomalyDetection:results:timeDefaults'; + +// Notifications settings +export const NOTIFICATIONS_BANNER_ID = 'notifications:banner'; +export const NOTIFICATIONS_LIFETIME_BANNER_ID = 'notifications:lifetime:banner'; +export const NOTIFICATIONS_LIFETIME_ERROR_ID = 'notifications:lifetime:error'; +export const NOTIFICATIONS_LIFETIME_INFO_ID = 'notifications:lifetime:info'; +export const NOTIFICATIONS_LIFETIME_WARNING_ID = 'notifications:lifetime:warning'; + +// Observability settings +export const OBSERVABILITY_APM_AWS_LAMBDA_PRICE_FACTOR_ID = 'observability:apmAWSLambdaPriceFactor'; +export const OBSERVABILITY_APM_AWS_LAMBDA_REQUEST_COST_PER_MILLION_ID = + 'observability:apmAWSLambdaRequestCostPerMillion'; +export const OBSERVABILITY_APM_AGENT_EXPLORER_VIEW_ID = 'observability:apmAgentExplorerView'; +export const OBSERVABILITY_APM_DEFAULT_SERVICE_ENVIRONMENT_ID = + 'observability:apmDefaultServiceEnvironment'; +export const OBSERVABILITY_APM_ENABLE_CRITICAL_PATH_ID = 'observability:apmEnableCriticalPath'; +export const OBSERVABILITY_APM_LABS_BUTTON_ID = 'observability:apmLabsButton'; +export const OBSERVABILITY_APM_PROGRESSIVE_LOADING_ID = 'observability:apmProgressiveLoading'; +export const OBSERVABILITY_APM_SERVICE_GROUP_MAX_NUMBER_OF_SERVCIE_ID = + 'observability:apmServiceGroupMaxNumberOfServices'; +export const OBSERVABILITY_APM_SERVICE_INVENTORY_OPTIMIZED_SORTING_ID = + 'observability:apmServiceInventoryOptimizedSorting'; +export const OBSERVABILITY_APM_TRACE_EXPLORER_TAB_ID = 'observability:apmTraceExplorerTab'; +export const OBSERVABILITY_ENABLE_AWS_LAMBDA_METRICS_ID = 'observability:enableAwsLambdaMetrics'; +export const OBSERVABILITY_ENABLE_COMPARISON_BY_DEFAULT_ID = + 'observability:enableComparisonByDefault'; +export const OBSERVABILITY_ENABLE_INFRASTRUCTURE_HOSTS_VIEW_ID = + 'observability:enableInfrastructureHostsView'; +export const OBSERVABILITY_ENABLE_INSPECT_ES_QUERIES_ID = 'observability:enableInspectEsQueries'; +export const OBSERVABILITY_MAX_SUGGESTIONS_ID = 'observability:maxSuggestions'; +export const OBSERVABILITY_PROFILING_ELASTICSEARCH_PLUGIN_ID = + 'observability:profilingElasticsearchPlugin'; + +// Reporting settings +export const XPACK_REPORTING_CUSTOM_PDF_LOGO_ID = 'xpackReporting:customPdfLogo'; + +// Rollups settings +export const ROLLUPS_ENABLE_INDEX_PATTERNS_ID = 'rollups.enableIndexPatterns'; + +// Search settings +export const COURIER_CUSTOM_REQUEST_PREFERENCE_ID = 'courier:customRequestPreference'; +export const COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX_ID = + 'courier:ignoreFilterIfFieldNotInIndex'; +export const COURIER_MAX_CONCURRENT_SHARD_REQUEST_ID = 'courier:maxConcurrentShardRequests'; +export const COURIER_SET_REQUEST_PREFERENCE_ID = 'courier:setRequestPreference'; +export const SEARCH_INCLUDE_FROZEN_ID = 'search:includeFrozen'; +export const SEARCH_TIMEOUT_ID = 'search:timeout'; + +// Security solution settings +export const SECURITY_SOLUTION_REFRESH_INTERVAL_DEFAULTS_ID = + 'securitySolution:refreshIntervalDefaults'; +export const SECURITY_SOLUTION_TIME_DEFAULTS_ID = 'securitySolution:timeDefaults'; +export const SECURITY_SOLUTION_DEFAULT_INDEX_ID = 'securitySolution:defaultIndex'; +export const SECURITY_SOLUTION_DEFAULT_THREAT_INDEX_ID = 'securitySolution:defaultThreatIndex'; +export const SECURITY_SOLUTION_DEFAULT_ANOMALY_SCORE_ID = 'securitySolution:defaultAnomalyScore'; +export const SECURITY_SOLUTION_ENABLE_GROUPED_NAV_ID = 'securitySolution:enableGroupedNav'; +export const SECURITY_SOLUTION_ENABLE_NEWS_FEED_ID = 'securitySolution:enableNewsFeed'; +export const SECURITY_SOLUTION_RULES_TABLE_REFRESH_ID = 'securitySolution:rulesTableRefresh'; +export const SECURITY_SOLUTION_NEWS_FEED_URL_ID = 'securitySolution:newsFeedUrl'; +export const SECURITY_SOLUTION_IP_REPUTATION_LINKS_ID = 'securitySolution:ipReputationLinks'; +export const SECURITY_SOLUTION_ENABLE_CCS_WARNING_ID = 'securitySolution:enableCcsWarning'; +export const SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID = + 'securitySolution:showRelatedIntegrations'; + +// Timelion settings +export const TIMELION_ES_DEFAULT_INDEX_ID = 'timelion:es.default_index'; +export const TIMELION_ES_TIME_FIELD_ID = 'timelion:es.timefield'; +export const TIMELION_MAX_BUCKETS_ID = 'timelion:max_buckets'; +export const TIMELION_MIN_INTERVAL_ID = 'timelion:min_interval'; +export const TIMELION_TARGET_BUCKETS_ID = 'timelion:target_buckets'; + +// Visualization settings +export const VISUALIZATION_COLOR_MAPPING_ID = 'visualization:colorMapping'; +export const VISUALIZATION_HEATMAP_MAX_BUCKETS_ID = 'visualization:heatmap:maxBuckets'; +export const VISUALIZATION_USE_LEGACY_TIME_AXIS_ID = 'visualization:useLegacyTimeAxis'; +export const VISUALIZATION_LEGACY_GAUGE_CHARTS_LIBRARY_ID = + 'visualization:visualize:legacyGaugeChartsLibrary'; +export const VISUALIZATION_LEGACY_HEATMAP_CHARTS_LIBRARY_ID = + 'visualization:visualize:legacyHeatmapChartsLibrary'; +export const VISUALIZATION_ENABLE_LABS_ID = 'visualize:enableLabs'; diff --git a/packages/kbn-management/settings/setting_ids/kibana.jsonc b/packages/kbn-management/settings/setting_ids/kibana.jsonc new file mode 100644 index 0000000000000..934b0dd5baaac --- /dev/null +++ b/packages/kbn-management/settings/setting_ids/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/management-settings-ids", + "owner": "@elastic/appex-sharedux @elastic/platform-deployment-management" +} diff --git a/packages/kbn-management/settings/setting_ids/package.json b/packages/kbn-management/settings/setting_ids/package.json new file mode 100644 index 0000000000000..59c9769cd1bf7 --- /dev/null +++ b/packages/kbn-management/settings/setting_ids/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/management-settings-ids", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/setting_ids/tsconfig.json b/packages/kbn-management/settings/setting_ids/tsconfig.json new file mode 100644 index 0000000000000..53e5c76cbab87 --- /dev/null +++ b/packages/kbn-management/settings/setting_ids/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], +} diff --git a/packages/kbn-management/settings/types/README.mdx b/packages/kbn-management/settings/types/README.mdx new file mode 100644 index 0000000000000..be258389beefe --- /dev/null +++ b/packages/kbn-management/settings/types/README.mdx @@ -0,0 +1,12 @@ +--- +id: management/settings/types +slug: /management/settings/types +title: Management Settings Typescript Types +description: Common types for objects and functions for Advanced Settings in Stack Management. +tags: ['management', 'settings'] +date: 2023-08-31 +--- + +## Description + +This package contains common types used throughout the `@kbn/management-settings-*` packages. diff --git a/packages/kbn-management/settings/types/field_definition.ts b/packages/kbn-management/settings/types/field_definition.ts new file mode 100644 index 0000000000000..eb34df3b67868 --- /dev/null +++ b/packages/kbn-management/settings/types/field_definition.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 { ReactElement } from 'react'; + +import { UiCounterMetricType } from '@kbn/analytics'; +import { DeprecationSettings } from '@kbn/core-ui-settings-common'; + +import { KnownTypeToValue, SettingType } from './setting_type'; + +/** + * A {@link FieldDefinition} adapts a {@link UiSettingMetadata} object to be more + * easily consumed by the UI. It contains additional information about the field + * that is determined from a given UiSettingMetadata object, (which is a type + * representing a UiSetting). + * @public + */ +export interface FieldDefinition | null> { + /** UX ARIA attributes derived from the setting. */ + ariaAttributes: { + /** The `aria-label` attribute for the field input. */ + ariaLabel: string; + /** The `aria-describedby` attribute for the field input. */ + ariaDescribedBy?: string; + }; + /** A list of categories related to the field. */ + categories: string[]; + /** The default value of the field from Kibana. */ + defaultValue?: V; + /** The text-based display of the default value, for use in the UI. */ + defaultValueDisplay: string; + /** + * Deprecation information for the field + * @see {@link DeprecationSettings} + */ + deprecation?: DeprecationSettings; + /** A description of the field. */ + description?: string | ReactElement; + /** The name of the field suitable for display in the UX. */ + displayName: string; + /** The grouping identifier for the field. */ + groupId: string; + /** The unique identifier of the field, typically separated by `:` */ + id: string; + /** True if the field is a custom setting, false otherwise. */ + isCustom: boolean; + /** True if the current saved setting matches the default setting. */ + isDefaultValue: boolean; + /** True if the setting is overridden in Kibana, false otherwise. */ + isOverridden: boolean; + /** True if the setting is read-only, false otherwise. */ + isReadOnly: boolean; + /** Metric information when one interacts with the field. */ + metric?: { + /** The metric name. */ + name?: string; + /** The metric type. */ + type?: UiCounterMetricType; + }; + /** The name of the field suitable for use in the UX. */ + name: string; + /** Option information if the field represents a `select` setting. */ + options?: { + /** Option values for the field. */ + values: string[] | number[]; + /** Option labels organized by value. */ + labels: Record; + }; + /** A rank order for the field relative to other fields. */ + order: number | undefined; + /** True if the browser must be reloaded for the setting to take effect, false otherwise. */ + requiresPageReload: boolean; + /** The current saved value of the setting. */ + savedValue?: V; + /** + * The type of setting the field represents. + * @see {@link SettingType} + */ + type: T; + /** An identifier of the field when it has an unsaved change. */ + unsavedFieldId: string; +} + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `array` type + * for use in the UI. + */ +export type ArrayFieldDefinition = FieldDefinition<'array'>; + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `boolean` type + * for use in the UI. + */ +export type BooleanFieldDefinition = FieldDefinition<'boolean'>; + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `color` type + * for use in the UI. + */ +export type ColorFieldDefinition = FieldDefinition<'color'>; + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `image` type + * for use in the UI. + */ +export type ImageFieldDefinition = FieldDefinition<'image'>; + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `json` type + * for use in the UI. + */ +export type JsonFieldDefinition = FieldDefinition<'json'>; + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `markdown` type + * for use in the UI. + */ +export type MarkdownFieldDefinition = FieldDefinition<'markdown'>; + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `number` type + * for use in the UI. + */ +export type NumberFieldDefinition = FieldDefinition<'number'>; + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `select` type + * for use in the UI. + */ +export interface SelectFieldDefinition extends FieldDefinition<'select'> { + /** Options are required when this definition is used. */ + options: { + /** Option values for the field. */ + values: string[] | number[]; + /** Option labels organized by value. */ + labels: Record; + }; +} + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `string` type + * for use in the UI. + */ +export type StringFieldDefinition = FieldDefinition<'string'>; + +/** + * This is a {@link FieldDefinition} representing {@link UiSetting} `undefined` type + * for use in the UI. + */ +export type UndefinedFieldDefinition = FieldDefinition<'undefined'>; diff --git a/packages/kbn-management/settings/types/index.ts b/packages/kbn-management/settings/types/index.ts new file mode 100644 index 0000000000000..cc4d1738997a6 --- /dev/null +++ b/packages/kbn-management/settings/types/index.ts @@ -0,0 +1,61 @@ +/* + * 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. + */ + +export type { + ArrayFieldDefinition, + BooleanFieldDefinition, + ColorFieldDefinition, + ImageFieldDefinition, + JsonFieldDefinition, + FieldDefinition, + MarkdownFieldDefinition, + NumberFieldDefinition, + SelectFieldDefinition, + StringFieldDefinition, + UndefinedFieldDefinition, +} from './field_definition'; + +export type { + ArrayUiSettingMetadata, + BooleanUiSettingMetadata, + ColorUiSettingMetadata, + ImageUiSettingMetadata, + JsonUiSettingMetadata, + MarkdownUiSettingMetadata, + NumberUiSettingMetadata, + SelectUiSettingMetadata, + StringUiSettingMetadata, + UndefinedUiSettingMetadata, + UiSettingMetadata, + KnownTypeToMetadata, +} from './metadata'; + +export type { + ArrayUnsavedFieldChange, + BooleanUnsavedFieldChange, + ColorUnsavedFieldChange, + ImageUnsavedFieldChange, + JsonUnsavedFieldChange, + MarkdownUnsavedFieldChange, + NumberUnsavedFieldChange, + SelectUnsavedFieldChange, + StringUnsavedFieldChange, + UndefinedUnsavedFieldChange, + UnsavedFieldChange, +} from './unsaved_change'; + +export type { + ArraySettingType, + BooleanSettingType, + KnownTypeToValue, + NumberSettingType, + SettingType, + StringSettingType, + UndefinedSettingType, + Value, +} from './setting_type'; diff --git a/packages/kbn-management/settings/types/kibana.jsonc b/packages/kbn-management/settings/types/kibana.jsonc new file mode 100644 index 0000000000000..9482b2bb0f15f --- /dev/null +++ b/packages/kbn-management/settings/types/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/management-settings-types", + "owner": "@elastic/platform-deployment-management @elastic/appex-sharedux" +} diff --git a/packages/kbn-management/settings/types/metadata.ts b/packages/kbn-management/settings/types/metadata.ts new file mode 100644 index 0000000000000..8e191310b943d --- /dev/null +++ b/packages/kbn-management/settings/types/metadata.ts @@ -0,0 +1,114 @@ +/* + * 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 { PublicUiSettingsParams, UserProvidedValues } from '@kbn/core/public'; +import { KnownTypeToValue, SettingType } from './setting_type'; + +/** + * Creating this type based on {@link UiSettingsClientCommon} and exporting for ease. + */ +type UiSetting = PublicUiSettingsParams & UserProvidedValues; + +/** + * This is an type-safe abstraction over the {@link UiSetting} type, whose fields + * are not only optional, but also not strongly typed to + * {@link @kbn/core-ui-settings-common#UiSettingsType}. + * + * @public + */ +export interface UiSettingMetadata | null> + extends UiSetting { + /** + * The type of setting being represented. + * @see{@link SettingType} + */ + type: T; + /** The default value in Kibana for the setting. */ + value?: V; + /** The value saved by the user. */ + userValue?: V; +} + +/** + * This is an type-safe abstraction over the {@link UiSetting} `array` type. + * @public + */ +export type ArrayUiSettingMetadata = UiSettingMetadata<'array'>; + +/** + * This is an type-safe abstraction over the {@link UiSetting} `boolean` type. + * @public + */ +export type BooleanUiSettingMetadata = UiSettingMetadata<'boolean'>; + +/** + * This is an type-safe abstraction over the {@link UiSetting} `color` type. + * @public + */ +export type ColorUiSettingMetadata = UiSettingMetadata<'color'>; + +/** + * This is an type-safe abstraction over the {@link UiSetting} `image` type. + * @public + */ +export type ImageUiSettingMetadata = UiSettingMetadata<'image'>; + +/** + * This is an type-safe abstraction over the {@link UiSetting} `json` type. + * @public + */ +export type JsonUiSettingMetadata = UiSettingMetadata<'json'>; + +/** + * This is an type-safe abstraction over the {@link UiSetting} `markdown` type. + * @public + */ +export type MarkdownUiSettingMetadata = UiSettingMetadata<'markdown'>; + +/** + * This is an type-safe abstraction over the {@link UiSetting} `number` type. + * @public + */ +export type NumberUiSettingMetadata = UiSettingMetadata<'number'>; + +/** + * This is an type-safe abstraction over the {@link UiSetting} `select` type. + * @public + */ +export type SelectUiSettingMetadata = UiSettingMetadata<'select'>; + +/** + * This is an type-safe abstraction over the {@link UiSetting} `string` type. + * @public + */ +export type StringUiSettingMetadata = UiSettingMetadata<'string'>; + +/** + * This is an type-safe abstraction over the {@link UiSetting} `undefined` type. + * @public + */ +export type UndefinedUiSettingMetadata = UiSettingMetadata<'undefined'>; + +// prettier-ignore +/** + * This is a narrowing type, which finds the correct {@link UiSettingMetadata} + * type based on a given {@link SettingType}. + * @public + */ +export type KnownTypeToMetadata = + T extends 'array' ? ArrayUiSettingMetadata + : T extends 'boolean' ? BooleanUiSettingMetadata + : T extends 'color' ? ColorUiSettingMetadata + : T extends 'image' ? ImageUiSettingMetadata + : T extends 'json' ? JsonUiSettingMetadata + : T extends 'markdown' ? MarkdownUiSettingMetadata + : T extends 'number' ? NumberUiSettingMetadata + : T extends 'select' ? SelectUiSettingMetadata + : T extends 'string' ? StringUiSettingMetadata + : T extends 'undefined' ? UndefinedUiSettingMetadata + : never; diff --git a/packages/kbn-management/settings/types/package.json b/packages/kbn-management/settings/types/package.json new file mode 100644 index 0000000000000..43ed71ecaca83 --- /dev/null +++ b/packages/kbn-management/settings/types/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/management-settings-types", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/types/setting_type.ts b/packages/kbn-management/settings/types/setting_type.ts new file mode 100644 index 0000000000000..da297c6d94171 --- /dev/null +++ b/packages/kbn-management/settings/types/setting_type.ts @@ -0,0 +1,72 @@ +/* + * 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 { UiSettingsType } from '@kbn/core-ui-settings-common'; + +/** + * This is a local type equivalent to {@link UiSettingsType} for flexibility. + * @public + */ +export type SettingType = UiSettingsType; + +/** + * A narrowing type representing all {@link SettingType} values that correspond + * to an `array` primitive type value. + * @public + */ +export type ArraySettingType = Extract; + +/** + * A narrowing type representing all {@link SettingType} values that correspond + * to an `boolean` primitive type value. + * @public + */ +export type BooleanSettingType = Extract; + +/** + * A narrowing type representing all {@link SettingType} values that correspond + * to an `number` primitive type value. + * @public + */ +export type NumberSettingType = Extract; + +/** + * A narrowing type representing all {@link SettingType} values that correspond + * to an `string` primitive type value. + * @public + */ +export type StringSettingType = Extract< + SettingType, + 'color' | 'image' | 'json' | 'markdown' | 'select' | 'string' +>; + +/** + * A narrowing type representing all {@link SettingType} values that correspond + * to an `undefined` type value. + * @public + */ +export type UndefinedSettingType = Extract; + +/** + * A type representing all possible values corresponding to a given {@link SettingType}. + */ +export type Value = string | boolean | number | Array | undefined | null; + +// prettier-ignore +/** + * This is a narrowing type, which finds the correct primitive type based on a + * given {@link SettingType}. + * @public + */ +export type KnownTypeToValue = + T extends 'color' | 'image' | 'json' | 'markdown' | 'select' | 'string' ? string : + T extends 'boolean' ? boolean : + T extends 'number' | 'bigint' ? number : + T extends 'array' ? Array : + T extends 'undefined' ? undefined: + never; diff --git a/packages/kbn-management/settings/types/tsconfig.json b/packages/kbn-management/settings/types/tsconfig.json new file mode 100644 index 0000000000000..345fbe3125a79 --- /dev/null +++ b/packages/kbn-management/settings/types/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/analytics", + "@kbn/core", + "@kbn/core-ui-settings-common", + ] +} diff --git a/packages/kbn-management/settings/types/unsaved_change.ts b/packages/kbn-management/settings/types/unsaved_change.ts new file mode 100644 index 0000000000000..3bd815187f70a --- /dev/null +++ b/packages/kbn-management/settings/types/unsaved_change.ts @@ -0,0 +1,127 @@ +/* + * 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 { KnownTypeToValue, SettingType } from './setting_type'; + +/** + * A {@link UnsavedFieldChange} represents local changes to a field that have not + * yet been saved. + * @public + */ +export interface UnsavedFieldChange { + /** + * The type of setting. + * @see {@link SettingType} + */ + type: T; + /** An error message, if any, from the change. */ + error?: string | null; + /** True if the change is invalid for the field, false otherwise. */ + isInvalid?: boolean; + /** The current unsaved value stored in the field. */ + unsavedValue?: KnownTypeToValue | null; +} + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `number` value + * for use in the UI. + * @public + */ +export type ArrayUnsavedFieldChange = UnsavedFieldChange<'array'>; + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `boolean` value + * for use in the UI. + * @public + */ +export type BooleanUnsavedFieldChange = UnsavedFieldChange<'boolean'>; + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `color` value + * for use in the UI. + * @public + */ +export type ColorUnsavedFieldChange = UnsavedFieldChange<'color'>; + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `image` value + * for use in the UI. + * @public + */ +export type ImageUnsavedFieldChange = UnsavedFieldChange<'image'>; + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `json` value + * for use in the UI. + * @public + */ +export type JsonUnsavedFieldChange = UnsavedFieldChange<'json'>; + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `markdown` value + * for use in the UI. + * @public + */ +export type MarkdownUnsavedFieldChange = UnsavedFieldChange<'markdown'>; + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `number` value + * for use in the UI. + * @public + */ +export type NumberUnsavedFieldChange = UnsavedFieldChange<'number'>; + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `select` value + * for use in the UI. + * @public + */ +export type SelectUnsavedFieldChange = UnsavedFieldChange<'select'>; + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `string` value + * for use in the UI. + * @public + */ +export type StringUnsavedFieldChange = UnsavedFieldChange<'string'>; + +/** + * This is a {@link UnsavedFieldChange} representing an unsaved change to a + * {@link FieldDefinition} which has a {@link UiSetting} `undefined` value + * for use in the UI. + * @public + */ +export type UndefinedUnsavedFieldChange = UnsavedFieldChange<'undefined'>; + +// prettier-ignore +/** + * This is a narrowing type, which finds the correct primitive type based on a + * given {@link SettingType}. + * @public + */ +export type KnownTypeToUnsavedChange = + T extends 'array' ? ArrayUnsavedFieldChange : + T extends 'boolean' ? BooleanUnsavedFieldChange : + T extends 'color' ? ColorUnsavedFieldChange : + T extends 'image' ? ImageUnsavedFieldChange : + T extends 'json' ? JsonUnsavedFieldChange : + T extends 'markdown' ? MarkdownUnsavedFieldChange : + T extends 'number' | 'bigint' ? NumberUnsavedFieldChange : + T extends 'select' ? SelectUnsavedFieldChange : + T extends 'string' ? StringUnsavedFieldChange: + T extends 'undefined' ? UndefinedUnsavedFieldChange : + never; diff --git a/packages/kbn-management/settings/utilities/README.mdx b/packages/kbn-management/settings/utilities/README.mdx new file mode 100644 index 0000000000000..ef147d2fac252 --- /dev/null +++ b/packages/kbn-management/settings/utilities/README.mdx @@ -0,0 +1,12 @@ +--- +id: management/settings/utilities +slug: /management/settings/utilities +title: Management Settings Utilities +description: Utilities for working with Advanced Settings in Stack Management. +tags: ['management', 'settings'] +date: 2023-08-31 +--- + +## Description + +This package contains common utility functions for working with Advanced Settings in Stack Management. diff --git a/packages/kbn-management/settings/utilities/get_input_value.ts b/packages/kbn-management/settings/utilities/get_input_value.ts new file mode 100644 index 0000000000000..17ae6833fdb81 --- /dev/null +++ b/packages/kbn-management/settings/utilities/get_input_value.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { SettingType, UnsavedFieldChange, FieldDefinition } from '@kbn/management-settings-types'; +import { hasUnsavedChange } from './has_unsaved_change'; + +type F = Pick, 'savedValue' | 'defaultValue'>; +type C = UnsavedFieldChange; + +/** + * Convenience function that, given a {@link FieldDefinition} and an {@link UnsavedFieldChange}, + * returns the value to be displayed in the input field, and a boolean indicating whether the + * value is an unsaved value. + * + * @param field The field to compare. + * @param change The unsaved change to compare. + */ +export function getInputValue(field: F<'array'>, change: C<'array'>): [string[], boolean]; +export function getInputValue(field: F<'color'>, change: C<'color'>): [string, boolean]; +export function getInputValue(field: F<'boolean'>, change: C<'boolean'>): [boolean, boolean]; +export function getInputValue(field: F<'image'>, change: C<'image'>): [string, boolean]; +export function getInputValue(field: F<'json'>, change: C<'json'>): [string, boolean]; +export function getInputValue(field: F<'markdown'>, change: C<'markdown'>): [string, boolean]; +export function getInputValue(field: F<'number'>, change: C<'number'>): [number, boolean]; +export function getInputValue(field: F<'select'>, change: C<'select'>): [string, boolean]; +export function getInputValue(field: F<'string'>, change: C<'string'>): [string, boolean]; +export function getInputValue( + field: F<'undefined'>, + change: C<'undefined'> +): [string | null | undefined, boolean]; +export function getInputValue(field: F, change: C) { + const isUnsavedValue = hasUnsavedChange(field, change); + + const value = isUnsavedValue + ? change.unsavedValue + : field.savedValue !== undefined && field.savedValue !== null + ? field.savedValue + : field.defaultValue; + + return [value, isUnsavedValue]; +} diff --git a/packages/kbn-management/settings/utilities/has_unsaved_change.ts b/packages/kbn-management/settings/utilities/has_unsaved_change.ts new file mode 100644 index 0000000000000..0ac783b439e4a --- /dev/null +++ b/packages/kbn-management/settings/utilities/has_unsaved_change.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 isEqual from 'lodash/isEqual'; + +import type { + FieldDefinition, + SettingType, + UnsavedFieldChange, +} from '@kbn/management-settings-types'; + +/** + * Compares a given {@link FieldDefinition} to an {@link UnsavedFieldChange} to determine + * if the field has an unsaved change in the UI. + * + * @param field The field to compare. + * @param unsavedChange The unsaved change to compare. + */ +export const hasUnsavedChange = ( + field: Pick, 'savedValue'>, + unsavedChange?: Pick, 'unsavedValue'> +) => { + if (!unsavedChange) { + return false; + } + + const { unsavedValue } = unsavedChange; + const { savedValue } = field; + return unsavedValue !== undefined && !isEqual(unsavedValue, savedValue); +}; diff --git a/packages/kbn-management/settings/utilities/index.ts b/packages/kbn-management/settings/utilities/index.ts new file mode 100644 index 0000000000000..1c35af180866d --- /dev/null +++ b/packages/kbn-management/settings/utilities/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { hasUnsavedChange } from './has_unsaved_change'; +export { isUnsavedValue } from './is_unsaved_value'; +export { getInputValue } from './get_input_value'; diff --git a/packages/kbn-management/settings/utilities/is_unsaved_value.ts b/packages/kbn-management/settings/utilities/is_unsaved_value.ts new file mode 100644 index 0000000000000..863d6c8b59ba0 --- /dev/null +++ b/packages/kbn-management/settings/utilities/is_unsaved_value.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 isEqual from 'lodash/isEqual'; + +import { FieldDefinition, KnownTypeToValue, SettingType } from '@kbn/management-settings-types'; + +/** + * Convenience function to compare a given {@link FieldDefinition} to an {@link UnsavedFieldChange} + * to determine if the value in the unsaved change is a different value from what is saved. + * + * @param field The field to compare. + * @param unsavedValue The unsaved value to compare. + */ +export const isUnsavedValue = ( + field: FieldDefinition, + unsavedValue?: KnownTypeToValue | null +) => { + const { savedValue } = field; + + return unsavedValue !== undefined && !isEqual(unsavedValue, savedValue); +}; diff --git a/packages/kbn-management/settings/utilities/kibana.jsonc b/packages/kbn-management/settings/utilities/kibana.jsonc new file mode 100644 index 0000000000000..391d209e9f192 --- /dev/null +++ b/packages/kbn-management/settings/utilities/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/management-settings-utilities", + "owner": "@elastic/platform-deployment-management @elastic/appex-sharedux" +} diff --git a/packages/kbn-management/settings/utilities/package.json b/packages/kbn-management/settings/utilities/package.json new file mode 100644 index 0000000000000..b82429aa30707 --- /dev/null +++ b/packages/kbn-management/settings/utilities/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/management-settings-utilities", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/utilities/tsconfig.json b/packages/kbn-management/settings/utilities/tsconfig.json new file mode 100644 index 0000000000000..1247d2cd18707 --- /dev/null +++ b/packages/kbn-management/settings/utilities/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/management-settings-types", + ] +} diff --git a/packages/kbn-management/storybook/config/tsconfig.json b/packages/kbn-management/storybook/config/tsconfig.json index 52ae9f82c90f6..d383f3b0ba61e 100644 --- a/packages/kbn-management/storybook/config/tsconfig.json +++ b/packages/kbn-management/storybook/config/tsconfig.json @@ -4,7 +4,10 @@ "outDir": "target/types", "types": [ "jest", - "node" + "node", + "@kbn/ambient-ui-types", + "@kbn/ambient-storybook-types", + "@emotion/react/types/css-prop" ] }, "include": [ diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 index b5688e0915a33..eb078b7c16ac1 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 @@ -91,6 +91,16 @@ DATE_LITERAL | 'second' | 'minute' | 'hour' + | 'week' + | 'millisecond' + | 'years' + | 'months' + | 'days' + | 'seconds' + | 'minutes' + | 'hours' + | 'weeks' + | 'milliseconds' ; AND : 'and'; diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp index 394ed7fc4ee63..c78a358542485 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp @@ -304,4 +304,4 @@ SOURCE_IDENTIFIERS ENRICH_IDENTIFIERS atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 83, 1396, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 399, 10, 19, 12, 19, 14, 19, 402, 11, 19, 3, 19, 5, 19, 405, 10, 19, 3, 19, 5, 19, 408, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 417, 10, 20, 12, 20, 14, 20, 420, 11, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 6, 21, 428, 10, 21, 13, 21, 14, 21, 429, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 471, 10, 32, 3, 32, 6, 32, 474, 10, 32, 13, 32, 14, 32, 475, 3, 33, 3, 33, 3, 33, 7, 33, 481, 10, 33, 12, 33, 14, 33, 484, 11, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 492, 10, 33, 12, 33, 14, 33, 495, 11, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 502, 10, 33, 3, 33, 5, 33, 505, 10, 33, 5, 33, 507, 10, 33, 3, 34, 6, 34, 510, 10, 34, 13, 34, 14, 34, 511, 3, 35, 6, 35, 515, 10, 35, 13, 35, 14, 35, 516, 3, 35, 3, 35, 7, 35, 521, 10, 35, 12, 35, 14, 35, 524, 11, 35, 3, 35, 3, 35, 6, 35, 528, 10, 35, 13, 35, 14, 35, 529, 3, 35, 6, 35, 533, 10, 35, 13, 35, 14, 35, 534, 3, 35, 3, 35, 7, 35, 539, 10, 35, 12, 35, 14, 35, 542, 11, 35, 5, 35, 544, 10, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 550, 10, 35, 13, 35, 14, 35, 551, 3, 35, 3, 35, 5, 35, 556, 10, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 589, 10, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 5, 57, 673, 10, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 5, 58, 685, 10, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 5, 65, 707, 10, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 724, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 5, 68, 1088, 10, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 5, 69, 1171, 10, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 7, 71, 1189, 10, 71, 12, 71, 14, 71, 1192, 11, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 6, 71, 1199, 10, 71, 13, 71, 14, 71, 1200, 5, 71, 1203, 10, 71, 3, 72, 3, 72, 3, 72, 3, 72, 7, 72, 1209, 10, 72, 12, 72, 14, 72, 1212, 11, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 6, 82, 1263, 10, 82, 13, 82, 14, 82, 1264, 3, 83, 6, 83, 1268, 10, 83, 13, 83, 14, 83, 1269, 3, 83, 3, 83, 5, 83, 1274, 10, 83, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 6, 94, 1318, 10, 94, 13, 94, 14, 94, 1319, 3, 95, 6, 95, 1323, 10, 95, 13, 95, 14, 95, 1324, 3, 95, 3, 95, 5, 95, 1329, 10, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 3, 117, 3, 117, 3, 118, 3, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 121, 3, 121, 3, 122, 3, 122, 3, 123, 3, 123, 3, 124, 3, 124, 3, 125, 3, 125, 4, 418, 493, 2, 2, 126, 7, 2, 3, 9, 2, 4, 11, 2, 5, 13, 2, 6, 15, 2, 7, 17, 2, 8, 19, 2, 9, 21, 2, 10, 23, 2, 11, 25, 2, 12, 27, 2, 13, 29, 2, 14, 31, 2, 15, 33, 2, 16, 35, 2, 17, 37, 2, 18, 39, 2, 19, 41, 2, 20, 43, 2, 21, 45, 2, 22, 47, 2, 2, 49, 2, 83, 51, 2, 23, 53, 2, 24, 55, 2, 25, 57, 2, 26, 59, 2, 2, 61, 2, 2, 63, 2, 2, 65, 2, 2, 67, 2, 2, 69, 2, 27, 71, 2, 28, 73, 2, 29, 75, 2, 30, 77, 2, 31, 79, 2, 32, 81, 2, 33, 83, 2, 34, 85, 2, 35, 87, 2, 36, 89, 2, 37, 91, 2, 38, 93, 2, 39, 95, 2, 40, 97, 2, 41, 99, 2, 42, 101, 2, 43, 103, 2, 44, 105, 2, 45, 107, 2, 46, 109, 2, 47, 111, 2, 48, 113, 2, 49, 115, 2, 50, 117, 2, 51, 119, 2, 52, 121, 2, 53, 123, 2, 54, 125, 2, 55, 127, 2, 56, 129, 2, 57, 131, 2, 58, 133, 2, 59, 135, 2, 60, 137, 2, 61, 139, 2, 62, 141, 2, 63, 143, 2, 64, 145, 2, 65, 147, 2, 66, 149, 2, 67, 151, 2, 68, 153, 2, 69, 155, 2, 2, 157, 2, 2, 159, 2, 2, 161, 2, 2, 163, 2, 2, 165, 2, 70, 167, 2, 71, 169, 2, 2, 171, 2, 72, 173, 2, 73, 175, 2, 74, 177, 2, 75, 179, 2, 76, 181, 2, 77, 183, 2, 2, 185, 2, 2, 187, 2, 2, 189, 2, 2, 191, 2, 78, 193, 2, 2, 195, 2, 79, 197, 2, 80, 199, 2, 81, 201, 2, 82, 203, 2, 2, 205, 2, 2, 207, 2, 2, 209, 2, 2, 211, 2, 2, 213, 2, 2, 215, 2, 2, 217, 2, 2, 219, 2, 2, 221, 2, 2, 223, 2, 2, 225, 2, 2, 227, 2, 2, 229, 2, 2, 231, 2, 2, 233, 2, 2, 235, 2, 2, 237, 2, 2, 239, 2, 2, 241, 2, 2, 243, 2, 2, 245, 2, 2, 247, 2, 2, 249, 2, 2, 251, 2, 2, 253, 2, 2, 7, 2, 3, 4, 5, 6, 39, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 7, 2, 36, 36, 94, 94, 112, 112, 116, 116, 118, 118, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 66, 66, 97, 97, 3, 2, 98, 98, 12, 2, 11, 12, 15, 15, 34, 34, 46, 46, 49, 49, 63, 63, 93, 93, 95, 95, 98, 98, 126, 126, 4, 2, 44, 44, 49, 49, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 1464, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 3, 47, 3, 2, 2, 2, 3, 49, 3, 2, 2, 2, 3, 51, 3, 2, 2, 2, 3, 53, 3, 2, 2, 2, 3, 55, 3, 2, 2, 2, 4, 57, 3, 2, 2, 2, 4, 69, 3, 2, 2, 2, 4, 71, 3, 2, 2, 2, 4, 73, 3, 2, 2, 2, 4, 75, 3, 2, 2, 2, 4, 77, 3, 2, 2, 2, 4, 79, 3, 2, 2, 2, 4, 81, 3, 2, 2, 2, 4, 83, 3, 2, 2, 2, 4, 85, 3, 2, 2, 2, 4, 87, 3, 2, 2, 2, 4, 89, 3, 2, 2, 2, 4, 91, 3, 2, 2, 2, 4, 93, 3, 2, 2, 2, 4, 95, 3, 2, 2, 2, 4, 97, 3, 2, 2, 2, 4, 99, 3, 2, 2, 2, 4, 101, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 4, 105, 3, 2, 2, 2, 4, 107, 3, 2, 2, 2, 4, 109, 3, 2, 2, 2, 4, 111, 3, 2, 2, 2, 4, 113, 3, 2, 2, 2, 4, 115, 3, 2, 2, 2, 4, 117, 3, 2, 2, 2, 4, 119, 3, 2, 2, 2, 4, 121, 3, 2, 2, 2, 4, 123, 3, 2, 2, 2, 4, 125, 3, 2, 2, 2, 4, 127, 3, 2, 2, 2, 4, 129, 3, 2, 2, 2, 4, 131, 3, 2, 2, 2, 4, 133, 3, 2, 2, 2, 4, 135, 3, 2, 2, 2, 4, 137, 3, 2, 2, 2, 4, 139, 3, 2, 2, 2, 4, 141, 3, 2, 2, 2, 4, 143, 3, 2, 2, 2, 4, 145, 3, 2, 2, 2, 4, 147, 3, 2, 2, 2, 4, 149, 3, 2, 2, 2, 4, 151, 3, 2, 2, 2, 4, 153, 3, 2, 2, 2, 5, 155, 3, 2, 2, 2, 5, 157, 3, 2, 2, 2, 5, 159, 3, 2, 2, 2, 5, 161, 3, 2, 2, 2, 5, 163, 3, 2, 2, 2, 5, 165, 3, 2, 2, 2, 5, 167, 3, 2, 2, 2, 5, 171, 3, 2, 2, 2, 5, 173, 3, 2, 2, 2, 5, 175, 3, 2, 2, 2, 5, 177, 3, 2, 2, 2, 6, 179, 3, 2, 2, 2, 6, 181, 3, 2, 2, 2, 6, 183, 3, 2, 2, 2, 6, 185, 3, 2, 2, 2, 6, 187, 3, 2, 2, 2, 6, 189, 3, 2, 2, 2, 6, 191, 3, 2, 2, 2, 6, 195, 3, 2, 2, 2, 6, 197, 3, 2, 2, 2, 6, 199, 3, 2, 2, 2, 6, 201, 3, 2, 2, 2, 7, 255, 3, 2, 2, 2, 9, 265, 3, 2, 2, 2, 11, 272, 3, 2, 2, 2, 13, 279, 3, 2, 2, 2, 15, 289, 3, 2, 2, 2, 17, 296, 3, 2, 2, 2, 19, 302, 3, 2, 2, 2, 21, 310, 3, 2, 2, 2, 23, 318, 3, 2, 2, 2, 25, 325, 3, 2, 2, 2, 27, 337, 3, 2, 2, 2, 29, 345, 3, 2, 2, 2, 31, 355, 3, 2, 2, 2, 33, 362, 3, 2, 2, 2, 35, 371, 3, 2, 2, 2, 37, 378, 3, 2, 2, 2, 39, 387, 3, 2, 2, 2, 41, 394, 3, 2, 2, 2, 43, 411, 3, 2, 2, 2, 45, 427, 3, 2, 2, 2, 47, 433, 3, 2, 2, 2, 49, 438, 3, 2, 2, 2, 51, 443, 3, 2, 2, 2, 53, 447, 3, 2, 2, 2, 55, 451, 3, 2, 2, 2, 57, 455, 3, 2, 2, 2, 59, 459, 3, 2, 2, 2, 61, 461, 3, 2, 2, 2, 63, 463, 3, 2, 2, 2, 65, 466, 3, 2, 2, 2, 67, 468, 3, 2, 2, 2, 69, 506, 3, 2, 2, 2, 71, 509, 3, 2, 2, 2, 73, 555, 3, 2, 2, 2, 75, 557, 3, 2, 2, 2, 77, 588, 3, 2, 2, 2, 79, 590, 3, 2, 2, 2, 81, 594, 3, 2, 2, 2, 83, 596, 3, 2, 2, 2, 85, 598, 3, 2, 2, 2, 87, 600, 3, 2, 2, 2, 89, 602, 3, 2, 2, 2, 91, 607, 3, 2, 2, 2, 93, 612, 3, 2, 2, 2, 95, 616, 3, 2, 2, 2, 97, 621, 3, 2, 2, 2, 99, 627, 3, 2, 2, 2, 101, 630, 3, 2, 2, 2, 103, 633, 3, 2, 2, 2, 105, 636, 3, 2, 2, 2, 107, 641, 3, 2, 2, 2, 109, 644, 3, 2, 2, 2, 111, 646, 3, 2, 2, 2, 113, 648, 3, 2, 2, 2, 115, 653, 3, 2, 2, 2, 117, 672, 3, 2, 2, 2, 119, 684, 3, 2, 2, 2, 121, 686, 3, 2, 2, 2, 123, 688, 3, 2, 2, 2, 125, 690, 3, 2, 2, 2, 127, 692, 3, 2, 2, 2, 129, 694, 3, 2, 2, 2, 131, 696, 3, 2, 2, 2, 133, 706, 3, 2, 2, 2, 135, 708, 3, 2, 2, 2, 137, 723, 3, 2, 2, 2, 139, 1087, 3, 2, 2, 2, 141, 1170, 3, 2, 2, 2, 143, 1172, 3, 2, 2, 2, 145, 1202, 3, 2, 2, 2, 147, 1204, 3, 2, 2, 2, 149, 1215, 3, 2, 2, 2, 151, 1219, 3, 2, 2, 2, 153, 1223, 3, 2, 2, 2, 155, 1227, 3, 2, 2, 2, 157, 1232, 3, 2, 2, 2, 159, 1238, 3, 2, 2, 2, 161, 1244, 3, 2, 2, 2, 163, 1248, 3, 2, 2, 2, 165, 1252, 3, 2, 2, 2, 167, 1262, 3, 2, 2, 2, 169, 1273, 3, 2, 2, 2, 171, 1275, 3, 2, 2, 2, 173, 1277, 3, 2, 2, 2, 175, 1281, 3, 2, 2, 2, 177, 1285, 3, 2, 2, 2, 179, 1289, 3, 2, 2, 2, 181, 1292, 3, 2, 2, 2, 183, 1297, 3, 2, 2, 2, 185, 1302, 3, 2, 2, 2, 187, 1308, 3, 2, 2, 2, 189, 1312, 3, 2, 2, 2, 191, 1317, 3, 2, 2, 2, 193, 1328, 3, 2, 2, 2, 195, 1330, 3, 2, 2, 2, 197, 1332, 3, 2, 2, 2, 199, 1336, 3, 2, 2, 2, 201, 1340, 3, 2, 2, 2, 203, 1344, 3, 2, 2, 2, 205, 1346, 3, 2, 2, 2, 207, 1348, 3, 2, 2, 2, 209, 1350, 3, 2, 2, 2, 211, 1352, 3, 2, 2, 2, 213, 1354, 3, 2, 2, 2, 215, 1356, 3, 2, 2, 2, 217, 1358, 3, 2, 2, 2, 219, 1360, 3, 2, 2, 2, 221, 1362, 3, 2, 2, 2, 223, 1364, 3, 2, 2, 2, 225, 1366, 3, 2, 2, 2, 227, 1368, 3, 2, 2, 2, 229, 1370, 3, 2, 2, 2, 231, 1372, 3, 2, 2, 2, 233, 1374, 3, 2, 2, 2, 235, 1376, 3, 2, 2, 2, 237, 1378, 3, 2, 2, 2, 239, 1380, 3, 2, 2, 2, 241, 1382, 3, 2, 2, 2, 243, 1384, 3, 2, 2, 2, 245, 1386, 3, 2, 2, 2, 247, 1388, 3, 2, 2, 2, 249, 1390, 3, 2, 2, 2, 251, 1392, 3, 2, 2, 2, 253, 1394, 3, 2, 2, 2, 255, 256, 5, 209, 103, 2, 256, 257, 5, 219, 108, 2, 257, 258, 5, 239, 118, 2, 258, 259, 5, 239, 118, 2, 259, 260, 5, 211, 104, 2, 260, 261, 5, 207, 102, 2, 261, 262, 5, 241, 119, 2, 262, 263, 3, 2, 2, 2, 263, 264, 8, 2, 2, 2, 264, 8, 3, 2, 2, 2, 265, 266, 5, 215, 106, 2, 266, 267, 5, 237, 117, 2, 267, 268, 5, 231, 114, 2, 268, 269, 5, 223, 110, 2, 269, 270, 3, 2, 2, 2, 270, 271, 8, 3, 2, 2, 271, 10, 3, 2, 2, 2, 272, 273, 5, 211, 104, 2, 273, 274, 5, 245, 121, 2, 274, 275, 5, 203, 100, 2, 275, 276, 5, 225, 111, 2, 276, 277, 3, 2, 2, 2, 277, 278, 8, 4, 2, 2, 278, 12, 3, 2, 2, 2, 279, 280, 5, 211, 104, 2, 280, 281, 5, 249, 123, 2, 281, 282, 5, 233, 115, 2, 282, 283, 5, 225, 111, 2, 283, 284, 5, 203, 100, 2, 284, 285, 5, 219, 108, 2, 285, 286, 5, 229, 113, 2, 286, 287, 3, 2, 2, 2, 287, 288, 8, 5, 3, 2, 288, 14, 3, 2, 2, 2, 289, 290, 5, 213, 105, 2, 290, 291, 5, 237, 117, 2, 291, 292, 5, 231, 114, 2, 292, 293, 5, 227, 112, 2, 293, 294, 3, 2, 2, 2, 294, 295, 8, 6, 4, 2, 295, 16, 3, 2, 2, 2, 296, 297, 5, 237, 117, 2, 297, 298, 5, 231, 114, 2, 298, 299, 5, 247, 122, 2, 299, 300, 3, 2, 2, 2, 300, 301, 8, 7, 2, 2, 301, 18, 3, 2, 2, 2, 302, 303, 5, 239, 118, 2, 303, 304, 5, 241, 119, 2, 304, 305, 5, 203, 100, 2, 305, 306, 5, 241, 119, 2, 306, 307, 5, 239, 118, 2, 307, 308, 3, 2, 2, 2, 308, 309, 8, 8, 2, 2, 309, 20, 3, 2, 2, 2, 310, 311, 5, 247, 122, 2, 311, 312, 5, 217, 107, 2, 312, 313, 5, 211, 104, 2, 313, 314, 5, 237, 117, 2, 314, 315, 5, 211, 104, 2, 315, 316, 3, 2, 2, 2, 316, 317, 8, 9, 2, 2, 317, 22, 3, 2, 2, 2, 318, 319, 5, 239, 118, 2, 319, 320, 5, 231, 114, 2, 320, 321, 5, 237, 117, 2, 321, 322, 5, 241, 119, 2, 322, 323, 3, 2, 2, 2, 323, 324, 8, 10, 2, 2, 324, 24, 3, 2, 2, 2, 325, 326, 5, 227, 112, 2, 326, 327, 5, 245, 121, 2, 327, 328, 5, 111, 54, 2, 328, 329, 5, 211, 104, 2, 329, 330, 5, 249, 123, 2, 330, 331, 5, 233, 115, 2, 331, 332, 5, 203, 100, 2, 332, 333, 5, 229, 113, 2, 333, 334, 5, 209, 103, 2, 334, 335, 3, 2, 2, 2, 335, 336, 8, 11, 2, 2, 336, 26, 3, 2, 2, 2, 337, 338, 5, 225, 111, 2, 338, 339, 5, 219, 108, 2, 339, 340, 5, 227, 112, 2, 340, 341, 5, 219, 108, 2, 341, 342, 5, 241, 119, 2, 342, 343, 3, 2, 2, 2, 343, 344, 8, 12, 2, 2, 344, 28, 3, 2, 2, 2, 345, 346, 5, 233, 115, 2, 346, 347, 5, 237, 117, 2, 347, 348, 5, 231, 114, 2, 348, 349, 5, 221, 109, 2, 349, 350, 5, 211, 104, 2, 350, 351, 5, 207, 102, 2, 351, 352, 5, 241, 119, 2, 352, 353, 3, 2, 2, 2, 353, 354, 8, 13, 2, 2, 354, 30, 3, 2, 2, 2, 355, 356, 5, 209, 103, 2, 356, 357, 5, 237, 117, 2, 357, 358, 5, 231, 114, 2, 358, 359, 5, 233, 115, 2, 359, 360, 3, 2, 2, 2, 360, 361, 8, 14, 2, 2, 361, 32, 3, 2, 2, 2, 362, 363, 5, 237, 117, 2, 363, 364, 5, 211, 104, 2, 364, 365, 5, 229, 113, 2, 365, 366, 5, 203, 100, 2, 366, 367, 5, 227, 112, 2, 367, 368, 5, 211, 104, 2, 368, 369, 3, 2, 2, 2, 369, 370, 8, 15, 2, 2, 370, 34, 3, 2, 2, 2, 371, 372, 5, 239, 118, 2, 372, 373, 5, 217, 107, 2, 373, 374, 5, 231, 114, 2, 374, 375, 5, 247, 122, 2, 375, 376, 3, 2, 2, 2, 376, 377, 8, 16, 2, 2, 377, 36, 3, 2, 2, 2, 378, 379, 5, 211, 104, 2, 379, 380, 5, 229, 113, 2, 380, 381, 5, 237, 117, 2, 381, 382, 5, 219, 108, 2, 382, 383, 5, 207, 102, 2, 383, 384, 5, 217, 107, 2, 384, 385, 3, 2, 2, 2, 385, 386, 8, 17, 5, 2, 386, 38, 3, 2, 2, 2, 387, 388, 5, 223, 110, 2, 388, 389, 5, 211, 104, 2, 389, 390, 5, 211, 104, 2, 390, 391, 5, 233, 115, 2, 391, 392, 3, 2, 2, 2, 392, 393, 8, 18, 2, 2, 393, 40, 3, 2, 2, 2, 394, 395, 7, 49, 2, 2, 395, 396, 7, 49, 2, 2, 396, 400, 3, 2, 2, 2, 397, 399, 10, 2, 2, 2, 398, 397, 3, 2, 2, 2, 399, 402, 3, 2, 2, 2, 400, 398, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 403, 405, 7, 15, 2, 2, 404, 403, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 407, 3, 2, 2, 2, 406, 408, 7, 12, 2, 2, 407, 406, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 8, 19, 6, 2, 410, 42, 3, 2, 2, 2, 411, 412, 7, 49, 2, 2, 412, 413, 7, 44, 2, 2, 413, 418, 3, 2, 2, 2, 414, 417, 5, 43, 20, 2, 415, 417, 11, 2, 2, 2, 416, 414, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 419, 421, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 422, 7, 44, 2, 2, 422, 423, 7, 49, 2, 2, 423, 424, 3, 2, 2, 2, 424, 425, 8, 20, 6, 2, 425, 44, 3, 2, 2, 2, 426, 428, 9, 3, 2, 2, 427, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 431, 3, 2, 2, 2, 431, 432, 8, 21, 6, 2, 432, 46, 3, 2, 2, 2, 433, 434, 7, 93, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 8, 22, 7, 2, 436, 437, 8, 22, 8, 2, 437, 48, 3, 2, 2, 2, 438, 439, 7, 126, 2, 2, 439, 440, 3, 2, 2, 2, 440, 441, 8, 23, 9, 2, 441, 442, 8, 23, 10, 2, 442, 50, 3, 2, 2, 2, 443, 444, 5, 45, 21, 2, 444, 445, 3, 2, 2, 2, 445, 446, 8, 24, 6, 2, 446, 52, 3, 2, 2, 2, 447, 448, 5, 41, 19, 2, 448, 449, 3, 2, 2, 2, 449, 450, 8, 25, 6, 2, 450, 54, 3, 2, 2, 2, 451, 452, 5, 43, 20, 2, 452, 453, 3, 2, 2, 2, 453, 454, 8, 26, 6, 2, 454, 56, 3, 2, 2, 2, 455, 456, 7, 126, 2, 2, 456, 457, 3, 2, 2, 2, 457, 458, 8, 27, 10, 2, 458, 58, 3, 2, 2, 2, 459, 460, 9, 4, 2, 2, 460, 60, 3, 2, 2, 2, 461, 462, 9, 5, 2, 2, 462, 62, 3, 2, 2, 2, 463, 464, 7, 94, 2, 2, 464, 465, 9, 6, 2, 2, 465, 64, 3, 2, 2, 2, 466, 467, 10, 7, 2, 2, 467, 66, 3, 2, 2, 2, 468, 470, 9, 8, 2, 2, 469, 471, 9, 9, 2, 2, 470, 469, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 473, 3, 2, 2, 2, 472, 474, 5, 59, 28, 2, 473, 472, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 68, 3, 2, 2, 2, 477, 482, 7, 36, 2, 2, 478, 481, 5, 63, 30, 2, 479, 481, 5, 65, 31, 2, 480, 478, 3, 2, 2, 2, 480, 479, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 485, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 507, 7, 36, 2, 2, 486, 487, 7, 36, 2, 2, 487, 488, 7, 36, 2, 2, 488, 489, 7, 36, 2, 2, 489, 493, 3, 2, 2, 2, 490, 492, 10, 2, 2, 2, 491, 490, 3, 2, 2, 2, 492, 495, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 493, 491, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 496, 497, 7, 36, 2, 2, 497, 498, 7, 36, 2, 2, 498, 499, 7, 36, 2, 2, 499, 501, 3, 2, 2, 2, 500, 502, 7, 36, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 504, 3, 2, 2, 2, 503, 505, 7, 36, 2, 2, 504, 503, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 507, 3, 2, 2, 2, 506, 477, 3, 2, 2, 2, 506, 486, 3, 2, 2, 2, 507, 70, 3, 2, 2, 2, 508, 510, 5, 59, 28, 2, 509, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 509, 3, 2, 2, 2, 511, 512, 3, 2, 2, 2, 512, 72, 3, 2, 2, 2, 513, 515, 5, 59, 28, 2, 514, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 522, 5, 85, 41, 2, 519, 521, 5, 59, 28, 2, 520, 519, 3, 2, 2, 2, 521, 524, 3, 2, 2, 2, 522, 520, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 556, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 525, 527, 5, 85, 41, 2, 526, 528, 5, 59, 28, 2, 527, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 556, 3, 2, 2, 2, 531, 533, 5, 59, 28, 2, 532, 531, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 532, 3, 2, 2, 2, 534, 535, 3, 2, 2, 2, 535, 543, 3, 2, 2, 2, 536, 540, 5, 85, 41, 2, 537, 539, 5, 59, 28, 2, 538, 537, 3, 2, 2, 2, 539, 542, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 544, 3, 2, 2, 2, 542, 540, 3, 2, 2, 2, 543, 536, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 5, 67, 32, 2, 546, 556, 3, 2, 2, 2, 547, 549, 5, 85, 41, 2, 548, 550, 5, 59, 28, 2, 549, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 551, 552, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 554, 5, 67, 32, 2, 554, 556, 3, 2, 2, 2, 555, 514, 3, 2, 2, 2, 555, 525, 3, 2, 2, 2, 555, 532, 3, 2, 2, 2, 555, 547, 3, 2, 2, 2, 556, 74, 3, 2, 2, 2, 557, 558, 7, 100, 2, 2, 558, 559, 7, 123, 2, 2, 559, 76, 3, 2, 2, 2, 560, 561, 7, 123, 2, 2, 561, 562, 7, 103, 2, 2, 562, 563, 7, 99, 2, 2, 563, 589, 7, 116, 2, 2, 564, 565, 7, 111, 2, 2, 565, 566, 7, 113, 2, 2, 566, 567, 7, 112, 2, 2, 567, 568, 7, 118, 2, 2, 568, 589, 7, 106, 2, 2, 569, 570, 7, 102, 2, 2, 570, 571, 7, 99, 2, 2, 571, 589, 7, 123, 2, 2, 572, 573, 7, 117, 2, 2, 573, 574, 7, 103, 2, 2, 574, 575, 7, 101, 2, 2, 575, 576, 7, 113, 2, 2, 576, 577, 7, 112, 2, 2, 577, 589, 7, 102, 2, 2, 578, 579, 7, 111, 2, 2, 579, 580, 7, 107, 2, 2, 580, 581, 7, 112, 2, 2, 581, 582, 7, 119, 2, 2, 582, 583, 7, 118, 2, 2, 583, 589, 7, 103, 2, 2, 584, 585, 7, 106, 2, 2, 585, 586, 7, 113, 2, 2, 586, 587, 7, 119, 2, 2, 587, 589, 7, 116, 2, 2, 588, 560, 3, 2, 2, 2, 588, 564, 3, 2, 2, 2, 588, 569, 3, 2, 2, 2, 588, 572, 3, 2, 2, 2, 588, 578, 3, 2, 2, 2, 588, 584, 3, 2, 2, 2, 589, 78, 3, 2, 2, 2, 590, 591, 7, 99, 2, 2, 591, 592, 7, 112, 2, 2, 592, 593, 7, 102, 2, 2, 593, 80, 3, 2, 2, 2, 594, 595, 7, 63, 2, 2, 595, 82, 3, 2, 2, 2, 596, 597, 7, 46, 2, 2, 597, 84, 3, 2, 2, 2, 598, 599, 7, 48, 2, 2, 599, 86, 3, 2, 2, 2, 600, 601, 7, 42, 2, 2, 601, 88, 3, 2, 2, 2, 602, 603, 7, 93, 2, 2, 603, 604, 3, 2, 2, 2, 604, 605, 8, 43, 2, 2, 605, 606, 8, 43, 2, 2, 606, 90, 3, 2, 2, 2, 607, 608, 7, 95, 2, 2, 608, 609, 3, 2, 2, 2, 609, 610, 8, 44, 10, 2, 610, 611, 8, 44, 10, 2, 611, 92, 3, 2, 2, 2, 612, 613, 5, 229, 113, 2, 613, 614, 5, 231, 114, 2, 614, 615, 5, 241, 119, 2, 615, 94, 3, 2, 2, 2, 616, 617, 5, 225, 111, 2, 617, 618, 5, 219, 108, 2, 618, 619, 5, 223, 110, 2, 619, 620, 5, 211, 104, 2, 620, 96, 3, 2, 2, 2, 621, 622, 5, 237, 117, 2, 622, 623, 5, 225, 111, 2, 623, 624, 5, 219, 108, 2, 624, 625, 5, 223, 110, 2, 625, 626, 5, 211, 104, 2, 626, 98, 3, 2, 2, 2, 627, 628, 5, 219, 108, 2, 628, 629, 5, 229, 113, 2, 629, 100, 3, 2, 2, 2, 630, 631, 5, 219, 108, 2, 631, 632, 5, 239, 118, 2, 632, 102, 3, 2, 2, 2, 633, 634, 5, 203, 100, 2, 634, 635, 5, 239, 118, 2, 635, 104, 3, 2, 2, 2, 636, 637, 5, 229, 113, 2, 637, 638, 5, 243, 120, 2, 638, 639, 5, 225, 111, 2, 639, 640, 5, 225, 111, 2, 640, 106, 3, 2, 2, 2, 641, 642, 7, 113, 2, 2, 642, 643, 7, 116, 2, 2, 643, 108, 3, 2, 2, 2, 644, 645, 7, 43, 2, 2, 645, 110, 3, 2, 2, 2, 646, 647, 7, 97, 2, 2, 647, 112, 3, 2, 2, 2, 648, 649, 7, 107, 2, 2, 649, 650, 7, 112, 2, 2, 650, 651, 7, 104, 2, 2, 651, 652, 7, 113, 2, 2, 652, 114, 3, 2, 2, 2, 653, 654, 7, 104, 2, 2, 654, 655, 7, 119, 2, 2, 655, 656, 7, 112, 2, 2, 656, 657, 7, 101, 2, 2, 657, 658, 7, 118, 2, 2, 658, 659, 7, 107, 2, 2, 659, 660, 7, 113, 2, 2, 660, 661, 7, 112, 2, 2, 661, 662, 7, 117, 2, 2, 662, 116, 3, 2, 2, 2, 663, 664, 7, 118, 2, 2, 664, 665, 7, 116, 2, 2, 665, 666, 7, 119, 2, 2, 666, 673, 7, 103, 2, 2, 667, 668, 7, 104, 2, 2, 668, 669, 7, 99, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 117, 2, 2, 671, 673, 7, 103, 2, 2, 672, 663, 3, 2, 2, 2, 672, 667, 3, 2, 2, 2, 673, 118, 3, 2, 2, 2, 674, 675, 7, 63, 2, 2, 675, 685, 7, 63, 2, 2, 676, 677, 7, 35, 2, 2, 677, 685, 7, 63, 2, 2, 678, 685, 7, 62, 2, 2, 679, 680, 7, 62, 2, 2, 680, 685, 7, 63, 2, 2, 681, 685, 7, 64, 2, 2, 682, 683, 7, 64, 2, 2, 683, 685, 7, 63, 2, 2, 684, 674, 3, 2, 2, 2, 684, 676, 3, 2, 2, 2, 684, 678, 3, 2, 2, 2, 684, 679, 3, 2, 2, 2, 684, 681, 3, 2, 2, 2, 684, 682, 3, 2, 2, 2, 685, 120, 3, 2, 2, 2, 686, 687, 7, 45, 2, 2, 687, 122, 3, 2, 2, 2, 688, 689, 7, 47, 2, 2, 689, 124, 3, 2, 2, 2, 690, 691, 7, 44, 2, 2, 691, 126, 3, 2, 2, 2, 692, 693, 7, 49, 2, 2, 693, 128, 3, 2, 2, 2, 694, 695, 7, 39, 2, 2, 695, 130, 3, 2, 2, 2, 696, 697, 7, 51, 2, 2, 697, 698, 7, 50, 2, 2, 698, 132, 3, 2, 2, 2, 699, 700, 7, 99, 2, 2, 700, 701, 7, 117, 2, 2, 701, 707, 7, 101, 2, 2, 702, 703, 7, 102, 2, 2, 703, 704, 7, 103, 2, 2, 704, 705, 7, 117, 2, 2, 705, 707, 7, 101, 2, 2, 706, 699, 3, 2, 2, 2, 706, 702, 3, 2, 2, 2, 707, 134, 3, 2, 2, 2, 708, 709, 7, 112, 2, 2, 709, 710, 7, 119, 2, 2, 710, 711, 7, 110, 2, 2, 711, 712, 7, 110, 2, 2, 712, 713, 7, 117, 2, 2, 713, 136, 3, 2, 2, 2, 714, 715, 7, 104, 2, 2, 715, 716, 7, 107, 2, 2, 716, 717, 7, 116, 2, 2, 717, 718, 7, 117, 2, 2, 718, 724, 7, 118, 2, 2, 719, 720, 7, 110, 2, 2, 720, 721, 7, 99, 2, 2, 721, 722, 7, 117, 2, 2, 722, 724, 7, 118, 2, 2, 723, 714, 3, 2, 2, 2, 723, 719, 3, 2, 2, 2, 724, 138, 3, 2, 2, 2, 725, 726, 5, 237, 117, 2, 726, 727, 5, 231, 114, 2, 727, 728, 5, 243, 120, 2, 728, 729, 5, 229, 113, 2, 729, 730, 5, 209, 103, 2, 730, 1088, 3, 2, 2, 2, 731, 732, 5, 203, 100, 2, 732, 733, 5, 205, 101, 2, 733, 734, 5, 239, 118, 2, 734, 1088, 3, 2, 2, 2, 735, 736, 5, 233, 115, 2, 736, 737, 5, 231, 114, 2, 737, 738, 5, 247, 122, 2, 738, 1088, 3, 2, 2, 2, 739, 740, 5, 225, 111, 2, 740, 741, 5, 231, 114, 2, 741, 742, 5, 215, 106, 2, 742, 743, 5, 131, 64, 2, 743, 1088, 3, 2, 2, 2, 744, 745, 5, 233, 115, 2, 745, 746, 5, 219, 108, 2, 746, 1088, 3, 2, 2, 2, 747, 748, 5, 241, 119, 2, 748, 749, 5, 203, 100, 2, 749, 750, 5, 243, 120, 2, 750, 1088, 3, 2, 2, 2, 751, 1088, 5, 211, 104, 2, 752, 753, 5, 239, 118, 2, 753, 754, 5, 243, 120, 2, 754, 755, 5, 205, 101, 2, 755, 756, 5, 239, 118, 2, 756, 757, 5, 241, 119, 2, 757, 758, 5, 237, 117, 2, 758, 759, 5, 219, 108, 2, 759, 760, 5, 229, 113, 2, 760, 761, 5, 215, 106, 2, 761, 1088, 3, 2, 2, 2, 762, 763, 5, 241, 119, 2, 763, 764, 5, 237, 117, 2, 764, 765, 5, 219, 108, 2, 765, 766, 5, 227, 112, 2, 766, 1088, 3, 2, 2, 2, 767, 768, 5, 207, 102, 2, 768, 769, 5, 231, 114, 2, 769, 770, 5, 229, 113, 2, 770, 771, 5, 207, 102, 2, 771, 772, 5, 203, 100, 2, 772, 773, 5, 241, 119, 2, 773, 1088, 3, 2, 2, 2, 774, 775, 5, 239, 118, 2, 775, 776, 5, 241, 119, 2, 776, 777, 5, 203, 100, 2, 777, 778, 5, 237, 117, 2, 778, 779, 5, 241, 119, 2, 779, 780, 5, 239, 118, 2, 780, 781, 5, 111, 54, 2, 781, 782, 5, 247, 122, 2, 782, 783, 5, 219, 108, 2, 783, 784, 5, 241, 119, 2, 784, 785, 5, 217, 107, 2, 785, 1088, 3, 2, 2, 2, 786, 787, 5, 209, 103, 2, 787, 788, 5, 203, 100, 2, 788, 789, 5, 241, 119, 2, 789, 790, 5, 211, 104, 2, 790, 791, 5, 111, 54, 2, 791, 792, 5, 213, 105, 2, 792, 793, 5, 231, 114, 2, 793, 794, 5, 237, 117, 2, 794, 795, 5, 227, 112, 2, 795, 796, 5, 203, 100, 2, 796, 797, 5, 241, 119, 2, 797, 1088, 3, 2, 2, 2, 798, 799, 5, 209, 103, 2, 799, 800, 5, 203, 100, 2, 800, 801, 5, 241, 119, 2, 801, 802, 5, 211, 104, 2, 802, 803, 5, 111, 54, 2, 803, 804, 5, 241, 119, 2, 804, 805, 5, 237, 117, 2, 805, 806, 5, 243, 120, 2, 806, 807, 5, 229, 113, 2, 807, 808, 5, 207, 102, 2, 808, 1088, 3, 2, 2, 2, 809, 810, 5, 209, 103, 2, 810, 811, 5, 203, 100, 2, 811, 812, 5, 241, 119, 2, 812, 813, 5, 211, 104, 2, 813, 814, 5, 111, 54, 2, 814, 815, 5, 233, 115, 2, 815, 816, 5, 203, 100, 2, 816, 817, 5, 237, 117, 2, 817, 818, 5, 239, 118, 2, 818, 819, 5, 211, 104, 2, 819, 1088, 3, 2, 2, 2, 820, 821, 5, 203, 100, 2, 821, 822, 5, 243, 120, 2, 822, 823, 5, 241, 119, 2, 823, 824, 5, 231, 114, 2, 824, 825, 5, 111, 54, 2, 825, 826, 5, 205, 101, 2, 826, 827, 5, 243, 120, 2, 827, 828, 5, 207, 102, 2, 828, 829, 5, 223, 110, 2, 829, 830, 5, 211, 104, 2, 830, 831, 5, 241, 119, 2, 831, 1088, 3, 2, 2, 2, 832, 833, 5, 219, 108, 2, 833, 834, 5, 239, 118, 2, 834, 835, 5, 111, 54, 2, 835, 836, 5, 213, 105, 2, 836, 837, 5, 219, 108, 2, 837, 838, 5, 229, 113, 2, 838, 839, 5, 219, 108, 2, 839, 840, 5, 241, 119, 2, 840, 841, 5, 211, 104, 2, 841, 1088, 3, 2, 2, 2, 842, 843, 5, 219, 108, 2, 843, 844, 5, 239, 118, 2, 844, 845, 5, 111, 54, 2, 845, 846, 5, 219, 108, 2, 846, 847, 5, 229, 113, 2, 847, 848, 5, 213, 105, 2, 848, 849, 5, 219, 108, 2, 849, 850, 5, 229, 113, 2, 850, 851, 5, 219, 108, 2, 851, 852, 5, 241, 119, 2, 852, 853, 5, 211, 104, 2, 853, 1088, 3, 2, 2, 2, 854, 855, 5, 207, 102, 2, 855, 856, 5, 203, 100, 2, 856, 857, 5, 239, 118, 2, 857, 858, 5, 211, 104, 2, 858, 1088, 3, 2, 2, 2, 859, 860, 5, 225, 111, 2, 860, 861, 5, 211, 104, 2, 861, 862, 5, 229, 113, 2, 862, 863, 5, 215, 106, 2, 863, 864, 5, 241, 119, 2, 864, 865, 5, 217, 107, 2, 865, 1088, 3, 2, 2, 2, 866, 867, 5, 227, 112, 2, 867, 868, 5, 245, 121, 2, 868, 869, 5, 111, 54, 2, 869, 870, 5, 227, 112, 2, 870, 871, 5, 203, 100, 2, 871, 872, 5, 249, 123, 2, 872, 1088, 3, 2, 2, 2, 873, 874, 5, 227, 112, 2, 874, 875, 5, 245, 121, 2, 875, 876, 5, 111, 54, 2, 876, 877, 5, 227, 112, 2, 877, 878, 5, 219, 108, 2, 878, 879, 5, 229, 113, 2, 879, 1088, 3, 2, 2, 2, 880, 881, 5, 227, 112, 2, 881, 882, 5, 245, 121, 2, 882, 883, 5, 111, 54, 2, 883, 884, 5, 203, 100, 2, 884, 885, 5, 245, 121, 2, 885, 886, 5, 215, 106, 2, 886, 1088, 3, 2, 2, 2, 887, 888, 5, 227, 112, 2, 888, 889, 5, 245, 121, 2, 889, 890, 5, 111, 54, 2, 890, 891, 5, 239, 118, 2, 891, 892, 5, 243, 120, 2, 892, 893, 5, 227, 112, 2, 893, 1088, 3, 2, 2, 2, 894, 895, 5, 227, 112, 2, 895, 896, 5, 245, 121, 2, 896, 897, 5, 111, 54, 2, 897, 898, 5, 207, 102, 2, 898, 899, 5, 231, 114, 2, 899, 900, 5, 243, 120, 2, 900, 901, 5, 229, 113, 2, 901, 902, 5, 241, 119, 2, 902, 1088, 3, 2, 2, 2, 903, 904, 5, 227, 112, 2, 904, 905, 5, 245, 121, 2, 905, 906, 5, 111, 54, 2, 906, 907, 5, 207, 102, 2, 907, 908, 5, 231, 114, 2, 908, 909, 5, 229, 113, 2, 909, 910, 5, 207, 102, 2, 910, 911, 5, 203, 100, 2, 911, 912, 5, 241, 119, 2, 912, 1088, 3, 2, 2, 2, 913, 914, 5, 227, 112, 2, 914, 915, 5, 245, 121, 2, 915, 916, 5, 111, 54, 2, 916, 917, 5, 221, 109, 2, 917, 918, 5, 231, 114, 2, 918, 919, 5, 219, 108, 2, 919, 920, 5, 229, 113, 2, 920, 1088, 3, 2, 2, 2, 921, 922, 5, 227, 112, 2, 922, 923, 5, 245, 121, 2, 923, 924, 5, 111, 54, 2, 924, 925, 5, 227, 112, 2, 925, 926, 5, 211, 104, 2, 926, 927, 5, 209, 103, 2, 927, 928, 5, 219, 108, 2, 928, 929, 5, 203, 100, 2, 929, 930, 5, 229, 113, 2, 930, 1088, 3, 2, 2, 2, 931, 932, 5, 227, 112, 2, 932, 933, 5, 245, 121, 2, 933, 934, 5, 111, 54, 2, 934, 935, 5, 209, 103, 2, 935, 936, 5, 211, 104, 2, 936, 937, 5, 209, 103, 2, 937, 938, 5, 243, 120, 2, 938, 939, 5, 233, 115, 2, 939, 940, 5, 211, 104, 2, 940, 1088, 3, 2, 2, 2, 941, 942, 5, 227, 112, 2, 942, 943, 5, 211, 104, 2, 943, 944, 5, 241, 119, 2, 944, 945, 5, 203, 100, 2, 945, 946, 5, 209, 103, 2, 946, 947, 5, 203, 100, 2, 947, 948, 5, 241, 119, 2, 948, 949, 5, 203, 100, 2, 949, 1088, 3, 2, 2, 2, 950, 951, 5, 239, 118, 2, 951, 952, 5, 233, 115, 2, 952, 953, 5, 225, 111, 2, 953, 954, 5, 219, 108, 2, 954, 955, 5, 241, 119, 2, 955, 1088, 3, 2, 2, 2, 956, 957, 5, 241, 119, 2, 957, 958, 5, 231, 114, 2, 958, 959, 5, 111, 54, 2, 959, 960, 5, 239, 118, 2, 960, 961, 5, 241, 119, 2, 961, 962, 5, 237, 117, 2, 962, 963, 5, 219, 108, 2, 963, 964, 5, 229, 113, 2, 964, 965, 5, 215, 106, 2, 965, 1088, 3, 2, 2, 2, 966, 967, 5, 241, 119, 2, 967, 968, 5, 231, 114, 2, 968, 969, 5, 111, 54, 2, 969, 970, 5, 239, 118, 2, 970, 971, 5, 241, 119, 2, 971, 972, 5, 237, 117, 2, 972, 1088, 3, 2, 2, 2, 973, 974, 5, 241, 119, 2, 974, 975, 5, 231, 114, 2, 975, 976, 5, 111, 54, 2, 976, 977, 5, 205, 101, 2, 977, 978, 5, 231, 114, 2, 978, 979, 5, 231, 114, 2, 979, 980, 5, 225, 111, 2, 980, 1088, 3, 2, 2, 2, 981, 982, 5, 241, 119, 2, 982, 983, 5, 231, 114, 2, 983, 984, 5, 111, 54, 2, 984, 985, 5, 205, 101, 2, 985, 986, 5, 231, 114, 2, 986, 987, 5, 231, 114, 2, 987, 988, 5, 225, 111, 2, 988, 989, 5, 211, 104, 2, 989, 990, 5, 203, 100, 2, 990, 991, 5, 229, 113, 2, 991, 1088, 3, 2, 2, 2, 992, 993, 5, 241, 119, 2, 993, 994, 5, 231, 114, 2, 994, 995, 5, 111, 54, 2, 995, 996, 5, 209, 103, 2, 996, 997, 5, 203, 100, 2, 997, 998, 5, 241, 119, 2, 998, 999, 5, 211, 104, 2, 999, 1000, 5, 241, 119, 2, 1000, 1001, 5, 219, 108, 2, 1001, 1002, 5, 227, 112, 2, 1002, 1003, 5, 211, 104, 2, 1003, 1088, 3, 2, 2, 2, 1004, 1005, 5, 241, 119, 2, 1005, 1006, 5, 231, 114, 2, 1006, 1007, 5, 111, 54, 2, 1007, 1008, 5, 209, 103, 2, 1008, 1009, 5, 241, 119, 2, 1009, 1088, 3, 2, 2, 2, 1010, 1011, 5, 241, 119, 2, 1011, 1012, 5, 231, 114, 2, 1012, 1013, 5, 111, 54, 2, 1013, 1014, 5, 209, 103, 2, 1014, 1015, 5, 205, 101, 2, 1015, 1016, 5, 225, 111, 2, 1016, 1088, 3, 2, 2, 2, 1017, 1018, 5, 241, 119, 2, 1018, 1019, 5, 231, 114, 2, 1019, 1020, 5, 111, 54, 2, 1020, 1021, 5, 209, 103, 2, 1021, 1022, 5, 231, 114, 2, 1022, 1023, 5, 243, 120, 2, 1023, 1024, 5, 205, 101, 2, 1024, 1025, 5, 225, 111, 2, 1025, 1026, 5, 211, 104, 2, 1026, 1088, 3, 2, 2, 2, 1027, 1028, 5, 241, 119, 2, 1028, 1029, 5, 231, 114, 2, 1029, 1030, 5, 111, 54, 2, 1030, 1031, 5, 219, 108, 2, 1031, 1032, 5, 229, 113, 2, 1032, 1033, 5, 241, 119, 2, 1033, 1088, 3, 2, 2, 2, 1034, 1035, 5, 241, 119, 2, 1035, 1036, 5, 231, 114, 2, 1036, 1037, 5, 111, 54, 2, 1037, 1038, 5, 219, 108, 2, 1038, 1039, 5, 229, 113, 2, 1039, 1040, 5, 241, 119, 2, 1040, 1041, 5, 211, 104, 2, 1041, 1042, 5, 215, 106, 2, 1042, 1043, 5, 211, 104, 2, 1043, 1044, 5, 237, 117, 2, 1044, 1088, 3, 2, 2, 2, 1045, 1046, 5, 241, 119, 2, 1046, 1047, 5, 231, 114, 2, 1047, 1048, 5, 111, 54, 2, 1048, 1049, 5, 225, 111, 2, 1049, 1050, 5, 231, 114, 2, 1050, 1051, 5, 229, 113, 2, 1051, 1052, 5, 215, 106, 2, 1052, 1088, 3, 2, 2, 2, 1053, 1054, 5, 241, 119, 2, 1054, 1055, 5, 231, 114, 2, 1055, 1056, 5, 111, 54, 2, 1056, 1057, 5, 219, 108, 2, 1057, 1058, 5, 233, 115, 2, 1058, 1088, 3, 2, 2, 2, 1059, 1060, 5, 241, 119, 2, 1060, 1061, 5, 231, 114, 2, 1061, 1062, 5, 111, 54, 2, 1062, 1063, 5, 245, 121, 2, 1063, 1064, 5, 211, 104, 2, 1064, 1065, 5, 237, 117, 2, 1065, 1066, 5, 239, 118, 2, 1066, 1067, 5, 219, 108, 2, 1067, 1068, 5, 231, 114, 2, 1068, 1069, 5, 229, 113, 2, 1069, 1088, 3, 2, 2, 2, 1070, 1071, 5, 241, 119, 2, 1071, 1072, 5, 231, 114, 2, 1072, 1073, 5, 111, 54, 2, 1073, 1074, 5, 243, 120, 2, 1074, 1075, 5, 229, 113, 2, 1075, 1076, 5, 239, 118, 2, 1076, 1077, 5, 219, 108, 2, 1077, 1078, 5, 215, 106, 2, 1078, 1079, 5, 229, 113, 2, 1079, 1080, 5, 211, 104, 2, 1080, 1081, 5, 209, 103, 2, 1081, 1082, 5, 111, 54, 2, 1082, 1083, 5, 225, 111, 2, 1083, 1084, 5, 231, 114, 2, 1084, 1085, 5, 229, 113, 2, 1085, 1086, 5, 215, 106, 2, 1086, 1088, 3, 2, 2, 2, 1087, 725, 3, 2, 2, 2, 1087, 731, 3, 2, 2, 2, 1087, 735, 3, 2, 2, 2, 1087, 739, 3, 2, 2, 2, 1087, 744, 3, 2, 2, 2, 1087, 747, 3, 2, 2, 2, 1087, 751, 3, 2, 2, 2, 1087, 752, 3, 2, 2, 2, 1087, 762, 3, 2, 2, 2, 1087, 767, 3, 2, 2, 2, 1087, 774, 3, 2, 2, 2, 1087, 786, 3, 2, 2, 2, 1087, 798, 3, 2, 2, 2, 1087, 809, 3, 2, 2, 2, 1087, 820, 3, 2, 2, 2, 1087, 832, 3, 2, 2, 2, 1087, 842, 3, 2, 2, 2, 1087, 854, 3, 2, 2, 2, 1087, 859, 3, 2, 2, 2, 1087, 866, 3, 2, 2, 2, 1087, 873, 3, 2, 2, 2, 1087, 880, 3, 2, 2, 2, 1087, 887, 3, 2, 2, 2, 1087, 894, 3, 2, 2, 2, 1087, 903, 3, 2, 2, 2, 1087, 913, 3, 2, 2, 2, 1087, 921, 3, 2, 2, 2, 1087, 931, 3, 2, 2, 2, 1087, 941, 3, 2, 2, 2, 1087, 950, 3, 2, 2, 2, 1087, 956, 3, 2, 2, 2, 1087, 966, 3, 2, 2, 2, 1087, 973, 3, 2, 2, 2, 1087, 981, 3, 2, 2, 2, 1087, 992, 3, 2, 2, 2, 1087, 1004, 3, 2, 2, 2, 1087, 1010, 3, 2, 2, 2, 1087, 1017, 3, 2, 2, 2, 1087, 1027, 3, 2, 2, 2, 1087, 1034, 3, 2, 2, 2, 1087, 1045, 3, 2, 2, 2, 1087, 1053, 3, 2, 2, 2, 1087, 1059, 3, 2, 2, 2, 1087, 1070, 3, 2, 2, 2, 1088, 140, 3, 2, 2, 2, 1089, 1090, 5, 203, 100, 2, 1090, 1091, 5, 245, 121, 2, 1091, 1092, 5, 215, 106, 2, 1092, 1171, 3, 2, 2, 2, 1093, 1094, 5, 227, 112, 2, 1094, 1095, 5, 219, 108, 2, 1095, 1096, 5, 229, 113, 2, 1096, 1171, 3, 2, 2, 2, 1097, 1098, 5, 227, 112, 2, 1098, 1099, 5, 203, 100, 2, 1099, 1100, 5, 249, 123, 2, 1100, 1171, 3, 2, 2, 2, 1101, 1102, 5, 239, 118, 2, 1102, 1103, 5, 243, 120, 2, 1103, 1104, 5, 227, 112, 2, 1104, 1171, 3, 2, 2, 2, 1105, 1106, 5, 207, 102, 2, 1106, 1107, 5, 231, 114, 2, 1107, 1108, 5, 243, 120, 2, 1108, 1109, 5, 229, 113, 2, 1109, 1110, 5, 241, 119, 2, 1110, 1171, 3, 2, 2, 2, 1111, 1112, 5, 207, 102, 2, 1112, 1113, 5, 231, 114, 2, 1113, 1114, 5, 243, 120, 2, 1114, 1115, 5, 229, 113, 2, 1115, 1116, 5, 241, 119, 2, 1116, 1117, 5, 111, 54, 2, 1117, 1118, 5, 209, 103, 2, 1118, 1119, 5, 219, 108, 2, 1119, 1120, 5, 239, 118, 2, 1120, 1121, 5, 241, 119, 2, 1121, 1122, 5, 219, 108, 2, 1122, 1123, 5, 229, 113, 2, 1123, 1124, 5, 207, 102, 2, 1124, 1125, 5, 241, 119, 2, 1125, 1171, 3, 2, 2, 2, 1126, 1127, 5, 233, 115, 2, 1127, 1128, 5, 211, 104, 2, 1128, 1129, 5, 237, 117, 2, 1129, 1130, 5, 207, 102, 2, 1130, 1131, 5, 211, 104, 2, 1131, 1132, 5, 229, 113, 2, 1132, 1133, 5, 241, 119, 2, 1133, 1134, 5, 219, 108, 2, 1134, 1135, 5, 225, 111, 2, 1135, 1136, 5, 211, 104, 2, 1136, 1171, 3, 2, 2, 2, 1137, 1138, 5, 227, 112, 2, 1138, 1139, 5, 211, 104, 2, 1139, 1140, 5, 209, 103, 2, 1140, 1141, 5, 219, 108, 2, 1141, 1142, 5, 203, 100, 2, 1142, 1143, 5, 229, 113, 2, 1143, 1171, 3, 2, 2, 2, 1144, 1145, 5, 227, 112, 2, 1145, 1146, 5, 211, 104, 2, 1146, 1147, 5, 209, 103, 2, 1147, 1148, 5, 219, 108, 2, 1148, 1149, 5, 203, 100, 2, 1149, 1150, 5, 229, 113, 2, 1150, 1151, 5, 111, 54, 2, 1151, 1152, 5, 203, 100, 2, 1152, 1153, 5, 205, 101, 2, 1153, 1154, 5, 239, 118, 2, 1154, 1155, 5, 231, 114, 2, 1155, 1156, 5, 225, 111, 2, 1156, 1157, 5, 243, 120, 2, 1157, 1158, 5, 241, 119, 2, 1158, 1159, 5, 211, 104, 2, 1159, 1160, 5, 111, 54, 2, 1160, 1161, 5, 209, 103, 2, 1161, 1162, 5, 211, 104, 2, 1162, 1163, 5, 245, 121, 2, 1163, 1164, 5, 219, 108, 2, 1164, 1165, 5, 203, 100, 2, 1165, 1166, 5, 241, 119, 2, 1166, 1167, 5, 219, 108, 2, 1167, 1168, 5, 231, 114, 2, 1168, 1169, 5, 229, 113, 2, 1169, 1171, 3, 2, 2, 2, 1170, 1089, 3, 2, 2, 2, 1170, 1093, 3, 2, 2, 2, 1170, 1097, 3, 2, 2, 2, 1170, 1101, 3, 2, 2, 2, 1170, 1105, 3, 2, 2, 2, 1170, 1111, 3, 2, 2, 2, 1170, 1126, 3, 2, 2, 2, 1170, 1137, 3, 2, 2, 2, 1170, 1144, 3, 2, 2, 2, 1171, 142, 3, 2, 2, 2, 1172, 1173, 5, 207, 102, 2, 1173, 1174, 5, 219, 108, 2, 1174, 1175, 5, 209, 103, 2, 1175, 1176, 5, 237, 117, 2, 1176, 1177, 5, 111, 54, 2, 1177, 1178, 5, 227, 112, 2, 1178, 1179, 5, 203, 100, 2, 1179, 1180, 5, 241, 119, 2, 1180, 1181, 5, 207, 102, 2, 1181, 1182, 5, 217, 107, 2, 1182, 144, 3, 2, 2, 2, 1183, 1190, 5, 61, 29, 2, 1184, 1189, 5, 61, 29, 2, 1185, 1189, 5, 59, 28, 2, 1186, 1189, 7, 97, 2, 2, 1187, 1189, 5, 125, 61, 2, 1188, 1184, 3, 2, 2, 2, 1188, 1185, 3, 2, 2, 2, 1188, 1186, 3, 2, 2, 2, 1188, 1187, 3, 2, 2, 2, 1189, 1192, 3, 2, 2, 2, 1190, 1188, 3, 2, 2, 2, 1190, 1191, 3, 2, 2, 2, 1191, 1203, 3, 2, 2, 2, 1192, 1190, 3, 2, 2, 2, 1193, 1198, 9, 10, 2, 2, 1194, 1199, 5, 61, 29, 2, 1195, 1199, 5, 59, 28, 2, 1196, 1199, 7, 97, 2, 2, 1197, 1199, 5, 125, 61, 2, 1198, 1194, 3, 2, 2, 2, 1198, 1195, 3, 2, 2, 2, 1198, 1196, 3, 2, 2, 2, 1198, 1197, 3, 2, 2, 2, 1199, 1200, 3, 2, 2, 2, 1200, 1198, 3, 2, 2, 2, 1200, 1201, 3, 2, 2, 2, 1201, 1203, 3, 2, 2, 2, 1202, 1183, 3, 2, 2, 2, 1202, 1193, 3, 2, 2, 2, 1203, 146, 3, 2, 2, 2, 1204, 1210, 7, 98, 2, 2, 1205, 1209, 10, 11, 2, 2, 1206, 1207, 7, 98, 2, 2, 1207, 1209, 7, 98, 2, 2, 1208, 1205, 3, 2, 2, 2, 1208, 1206, 3, 2, 2, 2, 1209, 1212, 3, 2, 2, 2, 1210, 1208, 3, 2, 2, 2, 1210, 1211, 3, 2, 2, 2, 1211, 1213, 3, 2, 2, 2, 1212, 1210, 3, 2, 2, 2, 1213, 1214, 7, 98, 2, 2, 1214, 148, 3, 2, 2, 2, 1215, 1216, 5, 41, 19, 2, 1216, 1217, 3, 2, 2, 2, 1217, 1218, 8, 73, 6, 2, 1218, 150, 3, 2, 2, 2, 1219, 1220, 5, 43, 20, 2, 1220, 1221, 3, 2, 2, 2, 1221, 1222, 8, 74, 6, 2, 1222, 152, 3, 2, 2, 2, 1223, 1224, 5, 45, 21, 2, 1224, 1225, 3, 2, 2, 2, 1225, 1226, 8, 75, 6, 2, 1226, 154, 3, 2, 2, 2, 1227, 1228, 7, 126, 2, 2, 1228, 1229, 3, 2, 2, 2, 1229, 1230, 8, 76, 9, 2, 1230, 1231, 8, 76, 10, 2, 1231, 156, 3, 2, 2, 2, 1232, 1233, 7, 93, 2, 2, 1233, 1234, 3, 2, 2, 2, 1234, 1235, 8, 77, 7, 2, 1235, 1236, 8, 77, 4, 2, 1236, 1237, 8, 77, 4, 2, 1237, 158, 3, 2, 2, 2, 1238, 1239, 7, 95, 2, 2, 1239, 1240, 3, 2, 2, 2, 1240, 1241, 8, 78, 10, 2, 1241, 1242, 8, 78, 10, 2, 1242, 1243, 8, 78, 11, 2, 1243, 160, 3, 2, 2, 2, 1244, 1245, 7, 46, 2, 2, 1245, 1246, 3, 2, 2, 2, 1246, 1247, 8, 79, 12, 2, 1247, 162, 3, 2, 2, 2, 1248, 1249, 7, 63, 2, 2, 1249, 1250, 3, 2, 2, 2, 1250, 1251, 8, 80, 13, 2, 1251, 164, 3, 2, 2, 2, 1252, 1253, 5, 227, 112, 2, 1253, 1254, 5, 211, 104, 2, 1254, 1255, 5, 241, 119, 2, 1255, 1256, 5, 203, 100, 2, 1256, 1257, 5, 209, 103, 2, 1257, 1258, 5, 203, 100, 2, 1258, 1259, 5, 241, 119, 2, 1259, 1260, 5, 203, 100, 2, 1260, 166, 3, 2, 2, 2, 1261, 1263, 5, 169, 83, 2, 1262, 1261, 3, 2, 2, 2, 1263, 1264, 3, 2, 2, 2, 1264, 1262, 3, 2, 2, 2, 1264, 1265, 3, 2, 2, 2, 1265, 168, 3, 2, 2, 2, 1266, 1268, 10, 12, 2, 2, 1267, 1266, 3, 2, 2, 2, 1268, 1269, 3, 2, 2, 2, 1269, 1267, 3, 2, 2, 2, 1269, 1270, 3, 2, 2, 2, 1270, 1274, 3, 2, 2, 2, 1271, 1272, 7, 49, 2, 2, 1272, 1274, 10, 13, 2, 2, 1273, 1267, 3, 2, 2, 2, 1273, 1271, 3, 2, 2, 2, 1274, 170, 3, 2, 2, 2, 1275, 1276, 5, 147, 72, 2, 1276, 172, 3, 2, 2, 2, 1277, 1278, 5, 41, 19, 2, 1278, 1279, 3, 2, 2, 2, 1279, 1280, 8, 85, 6, 2, 1280, 174, 3, 2, 2, 2, 1281, 1282, 5, 43, 20, 2, 1282, 1283, 3, 2, 2, 2, 1283, 1284, 8, 86, 6, 2, 1284, 176, 3, 2, 2, 2, 1285, 1286, 5, 45, 21, 2, 1286, 1287, 3, 2, 2, 2, 1287, 1288, 8, 87, 6, 2, 1288, 178, 3, 2, 2, 2, 1289, 1290, 5, 231, 114, 2, 1290, 1291, 5, 229, 113, 2, 1291, 180, 3, 2, 2, 2, 1292, 1293, 5, 247, 122, 2, 1293, 1294, 5, 219, 108, 2, 1294, 1295, 5, 241, 119, 2, 1295, 1296, 5, 217, 107, 2, 1296, 182, 3, 2, 2, 2, 1297, 1298, 7, 126, 2, 2, 1298, 1299, 3, 2, 2, 2, 1299, 1300, 8, 90, 9, 2, 1300, 1301, 8, 90, 10, 2, 1301, 184, 3, 2, 2, 2, 1302, 1303, 7, 95, 2, 2, 1303, 1304, 3, 2, 2, 2, 1304, 1305, 8, 91, 10, 2, 1305, 1306, 8, 91, 10, 2, 1306, 1307, 8, 91, 11, 2, 1307, 186, 3, 2, 2, 2, 1308, 1309, 7, 46, 2, 2, 1309, 1310, 3, 2, 2, 2, 1310, 1311, 8, 92, 12, 2, 1311, 188, 3, 2, 2, 2, 1312, 1313, 7, 63, 2, 2, 1313, 1314, 3, 2, 2, 2, 1314, 1315, 8, 93, 13, 2, 1315, 190, 3, 2, 2, 2, 1316, 1318, 5, 193, 95, 2, 1317, 1316, 3, 2, 2, 2, 1318, 1319, 3, 2, 2, 2, 1319, 1317, 3, 2, 2, 2, 1319, 1320, 3, 2, 2, 2, 1320, 192, 3, 2, 2, 2, 1321, 1323, 10, 12, 2, 2, 1322, 1321, 3, 2, 2, 2, 1323, 1324, 3, 2, 2, 2, 1324, 1322, 3, 2, 2, 2, 1324, 1325, 3, 2, 2, 2, 1325, 1329, 3, 2, 2, 2, 1326, 1327, 7, 49, 2, 2, 1327, 1329, 10, 13, 2, 2, 1328, 1322, 3, 2, 2, 2, 1328, 1326, 3, 2, 2, 2, 1329, 194, 3, 2, 2, 2, 1330, 1331, 5, 147, 72, 2, 1331, 196, 3, 2, 2, 2, 1332, 1333, 5, 41, 19, 2, 1333, 1334, 3, 2, 2, 2, 1334, 1335, 8, 97, 6, 2, 1335, 198, 3, 2, 2, 2, 1336, 1337, 5, 43, 20, 2, 1337, 1338, 3, 2, 2, 2, 1338, 1339, 8, 98, 6, 2, 1339, 200, 3, 2, 2, 2, 1340, 1341, 5, 45, 21, 2, 1341, 1342, 3, 2, 2, 2, 1342, 1343, 8, 99, 6, 2, 1343, 202, 3, 2, 2, 2, 1344, 1345, 9, 14, 2, 2, 1345, 204, 3, 2, 2, 2, 1346, 1347, 9, 15, 2, 2, 1347, 206, 3, 2, 2, 2, 1348, 1349, 9, 16, 2, 2, 1349, 208, 3, 2, 2, 2, 1350, 1351, 9, 17, 2, 2, 1351, 210, 3, 2, 2, 2, 1352, 1353, 9, 8, 2, 2, 1353, 212, 3, 2, 2, 2, 1354, 1355, 9, 18, 2, 2, 1355, 214, 3, 2, 2, 2, 1356, 1357, 9, 19, 2, 2, 1357, 216, 3, 2, 2, 2, 1358, 1359, 9, 20, 2, 2, 1359, 218, 3, 2, 2, 2, 1360, 1361, 9, 21, 2, 2, 1361, 220, 3, 2, 2, 2, 1362, 1363, 9, 22, 2, 2, 1363, 222, 3, 2, 2, 2, 1364, 1365, 9, 23, 2, 2, 1365, 224, 3, 2, 2, 2, 1366, 1367, 9, 24, 2, 2, 1367, 226, 3, 2, 2, 2, 1368, 1369, 9, 25, 2, 2, 1369, 228, 3, 2, 2, 2, 1370, 1371, 9, 26, 2, 2, 1371, 230, 3, 2, 2, 2, 1372, 1373, 9, 27, 2, 2, 1373, 232, 3, 2, 2, 2, 1374, 1375, 9, 28, 2, 2, 1375, 234, 3, 2, 2, 2, 1376, 1377, 9, 29, 2, 2, 1377, 236, 3, 2, 2, 2, 1378, 1379, 9, 30, 2, 2, 1379, 238, 3, 2, 2, 2, 1380, 1381, 9, 31, 2, 2, 1381, 240, 3, 2, 2, 2, 1382, 1383, 9, 32, 2, 2, 1383, 242, 3, 2, 2, 2, 1384, 1385, 9, 33, 2, 2, 1385, 244, 3, 2, 2, 2, 1386, 1387, 9, 34, 2, 2, 1387, 246, 3, 2, 2, 2, 1388, 1389, 9, 35, 2, 2, 1389, 248, 3, 2, 2, 2, 1390, 1391, 9, 36, 2, 2, 1391, 250, 3, 2, 2, 2, 1392, 1393, 9, 37, 2, 2, 1393, 252, 3, 2, 2, 2, 1394, 1395, 9, 38, 2, 2, 1395, 254, 3, 2, 2, 2, 50, 2, 3, 4, 5, 6, 400, 404, 407, 416, 418, 429, 470, 475, 480, 482, 493, 501, 504, 506, 511, 516, 522, 529, 534, 540, 543, 551, 555, 588, 672, 684, 706, 723, 1087, 1170, 1188, 1190, 1198, 1200, 1202, 1208, 1210, 1264, 1269, 1273, 1319, 1324, 1328, 14, 7, 4, 2, 7, 3, 2, 7, 5, 2, 7, 6, 2, 2, 3, 2, 9, 37, 2, 7, 2, 2, 9, 26, 2, 6, 2, 2, 9, 38, 2, 9, 34, 2, 9, 33, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 83, 1462, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 399, 10, 19, 12, 19, 14, 19, 402, 11, 19, 3, 19, 5, 19, 405, 10, 19, 3, 19, 5, 19, 408, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 417, 10, 20, 12, 20, 14, 20, 420, 11, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 6, 21, 428, 10, 21, 13, 21, 14, 21, 429, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 471, 10, 32, 3, 32, 6, 32, 474, 10, 32, 13, 32, 14, 32, 475, 3, 33, 3, 33, 3, 33, 7, 33, 481, 10, 33, 12, 33, 14, 33, 484, 11, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 492, 10, 33, 12, 33, 14, 33, 495, 11, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 502, 10, 33, 3, 33, 5, 33, 505, 10, 33, 5, 33, 507, 10, 33, 3, 34, 6, 34, 510, 10, 34, 13, 34, 14, 34, 511, 3, 35, 6, 35, 515, 10, 35, 13, 35, 14, 35, 516, 3, 35, 3, 35, 7, 35, 521, 10, 35, 12, 35, 14, 35, 524, 11, 35, 3, 35, 3, 35, 6, 35, 528, 10, 35, 13, 35, 14, 35, 529, 3, 35, 6, 35, 533, 10, 35, 13, 35, 14, 35, 534, 3, 35, 3, 35, 7, 35, 539, 10, 35, 12, 35, 14, 35, 542, 11, 35, 5, 35, 544, 10, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 550, 10, 35, 13, 35, 14, 35, 551, 3, 35, 3, 35, 5, 35, 556, 10, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 655, 10, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 5, 57, 739, 10, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 5, 58, 751, 10, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 5, 65, 773, 10, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 790, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 5, 68, 1154, 10, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 5, 69, 1237, 10, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 7, 71, 1255, 10, 71, 12, 71, 14, 71, 1258, 11, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 6, 71, 1265, 10, 71, 13, 71, 14, 71, 1266, 5, 71, 1269, 10, 71, 3, 72, 3, 72, 3, 72, 3, 72, 7, 72, 1275, 10, 72, 12, 72, 14, 72, 1278, 11, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 6, 82, 1329, 10, 82, 13, 82, 14, 82, 1330, 3, 83, 6, 83, 1334, 10, 83, 13, 83, 14, 83, 1335, 3, 83, 3, 83, 5, 83, 1340, 10, 83, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 6, 94, 1384, 10, 94, 13, 94, 14, 94, 1385, 3, 95, 6, 95, 1389, 10, 95, 13, 95, 14, 95, 1390, 3, 95, 3, 95, 5, 95, 1395, 10, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 108, 3, 108, 3, 109, 3, 109, 3, 110, 3, 110, 3, 111, 3, 111, 3, 112, 3, 112, 3, 113, 3, 113, 3, 114, 3, 114, 3, 115, 3, 115, 3, 116, 3, 116, 3, 117, 3, 117, 3, 118, 3, 118, 3, 119, 3, 119, 3, 120, 3, 120, 3, 121, 3, 121, 3, 122, 3, 122, 3, 123, 3, 123, 3, 124, 3, 124, 3, 125, 3, 125, 4, 418, 493, 2, 2, 126, 7, 2, 3, 9, 2, 4, 11, 2, 5, 13, 2, 6, 15, 2, 7, 17, 2, 8, 19, 2, 9, 21, 2, 10, 23, 2, 11, 25, 2, 12, 27, 2, 13, 29, 2, 14, 31, 2, 15, 33, 2, 16, 35, 2, 17, 37, 2, 18, 39, 2, 19, 41, 2, 20, 43, 2, 21, 45, 2, 22, 47, 2, 2, 49, 2, 83, 51, 2, 23, 53, 2, 24, 55, 2, 25, 57, 2, 26, 59, 2, 2, 61, 2, 2, 63, 2, 2, 65, 2, 2, 67, 2, 2, 69, 2, 27, 71, 2, 28, 73, 2, 29, 75, 2, 30, 77, 2, 31, 79, 2, 32, 81, 2, 33, 83, 2, 34, 85, 2, 35, 87, 2, 36, 89, 2, 37, 91, 2, 38, 93, 2, 39, 95, 2, 40, 97, 2, 41, 99, 2, 42, 101, 2, 43, 103, 2, 44, 105, 2, 45, 107, 2, 46, 109, 2, 47, 111, 2, 48, 113, 2, 49, 115, 2, 50, 117, 2, 51, 119, 2, 52, 121, 2, 53, 123, 2, 54, 125, 2, 55, 127, 2, 56, 129, 2, 57, 131, 2, 58, 133, 2, 59, 135, 2, 60, 137, 2, 61, 139, 2, 62, 141, 2, 63, 143, 2, 64, 145, 2, 65, 147, 2, 66, 149, 2, 67, 151, 2, 68, 153, 2, 69, 155, 2, 2, 157, 2, 2, 159, 2, 2, 161, 2, 2, 163, 2, 2, 165, 2, 70, 167, 2, 71, 169, 2, 2, 171, 2, 72, 173, 2, 73, 175, 2, 74, 177, 2, 75, 179, 2, 76, 181, 2, 77, 183, 2, 2, 185, 2, 2, 187, 2, 2, 189, 2, 2, 191, 2, 78, 193, 2, 2, 195, 2, 79, 197, 2, 80, 199, 2, 81, 201, 2, 82, 203, 2, 2, 205, 2, 2, 207, 2, 2, 209, 2, 2, 211, 2, 2, 213, 2, 2, 215, 2, 2, 217, 2, 2, 219, 2, 2, 221, 2, 2, 223, 2, 2, 225, 2, 2, 227, 2, 2, 229, 2, 2, 231, 2, 2, 233, 2, 2, 235, 2, 2, 237, 2, 2, 239, 2, 2, 241, 2, 2, 243, 2, 2, 245, 2, 2, 247, 2, 2, 249, 2, 2, 251, 2, 2, 253, 2, 2, 7, 2, 3, 4, 5, 6, 39, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 7, 2, 36, 36, 94, 94, 112, 112, 116, 116, 118, 118, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 66, 66, 97, 97, 3, 2, 98, 98, 12, 2, 11, 12, 15, 15, 34, 34, 46, 46, 49, 49, 63, 63, 93, 93, 95, 95, 98, 98, 126, 126, 4, 2, 44, 44, 49, 49, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 1540, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 3, 47, 3, 2, 2, 2, 3, 49, 3, 2, 2, 2, 3, 51, 3, 2, 2, 2, 3, 53, 3, 2, 2, 2, 3, 55, 3, 2, 2, 2, 4, 57, 3, 2, 2, 2, 4, 69, 3, 2, 2, 2, 4, 71, 3, 2, 2, 2, 4, 73, 3, 2, 2, 2, 4, 75, 3, 2, 2, 2, 4, 77, 3, 2, 2, 2, 4, 79, 3, 2, 2, 2, 4, 81, 3, 2, 2, 2, 4, 83, 3, 2, 2, 2, 4, 85, 3, 2, 2, 2, 4, 87, 3, 2, 2, 2, 4, 89, 3, 2, 2, 2, 4, 91, 3, 2, 2, 2, 4, 93, 3, 2, 2, 2, 4, 95, 3, 2, 2, 2, 4, 97, 3, 2, 2, 2, 4, 99, 3, 2, 2, 2, 4, 101, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 4, 105, 3, 2, 2, 2, 4, 107, 3, 2, 2, 2, 4, 109, 3, 2, 2, 2, 4, 111, 3, 2, 2, 2, 4, 113, 3, 2, 2, 2, 4, 115, 3, 2, 2, 2, 4, 117, 3, 2, 2, 2, 4, 119, 3, 2, 2, 2, 4, 121, 3, 2, 2, 2, 4, 123, 3, 2, 2, 2, 4, 125, 3, 2, 2, 2, 4, 127, 3, 2, 2, 2, 4, 129, 3, 2, 2, 2, 4, 131, 3, 2, 2, 2, 4, 133, 3, 2, 2, 2, 4, 135, 3, 2, 2, 2, 4, 137, 3, 2, 2, 2, 4, 139, 3, 2, 2, 2, 4, 141, 3, 2, 2, 2, 4, 143, 3, 2, 2, 2, 4, 145, 3, 2, 2, 2, 4, 147, 3, 2, 2, 2, 4, 149, 3, 2, 2, 2, 4, 151, 3, 2, 2, 2, 4, 153, 3, 2, 2, 2, 5, 155, 3, 2, 2, 2, 5, 157, 3, 2, 2, 2, 5, 159, 3, 2, 2, 2, 5, 161, 3, 2, 2, 2, 5, 163, 3, 2, 2, 2, 5, 165, 3, 2, 2, 2, 5, 167, 3, 2, 2, 2, 5, 171, 3, 2, 2, 2, 5, 173, 3, 2, 2, 2, 5, 175, 3, 2, 2, 2, 5, 177, 3, 2, 2, 2, 6, 179, 3, 2, 2, 2, 6, 181, 3, 2, 2, 2, 6, 183, 3, 2, 2, 2, 6, 185, 3, 2, 2, 2, 6, 187, 3, 2, 2, 2, 6, 189, 3, 2, 2, 2, 6, 191, 3, 2, 2, 2, 6, 195, 3, 2, 2, 2, 6, 197, 3, 2, 2, 2, 6, 199, 3, 2, 2, 2, 6, 201, 3, 2, 2, 2, 7, 255, 3, 2, 2, 2, 9, 265, 3, 2, 2, 2, 11, 272, 3, 2, 2, 2, 13, 279, 3, 2, 2, 2, 15, 289, 3, 2, 2, 2, 17, 296, 3, 2, 2, 2, 19, 302, 3, 2, 2, 2, 21, 310, 3, 2, 2, 2, 23, 318, 3, 2, 2, 2, 25, 325, 3, 2, 2, 2, 27, 337, 3, 2, 2, 2, 29, 345, 3, 2, 2, 2, 31, 355, 3, 2, 2, 2, 33, 362, 3, 2, 2, 2, 35, 371, 3, 2, 2, 2, 37, 378, 3, 2, 2, 2, 39, 387, 3, 2, 2, 2, 41, 394, 3, 2, 2, 2, 43, 411, 3, 2, 2, 2, 45, 427, 3, 2, 2, 2, 47, 433, 3, 2, 2, 2, 49, 438, 3, 2, 2, 2, 51, 443, 3, 2, 2, 2, 53, 447, 3, 2, 2, 2, 55, 451, 3, 2, 2, 2, 57, 455, 3, 2, 2, 2, 59, 459, 3, 2, 2, 2, 61, 461, 3, 2, 2, 2, 63, 463, 3, 2, 2, 2, 65, 466, 3, 2, 2, 2, 67, 468, 3, 2, 2, 2, 69, 506, 3, 2, 2, 2, 71, 509, 3, 2, 2, 2, 73, 555, 3, 2, 2, 2, 75, 557, 3, 2, 2, 2, 77, 654, 3, 2, 2, 2, 79, 656, 3, 2, 2, 2, 81, 660, 3, 2, 2, 2, 83, 662, 3, 2, 2, 2, 85, 664, 3, 2, 2, 2, 87, 666, 3, 2, 2, 2, 89, 668, 3, 2, 2, 2, 91, 673, 3, 2, 2, 2, 93, 678, 3, 2, 2, 2, 95, 682, 3, 2, 2, 2, 97, 687, 3, 2, 2, 2, 99, 693, 3, 2, 2, 2, 101, 696, 3, 2, 2, 2, 103, 699, 3, 2, 2, 2, 105, 702, 3, 2, 2, 2, 107, 707, 3, 2, 2, 2, 109, 710, 3, 2, 2, 2, 111, 712, 3, 2, 2, 2, 113, 714, 3, 2, 2, 2, 115, 719, 3, 2, 2, 2, 117, 738, 3, 2, 2, 2, 119, 750, 3, 2, 2, 2, 121, 752, 3, 2, 2, 2, 123, 754, 3, 2, 2, 2, 125, 756, 3, 2, 2, 2, 127, 758, 3, 2, 2, 2, 129, 760, 3, 2, 2, 2, 131, 762, 3, 2, 2, 2, 133, 772, 3, 2, 2, 2, 135, 774, 3, 2, 2, 2, 137, 789, 3, 2, 2, 2, 139, 1153, 3, 2, 2, 2, 141, 1236, 3, 2, 2, 2, 143, 1238, 3, 2, 2, 2, 145, 1268, 3, 2, 2, 2, 147, 1270, 3, 2, 2, 2, 149, 1281, 3, 2, 2, 2, 151, 1285, 3, 2, 2, 2, 153, 1289, 3, 2, 2, 2, 155, 1293, 3, 2, 2, 2, 157, 1298, 3, 2, 2, 2, 159, 1304, 3, 2, 2, 2, 161, 1310, 3, 2, 2, 2, 163, 1314, 3, 2, 2, 2, 165, 1318, 3, 2, 2, 2, 167, 1328, 3, 2, 2, 2, 169, 1339, 3, 2, 2, 2, 171, 1341, 3, 2, 2, 2, 173, 1343, 3, 2, 2, 2, 175, 1347, 3, 2, 2, 2, 177, 1351, 3, 2, 2, 2, 179, 1355, 3, 2, 2, 2, 181, 1358, 3, 2, 2, 2, 183, 1363, 3, 2, 2, 2, 185, 1368, 3, 2, 2, 2, 187, 1374, 3, 2, 2, 2, 189, 1378, 3, 2, 2, 2, 191, 1383, 3, 2, 2, 2, 193, 1394, 3, 2, 2, 2, 195, 1396, 3, 2, 2, 2, 197, 1398, 3, 2, 2, 2, 199, 1402, 3, 2, 2, 2, 201, 1406, 3, 2, 2, 2, 203, 1410, 3, 2, 2, 2, 205, 1412, 3, 2, 2, 2, 207, 1414, 3, 2, 2, 2, 209, 1416, 3, 2, 2, 2, 211, 1418, 3, 2, 2, 2, 213, 1420, 3, 2, 2, 2, 215, 1422, 3, 2, 2, 2, 217, 1424, 3, 2, 2, 2, 219, 1426, 3, 2, 2, 2, 221, 1428, 3, 2, 2, 2, 223, 1430, 3, 2, 2, 2, 225, 1432, 3, 2, 2, 2, 227, 1434, 3, 2, 2, 2, 229, 1436, 3, 2, 2, 2, 231, 1438, 3, 2, 2, 2, 233, 1440, 3, 2, 2, 2, 235, 1442, 3, 2, 2, 2, 237, 1444, 3, 2, 2, 2, 239, 1446, 3, 2, 2, 2, 241, 1448, 3, 2, 2, 2, 243, 1450, 3, 2, 2, 2, 245, 1452, 3, 2, 2, 2, 247, 1454, 3, 2, 2, 2, 249, 1456, 3, 2, 2, 2, 251, 1458, 3, 2, 2, 2, 253, 1460, 3, 2, 2, 2, 255, 256, 5, 209, 103, 2, 256, 257, 5, 219, 108, 2, 257, 258, 5, 239, 118, 2, 258, 259, 5, 239, 118, 2, 259, 260, 5, 211, 104, 2, 260, 261, 5, 207, 102, 2, 261, 262, 5, 241, 119, 2, 262, 263, 3, 2, 2, 2, 263, 264, 8, 2, 2, 2, 264, 8, 3, 2, 2, 2, 265, 266, 5, 215, 106, 2, 266, 267, 5, 237, 117, 2, 267, 268, 5, 231, 114, 2, 268, 269, 5, 223, 110, 2, 269, 270, 3, 2, 2, 2, 270, 271, 8, 3, 2, 2, 271, 10, 3, 2, 2, 2, 272, 273, 5, 211, 104, 2, 273, 274, 5, 245, 121, 2, 274, 275, 5, 203, 100, 2, 275, 276, 5, 225, 111, 2, 276, 277, 3, 2, 2, 2, 277, 278, 8, 4, 2, 2, 278, 12, 3, 2, 2, 2, 279, 280, 5, 211, 104, 2, 280, 281, 5, 249, 123, 2, 281, 282, 5, 233, 115, 2, 282, 283, 5, 225, 111, 2, 283, 284, 5, 203, 100, 2, 284, 285, 5, 219, 108, 2, 285, 286, 5, 229, 113, 2, 286, 287, 3, 2, 2, 2, 287, 288, 8, 5, 3, 2, 288, 14, 3, 2, 2, 2, 289, 290, 5, 213, 105, 2, 290, 291, 5, 237, 117, 2, 291, 292, 5, 231, 114, 2, 292, 293, 5, 227, 112, 2, 293, 294, 3, 2, 2, 2, 294, 295, 8, 6, 4, 2, 295, 16, 3, 2, 2, 2, 296, 297, 5, 237, 117, 2, 297, 298, 5, 231, 114, 2, 298, 299, 5, 247, 122, 2, 299, 300, 3, 2, 2, 2, 300, 301, 8, 7, 2, 2, 301, 18, 3, 2, 2, 2, 302, 303, 5, 239, 118, 2, 303, 304, 5, 241, 119, 2, 304, 305, 5, 203, 100, 2, 305, 306, 5, 241, 119, 2, 306, 307, 5, 239, 118, 2, 307, 308, 3, 2, 2, 2, 308, 309, 8, 8, 2, 2, 309, 20, 3, 2, 2, 2, 310, 311, 5, 247, 122, 2, 311, 312, 5, 217, 107, 2, 312, 313, 5, 211, 104, 2, 313, 314, 5, 237, 117, 2, 314, 315, 5, 211, 104, 2, 315, 316, 3, 2, 2, 2, 316, 317, 8, 9, 2, 2, 317, 22, 3, 2, 2, 2, 318, 319, 5, 239, 118, 2, 319, 320, 5, 231, 114, 2, 320, 321, 5, 237, 117, 2, 321, 322, 5, 241, 119, 2, 322, 323, 3, 2, 2, 2, 323, 324, 8, 10, 2, 2, 324, 24, 3, 2, 2, 2, 325, 326, 5, 227, 112, 2, 326, 327, 5, 245, 121, 2, 327, 328, 5, 111, 54, 2, 328, 329, 5, 211, 104, 2, 329, 330, 5, 249, 123, 2, 330, 331, 5, 233, 115, 2, 331, 332, 5, 203, 100, 2, 332, 333, 5, 229, 113, 2, 333, 334, 5, 209, 103, 2, 334, 335, 3, 2, 2, 2, 335, 336, 8, 11, 2, 2, 336, 26, 3, 2, 2, 2, 337, 338, 5, 225, 111, 2, 338, 339, 5, 219, 108, 2, 339, 340, 5, 227, 112, 2, 340, 341, 5, 219, 108, 2, 341, 342, 5, 241, 119, 2, 342, 343, 3, 2, 2, 2, 343, 344, 8, 12, 2, 2, 344, 28, 3, 2, 2, 2, 345, 346, 5, 233, 115, 2, 346, 347, 5, 237, 117, 2, 347, 348, 5, 231, 114, 2, 348, 349, 5, 221, 109, 2, 349, 350, 5, 211, 104, 2, 350, 351, 5, 207, 102, 2, 351, 352, 5, 241, 119, 2, 352, 353, 3, 2, 2, 2, 353, 354, 8, 13, 2, 2, 354, 30, 3, 2, 2, 2, 355, 356, 5, 209, 103, 2, 356, 357, 5, 237, 117, 2, 357, 358, 5, 231, 114, 2, 358, 359, 5, 233, 115, 2, 359, 360, 3, 2, 2, 2, 360, 361, 8, 14, 2, 2, 361, 32, 3, 2, 2, 2, 362, 363, 5, 237, 117, 2, 363, 364, 5, 211, 104, 2, 364, 365, 5, 229, 113, 2, 365, 366, 5, 203, 100, 2, 366, 367, 5, 227, 112, 2, 367, 368, 5, 211, 104, 2, 368, 369, 3, 2, 2, 2, 369, 370, 8, 15, 2, 2, 370, 34, 3, 2, 2, 2, 371, 372, 5, 239, 118, 2, 372, 373, 5, 217, 107, 2, 373, 374, 5, 231, 114, 2, 374, 375, 5, 247, 122, 2, 375, 376, 3, 2, 2, 2, 376, 377, 8, 16, 2, 2, 377, 36, 3, 2, 2, 2, 378, 379, 5, 211, 104, 2, 379, 380, 5, 229, 113, 2, 380, 381, 5, 237, 117, 2, 381, 382, 5, 219, 108, 2, 382, 383, 5, 207, 102, 2, 383, 384, 5, 217, 107, 2, 384, 385, 3, 2, 2, 2, 385, 386, 8, 17, 5, 2, 386, 38, 3, 2, 2, 2, 387, 388, 5, 223, 110, 2, 388, 389, 5, 211, 104, 2, 389, 390, 5, 211, 104, 2, 390, 391, 5, 233, 115, 2, 391, 392, 3, 2, 2, 2, 392, 393, 8, 18, 2, 2, 393, 40, 3, 2, 2, 2, 394, 395, 7, 49, 2, 2, 395, 396, 7, 49, 2, 2, 396, 400, 3, 2, 2, 2, 397, 399, 10, 2, 2, 2, 398, 397, 3, 2, 2, 2, 399, 402, 3, 2, 2, 2, 400, 398, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 403, 405, 7, 15, 2, 2, 404, 403, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 407, 3, 2, 2, 2, 406, 408, 7, 12, 2, 2, 407, 406, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 410, 8, 19, 6, 2, 410, 42, 3, 2, 2, 2, 411, 412, 7, 49, 2, 2, 412, 413, 7, 44, 2, 2, 413, 418, 3, 2, 2, 2, 414, 417, 5, 43, 20, 2, 415, 417, 11, 2, 2, 2, 416, 414, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 419, 421, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 422, 7, 44, 2, 2, 422, 423, 7, 49, 2, 2, 423, 424, 3, 2, 2, 2, 424, 425, 8, 20, 6, 2, 425, 44, 3, 2, 2, 2, 426, 428, 9, 3, 2, 2, 427, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 431, 3, 2, 2, 2, 431, 432, 8, 21, 6, 2, 432, 46, 3, 2, 2, 2, 433, 434, 7, 93, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 8, 22, 7, 2, 436, 437, 8, 22, 8, 2, 437, 48, 3, 2, 2, 2, 438, 439, 7, 126, 2, 2, 439, 440, 3, 2, 2, 2, 440, 441, 8, 23, 9, 2, 441, 442, 8, 23, 10, 2, 442, 50, 3, 2, 2, 2, 443, 444, 5, 45, 21, 2, 444, 445, 3, 2, 2, 2, 445, 446, 8, 24, 6, 2, 446, 52, 3, 2, 2, 2, 447, 448, 5, 41, 19, 2, 448, 449, 3, 2, 2, 2, 449, 450, 8, 25, 6, 2, 450, 54, 3, 2, 2, 2, 451, 452, 5, 43, 20, 2, 452, 453, 3, 2, 2, 2, 453, 454, 8, 26, 6, 2, 454, 56, 3, 2, 2, 2, 455, 456, 7, 126, 2, 2, 456, 457, 3, 2, 2, 2, 457, 458, 8, 27, 10, 2, 458, 58, 3, 2, 2, 2, 459, 460, 9, 4, 2, 2, 460, 60, 3, 2, 2, 2, 461, 462, 9, 5, 2, 2, 462, 62, 3, 2, 2, 2, 463, 464, 7, 94, 2, 2, 464, 465, 9, 6, 2, 2, 465, 64, 3, 2, 2, 2, 466, 467, 10, 7, 2, 2, 467, 66, 3, 2, 2, 2, 468, 470, 9, 8, 2, 2, 469, 471, 9, 9, 2, 2, 470, 469, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 473, 3, 2, 2, 2, 472, 474, 5, 59, 28, 2, 473, 472, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 68, 3, 2, 2, 2, 477, 482, 7, 36, 2, 2, 478, 481, 5, 63, 30, 2, 479, 481, 5, 65, 31, 2, 480, 478, 3, 2, 2, 2, 480, 479, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 485, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 507, 7, 36, 2, 2, 486, 487, 7, 36, 2, 2, 487, 488, 7, 36, 2, 2, 488, 489, 7, 36, 2, 2, 489, 493, 3, 2, 2, 2, 490, 492, 10, 2, 2, 2, 491, 490, 3, 2, 2, 2, 492, 495, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 493, 491, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 496, 497, 7, 36, 2, 2, 497, 498, 7, 36, 2, 2, 498, 499, 7, 36, 2, 2, 499, 501, 3, 2, 2, 2, 500, 502, 7, 36, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 504, 3, 2, 2, 2, 503, 505, 7, 36, 2, 2, 504, 503, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 507, 3, 2, 2, 2, 506, 477, 3, 2, 2, 2, 506, 486, 3, 2, 2, 2, 507, 70, 3, 2, 2, 2, 508, 510, 5, 59, 28, 2, 509, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 509, 3, 2, 2, 2, 511, 512, 3, 2, 2, 2, 512, 72, 3, 2, 2, 2, 513, 515, 5, 59, 28, 2, 514, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 522, 5, 85, 41, 2, 519, 521, 5, 59, 28, 2, 520, 519, 3, 2, 2, 2, 521, 524, 3, 2, 2, 2, 522, 520, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 556, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 525, 527, 5, 85, 41, 2, 526, 528, 5, 59, 28, 2, 527, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 556, 3, 2, 2, 2, 531, 533, 5, 59, 28, 2, 532, 531, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 532, 3, 2, 2, 2, 534, 535, 3, 2, 2, 2, 535, 543, 3, 2, 2, 2, 536, 540, 5, 85, 41, 2, 537, 539, 5, 59, 28, 2, 538, 537, 3, 2, 2, 2, 539, 542, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 544, 3, 2, 2, 2, 542, 540, 3, 2, 2, 2, 543, 536, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 5, 67, 32, 2, 546, 556, 3, 2, 2, 2, 547, 549, 5, 85, 41, 2, 548, 550, 5, 59, 28, 2, 549, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 551, 552, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 554, 5, 67, 32, 2, 554, 556, 3, 2, 2, 2, 555, 514, 3, 2, 2, 2, 555, 525, 3, 2, 2, 2, 555, 532, 3, 2, 2, 2, 555, 547, 3, 2, 2, 2, 556, 74, 3, 2, 2, 2, 557, 558, 7, 100, 2, 2, 558, 559, 7, 123, 2, 2, 559, 76, 3, 2, 2, 2, 560, 561, 7, 123, 2, 2, 561, 562, 7, 103, 2, 2, 562, 563, 7, 99, 2, 2, 563, 655, 7, 116, 2, 2, 564, 565, 7, 111, 2, 2, 565, 566, 7, 113, 2, 2, 566, 567, 7, 112, 2, 2, 567, 568, 7, 118, 2, 2, 568, 655, 7, 106, 2, 2, 569, 570, 7, 102, 2, 2, 570, 571, 7, 99, 2, 2, 571, 655, 7, 123, 2, 2, 572, 573, 7, 117, 2, 2, 573, 574, 7, 103, 2, 2, 574, 575, 7, 101, 2, 2, 575, 576, 7, 113, 2, 2, 576, 577, 7, 112, 2, 2, 577, 655, 7, 102, 2, 2, 578, 579, 7, 111, 2, 2, 579, 580, 7, 107, 2, 2, 580, 581, 7, 112, 2, 2, 581, 582, 7, 119, 2, 2, 582, 583, 7, 118, 2, 2, 583, 655, 7, 103, 2, 2, 584, 585, 7, 106, 2, 2, 585, 586, 7, 113, 2, 2, 586, 587, 7, 119, 2, 2, 587, 655, 7, 116, 2, 2, 588, 589, 7, 121, 2, 2, 589, 590, 7, 103, 2, 2, 590, 591, 7, 103, 2, 2, 591, 655, 7, 109, 2, 2, 592, 593, 7, 111, 2, 2, 593, 594, 7, 107, 2, 2, 594, 595, 7, 110, 2, 2, 595, 596, 7, 110, 2, 2, 596, 597, 7, 107, 2, 2, 597, 598, 7, 117, 2, 2, 598, 599, 7, 103, 2, 2, 599, 600, 7, 101, 2, 2, 600, 601, 7, 113, 2, 2, 601, 602, 7, 112, 2, 2, 602, 655, 7, 102, 2, 2, 603, 604, 7, 123, 2, 2, 604, 605, 7, 103, 2, 2, 605, 606, 7, 99, 2, 2, 606, 607, 7, 116, 2, 2, 607, 655, 7, 117, 2, 2, 608, 609, 7, 111, 2, 2, 609, 610, 7, 113, 2, 2, 610, 611, 7, 112, 2, 2, 611, 612, 7, 118, 2, 2, 612, 613, 7, 106, 2, 2, 613, 655, 7, 117, 2, 2, 614, 615, 7, 102, 2, 2, 615, 616, 7, 99, 2, 2, 616, 617, 7, 123, 2, 2, 617, 655, 7, 117, 2, 2, 618, 619, 7, 117, 2, 2, 619, 620, 7, 103, 2, 2, 620, 621, 7, 101, 2, 2, 621, 622, 7, 113, 2, 2, 622, 623, 7, 112, 2, 2, 623, 624, 7, 102, 2, 2, 624, 655, 7, 117, 2, 2, 625, 626, 7, 111, 2, 2, 626, 627, 7, 107, 2, 2, 627, 628, 7, 112, 2, 2, 628, 629, 7, 119, 2, 2, 629, 630, 7, 118, 2, 2, 630, 631, 7, 103, 2, 2, 631, 655, 7, 117, 2, 2, 632, 633, 7, 106, 2, 2, 633, 634, 7, 113, 2, 2, 634, 635, 7, 119, 2, 2, 635, 636, 7, 116, 2, 2, 636, 655, 7, 117, 2, 2, 637, 638, 7, 121, 2, 2, 638, 639, 7, 103, 2, 2, 639, 640, 7, 103, 2, 2, 640, 641, 7, 109, 2, 2, 641, 655, 7, 117, 2, 2, 642, 643, 7, 111, 2, 2, 643, 644, 7, 107, 2, 2, 644, 645, 7, 110, 2, 2, 645, 646, 7, 110, 2, 2, 646, 647, 7, 107, 2, 2, 647, 648, 7, 117, 2, 2, 648, 649, 7, 103, 2, 2, 649, 650, 7, 101, 2, 2, 650, 651, 7, 113, 2, 2, 651, 652, 7, 112, 2, 2, 652, 653, 7, 102, 2, 2, 653, 655, 7, 117, 2, 2, 654, 560, 3, 2, 2, 2, 654, 564, 3, 2, 2, 2, 654, 569, 3, 2, 2, 2, 654, 572, 3, 2, 2, 2, 654, 578, 3, 2, 2, 2, 654, 584, 3, 2, 2, 2, 654, 588, 3, 2, 2, 2, 654, 592, 3, 2, 2, 2, 654, 603, 3, 2, 2, 2, 654, 608, 3, 2, 2, 2, 654, 614, 3, 2, 2, 2, 654, 618, 3, 2, 2, 2, 654, 625, 3, 2, 2, 2, 654, 632, 3, 2, 2, 2, 654, 637, 3, 2, 2, 2, 654, 642, 3, 2, 2, 2, 655, 78, 3, 2, 2, 2, 656, 657, 7, 99, 2, 2, 657, 658, 7, 112, 2, 2, 658, 659, 7, 102, 2, 2, 659, 80, 3, 2, 2, 2, 660, 661, 7, 63, 2, 2, 661, 82, 3, 2, 2, 2, 662, 663, 7, 46, 2, 2, 663, 84, 3, 2, 2, 2, 664, 665, 7, 48, 2, 2, 665, 86, 3, 2, 2, 2, 666, 667, 7, 42, 2, 2, 667, 88, 3, 2, 2, 2, 668, 669, 7, 93, 2, 2, 669, 670, 3, 2, 2, 2, 670, 671, 8, 43, 2, 2, 671, 672, 8, 43, 2, 2, 672, 90, 3, 2, 2, 2, 673, 674, 7, 95, 2, 2, 674, 675, 3, 2, 2, 2, 675, 676, 8, 44, 10, 2, 676, 677, 8, 44, 10, 2, 677, 92, 3, 2, 2, 2, 678, 679, 5, 229, 113, 2, 679, 680, 5, 231, 114, 2, 680, 681, 5, 241, 119, 2, 681, 94, 3, 2, 2, 2, 682, 683, 5, 225, 111, 2, 683, 684, 5, 219, 108, 2, 684, 685, 5, 223, 110, 2, 685, 686, 5, 211, 104, 2, 686, 96, 3, 2, 2, 2, 687, 688, 5, 237, 117, 2, 688, 689, 5, 225, 111, 2, 689, 690, 5, 219, 108, 2, 690, 691, 5, 223, 110, 2, 691, 692, 5, 211, 104, 2, 692, 98, 3, 2, 2, 2, 693, 694, 5, 219, 108, 2, 694, 695, 5, 229, 113, 2, 695, 100, 3, 2, 2, 2, 696, 697, 5, 219, 108, 2, 697, 698, 5, 239, 118, 2, 698, 102, 3, 2, 2, 2, 699, 700, 5, 203, 100, 2, 700, 701, 5, 239, 118, 2, 701, 104, 3, 2, 2, 2, 702, 703, 5, 229, 113, 2, 703, 704, 5, 243, 120, 2, 704, 705, 5, 225, 111, 2, 705, 706, 5, 225, 111, 2, 706, 106, 3, 2, 2, 2, 707, 708, 7, 113, 2, 2, 708, 709, 7, 116, 2, 2, 709, 108, 3, 2, 2, 2, 710, 711, 7, 43, 2, 2, 711, 110, 3, 2, 2, 2, 712, 713, 7, 97, 2, 2, 713, 112, 3, 2, 2, 2, 714, 715, 7, 107, 2, 2, 715, 716, 7, 112, 2, 2, 716, 717, 7, 104, 2, 2, 717, 718, 7, 113, 2, 2, 718, 114, 3, 2, 2, 2, 719, 720, 7, 104, 2, 2, 720, 721, 7, 119, 2, 2, 721, 722, 7, 112, 2, 2, 722, 723, 7, 101, 2, 2, 723, 724, 7, 118, 2, 2, 724, 725, 7, 107, 2, 2, 725, 726, 7, 113, 2, 2, 726, 727, 7, 112, 2, 2, 727, 728, 7, 117, 2, 2, 728, 116, 3, 2, 2, 2, 729, 730, 7, 118, 2, 2, 730, 731, 7, 116, 2, 2, 731, 732, 7, 119, 2, 2, 732, 739, 7, 103, 2, 2, 733, 734, 7, 104, 2, 2, 734, 735, 7, 99, 2, 2, 735, 736, 7, 110, 2, 2, 736, 737, 7, 117, 2, 2, 737, 739, 7, 103, 2, 2, 738, 729, 3, 2, 2, 2, 738, 733, 3, 2, 2, 2, 739, 118, 3, 2, 2, 2, 740, 741, 7, 63, 2, 2, 741, 751, 7, 63, 2, 2, 742, 743, 7, 35, 2, 2, 743, 751, 7, 63, 2, 2, 744, 751, 7, 62, 2, 2, 745, 746, 7, 62, 2, 2, 746, 751, 7, 63, 2, 2, 747, 751, 7, 64, 2, 2, 748, 749, 7, 64, 2, 2, 749, 751, 7, 63, 2, 2, 750, 740, 3, 2, 2, 2, 750, 742, 3, 2, 2, 2, 750, 744, 3, 2, 2, 2, 750, 745, 3, 2, 2, 2, 750, 747, 3, 2, 2, 2, 750, 748, 3, 2, 2, 2, 751, 120, 3, 2, 2, 2, 752, 753, 7, 45, 2, 2, 753, 122, 3, 2, 2, 2, 754, 755, 7, 47, 2, 2, 755, 124, 3, 2, 2, 2, 756, 757, 7, 44, 2, 2, 757, 126, 3, 2, 2, 2, 758, 759, 7, 49, 2, 2, 759, 128, 3, 2, 2, 2, 760, 761, 7, 39, 2, 2, 761, 130, 3, 2, 2, 2, 762, 763, 7, 51, 2, 2, 763, 764, 7, 50, 2, 2, 764, 132, 3, 2, 2, 2, 765, 766, 7, 99, 2, 2, 766, 767, 7, 117, 2, 2, 767, 773, 7, 101, 2, 2, 768, 769, 7, 102, 2, 2, 769, 770, 7, 103, 2, 2, 770, 771, 7, 117, 2, 2, 771, 773, 7, 101, 2, 2, 772, 765, 3, 2, 2, 2, 772, 768, 3, 2, 2, 2, 773, 134, 3, 2, 2, 2, 774, 775, 7, 112, 2, 2, 775, 776, 7, 119, 2, 2, 776, 777, 7, 110, 2, 2, 777, 778, 7, 110, 2, 2, 778, 779, 7, 117, 2, 2, 779, 136, 3, 2, 2, 2, 780, 781, 7, 104, 2, 2, 781, 782, 7, 107, 2, 2, 782, 783, 7, 116, 2, 2, 783, 784, 7, 117, 2, 2, 784, 790, 7, 118, 2, 2, 785, 786, 7, 110, 2, 2, 786, 787, 7, 99, 2, 2, 787, 788, 7, 117, 2, 2, 788, 790, 7, 118, 2, 2, 789, 780, 3, 2, 2, 2, 789, 785, 3, 2, 2, 2, 790, 138, 3, 2, 2, 2, 791, 792, 5, 237, 117, 2, 792, 793, 5, 231, 114, 2, 793, 794, 5, 243, 120, 2, 794, 795, 5, 229, 113, 2, 795, 796, 5, 209, 103, 2, 796, 1154, 3, 2, 2, 2, 797, 798, 5, 203, 100, 2, 798, 799, 5, 205, 101, 2, 799, 800, 5, 239, 118, 2, 800, 1154, 3, 2, 2, 2, 801, 802, 5, 233, 115, 2, 802, 803, 5, 231, 114, 2, 803, 804, 5, 247, 122, 2, 804, 1154, 3, 2, 2, 2, 805, 806, 5, 225, 111, 2, 806, 807, 5, 231, 114, 2, 807, 808, 5, 215, 106, 2, 808, 809, 5, 131, 64, 2, 809, 1154, 3, 2, 2, 2, 810, 811, 5, 233, 115, 2, 811, 812, 5, 219, 108, 2, 812, 1154, 3, 2, 2, 2, 813, 814, 5, 241, 119, 2, 814, 815, 5, 203, 100, 2, 815, 816, 5, 243, 120, 2, 816, 1154, 3, 2, 2, 2, 817, 1154, 5, 211, 104, 2, 818, 819, 5, 239, 118, 2, 819, 820, 5, 243, 120, 2, 820, 821, 5, 205, 101, 2, 821, 822, 5, 239, 118, 2, 822, 823, 5, 241, 119, 2, 823, 824, 5, 237, 117, 2, 824, 825, 5, 219, 108, 2, 825, 826, 5, 229, 113, 2, 826, 827, 5, 215, 106, 2, 827, 1154, 3, 2, 2, 2, 828, 829, 5, 241, 119, 2, 829, 830, 5, 237, 117, 2, 830, 831, 5, 219, 108, 2, 831, 832, 5, 227, 112, 2, 832, 1154, 3, 2, 2, 2, 833, 834, 5, 207, 102, 2, 834, 835, 5, 231, 114, 2, 835, 836, 5, 229, 113, 2, 836, 837, 5, 207, 102, 2, 837, 838, 5, 203, 100, 2, 838, 839, 5, 241, 119, 2, 839, 1154, 3, 2, 2, 2, 840, 841, 5, 239, 118, 2, 841, 842, 5, 241, 119, 2, 842, 843, 5, 203, 100, 2, 843, 844, 5, 237, 117, 2, 844, 845, 5, 241, 119, 2, 845, 846, 5, 239, 118, 2, 846, 847, 5, 111, 54, 2, 847, 848, 5, 247, 122, 2, 848, 849, 5, 219, 108, 2, 849, 850, 5, 241, 119, 2, 850, 851, 5, 217, 107, 2, 851, 1154, 3, 2, 2, 2, 852, 853, 5, 209, 103, 2, 853, 854, 5, 203, 100, 2, 854, 855, 5, 241, 119, 2, 855, 856, 5, 211, 104, 2, 856, 857, 5, 111, 54, 2, 857, 858, 5, 213, 105, 2, 858, 859, 5, 231, 114, 2, 859, 860, 5, 237, 117, 2, 860, 861, 5, 227, 112, 2, 861, 862, 5, 203, 100, 2, 862, 863, 5, 241, 119, 2, 863, 1154, 3, 2, 2, 2, 864, 865, 5, 209, 103, 2, 865, 866, 5, 203, 100, 2, 866, 867, 5, 241, 119, 2, 867, 868, 5, 211, 104, 2, 868, 869, 5, 111, 54, 2, 869, 870, 5, 241, 119, 2, 870, 871, 5, 237, 117, 2, 871, 872, 5, 243, 120, 2, 872, 873, 5, 229, 113, 2, 873, 874, 5, 207, 102, 2, 874, 1154, 3, 2, 2, 2, 875, 876, 5, 209, 103, 2, 876, 877, 5, 203, 100, 2, 877, 878, 5, 241, 119, 2, 878, 879, 5, 211, 104, 2, 879, 880, 5, 111, 54, 2, 880, 881, 5, 233, 115, 2, 881, 882, 5, 203, 100, 2, 882, 883, 5, 237, 117, 2, 883, 884, 5, 239, 118, 2, 884, 885, 5, 211, 104, 2, 885, 1154, 3, 2, 2, 2, 886, 887, 5, 203, 100, 2, 887, 888, 5, 243, 120, 2, 888, 889, 5, 241, 119, 2, 889, 890, 5, 231, 114, 2, 890, 891, 5, 111, 54, 2, 891, 892, 5, 205, 101, 2, 892, 893, 5, 243, 120, 2, 893, 894, 5, 207, 102, 2, 894, 895, 5, 223, 110, 2, 895, 896, 5, 211, 104, 2, 896, 897, 5, 241, 119, 2, 897, 1154, 3, 2, 2, 2, 898, 899, 5, 219, 108, 2, 899, 900, 5, 239, 118, 2, 900, 901, 5, 111, 54, 2, 901, 902, 5, 213, 105, 2, 902, 903, 5, 219, 108, 2, 903, 904, 5, 229, 113, 2, 904, 905, 5, 219, 108, 2, 905, 906, 5, 241, 119, 2, 906, 907, 5, 211, 104, 2, 907, 1154, 3, 2, 2, 2, 908, 909, 5, 219, 108, 2, 909, 910, 5, 239, 118, 2, 910, 911, 5, 111, 54, 2, 911, 912, 5, 219, 108, 2, 912, 913, 5, 229, 113, 2, 913, 914, 5, 213, 105, 2, 914, 915, 5, 219, 108, 2, 915, 916, 5, 229, 113, 2, 916, 917, 5, 219, 108, 2, 917, 918, 5, 241, 119, 2, 918, 919, 5, 211, 104, 2, 919, 1154, 3, 2, 2, 2, 920, 921, 5, 207, 102, 2, 921, 922, 5, 203, 100, 2, 922, 923, 5, 239, 118, 2, 923, 924, 5, 211, 104, 2, 924, 1154, 3, 2, 2, 2, 925, 926, 5, 225, 111, 2, 926, 927, 5, 211, 104, 2, 927, 928, 5, 229, 113, 2, 928, 929, 5, 215, 106, 2, 929, 930, 5, 241, 119, 2, 930, 931, 5, 217, 107, 2, 931, 1154, 3, 2, 2, 2, 932, 933, 5, 227, 112, 2, 933, 934, 5, 245, 121, 2, 934, 935, 5, 111, 54, 2, 935, 936, 5, 227, 112, 2, 936, 937, 5, 203, 100, 2, 937, 938, 5, 249, 123, 2, 938, 1154, 3, 2, 2, 2, 939, 940, 5, 227, 112, 2, 940, 941, 5, 245, 121, 2, 941, 942, 5, 111, 54, 2, 942, 943, 5, 227, 112, 2, 943, 944, 5, 219, 108, 2, 944, 945, 5, 229, 113, 2, 945, 1154, 3, 2, 2, 2, 946, 947, 5, 227, 112, 2, 947, 948, 5, 245, 121, 2, 948, 949, 5, 111, 54, 2, 949, 950, 5, 203, 100, 2, 950, 951, 5, 245, 121, 2, 951, 952, 5, 215, 106, 2, 952, 1154, 3, 2, 2, 2, 953, 954, 5, 227, 112, 2, 954, 955, 5, 245, 121, 2, 955, 956, 5, 111, 54, 2, 956, 957, 5, 239, 118, 2, 957, 958, 5, 243, 120, 2, 958, 959, 5, 227, 112, 2, 959, 1154, 3, 2, 2, 2, 960, 961, 5, 227, 112, 2, 961, 962, 5, 245, 121, 2, 962, 963, 5, 111, 54, 2, 963, 964, 5, 207, 102, 2, 964, 965, 5, 231, 114, 2, 965, 966, 5, 243, 120, 2, 966, 967, 5, 229, 113, 2, 967, 968, 5, 241, 119, 2, 968, 1154, 3, 2, 2, 2, 969, 970, 5, 227, 112, 2, 970, 971, 5, 245, 121, 2, 971, 972, 5, 111, 54, 2, 972, 973, 5, 207, 102, 2, 973, 974, 5, 231, 114, 2, 974, 975, 5, 229, 113, 2, 975, 976, 5, 207, 102, 2, 976, 977, 5, 203, 100, 2, 977, 978, 5, 241, 119, 2, 978, 1154, 3, 2, 2, 2, 979, 980, 5, 227, 112, 2, 980, 981, 5, 245, 121, 2, 981, 982, 5, 111, 54, 2, 982, 983, 5, 221, 109, 2, 983, 984, 5, 231, 114, 2, 984, 985, 5, 219, 108, 2, 985, 986, 5, 229, 113, 2, 986, 1154, 3, 2, 2, 2, 987, 988, 5, 227, 112, 2, 988, 989, 5, 245, 121, 2, 989, 990, 5, 111, 54, 2, 990, 991, 5, 227, 112, 2, 991, 992, 5, 211, 104, 2, 992, 993, 5, 209, 103, 2, 993, 994, 5, 219, 108, 2, 994, 995, 5, 203, 100, 2, 995, 996, 5, 229, 113, 2, 996, 1154, 3, 2, 2, 2, 997, 998, 5, 227, 112, 2, 998, 999, 5, 245, 121, 2, 999, 1000, 5, 111, 54, 2, 1000, 1001, 5, 209, 103, 2, 1001, 1002, 5, 211, 104, 2, 1002, 1003, 5, 209, 103, 2, 1003, 1004, 5, 243, 120, 2, 1004, 1005, 5, 233, 115, 2, 1005, 1006, 5, 211, 104, 2, 1006, 1154, 3, 2, 2, 2, 1007, 1008, 5, 227, 112, 2, 1008, 1009, 5, 211, 104, 2, 1009, 1010, 5, 241, 119, 2, 1010, 1011, 5, 203, 100, 2, 1011, 1012, 5, 209, 103, 2, 1012, 1013, 5, 203, 100, 2, 1013, 1014, 5, 241, 119, 2, 1014, 1015, 5, 203, 100, 2, 1015, 1154, 3, 2, 2, 2, 1016, 1017, 5, 239, 118, 2, 1017, 1018, 5, 233, 115, 2, 1018, 1019, 5, 225, 111, 2, 1019, 1020, 5, 219, 108, 2, 1020, 1021, 5, 241, 119, 2, 1021, 1154, 3, 2, 2, 2, 1022, 1023, 5, 241, 119, 2, 1023, 1024, 5, 231, 114, 2, 1024, 1025, 5, 111, 54, 2, 1025, 1026, 5, 239, 118, 2, 1026, 1027, 5, 241, 119, 2, 1027, 1028, 5, 237, 117, 2, 1028, 1029, 5, 219, 108, 2, 1029, 1030, 5, 229, 113, 2, 1030, 1031, 5, 215, 106, 2, 1031, 1154, 3, 2, 2, 2, 1032, 1033, 5, 241, 119, 2, 1033, 1034, 5, 231, 114, 2, 1034, 1035, 5, 111, 54, 2, 1035, 1036, 5, 239, 118, 2, 1036, 1037, 5, 241, 119, 2, 1037, 1038, 5, 237, 117, 2, 1038, 1154, 3, 2, 2, 2, 1039, 1040, 5, 241, 119, 2, 1040, 1041, 5, 231, 114, 2, 1041, 1042, 5, 111, 54, 2, 1042, 1043, 5, 205, 101, 2, 1043, 1044, 5, 231, 114, 2, 1044, 1045, 5, 231, 114, 2, 1045, 1046, 5, 225, 111, 2, 1046, 1154, 3, 2, 2, 2, 1047, 1048, 5, 241, 119, 2, 1048, 1049, 5, 231, 114, 2, 1049, 1050, 5, 111, 54, 2, 1050, 1051, 5, 205, 101, 2, 1051, 1052, 5, 231, 114, 2, 1052, 1053, 5, 231, 114, 2, 1053, 1054, 5, 225, 111, 2, 1054, 1055, 5, 211, 104, 2, 1055, 1056, 5, 203, 100, 2, 1056, 1057, 5, 229, 113, 2, 1057, 1154, 3, 2, 2, 2, 1058, 1059, 5, 241, 119, 2, 1059, 1060, 5, 231, 114, 2, 1060, 1061, 5, 111, 54, 2, 1061, 1062, 5, 209, 103, 2, 1062, 1063, 5, 203, 100, 2, 1063, 1064, 5, 241, 119, 2, 1064, 1065, 5, 211, 104, 2, 1065, 1066, 5, 241, 119, 2, 1066, 1067, 5, 219, 108, 2, 1067, 1068, 5, 227, 112, 2, 1068, 1069, 5, 211, 104, 2, 1069, 1154, 3, 2, 2, 2, 1070, 1071, 5, 241, 119, 2, 1071, 1072, 5, 231, 114, 2, 1072, 1073, 5, 111, 54, 2, 1073, 1074, 5, 209, 103, 2, 1074, 1075, 5, 241, 119, 2, 1075, 1154, 3, 2, 2, 2, 1076, 1077, 5, 241, 119, 2, 1077, 1078, 5, 231, 114, 2, 1078, 1079, 5, 111, 54, 2, 1079, 1080, 5, 209, 103, 2, 1080, 1081, 5, 205, 101, 2, 1081, 1082, 5, 225, 111, 2, 1082, 1154, 3, 2, 2, 2, 1083, 1084, 5, 241, 119, 2, 1084, 1085, 5, 231, 114, 2, 1085, 1086, 5, 111, 54, 2, 1086, 1087, 5, 209, 103, 2, 1087, 1088, 5, 231, 114, 2, 1088, 1089, 5, 243, 120, 2, 1089, 1090, 5, 205, 101, 2, 1090, 1091, 5, 225, 111, 2, 1091, 1092, 5, 211, 104, 2, 1092, 1154, 3, 2, 2, 2, 1093, 1094, 5, 241, 119, 2, 1094, 1095, 5, 231, 114, 2, 1095, 1096, 5, 111, 54, 2, 1096, 1097, 5, 219, 108, 2, 1097, 1098, 5, 229, 113, 2, 1098, 1099, 5, 241, 119, 2, 1099, 1154, 3, 2, 2, 2, 1100, 1101, 5, 241, 119, 2, 1101, 1102, 5, 231, 114, 2, 1102, 1103, 5, 111, 54, 2, 1103, 1104, 5, 219, 108, 2, 1104, 1105, 5, 229, 113, 2, 1105, 1106, 5, 241, 119, 2, 1106, 1107, 5, 211, 104, 2, 1107, 1108, 5, 215, 106, 2, 1108, 1109, 5, 211, 104, 2, 1109, 1110, 5, 237, 117, 2, 1110, 1154, 3, 2, 2, 2, 1111, 1112, 5, 241, 119, 2, 1112, 1113, 5, 231, 114, 2, 1113, 1114, 5, 111, 54, 2, 1114, 1115, 5, 225, 111, 2, 1115, 1116, 5, 231, 114, 2, 1116, 1117, 5, 229, 113, 2, 1117, 1118, 5, 215, 106, 2, 1118, 1154, 3, 2, 2, 2, 1119, 1120, 5, 241, 119, 2, 1120, 1121, 5, 231, 114, 2, 1121, 1122, 5, 111, 54, 2, 1122, 1123, 5, 219, 108, 2, 1123, 1124, 5, 233, 115, 2, 1124, 1154, 3, 2, 2, 2, 1125, 1126, 5, 241, 119, 2, 1126, 1127, 5, 231, 114, 2, 1127, 1128, 5, 111, 54, 2, 1128, 1129, 5, 245, 121, 2, 1129, 1130, 5, 211, 104, 2, 1130, 1131, 5, 237, 117, 2, 1131, 1132, 5, 239, 118, 2, 1132, 1133, 5, 219, 108, 2, 1133, 1134, 5, 231, 114, 2, 1134, 1135, 5, 229, 113, 2, 1135, 1154, 3, 2, 2, 2, 1136, 1137, 5, 241, 119, 2, 1137, 1138, 5, 231, 114, 2, 1138, 1139, 5, 111, 54, 2, 1139, 1140, 5, 243, 120, 2, 1140, 1141, 5, 229, 113, 2, 1141, 1142, 5, 239, 118, 2, 1142, 1143, 5, 219, 108, 2, 1143, 1144, 5, 215, 106, 2, 1144, 1145, 5, 229, 113, 2, 1145, 1146, 5, 211, 104, 2, 1146, 1147, 5, 209, 103, 2, 1147, 1148, 5, 111, 54, 2, 1148, 1149, 5, 225, 111, 2, 1149, 1150, 5, 231, 114, 2, 1150, 1151, 5, 229, 113, 2, 1151, 1152, 5, 215, 106, 2, 1152, 1154, 3, 2, 2, 2, 1153, 791, 3, 2, 2, 2, 1153, 797, 3, 2, 2, 2, 1153, 801, 3, 2, 2, 2, 1153, 805, 3, 2, 2, 2, 1153, 810, 3, 2, 2, 2, 1153, 813, 3, 2, 2, 2, 1153, 817, 3, 2, 2, 2, 1153, 818, 3, 2, 2, 2, 1153, 828, 3, 2, 2, 2, 1153, 833, 3, 2, 2, 2, 1153, 840, 3, 2, 2, 2, 1153, 852, 3, 2, 2, 2, 1153, 864, 3, 2, 2, 2, 1153, 875, 3, 2, 2, 2, 1153, 886, 3, 2, 2, 2, 1153, 898, 3, 2, 2, 2, 1153, 908, 3, 2, 2, 2, 1153, 920, 3, 2, 2, 2, 1153, 925, 3, 2, 2, 2, 1153, 932, 3, 2, 2, 2, 1153, 939, 3, 2, 2, 2, 1153, 946, 3, 2, 2, 2, 1153, 953, 3, 2, 2, 2, 1153, 960, 3, 2, 2, 2, 1153, 969, 3, 2, 2, 2, 1153, 979, 3, 2, 2, 2, 1153, 987, 3, 2, 2, 2, 1153, 997, 3, 2, 2, 2, 1153, 1007, 3, 2, 2, 2, 1153, 1016, 3, 2, 2, 2, 1153, 1022, 3, 2, 2, 2, 1153, 1032, 3, 2, 2, 2, 1153, 1039, 3, 2, 2, 2, 1153, 1047, 3, 2, 2, 2, 1153, 1058, 3, 2, 2, 2, 1153, 1070, 3, 2, 2, 2, 1153, 1076, 3, 2, 2, 2, 1153, 1083, 3, 2, 2, 2, 1153, 1093, 3, 2, 2, 2, 1153, 1100, 3, 2, 2, 2, 1153, 1111, 3, 2, 2, 2, 1153, 1119, 3, 2, 2, 2, 1153, 1125, 3, 2, 2, 2, 1153, 1136, 3, 2, 2, 2, 1154, 140, 3, 2, 2, 2, 1155, 1156, 5, 203, 100, 2, 1156, 1157, 5, 245, 121, 2, 1157, 1158, 5, 215, 106, 2, 1158, 1237, 3, 2, 2, 2, 1159, 1160, 5, 227, 112, 2, 1160, 1161, 5, 219, 108, 2, 1161, 1162, 5, 229, 113, 2, 1162, 1237, 3, 2, 2, 2, 1163, 1164, 5, 227, 112, 2, 1164, 1165, 5, 203, 100, 2, 1165, 1166, 5, 249, 123, 2, 1166, 1237, 3, 2, 2, 2, 1167, 1168, 5, 239, 118, 2, 1168, 1169, 5, 243, 120, 2, 1169, 1170, 5, 227, 112, 2, 1170, 1237, 3, 2, 2, 2, 1171, 1172, 5, 207, 102, 2, 1172, 1173, 5, 231, 114, 2, 1173, 1174, 5, 243, 120, 2, 1174, 1175, 5, 229, 113, 2, 1175, 1176, 5, 241, 119, 2, 1176, 1237, 3, 2, 2, 2, 1177, 1178, 5, 207, 102, 2, 1178, 1179, 5, 231, 114, 2, 1179, 1180, 5, 243, 120, 2, 1180, 1181, 5, 229, 113, 2, 1181, 1182, 5, 241, 119, 2, 1182, 1183, 5, 111, 54, 2, 1183, 1184, 5, 209, 103, 2, 1184, 1185, 5, 219, 108, 2, 1185, 1186, 5, 239, 118, 2, 1186, 1187, 5, 241, 119, 2, 1187, 1188, 5, 219, 108, 2, 1188, 1189, 5, 229, 113, 2, 1189, 1190, 5, 207, 102, 2, 1190, 1191, 5, 241, 119, 2, 1191, 1237, 3, 2, 2, 2, 1192, 1193, 5, 233, 115, 2, 1193, 1194, 5, 211, 104, 2, 1194, 1195, 5, 237, 117, 2, 1195, 1196, 5, 207, 102, 2, 1196, 1197, 5, 211, 104, 2, 1197, 1198, 5, 229, 113, 2, 1198, 1199, 5, 241, 119, 2, 1199, 1200, 5, 219, 108, 2, 1200, 1201, 5, 225, 111, 2, 1201, 1202, 5, 211, 104, 2, 1202, 1237, 3, 2, 2, 2, 1203, 1204, 5, 227, 112, 2, 1204, 1205, 5, 211, 104, 2, 1205, 1206, 5, 209, 103, 2, 1206, 1207, 5, 219, 108, 2, 1207, 1208, 5, 203, 100, 2, 1208, 1209, 5, 229, 113, 2, 1209, 1237, 3, 2, 2, 2, 1210, 1211, 5, 227, 112, 2, 1211, 1212, 5, 211, 104, 2, 1212, 1213, 5, 209, 103, 2, 1213, 1214, 5, 219, 108, 2, 1214, 1215, 5, 203, 100, 2, 1215, 1216, 5, 229, 113, 2, 1216, 1217, 5, 111, 54, 2, 1217, 1218, 5, 203, 100, 2, 1218, 1219, 5, 205, 101, 2, 1219, 1220, 5, 239, 118, 2, 1220, 1221, 5, 231, 114, 2, 1221, 1222, 5, 225, 111, 2, 1222, 1223, 5, 243, 120, 2, 1223, 1224, 5, 241, 119, 2, 1224, 1225, 5, 211, 104, 2, 1225, 1226, 5, 111, 54, 2, 1226, 1227, 5, 209, 103, 2, 1227, 1228, 5, 211, 104, 2, 1228, 1229, 5, 245, 121, 2, 1229, 1230, 5, 219, 108, 2, 1230, 1231, 5, 203, 100, 2, 1231, 1232, 5, 241, 119, 2, 1232, 1233, 5, 219, 108, 2, 1233, 1234, 5, 231, 114, 2, 1234, 1235, 5, 229, 113, 2, 1235, 1237, 3, 2, 2, 2, 1236, 1155, 3, 2, 2, 2, 1236, 1159, 3, 2, 2, 2, 1236, 1163, 3, 2, 2, 2, 1236, 1167, 3, 2, 2, 2, 1236, 1171, 3, 2, 2, 2, 1236, 1177, 3, 2, 2, 2, 1236, 1192, 3, 2, 2, 2, 1236, 1203, 3, 2, 2, 2, 1236, 1210, 3, 2, 2, 2, 1237, 142, 3, 2, 2, 2, 1238, 1239, 5, 207, 102, 2, 1239, 1240, 5, 219, 108, 2, 1240, 1241, 5, 209, 103, 2, 1241, 1242, 5, 237, 117, 2, 1242, 1243, 5, 111, 54, 2, 1243, 1244, 5, 227, 112, 2, 1244, 1245, 5, 203, 100, 2, 1245, 1246, 5, 241, 119, 2, 1246, 1247, 5, 207, 102, 2, 1247, 1248, 5, 217, 107, 2, 1248, 144, 3, 2, 2, 2, 1249, 1256, 5, 61, 29, 2, 1250, 1255, 5, 61, 29, 2, 1251, 1255, 5, 59, 28, 2, 1252, 1255, 7, 97, 2, 2, 1253, 1255, 5, 125, 61, 2, 1254, 1250, 3, 2, 2, 2, 1254, 1251, 3, 2, 2, 2, 1254, 1252, 3, 2, 2, 2, 1254, 1253, 3, 2, 2, 2, 1255, 1258, 3, 2, 2, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1257, 3, 2, 2, 2, 1257, 1269, 3, 2, 2, 2, 1258, 1256, 3, 2, 2, 2, 1259, 1264, 9, 10, 2, 2, 1260, 1265, 5, 61, 29, 2, 1261, 1265, 5, 59, 28, 2, 1262, 1265, 7, 97, 2, 2, 1263, 1265, 5, 125, 61, 2, 1264, 1260, 3, 2, 2, 2, 1264, 1261, 3, 2, 2, 2, 1264, 1262, 3, 2, 2, 2, 1264, 1263, 3, 2, 2, 2, 1265, 1266, 3, 2, 2, 2, 1266, 1264, 3, 2, 2, 2, 1266, 1267, 3, 2, 2, 2, 1267, 1269, 3, 2, 2, 2, 1268, 1249, 3, 2, 2, 2, 1268, 1259, 3, 2, 2, 2, 1269, 146, 3, 2, 2, 2, 1270, 1276, 7, 98, 2, 2, 1271, 1275, 10, 11, 2, 2, 1272, 1273, 7, 98, 2, 2, 1273, 1275, 7, 98, 2, 2, 1274, 1271, 3, 2, 2, 2, 1274, 1272, 3, 2, 2, 2, 1275, 1278, 3, 2, 2, 2, 1276, 1274, 3, 2, 2, 2, 1276, 1277, 3, 2, 2, 2, 1277, 1279, 3, 2, 2, 2, 1278, 1276, 3, 2, 2, 2, 1279, 1280, 7, 98, 2, 2, 1280, 148, 3, 2, 2, 2, 1281, 1282, 5, 41, 19, 2, 1282, 1283, 3, 2, 2, 2, 1283, 1284, 8, 73, 6, 2, 1284, 150, 3, 2, 2, 2, 1285, 1286, 5, 43, 20, 2, 1286, 1287, 3, 2, 2, 2, 1287, 1288, 8, 74, 6, 2, 1288, 152, 3, 2, 2, 2, 1289, 1290, 5, 45, 21, 2, 1290, 1291, 3, 2, 2, 2, 1291, 1292, 8, 75, 6, 2, 1292, 154, 3, 2, 2, 2, 1293, 1294, 7, 126, 2, 2, 1294, 1295, 3, 2, 2, 2, 1295, 1296, 8, 76, 9, 2, 1296, 1297, 8, 76, 10, 2, 1297, 156, 3, 2, 2, 2, 1298, 1299, 7, 93, 2, 2, 1299, 1300, 3, 2, 2, 2, 1300, 1301, 8, 77, 7, 2, 1301, 1302, 8, 77, 4, 2, 1302, 1303, 8, 77, 4, 2, 1303, 158, 3, 2, 2, 2, 1304, 1305, 7, 95, 2, 2, 1305, 1306, 3, 2, 2, 2, 1306, 1307, 8, 78, 10, 2, 1307, 1308, 8, 78, 10, 2, 1308, 1309, 8, 78, 11, 2, 1309, 160, 3, 2, 2, 2, 1310, 1311, 7, 46, 2, 2, 1311, 1312, 3, 2, 2, 2, 1312, 1313, 8, 79, 12, 2, 1313, 162, 3, 2, 2, 2, 1314, 1315, 7, 63, 2, 2, 1315, 1316, 3, 2, 2, 2, 1316, 1317, 8, 80, 13, 2, 1317, 164, 3, 2, 2, 2, 1318, 1319, 5, 227, 112, 2, 1319, 1320, 5, 211, 104, 2, 1320, 1321, 5, 241, 119, 2, 1321, 1322, 5, 203, 100, 2, 1322, 1323, 5, 209, 103, 2, 1323, 1324, 5, 203, 100, 2, 1324, 1325, 5, 241, 119, 2, 1325, 1326, 5, 203, 100, 2, 1326, 166, 3, 2, 2, 2, 1327, 1329, 5, 169, 83, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1328, 3, 2, 2, 2, 1330, 1331, 3, 2, 2, 2, 1331, 168, 3, 2, 2, 2, 1332, 1334, 10, 12, 2, 2, 1333, 1332, 3, 2, 2, 2, 1334, 1335, 3, 2, 2, 2, 1335, 1333, 3, 2, 2, 2, 1335, 1336, 3, 2, 2, 2, 1336, 1340, 3, 2, 2, 2, 1337, 1338, 7, 49, 2, 2, 1338, 1340, 10, 13, 2, 2, 1339, 1333, 3, 2, 2, 2, 1339, 1337, 3, 2, 2, 2, 1340, 170, 3, 2, 2, 2, 1341, 1342, 5, 147, 72, 2, 1342, 172, 3, 2, 2, 2, 1343, 1344, 5, 41, 19, 2, 1344, 1345, 3, 2, 2, 2, 1345, 1346, 8, 85, 6, 2, 1346, 174, 3, 2, 2, 2, 1347, 1348, 5, 43, 20, 2, 1348, 1349, 3, 2, 2, 2, 1349, 1350, 8, 86, 6, 2, 1350, 176, 3, 2, 2, 2, 1351, 1352, 5, 45, 21, 2, 1352, 1353, 3, 2, 2, 2, 1353, 1354, 8, 87, 6, 2, 1354, 178, 3, 2, 2, 2, 1355, 1356, 5, 231, 114, 2, 1356, 1357, 5, 229, 113, 2, 1357, 180, 3, 2, 2, 2, 1358, 1359, 5, 247, 122, 2, 1359, 1360, 5, 219, 108, 2, 1360, 1361, 5, 241, 119, 2, 1361, 1362, 5, 217, 107, 2, 1362, 182, 3, 2, 2, 2, 1363, 1364, 7, 126, 2, 2, 1364, 1365, 3, 2, 2, 2, 1365, 1366, 8, 90, 9, 2, 1366, 1367, 8, 90, 10, 2, 1367, 184, 3, 2, 2, 2, 1368, 1369, 7, 95, 2, 2, 1369, 1370, 3, 2, 2, 2, 1370, 1371, 8, 91, 10, 2, 1371, 1372, 8, 91, 10, 2, 1372, 1373, 8, 91, 11, 2, 1373, 186, 3, 2, 2, 2, 1374, 1375, 7, 46, 2, 2, 1375, 1376, 3, 2, 2, 2, 1376, 1377, 8, 92, 12, 2, 1377, 188, 3, 2, 2, 2, 1378, 1379, 7, 63, 2, 2, 1379, 1380, 3, 2, 2, 2, 1380, 1381, 8, 93, 13, 2, 1381, 190, 3, 2, 2, 2, 1382, 1384, 5, 193, 95, 2, 1383, 1382, 3, 2, 2, 2, 1384, 1385, 3, 2, 2, 2, 1385, 1383, 3, 2, 2, 2, 1385, 1386, 3, 2, 2, 2, 1386, 192, 3, 2, 2, 2, 1387, 1389, 10, 12, 2, 2, 1388, 1387, 3, 2, 2, 2, 1389, 1390, 3, 2, 2, 2, 1390, 1388, 3, 2, 2, 2, 1390, 1391, 3, 2, 2, 2, 1391, 1395, 3, 2, 2, 2, 1392, 1393, 7, 49, 2, 2, 1393, 1395, 10, 13, 2, 2, 1394, 1388, 3, 2, 2, 2, 1394, 1392, 3, 2, 2, 2, 1395, 194, 3, 2, 2, 2, 1396, 1397, 5, 147, 72, 2, 1397, 196, 3, 2, 2, 2, 1398, 1399, 5, 41, 19, 2, 1399, 1400, 3, 2, 2, 2, 1400, 1401, 8, 97, 6, 2, 1401, 198, 3, 2, 2, 2, 1402, 1403, 5, 43, 20, 2, 1403, 1404, 3, 2, 2, 2, 1404, 1405, 8, 98, 6, 2, 1405, 200, 3, 2, 2, 2, 1406, 1407, 5, 45, 21, 2, 1407, 1408, 3, 2, 2, 2, 1408, 1409, 8, 99, 6, 2, 1409, 202, 3, 2, 2, 2, 1410, 1411, 9, 14, 2, 2, 1411, 204, 3, 2, 2, 2, 1412, 1413, 9, 15, 2, 2, 1413, 206, 3, 2, 2, 2, 1414, 1415, 9, 16, 2, 2, 1415, 208, 3, 2, 2, 2, 1416, 1417, 9, 17, 2, 2, 1417, 210, 3, 2, 2, 2, 1418, 1419, 9, 8, 2, 2, 1419, 212, 3, 2, 2, 2, 1420, 1421, 9, 18, 2, 2, 1421, 214, 3, 2, 2, 2, 1422, 1423, 9, 19, 2, 2, 1423, 216, 3, 2, 2, 2, 1424, 1425, 9, 20, 2, 2, 1425, 218, 3, 2, 2, 2, 1426, 1427, 9, 21, 2, 2, 1427, 220, 3, 2, 2, 2, 1428, 1429, 9, 22, 2, 2, 1429, 222, 3, 2, 2, 2, 1430, 1431, 9, 23, 2, 2, 1431, 224, 3, 2, 2, 2, 1432, 1433, 9, 24, 2, 2, 1433, 226, 3, 2, 2, 2, 1434, 1435, 9, 25, 2, 2, 1435, 228, 3, 2, 2, 2, 1436, 1437, 9, 26, 2, 2, 1437, 230, 3, 2, 2, 2, 1438, 1439, 9, 27, 2, 2, 1439, 232, 3, 2, 2, 2, 1440, 1441, 9, 28, 2, 2, 1441, 234, 3, 2, 2, 2, 1442, 1443, 9, 29, 2, 2, 1443, 236, 3, 2, 2, 2, 1444, 1445, 9, 30, 2, 2, 1445, 238, 3, 2, 2, 2, 1446, 1447, 9, 31, 2, 2, 1447, 240, 3, 2, 2, 2, 1448, 1449, 9, 32, 2, 2, 1449, 242, 3, 2, 2, 2, 1450, 1451, 9, 33, 2, 2, 1451, 244, 3, 2, 2, 2, 1452, 1453, 9, 34, 2, 2, 1453, 246, 3, 2, 2, 2, 1454, 1455, 9, 35, 2, 2, 1455, 248, 3, 2, 2, 2, 1456, 1457, 9, 36, 2, 2, 1457, 250, 3, 2, 2, 2, 1458, 1459, 9, 37, 2, 2, 1459, 252, 3, 2, 2, 2, 1460, 1461, 9, 38, 2, 2, 1461, 254, 3, 2, 2, 2, 50, 2, 3, 4, 5, 6, 400, 404, 407, 416, 418, 429, 470, 475, 480, 482, 493, 501, 504, 506, 511, 516, 522, 529, 534, 540, 543, 551, 555, 654, 738, 750, 772, 789, 1153, 1236, 1254, 1256, 1264, 1266, 1268, 1274, 1276, 1330, 1335, 1339, 1385, 1390, 1394, 14, 7, 4, 2, 7, 3, 2, 7, 5, 2, 7, 6, 2, 2, 3, 2, 9, 37, 2, 7, 2, 2, 9, 26, 2, 6, 2, 2, 9, 38, 2, 9, 34, 2, 9, 33, 2] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts index 6d8ddeb0f848e..890be82c6bade 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts @@ -195,7 +195,7 @@ export class esql_lexer extends Lexer { private static readonly _serializedATNSegments: number = 3; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02S\u0574\b\x01" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02S\u05B6\b\x01" + "\b\x01\b\x01\b\x01\b\x01\x04\x02\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04" + "\x05\t\x05\x04\x06\t\x06\x04\x07\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04" + "\v\t\v\x04\f\t\f\x04\r\t\r\x04\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04" + @@ -245,18 +245,22 @@ export class esql_lexer extends Lexer { "\n#\x03#\x03#\x03#\x03#\x06#\u0226\n#\r#\x0E#\u0227\x03#\x03#\x05#\u022C" + "\n#\x03$\x03$\x03$\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03" + "%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03" + - "%\x03%\x03%\x03%\x05%\u024D\n%\x03&\x03&\x03&\x03&\x03\'\x03\'\x03(\x03" + - "(\x03)\x03)\x03*\x03*\x03+\x03+\x03+\x03+\x03+\x03,\x03,\x03,\x03,\x03" + - ",\x03-\x03-\x03-\x03-\x03.\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03" + - "/\x03/\x030\x030\x030\x031\x031\x031\x032\x032\x032\x033\x033\x033\x03" + - "3\x033\x034\x034\x034\x035\x035\x036\x036\x037\x037\x037\x037\x037\x03" + - "8\x038\x038\x038\x038\x038\x038\x038\x038\x038\x039\x039\x039\x039\x03" + - "9\x039\x039\x039\x039\x059\u02A1\n9\x03:\x03:\x03:\x03:\x03:\x03:\x03" + - ":\x03:\x03:\x03:\x05:\u02AD\n:\x03;\x03;\x03<\x03<\x03=\x03=\x03>\x03" + - ">\x03?\x03?\x03@\x03@\x03@\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x05A\u02C3" + - "\nA\x03B\x03B\x03B\x03B\x03B\x03B\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03" + - "C\x03C\x05C\u02D4\nC\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + - "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + + "%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03" + + "%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03" + + "%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03" + + "%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03" + + "%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x03%\x05" + + "%\u028F\n%\x03&\x03&\x03&\x03&\x03\'\x03\'\x03(\x03(\x03)\x03)\x03*\x03" + + "*\x03+\x03+\x03+\x03+\x03+\x03,\x03,\x03,\x03,\x03,\x03-\x03-\x03-\x03" + + "-\x03.\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x030\x030\x03" + + "0\x031\x031\x031\x032\x032\x032\x033\x033\x033\x033\x033\x034\x034\x03" + + "4\x035\x035\x036\x036\x037\x037\x037\x037\x037\x038\x038\x038\x038\x03" + + "8\x038\x038\x038\x038\x038\x039\x039\x039\x039\x039\x039\x039\x039\x03" + + "9\x059\u02E3\n9\x03:\x03:\x03:\x03:\x03:\x03:\x03:\x03:\x03:\x03:\x05" + + ":\u02EF\n:\x03;\x03;\x03<\x03<\x03=\x03=\x03>\x03>\x03?\x03?\x03@\x03" + + "@\x03@\x03A\x03A\x03A\x03A\x03A\x03A\x03A\x05A\u0305\nA\x03B\x03B\x03" + + "B\x03B\x03B\x03B\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x05C\u0316" + + "\nC\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + @@ -281,141 +285,142 @@ export class esql_lexer extends Lexer { "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + - "D\x03D\x03D\x05D\u0440\nD\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" + - "E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" + + "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x05D\u0482" + + "\nD\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" + "E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" + "E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" + "E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" + "E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03" + - "E\x03E\x03E\x05E\u0493\nE\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03" + - "F\x03F\x03F\x03G\x03G\x03G\x03G\x03G\x07G\u04A5\nG\fG\x0EG\u04A8\vG\x03" + - "G\x03G\x03G\x03G\x03G\x06G\u04AF\nG\rG\x0EG\u04B0\x05G\u04B3\nG\x03H\x03" + - "H\x03H\x03H\x07H\u04B9\nH\fH\x0EH\u04BC\vH\x03H\x03H\x03I\x03I\x03I\x03" + - "I\x03J\x03J\x03J\x03J\x03K\x03K\x03K\x03K\x03L\x03L\x03L\x03L\x03L\x03" + - "M\x03M\x03M\x03M\x03M\x03M\x03N\x03N\x03N\x03N\x03N\x03N\x03O\x03O\x03" + - "O\x03O\x03P\x03P\x03P\x03P\x03Q\x03Q\x03Q\x03Q\x03Q\x03Q\x03Q\x03Q\x03" + - "Q\x03R\x06R\u04EF\nR\rR\x0ER\u04F0\x03S\x06S\u04F4\nS\rS\x0ES\u04F5\x03" + - "S\x03S\x05S\u04FA\nS\x03T\x03T\x03U\x03U\x03U\x03U\x03V\x03V\x03V\x03" + - "V\x03W\x03W\x03W\x03W\x03X\x03X\x03X\x03Y\x03Y\x03Y\x03Y\x03Y\x03Z\x03" + - "Z\x03Z\x03Z\x03Z\x03[\x03[\x03[\x03[\x03[\x03[\x03\\\x03\\\x03\\\x03\\" + - "\x03]\x03]\x03]\x03]\x03^\x06^\u0526\n^\r^\x0E^\u0527\x03_\x06_\u052B" + - "\n_\r_\x0E_\u052C\x03_\x03_\x05_\u0531\n_\x03`\x03`\x03a\x03a\x03a\x03" + - "a\x03b\x03b\x03b\x03b\x03c\x03c\x03c\x03c\x03d\x03d\x03e\x03e\x03f\x03" + - "f\x03g\x03g\x03h\x03h\x03i\x03i\x03j\x03j\x03k\x03k\x03l\x03l\x03m\x03" + - "m\x03n\x03n\x03o\x03o\x03p\x03p\x03q\x03q\x03r\x03r\x03s\x03s\x03t\x03" + - "t\x03u\x03u\x03v\x03v\x03w\x03w\x03x\x03x\x03y\x03y\x03z\x03z\x03{\x03" + - "{\x03|\x03|\x03}\x03}\x04\u01A2\u01ED\x02\x02~\x07\x02\x03\t\x02\x04\v" + - "\x02\x05\r\x02\x06\x0F\x02\x07\x11\x02\b\x13\x02\t\x15\x02\n\x17\x02\v" + - "\x19\x02\f\x1B\x02\r\x1D\x02\x0E\x1F\x02\x0F!\x02\x10#\x02\x11%\x02\x12" + - "\'\x02\x13)\x02\x14+\x02\x15-\x02\x16/\x02\x021\x02S3\x02\x175\x02\x18" + - "7\x02\x199\x02\x1A;\x02\x02=\x02\x02?\x02\x02A\x02\x02C\x02\x02E\x02\x1B" + - "G\x02\x1CI\x02\x1DK\x02\x1EM\x02\x1FO\x02 Q\x02!S\x02\"U\x02#W\x02$Y\x02" + - "%[\x02&]\x02\'_\x02(a\x02)c\x02*e\x02+g\x02,i\x02-k\x02.m\x02/o\x020q" + - "\x021s\x022u\x023w\x024y\x025{\x026}\x027\x7F\x028\x81\x029\x83\x02:\x85" + - "\x02;\x87\x02<\x89\x02=\x8B\x02>\x8D\x02?\x8F\x02@\x91\x02A\x93\x02B\x95" + - "\x02C\x97\x02D\x99\x02E\x9B\x02\x02\x9D\x02\x02\x9F\x02\x02\xA1\x02\x02" + - "\xA3\x02\x02\xA5\x02F\xA7\x02G\xA9\x02\x02\xAB\x02H\xAD\x02I\xAF\x02J" + - "\xB1\x02K\xB3\x02L\xB5\x02M\xB7\x02\x02\xB9\x02\x02\xBB\x02\x02\xBD\x02" + - "\x02\xBF\x02N\xC1\x02\x02\xC3\x02O\xC5\x02P\xC7\x02Q\xC9\x02R\xCB\x02" + - "\x02\xCD\x02\x02\xCF\x02\x02\xD1\x02\x02\xD3\x02\x02\xD5\x02\x02\xD7\x02" + - "\x02\xD9\x02\x02\xDB\x02\x02\xDD\x02\x02\xDF\x02\x02\xE1\x02\x02\xE3\x02" + - "\x02\xE5\x02\x02\xE7\x02\x02\xE9\x02\x02\xEB\x02\x02\xED\x02\x02\xEF\x02" + - "\x02\xF1\x02\x02\xF3\x02\x02\xF5\x02\x02\xF7\x02\x02\xF9\x02\x02\xFB\x02" + - "\x02\xFD\x02\x02\x07\x02\x03\x04\x05\x06\'\x04\x02\f\f\x0F\x0F\x05\x02" + - "\v\f\x0F\x0F\"\"\x03\x022;\x04\x02C\\c|\x07\x02$$^^ppttvv\x06\x02\f\f" + - "\x0F\x0F$$^^\x04\x02GGgg\x04\x02--//\x04\x02BBaa\x03\x02bb\f\x02\v\f\x0F" + - "\x0F\"\"..11??]]__bb~~\x04\x02,,11\x04\x02CCcc\x04\x02DDdd\x04\x02EEe" + - "e\x04\x02FFff\x04\x02HHhh\x04\x02IIii\x04\x02JJjj\x04\x02KKkk\x04\x02" + - "LLll\x04\x02MMmm\x04\x02NNnn\x04\x02OOoo\x04\x02PPpp\x04\x02QQqq\x04\x02" + - "RRrr\x04\x02SSss\x04\x02TTtt\x04\x02UUuu\x04\x02VVvv\x04\x02WWww\x04\x02" + - "XXxx\x04\x02YYyy\x04\x02ZZzz\x04\x02[[{{\x04\x02\\\\||\x02\u05B8\x02\x07" + - "\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03" + - "\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03" + - "\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03" + - "\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03" + - "\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02" + - "\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02" + - "-\x03\x02\x02\x02\x03/\x03\x02\x02\x02\x031\x03\x02\x02\x02\x033\x03\x02" + - "\x02\x02\x035\x03\x02\x02\x02\x037\x03\x02\x02\x02\x049\x03\x02\x02\x02" + - "\x04E\x03\x02\x02\x02\x04G\x03\x02\x02\x02\x04I\x03\x02\x02\x02\x04K\x03" + - "\x02\x02\x02\x04M\x03\x02\x02\x02\x04O\x03\x02\x02\x02\x04Q\x03\x02\x02" + - "\x02\x04S\x03\x02\x02\x02\x04U\x03\x02\x02\x02\x04W\x03\x02\x02\x02\x04" + - "Y\x03\x02\x02\x02\x04[\x03\x02\x02\x02\x04]\x03\x02\x02\x02\x04_\x03\x02" + - "\x02\x02\x04a\x03\x02\x02\x02\x04c\x03\x02\x02\x02\x04e\x03\x02\x02\x02" + - "\x04g\x03\x02\x02\x02\x04i\x03\x02\x02\x02\x04k\x03\x02\x02\x02\x04m\x03" + - "\x02\x02\x02\x04o\x03\x02\x02\x02\x04q\x03\x02\x02\x02\x04s\x03\x02\x02" + - "\x02\x04u\x03\x02\x02\x02\x04w\x03\x02\x02\x02\x04y\x03\x02\x02\x02\x04" + - "{\x03\x02\x02\x02\x04}\x03\x02\x02\x02\x04\x7F\x03\x02\x02\x02\x04\x81" + - "\x03\x02\x02\x02\x04\x83\x03\x02\x02\x02\x04\x85\x03\x02\x02\x02\x04\x87" + - "\x03\x02\x02\x02\x04\x89\x03\x02\x02\x02\x04\x8B\x03\x02\x02\x02\x04\x8D" + - "\x03\x02\x02\x02\x04\x8F\x03\x02\x02\x02\x04\x91\x03\x02\x02\x02\x04\x93" + - "\x03\x02\x02\x02\x04\x95\x03\x02\x02\x02\x04\x97\x03\x02\x02\x02\x04\x99" + - "\x03\x02\x02\x02\x05\x9B\x03\x02\x02\x02\x05\x9D\x03\x02\x02\x02\x05\x9F" + - "\x03\x02\x02\x02\x05\xA1\x03\x02\x02\x02\x05\xA3\x03\x02\x02\x02\x05\xA5" + - "\x03\x02\x02\x02\x05\xA7\x03\x02\x02\x02\x05\xAB\x03\x02\x02\x02\x05\xAD" + - "\x03\x02\x02\x02\x05\xAF\x03\x02\x02\x02\x05\xB1\x03\x02\x02\x02\x06\xB3" + - "\x03\x02\x02\x02\x06\xB5\x03\x02\x02\x02\x06\xB7\x03\x02\x02\x02\x06\xB9" + - "\x03\x02\x02\x02\x06\xBB\x03\x02\x02\x02\x06\xBD\x03\x02\x02\x02\x06\xBF" + - "\x03\x02\x02\x02\x06\xC3\x03\x02\x02\x02\x06\xC5\x03\x02\x02\x02\x06\xC7" + - "\x03\x02\x02\x02\x06\xC9\x03\x02\x02\x02\x07\xFF\x03\x02\x02\x02\t\u0109" + - "\x03\x02\x02\x02\v\u0110\x03\x02\x02\x02\r\u0117\x03\x02\x02\x02\x0F\u0121" + - "\x03\x02\x02\x02\x11\u0128\x03\x02\x02\x02\x13\u012E\x03\x02\x02\x02\x15" + - "\u0136\x03\x02\x02\x02\x17\u013E\x03\x02\x02\x02\x19\u0145\x03\x02\x02" + - "\x02\x1B\u0151\x03\x02\x02\x02\x1D\u0159\x03\x02\x02\x02\x1F\u0163\x03" + - "\x02\x02\x02!\u016A\x03\x02\x02\x02#\u0173\x03\x02\x02\x02%\u017A\x03" + - "\x02\x02\x02\'\u0183\x03\x02\x02\x02)\u018A\x03\x02\x02\x02+\u019B\x03" + - "\x02\x02\x02-\u01AB\x03\x02\x02\x02/\u01B1\x03\x02\x02\x021\u01B6\x03" + - "\x02\x02\x023\u01BB\x03\x02\x02\x025\u01BF\x03\x02\x02\x027\u01C3\x03" + - "\x02\x02\x029\u01C7\x03\x02\x02\x02;\u01CB\x03\x02\x02\x02=\u01CD\x03" + - "\x02\x02\x02?\u01CF\x03\x02\x02\x02A\u01D2\x03\x02\x02\x02C\u01D4\x03" + - "\x02\x02\x02E\u01FA\x03\x02\x02\x02G\u01FD\x03\x02\x02\x02I\u022B\x03" + - "\x02\x02\x02K\u022D\x03\x02\x02\x02M\u024C\x03\x02\x02\x02O\u024E\x03" + - "\x02\x02\x02Q\u0252\x03\x02\x02\x02S\u0254\x03\x02\x02\x02U\u0256\x03" + - "\x02\x02\x02W\u0258\x03\x02\x02\x02Y\u025A\x03\x02\x02\x02[\u025F\x03" + - "\x02\x02\x02]\u0264\x03\x02\x02\x02_\u0268\x03\x02\x02\x02a\u026D\x03" + - "\x02\x02\x02c\u0273\x03\x02\x02\x02e\u0276\x03\x02\x02\x02g\u0279\x03" + - "\x02\x02\x02i\u027C\x03\x02\x02\x02k\u0281\x03\x02\x02\x02m\u0284\x03" + - "\x02\x02\x02o\u0286\x03\x02\x02\x02q\u0288\x03\x02\x02\x02s\u028D\x03" + - "\x02\x02\x02u\u02A0\x03\x02\x02\x02w\u02AC\x03\x02\x02\x02y\u02AE\x03" + - "\x02\x02\x02{\u02B0\x03\x02\x02\x02}\u02B2\x03\x02\x02\x02\x7F\u02B4\x03" + - "\x02\x02\x02\x81\u02B6\x03\x02\x02\x02\x83\u02B8\x03\x02\x02\x02\x85\u02C2" + - "\x03\x02\x02\x02\x87\u02C4\x03\x02\x02\x02\x89\u02D3\x03\x02\x02\x02\x8B" + - "\u043F\x03\x02\x02\x02\x8D\u0492\x03\x02\x02\x02\x8F\u0494\x03\x02\x02" + - "\x02\x91\u04B2\x03\x02\x02\x02\x93\u04B4\x03\x02\x02\x02\x95\u04BF\x03" + - "\x02\x02\x02\x97\u04C3\x03\x02\x02\x02\x99\u04C7\x03\x02\x02\x02\x9B\u04CB" + - "\x03\x02\x02\x02\x9D\u04D0\x03\x02\x02\x02\x9F\u04D6\x03\x02\x02\x02\xA1" + - "\u04DC\x03\x02\x02\x02\xA3\u04E0\x03\x02\x02\x02\xA5\u04E4\x03\x02\x02" + - "\x02\xA7\u04EE\x03\x02\x02\x02\xA9\u04F9\x03\x02\x02\x02\xAB\u04FB\x03" + - "\x02\x02\x02\xAD\u04FD\x03\x02\x02\x02\xAF\u0501\x03\x02\x02\x02\xB1\u0505" + - "\x03\x02\x02\x02\xB3\u0509\x03\x02\x02\x02\xB5\u050C\x03\x02\x02\x02\xB7" + - "\u0511\x03\x02\x02\x02\xB9\u0516\x03\x02\x02\x02\xBB\u051C\x03\x02\x02" + - "\x02\xBD\u0520\x03\x02\x02\x02\xBF\u0525\x03\x02\x02\x02\xC1\u0530\x03" + - "\x02\x02\x02\xC3\u0532\x03\x02\x02\x02\xC5\u0534\x03\x02\x02\x02\xC7\u0538" + - "\x03\x02\x02\x02\xC9\u053C\x03\x02\x02\x02\xCB\u0540\x03\x02\x02\x02\xCD" + - "\u0542\x03\x02\x02\x02\xCF\u0544\x03\x02\x02\x02\xD1\u0546\x03\x02\x02" + - "\x02\xD3\u0548\x03\x02\x02\x02\xD5\u054A\x03\x02\x02\x02\xD7\u054C\x03" + - "\x02\x02\x02\xD9\u054E\x03\x02\x02\x02\xDB\u0550\x03\x02\x02\x02\xDD\u0552" + - "\x03\x02\x02\x02\xDF\u0554\x03\x02\x02\x02\xE1\u0556\x03\x02\x02\x02\xE3" + - "\u0558\x03\x02\x02\x02\xE5\u055A\x03\x02\x02\x02\xE7\u055C\x03\x02\x02" + - "\x02\xE9\u055E\x03\x02\x02\x02\xEB\u0560\x03\x02\x02\x02\xED\u0562\x03" + - "\x02\x02\x02\xEF\u0564\x03\x02\x02\x02\xF1\u0566\x03\x02\x02\x02\xF3\u0568" + - "\x03\x02\x02\x02\xF5\u056A\x03\x02\x02\x02\xF7\u056C\x03\x02\x02\x02\xF9" + - "\u056E\x03\x02\x02\x02\xFB\u0570\x03\x02\x02\x02\xFD\u0572\x03\x02\x02" + - "\x02\xFF\u0100\x05\xD1g\x02\u0100\u0101\x05\xDBl\x02\u0101\u0102\x05\xEF" + - "v\x02\u0102\u0103\x05\xEFv\x02\u0103\u0104\x05\xD3h\x02\u0104\u0105\x05" + - "\xCFf\x02\u0105\u0106\x05\xF1w\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0108" + + "E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x03E\x05E\u04D5\n" + + "E\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03F\x03G\x03G\x03" + + "G\x03G\x03G\x07G\u04E7\nG\fG\x0EG\u04EA\vG\x03G\x03G\x03G\x03G\x03G\x06" + + "G\u04F1\nG\rG\x0EG\u04F2\x05G\u04F5\nG\x03H\x03H\x03H\x03H\x07H\u04FB" + + "\nH\fH\x0EH\u04FE\vH\x03H\x03H\x03I\x03I\x03I\x03I\x03J\x03J\x03J\x03" + + "J\x03K\x03K\x03K\x03K\x03L\x03L\x03L\x03L\x03L\x03M\x03M\x03M\x03M\x03" + + "M\x03M\x03N\x03N\x03N\x03N\x03N\x03N\x03O\x03O\x03O\x03O\x03P\x03P\x03" + + "P\x03P\x03Q\x03Q\x03Q\x03Q\x03Q\x03Q\x03Q\x03Q\x03Q\x03R\x06R\u0531\n" + + "R\rR\x0ER\u0532\x03S\x06S\u0536\nS\rS\x0ES\u0537\x03S\x03S\x05S\u053C" + + "\nS\x03T\x03T\x03U\x03U\x03U\x03U\x03V\x03V\x03V\x03V\x03W\x03W\x03W\x03" + + "W\x03X\x03X\x03X\x03Y\x03Y\x03Y\x03Y\x03Y\x03Z\x03Z\x03Z\x03Z\x03Z\x03" + + "[\x03[\x03[\x03[\x03[\x03[\x03\\\x03\\\x03\\\x03\\\x03]\x03]\x03]\x03" + + "]\x03^\x06^\u0568\n^\r^\x0E^\u0569\x03_\x06_\u056D\n_\r_\x0E_\u056E\x03" + + "_\x03_\x05_\u0573\n_\x03`\x03`\x03a\x03a\x03a\x03a\x03b\x03b\x03b\x03" + + "b\x03c\x03c\x03c\x03c\x03d\x03d\x03e\x03e\x03f\x03f\x03g\x03g\x03h\x03" + + "h\x03i\x03i\x03j\x03j\x03k\x03k\x03l\x03l\x03m\x03m\x03n\x03n\x03o\x03" + + "o\x03p\x03p\x03q\x03q\x03r\x03r\x03s\x03s\x03t\x03t\x03u\x03u\x03v\x03" + + "v\x03w\x03w\x03x\x03x\x03y\x03y\x03z\x03z\x03{\x03{\x03|\x03|\x03}\x03" + + "}\x04\u01A2\u01ED\x02\x02~\x07\x02\x03\t\x02\x04\v\x02\x05\r\x02\x06\x0F" + + "\x02\x07\x11\x02\b\x13\x02\t\x15\x02\n\x17\x02\v\x19\x02\f\x1B\x02\r\x1D" + + "\x02\x0E\x1F\x02\x0F!\x02\x10#\x02\x11%\x02\x12\'\x02\x13)\x02\x14+\x02" + + "\x15-\x02\x16/\x02\x021\x02S3\x02\x175\x02\x187\x02\x199\x02\x1A;\x02" + + "\x02=\x02\x02?\x02\x02A\x02\x02C\x02\x02E\x02\x1BG\x02\x1CI\x02\x1DK\x02" + + "\x1EM\x02\x1FO\x02 Q\x02!S\x02\"U\x02#W\x02$Y\x02%[\x02&]\x02\'_\x02(" + + "a\x02)c\x02*e\x02+g\x02,i\x02-k\x02.m\x02/o\x020q\x021s\x022u\x023w\x02" + + "4y\x025{\x026}\x027\x7F\x028\x81\x029\x83\x02:\x85\x02;\x87\x02<\x89\x02" + + "=\x8B\x02>\x8D\x02?\x8F\x02@\x91\x02A\x93\x02B\x95\x02C\x97\x02D\x99\x02" + + "E\x9B\x02\x02\x9D\x02\x02\x9F\x02\x02\xA1\x02\x02\xA3\x02\x02\xA5\x02" + + "F\xA7\x02G\xA9\x02\x02\xAB\x02H\xAD\x02I\xAF\x02J\xB1\x02K\xB3\x02L\xB5" + + "\x02M\xB7\x02\x02\xB9\x02\x02\xBB\x02\x02\xBD\x02\x02\xBF\x02N\xC1\x02" + + "\x02\xC3\x02O\xC5\x02P\xC7\x02Q\xC9\x02R\xCB\x02\x02\xCD\x02\x02\xCF\x02" + + "\x02\xD1\x02\x02\xD3\x02\x02\xD5\x02\x02\xD7\x02\x02\xD9\x02\x02\xDB\x02" + + "\x02\xDD\x02\x02\xDF\x02\x02\xE1\x02\x02\xE3\x02\x02\xE5\x02\x02\xE7\x02" + + "\x02\xE9\x02\x02\xEB\x02\x02\xED\x02\x02\xEF\x02\x02\xF1\x02\x02\xF3\x02" + + "\x02\xF5\x02\x02\xF7\x02\x02\xF9\x02\x02\xFB\x02\x02\xFD\x02\x02\x07\x02" + + "\x03\x04\x05\x06\'\x04\x02\f\f\x0F\x0F\x05\x02\v\f\x0F\x0F\"\"\x03\x02" + + "2;\x04\x02C\\c|\x07\x02$$^^ppttvv\x06\x02\f\f\x0F\x0F$$^^\x04\x02GGgg" + + "\x04\x02--//\x04\x02BBaa\x03\x02bb\f\x02\v\f\x0F\x0F\"\"..11??]]__bb~" + + "~\x04\x02,,11\x04\x02CCcc\x04\x02DDdd\x04\x02EEee\x04\x02FFff\x04\x02" + + "HHhh\x04\x02IIii\x04\x02JJjj\x04\x02KKkk\x04\x02LLll\x04\x02MMmm\x04\x02" + + "NNnn\x04\x02OOoo\x04\x02PPpp\x04\x02QQqq\x04\x02RRrr\x04\x02SSss\x04\x02" + + "TTtt\x04\x02UUuu\x04\x02VVvv\x04\x02WWww\x04\x02XXxx\x04\x02YYyy\x04\x02" + + "ZZzz\x04\x02[[{{\x04\x02\\\\||\x02\u0604\x02\x07\x03\x02\x02\x02\x02\t" + + "\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02\x02\x02\x0F\x03" + + "\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02\x15\x03" + + "\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02\x1B\x03" + + "\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02!\x03" + + "\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03\x02\x02" + + "\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02\x02\x03" + + "/\x03\x02\x02\x02\x031\x03\x02\x02\x02\x033\x03\x02\x02\x02\x035\x03\x02" + + "\x02\x02\x037\x03\x02\x02\x02\x049\x03\x02\x02\x02\x04E\x03\x02\x02\x02" + + "\x04G\x03\x02\x02\x02\x04I\x03\x02\x02\x02\x04K\x03\x02\x02\x02\x04M\x03" + + "\x02\x02\x02\x04O\x03\x02\x02\x02\x04Q\x03\x02\x02\x02\x04S\x03\x02\x02" + + "\x02\x04U\x03\x02\x02\x02\x04W\x03\x02\x02\x02\x04Y\x03\x02\x02\x02\x04" + + "[\x03\x02\x02\x02\x04]\x03\x02\x02\x02\x04_\x03\x02\x02\x02\x04a\x03\x02" + + "\x02\x02\x04c\x03\x02\x02\x02\x04e\x03\x02\x02\x02\x04g\x03\x02\x02\x02" + + "\x04i\x03\x02\x02\x02\x04k\x03\x02\x02\x02\x04m\x03\x02\x02\x02\x04o\x03" + + "\x02\x02\x02\x04q\x03\x02\x02\x02\x04s\x03\x02\x02\x02\x04u\x03\x02\x02" + + "\x02\x04w\x03\x02\x02\x02\x04y\x03\x02\x02\x02\x04{\x03\x02\x02\x02\x04" + + "}\x03\x02\x02\x02\x04\x7F\x03\x02\x02\x02\x04\x81\x03\x02\x02\x02\x04" + + "\x83\x03\x02\x02\x02\x04\x85\x03\x02\x02\x02\x04\x87\x03\x02\x02\x02\x04" + + "\x89\x03\x02\x02\x02\x04\x8B\x03\x02\x02\x02\x04\x8D\x03\x02\x02\x02\x04" + + "\x8F\x03\x02\x02\x02\x04\x91\x03\x02\x02\x02\x04\x93\x03\x02\x02\x02\x04" + + "\x95\x03\x02\x02\x02\x04\x97\x03\x02\x02\x02\x04\x99\x03\x02\x02\x02\x05" + + "\x9B\x03\x02\x02\x02\x05\x9D\x03\x02\x02\x02\x05\x9F\x03\x02\x02\x02\x05" + + "\xA1\x03\x02\x02\x02\x05\xA3\x03\x02\x02\x02\x05\xA5\x03\x02\x02\x02\x05" + + "\xA7\x03\x02\x02\x02\x05\xAB\x03\x02\x02\x02\x05\xAD\x03\x02\x02\x02\x05" + + "\xAF\x03\x02\x02\x02\x05\xB1\x03\x02\x02\x02\x06\xB3\x03\x02\x02\x02\x06" + + "\xB5\x03\x02\x02\x02\x06\xB7\x03\x02\x02\x02\x06\xB9\x03\x02\x02\x02\x06" + + "\xBB\x03\x02\x02\x02\x06\xBD\x03\x02\x02\x02\x06\xBF\x03\x02\x02\x02\x06" + + "\xC3\x03\x02\x02\x02\x06\xC5\x03\x02\x02\x02\x06\xC7\x03\x02\x02\x02\x06" + + "\xC9\x03\x02\x02\x02\x07\xFF\x03\x02\x02\x02\t\u0109\x03\x02\x02\x02\v" + + "\u0110\x03\x02\x02\x02\r\u0117\x03\x02\x02\x02\x0F\u0121\x03\x02\x02\x02" + + "\x11\u0128\x03\x02\x02\x02\x13\u012E\x03\x02\x02\x02\x15\u0136\x03\x02" + + "\x02\x02\x17\u013E\x03\x02\x02\x02\x19\u0145\x03\x02\x02\x02\x1B\u0151" + + "\x03\x02\x02\x02\x1D\u0159\x03\x02\x02\x02\x1F\u0163\x03\x02\x02\x02!" + + "\u016A\x03\x02\x02\x02#\u0173\x03\x02\x02\x02%\u017A\x03\x02\x02\x02\'" + + "\u0183\x03\x02\x02\x02)\u018A\x03\x02\x02\x02+\u019B\x03\x02\x02\x02-" + + "\u01AB\x03\x02\x02\x02/\u01B1\x03\x02\x02\x021\u01B6\x03\x02\x02\x023" + + "\u01BB\x03\x02\x02\x025\u01BF\x03\x02\x02\x027\u01C3\x03\x02\x02\x029" + + "\u01C7\x03\x02\x02\x02;\u01CB\x03\x02\x02\x02=\u01CD\x03\x02\x02\x02?" + + "\u01CF\x03\x02\x02\x02A\u01D2\x03\x02\x02\x02C\u01D4\x03\x02\x02\x02E" + + "\u01FA\x03\x02\x02\x02G\u01FD\x03\x02\x02\x02I\u022B\x03\x02\x02\x02K" + + "\u022D\x03\x02\x02\x02M\u028E\x03\x02\x02\x02O\u0290\x03\x02\x02\x02Q" + + "\u0294\x03\x02\x02\x02S\u0296\x03\x02\x02\x02U\u0298\x03\x02\x02\x02W" + + "\u029A\x03\x02\x02\x02Y\u029C\x03\x02\x02\x02[\u02A1\x03\x02\x02\x02]" + + "\u02A6\x03\x02\x02\x02_\u02AA\x03\x02\x02\x02a\u02AF\x03\x02\x02\x02c" + + "\u02B5\x03\x02\x02\x02e\u02B8\x03\x02\x02\x02g\u02BB\x03\x02\x02\x02i" + + "\u02BE\x03\x02\x02\x02k\u02C3\x03\x02\x02\x02m\u02C6\x03\x02\x02\x02o" + + "\u02C8\x03\x02\x02\x02q\u02CA\x03\x02\x02\x02s\u02CF\x03\x02\x02\x02u" + + "\u02E2\x03\x02\x02\x02w\u02EE\x03\x02\x02\x02y\u02F0\x03\x02\x02\x02{" + + "\u02F2\x03\x02\x02\x02}\u02F4\x03\x02\x02\x02\x7F\u02F6\x03\x02\x02\x02" + + "\x81\u02F8\x03\x02\x02\x02\x83\u02FA\x03\x02\x02\x02\x85\u0304\x03\x02" + + "\x02\x02\x87\u0306\x03\x02\x02\x02\x89\u0315\x03\x02\x02\x02\x8B\u0481" + + "\x03\x02\x02\x02\x8D\u04D4\x03\x02\x02\x02\x8F\u04D6\x03\x02\x02\x02\x91" + + "\u04F4\x03\x02\x02\x02\x93\u04F6\x03\x02\x02\x02\x95\u0501\x03\x02\x02" + + "\x02\x97\u0505\x03\x02\x02\x02\x99\u0509\x03\x02\x02\x02\x9B\u050D\x03" + + "\x02\x02\x02\x9D\u0512\x03\x02\x02\x02\x9F\u0518\x03\x02\x02\x02\xA1\u051E" + + "\x03\x02\x02\x02\xA3\u0522\x03\x02\x02\x02\xA5\u0526\x03\x02\x02\x02\xA7" + + "\u0530\x03\x02\x02\x02\xA9\u053B\x03\x02\x02\x02\xAB\u053D\x03\x02\x02" + + "\x02\xAD\u053F\x03\x02\x02\x02\xAF\u0543\x03\x02\x02\x02\xB1\u0547\x03" + + "\x02\x02\x02\xB3\u054B\x03\x02\x02\x02\xB5\u054E\x03\x02\x02\x02\xB7\u0553" + + "\x03\x02\x02\x02\xB9\u0558\x03\x02\x02\x02\xBB\u055E\x03\x02\x02\x02\xBD" + + "\u0562\x03\x02\x02\x02\xBF\u0567\x03\x02\x02\x02\xC1\u0572\x03\x02\x02" + + "\x02\xC3\u0574\x03\x02\x02\x02\xC5\u0576\x03\x02\x02\x02\xC7\u057A\x03" + + "\x02\x02\x02\xC9\u057E\x03\x02\x02\x02\xCB\u0582\x03\x02\x02\x02\xCD\u0584" + + "\x03\x02\x02\x02\xCF\u0586\x03\x02\x02\x02\xD1\u0588\x03\x02\x02\x02\xD3" + + "\u058A\x03\x02\x02\x02\xD5\u058C\x03\x02\x02\x02\xD7\u058E\x03\x02\x02" + + "\x02\xD9\u0590\x03\x02\x02\x02\xDB\u0592\x03\x02\x02\x02\xDD\u0594\x03" + + "\x02\x02\x02\xDF\u0596\x03\x02\x02\x02\xE1\u0598\x03\x02\x02\x02\xE3\u059A" + + "\x03\x02\x02\x02\xE5\u059C\x03\x02\x02\x02\xE7\u059E\x03\x02\x02\x02\xE9" + + "\u05A0\x03\x02\x02\x02\xEB\u05A2\x03\x02\x02\x02\xED\u05A4\x03\x02\x02" + + "\x02\xEF\u05A6\x03\x02\x02\x02\xF1\u05A8\x03\x02\x02\x02\xF3\u05AA\x03" + + "\x02\x02\x02\xF5\u05AC\x03\x02\x02\x02\xF7\u05AE\x03\x02\x02\x02\xF9\u05B0" + + "\x03\x02\x02\x02\xFB\u05B2\x03\x02\x02\x02\xFD\u05B4\x03\x02\x02\x02\xFF" + + "\u0100\x05\xD1g\x02\u0100\u0101\x05\xDBl\x02\u0101\u0102\x05\xEFv\x02" + + "\u0102\u0103\x05\xEFv\x02\u0103\u0104\x05\xD3h\x02\u0104\u0105\x05\xCF" + + "f\x02\u0105\u0106\x05\xF1w\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0108" + "\b\x02\x02\x02\u0108\b\x03\x02\x02\x02\u0109\u010A\x05\xD7j\x02\u010A" + "\u010B\x05\xEDu\x02\u010B\u010C\x05\xE7r\x02\u010C\u010D\x05\xDFn\x02" + - "\u010D\u010E\x03\x02\x02\x02\u010E\u010F\b\x03\x02\x02\u010F\n\x03\x02" + - "\x02\x02\u0110\u0111\x05\xD3h\x02\u0111\u0112\x05\xF5y\x02\u0112\u0113" + - "\x05\xCBd\x02\u0113\u0114\x05\xE1o\x02\u0114\u0115\x03\x02\x02\x02\u0115" + - "\u0116\b\x04\x02\x02\u0116\f\x03\x02\x02\x02\u0117\u0118\x05\xD3h\x02" + - "\u0118\u0119\x05\xF9{\x02\u0119\u011A\x05\xE9s\x02\u011A\u011B\x05\xE1" + - "o\x02\u011B\u011C\x05\xCBd\x02\u011C\u011D\x05\xDBl\x02\u011D\u011E\x05" + - "\xE5q\x02\u011E\u011F\x03\x02\x02\x02\u011F\u0120\b\x05\x03\x02\u0120" + - "\x0E\x03\x02\x02\x02\u0121\u0122\x05\xD5i\x02\u0122\u0123\x05\xEDu\x02" + - "\u0123\u0124\x05"; + "\u010D\u010E\x03"; private static readonly _serializedATNSegment1: string = + "\x02\x02\x02\u010E\u010F\b\x03\x02\x02\u010F\n\x03\x02\x02\x02\u0110\u0111" + + "\x05\xD3h\x02\u0111\u0112\x05\xF5y\x02\u0112\u0113\x05\xCBd\x02\u0113" + + "\u0114\x05\xE1o\x02\u0114\u0115\x03\x02\x02\x02\u0115\u0116\b\x04\x02" + + "\x02\u0116\f\x03\x02\x02\x02\u0117\u0118\x05\xD3h\x02\u0118\u0119\x05" + + "\xF9{\x02\u0119\u011A\x05\xE9s\x02\u011A\u011B\x05\xE1o\x02\u011B\u011C" + + "\x05\xCBd\x02\u011C\u011D\x05\xDBl\x02\u011D\u011E\x05\xE5q\x02\u011E" + + "\u011F\x03\x02\x02\x02\u011F\u0120\b\x05\x03\x02\u0120\x0E\x03\x02\x02" + + "\x02\u0121\u0122\x05\xD5i\x02\u0122\u0123\x05\xEDu\x02\u0123\u0124\x05" + "\xE7r\x02\u0124\u0125\x05\xE3p\x02\u0125\u0126\x03\x02\x02\x02\u0126\u0127" + "\b\x06\x04\x02\u0127\x10\x03\x02\x02\x02\u0128\u0129\x05\xEDu\x02\u0129" + "\u012A\x05\xE7r\x02\u012A\u012B\x05\xF7z\x02\u012B\u012C\x03\x02\x02\x02" + @@ -524,341 +529,369 @@ export class esql_lexer extends Lexer { "\x02\x02\u022B\u020D\x03\x02\x02\x02\u022B\u0214\x03\x02\x02\x02\u022B" + "\u0223\x03\x02\x02\x02\u022CJ\x03\x02\x02\x02\u022D\u022E\x07d\x02\x02" + "\u022E\u022F\x07{\x02\x02\u022FL\x03\x02\x02\x02\u0230\u0231\x07{\x02" + - "\x02\u0231\u0232\x07g\x02\x02\u0232\u0233\x07c\x02\x02\u0233\u024D\x07" + + "\x02\u0231\u0232\x07g\x02\x02\u0232\u0233\x07c\x02\x02\u0233\u028F\x07" + "t\x02\x02\u0234\u0235\x07o\x02\x02\u0235\u0236\x07q\x02\x02\u0236\u0237" + - "\x07p\x02\x02\u0237\u0238\x07v\x02\x02\u0238\u024D\x07j\x02\x02\u0239" + - "\u023A\x07f\x02\x02\u023A\u023B\x07c\x02\x02\u023B\u024D\x07{\x02\x02" + + "\x07p\x02\x02\u0237\u0238\x07v\x02\x02\u0238\u028F\x07j\x02\x02\u0239" + + "\u023A\x07f\x02\x02\u023A\u023B\x07c\x02\x02\u023B\u028F\x07{\x02\x02" + "\u023C\u023D\x07u\x02\x02\u023D\u023E\x07g\x02\x02\u023E\u023F\x07e\x02" + - "\x02\u023F\u0240\x07q\x02\x02\u0240\u0241\x07p\x02\x02\u0241\u024D\x07" + + "\x02\u023F\u0240\x07q\x02\x02\u0240\u0241\x07p\x02\x02\u0241\u028F\x07" + "f\x02\x02\u0242\u0243\x07o\x02\x02\u0243\u0244\x07k\x02\x02\u0244\u0245" + "\x07p\x02\x02\u0245\u0246\x07w\x02\x02\u0246\u0247\x07v\x02\x02\u0247" + - "\u024D\x07g\x02\x02\u0248\u0249\x07j\x02\x02\u0249\u024A\x07q\x02\x02" + - "\u024A\u024B\x07w\x02\x02\u024B\u024D\x07t\x02\x02\u024C\u0230\x03\x02" + - "\x02\x02\u024C\u0234\x03\x02\x02\x02\u024C\u0239\x03\x02\x02\x02\u024C" + - "\u023C\x03\x02\x02\x02\u024C\u0242\x03\x02\x02\x02\u024C\u0248\x03\x02" + - "\x02\x02\u024DN\x03\x02\x02\x02\u024E\u024F\x07c\x02\x02\u024F\u0250\x07" + - "p\x02\x02\u0250\u0251\x07f\x02\x02\u0251P\x03\x02\x02\x02\u0252\u0253" + - "\x07?\x02\x02\u0253R\x03\x02\x02\x02\u0254\u0255\x07.\x02\x02\u0255T\x03" + - "\x02\x02\x02\u0256\u0257\x070\x02\x02\u0257V\x03\x02\x02\x02\u0258\u0259" + - "\x07*\x02\x02\u0259X\x03\x02\x02\x02\u025A\u025B\x07]\x02\x02\u025B\u025C" + - "\x03\x02\x02\x02\u025C\u025D\b+\x02\x02\u025D\u025E\b+\x02\x02\u025EZ" + - "\x03\x02\x02\x02\u025F\u0260\x07_\x02\x02\u0260\u0261\x03\x02\x02\x02" + - "\u0261\u0262\b,\n\x02\u0262\u0263\b,\n\x02\u0263\\\x03\x02\x02\x02\u0264" + - "\u0265\x05\xE5q\x02\u0265\u0266\x05\xE7r\x02\u0266\u0267\x05\xF1w\x02" + - "\u0267^\x03\x02\x02\x02\u0268\u0269\x05\xE1o\x02\u0269\u026A\x05\xDBl" + - "\x02\u026A\u026B\x05\xDFn\x02\u026B\u026C\x05\xD3h\x02\u026C`\x03\x02" + - "\x02\x02\u026D\u026E\x05\xEDu\x02\u026E\u026F\x05\xE1o\x02\u026F\u0270" + - "\x05\xDBl\x02\u0270\u0271\x05\xDFn\x02\u0271\u0272\x05\xD3h\x02\u0272" + - "b\x03\x02\x02\x02\u0273\u0274\x05\xDBl\x02\u0274\u0275\x05\xE5q\x02\u0275" + - "d\x03\x02\x02\x02\u0276\u0277\x05\xDBl\x02\u0277\u0278\x05\xEFv\x02\u0278" + - "f\x03\x02\x02\x02\u0279\u027A\x05\xCBd\x02\u027A\u027B\x05\xEFv\x02\u027B" + - "h\x03\x02\x02\x02\u027C\u027D\x05\xE5q\x02\u027D\u027E\x05\xF3x\x02\u027E" + - "\u027F\x05\xE1o\x02\u027F\u0280\x05\xE1o\x02\u0280j\x03\x02\x02\x02\u0281" + - "\u0282\x07q\x02\x02\u0282\u0283\x07t\x02\x02\u0283l\x03\x02\x02\x02\u0284" + - "\u0285\x07+\x02\x02\u0285n\x03\x02\x02\x02\u0286\u0287\x07a\x02\x02\u0287" + - "p\x03\x02\x02\x02\u0288\u0289\x07k\x02\x02\u0289\u028A\x07p\x02\x02\u028A" + - "\u028B\x07h\x02\x02\u028B\u028C\x07q\x02\x02\u028Cr\x03\x02\x02\x02\u028D" + - "\u028E\x07h\x02\x02\u028E\u028F\x07w\x02\x02\u028F\u0290\x07p\x02\x02" + - "\u0290\u0291\x07e\x02\x02\u0291\u0292\x07v\x02\x02\u0292\u0293\x07k\x02" + - "\x02\u0293\u0294\x07q\x02\x02\u0294\u0295\x07p\x02\x02\u0295\u0296\x07" + - "u\x02\x02\u0296t\x03\x02\x02\x02\u0297\u0298\x07v\x02\x02\u0298\u0299" + - "\x07t\x02\x02\u0299\u029A\x07w\x02\x02\u029A\u02A1\x07g\x02\x02\u029B" + - "\u029C\x07h\x02\x02\u029C\u029D\x07c\x02\x02\u029D\u029E\x07n\x02\x02" + - "\u029E\u029F\x07u\x02\x02\u029F\u02A1\x07g\x02\x02\u02A0\u0297\x03\x02" + - "\x02\x02\u02A0\u029B\x03\x02\x02\x02\u02A1v\x03\x02\x02\x02\u02A2\u02A3" + - "\x07?\x02\x02\u02A3\u02AD\x07?\x02\x02\u02A4\u02A5\x07#\x02\x02\u02A5" + - "\u02AD\x07?\x02\x02\u02A6\u02AD\x07>\x02\x02\u02A7\u02A8\x07>\x02\x02" + - "\u02A8\u02AD\x07?\x02\x02\u02A9\u02AD\x07@\x02\x02\u02AA\u02AB\x07@\x02" + - "\x02\u02AB\u02AD\x07?\x02\x02\u02AC\u02A2\x03\x02\x02\x02\u02AC\u02A4" + - "\x03\x02\x02\x02\u02AC\u02A6\x03\x02\x02\x02\u02AC\u02A7\x03\x02\x02\x02" + - "\u02AC\u02A9\x03\x02\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02ADx\x03\x02" + - "\x02\x02\u02AE\u02AF\x07-\x02\x02\u02AFz\x03\x02\x02\x02\u02B0\u02B1\x07" + - "/\x02\x02\u02B1|\x03\x02\x02\x02\u02B2\u02B3\x07,\x02\x02\u02B3~\x03\x02" + - "\x02\x02\u02B4\u02B5\x071\x02\x02\u02B5\x80\x03\x02\x02\x02\u02B6\u02B7" + - "\x07\'\x02\x02\u02B7\x82\x03\x02\x02\x02\u02B8\u02B9\x073\x02\x02\u02B9" + - "\u02BA\x072\x02\x02\u02BA\x84\x03\x02\x02\x02\u02BB\u02BC\x07c\x02\x02" + - "\u02BC\u02BD\x07u\x02\x02\u02BD\u02C3\x07e\x02\x02\u02BE\u02BF\x07f\x02" + - "\x02\u02BF\u02C0\x07g\x02\x02\u02C0\u02C1\x07u\x02\x02\u02C1\u02C3\x07" + - "e\x02\x02\u02C2\u02BB\x03\x02\x02\x02\u02C2\u02BE\x03\x02\x02\x02\u02C3" + - "\x86\x03\x02\x02\x02\u02C4\u02C5\x07p\x02\x02\u02C5\u02C6\x07w\x02\x02" + - "\u02C6\u02C7\x07n\x02\x02\u02C7\u02C8\x07n\x02\x02\u02C8\u02C9\x07u\x02" + - "\x02\u02C9\x88\x03\x02\x02\x02\u02CA\u02CB\x07h\x02\x02\u02CB\u02CC\x07" + - "k\x02\x02\u02CC\u02CD\x07t\x02\x02\u02CD\u02CE\x07u\x02\x02\u02CE\u02D4" + - "\x07v\x02\x02\u02CF\u02D0\x07n\x02\x02\u02D0\u02D1\x07c\x02\x02\u02D1" + - "\u02D2\x07u\x02\x02\u02D2\u02D4\x07v\x02\x02\u02D3\u02CA\x03\x02\x02\x02" + - "\u02D3\u02CF\x03\x02\x02\x02\u02D4\x8A\x03\x02\x02\x02\u02D5\u02D6\x05" + - "\xEDu\x02\u02D6\u02D7\x05\xE7r\x02\u02D7\u02D8\x05\xF3x\x02\u02D8\u02D9" + - "\x05\xE5q\x02\u02D9\u02DA\x05\xD1g\x02\u02DA\u0440\x03\x02\x02\x02\u02DB" + - "\u02DC\x05\xCBd\x02\u02DC\u02DD\x05\xCDe\x02\u02DD\u02DE\x05\xEFv\x02" + - "\u02DE\u0440\x03\x02\x02\x02\u02DF\u02E0\x05\xE9s\x02\u02E0\u02E1\x05" + - "\xE7r\x02\u02E1\u02E2\x05\xF7z\x02\u02E2\u0440\x03\x02\x02\x02\u02E3\u02E4" + - "\x05\xE1o\x02\u02E4\u02E5\x05\xE7r\x02\u02E5\u02E6\x05\xD7j\x02\u02E6" + - "\u02E7\x05\x83@\x02\u02E7\u0440\x03\x02\x02\x02\u02E8\u02E9\x05\xE9s\x02" + - "\u02E9\u02EA\x05\xDBl\x02\u02EA\u0440\x03\x02\x02\x02\u02EB\u02EC\x05" + - "\xF1w\x02\u02EC\u02ED\x05\xCBd\x02\u02ED\u02EE\x05\xF3x\x02\u02EE\u0440" + - "\x03\x02\x02\x02\u02EF\u0440\x05\xD3h\x02\u02F0\u02F1\x05\xEFv\x02\u02F1" + - "\u02F2\x05\xF3x\x02\u02F2\u02F3\x05\xCDe\x02\u02F3\u02F4\x05\xEFv\x02" + - "\u02F4\u02F5\x05\xF1w\x02\u02F5\u02F6\x05\xEDu\x02\u02F6\u02F7\x05\xDB" + - "l\x02\u02F7\u02F8\x05\xE5q\x02\u02F8\u02F9\x05\xD7j\x02\u02F9\u0440\x03" + - "\x02\x02\x02\u02FA\u02FB\x05\xF1w\x02\u02FB\u02FC\x05\xEDu\x02\u02FC\u02FD" + - "\x05\xDBl\x02\u02FD\u02FE\x05\xE3p\x02\u02FE\u0440\x03\x02\x02\x02\u02FF" + - "\u0300\x05\xCFf\x02\u0300\u0301\x05\xE7r\x02\u0301\u0302\x05\xE5q\x02" + - "\u0302\u0303\x05\xCFf\x02\u0303\u0304\x05\xCBd\x02\u0304\u0305\x05\xF1" + - "w\x02\u0305\u0440\x03\x02\x02\x02\u0306\u0307\x05\xEFv\x02\u0307\u0308" + - "\x05\xF1w\x02\u0308\u0309\x05\xCBd\x02\u0309\u030A\x05\xEDu\x02\u030A" + - "\u030B\x05\xF1w\x02\u030B\u030C\x05\xEFv\x02\u030C\u030D\x05o6\x02\u030D" + - "\u030E\x05\xF7z\x02\u030E\u030F\x05\xDBl\x02\u030F\u0310\x05\xF1w\x02" + - "\u0310\u0311\x05\xD9k\x02\u0311\u0440\x03\x02\x02\x02\u0312\u0313\x05" + - "\xD1g\x02\u0313\u0314\x05\xCBd\x02\u0314\u0315\x05\xF1w\x02\u0315\u0316" + - "\x05\xD3h\x02\u0316\u0317\x05o6\x02\u0317\u0318\x05\xD5i\x02\u0318\u0319" + - "\x05\xE7r\x02\u0319\u031A\x05\xEDu\x02\u031A\u031B\x05\xE3p\x02\u031B" + - "\u031C\x05\xCBd\x02\u031C\u031D\x05\xF1w\x02\u031D\u0440\x03\x02\x02\x02" + - "\u031E\u031F\x05\xD1g\x02\u031F\u0320\x05\xCBd\x02\u0320\u0321\x05\xF1" + - "w\x02\u0321\u0322\x05\xD3h\x02\u0322\u0323\x05o6\x02\u0323\u0324\x05\xF1" + - "w\x02\u0324\u0325\x05\xEDu\x02\u0325\u0326\x05\xF3x\x02\u0326\u0327\x05" + - "\xE5q\x02\u0327\u0328\x05\xCFf\x02\u0328\u0440\x03\x02\x02\x02\u0329\u032A" + - "\x05\xD1g\x02\u032A\u032B\x05\xCBd\x02\u032B\u032C\x05\xF1w\x02\u032C" + - "\u032D\x05\xD3h\x02\u032D\u032E\x05o6\x02\u032E\u032F\x05\xE9s\x02\u032F" + - "\u0330\x05\xCBd\x02\u0330\u0331\x05\xEDu\x02\u0331\u0332\x05\xEFv\x02" + - "\u0332\u0333\x05\xD3h\x02\u0333\u0440\x03\x02\x02\x02\u0334\u0335\x05" + - "\xCBd\x02\u0335\u0336\x05\xF3x\x02\u0336\u0337\x05\xF1w\x02\u0337\u0338" + - "\x05\xE7r\x02\u0338\u0339\x05o6\x02\u0339\u033A\x05\xCDe\x02\u033A\u033B" + - "\x05\xF3x\x02\u033B\u033C\x05\xCFf\x02\u033C\u033D\x05\xDFn\x02\u033D" + - "\u033E\x05\xD3h\x02\u033E\u033F\x05\xF1w\x02\u033F\u0440\x03\x02\x02\x02" + - "\u0340\u0341\x05\xDBl\x02\u0341\u0342\x05\xEFv\x02\u0342\u0343\x05o6\x02" + - "\u0343\u0344\x05\xD5i\x02\u0344\u0345\x05\xDBl\x02\u0345\u0346\x05\xE5" + - "q\x02\u0346\u0347\x05\xDBl\x02\u0347\u0348\x05\xF1w\x02\u0348\u0349\x05" + - "\xD3h\x02\u0349\u0440\x03\x02\x02\x02\u034A\u034B\x05\xDBl\x02\u034B\u034C" + - "\x05\xEFv\x02\u034C\u034D\x05o6\x02\u034D\u034E\x05\xDBl\x02\u034E\u034F" + - "\x05\xE5q\x02\u034F\u0350\x05\xD5i\x02\u0350\u0351\x05\xDBl\x02\u0351" + - "\u0352\x05\xE5q\x02\u0352\u0353\x05\xDBl\x02\u0353\u0354\x05\xF1w\x02" + - "\u0354\u0355\x05\xD3h\x02\u0355\u0440\x03\x02\x02\x02\u0356\u0357\x05" + - "\xCFf\x02\u0357\u0358\x05\xCBd\x02\u0358\u0359\x05\xEFv\x02\u0359\u035A" + - "\x05\xD3h\x02\u035A\u0440\x03\x02\x02\x02\u035B\u035C\x05\xE1o\x02\u035C" + - "\u035D\x05\xD3h\x02\u035D\u035E\x05\xE5q\x02\u035E\u035F\x05\xD7j\x02" + - "\u035F\u0360\x05\xF1w\x02\u0360\u0361\x05\xD9k\x02\u0361\u0440\x03\x02" + - "\x02\x02\u0362\u0363\x05\xE3p\x02\u0363\u0364\x05\xF5y\x02\u0364\u0365" + - "\x05o6\x02\u0365\u0366\x05\xE3p\x02\u0366\u0367\x05\xCBd\x02\u0367\u0368" + - "\x05\xF9{\x02\u0368\u0440\x03\x02\x02\x02\u0369\u036A\x05\xE3p\x02\u036A" + - "\u036B\x05\xF5y\x02\u036B\u036C\x05o6\x02\u036C\u036D\x05\xE3p\x02\u036D" + - "\u036E\x05\xDBl\x02\u036E\u036F\x05\xE5q\x02\u036F\u0440\x03\x02\x02\x02" + - "\u0370\u0371\x05\xE3p\x02\u0371\u0372\x05\xF5y\x02\u0372\u0373\x05o6\x02" + - "\u0373\u0374\x05\xCBd\x02\u0374\u0375\x05\xF5y\x02\u0375\u0376\x05\xD7" + - "j\x02\u0376\u0440\x03\x02\x02\x02\u0377\u0378\x05\xE3p\x02\u0378\u0379" + - "\x05\xF5y\x02\u0379\u037A\x05o6\x02\u037A\u037B\x05\xEFv\x02\u037B\u037C" + - "\x05\xF3x\x02\u037C\u037D\x05\xE3p\x02\u037D\u0440\x03\x02\x02\x02\u037E" + - "\u037F\x05\xE3p\x02\u037F\u0380\x05\xF5y\x02\u0380\u0381\x05o6\x02\u0381" + - "\u0382\x05\xCFf\x02\u0382\u0383\x05\xE7r\x02\u0383\u0384\x05\xF3x\x02" + - "\u0384\u0385\x05\xE5q\x02\u0385\u0386\x05\xF1w\x02\u0386\u0440\x03\x02" + - "\x02\x02\u0387\u0388\x05\xE3p\x02\u0388\u0389\x05\xF5y\x02\u0389\u038A" + - "\x05o6\x02\u038A\u038B\x05\xCFf\x02\u038B\u038C\x05\xE7r\x02\u038C\u038D" + - "\x05\xE5q\x02\u038D\u038E\x05\xCFf\x02\u038E\u038F\x05\xCBd\x02\u038F" + - "\u0390\x05\xF1w\x02\u0390\u0440\x03\x02\x02\x02\u0391\u0392\x05\xE3p\x02" + - "\u0392\u0393\x05\xF5y\x02\u0393\u0394\x05o6\x02\u0394\u0395\x05\xDDm\x02" + - "\u0395\u0396\x05\xE7r\x02\u0396\u0397\x05\xDBl\x02\u0397\u0398\x05\xE5" + - "q\x02\u0398\u0440\x03\x02\x02\x02\u0399\u039A\x05\xE3p\x02\u039A\u039B" + - "\x05\xF5y\x02\u039B\u039C\x05o6\x02\u039C\u039D\x05\xE3p\x02\u039D\u039E" + - "\x05\xD3h\x02\u039E\u039F\x05\xD1g\x02\u039F\u03A0\x05\xDBl\x02\u03A0" + - "\u03A1\x05\xCBd\x02\u03A1\u03A2\x05\xE5q\x02\u03A2\u0440\x03\x02\x02\x02" + - "\u03A3\u03A4\x05\xE3p\x02\u03A4\u03A5\x05\xF5y\x02\u03A5\u03A6\x05o6\x02" + - "\u03A6\u03A7\x05\xD1g\x02\u03A7\u03A8\x05\xD3h\x02\u03A8\u03A9\x05\xD1" + - "g\x02\u03A9\u03AA\x05\xF3x\x02\u03AA\u03AB\x05\xE9s\x02\u03AB\u03AC\x05" + - "\xD3h\x02\u03AC\u0440\x03\x02\x02\x02\u03AD\u03AE\x05\xE3p\x02\u03AE\u03AF" + - "\x05\xD3h\x02\u03AF\u03B0\x05\xF1w\x02\u03B0\u03B1\x05\xCBd\x02\u03B1" + - "\u03B2\x05\xD1g\x02\u03B2\u03B3\x05\xCBd\x02\u03B3\u03B4\x05\xF1w\x02" + - "\u03B4\u03B5\x05\xCBd\x02\u03B5\u0440\x03\x02\x02\x02\u03B6\u03B7\x05" + - "\xEFv\x02\u03B7\u03B8\x05\xE9s\x02\u03B8\u03B9\x05\xE1o\x02\u03B9\u03BA" + - "\x05\xDBl\x02\u03BA\u03BB\x05\xF1w\x02\u03BB\u0440\x03\x02\x02\x02\u03BC" + - "\u03BD\x05\xF1w\x02\u03BD\u03BE\x05\xE7r\x02\u03BE\u03BF\x05o6\x02\u03BF" + - "\u03C0\x05\xEFv\x02\u03C0\u03C1\x05\xF1w\x02\u03C1\u03C2\x05\xEDu\x02" + - "\u03C2\u03C3\x05\xDBl\x02\u03C3\u03C4\x05\xE5q\x02\u03C4\u03C5\x05\xD7" + - "j\x02\u03C5\u0440\x03\x02\x02\x02\u03C6\u03C7\x05\xF1w\x02\u03C7\u03C8" + - "\x05\xE7r\x02\u03C8\u03C9\x05o6\x02\u03C9\u03CA\x05\xEFv\x02\u03CA\u03CB" + - "\x05\xF1w\x02\u03CB\u03CC\x05\xEDu\x02\u03CC\u0440\x03\x02\x02\x02\u03CD" + - "\u03CE\x05\xF1w\x02\u03CE\u03CF\x05\xE7r\x02\u03CF\u03D0\x05o6\x02\u03D0" + - "\u03D1\x05\xCDe\x02\u03D1\u03D2\x05\xE7r\x02\u03D2\u03D3\x05\xE7r\x02" + - "\u03D3\u03D4\x05\xE1o\x02\u03D4\u0440\x03\x02\x02\x02\u03D5\u03D6\x05" + - "\xF1w\x02\u03D6\u03D7\x05\xE7r\x02\u03D7\u03D8\x05o6\x02\u03D8\u03D9\x05" + - "\xCDe\x02\u03D9\u03DA\x05\xE7r\x02\u03DA\u03DB\x05\xE7r\x02\u03DB\u03DC" + - "\x05\xE1o\x02\u03DC\u03DD\x05\xD3h\x02\u03DD\u03DE\x05\xCBd\x02\u03DE" + - "\u03DF\x05\xE5q\x02\u03DF\u0440\x03\x02\x02\x02\u03E0\u03E1\x05\xF1w\x02" + - "\u03E1\u03E2\x05\xE7r\x02\u03E2\u03E3\x05o6\x02\u03E3\u03E4\x05\xD1g\x02" + - "\u03E4\u03E5\x05\xCBd\x02\u03E5\u03E6\x05\xF1w\x02\u03E6\u03E7\x05\xD3" + - "h\x02\u03E7\u03E8\x05\xF1w\x02\u03E8\u03E9\x05\xDBl\x02\u03E9\u03EA\x05" + - "\xE3p\x02\u03EA\u03EB\x05\xD3h\x02\u03EB\u0440\x03\x02\x02\x02\u03EC\u03ED" + - "\x05\xF1w\x02\u03ED\u03EE\x05\xE7r\x02\u03EE\u03EF\x05o6\x02\u03EF\u03F0" + - "\x05\xD1g\x02\u03F0\u03F1\x05\xF1w\x02\u03F1\u0440\x03\x02\x02\x02\u03F2" + - "\u03F3\x05\xF1w\x02\u03F3\u03F4\x05\xE7r\x02\u03F4\u03F5\x05o6\x02\u03F5" + - "\u03F6\x05\xD1g\x02\u03F6\u03F7\x05\xCDe\x02\u03F7\u03F8\x05\xE1o\x02" + - "\u03F8\u0440\x03\x02\x02\x02\u03F9\u03FA\x05\xF1w\x02\u03FA\u03FB\x05" + - "\xE7r\x02\u03FB\u03FC\x05o6\x02\u03FC\u03FD\x05\xD1g\x02\u03FD\u03FE\x05" + - "\xE7r\x02\u03FE\u03FF\x05\xF3x\x02\u03FF\u0400\x05\xCDe\x02\u0400\u0401" + - "\x05\xE1o\x02\u0401\u0402\x05\xD3h\x02\u0402\u0440\x03\x02\x02\x02\u0403" + - "\u0404\x05\xF1w\x02\u0404\u0405\x05\xE7r\x02\u0405\u0406\x05o6\x02\u0406" + - "\u0407\x05\xDBl\x02\u0407\u0408\x05\xE5q\x02\u0408\u0409\x05\xF1w\x02" + - "\u0409\u0440\x03\x02\x02\x02\u040A\u040B\x05\xF1w\x02\u040B\u040C\x05" + - "\xE7r\x02\u040C\u040D\x05o6\x02\u040D\u040E\x05\xDBl\x02\u040E\u040F\x05" + - "\xE5q\x02\u040F\u0410\x05\xF1w\x02\u0410\u0411\x05\xD3h\x02\u0411\u0412" + - "\x05\xD7j\x02\u0412\u0413\x05\xD3h\x02\u0413\u0414\x05\xEDu\x02\u0414" + - "\u0440\x03\x02\x02\x02\u0415\u0416\x05\xF1w\x02\u0416\u0417\x05\xE7r\x02" + - "\u0417\u0418\x05o6\x02\u0418\u0419\x05\xE1o\x02\u0419\u041A\x05\xE7r\x02" + - "\u041A\u041B\x05\xE5q\x02\u041B\u041C\x05\xD7j\x02\u041C\u0440\x03\x02" + - "\x02\x02\u041D\u041E\x05\xF1w\x02\u041E\u041F\x05\xE7r\x02\u041F\u0420" + - "\x05o6\x02\u0420\u0421\x05\xDBl\x02\u0421\u0422\x05\xE9s\x02\u0422\u0440" + - "\x03\x02\x02\x02\u0423\u0424\x05\xF1w\x02\u0424\u0425\x05\xE7r\x02\u0425" + - "\u0426\x05o6\x02\u0426\u0427\x05\xF5y\x02\u0427\u0428\x05\xD3h\x02\u0428" + - "\u0429\x05\xEDu\x02\u0429\u042A\x05\xEFv\x02\u042A\u042B\x05\xDBl\x02" + - "\u042B\u042C\x05\xE7r\x02\u042C\u042D\x05\xE5q\x02\u042D\u0440\x03\x02" + - "\x02\x02\u042E\u042F\x05\xF1w\x02\u042F\u0430\x05\xE7r\x02\u0430\u0431" + - "\x05o6\x02\u0431\u0432\x05\xF3x\x02\u0432\u0433\x05\xE5q\x02\u0433\u0434" + - "\x05\xEFv\x02\u0434\u0435\x05\xDBl\x02\u0435\u0436\x05\xD7j\x02\u0436" + - "\u0437\x05\xE5q\x02\u0437\u0438\x05\xD3h\x02\u0438\u0439\x05\xD1g\x02" + - "\u0439\u043A\x05o6\x02\u043A\u043B\x05\xE1o\x02\u043B\u043C\x05\xE7r\x02" + - "\u043C\u043D\x05\xE5q\x02\u043D\u043E\x05\xD7j\x02\u043E\u0440\x03\x02" + - "\x02"; + "\u028F\x07g\x02\x02\u0248\u0249\x07j\x02\x02\u0249\u024A\x07q\x02\x02" + + "\u024A\u024B\x07w\x02\x02\u024B\u028F\x07t\x02\x02\u024C\u024D\x07y\x02" + + "\x02\u024D\u024E\x07g\x02\x02\u024E\u024F\x07g\x02\x02\u024F\u028F\x07" + + "m\x02\x02\u0250\u0251\x07o\x02\x02\u0251\u0252\x07k\x02\x02\u0252\u0253" + + "\x07n\x02\x02\u0253\u0254\x07n\x02\x02\u0254\u0255\x07k\x02\x02\u0255" + + "\u0256\x07u\x02\x02\u0256\u0257\x07g\x02\x02\u0257\u0258\x07e\x02\x02" + + "\u0258\u0259\x07q\x02\x02\u0259\u025A\x07p\x02\x02\u025A\u028F\x07f\x02" + + "\x02\u025B\u025C\x07{\x02\x02\u025C\u025D\x07g\x02\x02\u025D\u025E\x07" + + "c\x02\x02\u025E\u025F\x07t\x02\x02\u025F\u028F\x07u\x02\x02\u0260\u0261" + + "\x07o\x02\x02\u0261\u0262\x07q\x02\x02\u0262\u0263\x07p\x02\x02\u0263" + + "\u0264\x07v\x02\x02\u0264\u0265\x07j\x02\x02\u0265\u028F\x07u\x02\x02" + + "\u0266\u0267\x07f\x02\x02\u0267\u0268\x07c\x02\x02\u0268\u0269\x07{\x02" + + "\x02\u0269\u028F\x07u\x02\x02\u026A\u026B\x07u\x02\x02\u026B\u026C\x07" + + "g\x02\x02\u026C\u026D\x07e\x02\x02\u026D\u026E\x07q\x02\x02\u026E\u026F" + + "\x07p\x02\x02\u026F\u0270\x07f\x02\x02\u0270\u028F\x07u\x02\x02\u0271" + + "\u0272\x07o\x02\x02\u0272\u0273\x07k\x02\x02\u0273\u0274\x07p\x02\x02" + + "\u0274\u0275\x07w\x02\x02\u0275\u0276\x07v\x02\x02\u0276\u0277\x07g\x02" + + "\x02\u0277\u028F\x07u\x02\x02\u0278\u0279\x07j\x02\x02\u0279\u027A\x07" + + "q\x02\x02\u027A\u027B\x07w\x02\x02\u027B\u027C\x07t\x02\x02\u027C\u028F" + + "\x07u\x02\x02\u027D\u027E\x07y\x02\x02\u027E\u027F\x07g\x02\x02\u027F" + + "\u0280\x07g\x02\x02\u0280\u0281\x07m\x02\x02\u0281\u028F\x07u\x02\x02" + + "\u0282\u0283\x07o\x02\x02\u0283\u0284\x07k\x02\x02\u0284\u0285\x07n\x02" + + "\x02\u0285\u0286\x07n\x02\x02\u0286\u0287\x07k\x02\x02\u0287\u0288\x07" + + "u\x02\x02\u0288\u0289\x07g\x02\x02\u0289\u028A\x07e\x02\x02\u028A\u028B" + + "\x07q\x02\x02\u028B\u028C\x07p\x02\x02\u028C\u028D\x07f\x02\x02\u028D" + + "\u028F\x07u\x02\x02\u028E\u0230\x03\x02\x02\x02\u028E\u0234\x03\x02\x02" + + "\x02\u028E\u0239\x03\x02\x02\x02\u028E\u023C\x03\x02\x02\x02\u028E\u0242" + + "\x03\x02\x02\x02\u028E\u0248\x03\x02\x02\x02\u028E\u024C\x03\x02\x02\x02" + + "\u028E\u0250\x03\x02\x02\x02\u028E\u025B\x03\x02\x02\x02\u028E\u0260\x03" + + "\x02\x02\x02\u028E\u0266\x03\x02\x02\x02\u028E\u026A\x03\x02\x02\x02\u028E" + + "\u0271\x03\x02\x02\x02\u028E\u0278\x03\x02\x02\x02\u028E\u027D\x03\x02" + + "\x02\x02\u028E\u0282\x03\x02\x02\x02\u028FN\x03\x02\x02\x02\u0290\u0291" + + "\x07c\x02\x02\u0291\u0292\x07p\x02\x02\u0292\u0293\x07f\x02\x02\u0293" + + "P\x03\x02\x02\x02\u0294\u0295\x07?\x02\x02\u0295R\x03\x02\x02\x02\u0296" + + "\u0297\x07.\x02\x02\u0297T\x03\x02\x02\x02\u0298\u0299\x070\x02\x02\u0299" + + "V\x03\x02\x02\x02\u029A\u029B\x07*\x02\x02\u029BX\x03\x02\x02\x02\u029C" + + "\u029D\x07]\x02\x02\u029D\u029E\x03\x02\x02\x02\u029E\u029F\b+\x02\x02" + + "\u029F\u02A0\b+\x02\x02\u02A0Z\x03\x02\x02\x02\u02A1\u02A2\x07_\x02\x02" + + "\u02A2\u02A3\x03\x02\x02\x02\u02A3\u02A4\b,\n\x02\u02A4\u02A5\b,\n\x02" + + "\u02A5\\\x03\x02\x02\x02\u02A6\u02A7\x05\xE5q\x02\u02A7\u02A8\x05\xE7" + + "r\x02\u02A8\u02A9\x05\xF1w\x02\u02A9^\x03\x02\x02\x02\u02AA\u02AB\x05" + + "\xE1o\x02\u02AB\u02AC\x05\xDBl\x02\u02AC\u02AD\x05\xDFn\x02\u02AD\u02AE" + + "\x05\xD3h\x02\u02AE`\x03\x02\x02\x02\u02AF\u02B0\x05\xEDu\x02\u02B0\u02B1" + + "\x05\xE1o\x02\u02B1\u02B2\x05\xDBl\x02\u02B2\u02B3\x05\xDFn\x02\u02B3" + + "\u02B4\x05\xD3h\x02\u02B4b\x03\x02\x02\x02\u02B5\u02B6\x05\xDBl\x02\u02B6" + + "\u02B7\x05\xE5q\x02\u02B7d\x03\x02\x02\x02\u02B8\u02B9\x05\xDBl\x02\u02B9" + + "\u02BA\x05\xEFv\x02\u02BAf\x03\x02\x02\x02\u02BB\u02BC\x05\xCBd\x02\u02BC" + + "\u02BD\x05\xEFv\x02\u02BDh\x03\x02\x02\x02\u02BE\u02BF\x05\xE5q\x02\u02BF" + + "\u02C0\x05\xF3x\x02\u02C0\u02C1\x05\xE1o\x02\u02C1\u02C2\x05\xE1o\x02" + + "\u02C2j\x03\x02\x02\x02\u02C3\u02C4\x07q\x02\x02\u02C4\u02C5\x07t\x02" + + "\x02\u02C5l\x03\x02\x02\x02\u02C6\u02C7\x07+\x02\x02\u02C7n\x03\x02\x02" + + "\x02\u02C8\u02C9\x07a\x02\x02\u02C9p\x03\x02\x02\x02\u02CA\u02CB\x07k" + + "\x02\x02\u02CB\u02CC\x07p\x02\x02\u02CC\u02CD\x07h\x02\x02\u02CD\u02CE" + + "\x07q\x02\x02\u02CEr\x03\x02\x02\x02\u02CF\u02D0\x07h\x02\x02\u02D0\u02D1" + + "\x07w\x02\x02\u02D1\u02D2\x07p\x02\x02\u02D2\u02D3\x07e\x02\x02\u02D3" + + "\u02D4\x07v\x02\x02\u02D4\u02D5\x07k\x02\x02\u02D5\u02D6\x07q\x02\x02" + + "\u02D6\u02D7\x07p\x02\x02\u02D7\u02D8\x07u\x02\x02\u02D8t\x03\x02\x02" + + "\x02\u02D9\u02DA\x07v\x02\x02\u02DA\u02DB\x07t\x02\x02\u02DB\u02DC\x07" + + "w\x02\x02\u02DC\u02E3\x07g\x02\x02\u02DD\u02DE\x07h\x02\x02\u02DE\u02DF" + + "\x07c\x02\x02\u02DF\u02E0\x07n\x02\x02\u02E0\u02E1\x07u\x02\x02\u02E1" + + "\u02E3\x07g\x02\x02\u02E2\u02D9\x03\x02\x02\x02\u02E2\u02DD\x03\x02\x02" + + "\x02\u02E3v\x03\x02\x02\x02\u02E4\u02E5\x07?\x02\x02\u02E5\u02EF\x07?" + + "\x02\x02\u02E6\u02E7\x07#\x02\x02\u02E7\u02EF\x07?\x02\x02\u02E8\u02EF" + + "\x07>\x02\x02\u02E9\u02EA\x07>\x02\x02\u02EA\u02EF\x07?\x02\x02\u02EB" + + "\u02EF\x07@\x02\x02\u02EC\u02ED\x07@\x02\x02\u02ED\u02EF\x07?\x02\x02" + + "\u02EE\u02E4\x03\x02\x02\x02\u02EE\u02E6\x03\x02\x02\x02\u02EE\u02E8\x03" + + "\x02\x02\x02\u02EE\u02E9\x03\x02\x02\x02\u02EE\u02EB\x03\x02\x02\x02\u02EE" + + "\u02EC\x03\x02\x02\x02\u02EFx\x03\x02\x02\x02\u02F0\u02F1\x07-\x02\x02" + + "\u02F1z\x03\x02\x02\x02\u02F2\u02F3\x07/\x02\x02\u02F3|\x03\x02\x02\x02" + + "\u02F4\u02F5\x07,\x02\x02\u02F5~\x03\x02\x02\x02\u02F6\u02F7\x071\x02" + + "\x02\u02F7\x80\x03\x02\x02\x02\u02F8\u02F9\x07\'\x02\x02\u02F9\x82\x03" + + "\x02\x02\x02\u02FA\u02FB\x073\x02\x02\u02FB\u02FC\x072\x02\x02\u02FC\x84" + + "\x03\x02\x02\x02\u02FD\u02FE\x07c\x02\x02\u02FE\u02FF\x07u\x02\x02\u02FF" + + "\u0305\x07e\x02\x02\u0300\u0301\x07f\x02\x02\u0301\u0302\x07g\x02\x02" + + "\u0302\u0303\x07u\x02\x02\u0303\u0305\x07e\x02\x02\u0304\u02FD\x03\x02" + + "\x02\x02\u0304\u0300\x03\x02\x02\x02\u0305\x86\x03\x02\x02\x02\u0306\u0307" + + "\x07p\x02\x02\u0307\u0308\x07w\x02\x02\u0308\u0309\x07n\x02\x02\u0309" + + "\u030A\x07n\x02\x02\u030A\u030B\x07u\x02\x02\u030B\x88\x03\x02\x02\x02" + + "\u030C\u030D\x07h\x02\x02\u030D\u030E\x07k\x02\x02\u030E\u030F\x07t\x02" + + "\x02\u030F\u0310\x07u\x02\x02\u0310\u0316\x07v\x02\x02\u0311\u0312\x07" + + "n\x02\x02\u0312\u0313\x07c\x02\x02\u0313\u0314\x07u\x02\x02\u0314\u0316" + + "\x07v\x02\x02\u0315\u030C\x03\x02\x02\x02\u0315\u0311\x03\x02\x02\x02" + + "\u0316\x8A\x03\x02\x02\x02\u0317\u0318\x05\xEDu\x02\u0318\u0319\x05\xE7" + + "r\x02\u0319\u031A\x05\xF3x\x02\u031A\u031B\x05\xE5q\x02\u031B\u031C\x05" + + "\xD1g\x02\u031C\u0482\x03\x02\x02\x02\u031D\u031E\x05\xCBd\x02\u031E\u031F" + + "\x05\xCDe\x02\u031F\u0320\x05\xEFv\x02\u0320\u0482\x03\x02\x02\x02\u0321" + + "\u0322\x05\xE9s\x02\u0322\u0323\x05\xE7r\x02\u0323\u0324\x05\xF7z\x02" + + "\u0324\u0482\x03\x02\x02\x02\u0325\u0326\x05\xE1o\x02\u0326\u0327\x05" + + "\xE7r\x02\u0327\u0328\x05\xD7j\x02\u0328\u0329\x05\x83@\x02\u0329\u0482" + + "\x03\x02\x02\x02\u032A\u032B\x05\xE9s\x02\u032B\u032C\x05\xDBl\x02\u032C" + + "\u0482\x03\x02\x02\x02\u032D\u032E\x05\xF1w\x02\u032E\u032F\x05\xCBd\x02" + + "\u032F\u0330\x05\xF3x\x02\u0330\u0482\x03\x02\x02\x02\u0331\u0482\x05" + + "\xD3h\x02\u0332\u0333\x05\xEFv\x02\u0333\u0334\x05\xF3x\x02\u0334\u0335" + + "\x05\xCDe\x02\u0335\u0336\x05\xEFv\x02\u0336\u0337\x05\xF1w\x02\u0337" + + "\u0338\x05\xEDu\x02\u0338\u0339\x05\xDBl\x02\u0339\u033A\x05\xE5q\x02" + + "\u033A\u033B\x05\xD7j\x02\u033B\u0482\x03\x02\x02\x02\u033C\u033D\x05" + + "\xF1w\x02\u033D\u033E\x05\xEDu\x02\u033E\u033F\x05\xDBl\x02\u033F\u0340" + + "\x05\xE3p\x02\u0340\u0482\x03\x02\x02\x02\u0341\u0342\x05\xCFf\x02\u0342" + + "\u0343\x05\xE7r\x02\u0343\u0344\x05\xE5q\x02\u0344\u0345\x05\xCFf\x02" + + "\u0345\u0346\x05\xCBd\x02\u0346\u0347\x05\xF1w\x02\u0347\u0482\x03\x02" + + "\x02\x02\u0348\u0349\x05\xEFv\x02\u0349\u034A\x05\xF1w\x02\u034A\u034B" + + "\x05\xCBd\x02\u034B\u034C\x05\xEDu\x02\u034C\u034D\x05\xF1w\x02\u034D" + + "\u034E\x05\xEFv\x02\u034E\u034F\x05o6\x02\u034F\u0350\x05\xF7z\x02\u0350" + + "\u0351\x05\xDBl\x02\u0351\u0352\x05\xF1w\x02\u0352\u0353\x05\xD9k\x02" + + "\u0353\u0482\x03\x02\x02\x02\u0354\u0355\x05\xD1g\x02\u0355\u0356\x05" + + "\xCBd\x02\u0356\u0357\x05\xF1w\x02\u0357\u0358\x05\xD3h\x02\u0358\u0359" + + "\x05o6\x02\u0359\u035A\x05\xD5i\x02\u035A\u035B\x05\xE7r\x02\u035B\u035C" + + "\x05\xEDu\x02\u035C\u035D\x05\xE3p\x02\u035D\u035E\x05\xCBd\x02\u035E" + + "\u035F\x05\xF1w\x02\u035F\u0482\x03\x02\x02\x02\u0360\u0361\x05\xD1g\x02" + + "\u0361\u0362\x05\xCBd\x02\u0362\u0363\x05\xF1w\x02\u0363\u0364\x05\xD3" + + "h\x02\u0364\u0365\x05o6\x02\u0365\u0366\x05\xF1w\x02\u0366\u0367\x05\xED" + + "u\x02\u0367\u0368\x05\xF3x\x02\u0368\u0369\x05\xE5q\x02\u0369\u036A\x05" + + "\xCFf\x02\u036A\u0482\x03\x02\x02\x02\u036B\u036C\x05\xD1g\x02\u036C\u036D" + + "\x05\xCBd\x02\u036D\u036E\x05\xF1w\x02\u036E\u036F\x05\xD3h\x02\u036F" + + "\u0370\x05o6\x02\u0370\u0371\x05\xE9s\x02\u0371\u0372\x05\xCBd\x02\u0372" + + "\u0373\x05\xEDu\x02\u0373\u0374\x05\xEFv\x02\u0374\u0375\x05\xD3h\x02" + + "\u0375\u0482\x03\x02\x02\x02\u0376\u0377\x05\xCBd\x02\u0377\u0378\x05" + + "\xF3x\x02\u0378\u0379\x05\xF1w\x02\u0379\u037A\x05\xE7r\x02\u037A\u037B" + + "\x05o6\x02\u037B\u037C\x05\xCDe\x02\u037C\u037D\x05\xF3x\x02\u037D\u037E" + + "\x05\xCFf\x02\u037E\u037F\x05\xDFn\x02\u037F\u0380\x05\xD3h\x02\u0380" + + "\u0381\x05\xF1w\x02\u0381\u0482\x03\x02\x02\x02\u0382\u0383\x05\xDBl\x02" + + "\u0383\u0384\x05\xEFv\x02\u0384\u0385\x05o6\x02\u0385\u0386\x05\xD5i\x02" + + "\u0386\u0387\x05\xDBl\x02\u0387\u0388\x05\xE5q\x02\u0388\u0389\x05\xDB" + + "l\x02\u0389\u038A\x05\xF1w\x02\u038A\u038B\x05\xD3h\x02\u038B\u0482\x03" + + "\x02\x02\x02\u038C\u038D\x05\xDBl\x02\u038D\u038E\x05\xEFv\x02\u038E\u038F" + + "\x05o6\x02\u038F\u0390\x05\xDBl\x02\u0390\u0391\x05\xE5q\x02\u0391\u0392" + + "\x05\xD5i\x02\u0392\u0393\x05\xDBl\x02\u0393\u0394\x05\xE5q\x02\u0394" + + "\u0395\x05\xDBl\x02\u0395\u0396\x05\xF1w\x02\u0396\u0397\x05\xD3h\x02" + + "\u0397\u0482\x03\x02\x02\x02\u0398\u0399\x05\xCFf\x02\u0399\u039A\x05" + + "\xCBd\x02\u039A\u039B\x05\xEFv\x02\u039B\u039C\x05\xD3h\x02\u039C\u0482" + + "\x03\x02\x02\x02\u039D\u039E\x05\xE1o\x02\u039E\u039F\x05\xD3h\x02\u039F" + + "\u03A0\x05\xE5q\x02\u03A0\u03A1\x05\xD7j\x02\u03A1\u03A2\x05\xF1w\x02" + + "\u03A2\u03A3\x05\xD9k\x02\u03A3\u0482\x03\x02\x02\x02\u03A4\u03A5\x05" + + "\xE3p\x02\u03A5\u03A6\x05\xF5y\x02\u03A6\u03A7\x05o6\x02\u03A7\u03A8\x05" + + "\xE3p\x02\u03A8\u03A9\x05\xCBd\x02\u03A9\u03AA\x05\xF9{\x02\u03AA\u0482" + + "\x03\x02\x02\x02\u03AB\u03AC\x05\xE3p\x02\u03AC\u03AD\x05\xF5y\x02\u03AD" + + "\u03AE\x05o6\x02\u03AE\u03AF\x05\xE3p\x02\u03AF\u03B0\x05\xDBl\x02\u03B0" + + "\u03B1\x05\xE5q\x02\u03B1\u0482\x03\x02\x02\x02\u03B2\u03B3\x05\xE3p\x02" + + "\u03B3\u03B4\x05\xF5y\x02\u03B4\u03B5\x05o6\x02\u03B5\u03B6\x05\xCBd\x02" + + "\u03B6\u03B7\x05\xF5y\x02\u03B7\u03B8\x05\xD7j\x02\u03B8\u0482\x03\x02" + + "\x02\x02\u03B9\u03BA\x05\xE3p\x02\u03BA\u03BB\x05\xF5y\x02\u03BB\u03BC" + + "\x05o6\x02\u03BC\u03BD\x05\xEFv\x02\u03BD\u03BE\x05\xF3x\x02\u03BE\u03BF" + + "\x05\xE3p\x02\u03BF\u0482\x03\x02\x02\x02\u03C0\u03C1\x05\xE3p\x02\u03C1" + + "\u03C2\x05\xF5y\x02\u03C2\u03C3\x05o6\x02\u03C3\u03C4\x05\xCFf\x02\u03C4" + + "\u03C5\x05\xE7r\x02\u03C5\u03C6\x05\xF3x\x02\u03C6\u03C7\x05\xE5q\x02" + + "\u03C7\u03C8\x05\xF1w\x02\u03C8\u0482\x03\x02\x02\x02\u03C9\u03CA\x05" + + "\xE3p\x02\u03CA\u03CB\x05\xF5y\x02\u03CB\u03CC\x05o6\x02\u03CC\u03CD\x05" + + "\xCFf\x02\u03CD\u03CE\x05\xE7r\x02\u03CE\u03CF\x05\xE5q\x02\u03CF\u03D0" + + "\x05\xCFf\x02\u03D0\u03D1\x05\xCBd\x02\u03D1\u03D2\x05\xF1w\x02\u03D2" + + "\u0482\x03\x02\x02\x02\u03D3\u03D4\x05\xE3p\x02\u03D4\u03D5\x05\xF5y\x02" + + "\u03D5\u03D6\x05o6\x02\u03D6\u03D7\x05\xDDm\x02\u03D7\u03D8\x05\xE7r\x02" + + "\u03D8\u03D9\x05\xDBl\x02\u03D9\u03DA\x05\xE5q\x02\u03DA\u0482\x03\x02" + + "\x02\x02\u03DB\u03DC\x05\xE3p\x02\u03DC\u03DD\x05\xF5y\x02\u03DD\u03DE" + + "\x05o6\x02\u03DE\u03DF\x05\xE3p\x02\u03DF\u03E0\x05\xD3h\x02\u03E0\u03E1" + + "\x05\xD1g\x02\u03E1\u03E2\x05\xDBl\x02\u03E2\u03E3\x05\xCBd\x02\u03E3" + + "\u03E4\x05\xE5q\x02\u03E4\u0482\x03\x02\x02\x02\u03E5\u03E6\x05\xE3p\x02" + + "\u03E6\u03E7\x05\xF5y\x02\u03E7\u03E8\x05o6\x02\u03E8\u03E9\x05\xD1g\x02" + + "\u03E9\u03EA\x05\xD3h\x02\u03EA\u03EB\x05\xD1g\x02\u03EB\u03EC\x05\xF3" + + "x\x02\u03EC\u03ED\x05\xE9s\x02\u03ED\u03EE\x05\xD3h\x02\u03EE\u0482\x03" + + "\x02\x02\x02\u03EF\u03F0\x05\xE3p\x02\u03F0\u03F1\x05\xD3h\x02\u03F1\u03F2" + + "\x05\xF1w\x02\u03F2\u03F3\x05\xCBd\x02\u03F3\u03F4\x05\xD1g\x02\u03F4" + + "\u03F5\x05\xCBd\x02\u03F5\u03F6\x05\xF1w\x02\u03F6\u03F7\x05\xCBd\x02" + + "\u03F7\u0482\x03\x02\x02\x02\u03F8\u03F9\x05\xEFv\x02\u03F9\u03FA\x05" + + "\xE9s\x02\u03FA\u03FB\x05\xE1o\x02\u03FB\u03FC\x05\xDBl\x02\u03FC\u03FD" + + "\x05\xF1w\x02\u03FD\u0482\x03\x02\x02\x02\u03FE\u03FF\x05\xF1w\x02\u03FF" + + "\u0400\x05\xE7r\x02\u0400\u0401\x05o6\x02\u0401\u0402\x05\xEFv\x02\u0402" + + "\u0403\x05\xF1w\x02\u0403\u0404\x05\xEDu\x02\u0404\u0405\x05\xDBl\x02" + + "\u0405\u0406\x05\xE5q\x02\u0406\u0407\x05\xD7j\x02\u0407\u0482\x03\x02" + + "\x02\x02\u0408\u0409\x05\xF1w\x02\u0409\u040A\x05\xE7r\x02\u040A\u040B" + + "\x05o6\x02\u040B\u040C\x05\xEFv\x02\u040C\u040D\x05\xF1w\x02\u040D\u040E" + + "\x05\xEDu\x02\u040E\u0482\x03\x02\x02\x02\u040F\u0410\x05\xF1w\x02\u0410" + + "\u0411\x05\xE7r\x02\u0411\u0412\x05o6\x02\u0412\u0413\x05\xCDe\x02\u0413" + + "\u0414\x05\xE7r\x02\u0414\u0415\x05\xE7r\x02\u0415\u0416\x05\xE1o\x02" + + "\u0416\u0482\x03\x02\x02\x02\u0417\u0418\x05\xF1w\x02\u0418\u0419\x05" + + "\xE7r\x02\u0419\u041A\x05o6\x02\u041A\u041B\x05\xCDe\x02\u041B\u041C\x05" + + "\xE7r\x02\u041C\u041D\x05\xE7r\x02\u041D\u041E\x05\xE1o\x02\u041E\u041F" + + "\x05\xD3h"; private static readonly _serializedATNSegment2: string = - "\x02\u043F\u02D5\x03\x02\x02\x02\u043F\u02DB\x03\x02\x02\x02\u043F\u02DF" + - "\x03\x02\x02\x02\u043F\u02E3\x03\x02\x02\x02\u043F\u02E8\x03\x02\x02\x02" + - "\u043F\u02EB\x03\x02\x02\x02\u043F\u02EF\x03\x02\x02\x02\u043F\u02F0\x03" + - "\x02\x02\x02\u043F\u02FA\x03\x02\x02\x02\u043F\u02FF\x03\x02\x02\x02\u043F" + - "\u0306\x03\x02\x02\x02\u043F\u0312\x03\x02\x02\x02\u043F\u031E\x03\x02" + - "\x02\x02\u043F\u0329\x03\x02\x02\x02\u043F\u0334\x03\x02\x02\x02\u043F" + - "\u0340\x03\x02\x02\x02\u043F\u034A\x03\x02\x02\x02\u043F\u0356\x03\x02" + - "\x02\x02\u043F\u035B\x03\x02\x02\x02\u043F\u0362\x03\x02\x02\x02\u043F" + - "\u0369\x03\x02\x02\x02\u043F\u0370\x03\x02\x02\x02\u043F\u0377\x03\x02" + - "\x02\x02\u043F\u037E\x03\x02\x02\x02\u043F\u0387\x03\x02\x02\x02\u043F" + - "\u0391\x03\x02\x02\x02\u043F\u0399\x03\x02\x02\x02\u043F\u03A3\x03\x02" + - "\x02\x02\u043F\u03AD\x03\x02\x02\x02\u043F\u03B6\x03\x02\x02\x02\u043F" + - "\u03BC\x03\x02\x02\x02\u043F\u03C6\x03\x02\x02\x02\u043F\u03CD\x03\x02" + - "\x02\x02\u043F\u03D5\x03\x02\x02\x02\u043F\u03E0\x03\x02\x02\x02\u043F" + - "\u03EC\x03\x02\x02\x02\u043F\u03F2\x03\x02\x02\x02\u043F\u03F9\x03\x02" + - "\x02\x02\u043F\u0403\x03\x02\x02\x02\u043F\u040A\x03\x02\x02\x02\u043F" + - "\u0415\x03\x02\x02\x02\u043F\u041D\x03\x02\x02\x02\u043F\u0423\x03\x02" + - "\x02\x02\u043F\u042E\x03\x02\x02\x02\u0440\x8C\x03\x02\x02\x02\u0441\u0442" + - "\x05\xCBd\x02\u0442\u0443\x05\xF5y\x02\u0443\u0444\x05\xD7j\x02\u0444" + - "\u0493\x03\x02\x02\x02\u0445\u0446\x05\xE3p\x02\u0446\u0447\x05\xDBl\x02" + - "\u0447\u0448\x05\xE5q\x02\u0448\u0493\x03\x02\x02\x02\u0449\u044A\x05" + - "\xE3p\x02\u044A\u044B\x05\xCBd\x02\u044B\u044C\x05\xF9{\x02\u044C\u0493" + - "\x03\x02\x02\x02\u044D\u044E\x05\xEFv\x02\u044E\u044F\x05\xF3x\x02\u044F" + - "\u0450\x05\xE3p\x02\u0450\u0493\x03\x02\x02\x02\u0451\u0452\x05\xCFf\x02" + - "\u0452\u0453\x05\xE7r\x02\u0453\u0454\x05\xF3x\x02\u0454\u0455\x05\xE5" + - "q\x02\u0455\u0456\x05\xF1w\x02\u0456\u0493\x03\x02\x02\x02\u0457\u0458" + - "\x05\xCFf\x02\u0458\u0459\x05\xE7r\x02\u0459\u045A\x05\xF3x\x02\u045A" + - "\u045B\x05\xE5q\x02\u045B\u045C\x05\xF1w\x02\u045C\u045D\x05o6\x02\u045D" + - "\u045E\x05\xD1g\x02\u045E\u045F\x05\xDBl\x02\u045F\u0460\x05\xEFv\x02" + - "\u0460\u0461\x05\xF1w\x02\u0461\u0462\x05\xDBl\x02\u0462\u0463\x05\xE5" + - "q\x02\u0463\u0464\x05\xCFf\x02\u0464\u0465\x05\xF1w\x02\u0465\u0493\x03" + - "\x02\x02\x02\u0466\u0467\x05\xE9s\x02\u0467\u0468\x05\xD3h\x02\u0468\u0469" + - "\x05\xEDu\x02\u0469\u046A\x05\xCFf\x02\u046A\u046B\x05\xD3h\x02\u046B" + - "\u046C\x05\xE5q\x02\u046C\u046D\x05\xF1w\x02\u046D\u046E\x05\xDBl\x02" + - "\u046E\u046F\x05\xE1o\x02\u046F\u0470\x05\xD3h\x02\u0470\u0493\x03\x02" + - "\x02\x02\u0471\u0472\x05\xE3p\x02\u0472\u0473\x05\xD3h\x02\u0473\u0474" + - "\x05\xD1g\x02\u0474\u0475\x05\xDBl\x02\u0475\u0476\x05\xCBd\x02\u0476" + - "\u0477\x05\xE5q\x02\u0477\u0493\x03\x02\x02\x02\u0478\u0479\x05\xE3p\x02" + - "\u0479\u047A\x05\xD3h\x02\u047A\u047B\x05\xD1g\x02\u047B\u047C\x05\xDB" + - "l\x02\u047C\u047D\x05\xCBd\x02\u047D\u047E\x05\xE5q\x02\u047E\u047F\x05" + - "o6\x02\u047F\u0480\x05\xCBd\x02\u0480\u0481\x05\xCDe\x02\u0481\u0482\x05" + - "\xEFv\x02\u0482\u0483\x05\xE7r\x02\u0483\u0484\x05\xE1o\x02\u0484\u0485" + - "\x05\xF3x\x02\u0485\u0486\x05\xF1w\x02\u0486\u0487\x05\xD3h\x02\u0487" + - "\u0488\x05o6\x02\u0488\u0489\x05\xD1g\x02\u0489\u048A\x05\xD3h\x02\u048A" + - "\u048B\x05\xF5y\x02\u048B\u048C\x05\xDBl\x02\u048C\u048D\x05\xCBd\x02" + - "\u048D\u048E\x05\xF1w\x02\u048E\u048F\x05\xDBl\x02\u048F\u0490\x05\xE7" + - "r\x02\u0490\u0491\x05\xE5q\x02\u0491\u0493\x03\x02\x02\x02\u0492\u0441" + - "\x03\x02\x02\x02\u0492\u0445\x03\x02\x02\x02\u0492\u0449\x03\x02\x02\x02" + - "\u0492\u044D\x03\x02\x02\x02\u0492\u0451\x03\x02\x02\x02\u0492\u0457\x03" + - "\x02\x02\x02\u0492\u0466\x03\x02\x02\x02\u0492\u0471\x03\x02\x02\x02\u0492" + - "\u0478\x03\x02\x02\x02\u0493\x8E\x03\x02\x02\x02\u0494\u0495\x05\xCFf" + - "\x02\u0495\u0496\x05\xDBl\x02\u0496\u0497\x05\xD1g\x02\u0497\u0498\x05" + - "\xEDu\x02\u0498\u0499\x05o6\x02\u0499\u049A\x05\xE3p\x02\u049A\u049B\x05" + - "\xCBd\x02\u049B\u049C\x05\xF1w\x02\u049C\u049D\x05\xCFf\x02\u049D\u049E" + - "\x05\xD9k\x02\u049E\x90\x03\x02\x02\x02\u049F\u04A6\x05=\x1D\x02\u04A0" + - "\u04A5\x05=\x1D\x02\u04A1\u04A5\x05;\x1C\x02\u04A2\u04A5\x07a\x02\x02" + - "\u04A3\u04A5\x05}=\x02\u04A4\u04A0\x03\x02\x02\x02\u04A4\u04A1\x03\x02" + - "\x02\x02\u04A4\u04A2\x03\x02\x02\x02\u04A4\u04A3\x03\x02\x02\x02\u04A5" + - "\u04A8\x03\x02\x02\x02\u04A6\u04A4\x03\x02\x02\x02\u04A6\u04A7\x03\x02" + - "\x02\x02\u04A7\u04B3\x03\x02\x02\x02\u04A8\u04A6\x03\x02\x02\x02\u04A9" + - "\u04AE\t\n\x02\x02\u04AA\u04AF\x05=\x1D\x02\u04AB\u04AF\x05;\x1C\x02\u04AC" + - "\u04AF\x07a\x02\x02\u04AD\u04AF\x05}=\x02\u04AE\u04AA\x03\x02\x02\x02" + - "\u04AE\u04AB\x03\x02\x02\x02\u04AE\u04AC\x03\x02\x02\x02\u04AE\u04AD\x03" + - "\x02\x02\x02\u04AF\u04B0\x03\x02\x02\x02\u04B0\u04AE\x03\x02\x02\x02\u04B0" + - "\u04B1\x03\x02\x02\x02\u04B1\u04B3\x03\x02\x02\x02\u04B2\u049F\x03\x02" + - "\x02\x02\u04B2\u04A9\x03\x02\x02\x02\u04B3\x92\x03\x02\x02\x02\u04B4\u04BA" + - "\x07b\x02\x02\u04B5\u04B9\n\v\x02\x02\u04B6\u04B7\x07b\x02\x02\u04B7\u04B9" + - "\x07b\x02\x02\u04B8\u04B5\x03\x02\x02\x02\u04B8\u04B6\x03\x02\x02\x02" + - "\u04B9\u04BC\x03\x02\x02\x02\u04BA\u04B8\x03\x02\x02\x02\u04BA\u04BB\x03" + - "\x02\x02\x02\u04BB\u04BD\x03\x02\x02\x02\u04BC\u04BA\x03\x02\x02\x02\u04BD" + - "\u04BE\x07b\x02\x02\u04BE\x94\x03\x02\x02\x02\u04BF\u04C0\x05)\x13\x02" + - "\u04C0\u04C1\x03\x02\x02\x02\u04C1\u04C2\bI\x06\x02\u04C2\x96\x03\x02" + - "\x02\x02\u04C3\u04C4\x05+\x14\x02\u04C4\u04C5\x03\x02\x02\x02\u04C5\u04C6" + - "\bJ\x06\x02\u04C6\x98\x03\x02\x02\x02\u04C7\u04C8\x05-\x15\x02\u04C8\u04C9" + - "\x03\x02\x02\x02\u04C9\u04CA\bK\x06\x02\u04CA\x9A\x03\x02\x02\x02\u04CB" + - "\u04CC\x07~\x02\x02\u04CC\u04CD\x03\x02\x02\x02\u04CD\u04CE\bL\t\x02\u04CE" + - "\u04CF\bL\n\x02\u04CF\x9C\x03\x02\x02\x02\u04D0\u04D1\x07]\x02\x02\u04D1" + - "\u04D2\x03\x02\x02\x02\u04D2\u04D3\bM\x07\x02\u04D3\u04D4\bM\x04\x02\u04D4" + - "\u04D5\bM\x04\x02\u04D5\x9E\x03\x02\x02\x02\u04D6\u04D7\x07_\x02\x02\u04D7" + - "\u04D8\x03\x02\x02\x02\u04D8\u04D9\bN\n\x02\u04D9\u04DA\bN\n\x02\u04DA" + - "\u04DB\bN\v\x02\u04DB\xA0\x03\x02\x02\x02\u04DC\u04DD\x07.\x02\x02\u04DD" + - "\u04DE\x03\x02\x02\x02\u04DE\u04DF\bO\f\x02\u04DF\xA2\x03\x02\x02\x02" + - "\u04E0\u04E1\x07?\x02\x02\u04E1\u04E2\x03\x02\x02\x02\u04E2\u04E3\bP\r" + - "\x02\u04E3\xA4\x03\x02\x02\x02\u04E4\u04E5\x05\xE3p\x02\u04E5\u04E6\x05" + - "\xD3h\x02\u04E6\u04E7\x05\xF1w\x02\u04E7\u04E8\x05\xCBd\x02\u04E8\u04E9" + - "\x05\xD1g\x02\u04E9\u04EA\x05\xCBd\x02\u04EA\u04EB\x05\xF1w\x02\u04EB" + - "\u04EC\x05\xCBd\x02\u04EC\xA6\x03\x02\x02\x02\u04ED\u04EF\x05\xA9S\x02" + - "\u04EE\u04ED\x03\x02\x02\x02\u04EF\u04F0\x03\x02\x02\x02\u04F0\u04EE\x03" + - "\x02\x02\x02\u04F0\u04F1\x03\x02\x02\x02\u04F1\xA8\x03\x02\x02\x02\u04F2" + - "\u04F4\n\f\x02\x02\u04F3\u04F2\x03\x02\x02\x02\u04F4\u04F5\x03\x02\x02" + - "\x02\u04F5\u04F3\x03\x02\x02\x02\u04F5\u04F6\x03\x02\x02\x02\u04F6\u04FA" + - "\x03\x02\x02\x02\u04F7\u04F8\x071\x02\x02\u04F8\u04FA\n\r\x02\x02\u04F9" + - "\u04F3\x03\x02\x02\x02\u04F9\u04F7\x03\x02\x02\x02\u04FA\xAA\x03\x02\x02" + - "\x02\u04FB\u04FC\x05\x93H\x02\u04FC\xAC\x03\x02\x02\x02\u04FD\u04FE\x05" + - ")\x13\x02\u04FE\u04FF\x03\x02\x02\x02\u04FF\u0500\bU\x06\x02\u0500\xAE" + - "\x03\x02\x02\x02\u0501\u0502\x05+\x14\x02\u0502\u0503\x03\x02\x02\x02" + - "\u0503\u0504\bV\x06\x02\u0504\xB0\x03\x02\x02\x02\u0505\u0506\x05-\x15" + - "\x02\u0506\u0507\x03\x02\x02\x02\u0507\u0508\bW\x06\x02\u0508\xB2\x03" + - "\x02\x02\x02\u0509\u050A\x05\xE7r\x02\u050A\u050B\x05\xE5q\x02\u050B\xB4" + - "\x03\x02\x02\x02\u050C\u050D\x05\xF7z\x02\u050D\u050E\x05\xDBl\x02\u050E" + - "\u050F\x05\xF1w\x02\u050F\u0510\x05\xD9k\x02\u0510\xB6\x03\x02\x02\x02" + - "\u0511\u0512\x07~\x02\x02\u0512\u0513\x03\x02\x02\x02\u0513\u0514\bZ\t" + - "\x02\u0514\u0515\bZ\n\x02\u0515\xB8\x03\x02\x02\x02\u0516\u0517\x07_\x02" + - "\x02\u0517\u0518\x03\x02\x02\x02\u0518\u0519\b[\n\x02\u0519\u051A\b[\n" + - "\x02\u051A\u051B\b[\v\x02\u051B\xBA\x03\x02\x02\x02\u051C\u051D\x07.\x02" + - "\x02\u051D\u051E\x03\x02\x02\x02\u051E\u051F\b\\\f\x02\u051F\xBC\x03\x02" + - "\x02\x02\u0520\u0521\x07?\x02\x02\u0521\u0522\x03\x02\x02\x02\u0522\u0523" + - "\b]\r\x02\u0523\xBE\x03\x02\x02\x02\u0524\u0526\x05\xC1_\x02\u0525\u0524" + - "\x03\x02\x02\x02\u0526\u0527\x03\x02\x02\x02\u0527\u0525\x03\x02\x02\x02" + - "\u0527\u0528\x03\x02\x02\x02\u0528\xC0\x03\x02\x02\x02\u0529\u052B\n\f" + - "\x02\x02\u052A\u0529\x03\x02\x02\x02\u052B\u052C\x03\x02\x02\x02\u052C" + - "\u052A\x03\x02\x02\x02\u052C\u052D\x03\x02\x02\x02\u052D\u0531\x03\x02" + - "\x02\x02\u052E\u052F\x071\x02\x02\u052F\u0531\n\r\x02\x02\u0530\u052A" + - "\x03\x02\x02\x02\u0530\u052E\x03\x02\x02\x02\u0531\xC2\x03\x02\x02\x02" + - "\u0532\u0533\x05\x93H\x02\u0533\xC4\x03\x02\x02\x02\u0534\u0535\x05)\x13" + - "\x02\u0535\u0536\x03\x02\x02\x02\u0536\u0537\ba\x06\x02\u0537\xC6\x03" + - "\x02\x02\x02\u0538\u0539\x05+\x14\x02\u0539\u053A\x03\x02\x02\x02\u053A" + - "\u053B\bb\x06\x02\u053B\xC8\x03\x02\x02\x02\u053C\u053D\x05-\x15\x02\u053D" + - "\u053E\x03\x02\x02\x02\u053E\u053F\bc\x06\x02\u053F\xCA\x03\x02\x02\x02" + - "\u0540\u0541\t\x0E\x02\x02\u0541\xCC\x03\x02\x02\x02\u0542\u0543\t\x0F" + - "\x02\x02\u0543\xCE\x03\x02\x02\x02\u0544\u0545\t\x10\x02\x02\u0545\xD0" + - "\x03\x02\x02\x02\u0546\u0547\t\x11\x02\x02\u0547\xD2\x03\x02\x02\x02\u0548" + - "\u0549\t\b\x02\x02\u0549\xD4\x03\x02\x02\x02\u054A\u054B\t\x12\x02\x02" + - "\u054B\xD6\x03\x02\x02\x02\u054C\u054D\t\x13\x02\x02\u054D\xD8\x03\x02" + - "\x02\x02\u054E\u054F\t\x14\x02\x02\u054F\xDA\x03\x02\x02\x02\u0550\u0551" + - "\t\x15\x02\x02\u0551\xDC\x03\x02\x02\x02\u0552\u0553\t\x16\x02\x02\u0553" + - "\xDE\x03\x02\x02\x02\u0554\u0555\t\x17\x02\x02\u0555\xE0\x03\x02\x02\x02" + - "\u0556\u0557\t\x18\x02\x02\u0557\xE2\x03\x02\x02\x02\u0558\u0559\t\x19" + - "\x02\x02\u0559\xE4\x03\x02\x02\x02\u055A\u055B\t\x1A\x02\x02\u055B\xE6" + - "\x03\x02\x02\x02\u055C\u055D\t\x1B\x02\x02\u055D\xE8\x03\x02\x02\x02\u055E" + - "\u055F\t\x1C\x02\x02\u055F\xEA\x03\x02\x02\x02\u0560\u0561\t\x1D\x02\x02" + - "\u0561\xEC\x03\x02\x02\x02\u0562\u0563\t\x1E\x02\x02\u0563\xEE\x03\x02" + - "\x02\x02\u0564\u0565\t\x1F\x02\x02\u0565\xF0\x03\x02\x02\x02\u0566\u0567" + - "\t \x02\x02\u0567\xF2\x03\x02\x02\x02\u0568\u0569\t!\x02\x02\u0569\xF4" + - "\x03\x02\x02\x02\u056A\u056B\t\"\x02\x02\u056B\xF6\x03\x02\x02\x02\u056C" + - "\u056D\t#\x02\x02\u056D\xF8\x03\x02\x02\x02\u056E\u056F\t$\x02\x02\u056F" + - "\xFA\x03\x02\x02\x02\u0570\u0571\t%\x02\x02\u0571\xFC\x03\x02\x02\x02" + - "\u0572\u0573\t&\x02\x02\u0573\xFE\x03\x02\x02\x022\x02\x03\x04\x05\x06" + + "\x02\u041F\u0420\x05\xCBd\x02\u0420\u0421\x05\xE5q\x02\u0421\u0482\x03" + + "\x02\x02\x02\u0422\u0423\x05\xF1w\x02\u0423\u0424\x05\xE7r\x02\u0424\u0425" + + "\x05o6\x02\u0425\u0426\x05\xD1g\x02\u0426\u0427\x05\xCBd\x02\u0427\u0428" + + "\x05\xF1w\x02\u0428\u0429\x05\xD3h\x02\u0429\u042A\x05\xF1w\x02\u042A" + + "\u042B\x05\xDBl\x02\u042B\u042C\x05\xE3p\x02\u042C\u042D\x05\xD3h\x02" + + "\u042D\u0482\x03\x02\x02\x02\u042E\u042F\x05\xF1w\x02\u042F\u0430\x05" + + "\xE7r\x02\u0430\u0431\x05o6\x02\u0431\u0432\x05\xD1g\x02\u0432\u0433\x05" + + "\xF1w\x02\u0433\u0482\x03\x02\x02\x02\u0434\u0435\x05\xF1w\x02\u0435\u0436" + + "\x05\xE7r\x02\u0436\u0437\x05o6\x02\u0437\u0438\x05\xD1g\x02\u0438\u0439" + + "\x05\xCDe\x02\u0439\u043A\x05\xE1o\x02\u043A\u0482\x03\x02\x02\x02\u043B" + + "\u043C\x05\xF1w\x02\u043C\u043D\x05\xE7r\x02\u043D\u043E\x05o6\x02\u043E" + + "\u043F\x05\xD1g\x02\u043F\u0440\x05\xE7r\x02\u0440\u0441\x05\xF3x\x02" + + "\u0441\u0442\x05\xCDe\x02\u0442\u0443\x05\xE1o\x02\u0443\u0444\x05\xD3" + + "h\x02\u0444\u0482\x03\x02\x02\x02\u0445\u0446\x05\xF1w\x02\u0446\u0447" + + "\x05\xE7r\x02\u0447\u0448\x05o6\x02\u0448\u0449\x05\xDBl\x02\u0449\u044A" + + "\x05\xE5q\x02\u044A\u044B\x05\xF1w\x02\u044B\u0482\x03\x02\x02\x02\u044C" + + "\u044D\x05\xF1w\x02\u044D\u044E\x05\xE7r\x02\u044E\u044F\x05o6\x02\u044F" + + "\u0450\x05\xDBl\x02\u0450\u0451\x05\xE5q\x02\u0451\u0452\x05\xF1w\x02" + + "\u0452\u0453\x05\xD3h\x02\u0453\u0454\x05\xD7j\x02\u0454\u0455\x05\xD3" + + "h\x02\u0455\u0456\x05\xEDu\x02\u0456\u0482\x03\x02\x02\x02\u0457\u0458" + + "\x05\xF1w\x02\u0458\u0459\x05\xE7r\x02\u0459\u045A\x05o6\x02\u045A\u045B" + + "\x05\xE1o\x02\u045B\u045C\x05\xE7r\x02\u045C\u045D\x05\xE5q\x02\u045D" + + "\u045E\x05\xD7j\x02\u045E\u0482\x03\x02\x02\x02\u045F\u0460\x05\xF1w\x02" + + "\u0460\u0461\x05\xE7r\x02\u0461\u0462\x05o6\x02\u0462\u0463\x05\xDBl\x02" + + "\u0463\u0464\x05\xE9s\x02\u0464\u0482\x03\x02\x02\x02\u0465\u0466\x05" + + "\xF1w\x02\u0466\u0467\x05\xE7r\x02\u0467\u0468\x05o6\x02\u0468\u0469\x05" + + "\xF5y\x02\u0469\u046A\x05\xD3h\x02\u046A\u046B\x05\xEDu\x02\u046B\u046C" + + "\x05\xEFv\x02\u046C\u046D\x05\xDBl\x02\u046D\u046E\x05\xE7r\x02\u046E" + + "\u046F\x05\xE5q\x02\u046F\u0482\x03\x02\x02\x02\u0470\u0471\x05\xF1w\x02" + + "\u0471\u0472\x05\xE7r\x02\u0472\u0473\x05o6\x02\u0473\u0474\x05\xF3x\x02" + + "\u0474\u0475\x05\xE5q\x02\u0475\u0476\x05\xEFv\x02\u0476\u0477\x05\xDB" + + "l\x02\u0477\u0478\x05\xD7j\x02\u0478\u0479\x05\xE5q\x02\u0479\u047A\x05" + + "\xD3h\x02\u047A\u047B\x05\xD1g\x02\u047B\u047C\x05o6\x02\u047C\u047D\x05" + + "\xE1o\x02\u047D\u047E\x05\xE7r\x02\u047E\u047F\x05\xE5q\x02\u047F\u0480" + + "\x05\xD7j\x02\u0480\u0482\x03\x02\x02\x02\u0481\u0317\x03\x02\x02\x02" + + "\u0481\u031D\x03\x02\x02\x02\u0481\u0321\x03\x02\x02\x02\u0481\u0325\x03" + + "\x02\x02\x02\u0481\u032A\x03\x02\x02\x02\u0481\u032D\x03\x02\x02\x02\u0481" + + "\u0331\x03\x02\x02\x02\u0481\u0332\x03\x02\x02\x02\u0481\u033C\x03\x02" + + "\x02\x02\u0481\u0341\x03\x02\x02\x02\u0481\u0348\x03\x02\x02\x02\u0481" + + "\u0354\x03\x02\x02\x02\u0481\u0360\x03\x02\x02\x02\u0481\u036B\x03\x02" + + "\x02\x02\u0481\u0376\x03\x02\x02\x02\u0481\u0382\x03\x02\x02\x02\u0481" + + "\u038C\x03\x02\x02\x02\u0481\u0398\x03\x02\x02\x02\u0481\u039D\x03\x02" + + "\x02\x02\u0481\u03A4\x03\x02\x02\x02\u0481\u03AB\x03\x02\x02\x02\u0481" + + "\u03B2\x03\x02\x02\x02\u0481\u03B9\x03\x02\x02\x02\u0481\u03C0\x03\x02" + + "\x02\x02\u0481\u03C9\x03\x02\x02\x02\u0481\u03D3\x03\x02\x02\x02\u0481" + + "\u03DB\x03\x02\x02\x02\u0481\u03E5\x03\x02\x02\x02\u0481\u03EF\x03\x02" + + "\x02\x02\u0481\u03F8\x03\x02\x02\x02\u0481\u03FE\x03\x02\x02\x02\u0481" + + "\u0408\x03\x02\x02\x02\u0481\u040F\x03\x02\x02\x02\u0481\u0417\x03\x02" + + "\x02\x02\u0481\u0422\x03\x02\x02\x02\u0481\u042E\x03\x02\x02\x02\u0481" + + "\u0434\x03\x02\x02\x02\u0481\u043B\x03\x02\x02\x02\u0481\u0445\x03\x02" + + "\x02\x02\u0481\u044C\x03\x02\x02\x02\u0481\u0457\x03\x02\x02\x02\u0481" + + "\u045F\x03\x02\x02\x02\u0481\u0465\x03\x02\x02\x02\u0481\u0470\x03\x02" + + "\x02\x02\u0482\x8C\x03\x02\x02\x02\u0483\u0484\x05\xCBd\x02\u0484\u0485" + + "\x05\xF5y\x02\u0485\u0486\x05\xD7j\x02\u0486\u04D5\x03\x02\x02\x02\u0487" + + "\u0488\x05\xE3p\x02\u0488\u0489\x05\xDBl\x02\u0489\u048A\x05\xE5q\x02" + + "\u048A\u04D5\x03\x02\x02\x02\u048B\u048C\x05\xE3p\x02\u048C\u048D\x05" + + "\xCBd\x02\u048D\u048E\x05\xF9{\x02\u048E\u04D5\x03\x02\x02\x02\u048F\u0490" + + "\x05\xEFv\x02\u0490\u0491\x05\xF3x\x02\u0491\u0492\x05\xE3p\x02\u0492" + + "\u04D5\x03\x02\x02\x02\u0493\u0494\x05\xCFf\x02\u0494\u0495\x05\xE7r\x02" + + "\u0495\u0496\x05\xF3x\x02\u0496\u0497\x05\xE5q\x02\u0497\u0498\x05\xF1" + + "w\x02\u0498\u04D5\x03\x02\x02\x02\u0499\u049A\x05\xCFf\x02\u049A\u049B" + + "\x05\xE7r\x02\u049B\u049C\x05\xF3x\x02\u049C\u049D\x05\xE5q\x02\u049D" + + "\u049E\x05\xF1w\x02\u049E\u049F\x05o6\x02\u049F\u04A0\x05\xD1g\x02\u04A0" + + "\u04A1\x05\xDBl\x02\u04A1\u04A2\x05\xEFv\x02\u04A2\u04A3\x05\xF1w\x02" + + "\u04A3\u04A4\x05\xDBl\x02\u04A4\u04A5\x05\xE5q\x02\u04A5\u04A6\x05\xCF" + + "f\x02\u04A6\u04A7\x05\xF1w\x02\u04A7\u04D5\x03\x02\x02\x02\u04A8\u04A9" + + "\x05\xE9s\x02\u04A9\u04AA\x05\xD3h\x02\u04AA\u04AB\x05\xEDu\x02\u04AB" + + "\u04AC\x05\xCFf\x02\u04AC\u04AD\x05\xD3h\x02\u04AD\u04AE\x05\xE5q\x02" + + "\u04AE\u04AF\x05\xF1w\x02\u04AF\u04B0\x05\xDBl\x02\u04B0\u04B1\x05\xE1" + + "o\x02\u04B1\u04B2\x05\xD3h\x02\u04B2\u04D5\x03\x02\x02\x02\u04B3\u04B4" + + "\x05\xE3p\x02\u04B4\u04B5\x05\xD3h\x02\u04B5\u04B6\x05\xD1g\x02\u04B6" + + "\u04B7\x05\xDBl\x02\u04B7\u04B8\x05\xCBd\x02\u04B8\u04B9\x05\xE5q\x02" + + "\u04B9\u04D5\x03\x02\x02\x02\u04BA\u04BB\x05\xE3p\x02\u04BB\u04BC\x05" + + "\xD3h\x02\u04BC\u04BD\x05\xD1g\x02\u04BD\u04BE\x05\xDBl\x02\u04BE\u04BF" + + "\x05\xCBd\x02\u04BF\u04C0\x05\xE5q\x02\u04C0\u04C1\x05o6\x02\u04C1\u04C2" + + "\x05\xCBd\x02\u04C2\u04C3\x05\xCDe\x02\u04C3\u04C4\x05\xEFv\x02\u04C4" + + "\u04C5\x05\xE7r\x02\u04C5\u04C6\x05\xE1o\x02\u04C6\u04C7\x05\xF3x\x02" + + "\u04C7\u04C8\x05\xF1w\x02\u04C8\u04C9\x05\xD3h\x02\u04C9\u04CA\x05o6\x02" + + "\u04CA\u04CB\x05\xD1g\x02\u04CB\u04CC\x05\xD3h\x02\u04CC\u04CD\x05\xF5" + + "y\x02\u04CD\u04CE\x05\xDBl\x02\u04CE\u04CF\x05\xCBd\x02\u04CF\u04D0\x05" + + "\xF1w\x02\u04D0\u04D1\x05\xDBl\x02\u04D1\u04D2\x05\xE7r\x02\u04D2\u04D3" + + "\x05\xE5q\x02\u04D3\u04D5\x03\x02\x02\x02\u04D4\u0483\x03\x02\x02\x02" + + "\u04D4\u0487\x03\x02\x02\x02\u04D4\u048B\x03\x02\x02\x02\u04D4\u048F\x03" + + "\x02\x02\x02\u04D4\u0493\x03\x02\x02\x02\u04D4\u0499\x03\x02\x02\x02\u04D4" + + "\u04A8\x03\x02\x02\x02\u04D4\u04B3\x03\x02\x02\x02\u04D4\u04BA\x03\x02" + + "\x02\x02\u04D5\x8E\x03\x02\x02\x02\u04D6\u04D7\x05\xCFf\x02\u04D7\u04D8" + + "\x05\xDBl\x02\u04D8\u04D9\x05\xD1g\x02\u04D9\u04DA\x05\xEDu\x02\u04DA" + + "\u04DB\x05o6\x02\u04DB\u04DC\x05\xE3p\x02\u04DC\u04DD\x05\xCBd\x02\u04DD" + + "\u04DE\x05\xF1w\x02\u04DE\u04DF\x05\xCFf\x02\u04DF\u04E0\x05\xD9k\x02" + + "\u04E0\x90\x03\x02\x02\x02\u04E1\u04E8\x05=\x1D\x02\u04E2\u04E7\x05=\x1D" + + "\x02\u04E3\u04E7\x05;\x1C\x02\u04E4\u04E7\x07a\x02\x02\u04E5\u04E7\x05" + + "}=\x02\u04E6\u04E2\x03\x02\x02\x02\u04E6\u04E3\x03\x02\x02\x02\u04E6\u04E4" + + "\x03\x02\x02\x02\u04E6\u04E5\x03\x02\x02\x02\u04E7\u04EA\x03\x02\x02\x02" + + "\u04E8\u04E6\x03\x02\x02\x02\u04E8\u04E9\x03\x02\x02\x02\u04E9\u04F5\x03" + + "\x02\x02\x02\u04EA\u04E8\x03\x02\x02\x02\u04EB\u04F0\t\n\x02\x02\u04EC" + + "\u04F1\x05=\x1D\x02\u04ED\u04F1\x05;\x1C\x02\u04EE\u04F1\x07a\x02\x02" + + "\u04EF\u04F1\x05}=\x02\u04F0\u04EC\x03\x02\x02\x02\u04F0\u04ED\x03\x02" + + "\x02\x02\u04F0\u04EE\x03\x02\x02\x02\u04F0\u04EF\x03\x02\x02\x02\u04F1" + + "\u04F2\x03\x02\x02\x02\u04F2\u04F0\x03\x02\x02\x02\u04F2\u04F3\x03\x02" + + "\x02\x02\u04F3\u04F5\x03\x02\x02\x02\u04F4\u04E1\x03\x02\x02\x02\u04F4" + + "\u04EB\x03\x02\x02\x02\u04F5\x92\x03\x02\x02\x02\u04F6\u04FC\x07b\x02" + + "\x02\u04F7\u04FB\n\v\x02\x02\u04F8\u04F9\x07b\x02\x02\u04F9\u04FB\x07" + + "b\x02\x02\u04FA\u04F7\x03\x02\x02\x02\u04FA\u04F8\x03\x02\x02\x02\u04FB" + + "\u04FE\x03\x02\x02\x02\u04FC\u04FA\x03\x02\x02\x02\u04FC\u04FD\x03\x02" + + "\x02\x02\u04FD\u04FF\x03\x02\x02\x02\u04FE\u04FC\x03\x02\x02\x02\u04FF" + + "\u0500\x07b\x02\x02\u0500\x94\x03\x02\x02\x02\u0501\u0502\x05)\x13\x02" + + "\u0502\u0503\x03\x02\x02\x02\u0503\u0504\bI\x06\x02\u0504\x96\x03\x02" + + "\x02\x02\u0505\u0506\x05+\x14\x02\u0506\u0507\x03\x02\x02\x02\u0507\u0508" + + "\bJ\x06\x02\u0508\x98\x03\x02\x02\x02\u0509\u050A\x05-\x15\x02\u050A\u050B" + + "\x03\x02\x02\x02\u050B\u050C\bK\x06\x02\u050C\x9A\x03\x02\x02\x02\u050D" + + "\u050E\x07~\x02\x02\u050E\u050F\x03\x02\x02\x02\u050F\u0510\bL\t\x02\u0510" + + "\u0511\bL\n\x02\u0511\x9C\x03\x02\x02\x02\u0512\u0513\x07]\x02\x02\u0513" + + "\u0514\x03\x02\x02\x02\u0514\u0515\bM\x07\x02\u0515\u0516\bM\x04\x02\u0516" + + "\u0517\bM\x04\x02\u0517\x9E\x03\x02\x02\x02\u0518\u0519\x07_\x02\x02\u0519" + + "\u051A\x03\x02\x02\x02\u051A\u051B\bN\n\x02\u051B\u051C\bN\n\x02\u051C" + + "\u051D\bN\v\x02\u051D\xA0\x03\x02\x02\x02\u051E\u051F\x07.\x02\x02\u051F" + + "\u0520\x03\x02\x02\x02\u0520\u0521\bO\f\x02\u0521\xA2\x03\x02\x02\x02" + + "\u0522\u0523\x07?\x02\x02\u0523\u0524\x03\x02\x02\x02\u0524\u0525\bP\r" + + "\x02\u0525\xA4\x03\x02\x02\x02\u0526\u0527\x05\xE3p\x02\u0527\u0528\x05" + + "\xD3h\x02\u0528\u0529\x05\xF1w\x02\u0529\u052A\x05\xCBd\x02\u052A\u052B" + + "\x05\xD1g\x02\u052B\u052C\x05\xCBd\x02\u052C\u052D\x05\xF1w\x02\u052D" + + "\u052E\x05\xCBd\x02\u052E\xA6\x03\x02\x02\x02\u052F\u0531\x05\xA9S\x02" + + "\u0530\u052F\x03\x02\x02\x02\u0531\u0532\x03\x02\x02\x02\u0532\u0530\x03" + + "\x02\x02\x02\u0532\u0533\x03\x02\x02\x02\u0533\xA8\x03\x02\x02\x02\u0534" + + "\u0536\n\f\x02\x02\u0535\u0534\x03\x02\x02\x02\u0536\u0537\x03\x02\x02" + + "\x02\u0537\u0535\x03\x02\x02\x02\u0537\u0538\x03\x02\x02\x02\u0538\u053C" + + "\x03\x02\x02\x02\u0539\u053A\x071\x02\x02\u053A\u053C\n\r\x02\x02\u053B" + + "\u0535\x03\x02\x02\x02\u053B\u0539\x03\x02\x02\x02\u053C\xAA\x03\x02\x02" + + "\x02\u053D\u053E\x05\x93H\x02\u053E\xAC\x03\x02\x02\x02\u053F\u0540\x05" + + ")\x13\x02\u0540\u0541\x03\x02\x02\x02\u0541\u0542\bU\x06\x02\u0542\xAE" + + "\x03\x02\x02\x02\u0543\u0544\x05+\x14\x02\u0544\u0545\x03\x02\x02\x02" + + "\u0545\u0546\bV\x06\x02\u0546\xB0\x03\x02\x02\x02\u0547\u0548\x05-\x15" + + "\x02\u0548\u0549\x03\x02\x02\x02\u0549\u054A\bW\x06\x02\u054A\xB2\x03" + + "\x02\x02\x02\u054B\u054C\x05\xE7r\x02\u054C\u054D\x05\xE5q\x02\u054D\xB4" + + "\x03\x02\x02\x02\u054E\u054F\x05\xF7z\x02\u054F\u0550\x05\xDBl\x02\u0550" + + "\u0551\x05\xF1w\x02\u0551\u0552\x05\xD9k\x02\u0552\xB6\x03\x02\x02\x02" + + "\u0553\u0554\x07~\x02\x02\u0554\u0555\x03\x02\x02\x02\u0555\u0556\bZ\t" + + "\x02\u0556\u0557\bZ\n\x02\u0557\xB8\x03\x02\x02\x02\u0558\u0559\x07_\x02" + + "\x02\u0559\u055A\x03\x02\x02\x02\u055A\u055B\b[\n\x02\u055B\u055C\b[\n" + + "\x02\u055C\u055D\b[\v\x02\u055D\xBA\x03\x02\x02\x02\u055E\u055F\x07.\x02" + + "\x02\u055F\u0560\x03\x02\x02\x02\u0560\u0561\b\\\f\x02\u0561\xBC\x03\x02" + + "\x02\x02\u0562\u0563\x07?\x02\x02\u0563\u0564\x03\x02\x02\x02\u0564\u0565" + + "\b]\r\x02\u0565\xBE\x03\x02\x02\x02\u0566\u0568\x05\xC1_\x02\u0567\u0566" + + "\x03\x02\x02\x02\u0568\u0569\x03\x02\x02\x02\u0569\u0567\x03\x02\x02\x02" + + "\u0569\u056A\x03\x02\x02\x02\u056A\xC0\x03\x02\x02\x02\u056B\u056D\n\f" + + "\x02\x02\u056C\u056B\x03\x02\x02\x02\u056D\u056E\x03\x02\x02\x02\u056E" + + "\u056C\x03\x02\x02\x02\u056E\u056F\x03\x02\x02\x02\u056F\u0573\x03\x02" + + "\x02\x02\u0570\u0571\x071\x02\x02\u0571\u0573\n\r\x02\x02\u0572\u056C" + + "\x03\x02\x02\x02\u0572\u0570\x03\x02\x02\x02\u0573\xC2\x03\x02\x02\x02" + + "\u0574\u0575\x05\x93H\x02\u0575\xC4\x03\x02\x02\x02\u0576\u0577\x05)\x13" + + "\x02\u0577\u0578\x03\x02\x02\x02\u0578\u0579\ba\x06\x02\u0579\xC6\x03" + + "\x02\x02\x02\u057A\u057B\x05+\x14\x02\u057B\u057C\x03\x02\x02\x02\u057C" + + "\u057D\bb\x06\x02\u057D\xC8\x03\x02\x02\x02\u057E\u057F\x05-\x15\x02\u057F" + + "\u0580\x03\x02\x02\x02\u0580\u0581\bc\x06\x02\u0581\xCA\x03\x02\x02\x02" + + "\u0582\u0583\t\x0E\x02\x02\u0583\xCC\x03\x02\x02\x02\u0584\u0585\t\x0F" + + "\x02\x02\u0585\xCE\x03\x02\x02\x02\u0586\u0587\t\x10\x02\x02\u0587\xD0" + + "\x03\x02\x02\x02\u0588\u0589\t\x11\x02\x02\u0589\xD2\x03\x02\x02\x02\u058A" + + "\u058B\t\b\x02\x02\u058B\xD4\x03\x02\x02\x02\u058C\u058D\t\x12\x02\x02" + + "\u058D\xD6\x03\x02\x02\x02\u058E\u058F\t\x13\x02\x02\u058F\xD8\x03\x02" + + "\x02\x02\u0590\u0591\t\x14\x02\x02\u0591\xDA\x03\x02\x02\x02\u0592\u0593" + + "\t\x15\x02\x02\u0593\xDC\x03\x02\x02\x02\u0594\u0595\t\x16\x02\x02\u0595" + + "\xDE\x03\x02\x02\x02\u0596\u0597\t\x17\x02\x02\u0597\xE0\x03\x02\x02\x02" + + "\u0598\u0599\t\x18\x02\x02\u0599\xE2\x03\x02\x02\x02\u059A\u059B\t\x19" + + "\x02\x02\u059B\xE4\x03\x02\x02\x02\u059C\u059D\t\x1A\x02\x02\u059D\xE6" + + "\x03\x02\x02\x02\u059E\u059F\t\x1B\x02\x02\u059F\xE8\x03\x02\x02\x02\u05A0" + + "\u05A1\t\x1C\x02\x02\u05A1\xEA\x03\x02\x02\x02\u05A2\u05A3\t\x1D\x02\x02" + + "\u05A3\xEC\x03\x02\x02\x02\u05A4\u05A5\t\x1E\x02\x02\u05A5\xEE\x03\x02" + + "\x02\x02\u05A6\u05A7\t\x1F\x02\x02\u05A7\xF0\x03\x02\x02\x02\u05A8\u05A9" + + "\t \x02\x02\u05A9\xF2\x03\x02\x02\x02\u05AA\u05AB\t!\x02\x02\u05AB\xF4" + + "\x03\x02\x02\x02\u05AC\u05AD\t\"\x02\x02\u05AD\xF6\x03\x02\x02\x02\u05AE" + + "\u05AF\t#\x02\x02\u05AF\xF8\x03\x02\x02\x02\u05B0\u05B1\t$\x02\x02\u05B1" + + "\xFA\x03\x02\x02\x02\u05B2\u05B3\t%\x02\x02\u05B3\xFC\x03\x02\x02\x02" + + "\u05B4\u05B5\t&\x02\x02\u05B5\xFE\x03\x02\x02\x022\x02\x03\x04\x05\x06" + "\u0190\u0194\u0197\u01A0\u01A2\u01AD\u01D6\u01DB\u01E0\u01E2\u01ED\u01F5" + - "\u01F8\u01FA\u01FF\u0204\u020A\u0211\u0216\u021C\u021F\u0227\u022B\u024C" + - "\u02A0\u02AC\u02C2\u02D3\u043F\u0492\u04A4\u04A6\u04AE\u04B0\u04B2\u04B8" + - "\u04BA\u04F0\u04F5\u04F9\u0527\u052C\u0530\x0E\x07\x04\x02\x07\x03\x02" + + "\u01F8\u01FA\u01FF\u0204\u020A\u0211\u0216\u021C\u021F\u0227\u022B\u028E" + + "\u02E2\u02EE\u0304\u0315\u0481\u04D4\u04E6\u04E8\u04F0\u04F2\u04F4\u04FA" + + "\u04FC\u0532\u0537\u053B\u0569\u056E\u0572\x0E\x07\x04\x02\x07\x03\x02" + "\x07\x05\x02\x07\x06\x02\x02\x03\x02\t%\x02\x07\x02\x02\t\x1A\x02\x06" + "\x02\x02\t&\x02\t\"\x02\t!\x02"; public static readonly _serializedATN: string = Utils.join( diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 b/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 index b062dc4f140e7..af48024e56cc9 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 @@ -98,6 +98,10 @@ mathEvalFn : mathFunctionIdentifier LP (mathFunctionExpressionArgument (COMMA mathFunctionExpressionArgument)*)? RP ; +dateExpression + : quantifier=number DATE_LITERAL + ; + operatorExpression : primaryExpression | mathFn @@ -110,6 +114,7 @@ operatorExpression primaryExpression : constant | qualifiedName + | dateExpression | LP booleanExpression RP | identifier LP (booleanExpression (COMMA booleanExpression)*)? RP ; @@ -173,7 +178,7 @@ mathFunctionExpressionArgument | string | number | operatorExpression - | number (DATE_LITERAL) + | dateExpression | comparison ; diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp index 8c0671e0d0a59..378d85247dc13 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp @@ -182,6 +182,7 @@ valueExpression comparison mathFn mathEvalFn +dateExpression operatorExpression primaryExpression rowCommand @@ -229,4 +230,4 @@ showCommand atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 83, 594, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 130, 10, 3, 12, 3, 14, 3, 133, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 139, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 154, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 160, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 166, 10, 6, 12, 6, 14, 6, 169, 11, 6, 5, 6, 171, 10, 6, 3, 7, 3, 7, 3, 7, 5, 7, 176, 10, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 193, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 200, 10, 10, 12, 10, 14, 10, 203, 11, 10, 3, 10, 3, 10, 3, 10, 5, 10, 208, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 215, 10, 10, 12, 10, 14, 10, 218, 11, 10, 5, 10, 220, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 227, 10, 10, 3, 10, 3, 10, 5, 10, 231, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 239, 10, 10, 12, 10, 14, 10, 242, 11, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 256, 10, 11, 12, 11, 14, 11, 259, 11, 11, 3, 12, 3, 12, 5, 12, 263, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 270, 10, 12, 3, 12, 3, 12, 3, 12, 5, 12, 275, 10, 12, 3, 13, 3, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 290, 10, 15, 12, 15, 14, 15, 293, 11, 15, 5, 15, 295, 10, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 304, 10, 16, 12, 16, 14, 16, 307, 11, 16, 5, 16, 309, 10, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 5, 17, 319, 10, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 327, 10, 17, 12, 17, 14, 17, 330, 11, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 343, 10, 18, 12, 18, 14, 18, 346, 11, 18, 5, 18, 348, 10, 18, 3, 18, 3, 18, 5, 18, 352, 10, 18, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 7, 20, 360, 10, 20, 12, 20, 14, 20, 363, 11, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 370, 10, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 380, 10, 24, 12, 24, 14, 24, 383, 11, 24, 3, 24, 5, 24, 386, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 7, 25, 393, 10, 25, 12, 25, 14, 25, 396, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 5, 27, 405, 10, 27, 3, 27, 3, 27, 5, 27, 409, 10, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 5, 30, 418, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 428, 10, 31, 3, 32, 3, 32, 3, 32, 7, 32, 433, 10, 32, 12, 32, 14, 32, 436, 11, 32, 3, 33, 3, 33, 3, 33, 7, 33, 441, 10, 33, 12, 33, 14, 33, 444, 11, 33, 3, 34, 3, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 460, 10, 37, 12, 37, 14, 37, 463, 11, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 471, 10, 37, 12, 37, 14, 37, 474, 11, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 482, 10, 37, 12, 37, 14, 37, 485, 11, 37, 3, 37, 3, 37, 5, 37, 489, 10, 37, 3, 38, 3, 38, 5, 38, 493, 10, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 502, 10, 40, 12, 40, 14, 40, 505, 11, 40, 3, 41, 3, 41, 5, 41, 509, 10, 41, 3, 41, 3, 41, 5, 41, 513, 10, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 7, 45, 527, 10, 45, 12, 45, 14, 45, 530, 11, 45, 3, 46, 3, 46, 3, 46, 3, 46, 7, 46, 536, 10, 46, 12, 46, 14, 46, 539, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 549, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 7, 50, 558, 10, 50, 12, 50, 14, 50, 561, 11, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 5, 53, 571, 10, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 5, 60, 592, 10, 60, 3, 60, 2, 2, 6, 4, 18, 20, 32, 61, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 88, 2, 90, 2, 92, 2, 94, 2, 96, 2, 98, 2, 100, 2, 102, 2, 104, 2, 106, 2, 108, 2, 110, 2, 112, 2, 114, 2, 116, 2, 118, 2, 2, 7, 3, 2, 53, 54, 3, 2, 55, 57, 3, 2, 78, 79, 3, 2, 71, 72, 4, 2, 55, 55, 65, 66, 2, 623, 2, 120, 3, 2, 2, 2, 4, 123, 3, 2, 2, 2, 6, 138, 3, 2, 2, 2, 8, 153, 3, 2, 2, 2, 10, 155, 3, 2, 2, 2, 12, 175, 3, 2, 2, 2, 14, 179, 3, 2, 2, 2, 16, 182, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 247, 3, 2, 2, 2, 22, 274, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 280, 3, 2, 2, 2, 28, 284, 3, 2, 2, 2, 30, 298, 3, 2, 2, 2, 32, 318, 3, 2, 2, 2, 34, 351, 3, 2, 2, 2, 36, 353, 3, 2, 2, 2, 38, 356, 3, 2, 2, 2, 40, 369, 3, 2, 2, 2, 42, 371, 3, 2, 2, 2, 44, 373, 3, 2, 2, 2, 46, 375, 3, 2, 2, 2, 48, 387, 3, 2, 2, 2, 50, 399, 3, 2, 2, 2, 52, 402, 3, 2, 2, 2, 54, 410, 3, 2, 2, 2, 56, 412, 3, 2, 2, 2, 58, 417, 3, 2, 2, 2, 60, 427, 3, 2, 2, 2, 62, 429, 3, 2, 2, 2, 64, 437, 3, 2, 2, 2, 66, 445, 3, 2, 2, 2, 68, 447, 3, 2, 2, 2, 70, 449, 3, 2, 2, 2, 72, 488, 3, 2, 2, 2, 74, 492, 3, 2, 2, 2, 76, 494, 3, 2, 2, 2, 78, 497, 3, 2, 2, 2, 80, 506, 3, 2, 2, 2, 82, 514, 3, 2, 2, 2, 84, 517, 3, 2, 2, 2, 86, 520, 3, 2, 2, 2, 88, 523, 3, 2, 2, 2, 90, 531, 3, 2, 2, 2, 92, 540, 3, 2, 2, 2, 94, 544, 3, 2, 2, 2, 96, 550, 3, 2, 2, 2, 98, 554, 3, 2, 2, 2, 100, 562, 3, 2, 2, 2, 102, 566, 3, 2, 2, 2, 104, 570, 3, 2, 2, 2, 106, 572, 3, 2, 2, 2, 108, 574, 3, 2, 2, 2, 110, 576, 3, 2, 2, 2, 112, 578, 3, 2, 2, 2, 114, 580, 3, 2, 2, 2, 116, 583, 3, 2, 2, 2, 118, 591, 3, 2, 2, 2, 120, 121, 5, 4, 3, 2, 121, 122, 7, 2, 2, 3, 122, 3, 3, 2, 2, 2, 123, 124, 8, 3, 1, 2, 124, 125, 5, 6, 4, 2, 125, 131, 3, 2, 2, 2, 126, 127, 12, 3, 2, 2, 127, 128, 7, 26, 2, 2, 128, 130, 5, 8, 5, 2, 129, 126, 3, 2, 2, 2, 130, 133, 3, 2, 2, 2, 131, 129, 3, 2, 2, 2, 131, 132, 3, 2, 2, 2, 132, 5, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 134, 139, 5, 114, 58, 2, 135, 139, 5, 46, 24, 2, 136, 139, 5, 36, 19, 2, 137, 139, 5, 118, 60, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 7, 3, 2, 2, 2, 140, 154, 5, 50, 26, 2, 141, 154, 5, 76, 39, 2, 142, 154, 5, 82, 42, 2, 143, 154, 5, 84, 43, 2, 144, 154, 5, 90, 46, 2, 145, 154, 5, 86, 44, 2, 146, 154, 5, 94, 48, 2, 147, 154, 5, 96, 49, 2, 148, 154, 5, 78, 40, 2, 149, 154, 5, 52, 27, 2, 150, 154, 5, 16, 9, 2, 151, 154, 5, 14, 8, 2, 152, 154, 5, 10, 6, 2, 153, 140, 3, 2, 2, 2, 153, 141, 3, 2, 2, 2, 153, 142, 3, 2, 2, 2, 153, 143, 3, 2, 2, 2, 153, 144, 3, 2, 2, 2, 153, 145, 3, 2, 2, 2, 153, 146, 3, 2, 2, 2, 153, 147, 3, 2, 2, 2, 153, 148, 3, 2, 2, 2, 153, 149, 3, 2, 2, 2, 153, 150, 3, 2, 2, 2, 153, 151, 3, 2, 2, 2, 153, 152, 3, 2, 2, 2, 154, 9, 3, 2, 2, 2, 155, 156, 7, 18, 2, 2, 156, 159, 5, 56, 29, 2, 157, 158, 7, 76, 2, 2, 158, 160, 5, 42, 22, 2, 159, 157, 3, 2, 2, 2, 159, 160, 3, 2, 2, 2, 160, 170, 3, 2, 2, 2, 161, 162, 7, 77, 2, 2, 162, 167, 5, 12, 7, 2, 163, 164, 7, 34, 2, 2, 164, 166, 5, 12, 7, 2, 165, 163, 3, 2, 2, 2, 166, 169, 3, 2, 2, 2, 167, 165, 3, 2, 2, 2, 167, 168, 3, 2, 2, 2, 168, 171, 3, 2, 2, 2, 169, 167, 3, 2, 2, 2, 170, 161, 3, 2, 2, 2, 170, 171, 3, 2, 2, 2, 171, 11, 3, 2, 2, 2, 172, 173, 5, 42, 22, 2, 173, 174, 7, 33, 2, 2, 174, 176, 3, 2, 2, 2, 175, 172, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 178, 5, 42, 22, 2, 178, 13, 3, 2, 2, 2, 179, 180, 7, 12, 2, 2, 180, 181, 5, 64, 33, 2, 181, 15, 3, 2, 2, 2, 182, 183, 7, 10, 2, 2, 183, 184, 5, 18, 10, 2, 184, 17, 3, 2, 2, 2, 185, 186, 8, 10, 1, 2, 186, 187, 7, 39, 2, 2, 187, 231, 5, 18, 10, 10, 188, 231, 5, 24, 13, 2, 189, 231, 5, 22, 12, 2, 190, 192, 5, 24, 13, 2, 191, 193, 7, 39, 2, 2, 192, 191, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 195, 7, 42, 2, 2, 195, 196, 7, 36, 2, 2, 196, 201, 5, 24, 13, 2, 197, 198, 7, 34, 2, 2, 198, 200, 5, 24, 13, 2, 199, 197, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 201, 202, 3, 2, 2, 2, 202, 204, 3, 2, 2, 2, 203, 201, 3, 2, 2, 2, 204, 205, 7, 47, 2, 2, 205, 231, 3, 2, 2, 2, 206, 208, 7, 39, 2, 2, 207, 206, 3, 2, 2, 2, 207, 208, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 210, 7, 64, 2, 2, 210, 211, 7, 36, 2, 2, 211, 219, 5, 62, 32, 2, 212, 213, 7, 34, 2, 2, 213, 215, 5, 58, 30, 2, 214, 212, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 220, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 216, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 7, 47, 2, 2, 222, 231, 3, 2, 2, 2, 223, 224, 5, 24, 13, 2, 224, 226, 7, 43, 2, 2, 225, 227, 7, 39, 2, 2, 226, 225, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 229, 7, 45, 2, 2, 229, 231, 3, 2, 2, 2, 230, 185, 3, 2, 2, 2, 230, 188, 3, 2, 2, 2, 230, 189, 3, 2, 2, 2, 230, 190, 3, 2, 2, 2, 230, 207, 3, 2, 2, 2, 230, 223, 3, 2, 2, 2, 231, 240, 3, 2, 2, 2, 232, 233, 12, 7, 2, 2, 233, 234, 7, 32, 2, 2, 234, 239, 5, 18, 10, 8, 235, 236, 12, 6, 2, 2, 236, 237, 7, 46, 2, 2, 237, 239, 5, 18, 10, 7, 238, 232, 3, 2, 2, 2, 238, 235, 3, 2, 2, 2, 239, 242, 3, 2, 2, 2, 240, 238, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 19, 3, 2, 2, 2, 242, 240, 3, 2, 2, 2, 243, 244, 8, 11, 1, 2, 244, 245, 7, 39, 2, 2, 245, 248, 5, 20, 11, 6, 246, 248, 5, 24, 13, 2, 247, 243, 3, 2, 2, 2, 247, 246, 3, 2, 2, 2, 248, 257, 3, 2, 2, 2, 249, 250, 12, 4, 2, 2, 250, 251, 7, 32, 2, 2, 251, 256, 5, 20, 11, 5, 252, 253, 12, 3, 2, 2, 253, 254, 7, 46, 2, 2, 254, 256, 5, 20, 11, 4, 255, 249, 3, 2, 2, 2, 255, 252, 3, 2, 2, 2, 256, 259, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 21, 3, 2, 2, 2, 259, 257, 3, 2, 2, 2, 260, 262, 5, 24, 13, 2, 261, 263, 7, 39, 2, 2, 262, 261, 3, 2, 2, 2, 262, 263, 3, 2, 2, 2, 263, 264, 3, 2, 2, 2, 264, 265, 7, 40, 2, 2, 265, 266, 5, 110, 56, 2, 266, 275, 3, 2, 2, 2, 267, 269, 5, 24, 13, 2, 268, 270, 7, 39, 2, 2, 269, 268, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 272, 7, 41, 2, 2, 272, 273, 5, 110, 56, 2, 273, 275, 3, 2, 2, 2, 274, 260, 3, 2, 2, 2, 274, 267, 3, 2, 2, 2, 275, 23, 3, 2, 2, 2, 276, 279, 5, 32, 17, 2, 277, 279, 5, 26, 14, 2, 278, 276, 3, 2, 2, 2, 278, 277, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 5, 112, 57, 2, 282, 283, 5, 32, 17, 2, 283, 27, 3, 2, 2, 2, 284, 285, 5, 70, 36, 2, 285, 294, 7, 36, 2, 2, 286, 291, 5, 58, 30, 2, 287, 288, 7, 34, 2, 2, 288, 290, 5, 58, 30, 2, 289, 287, 3, 2, 2, 2, 290, 293, 3, 2, 2, 2, 291, 289, 3, 2, 2, 2, 291, 292, 3, 2, 2, 2, 292, 295, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 294, 286, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 296, 3, 2, 2, 2, 296, 297, 7, 47, 2, 2, 297, 29, 3, 2, 2, 2, 298, 299, 5, 68, 35, 2, 299, 308, 7, 36, 2, 2, 300, 305, 5, 60, 31, 2, 301, 302, 7, 34, 2, 2, 302, 304, 5, 60, 31, 2, 303, 301, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 309, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 300, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 311, 7, 47, 2, 2, 311, 31, 3, 2, 2, 2, 312, 313, 8, 17, 1, 2, 313, 319, 5, 34, 18, 2, 314, 319, 5, 28, 15, 2, 315, 319, 5, 30, 16, 2, 316, 317, 9, 2, 2, 2, 317, 319, 5, 32, 17, 5, 318, 312, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 318, 315, 3, 2, 2, 2, 318, 316, 3, 2, 2, 2, 319, 328, 3, 2, 2, 2, 320, 321, 12, 4, 2, 2, 321, 322, 9, 3, 2, 2, 322, 327, 5, 32, 17, 5, 323, 324, 12, 3, 2, 2, 324, 325, 9, 2, 2, 2, 325, 327, 5, 32, 17, 4, 326, 320, 3, 2, 2, 2, 326, 323, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 33, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 352, 5, 72, 37, 2, 332, 352, 5, 62, 32, 2, 333, 334, 7, 36, 2, 2, 334, 335, 5, 20, 11, 2, 335, 336, 7, 47, 2, 2, 336, 352, 3, 2, 2, 2, 337, 338, 5, 66, 34, 2, 338, 347, 7, 36, 2, 2, 339, 344, 5, 20, 11, 2, 340, 341, 7, 34, 2, 2, 341, 343, 5, 20, 11, 2, 342, 340, 3, 2, 2, 2, 343, 346, 3, 2, 2, 2, 344, 342, 3, 2, 2, 2, 344, 345, 3, 2, 2, 2, 345, 348, 3, 2, 2, 2, 346, 344, 3, 2, 2, 2, 347, 339, 3, 2, 2, 2, 347, 348, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 350, 7, 47, 2, 2, 350, 352, 3, 2, 2, 2, 351, 331, 3, 2, 2, 2, 351, 332, 3, 2, 2, 2, 351, 333, 3, 2, 2, 2, 351, 337, 3, 2, 2, 2, 352, 35, 3, 2, 2, 2, 353, 354, 7, 8, 2, 2, 354, 355, 5, 38, 20, 2, 355, 37, 3, 2, 2, 2, 356, 361, 5, 40, 21, 2, 357, 358, 7, 34, 2, 2, 358, 360, 5, 40, 21, 2, 359, 357, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 39, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 364, 370, 5, 20, 11, 2, 365, 366, 5, 44, 23, 2, 366, 367, 7, 33, 2, 2, 367, 368, 5, 20, 11, 2, 368, 370, 3, 2, 2, 2, 369, 364, 3, 2, 2, 2, 369, 365, 3, 2, 2, 2, 370, 41, 3, 2, 2, 2, 371, 372, 9, 4, 2, 2, 372, 43, 3, 2, 2, 2, 373, 374, 5, 66, 34, 2, 374, 45, 3, 2, 2, 2, 375, 376, 7, 7, 2, 2, 376, 381, 5, 54, 28, 2, 377, 378, 7, 34, 2, 2, 378, 380, 5, 54, 28, 2, 379, 377, 3, 2, 2, 2, 380, 383, 3, 2, 2, 2, 381, 379, 3, 2, 2, 2, 381, 382, 3, 2, 2, 2, 382, 385, 3, 2, 2, 2, 383, 381, 3, 2, 2, 2, 384, 386, 5, 48, 25, 2, 385, 384, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 47, 3, 2, 2, 2, 387, 388, 7, 37, 2, 2, 388, 389, 7, 70, 2, 2, 389, 394, 5, 54, 28, 2, 390, 391, 7, 34, 2, 2, 391, 393, 5, 54, 28, 2, 392, 390, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 397, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 7, 38, 2, 2, 398, 49, 3, 2, 2, 2, 399, 400, 7, 5, 2, 2, 400, 401, 5, 38, 20, 2, 401, 51, 3, 2, 2, 2, 402, 404, 7, 9, 2, 2, 403, 405, 5, 38, 20, 2, 404, 403, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 408, 3, 2, 2, 2, 406, 407, 7, 30, 2, 2, 407, 409, 5, 64, 33, 2, 408, 406, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 53, 3, 2, 2, 2, 410, 411, 9, 5, 2, 2, 411, 55, 3, 2, 2, 2, 412, 413, 9, 4, 2, 2, 413, 57, 3, 2, 2, 2, 414, 418, 5, 62, 32, 2, 415, 418, 5, 110, 56, 2, 416, 418, 5, 104, 53, 2, 417, 414, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 417, 416, 3, 2, 2, 2, 418, 59, 3, 2, 2, 2, 419, 428, 5, 62, 32, 2, 420, 428, 5, 110, 56, 2, 421, 428, 5, 104, 53, 2, 422, 428, 5, 32, 17, 2, 423, 424, 5, 104, 53, 2, 424, 425, 7, 31, 2, 2, 425, 428, 3, 2, 2, 2, 426, 428, 5, 26, 14, 2, 427, 419, 3, 2, 2, 2, 427, 420, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 427, 422, 3, 2, 2, 2, 427, 423, 3, 2, 2, 2, 427, 426, 3, 2, 2, 2, 428, 61, 3, 2, 2, 2, 429, 434, 5, 66, 34, 2, 430, 431, 7, 35, 2, 2, 431, 433, 5, 66, 34, 2, 432, 430, 3, 2, 2, 2, 433, 436, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 63, 3, 2, 2, 2, 436, 434, 3, 2, 2, 2, 437, 442, 5, 62, 32, 2, 438, 439, 7, 34, 2, 2, 439, 441, 5, 62, 32, 2, 440, 438, 3, 2, 2, 2, 441, 444, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 65, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 446, 9, 6, 2, 2, 446, 67, 3, 2, 2, 2, 447, 448, 7, 62, 2, 2, 448, 69, 3, 2, 2, 2, 449, 450, 7, 63, 2, 2, 450, 71, 3, 2, 2, 2, 451, 489, 7, 45, 2, 2, 452, 489, 5, 74, 38, 2, 453, 489, 5, 102, 52, 2, 454, 489, 5, 110, 56, 2, 455, 456, 7, 37, 2, 2, 456, 461, 5, 74, 38, 2, 457, 458, 7, 34, 2, 2, 458, 460, 5, 74, 38, 2, 459, 457, 3, 2, 2, 2, 460, 463, 3, 2, 2, 2, 461, 459, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 464, 3, 2, 2, 2, 463, 461, 3, 2, 2, 2, 464, 465, 7, 38, 2, 2, 465, 489, 3, 2, 2, 2, 466, 467, 7, 37, 2, 2, 467, 472, 5, 102, 52, 2, 468, 469, 7, 34, 2, 2, 469, 471, 5, 102, 52, 2, 470, 468, 3, 2, 2, 2, 471, 474, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 475, 3, 2, 2, 2, 474, 472, 3, 2, 2, 2, 475, 476, 7, 38, 2, 2, 476, 489, 3, 2, 2, 2, 477, 478, 7, 37, 2, 2, 478, 483, 5, 110, 56, 2, 479, 480, 7, 34, 2, 2, 480, 482, 5, 110, 56, 2, 481, 479, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 486, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 486, 487, 7, 38, 2, 2, 487, 489, 3, 2, 2, 2, 488, 451, 3, 2, 2, 2, 488, 452, 3, 2, 2, 2, 488, 453, 3, 2, 2, 2, 488, 454, 3, 2, 2, 2, 488, 455, 3, 2, 2, 2, 488, 466, 3, 2, 2, 2, 488, 477, 3, 2, 2, 2, 489, 73, 3, 2, 2, 2, 490, 493, 5, 106, 54, 2, 491, 493, 5, 108, 55, 2, 492, 490, 3, 2, 2, 2, 492, 491, 3, 2, 2, 2, 493, 75, 3, 2, 2, 2, 494, 495, 7, 13, 2, 2, 495, 496, 7, 28, 2, 2, 496, 77, 3, 2, 2, 2, 497, 498, 7, 11, 2, 2, 498, 503, 5, 80, 41, 2, 499, 500, 7, 34, 2, 2, 500, 502, 5, 80, 41, 2, 501, 499, 3, 2, 2, 2, 502, 505, 3, 2, 2, 2, 503, 501, 3, 2, 2, 2, 503, 504, 3, 2, 2, 2, 504, 79, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 506, 508, 5, 20, 11, 2, 507, 509, 7, 59, 2, 2, 508, 507, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 511, 7, 60, 2, 2, 511, 513, 7, 61, 2, 2, 512, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 81, 3, 2, 2, 2, 514, 515, 7, 14, 2, 2, 515, 516, 5, 64, 33, 2, 516, 83, 3, 2, 2, 2, 517, 518, 7, 19, 2, 2, 518, 519, 5, 64, 33, 2, 519, 85, 3, 2, 2, 2, 520, 521, 7, 15, 2, 2, 521, 522, 5, 64, 33, 2, 522, 87, 3, 2, 2, 2, 523, 528, 5, 66, 34, 2, 524, 525, 7, 35, 2, 2, 525, 527, 5, 66, 34, 2, 526, 524, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 89, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 532, 7, 16, 2, 2, 532, 537, 5, 92, 47, 2, 533, 534, 7, 34, 2, 2, 534, 536, 5, 92, 47, 2, 535, 533, 3, 2, 2, 2, 536, 539, 3, 2, 2, 2, 537, 535, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 91, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 540, 541, 5, 62, 32, 2, 541, 542, 7, 44, 2, 2, 542, 543, 5, 88, 45, 2, 543, 93, 3, 2, 2, 2, 544, 545, 7, 3, 2, 2, 545, 546, 5, 64, 33, 2, 546, 548, 5, 110, 56, 2, 547, 549, 5, 98, 50, 2, 548, 547, 3, 2, 2, 2, 548, 549, 3, 2, 2, 2, 549, 95, 3, 2, 2, 2, 550, 551, 7, 4, 2, 2, 551, 552, 5, 64, 33, 2, 552, 553, 5, 110, 56, 2, 553, 97, 3, 2, 2, 2, 554, 559, 5, 100, 51, 2, 555, 556, 7, 34, 2, 2, 556, 558, 5, 100, 51, 2, 557, 555, 3, 2, 2, 2, 558, 561, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 99, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 562, 563, 5, 66, 34, 2, 563, 564, 7, 33, 2, 2, 564, 565, 5, 72, 37, 2, 565, 101, 3, 2, 2, 2, 566, 567, 7, 51, 2, 2, 567, 103, 3, 2, 2, 2, 568, 571, 7, 29, 2, 2, 569, 571, 7, 28, 2, 2, 570, 568, 3, 2, 2, 2, 570, 569, 3, 2, 2, 2, 571, 105, 3, 2, 2, 2, 572, 573, 7, 29, 2, 2, 573, 107, 3, 2, 2, 2, 574, 575, 7, 28, 2, 2, 575, 109, 3, 2, 2, 2, 576, 577, 7, 27, 2, 2, 577, 111, 3, 2, 2, 2, 578, 579, 7, 52, 2, 2, 579, 113, 3, 2, 2, 2, 580, 581, 7, 6, 2, 2, 581, 582, 5, 116, 59, 2, 582, 115, 3, 2, 2, 2, 583, 584, 7, 37, 2, 2, 584, 585, 5, 4, 3, 2, 585, 586, 7, 38, 2, 2, 586, 117, 3, 2, 2, 2, 587, 588, 7, 17, 2, 2, 588, 592, 7, 49, 2, 2, 589, 590, 7, 17, 2, 2, 590, 592, 7, 50, 2, 2, 591, 587, 3, 2, 2, 2, 591, 589, 3, 2, 2, 2, 592, 119, 3, 2, 2, 2, 60, 131, 138, 153, 159, 167, 170, 175, 192, 201, 207, 216, 219, 226, 230, 238, 240, 247, 255, 257, 262, 269, 274, 278, 291, 294, 305, 308, 318, 326, 328, 344, 347, 351, 361, 369, 381, 385, 394, 404, 408, 417, 427, 434, 442, 461, 472, 483, 488, 492, 503, 508, 512, 528, 537, 548, 559, 570, 591] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 83, 598, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 132, 10, 3, 12, 3, 14, 3, 135, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 141, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 156, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 168, 10, 6, 12, 6, 14, 6, 171, 11, 6, 5, 6, 173, 10, 6, 3, 7, 3, 7, 3, 7, 5, 7, 178, 10, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 195, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 202, 10, 10, 12, 10, 14, 10, 205, 11, 10, 3, 10, 3, 10, 3, 10, 5, 10, 210, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 217, 10, 10, 12, 10, 14, 10, 220, 11, 10, 5, 10, 222, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 229, 10, 10, 3, 10, 3, 10, 5, 10, 233, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 241, 10, 10, 12, 10, 14, 10, 244, 11, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 250, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 258, 10, 11, 12, 11, 14, 11, 261, 11, 11, 3, 12, 3, 12, 5, 12, 265, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 272, 10, 12, 3, 12, 3, 12, 3, 12, 5, 12, 277, 10, 12, 3, 13, 3, 13, 5, 13, 281, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 292, 10, 15, 12, 15, 14, 15, 295, 11, 15, 5, 15, 297, 10, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 306, 10, 16, 12, 16, 14, 16, 309, 11, 16, 5, 16, 311, 10, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 324, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 332, 10, 18, 12, 18, 14, 18, 335, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 349, 10, 19, 12, 19, 14, 19, 352, 11, 19, 5, 19, 354, 10, 19, 3, 19, 3, 19, 5, 19, 358, 10, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 7, 21, 366, 10, 21, 12, 21, 14, 21, 369, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 376, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 7, 25, 386, 10, 25, 12, 25, 14, 25, 389, 11, 25, 3, 25, 5, 25, 392, 10, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 399, 10, 26, 12, 26, 14, 26, 402, 11, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 5, 28, 411, 10, 28, 3, 28, 3, 28, 5, 28, 415, 10, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 5, 31, 424, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 432, 10, 32, 3, 33, 3, 33, 3, 33, 7, 33, 437, 10, 33, 12, 33, 14, 33, 440, 11, 33, 3, 34, 3, 34, 3, 34, 7, 34, 445, 10, 34, 12, 34, 14, 34, 448, 11, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 464, 10, 38, 12, 38, 14, 38, 467, 11, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 475, 10, 38, 12, 38, 14, 38, 478, 11, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 7, 38, 486, 10, 38, 12, 38, 14, 38, 489, 11, 38, 3, 38, 3, 38, 5, 38, 493, 10, 38, 3, 39, 3, 39, 5, 39, 497, 10, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 7, 41, 506, 10, 41, 12, 41, 14, 41, 509, 11, 41, 3, 42, 3, 42, 5, 42, 513, 10, 42, 3, 42, 3, 42, 5, 42, 517, 10, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 7, 46, 531, 10, 46, 12, 46, 14, 46, 534, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 7, 47, 540, 10, 47, 12, 47, 14, 47, 543, 11, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 553, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 7, 51, 562, 10, 51, 12, 51, 14, 51, 565, 11, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 5, 54, 575, 10, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 5, 61, 596, 10, 61, 3, 61, 2, 2, 6, 4, 18, 20, 34, 62, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 88, 2, 90, 2, 92, 2, 94, 2, 96, 2, 98, 2, 100, 2, 102, 2, 104, 2, 106, 2, 108, 2, 110, 2, 112, 2, 114, 2, 116, 2, 118, 2, 120, 2, 2, 7, 3, 2, 53, 54, 3, 2, 55, 57, 3, 2, 78, 79, 3, 2, 71, 72, 4, 2, 55, 55, 65, 66, 2, 627, 2, 122, 3, 2, 2, 2, 4, 125, 3, 2, 2, 2, 6, 140, 3, 2, 2, 2, 8, 155, 3, 2, 2, 2, 10, 157, 3, 2, 2, 2, 12, 177, 3, 2, 2, 2, 14, 181, 3, 2, 2, 2, 16, 184, 3, 2, 2, 2, 18, 232, 3, 2, 2, 2, 20, 249, 3, 2, 2, 2, 22, 276, 3, 2, 2, 2, 24, 280, 3, 2, 2, 2, 26, 282, 3, 2, 2, 2, 28, 286, 3, 2, 2, 2, 30, 300, 3, 2, 2, 2, 32, 314, 3, 2, 2, 2, 34, 323, 3, 2, 2, 2, 36, 357, 3, 2, 2, 2, 38, 359, 3, 2, 2, 2, 40, 362, 3, 2, 2, 2, 42, 375, 3, 2, 2, 2, 44, 377, 3, 2, 2, 2, 46, 379, 3, 2, 2, 2, 48, 381, 3, 2, 2, 2, 50, 393, 3, 2, 2, 2, 52, 405, 3, 2, 2, 2, 54, 408, 3, 2, 2, 2, 56, 416, 3, 2, 2, 2, 58, 418, 3, 2, 2, 2, 60, 423, 3, 2, 2, 2, 62, 431, 3, 2, 2, 2, 64, 433, 3, 2, 2, 2, 66, 441, 3, 2, 2, 2, 68, 449, 3, 2, 2, 2, 70, 451, 3, 2, 2, 2, 72, 453, 3, 2, 2, 2, 74, 492, 3, 2, 2, 2, 76, 496, 3, 2, 2, 2, 78, 498, 3, 2, 2, 2, 80, 501, 3, 2, 2, 2, 82, 510, 3, 2, 2, 2, 84, 518, 3, 2, 2, 2, 86, 521, 3, 2, 2, 2, 88, 524, 3, 2, 2, 2, 90, 527, 3, 2, 2, 2, 92, 535, 3, 2, 2, 2, 94, 544, 3, 2, 2, 2, 96, 548, 3, 2, 2, 2, 98, 554, 3, 2, 2, 2, 100, 558, 3, 2, 2, 2, 102, 566, 3, 2, 2, 2, 104, 570, 3, 2, 2, 2, 106, 574, 3, 2, 2, 2, 108, 576, 3, 2, 2, 2, 110, 578, 3, 2, 2, 2, 112, 580, 3, 2, 2, 2, 114, 582, 3, 2, 2, 2, 116, 584, 3, 2, 2, 2, 118, 587, 3, 2, 2, 2, 120, 595, 3, 2, 2, 2, 122, 123, 5, 4, 3, 2, 123, 124, 7, 2, 2, 3, 124, 3, 3, 2, 2, 2, 125, 126, 8, 3, 1, 2, 126, 127, 5, 6, 4, 2, 127, 133, 3, 2, 2, 2, 128, 129, 12, 3, 2, 2, 129, 130, 7, 26, 2, 2, 130, 132, 5, 8, 5, 2, 131, 128, 3, 2, 2, 2, 132, 135, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 133, 134, 3, 2, 2, 2, 134, 5, 3, 2, 2, 2, 135, 133, 3, 2, 2, 2, 136, 141, 5, 116, 59, 2, 137, 141, 5, 48, 25, 2, 138, 141, 5, 38, 20, 2, 139, 141, 5, 120, 61, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 7, 3, 2, 2, 2, 142, 156, 5, 52, 27, 2, 143, 156, 5, 78, 40, 2, 144, 156, 5, 84, 43, 2, 145, 156, 5, 86, 44, 2, 146, 156, 5, 92, 47, 2, 147, 156, 5, 88, 45, 2, 148, 156, 5, 96, 49, 2, 149, 156, 5, 98, 50, 2, 150, 156, 5, 80, 41, 2, 151, 156, 5, 54, 28, 2, 152, 156, 5, 16, 9, 2, 153, 156, 5, 14, 8, 2, 154, 156, 5, 10, 6, 2, 155, 142, 3, 2, 2, 2, 155, 143, 3, 2, 2, 2, 155, 144, 3, 2, 2, 2, 155, 145, 3, 2, 2, 2, 155, 146, 3, 2, 2, 2, 155, 147, 3, 2, 2, 2, 155, 148, 3, 2, 2, 2, 155, 149, 3, 2, 2, 2, 155, 150, 3, 2, 2, 2, 155, 151, 3, 2, 2, 2, 155, 152, 3, 2, 2, 2, 155, 153, 3, 2, 2, 2, 155, 154, 3, 2, 2, 2, 156, 9, 3, 2, 2, 2, 157, 158, 7, 18, 2, 2, 158, 161, 5, 58, 30, 2, 159, 160, 7, 76, 2, 2, 160, 162, 5, 44, 23, 2, 161, 159, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 172, 3, 2, 2, 2, 163, 164, 7, 77, 2, 2, 164, 169, 5, 12, 7, 2, 165, 166, 7, 34, 2, 2, 166, 168, 5, 12, 7, 2, 167, 165, 3, 2, 2, 2, 168, 171, 3, 2, 2, 2, 169, 167, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 172, 163, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 11, 3, 2, 2, 2, 174, 175, 5, 44, 23, 2, 175, 176, 7, 33, 2, 2, 176, 178, 3, 2, 2, 2, 177, 174, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 179, 3, 2, 2, 2, 179, 180, 5, 44, 23, 2, 180, 13, 3, 2, 2, 2, 181, 182, 7, 12, 2, 2, 182, 183, 5, 66, 34, 2, 183, 15, 3, 2, 2, 2, 184, 185, 7, 10, 2, 2, 185, 186, 5, 18, 10, 2, 186, 17, 3, 2, 2, 2, 187, 188, 8, 10, 1, 2, 188, 189, 7, 39, 2, 2, 189, 233, 5, 18, 10, 10, 190, 233, 5, 24, 13, 2, 191, 233, 5, 22, 12, 2, 192, 194, 5, 24, 13, 2, 193, 195, 7, 39, 2, 2, 194, 193, 3, 2, 2, 2, 194, 195, 3, 2, 2, 2, 195, 196, 3, 2, 2, 2, 196, 197, 7, 42, 2, 2, 197, 198, 7, 36, 2, 2, 198, 203, 5, 24, 13, 2, 199, 200, 7, 34, 2, 2, 200, 202, 5, 24, 13, 2, 201, 199, 3, 2, 2, 2, 202, 205, 3, 2, 2, 2, 203, 201, 3, 2, 2, 2, 203, 204, 3, 2, 2, 2, 204, 206, 3, 2, 2, 2, 205, 203, 3, 2, 2, 2, 206, 207, 7, 47, 2, 2, 207, 233, 3, 2, 2, 2, 208, 210, 7, 39, 2, 2, 209, 208, 3, 2, 2, 2, 209, 210, 3, 2, 2, 2, 210, 211, 3, 2, 2, 2, 211, 212, 7, 64, 2, 2, 212, 213, 7, 36, 2, 2, 213, 221, 5, 64, 33, 2, 214, 215, 7, 34, 2, 2, 215, 217, 5, 60, 31, 2, 216, 214, 3, 2, 2, 2, 217, 220, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 222, 3, 2, 2, 2, 220, 218, 3, 2, 2, 2, 221, 218, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 224, 7, 47, 2, 2, 224, 233, 3, 2, 2, 2, 225, 226, 5, 24, 13, 2, 226, 228, 7, 43, 2, 2, 227, 229, 7, 39, 2, 2, 228, 227, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 7, 45, 2, 2, 231, 233, 3, 2, 2, 2, 232, 187, 3, 2, 2, 2, 232, 190, 3, 2, 2, 2, 232, 191, 3, 2, 2, 2, 232, 192, 3, 2, 2, 2, 232, 209, 3, 2, 2, 2, 232, 225, 3, 2, 2, 2, 233, 242, 3, 2, 2, 2, 234, 235, 12, 7, 2, 2, 235, 236, 7, 32, 2, 2, 236, 241, 5, 18, 10, 8, 237, 238, 12, 6, 2, 2, 238, 239, 7, 46, 2, 2, 239, 241, 5, 18, 10, 7, 240, 234, 3, 2, 2, 2, 240, 237, 3, 2, 2, 2, 241, 244, 3, 2, 2, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 19, 3, 2, 2, 2, 244, 242, 3, 2, 2, 2, 245, 246, 8, 11, 1, 2, 246, 247, 7, 39, 2, 2, 247, 250, 5, 20, 11, 6, 248, 250, 5, 24, 13, 2, 249, 245, 3, 2, 2, 2, 249, 248, 3, 2, 2, 2, 250, 259, 3, 2, 2, 2, 251, 252, 12, 4, 2, 2, 252, 253, 7, 32, 2, 2, 253, 258, 5, 20, 11, 5, 254, 255, 12, 3, 2, 2, 255, 256, 7, 46, 2, 2, 256, 258, 5, 20, 11, 4, 257, 251, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 258, 261, 3, 2, 2, 2, 259, 257, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 21, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 262, 264, 5, 24, 13, 2, 263, 265, 7, 39, 2, 2, 264, 263, 3, 2, 2, 2, 264, 265, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 267, 7, 40, 2, 2, 267, 268, 5, 112, 57, 2, 268, 277, 3, 2, 2, 2, 269, 271, 5, 24, 13, 2, 270, 272, 7, 39, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 275, 5, 112, 57, 2, 275, 277, 3, 2, 2, 2, 276, 262, 3, 2, 2, 2, 276, 269, 3, 2, 2, 2, 277, 23, 3, 2, 2, 2, 278, 281, 5, 34, 18, 2, 279, 281, 5, 26, 14, 2, 280, 278, 3, 2, 2, 2, 280, 279, 3, 2, 2, 2, 281, 25, 3, 2, 2, 2, 282, 283, 5, 34, 18, 2, 283, 284, 5, 114, 58, 2, 284, 285, 5, 34, 18, 2, 285, 27, 3, 2, 2, 2, 286, 287, 5, 72, 37, 2, 287, 296, 7, 36, 2, 2, 288, 293, 5, 60, 31, 2, 289, 290, 7, 34, 2, 2, 290, 292, 5, 60, 31, 2, 291, 289, 3, 2, 2, 2, 292, 295, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 293, 294, 3, 2, 2, 2, 294, 297, 3, 2, 2, 2, 295, 293, 3, 2, 2, 2, 296, 288, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 298, 3, 2, 2, 2, 298, 299, 7, 47, 2, 2, 299, 29, 3, 2, 2, 2, 300, 301, 5, 70, 36, 2, 301, 310, 7, 36, 2, 2, 302, 307, 5, 62, 32, 2, 303, 304, 7, 34, 2, 2, 304, 306, 5, 62, 32, 2, 305, 303, 3, 2, 2, 2, 306, 309, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 310, 302, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 312, 3, 2, 2, 2, 312, 313, 7, 47, 2, 2, 313, 31, 3, 2, 2, 2, 314, 315, 5, 106, 54, 2, 315, 316, 7, 31, 2, 2, 316, 33, 3, 2, 2, 2, 317, 318, 8, 18, 1, 2, 318, 324, 5, 36, 19, 2, 319, 324, 5, 28, 15, 2, 320, 324, 5, 30, 16, 2, 321, 322, 9, 2, 2, 2, 322, 324, 5, 34, 18, 5, 323, 317, 3, 2, 2, 2, 323, 319, 3, 2, 2, 2, 323, 320, 3, 2, 2, 2, 323, 321, 3, 2, 2, 2, 324, 333, 3, 2, 2, 2, 325, 326, 12, 4, 2, 2, 326, 327, 9, 3, 2, 2, 327, 332, 5, 34, 18, 5, 328, 329, 12, 3, 2, 2, 329, 330, 9, 2, 2, 2, 330, 332, 5, 34, 18, 4, 331, 325, 3, 2, 2, 2, 331, 328, 3, 2, 2, 2, 332, 335, 3, 2, 2, 2, 333, 331, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 35, 3, 2, 2, 2, 335, 333, 3, 2, 2, 2, 336, 358, 5, 74, 38, 2, 337, 358, 5, 64, 33, 2, 338, 358, 5, 32, 17, 2, 339, 340, 7, 36, 2, 2, 340, 341, 5, 20, 11, 2, 341, 342, 7, 47, 2, 2, 342, 358, 3, 2, 2, 2, 343, 344, 5, 68, 35, 2, 344, 353, 7, 36, 2, 2, 345, 350, 5, 20, 11, 2, 346, 347, 7, 34, 2, 2, 347, 349, 5, 20, 11, 2, 348, 346, 3, 2, 2, 2, 349, 352, 3, 2, 2, 2, 350, 348, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 354, 3, 2, 2, 2, 352, 350, 3, 2, 2, 2, 353, 345, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 356, 7, 47, 2, 2, 356, 358, 3, 2, 2, 2, 357, 336, 3, 2, 2, 2, 357, 337, 3, 2, 2, 2, 357, 338, 3, 2, 2, 2, 357, 339, 3, 2, 2, 2, 357, 343, 3, 2, 2, 2, 358, 37, 3, 2, 2, 2, 359, 360, 7, 8, 2, 2, 360, 361, 5, 40, 21, 2, 361, 39, 3, 2, 2, 2, 362, 367, 5, 42, 22, 2, 363, 364, 7, 34, 2, 2, 364, 366, 5, 42, 22, 2, 365, 363, 3, 2, 2, 2, 366, 369, 3, 2, 2, 2, 367, 365, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 41, 3, 2, 2, 2, 369, 367, 3, 2, 2, 2, 370, 376, 5, 20, 11, 2, 371, 372, 5, 46, 24, 2, 372, 373, 7, 33, 2, 2, 373, 374, 5, 20, 11, 2, 374, 376, 3, 2, 2, 2, 375, 370, 3, 2, 2, 2, 375, 371, 3, 2, 2, 2, 376, 43, 3, 2, 2, 2, 377, 378, 9, 4, 2, 2, 378, 45, 3, 2, 2, 2, 379, 380, 5, 68, 35, 2, 380, 47, 3, 2, 2, 2, 381, 382, 7, 7, 2, 2, 382, 387, 5, 56, 29, 2, 383, 384, 7, 34, 2, 2, 384, 386, 5, 56, 29, 2, 385, 383, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 391, 3, 2, 2, 2, 389, 387, 3, 2, 2, 2, 390, 392, 5, 50, 26, 2, 391, 390, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 49, 3, 2, 2, 2, 393, 394, 7, 37, 2, 2, 394, 395, 7, 70, 2, 2, 395, 400, 5, 56, 29, 2, 396, 397, 7, 34, 2, 2, 397, 399, 5, 56, 29, 2, 398, 396, 3, 2, 2, 2, 399, 402, 3, 2, 2, 2, 400, 398, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 403, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 403, 404, 7, 38, 2, 2, 404, 51, 3, 2, 2, 2, 405, 406, 7, 5, 2, 2, 406, 407, 5, 40, 21, 2, 407, 53, 3, 2, 2, 2, 408, 410, 7, 9, 2, 2, 409, 411, 5, 40, 21, 2, 410, 409, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 414, 3, 2, 2, 2, 412, 413, 7, 30, 2, 2, 413, 415, 5, 66, 34, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 55, 3, 2, 2, 2, 416, 417, 9, 5, 2, 2, 417, 57, 3, 2, 2, 2, 418, 419, 9, 4, 2, 2, 419, 59, 3, 2, 2, 2, 420, 424, 5, 64, 33, 2, 421, 424, 5, 112, 57, 2, 422, 424, 5, 106, 54, 2, 423, 420, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 422, 3, 2, 2, 2, 424, 61, 3, 2, 2, 2, 425, 432, 5, 64, 33, 2, 426, 432, 5, 112, 57, 2, 427, 432, 5, 106, 54, 2, 428, 432, 5, 34, 18, 2, 429, 432, 5, 32, 17, 2, 430, 432, 5, 26, 14, 2, 431, 425, 3, 2, 2, 2, 431, 426, 3, 2, 2, 2, 431, 427, 3, 2, 2, 2, 431, 428, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 431, 430, 3, 2, 2, 2, 432, 63, 3, 2, 2, 2, 433, 438, 5, 68, 35, 2, 434, 435, 7, 35, 2, 2, 435, 437, 5, 68, 35, 2, 436, 434, 3, 2, 2, 2, 437, 440, 3, 2, 2, 2, 438, 436, 3, 2, 2, 2, 438, 439, 3, 2, 2, 2, 439, 65, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 441, 446, 5, 64, 33, 2, 442, 443, 7, 34, 2, 2, 443, 445, 5, 64, 33, 2, 444, 442, 3, 2, 2, 2, 445, 448, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 67, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 449, 450, 9, 6, 2, 2, 450, 69, 3, 2, 2, 2, 451, 452, 7, 62, 2, 2, 452, 71, 3, 2, 2, 2, 453, 454, 7, 63, 2, 2, 454, 73, 3, 2, 2, 2, 455, 493, 7, 45, 2, 2, 456, 493, 5, 76, 39, 2, 457, 493, 5, 104, 53, 2, 458, 493, 5, 112, 57, 2, 459, 460, 7, 37, 2, 2, 460, 465, 5, 76, 39, 2, 461, 462, 7, 34, 2, 2, 462, 464, 5, 76, 39, 2, 463, 461, 3, 2, 2, 2, 464, 467, 3, 2, 2, 2, 465, 463, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 468, 3, 2, 2, 2, 467, 465, 3, 2, 2, 2, 468, 469, 7, 38, 2, 2, 469, 493, 3, 2, 2, 2, 470, 471, 7, 37, 2, 2, 471, 476, 5, 104, 53, 2, 472, 473, 7, 34, 2, 2, 473, 475, 5, 104, 53, 2, 474, 472, 3, 2, 2, 2, 475, 478, 3, 2, 2, 2, 476, 474, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 479, 3, 2, 2, 2, 478, 476, 3, 2, 2, 2, 479, 480, 7, 38, 2, 2, 480, 493, 3, 2, 2, 2, 481, 482, 7, 37, 2, 2, 482, 487, 5, 112, 57, 2, 483, 484, 7, 34, 2, 2, 484, 486, 5, 112, 57, 2, 485, 483, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 490, 3, 2, 2, 2, 489, 487, 3, 2, 2, 2, 490, 491, 7, 38, 2, 2, 491, 493, 3, 2, 2, 2, 492, 455, 3, 2, 2, 2, 492, 456, 3, 2, 2, 2, 492, 457, 3, 2, 2, 2, 492, 458, 3, 2, 2, 2, 492, 459, 3, 2, 2, 2, 492, 470, 3, 2, 2, 2, 492, 481, 3, 2, 2, 2, 493, 75, 3, 2, 2, 2, 494, 497, 5, 108, 55, 2, 495, 497, 5, 110, 56, 2, 496, 494, 3, 2, 2, 2, 496, 495, 3, 2, 2, 2, 497, 77, 3, 2, 2, 2, 498, 499, 7, 13, 2, 2, 499, 500, 7, 28, 2, 2, 500, 79, 3, 2, 2, 2, 501, 502, 7, 11, 2, 2, 502, 507, 5, 82, 42, 2, 503, 504, 7, 34, 2, 2, 504, 506, 5, 82, 42, 2, 505, 503, 3, 2, 2, 2, 506, 509, 3, 2, 2, 2, 507, 505, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 81, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 510, 512, 5, 20, 11, 2, 511, 513, 7, 59, 2, 2, 512, 511, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 515, 7, 60, 2, 2, 515, 517, 7, 61, 2, 2, 516, 514, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 83, 3, 2, 2, 2, 518, 519, 7, 14, 2, 2, 519, 520, 5, 66, 34, 2, 520, 85, 3, 2, 2, 2, 521, 522, 7, 19, 2, 2, 522, 523, 5, 66, 34, 2, 523, 87, 3, 2, 2, 2, 524, 525, 7, 15, 2, 2, 525, 526, 5, 66, 34, 2, 526, 89, 3, 2, 2, 2, 527, 532, 5, 68, 35, 2, 528, 529, 7, 35, 2, 2, 529, 531, 5, 68, 35, 2, 530, 528, 3, 2, 2, 2, 531, 534, 3, 2, 2, 2, 532, 530, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 91, 3, 2, 2, 2, 534, 532, 3, 2, 2, 2, 535, 536, 7, 16, 2, 2, 536, 541, 5, 94, 48, 2, 537, 538, 7, 34, 2, 2, 538, 540, 5, 94, 48, 2, 539, 537, 3, 2, 2, 2, 540, 543, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 93, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 544, 545, 5, 64, 33, 2, 545, 546, 7, 44, 2, 2, 546, 547, 5, 90, 46, 2, 547, 95, 3, 2, 2, 2, 548, 549, 7, 3, 2, 2, 549, 550, 5, 66, 34, 2, 550, 552, 5, 112, 57, 2, 551, 553, 5, 100, 51, 2, 552, 551, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 97, 3, 2, 2, 2, 554, 555, 7, 4, 2, 2, 555, 556, 5, 66, 34, 2, 556, 557, 5, 112, 57, 2, 557, 99, 3, 2, 2, 2, 558, 563, 5, 102, 52, 2, 559, 560, 7, 34, 2, 2, 560, 562, 5, 102, 52, 2, 561, 559, 3, 2, 2, 2, 562, 565, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 101, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 566, 567, 5, 68, 35, 2, 567, 568, 7, 33, 2, 2, 568, 569, 5, 74, 38, 2, 569, 103, 3, 2, 2, 2, 570, 571, 7, 51, 2, 2, 571, 105, 3, 2, 2, 2, 572, 575, 7, 29, 2, 2, 573, 575, 7, 28, 2, 2, 574, 572, 3, 2, 2, 2, 574, 573, 3, 2, 2, 2, 575, 107, 3, 2, 2, 2, 576, 577, 7, 29, 2, 2, 577, 109, 3, 2, 2, 2, 578, 579, 7, 28, 2, 2, 579, 111, 3, 2, 2, 2, 580, 581, 7, 27, 2, 2, 581, 113, 3, 2, 2, 2, 582, 583, 7, 52, 2, 2, 583, 115, 3, 2, 2, 2, 584, 585, 7, 6, 2, 2, 585, 586, 5, 118, 60, 2, 586, 117, 3, 2, 2, 2, 587, 588, 7, 37, 2, 2, 588, 589, 5, 4, 3, 2, 589, 590, 7, 38, 2, 2, 590, 119, 3, 2, 2, 2, 591, 592, 7, 17, 2, 2, 592, 596, 7, 49, 2, 2, 593, 594, 7, 17, 2, 2, 594, 596, 7, 50, 2, 2, 595, 591, 3, 2, 2, 2, 595, 593, 3, 2, 2, 2, 596, 121, 3, 2, 2, 2, 60, 133, 140, 155, 161, 169, 172, 177, 194, 203, 209, 218, 221, 228, 232, 240, 242, 249, 257, 259, 264, 271, 276, 280, 293, 296, 307, 310, 323, 331, 333, 350, 353, 357, 367, 375, 387, 391, 400, 410, 414, 423, 431, 438, 446, 465, 476, 487, 492, 496, 507, 512, 516, 532, 541, 552, 563, 574, 595] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts index e70ad71c58ba1..494ffadd8aad9 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts @@ -123,65 +123,67 @@ export class esql_parser extends Parser { public static readonly RULE_comparison = 12; public static readonly RULE_mathFn = 13; public static readonly RULE_mathEvalFn = 14; - public static readonly RULE_operatorExpression = 15; - public static readonly RULE_primaryExpression = 16; - public static readonly RULE_rowCommand = 17; - public static readonly RULE_fields = 18; - public static readonly RULE_field = 19; - public static readonly RULE_enrichFieldIdentifier = 20; - public static readonly RULE_userVariable = 21; - public static readonly RULE_fromCommand = 22; - public static readonly RULE_metadata = 23; - public static readonly RULE_evalCommand = 24; - public static readonly RULE_statsCommand = 25; - public static readonly RULE_sourceIdentifier = 26; - public static readonly RULE_enrichIdentifier = 27; - public static readonly RULE_functionExpressionArgument = 28; - public static readonly RULE_mathFunctionExpressionArgument = 29; - public static readonly RULE_qualifiedName = 30; - public static readonly RULE_qualifiedNames = 31; - public static readonly RULE_identifier = 32; - public static readonly RULE_mathFunctionIdentifier = 33; - public static readonly RULE_functionIdentifier = 34; - public static readonly RULE_constant = 35; - public static readonly RULE_numericValue = 36; - public static readonly RULE_limitCommand = 37; - public static readonly RULE_sortCommand = 38; - public static readonly RULE_orderExpression = 39; - public static readonly RULE_projectCommand = 40; - public static readonly RULE_keepCommand = 41; - public static readonly RULE_dropCommand = 42; - public static readonly RULE_renameVariable = 43; - public static readonly RULE_renameCommand = 44; - public static readonly RULE_renameClause = 45; - public static readonly RULE_dissectCommand = 46; - public static readonly RULE_grokCommand = 47; - public static readonly RULE_commandOptions = 48; - public static readonly RULE_commandOption = 49; - public static readonly RULE_booleanValue = 50; - public static readonly RULE_number = 51; - public static readonly RULE_decimalValue = 52; - public static readonly RULE_integerValue = 53; - public static readonly RULE_string = 54; - public static readonly RULE_comparisonOperator = 55; - public static readonly RULE_explainCommand = 56; - public static readonly RULE_subqueryExpression = 57; - public static readonly RULE_showCommand = 58; + public static readonly RULE_dateExpression = 15; + public static readonly RULE_operatorExpression = 16; + public static readonly RULE_primaryExpression = 17; + public static readonly RULE_rowCommand = 18; + public static readonly RULE_fields = 19; + public static readonly RULE_field = 20; + public static readonly RULE_enrichFieldIdentifier = 21; + public static readonly RULE_userVariable = 22; + public static readonly RULE_fromCommand = 23; + public static readonly RULE_metadata = 24; + public static readonly RULE_evalCommand = 25; + public static readonly RULE_statsCommand = 26; + public static readonly RULE_sourceIdentifier = 27; + public static readonly RULE_enrichIdentifier = 28; + public static readonly RULE_functionExpressionArgument = 29; + public static readonly RULE_mathFunctionExpressionArgument = 30; + public static readonly RULE_qualifiedName = 31; + public static readonly RULE_qualifiedNames = 32; + public static readonly RULE_identifier = 33; + public static readonly RULE_mathFunctionIdentifier = 34; + public static readonly RULE_functionIdentifier = 35; + public static readonly RULE_constant = 36; + public static readonly RULE_numericValue = 37; + public static readonly RULE_limitCommand = 38; + public static readonly RULE_sortCommand = 39; + public static readonly RULE_orderExpression = 40; + public static readonly RULE_projectCommand = 41; + public static readonly RULE_keepCommand = 42; + public static readonly RULE_dropCommand = 43; + public static readonly RULE_renameVariable = 44; + public static readonly RULE_renameCommand = 45; + public static readonly RULE_renameClause = 46; + public static readonly RULE_dissectCommand = 47; + public static readonly RULE_grokCommand = 48; + public static readonly RULE_commandOptions = 49; + public static readonly RULE_commandOption = 50; + public static readonly RULE_booleanValue = 51; + public static readonly RULE_number = 52; + public static readonly RULE_decimalValue = 53; + public static readonly RULE_integerValue = 54; + public static readonly RULE_string = 55; + public static readonly RULE_comparisonOperator = 56; + public static readonly RULE_explainCommand = 57; + public static readonly RULE_subqueryExpression = 58; + public static readonly RULE_showCommand = 59; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "singleStatement", "query", "sourceCommand", "processingCommand", "enrichCommand", "enrichWithClause", "mvExpandCommand", "whereCommand", "whereBooleanExpression", "booleanExpression", "regexBooleanExpression", "valueExpression", "comparison", - "mathFn", "mathEvalFn", "operatorExpression", "primaryExpression", "rowCommand", - "fields", "field", "enrichFieldIdentifier", "userVariable", "fromCommand", - "metadata", "evalCommand", "statsCommand", "sourceIdentifier", "enrichIdentifier", - "functionExpressionArgument", "mathFunctionExpressionArgument", "qualifiedName", - "qualifiedNames", "identifier", "mathFunctionIdentifier", "functionIdentifier", - "constant", "numericValue", "limitCommand", "sortCommand", "orderExpression", - "projectCommand", "keepCommand", "dropCommand", "renameVariable", "renameCommand", - "renameClause", "dissectCommand", "grokCommand", "commandOptions", "commandOption", - "booleanValue", "number", "decimalValue", "integerValue", "string", "comparisonOperator", - "explainCommand", "subqueryExpression", "showCommand", + "mathFn", "mathEvalFn", "dateExpression", "operatorExpression", "primaryExpression", + "rowCommand", "fields", "field", "enrichFieldIdentifier", "userVariable", + "fromCommand", "metadata", "evalCommand", "statsCommand", "sourceIdentifier", + "enrichIdentifier", "functionExpressionArgument", "mathFunctionExpressionArgument", + "qualifiedName", "qualifiedNames", "identifier", "mathFunctionIdentifier", + "functionIdentifier", "constant", "numericValue", "limitCommand", "sortCommand", + "orderExpression", "projectCommand", "keepCommand", "dropCommand", "renameVariable", + "renameCommand", "renameClause", "dissectCommand", "grokCommand", "commandOptions", + "commandOption", "booleanValue", "number", "decimalValue", "integerValue", + "string", "comparisonOperator", "explainCommand", "subqueryExpression", + "showCommand", ]; private static readonly _LITERAL_NAMES: Array = [ @@ -240,9 +242,9 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 118; + this.state = 120; this.query(0); - this.state = 119; + this.state = 121; this.match(esql_parser.EOF); } } @@ -284,11 +286,11 @@ export class esql_parser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 122; + this.state = 124; this.sourceCommand(); } this._ctx._stop = this._input.tryLT(-1); - this.state = 129; + this.state = 131; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 0, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -301,18 +303,18 @@ export class esql_parser extends Parser { { _localctx = new CompositeQueryContext(new QueryContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_query); - this.state = 124; + this.state = 126; if (!(this.precpred(this._ctx, 1))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 125; + this.state = 127; this.match(esql_parser.PIPE); - this.state = 126; + this.state = 128; this.processingCommand(); } } } - this.state = 131; + this.state = 133; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 0, this._ctx); } @@ -337,34 +339,34 @@ export class esql_parser extends Parser { let _localctx: SourceCommandContext = new SourceCommandContext(this._ctx, this.state); this.enterRule(_localctx, 4, esql_parser.RULE_sourceCommand); try { - this.state = 136; + this.state = 138; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.EXPLAIN: this.enterOuterAlt(_localctx, 1); { - this.state = 132; + this.state = 134; this.explainCommand(); } break; case esql_parser.FROM: this.enterOuterAlt(_localctx, 2); { - this.state = 133; + this.state = 135; this.fromCommand(); } break; case esql_parser.ROW: this.enterOuterAlt(_localctx, 3); { - this.state = 134; + this.state = 136; this.rowCommand(); } break; case esql_parser.SHOW: this.enterOuterAlt(_localctx, 4); { - this.state = 135; + this.state = 137; this.showCommand(); } break; @@ -391,97 +393,97 @@ export class esql_parser extends Parser { let _localctx: ProcessingCommandContext = new ProcessingCommandContext(this._ctx, this.state); this.enterRule(_localctx, 6, esql_parser.RULE_processingCommand); try { - this.state = 151; + this.state = 153; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.EVAL: this.enterOuterAlt(_localctx, 1); { - this.state = 138; + this.state = 140; this.evalCommand(); } break; case esql_parser.LIMIT: this.enterOuterAlt(_localctx, 2); { - this.state = 139; + this.state = 141; this.limitCommand(); } break; case esql_parser.PROJECT: this.enterOuterAlt(_localctx, 3); { - this.state = 140; + this.state = 142; this.projectCommand(); } break; case esql_parser.KEEP: this.enterOuterAlt(_localctx, 4); { - this.state = 141; + this.state = 143; this.keepCommand(); } break; case esql_parser.RENAME: this.enterOuterAlt(_localctx, 5); { - this.state = 142; + this.state = 144; this.renameCommand(); } break; case esql_parser.DROP: this.enterOuterAlt(_localctx, 6); { - this.state = 143; + this.state = 145; this.dropCommand(); } break; case esql_parser.DISSECT: this.enterOuterAlt(_localctx, 7); { - this.state = 144; + this.state = 146; this.dissectCommand(); } break; case esql_parser.GROK: this.enterOuterAlt(_localctx, 8); { - this.state = 145; + this.state = 147; this.grokCommand(); } break; case esql_parser.SORT: this.enterOuterAlt(_localctx, 9); { - this.state = 146; + this.state = 148; this.sortCommand(); } break; case esql_parser.STATS: this.enterOuterAlt(_localctx, 10); { - this.state = 147; + this.state = 149; this.statsCommand(); } break; case esql_parser.WHERE: this.enterOuterAlt(_localctx, 11); { - this.state = 148; + this.state = 150; this.whereCommand(); } break; case esql_parser.MV_EXPAND: this.enterOuterAlt(_localctx, 12); { - this.state = 149; + this.state = 151; this.mvExpandCommand(); } break; case esql_parser.ENRICH: this.enterOuterAlt(_localctx, 13); { - this.state = 150; + this.state = 152; this.enrichCommand(); } break; @@ -511,46 +513,46 @@ export class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 153; + this.state = 155; this.match(esql_parser.ENRICH); - this.state = 154; + this.state = 156; _localctx._policyName = this.enrichIdentifier(); - this.state = 157; + this.state = 159; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 3, this._ctx) ) { case 1: { - this.state = 155; + this.state = 157; this.match(esql_parser.ON); - this.state = 156; + this.state = 158; _localctx._matchField = this.enrichFieldIdentifier(); } break; } - this.state = 168; + this.state = 170; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 5, this._ctx) ) { case 1: { - this.state = 159; + this.state = 161; this.match(esql_parser.WITH); - this.state = 160; + this.state = 162; this.enrichWithClause(); - this.state = 165; + this.state = 167; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 4, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 161; + this.state = 163; this.match(esql_parser.COMMA); - this.state = 162; + this.state = 164; this.enrichWithClause(); } } } - this.state = 167; + this.state = 169; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 4, this._ctx); } @@ -580,19 +582,19 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 173; + this.state = 175; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 6, this._ctx) ) { case 1: { - this.state = 170; + this.state = 172; _localctx._newName = this.enrichFieldIdentifier(); - this.state = 171; + this.state = 173; this.match(esql_parser.ASSIGN); } break; } - this.state = 175; + this.state = 177; _localctx._enrichField = this.enrichFieldIdentifier(); } } @@ -617,9 +619,9 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 177; + this.state = 179; this.match(esql_parser.MV_EXPAND); - this.state = 178; + this.state = 180; this.qualifiedNames(); } } @@ -644,9 +646,9 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 180; + this.state = 182; this.match(esql_parser.WHERE); - this.state = 181; + this.state = 183; this.whereBooleanExpression(0); } } @@ -684,143 +686,143 @@ export class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 228; + this.state = 230; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 13, this._ctx) ) { case 1: { - this.state = 184; + this.state = 186; this.match(esql_parser.NOT); - this.state = 185; + this.state = 187; this.whereBooleanExpression(8); } break; case 2: { - this.state = 186; + this.state = 188; this.valueExpression(); } break; case 3: { - this.state = 187; + this.state = 189; this.regexBooleanExpression(); } break; case 4: { - this.state = 188; - this.valueExpression(); this.state = 190; + this.valueExpression(); + this.state = 192; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.NOT) { { - this.state = 189; + this.state = 191; this.match(esql_parser.NOT); } } - this.state = 192; + this.state = 194; this.match(esql_parser.IN); - this.state = 193; + this.state = 195; this.match(esql_parser.LP); - this.state = 194; + this.state = 196; this.valueExpression(); - this.state = 199; + this.state = 201; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 195; + this.state = 197; this.match(esql_parser.COMMA); - this.state = 196; + this.state = 198; this.valueExpression(); } } - this.state = 201; + this.state = 203; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 202; + this.state = 204; this.match(esql_parser.RP); } break; case 5: { - this.state = 205; + this.state = 207; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.NOT) { { - this.state = 204; + this.state = 206; this.match(esql_parser.NOT); } } - this.state = 207; + this.state = 209; this.match(esql_parser.WHERE_FUNCTIONS); - this.state = 208; + this.state = 210; this.match(esql_parser.LP); - this.state = 209; + this.state = 211; this.qualifiedName(); - this.state = 217; + this.state = 219; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 11, this._ctx) ) { case 1: { - this.state = 214; + this.state = 216; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 210; + this.state = 212; this.match(esql_parser.COMMA); - this.state = 211; + this.state = 213; this.functionExpressionArgument(); } } - this.state = 216; + this.state = 218; this._errHandler.sync(this); _la = this._input.LA(1); } } break; } - this.state = 219; + this.state = 221; this.match(esql_parser.RP); } break; case 6: { - this.state = 221; + this.state = 223; this.valueExpression(); - this.state = 222; - this.match(esql_parser.IS); this.state = 224; + this.match(esql_parser.IS); + this.state = 226; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.NOT) { { - this.state = 223; + this.state = 225; this.match(esql_parser.NOT); } } - this.state = 226; + this.state = 228; this.match(esql_parser.NULL); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 238; + this.state = 240; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -830,7 +832,7 @@ export class esql_parser extends Parser { } _prevctx = _localctx; { - this.state = 236; + this.state = 238; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: @@ -838,13 +840,13 @@ export class esql_parser extends Parser { _localctx = new WhereBooleanExpressionContext(_parentctx, _parentState); _localctx._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_whereBooleanExpression); - this.state = 230; + this.state = 232; if (!(this.precpred(this._ctx, 5))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 5)"); } - this.state = 231; + this.state = 233; _localctx._operator = this.match(esql_parser.AND); - this.state = 232; + this.state = 234; _localctx._right = this.whereBooleanExpression(6); } break; @@ -854,20 +856,20 @@ export class esql_parser extends Parser { _localctx = new WhereBooleanExpressionContext(_parentctx, _parentState); _localctx._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_whereBooleanExpression); - this.state = 233; + this.state = 235; if (!(this.precpred(this._ctx, 4))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 4)"); } - this.state = 234; + this.state = 236; _localctx._operator = this.match(esql_parser.OR); - this.state = 235; + this.state = 237; _localctx._right = this.whereBooleanExpression(5); } break; } } } - this.state = 240; + this.state = 242; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 15, this._ctx); } @@ -906,14 +908,14 @@ export class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 245; + this.state = 247; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.NOT: { - this.state = 242; + this.state = 244; this.match(esql_parser.NOT); - this.state = 243; + this.state = 245; this.booleanExpression(4); } break; @@ -932,7 +934,7 @@ export class esql_parser extends Parser { case esql_parser.UNQUOTED_IDENTIFIER: case esql_parser.QUOTED_IDENTIFIER: { - this.state = 244; + this.state = 246; this.valueExpression(); } break; @@ -940,7 +942,7 @@ export class esql_parser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 255; + this.state = 257; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 18, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -950,7 +952,7 @@ export class esql_parser extends Parser { } _prevctx = _localctx; { - this.state = 253; + this.state = 255; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 17, this._ctx) ) { case 1: @@ -958,13 +960,13 @@ export class esql_parser extends Parser { _localctx = new BooleanExpressionContext(_parentctx, _parentState); _localctx._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 247; + this.state = 249; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 248; + this.state = 250; _localctx._operator = this.match(esql_parser.AND); - this.state = 249; + this.state = 251; _localctx._right = this.booleanExpression(3); } break; @@ -974,20 +976,20 @@ export class esql_parser extends Parser { _localctx = new BooleanExpressionContext(_parentctx, _parentState); _localctx._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 250; + this.state = 252; if (!(this.precpred(this._ctx, 1))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 251; + this.state = 253; _localctx._operator = this.match(esql_parser.OR); - this.state = 252; + this.state = 254; _localctx._right = this.booleanExpression(2); } break; } } } - this.state = 257; + this.state = 259; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 18, this._ctx); } @@ -1013,27 +1015,27 @@ export class esql_parser extends Parser { this.enterRule(_localctx, 20, esql_parser.RULE_regexBooleanExpression); let _la: number; try { - this.state = 272; + this.state = 274; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 21, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 258; - this.valueExpression(); this.state = 260; + this.valueExpression(); + this.state = 262; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.NOT) { { - this.state = 259; + this.state = 261; this.match(esql_parser.NOT); } } - this.state = 262; + this.state = 264; _localctx._kind = this.match(esql_parser.LIKE); - this.state = 263; + this.state = 265; _localctx._pattern = this.string(); } break; @@ -1041,21 +1043,21 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 265; - this.valueExpression(); this.state = 267; + this.valueExpression(); + this.state = 269; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === esql_parser.NOT) { { - this.state = 266; + this.state = 268; this.match(esql_parser.NOT); } } - this.state = 269; + this.state = 271; _localctx._kind = this.match(esql_parser.RLIKE); - this.state = 270; + this.state = 272; _localctx._pattern = this.string(); } break; @@ -1080,13 +1082,13 @@ export class esql_parser extends Parser { let _localctx: ValueExpressionContext = new ValueExpressionContext(this._ctx, this.state); this.enterRule(_localctx, 22, esql_parser.RULE_valueExpression); try { - this.state = 276; + this.state = 278; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 274; + this.state = 276; this.operatorExpression(0); } break; @@ -1094,7 +1096,7 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 275; + this.state = 277; this.comparison(); } break; @@ -1121,11 +1123,11 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 278; + this.state = 280; _localctx._left = this.operatorExpression(0); - this.state = 279; + this.state = 281; this.comparisonOperator(); - this.state = 280; + this.state = 282; _localctx._right = this.operatorExpression(0); } } @@ -1151,37 +1153,37 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 282; + this.state = 284; this.functionIdentifier(); - this.state = 283; + this.state = 285; this.match(esql_parser.LP); - this.state = 292; + this.state = 294; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << esql_parser.STRING) | (1 << esql_parser.INTEGER_LITERAL) | (1 << esql_parser.DECIMAL_LITERAL))) !== 0) || ((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & ((1 << (esql_parser.ASTERISK - 53)) | (1 << (esql_parser.UNQUOTED_IDENTIFIER - 53)) | (1 << (esql_parser.QUOTED_IDENTIFIER - 53)))) !== 0)) { { - this.state = 284; + this.state = 286; this.functionExpressionArgument(); - this.state = 289; + this.state = 291; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 285; + this.state = 287; this.match(esql_parser.COMMA); - this.state = 286; + this.state = 288; this.functionExpressionArgument(); } } - this.state = 291; + this.state = 293; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 294; + this.state = 296; this.match(esql_parser.RP); } } @@ -1207,37 +1209,37 @@ export class esql_parser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 296; + this.state = 298; this.mathFunctionIdentifier(); - this.state = 297; + this.state = 299; this.match(esql_parser.LP); - this.state = 306; + this.state = 308; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << esql_parser.STRING) | (1 << esql_parser.INTEGER_LITERAL) | (1 << esql_parser.DECIMAL_LITERAL))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (esql_parser.LP - 34)) | (1 << (esql_parser.OPENING_BRACKET - 34)) | (1 << (esql_parser.NULL - 34)) | (1 << (esql_parser.BOOLEAN_VALUE - 34)) | (1 << (esql_parser.PLUS - 34)) | (1 << (esql_parser.MINUS - 34)) | (1 << (esql_parser.ASTERISK - 34)) | (1 << (esql_parser.MATH_FUNCTION - 34)) | (1 << (esql_parser.UNARY_FUNCTION - 34)) | (1 << (esql_parser.UNQUOTED_IDENTIFIER - 34)) | (1 << (esql_parser.QUOTED_IDENTIFIER - 34)))) !== 0)) { { - this.state = 298; + this.state = 300; this.mathFunctionExpressionArgument(); - this.state = 303; + this.state = 305; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 299; + this.state = 301; this.match(esql_parser.COMMA); - this.state = 300; + this.state = 302; this.mathFunctionExpressionArgument(); } } - this.state = 305; + this.state = 307; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 308; + this.state = 310; this.match(esql_parser.RP); } } @@ -1255,6 +1257,33 @@ export class esql_parser extends Parser { } return _localctx; } + // @RuleVersion(0) + public dateExpression(): DateExpressionContext { + let _localctx: DateExpressionContext = new DateExpressionContext(this._ctx, this.state); + this.enterRule(_localctx, 30, esql_parser.RULE_dateExpression); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 312; + _localctx._quantifier = this.number(); + this.state = 313; + this.match(esql_parser.DATE_LITERAL); + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } public operatorExpression(): OperatorExpressionContext; public operatorExpression(_p: number): OperatorExpressionContext; @@ -1268,14 +1297,14 @@ export class esql_parser extends Parser { let _parentState: number = this.state; let _localctx: OperatorExpressionContext = new OperatorExpressionContext(this._ctx, _parentState); let _prevctx: OperatorExpressionContext = _localctx; - let _startState: number = 30; - this.enterRecursionRule(_localctx, 30, esql_parser.RULE_operatorExpression, _p); + let _startState: number = 32; + this.enterRecursionRule(_localctx, 32, esql_parser.RULE_operatorExpression, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 316; + this.state = 321; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.STRING: @@ -1289,26 +1318,26 @@ export class esql_parser extends Parser { case esql_parser.UNQUOTED_IDENTIFIER: case esql_parser.QUOTED_IDENTIFIER: { - this.state = 311; + this.state = 316; this.primaryExpression(); } break; case esql_parser.UNARY_FUNCTION: { - this.state = 312; + this.state = 317; this.mathFn(); } break; case esql_parser.MATH_FUNCTION: { - this.state = 313; + this.state = 318; this.mathEvalFn(); } break; case esql_parser.PLUS: case esql_parser.MINUS: { - this.state = 314; + this.state = 319; _localctx._operator = this._input.LT(1); _la = this._input.LA(1); if (!(_la === esql_parser.PLUS || _la === esql_parser.MINUS)) { @@ -1321,7 +1350,7 @@ export class esql_parser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 315; + this.state = 320; this.operatorExpression(3); } break; @@ -1329,7 +1358,7 @@ export class esql_parser extends Parser { throw new NoViableAltException(this); } this._ctx._stop = this._input.tryLT(-1); - this.state = 326; + this.state = 331; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 29, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1339,7 +1368,7 @@ export class esql_parser extends Parser { } _prevctx = _localctx; { - this.state = 324; + this.state = 329; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 28, this._ctx) ) { case 1: @@ -1347,11 +1376,11 @@ export class esql_parser extends Parser { _localctx = new OperatorExpressionContext(_parentctx, _parentState); _localctx._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 318; + this.state = 323; if (!(this.precpred(this._ctx, 2))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 2)"); } - this.state = 319; + this.state = 324; _localctx._operator = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & ((1 << (esql_parser.ASTERISK - 53)) | (1 << (esql_parser.SLASH - 53)) | (1 << (esql_parser.PERCENT - 53)))) !== 0))) { @@ -1364,7 +1393,7 @@ export class esql_parser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 320; + this.state = 325; _localctx._right = this.operatorExpression(3); } break; @@ -1374,11 +1403,11 @@ export class esql_parser extends Parser { _localctx = new OperatorExpressionContext(_parentctx, _parentState); _localctx._left = _prevctx; this.pushNewRecursionContext(_localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 321; + this.state = 326; if (!(this.precpred(this._ctx, 1))) { throw new FailedPredicateException(this, "this.precpred(this._ctx, 1)"); } - this.state = 322; + this.state = 327; _localctx._operator = this._input.LT(1); _la = this._input.LA(1); if (!(_la === esql_parser.PLUS || _la === esql_parser.MINUS)) { @@ -1391,14 +1420,14 @@ export class esql_parser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 323; + this.state = 328; _localctx._right = this.operatorExpression(2); } break; } } } - this.state = 328; + this.state = 333; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 29, this._ctx); } @@ -1421,16 +1450,16 @@ export class esql_parser extends Parser { // @RuleVersion(0) public primaryExpression(): PrimaryExpressionContext { let _localctx: PrimaryExpressionContext = new PrimaryExpressionContext(this._ctx, this.state); - this.enterRule(_localctx, 32, esql_parser.RULE_primaryExpression); + this.enterRule(_localctx, 34, esql_parser.RULE_primaryExpression); let _la: number; try { - this.state = 349; + this.state = 355; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 32, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 329; + this.state = 334; this.constant(); } break; @@ -1438,7 +1467,7 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 330; + this.state = 335; this.qualifiedName(); } break; @@ -1446,49 +1475,57 @@ export class esql_parser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 331; + this.state = 336; + this.dateExpression(); + } + break; + + case 4: + this.enterOuterAlt(_localctx, 4); + { + this.state = 337; this.match(esql_parser.LP); - this.state = 332; + this.state = 338; this.booleanExpression(0); - this.state = 333; + this.state = 339; this.match(esql_parser.RP); } break; - case 4: - this.enterOuterAlt(_localctx, 4); + case 5: + this.enterOuterAlt(_localctx, 5); { - this.state = 335; + this.state = 341; this.identifier(); - this.state = 336; + this.state = 342; this.match(esql_parser.LP); - this.state = 345; + this.state = 351; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << esql_parser.STRING) | (1 << esql_parser.INTEGER_LITERAL) | (1 << esql_parser.DECIMAL_LITERAL))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (esql_parser.LP - 34)) | (1 << (esql_parser.OPENING_BRACKET - 34)) | (1 << (esql_parser.NOT - 34)) | (1 << (esql_parser.NULL - 34)) | (1 << (esql_parser.BOOLEAN_VALUE - 34)) | (1 << (esql_parser.PLUS - 34)) | (1 << (esql_parser.MINUS - 34)) | (1 << (esql_parser.ASTERISK - 34)) | (1 << (esql_parser.MATH_FUNCTION - 34)) | (1 << (esql_parser.UNARY_FUNCTION - 34)) | (1 << (esql_parser.UNQUOTED_IDENTIFIER - 34)) | (1 << (esql_parser.QUOTED_IDENTIFIER - 34)))) !== 0)) { { - this.state = 337; + this.state = 343; this.booleanExpression(0); - this.state = 342; + this.state = 348; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 338; + this.state = 344; this.match(esql_parser.COMMA); - this.state = 339; + this.state = 345; this.booleanExpression(0); } } - this.state = 344; + this.state = 350; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 347; + this.state = 353; this.match(esql_parser.RP); } break; @@ -1511,13 +1548,13 @@ export class esql_parser extends Parser { // @RuleVersion(0) public rowCommand(): RowCommandContext { let _localctx: RowCommandContext = new RowCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 34, esql_parser.RULE_rowCommand); + this.enterRule(_localctx, 36, esql_parser.RULE_rowCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 351; + this.state = 357; this.match(esql_parser.ROW); - this.state = 352; + this.state = 358; this.fields(); } } @@ -1538,28 +1575,28 @@ export class esql_parser extends Parser { // @RuleVersion(0) public fields(): FieldsContext { let _localctx: FieldsContext = new FieldsContext(this._ctx, this.state); - this.enterRule(_localctx, 36, esql_parser.RULE_fields); + this.enterRule(_localctx, 38, esql_parser.RULE_fields); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 354; + this.state = 360; this.field(); - this.state = 359; + this.state = 365; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 355; + this.state = 361; this.match(esql_parser.COMMA); - this.state = 356; + this.state = 362; this.field(); } } } - this.state = 361; + this.state = 367; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); } @@ -1582,15 +1619,15 @@ export class esql_parser extends Parser { // @RuleVersion(0) public field(): FieldContext { let _localctx: FieldContext = new FieldContext(this._ctx, this.state); - this.enterRule(_localctx, 38, esql_parser.RULE_field); + this.enterRule(_localctx, 40, esql_parser.RULE_field); try { - this.state = 367; + this.state = 373; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 362; + this.state = 368; this.booleanExpression(0); } break; @@ -1598,11 +1635,11 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 363; + this.state = 369; this.userVariable(); - this.state = 364; + this.state = 370; this.match(esql_parser.ASSIGN); - this.state = 365; + this.state = 371; this.booleanExpression(0); } break; @@ -1625,12 +1662,12 @@ export class esql_parser extends Parser { // @RuleVersion(0) public enrichFieldIdentifier(): EnrichFieldIdentifierContext { let _localctx: EnrichFieldIdentifierContext = new EnrichFieldIdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 40, esql_parser.RULE_enrichFieldIdentifier); + this.enterRule(_localctx, 42, esql_parser.RULE_enrichFieldIdentifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 369; + this.state = 375; _la = this._input.LA(1); if (!(_la === esql_parser.ENR_UNQUOTED_IDENTIFIER || _la === esql_parser.ENR_QUOTED_IDENTIFIER)) { this._errHandler.recoverInline(this); @@ -1661,11 +1698,11 @@ export class esql_parser extends Parser { // @RuleVersion(0) public userVariable(): UserVariableContext { let _localctx: UserVariableContext = new UserVariableContext(this._ctx, this.state); - this.enterRule(_localctx, 42, esql_parser.RULE_userVariable); + this.enterRule(_localctx, 44, esql_parser.RULE_userVariable); try { this.enterOuterAlt(_localctx, 1); { - this.state = 371; + this.state = 377; this.identifier(); } } @@ -1686,39 +1723,39 @@ export class esql_parser extends Parser { // @RuleVersion(0) public fromCommand(): FromCommandContext { let _localctx: FromCommandContext = new FromCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 44, esql_parser.RULE_fromCommand); + this.enterRule(_localctx, 46, esql_parser.RULE_fromCommand); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 373; + this.state = 379; this.match(esql_parser.FROM); - this.state = 374; + this.state = 380; this.sourceIdentifier(); - this.state = 379; + this.state = 385; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 375; + this.state = 381; this.match(esql_parser.COMMA); - this.state = 376; + this.state = 382; this.sourceIdentifier(); } } } - this.state = 381; + this.state = 387; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } - this.state = 383; + this.state = 389; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { case 1: { - this.state = 382; + this.state = 388; this.metadata(); } break; @@ -1742,34 +1779,34 @@ export class esql_parser extends Parser { // @RuleVersion(0) public metadata(): MetadataContext { let _localctx: MetadataContext = new MetadataContext(this._ctx, this.state); - this.enterRule(_localctx, 46, esql_parser.RULE_metadata); + this.enterRule(_localctx, 48, esql_parser.RULE_metadata); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 385; + this.state = 391; this.match(esql_parser.OPENING_BRACKET); - this.state = 386; + this.state = 392; this.match(esql_parser.METADATA); - this.state = 387; + this.state = 393; this.sourceIdentifier(); - this.state = 392; + this.state = 398; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 388; + this.state = 394; this.match(esql_parser.COMMA); - this.state = 389; + this.state = 395; this.sourceIdentifier(); } } - this.state = 394; + this.state = 400; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 395; + this.state = 401; this.match(esql_parser.CLOSING_BRACKET); } } @@ -1790,13 +1827,13 @@ export class esql_parser extends Parser { // @RuleVersion(0) public evalCommand(): EvalCommandContext { let _localctx: EvalCommandContext = new EvalCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 48, esql_parser.RULE_evalCommand); + this.enterRule(_localctx, 50, esql_parser.RULE_evalCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 397; + this.state = 403; this.match(esql_parser.EVAL); - this.state = 398; + this.state = 404; this.fields(); } } @@ -1817,30 +1854,30 @@ export class esql_parser extends Parser { // @RuleVersion(0) public statsCommand(): StatsCommandContext { let _localctx: StatsCommandContext = new StatsCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 50, esql_parser.RULE_statsCommand); + this.enterRule(_localctx, 52, esql_parser.RULE_statsCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 400; + this.state = 406; this.match(esql_parser.STATS); - this.state = 402; + this.state = 408; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 38, this._ctx) ) { case 1: { - this.state = 401; + this.state = 407; this.fields(); } break; } - this.state = 406; + this.state = 412; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 39, this._ctx) ) { case 1: { - this.state = 404; + this.state = 410; this.match(esql_parser.BY); - this.state = 405; + this.state = 411; this.qualifiedNames(); } break; @@ -1864,12 +1901,12 @@ export class esql_parser extends Parser { // @RuleVersion(0) public sourceIdentifier(): SourceIdentifierContext { let _localctx: SourceIdentifierContext = new SourceIdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 52, esql_parser.RULE_sourceIdentifier); + this.enterRule(_localctx, 54, esql_parser.RULE_sourceIdentifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 408; + this.state = 414; _la = this._input.LA(1); if (!(_la === esql_parser.SRC_UNQUOTED_IDENTIFIER || _la === esql_parser.SRC_QUOTED_IDENTIFIER)) { this._errHandler.recoverInline(this); @@ -1900,12 +1937,12 @@ export class esql_parser extends Parser { // @RuleVersion(0) public enrichIdentifier(): EnrichIdentifierContext { let _localctx: EnrichIdentifierContext = new EnrichIdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 54, esql_parser.RULE_enrichIdentifier); + this.enterRule(_localctx, 56, esql_parser.RULE_enrichIdentifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 410; + this.state = 416; _la = this._input.LA(1); if (!(_la === esql_parser.ENR_UNQUOTED_IDENTIFIER || _la === esql_parser.ENR_QUOTED_IDENTIFIER)) { this._errHandler.recoverInline(this); @@ -1936,9 +1973,9 @@ export class esql_parser extends Parser { // @RuleVersion(0) public functionExpressionArgument(): FunctionExpressionArgumentContext { let _localctx: FunctionExpressionArgumentContext = new FunctionExpressionArgumentContext(this._ctx, this.state); - this.enterRule(_localctx, 56, esql_parser.RULE_functionExpressionArgument); + this.enterRule(_localctx, 58, esql_parser.RULE_functionExpressionArgument); try { - this.state = 415; + this.state = 421; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.ASTERISK: @@ -1946,14 +1983,14 @@ export class esql_parser extends Parser { case esql_parser.QUOTED_IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 412; + this.state = 418; this.qualifiedName(); } break; case esql_parser.STRING: this.enterOuterAlt(_localctx, 2); { - this.state = 413; + this.state = 419; this.string(); } break; @@ -1961,7 +1998,7 @@ export class esql_parser extends Parser { case esql_parser.DECIMAL_LITERAL: this.enterOuterAlt(_localctx, 3); { - this.state = 414; + this.state = 420; this.number(); } break; @@ -1986,15 +2023,15 @@ export class esql_parser extends Parser { // @RuleVersion(0) public mathFunctionExpressionArgument(): MathFunctionExpressionArgumentContext { let _localctx: MathFunctionExpressionArgumentContext = new MathFunctionExpressionArgumentContext(this._ctx, this.state); - this.enterRule(_localctx, 58, esql_parser.RULE_mathFunctionExpressionArgument); + this.enterRule(_localctx, 60, esql_parser.RULE_mathFunctionExpressionArgument); try { - this.state = 425; + this.state = 429; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 417; + this.state = 423; this.qualifiedName(); } break; @@ -2002,7 +2039,7 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 418; + this.state = 424; this.string(); } break; @@ -2010,7 +2047,7 @@ export class esql_parser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 419; + this.state = 425; this.number(); } break; @@ -2018,7 +2055,7 @@ export class esql_parser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 420; + this.state = 426; this.operatorExpression(0); } break; @@ -2026,19 +2063,15 @@ export class esql_parser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 421; - this.number(); - { - this.state = 422; - this.match(esql_parser.DATE_LITERAL); - } + this.state = 427; + this.dateExpression(); } break; case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 424; + this.state = 428; this.comparison(); } break; @@ -2061,28 +2094,28 @@ export class esql_parser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let _localctx: QualifiedNameContext = new QualifiedNameContext(this._ctx, this.state); - this.enterRule(_localctx, 60, esql_parser.RULE_qualifiedName); + this.enterRule(_localctx, 62, esql_parser.RULE_qualifiedName); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 427; + this.state = 431; this.identifier(); - this.state = 432; + this.state = 436; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 428; + this.state = 432; this.match(esql_parser.DOT); - this.state = 429; + this.state = 433; this.identifier(); } } } - this.state = 434; + this.state = 438; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); } @@ -2105,28 +2138,28 @@ export class esql_parser extends Parser { // @RuleVersion(0) public qualifiedNames(): QualifiedNamesContext { let _localctx: QualifiedNamesContext = new QualifiedNamesContext(this._ctx, this.state); - this.enterRule(_localctx, 62, esql_parser.RULE_qualifiedNames); + this.enterRule(_localctx, 64, esql_parser.RULE_qualifiedNames); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 435; + this.state = 439; this.qualifiedName(); - this.state = 440; + this.state = 444; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 436; + this.state = 440; this.match(esql_parser.COMMA); - this.state = 437; + this.state = 441; this.qualifiedName(); } } } - this.state = 442; + this.state = 446; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); } @@ -2149,12 +2182,12 @@ export class esql_parser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 64, esql_parser.RULE_identifier); + this.enterRule(_localctx, 66, esql_parser.RULE_identifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 443; + this.state = 447; _la = this._input.LA(1); if (!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & ((1 << (esql_parser.ASTERISK - 53)) | (1 << (esql_parser.UNQUOTED_IDENTIFIER - 53)) | (1 << (esql_parser.QUOTED_IDENTIFIER - 53)))) !== 0))) { this._errHandler.recoverInline(this); @@ -2185,11 +2218,11 @@ export class esql_parser extends Parser { // @RuleVersion(0) public mathFunctionIdentifier(): MathFunctionIdentifierContext { let _localctx: MathFunctionIdentifierContext = new MathFunctionIdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 66, esql_parser.RULE_mathFunctionIdentifier); + this.enterRule(_localctx, 68, esql_parser.RULE_mathFunctionIdentifier); try { this.enterOuterAlt(_localctx, 1); { - this.state = 445; + this.state = 449; this.match(esql_parser.MATH_FUNCTION); } } @@ -2210,11 +2243,11 @@ export class esql_parser extends Parser { // @RuleVersion(0) public functionIdentifier(): FunctionIdentifierContext { let _localctx: FunctionIdentifierContext = new FunctionIdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 68, esql_parser.RULE_functionIdentifier); + this.enterRule(_localctx, 70, esql_parser.RULE_functionIdentifier); try { this.enterOuterAlt(_localctx, 1); { - this.state = 447; + this.state = 451; this.match(esql_parser.UNARY_FUNCTION); } } @@ -2235,16 +2268,16 @@ export class esql_parser extends Parser { // @RuleVersion(0) public constant(): ConstantContext { let _localctx: ConstantContext = new ConstantContext(this._ctx, this.state); - this.enterRule(_localctx, 70, esql_parser.RULE_constant); + this.enterRule(_localctx, 72, esql_parser.RULE_constant); let _la: number; try { - this.state = 486; + this.state = 490; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 47, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 449; + this.state = 453; this.match(esql_parser.NULL); } break; @@ -2252,7 +2285,7 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 450; + this.state = 454; this.numericValue(); } break; @@ -2260,7 +2293,7 @@ export class esql_parser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 451; + this.state = 455; this.booleanValue(); } break; @@ -2268,7 +2301,7 @@ export class esql_parser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 452; + this.state = 456; this.string(); } break; @@ -2276,27 +2309,27 @@ export class esql_parser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 453; + this.state = 457; this.match(esql_parser.OPENING_BRACKET); - this.state = 454; + this.state = 458; this.numericValue(); - this.state = 459; + this.state = 463; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 455; + this.state = 459; this.match(esql_parser.COMMA); - this.state = 456; + this.state = 460; this.numericValue(); } } - this.state = 461; + this.state = 465; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 462; + this.state = 466; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2304,27 +2337,27 @@ export class esql_parser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 464; + this.state = 468; this.match(esql_parser.OPENING_BRACKET); - this.state = 465; + this.state = 469; this.booleanValue(); - this.state = 470; + this.state = 474; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 466; + this.state = 470; this.match(esql_parser.COMMA); - this.state = 467; + this.state = 471; this.booleanValue(); } } - this.state = 472; + this.state = 476; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 473; + this.state = 477; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2332,27 +2365,27 @@ export class esql_parser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 475; + this.state = 479; this.match(esql_parser.OPENING_BRACKET); - this.state = 476; + this.state = 480; this.string(); - this.state = 481; + this.state = 485; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === esql_parser.COMMA) { { { - this.state = 477; + this.state = 481; this.match(esql_parser.COMMA); - this.state = 478; + this.state = 482; this.string(); } } - this.state = 483; + this.state = 487; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 484; + this.state = 488; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2375,22 +2408,22 @@ export class esql_parser extends Parser { // @RuleVersion(0) public numericValue(): NumericValueContext { let _localctx: NumericValueContext = new NumericValueContext(this._ctx, this.state); - this.enterRule(_localctx, 72, esql_parser.RULE_numericValue); + this.enterRule(_localctx, 74, esql_parser.RULE_numericValue); try { - this.state = 490; + this.state = 494; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.DECIMAL_LITERAL: this.enterOuterAlt(_localctx, 1); { - this.state = 488; + this.state = 492; this.decimalValue(); } break; case esql_parser.INTEGER_LITERAL: this.enterOuterAlt(_localctx, 2); { - this.state = 489; + this.state = 493; this.integerValue(); } break; @@ -2415,13 +2448,13 @@ export class esql_parser extends Parser { // @RuleVersion(0) public limitCommand(): LimitCommandContext { let _localctx: LimitCommandContext = new LimitCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 74, esql_parser.RULE_limitCommand); + this.enterRule(_localctx, 76, esql_parser.RULE_limitCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 492; + this.state = 496; this.match(esql_parser.LIMIT); - this.state = 493; + this.state = 497; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2442,30 +2475,30 @@ export class esql_parser extends Parser { // @RuleVersion(0) public sortCommand(): SortCommandContext { let _localctx: SortCommandContext = new SortCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 76, esql_parser.RULE_sortCommand); + this.enterRule(_localctx, 78, esql_parser.RULE_sortCommand); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 495; + this.state = 499; this.match(esql_parser.SORT); - this.state = 496; + this.state = 500; this.orderExpression(); - this.state = 501; + this.state = 505; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 497; + this.state = 501; this.match(esql_parser.COMMA); - this.state = 498; + this.state = 502; this.orderExpression(); } } } - this.state = 503; + this.state = 507; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } @@ -2488,31 +2521,31 @@ export class esql_parser extends Parser { // @RuleVersion(0) public orderExpression(): OrderExpressionContext { let _localctx: OrderExpressionContext = new OrderExpressionContext(this._ctx, this.state); - this.enterRule(_localctx, 78, esql_parser.RULE_orderExpression); + this.enterRule(_localctx, 80, esql_parser.RULE_orderExpression); try { this.enterOuterAlt(_localctx, 1); { - this.state = 504; + this.state = 508; this.booleanExpression(0); - this.state = 506; + this.state = 510; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 50, this._ctx) ) { case 1: { - this.state = 505; + this.state = 509; this.match(esql_parser.ORDERING); } break; } - this.state = 510; + this.state = 514; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 51, this._ctx) ) { case 1: { - this.state = 508; + this.state = 512; this.match(esql_parser.NULLS_ORDERING); { - this.state = 509; + this.state = 513; this.match(esql_parser.NULLS_ORDERING_DIRECTION); } } @@ -2537,13 +2570,13 @@ export class esql_parser extends Parser { // @RuleVersion(0) public projectCommand(): ProjectCommandContext { let _localctx: ProjectCommandContext = new ProjectCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 80, esql_parser.RULE_projectCommand); + this.enterRule(_localctx, 82, esql_parser.RULE_projectCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 512; + this.state = 516; this.match(esql_parser.PROJECT); - this.state = 513; + this.state = 517; this.qualifiedNames(); } } @@ -2564,13 +2597,13 @@ export class esql_parser extends Parser { // @RuleVersion(0) public keepCommand(): KeepCommandContext { let _localctx: KeepCommandContext = new KeepCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 82, esql_parser.RULE_keepCommand); + this.enterRule(_localctx, 84, esql_parser.RULE_keepCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 515; + this.state = 519; this.match(esql_parser.KEEP); - this.state = 516; + this.state = 520; this.qualifiedNames(); } } @@ -2591,13 +2624,13 @@ export class esql_parser extends Parser { // @RuleVersion(0) public dropCommand(): DropCommandContext { let _localctx: DropCommandContext = new DropCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 84, esql_parser.RULE_dropCommand); + this.enterRule(_localctx, 86, esql_parser.RULE_dropCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 518; + this.state = 522; this.match(esql_parser.DROP); - this.state = 519; + this.state = 523; this.qualifiedNames(); } } @@ -2618,28 +2651,28 @@ export class esql_parser extends Parser { // @RuleVersion(0) public renameVariable(): RenameVariableContext { let _localctx: RenameVariableContext = new RenameVariableContext(this._ctx, this.state); - this.enterRule(_localctx, 86, esql_parser.RULE_renameVariable); + this.enterRule(_localctx, 88, esql_parser.RULE_renameVariable); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 521; + this.state = 525; this.identifier(); - this.state = 526; + this.state = 530; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 522; + this.state = 526; this.match(esql_parser.DOT); - this.state = 523; + this.state = 527; this.identifier(); } } } - this.state = 528; + this.state = 532; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); } @@ -2662,30 +2695,30 @@ export class esql_parser extends Parser { // @RuleVersion(0) public renameCommand(): RenameCommandContext { let _localctx: RenameCommandContext = new RenameCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 88, esql_parser.RULE_renameCommand); + this.enterRule(_localctx, 90, esql_parser.RULE_renameCommand); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 529; + this.state = 533; this.match(esql_parser.RENAME); - this.state = 530; + this.state = 534; this.renameClause(); - this.state = 535; + this.state = 539; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 531; + this.state = 535; this.match(esql_parser.COMMA); - this.state = 532; + this.state = 536; this.renameClause(); } } } - this.state = 537; + this.state = 541; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } @@ -2708,15 +2741,15 @@ export class esql_parser extends Parser { // @RuleVersion(0) public renameClause(): RenameClauseContext { let _localctx: RenameClauseContext = new RenameClauseContext(this._ctx, this.state); - this.enterRule(_localctx, 90, esql_parser.RULE_renameClause); + this.enterRule(_localctx, 92, esql_parser.RULE_renameClause); try { this.enterOuterAlt(_localctx, 1); { - this.state = 538; + this.state = 542; this.qualifiedName(); - this.state = 539; + this.state = 543; this.match(esql_parser.AS); - this.state = 540; + this.state = 544; this.renameVariable(); } } @@ -2737,22 +2770,22 @@ export class esql_parser extends Parser { // @RuleVersion(0) public dissectCommand(): DissectCommandContext { let _localctx: DissectCommandContext = new DissectCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 92, esql_parser.RULE_dissectCommand); + this.enterRule(_localctx, 94, esql_parser.RULE_dissectCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 542; + this.state = 546; this.match(esql_parser.DISSECT); - this.state = 543; + this.state = 547; this.qualifiedNames(); - this.state = 544; + this.state = 548; this.string(); - this.state = 546; + this.state = 550; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 54, this._ctx) ) { case 1: { - this.state = 545; + this.state = 549; this.commandOptions(); } break; @@ -2776,15 +2809,15 @@ export class esql_parser extends Parser { // @RuleVersion(0) public grokCommand(): GrokCommandContext { let _localctx: GrokCommandContext = new GrokCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 94, esql_parser.RULE_grokCommand); + this.enterRule(_localctx, 96, esql_parser.RULE_grokCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 548; + this.state = 552; this.match(esql_parser.GROK); - this.state = 549; + this.state = 553; this.qualifiedNames(); - this.state = 550; + this.state = 554; this.string(); } } @@ -2805,28 +2838,28 @@ export class esql_parser extends Parser { // @RuleVersion(0) public commandOptions(): CommandOptionsContext { let _localctx: CommandOptionsContext = new CommandOptionsContext(this._ctx, this.state); - this.enterRule(_localctx, 96, esql_parser.RULE_commandOptions); + this.enterRule(_localctx, 98, esql_parser.RULE_commandOptions); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 552; + this.state = 556; this.commandOption(); - this.state = 557; + this.state = 561; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 553; + this.state = 557; this.match(esql_parser.COMMA); - this.state = 554; + this.state = 558; this.commandOption(); } } } - this.state = 559; + this.state = 563; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } @@ -2849,15 +2882,15 @@ export class esql_parser extends Parser { // @RuleVersion(0) public commandOption(): CommandOptionContext { let _localctx: CommandOptionContext = new CommandOptionContext(this._ctx, this.state); - this.enterRule(_localctx, 98, esql_parser.RULE_commandOption); + this.enterRule(_localctx, 100, esql_parser.RULE_commandOption); try { this.enterOuterAlt(_localctx, 1); { - this.state = 560; + this.state = 564; this.identifier(); - this.state = 561; + this.state = 565; this.match(esql_parser.ASSIGN); - this.state = 562; + this.state = 566; this.constant(); } } @@ -2878,11 +2911,11 @@ export class esql_parser extends Parser { // @RuleVersion(0) public booleanValue(): BooleanValueContext { let _localctx: BooleanValueContext = new BooleanValueContext(this._ctx, this.state); - this.enterRule(_localctx, 100, esql_parser.RULE_booleanValue); + this.enterRule(_localctx, 102, esql_parser.RULE_booleanValue); try { this.enterOuterAlt(_localctx, 1); { - this.state = 564; + this.state = 568; this.match(esql_parser.BOOLEAN_VALUE); } } @@ -2903,16 +2936,16 @@ export class esql_parser extends Parser { // @RuleVersion(0) public number(): NumberContext { let _localctx: NumberContext = new NumberContext(this._ctx, this.state); - this.enterRule(_localctx, 102, esql_parser.RULE_number); + this.enterRule(_localctx, 104, esql_parser.RULE_number); try { - this.state = 568; + this.state = 572; this._errHandler.sync(this); switch (this._input.LA(1)) { case esql_parser.DECIMAL_LITERAL: _localctx = new DecimalLiteralContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 566; + this.state = 570; this.match(esql_parser.DECIMAL_LITERAL); } break; @@ -2920,7 +2953,7 @@ export class esql_parser extends Parser { _localctx = new IntegerLiteralContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 567; + this.state = 571; this.match(esql_parser.INTEGER_LITERAL); } break; @@ -2945,11 +2978,11 @@ export class esql_parser extends Parser { // @RuleVersion(0) public decimalValue(): DecimalValueContext { let _localctx: DecimalValueContext = new DecimalValueContext(this._ctx, this.state); - this.enterRule(_localctx, 104, esql_parser.RULE_decimalValue); + this.enterRule(_localctx, 106, esql_parser.RULE_decimalValue); try { this.enterOuterAlt(_localctx, 1); { - this.state = 570; + this.state = 574; this.match(esql_parser.DECIMAL_LITERAL); } } @@ -2970,11 +3003,11 @@ export class esql_parser extends Parser { // @RuleVersion(0) public integerValue(): IntegerValueContext { let _localctx: IntegerValueContext = new IntegerValueContext(this._ctx, this.state); - this.enterRule(_localctx, 106, esql_parser.RULE_integerValue); + this.enterRule(_localctx, 108, esql_parser.RULE_integerValue); try { this.enterOuterAlt(_localctx, 1); { - this.state = 572; + this.state = 576; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2995,11 +3028,11 @@ export class esql_parser extends Parser { // @RuleVersion(0) public string(): StringContext { let _localctx: StringContext = new StringContext(this._ctx, this.state); - this.enterRule(_localctx, 108, esql_parser.RULE_string); + this.enterRule(_localctx, 110, esql_parser.RULE_string); try { this.enterOuterAlt(_localctx, 1); { - this.state = 574; + this.state = 578; this.match(esql_parser.STRING); } } @@ -3020,11 +3053,11 @@ export class esql_parser extends Parser { // @RuleVersion(0) public comparisonOperator(): ComparisonOperatorContext { let _localctx: ComparisonOperatorContext = new ComparisonOperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 110, esql_parser.RULE_comparisonOperator); + this.enterRule(_localctx, 112, esql_parser.RULE_comparisonOperator); try { this.enterOuterAlt(_localctx, 1); { - this.state = 576; + this.state = 580; this.match(esql_parser.COMPARISON_OPERATOR); } } @@ -3045,13 +3078,13 @@ export class esql_parser extends Parser { // @RuleVersion(0) public explainCommand(): ExplainCommandContext { let _localctx: ExplainCommandContext = new ExplainCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 112, esql_parser.RULE_explainCommand); + this.enterRule(_localctx, 114, esql_parser.RULE_explainCommand); try { this.enterOuterAlt(_localctx, 1); { - this.state = 578; + this.state = 582; this.match(esql_parser.EXPLAIN); - this.state = 579; + this.state = 583; this.subqueryExpression(); } } @@ -3072,15 +3105,15 @@ export class esql_parser extends Parser { // @RuleVersion(0) public subqueryExpression(): SubqueryExpressionContext { let _localctx: SubqueryExpressionContext = new SubqueryExpressionContext(this._ctx, this.state); - this.enterRule(_localctx, 114, esql_parser.RULE_subqueryExpression); + this.enterRule(_localctx, 116, esql_parser.RULE_subqueryExpression); try { this.enterOuterAlt(_localctx, 1); { - this.state = 581; + this.state = 585; this.match(esql_parser.OPENING_BRACKET); - this.state = 582; + this.state = 586; this.query(0); - this.state = 583; + this.state = 587; this.match(esql_parser.CLOSING_BRACKET); } } @@ -3101,17 +3134,17 @@ export class esql_parser extends Parser { // @RuleVersion(0) public showCommand(): ShowCommandContext { let _localctx: ShowCommandContext = new ShowCommandContext(this._ctx, this.state); - this.enterRule(_localctx, 116, esql_parser.RULE_showCommand); + this.enterRule(_localctx, 118, esql_parser.RULE_showCommand); try { - this.state = 589; + this.state = 593; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 57, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 585; + this.state = 589; this.match(esql_parser.SHOW); - this.state = 586; + this.state = 590; this.match(esql_parser.INFO); } break; @@ -3119,9 +3152,9 @@ export class esql_parser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 587; + this.state = 591; this.match(esql_parser.SHOW); - this.state = 588; + this.state = 592; this.match(esql_parser.FUNCTIONS); } break; @@ -3153,7 +3186,7 @@ export class esql_parser extends Parser { case 9: return this.booleanExpression_sempred(_localctx as BooleanExpressionContext, predIndex); - case 15: + case 16: return this.operatorExpression_sempred(_localctx as OperatorExpressionContext, predIndex); } return true; @@ -3198,7 +3231,7 @@ export class esql_parser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03S\u0252\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03S\u0256\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -3207,284 +3240,285 @@ export class esql_parser extends Parser { "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#" + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + "\x04,\t,\x04-\t-\x04.\t.\x04/\t/\x040\t0\x041\t1\x042\t2\x043\t3\x044" + - "\t4\x045\t5\x046\t6\x047\t7\x048\t8\x049\t9\x04:\t:\x04;\t;\x04<\t<\x03" + - "\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07" + - "\x03\x82\n\x03\f\x03\x0E\x03\x85\v\x03\x03\x04\x03\x04\x03\x04\x03\x04" + - "\x05\x04\x8B\n\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x9A\n\x05" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xA0\n\x06\x03\x06\x03\x06\x03" + - "\x06\x03\x06\x07\x06\xA6\n\x06\f\x06\x0E\x06\xA9\v\x06\x05\x06\xAB\n\x06" + - "\x03\x07\x03\x07\x03\x07\x05\x07\xB0\n\x07\x03\x07\x03\x07\x03\b\x03\b" + - "\x03\b\x03\t\x03\t\x03\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x05" + - "\n\xC1\n\n\x03\n\x03\n\x03\n\x03\n\x03\n\x07\n\xC8\n\n\f\n\x0E\n\xCB\v" + - "\n\x03\n\x03\n\x03\n\x05\n\xD0\n\n\x03\n\x03\n\x03\n\x03\n\x03\n\x07\n" + - "\xD7\n\n\f\n\x0E\n\xDA\v\n\x05\n\xDC\n\n\x03\n\x03\n\x03\n\x03\n\x03\n" + - "\x05\n\xE3\n\n\x03\n\x03\n\x05\n\xE7\n\n\x03\n\x03\n\x03\n\x03\n\x03\n" + - "\x03\n\x07\n\xEF\n\n\f\n\x0E\n\xF2\v\n\x03\v\x03\v\x03\v\x03\v\x05\v\xF8" + - "\n\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x07\v\u0100\n\v\f\v\x0E\v\u0103" + - "\v\v\x03\f\x03\f\x05\f\u0107\n\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\u010E" + - "\n\f\x03\f\x03\f\x03\f\x05\f\u0113\n\f\x03\r\x03\r\x05\r\u0117\n\r\x03" + - "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07" + - "\x0F\u0122\n\x0F\f\x0F\x0E\x0F\u0125\v\x0F\x05\x0F\u0127\n\x0F\x03\x0F" + - "\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x07\x10\u0130\n\x10\f" + - "\x10\x0E\x10\u0133\v\x10\x05\x10\u0135\n\x10\x03\x10\x03\x10\x03\x11\x03" + - "\x11\x03\x11\x03\x11\x03\x11\x03\x11\x05\x11\u013F\n\x11\x03\x11\x03\x11" + - "\x03\x11\x03\x11\x03\x11\x03\x11\x07\x11\u0147\n\x11\f\x11\x0E\x11\u014A" + - "\v\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x07\x12\u0157\n\x12\f\x12\x0E\x12\u015A\v\x12" + - "\x05\x12\u015C\n\x12\x03\x12\x03\x12\x05\x12\u0160\n\x12\x03\x13\x03\x13" + - "\x03\x13\x03\x14\x03\x14\x03\x14\x07\x14\u0168\n\x14\f\x14\x0E\x14\u016B" + - "\v\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u0172\n\x15\x03" + - "\x16\x03\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u017C" + - "\n\x18\f\x18\x0E\x18\u017F\v\x18\x03\x18\x05\x18\u0182\n\x18\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x03\x19\x07\x19\u0189\n\x19\f\x19\x0E\x19\u018C\v" + - "\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x05\x1B\u0195" + - "\n\x1B\x03\x1B\x03\x1B\x05\x1B\u0199\n\x1B\x03\x1C\x03\x1C\x03\x1D\x03" + - "\x1D\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u01A2\n\x1E\x03\x1F\x03\x1F\x03\x1F" + - "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x05\x1F\u01AC\n\x1F\x03 \x03" + - " \x03 \x07 \u01B1\n \f \x0E \u01B4\v \x03!\x03!\x03!\x07!\u01B9\n!\f!" + - "\x0E!\u01BC\v!\x03\"\x03\"\x03#\x03#\x03$\x03$\x03%\x03%\x03%\x03%\x03" + - "%\x03%\x03%\x03%\x07%\u01CC\n%\f%\x0E%\u01CF\v%\x03%\x03%\x03%\x03%\x03" + - "%\x03%\x07%\u01D7\n%\f%\x0E%\u01DA\v%\x03%\x03%\x03%\x03%\x03%\x03%\x07" + - "%\u01E2\n%\f%\x0E%\u01E5\v%\x03%\x03%\x05%\u01E9\n%\x03&\x03&\x05&\u01ED" + - "\n&\x03\'\x03\'\x03\'\x03(\x03(\x03(\x03(\x07(\u01F6\n(\f(\x0E(\u01F9" + - "\v(\x03)\x03)\x05)\u01FD\n)\x03)\x03)\x05)\u0201\n)\x03*\x03*\x03*\x03" + - "+\x03+\x03+\x03,\x03,\x03,\x03-\x03-\x03-\x07-\u020F\n-\f-\x0E-\u0212" + - "\v-\x03.\x03.\x03.\x03.\x07.\u0218\n.\f.\x0E.\u021B\v.\x03/\x03/\x03/" + - "\x03/\x030\x030\x030\x030\x050\u0225\n0\x031\x031\x031\x031\x032\x032" + - "\x032\x072\u022E\n2\f2\x0E2\u0231\v2\x033\x033\x033\x033\x034\x034\x03" + - "5\x035\x055\u023B\n5\x036\x036\x037\x037\x038\x038\x039\x039\x03:\x03" + - ":\x03:\x03;\x03;\x03;\x03;\x03<\x03<\x03<\x03<\x05<\u0250\n<\x03<\x02" + - "\x02\x06\x04\x12\x14 =\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E\x02" + - "\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 \x02" + - "\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02<\x02" + - ">\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02V\x02X\x02" + - "Z\x02\\\x02^\x02`\x02b\x02d\x02f\x02h\x02j\x02l\x02n\x02p\x02r\x02t\x02" + - "v\x02\x02\x07\x03\x0256\x03\x0279\x03\x02NO\x03\x02GH\x04\x0277AB\x02" + - "\u026F\x02x\x03\x02\x02\x02\x04{\x03\x02\x02\x02\x06\x8A\x03\x02\x02\x02" + - "\b\x99\x03\x02\x02\x02\n\x9B\x03\x02\x02\x02\f\xAF\x03\x02\x02\x02\x0E" + - "\xB3\x03\x02\x02\x02\x10\xB6\x03\x02\x02\x02\x12\xE6\x03\x02\x02\x02\x14" + - "\xF7\x03\x02\x02\x02\x16\u0112\x03\x02\x02\x02\x18\u0116\x03\x02\x02\x02" + - "\x1A\u0118\x03\x02\x02\x02\x1C\u011C\x03\x02\x02\x02\x1E\u012A\x03\x02" + - "\x02\x02 \u013E\x03\x02\x02\x02\"\u015F\x03\x02\x02\x02$\u0161\x03\x02" + - "\x02\x02&\u0164\x03\x02\x02\x02(\u0171\x03\x02\x02\x02*\u0173\x03\x02" + - "\x02\x02,\u0175\x03\x02\x02\x02.\u0177\x03\x02\x02\x020\u0183\x03\x02" + - "\x02\x022\u018F\x03\x02\x02\x024\u0192\x03\x02\x02\x026\u019A\x03\x02" + - "\x02\x028\u019C\x03\x02\x02\x02:\u01A1\x03\x02\x02\x02<\u01AB\x03\x02" + - "\x02\x02>\u01AD\x03\x02\x02\x02@\u01B5\x03\x02\x02\x02B\u01BD\x03\x02" + - "\x02\x02D\u01BF\x03\x02\x02\x02F\u01C1\x03\x02\x02\x02H\u01E8\x03\x02" + - "\x02\x02J\u01EC\x03\x02\x02\x02L\u01EE\x03\x02\x02\x02N\u01F1\x03\x02" + - "\x02\x02P\u01FA\x03\x02\x02\x02R\u0202\x03\x02\x02\x02T\u0205\x03\x02" + - "\x02\x02V\u0208\x03\x02\x02\x02X\u020B\x03\x02\x02\x02Z\u0213\x03\x02" + - "\x02\x02\\\u021C\x03\x02\x02\x02^\u0220\x03\x02\x02\x02`\u0226\x03\x02" + - "\x02\x02b\u022A\x03\x02\x02\x02d\u0232\x03\x02\x02\x02f\u0236\x03\x02" + - "\x02\x02h\u023A\x03\x02\x02\x02j\u023C\x03\x02\x02\x02l\u023E\x03\x02" + - "\x02\x02n\u0240\x03\x02\x02\x02p\u0242\x03\x02\x02\x02r\u0244\x03\x02" + - "\x02\x02t\u0247\x03\x02\x02\x02v\u024F\x03\x02\x02\x02xy\x05\x04\x03\x02" + - "yz\x07\x02\x02\x03z\x03\x03\x02\x02\x02{|\b\x03\x01\x02|}\x05\x06\x04" + - "\x02}\x83\x03\x02\x02\x02~\x7F\f\x03\x02\x02\x7F\x80\x07\x1A\x02\x02\x80" + - "\x82\x05\b\x05\x02\x81~\x03\x02\x02\x02\x82\x85\x03\x02\x02\x02\x83\x81" + - "\x03\x02\x02\x02\x83\x84\x03\x02\x02\x02\x84\x05\x03\x02\x02\x02\x85\x83" + - "\x03\x02\x02\x02\x86\x8B\x05r:\x02\x87\x8B\x05.\x18\x02\x88\x8B\x05$\x13" + - "\x02\x89\x8B\x05v<\x02\x8A\x86\x03\x02\x02\x02\x8A\x87\x03\x02\x02\x02" + - "\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02\x8B\x07\x03\x02\x02\x02" + - "\x8C\x9A\x052\x1A\x02\x8D\x9A\x05L\'\x02\x8E\x9A\x05R*\x02\x8F\x9A\x05" + - "T+\x02\x90\x9A\x05Z.\x02\x91\x9A\x05V,\x02\x92\x9A\x05^0\x02\x93\x9A\x05" + - "`1\x02\x94\x9A\x05N(\x02\x95\x9A\x054\x1B\x02\x96\x9A\x05\x10\t\x02\x97" + - "\x9A\x05\x0E\b\x02\x98\x9A\x05\n\x06\x02\x99\x8C\x03\x02\x02\x02\x99\x8D" + - "\x03\x02\x02\x02\x99\x8E\x03\x02\x02\x02\x99\x8F\x03\x02\x02\x02\x99\x90" + - "\x03\x02\x02\x02\x99\x91\x03\x02\x02\x02\x99\x92\x03\x02\x02\x02\x99\x93" + - "\x03\x02\x02\x02\x99\x94\x03\x02\x02\x02\x99\x95\x03\x02\x02\x02\x99\x96" + - "\x03\x02\x02\x02\x99\x97\x03\x02\x02\x02\x99\x98\x03\x02\x02\x02\x9A\t" + - "\x03\x02\x02\x02\x9B\x9C\x07\x12\x02\x02\x9C\x9F\x058\x1D\x02\x9D\x9E" + - "\x07L\x02\x02\x9E\xA0\x05*\x16\x02\x9F\x9D\x03\x02\x02\x02\x9F\xA0\x03" + - "\x02\x02\x02\xA0\xAA\x03\x02\x02\x02\xA1\xA2\x07M\x02\x02\xA2\xA7\x05" + - "\f\x07\x02\xA3\xA4\x07\"\x02\x02\xA4\xA6\x05\f\x07\x02\xA5\xA3\x03\x02" + - "\x02\x02\xA6\xA9\x03\x02\x02\x02\xA7\xA5\x03\x02\x02\x02\xA7\xA8\x03\x02" + - "\x02\x02\xA8\xAB\x03\x02\x02\x02\xA9\xA7\x03\x02\x02\x02\xAA\xA1\x03\x02" + - "\x02\x02\xAA\xAB\x03\x02\x02\x02\xAB\v\x03\x02\x02\x02\xAC\xAD\x05*\x16" + - "\x02\xAD\xAE\x07!\x02\x02\xAE\xB0\x03\x02\x02\x02\xAF\xAC\x03\x02\x02" + - "\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB1\x03\x02\x02\x02\xB1\xB2\x05*\x16" + - "\x02\xB2\r\x03\x02\x02\x02\xB3\xB4\x07\f\x02\x02\xB4\xB5\x05@!\x02\xB5" + - "\x0F\x03\x02\x02\x02\xB6\xB7\x07\n\x02\x02\xB7\xB8\x05\x12\n\x02\xB8\x11" + - "\x03\x02\x02\x02\xB9\xBA\b\n\x01\x02\xBA\xBB\x07\'\x02\x02\xBB\xE7\x05" + - "\x12\n\n\xBC\xE7\x05\x18\r\x02\xBD\xE7\x05\x16\f\x02\xBE\xC0\x05\x18\r" + - "\x02\xBF\xC1\x07\'\x02\x02\xC0\xBF\x03\x02\x02\x02\xC0\xC1\x03\x02\x02" + - "\x02\xC1\xC2\x03\x02\x02\x02\xC2\xC3\x07*\x02\x02\xC3\xC4\x07$\x02\x02" + - "\xC4\xC9\x05\x18\r\x02\xC5\xC6\x07\"\x02\x02\xC6\xC8\x05\x18\r\x02\xC7" + - "\xC5\x03\x02\x02\x02\xC8\xCB\x03\x02\x02\x02\xC9\xC7\x03\x02\x02\x02\xC9" + - "\xCA\x03\x02\x02\x02\xCA\xCC\x03\x02\x02\x02\xCB\xC9\x03\x02\x02\x02\xCC" + - "\xCD\x07/\x02\x02\xCD\xE7\x03\x02\x02\x02\xCE\xD0\x07\'\x02\x02\xCF\xCE" + - "\x03\x02\x02\x02\xCF\xD0\x03\x02\x02\x02\xD0\xD1\x03\x02\x02\x02\xD1\xD2" + - "\x07@\x02\x02\xD2\xD3\x07$\x02\x02\xD3\xDB\x05> \x02\xD4\xD5\x07\"\x02" + - "\x02\xD5\xD7\x05:\x1E\x02\xD6\xD4\x03\x02\x02\x02\xD7\xDA\x03\x02\x02" + - "\x02\xD8\xD6\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02\xD9\xDC\x03\x02\x02" + - "\x02\xDA\xD8\x03\x02\x02\x02\xDB\xD8\x03\x02\x02\x02\xDB\xDC\x03\x02\x02" + - "\x02\xDC\xDD\x03\x02\x02\x02\xDD\xDE\x07/\x02\x02\xDE\xE7\x03\x02\x02" + - "\x02\xDF\xE0\x05\x18\r\x02\xE0\xE2\x07+\x02\x02\xE1\xE3\x07\'\x02\x02" + - "\xE2\xE1\x03\x02\x02\x02\xE2\xE3\x03\x02\x02\x02\xE3\xE4\x03\x02\x02\x02" + - "\xE4\xE5\x07-\x02\x02\xE5\xE7\x03\x02\x02\x02\xE6\xB9\x03\x02\x02\x02" + - "\xE6\xBC\x03\x02\x02\x02\xE6\xBD\x03\x02\x02\x02\xE6\xBE\x03\x02\x02\x02" + - "\xE6\xCF\x03\x02\x02\x02\xE6\xDF\x03\x02\x02\x02\xE7\xF0\x03\x02\x02\x02" + - "\xE8\xE9\f\x07\x02\x02\xE9\xEA\x07 \x02\x02\xEA\xEF\x05\x12\n\b\xEB\xEC" + - "\f\x06\x02\x02\xEC\xED\x07.\x02\x02\xED\xEF\x05\x12\n\x07\xEE\xE8\x03" + - "\x02\x02\x02\xEE\xEB\x03\x02\x02\x02\xEF\xF2\x03\x02\x02\x02\xF0\xEE\x03" + - "\x02\x02\x02\xF0\xF1\x03\x02\x02\x02\xF1\x13\x03\x02\x02\x02\xF2\xF0\x03" + - "\x02\x02\x02\xF3\xF4\b\v\x01\x02\xF4\xF5\x07\'\x02\x02\xF5\xF8\x05\x14" + - "\v\x06\xF6\xF8\x05\x18\r\x02\xF7\xF3\x03\x02\x02\x02\xF7\xF6\x03\x02\x02" + - "\x02\xF8\u0101\x03\x02\x02\x02\xF9\xFA\f\x04\x02\x02\xFA\xFB\x07 \x02" + - "\x02\xFB\u0100\x05\x14\v\x05\xFC\xFD\f\x03\x02\x02\xFD\xFE\x07.\x02\x02" + - "\xFE\u0100\x05\x14\v\x04\xFF\xF9\x03\x02\x02\x02\xFF\xFC\x03\x02\x02\x02" + - "\u0100\u0103\x03\x02\x02\x02\u0101\xFF\x03\x02\x02\x02\u0101\u0102\x03" + - "\x02\x02\x02\u0102\x15\x03\x02\x02\x02\u0103\u0101\x03\x02\x02\x02\u0104" + - "\u0106\x05\x18\r\x02\u0105\u0107\x07\'\x02\x02\u0106\u0105\x03\x02\x02" + - "\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0108\x03\x02\x02\x02\u0108\u0109" + - "\x07(\x02\x02\u0109\u010A\x05n8\x02\u010A\u0113\x03\x02\x02\x02\u010B" + - "\u010D\x05\x18\r\x02\u010C\u010E\x07\'\x02\x02\u010D\u010C\x03\x02\x02" + - "\x02\u010D\u010E\x03\x02\x02\x02\u010E\u010F\x03\x02\x02\x02\u010F\u0110" + - "\x07)\x02\x02\u0110\u0111\x05n8\x02\u0111\u0113\x03\x02\x02\x02\u0112" + - "\u0104\x03\x02\x02\x02\u0112\u010B\x03\x02\x02\x02\u0113\x17\x03\x02\x02" + - "\x02\u0114\u0117\x05 \x11\x02\u0115\u0117\x05\x1A\x0E\x02\u0116\u0114" + - "\x03\x02\x02\x02\u0116\u0115\x03\x02\x02\x02\u0117\x19\x03\x02\x02\x02" + - "\u0118\u0119\x05 \x11\x02\u0119\u011A\x05p9\x02\u011A\u011B\x05 \x11\x02" + - "\u011B\x1B\x03\x02\x02\x02\u011C\u011D\x05F$\x02\u011D\u0126\x07$\x02" + - "\x02\u011E\u0123\x05:\x1E\x02\u011F\u0120\x07\"\x02\x02\u0120\u0122\x05" + - ":\x1E\x02\u0121\u011F\x03\x02\x02\x02\u0122\u0125\x03\x02\x02\x02\u0123" + - "\u0121\x03\x02\x02\x02\u0123\u0124\x03\x02\x02\x02\u0124\u0127\x03\x02" + - "\x02\x02\u0125\u0123\x03\x02\x02\x02\u0126\u011E\x03\x02\x02\x02\u0126" + - "\u0127\x03\x02\x02\x02\u0127\u0128\x03\x02\x02\x02\u0128\u0129\x07/\x02" + - "\x02\u0129\x1D\x03\x02\x02\x02\u012A\u012B\x05D#\x02\u012B\u0134\x07$" + - "\x02\x02\u012C\u0131\x05<\x1F\x02\u012D\u012E\x07\"\x02\x02\u012E\u0130" + - "\x05<\x1F\x02\u012F\u012D\x03\x02\x02\x02\u0130\u0133\x03\x02\x02\x02" + - "\u0131\u012F\x03\x02\x02\x02\u0131\u0132\x03\x02\x02\x02\u0132\u0135\x03" + - "\x02\x02\x02\u0133\u0131\x03\x02\x02\x02\u0134\u012C\x03\x02\x02\x02\u0134" + - "\u0135\x03\x02\x02\x02\u0135\u0136\x03\x02\x02\x02\u0136\u0137\x07/\x02" + - "\x02\u0137\x1F\x03\x02\x02\x02\u0138\u0139\b\x11\x01\x02\u0139\u013F\x05" + - "\"\x12\x02\u013A\u013F\x05\x1C\x0F\x02\u013B\u013F\x05\x1E\x10\x02\u013C" + - "\u013D\t\x02\x02\x02\u013D\u013F\x05 \x11\x05\u013E\u0138\x03\x02\x02" + - "\x02\u013E\u013A\x03\x02\x02\x02\u013E\u013B\x03\x02\x02\x02\u013E\u013C" + - "\x03\x02\x02\x02\u013F\u0148\x03\x02\x02\x02\u0140\u0141\f\x04\x02\x02" + - "\u0141\u0142\t\x03\x02\x02\u0142\u0147\x05 \x11\x05\u0143\u0144\f\x03" + - "\x02\x02\u0144\u0145\t\x02\x02\x02\u0145\u0147\x05 \x11\x04\u0146\u0140" + - "\x03\x02\x02\x02\u0146\u0143\x03\x02\x02\x02\u0147\u014A\x03\x02\x02\x02" + - "\u0148\u0146\x03\x02\x02\x02\u0148\u0149\x03\x02\x02\x02\u0149!\x03\x02" + - "\x02\x02\u014A\u0148\x03\x02\x02\x02\u014B\u0160\x05H%\x02\u014C\u0160" + - "\x05> \x02\u014D\u014E\x07$\x02\x02\u014E\u014F\x05\x14\v\x02\u014F\u0150" + - "\x07/\x02\x02\u0150\u0160\x03\x02\x02\x02\u0151\u0152\x05B\"\x02\u0152" + - "\u015B\x07$\x02\x02\u0153\u0158\x05\x14\v\x02\u0154\u0155\x07\"\x02\x02" + - "\u0155\u0157\x05\x14\v\x02\u0156\u0154\x03\x02\x02\x02\u0157\u015A\x03" + - "\x02\x02\x02\u0158\u0156\x03\x02\x02\x02\u0158\u0159\x03\x02\x02\x02\u0159" + - "\u015C\x03\x02\x02\x02\u015A\u0158\x03\x02\x02\x02\u015B\u0153\x03\x02" + - "\x02\x02\u015B\u015C\x03\x02\x02\x02\u015C\u015D\x03\x02\x02\x02\u015D" + - "\u015E\x07/\x02\x02\u015E\u0160\x03\x02\x02\x02\u015F\u014B\x03\x02\x02" + - "\x02\u015F\u014C\x03\x02\x02\x02\u015F\u014D\x03\x02\x02\x02\u015F\u0151" + - "\x03\x02\x02\x02\u0160#\x03\x02\x02\x02\u0161\u0162\x07\b\x02\x02\u0162" + - "\u0163\x05&\x14\x02\u0163%\x03\x02\x02\x02\u0164\u0169\x05(\x15\x02\u0165" + - "\u0166\x07\"\x02\x02\u0166\u0168\x05(\x15\x02\u0167\u0165\x03\x02\x02" + - "\x02\u0168\u016B\x03\x02\x02\x02\u0169\u0167\x03\x02\x02\x02\u0169\u016A" + - "\x03\x02\x02\x02\u016A\'\x03\x02\x02\x02\u016B\u0169\x03\x02\x02\x02\u016C" + - "\u0172\x05\x14\v\x02\u016D\u016E\x05,\x17\x02\u016E\u016F\x07!\x02\x02" + - "\u016F\u0170\x05\x14\v\x02\u0170\u0172\x03\x02\x02\x02\u0171\u016C\x03" + - "\x02\x02\x02\u0171\u016D\x03\x02\x02\x02\u0172)\x03\x02\x02\x02\u0173" + - "\u0174\t\x04\x02\x02\u0174+\x03\x02\x02\x02\u0175\u0176\x05B\"\x02\u0176" + - "-\x03\x02\x02\x02\u0177\u0178\x07\x07\x02\x02\u0178\u017D\x056\x1C\x02" + - "\u0179\u017A\x07\"\x02\x02\u017A\u017C\x056\x1C\x02\u017B\u0179\x03\x02" + - "\x02\x02\u017C\u017F\x03\x02\x02\x02\u017D\u017B\x03\x02\x02\x02\u017D" + - "\u017E\x03\x02\x02\x02\u017E\u0181\x03\x02\x02\x02\u017F\u017D\x03\x02" + - "\x02\x02\u0180\u0182\x050\x19\x02\u0181\u0180\x03\x02\x02\x02\u0181\u0182" + - "\x03\x02\x02\x02\u0182/\x03\x02\x02\x02\u0183\u0184\x07%\x02\x02\u0184" + - "\u0185\x07F\x02\x02\u0185\u018A\x056\x1C\x02\u0186\u0187\x07\"\x02\x02" + - "\u0187\u0189\x056\x1C\x02\u0188\u0186\x03\x02\x02\x02\u0189\u018C\x03" + - "\x02\x02\x02\u018A\u0188\x03\x02\x02\x02\u018A\u018B\x03\x02\x02\x02\u018B" + - "\u018D\x03\x02\x02\x02\u018C\u018A\x03\x02\x02\x02\u018D\u018E\x07&\x02" + - "\x02\u018E1\x03\x02\x02\x02\u018F\u0190\x07\x05\x02\x02\u0190\u0191\x05" + - "&\x14\x02\u01913\x03\x02\x02\x02\u0192\u0194\x07\t\x02\x02\u0193\u0195" + - "\x05&\x14\x02\u0194\u0193\x03\x02\x02\x02\u0194\u0195\x03\x02\x02\x02" + - "\u0195\u0198\x03\x02\x02\x02\u0196\u0197\x07\x1E\x02\x02\u0197\u0199\x05" + - "@!\x02\u0198\u0196\x03\x02\x02\x02\u0198\u0199\x03\x02\x02\x02\u01995" + - "\x03\x02\x02\x02\u019A\u019B\t\x05\x02\x02\u019B7\x03\x02\x02\x02\u019C" + - "\u019D\t\x04\x02\x02\u019D9\x03\x02\x02\x02\u019E\u01A2\x05> \x02\u019F" + - "\u01A2\x05n8\x02\u01A0\u01A2\x05h5\x02\u01A1\u019E\x03\x02\x02\x02\u01A1" + - "\u019F\x03\x02\x02\x02\u01A1\u01A0\x03\x02\x02\x02\u01A2;\x03\x02\x02" + - "\x02\u01A3\u01AC\x05> \x02\u01A4\u01AC\x05n8\x02\u01A5\u01AC\x05h5\x02" + - "\u01A6\u01AC\x05 \x11\x02\u01A7\u01A8\x05h5\x02\u01A8\u01A9\x07\x1F\x02" + - "\x02\u01A9\u01AC\x03\x02\x02\x02\u01AA\u01AC\x05\x1A\x0E\x02\u01AB\u01A3" + - "\x03\x02\x02\x02\u01AB\u01A4\x03\x02\x02\x02\u01AB\u01A5\x03\x02\x02\x02" + - "\u01AB\u01A6\x03\x02\x02\x02\u01AB\u01A7\x03\x02\x02\x02\u01AB\u01AA\x03" + - "\x02\x02\x02\u01AC=\x03\x02\x02\x02\u01AD\u01B2\x05B\"\x02\u01AE\u01AF" + - "\x07#\x02\x02\u01AF\u01B1\x05B\"\x02\u01B0\u01AE\x03\x02\x02\x02\u01B1" + - "\u01B4\x03\x02\x02\x02\u01B2\u01B0\x03\x02\x02\x02\u01B2\u01B3\x03\x02" + - "\x02\x02\u01B3?\x03\x02\x02\x02\u01B4\u01B2\x03\x02\x02\x02\u01B5\u01BA" + - "\x05> \x02\u01B6\u01B7\x07\"\x02\x02\u01B7\u01B9\x05> \x02\u01B8\u01B6" + - "\x03\x02\x02\x02\u01B9\u01BC\x03\x02\x02\x02\u01BA\u01B8\x03\x02\x02\x02" + - "\u01BA\u01BB\x03\x02\x02\x02\u01BBA\x03\x02\x02\x02\u01BC\u01BA\x03\x02" + - "\x02\x02\u01BD\u01BE\t\x06\x02\x02\u01BEC\x03\x02\x02\x02\u01BF\u01C0" + - "\x07>\x02\x02\u01C0E\x03\x02\x02\x02\u01C1\u01C2\x07?\x02\x02\u01C2G\x03" + - "\x02\x02\x02\u01C3\u01E9\x07-\x02\x02\u01C4\u01E9\x05J&\x02\u01C5\u01E9" + - "\x05f4\x02\u01C6\u01E9\x05n8\x02\u01C7\u01C8\x07%\x02\x02\u01C8\u01CD" + - "\x05J&\x02\u01C9\u01CA\x07\"\x02\x02\u01CA\u01CC\x05J&\x02\u01CB\u01C9" + - "\x03\x02\x02\x02\u01CC\u01CF\x03\x02\x02\x02\u01CD\u01CB\x03\x02\x02\x02" + - "\u01CD\u01CE\x03\x02\x02\x02\u01CE\u01D0\x03\x02\x02\x02\u01CF\u01CD\x03" + - "\x02\x02\x02\u01D0\u01D1\x07&\x02\x02\u01D1\u01E9\x03\x02\x02\x02\u01D2" + - "\u01D3\x07%\x02\x02\u01D3\u01D8\x05f4\x02\u01D4\u01D5\x07\"\x02\x02\u01D5" + - "\u01D7\x05f4\x02\u01D6\u01D4\x03\x02\x02\x02\u01D7\u01DA\x03\x02\x02\x02" + - "\u01D8\u01D6\x03\x02\x02\x02\u01D8\u01D9\x03\x02\x02\x02\u01D9\u01DB\x03" + - "\x02\x02\x02\u01DA\u01D8\x03\x02\x02\x02\u01DB\u01DC\x07&\x02\x02\u01DC" + - "\u01E9\x03\x02\x02\x02\u01DD\u01DE\x07%\x02\x02\u01DE\u01E3\x05n8\x02" + - "\u01DF\u01E0\x07\"\x02\x02\u01E0\u01E2\x05n8\x02\u01E1\u01DF\x03\x02\x02" + - "\x02\u01E2\u01E5\x03\x02\x02\x02\u01E3\u01E1\x03\x02\x02\x02\u01E3\u01E4" + - "\x03\x02\x02\x02\u01E4\u01E6\x03\x02\x02\x02\u01E5\u01E3\x03\x02\x02\x02" + - "\u01E6\u01E7\x07&\x02\x02\u01E7\u01E9\x03\x02\x02\x02\u01E8\u01C3\x03" + - "\x02\x02\x02\u01E8\u01C4\x03\x02\x02\x02\u01E8\u01C5\x03\x02\x02\x02\u01E8" + - "\u01C6\x03\x02\x02\x02\u01E8\u01C7\x03\x02\x02\x02\u01E8\u01D2\x03\x02" + - "\x02\x02\u01E8\u01DD\x03\x02\x02\x02\u01E9I\x03\x02\x02\x02\u01EA\u01ED" + - "\x05j6\x02\u01EB\u01ED\x05l7\x02\u01EC\u01EA\x03\x02\x02\x02\u01EC\u01EB" + - "\x03\x02\x02\x02\u01EDK\x03\x02\x02\x02\u01EE\u01EF\x07\r\x02\x02\u01EF" + - "\u01F0\x07\x1C\x02\x02\u01F0M\x03\x02\x02\x02\u01F1\u01F2\x07\v\x02\x02" + - "\u01F2\u01F7\x05P)\x02\u01F3\u01F4\x07\"\x02\x02\u01F4\u01F6\x05P)\x02" + - "\u01F5\u01F3\x03\x02\x02\x02\u01F6\u01F9\x03\x02\x02\x02\u01F7\u01F5\x03" + - "\x02\x02\x02\u01F7\u01F8\x03\x02\x02\x02\u01F8O\x03\x02\x02\x02\u01F9" + - "\u01F7\x03\x02\x02\x02\u01FA\u01FC\x05\x14\v\x02\u01FB\u01FD\x07;\x02" + - "\x02\u01FC\u01FB\x03\x02\x02\x02\u01FC\u01FD\x03\x02\x02\x02\u01FD\u0200" + - "\x03\x02\x02\x02\u01FE\u01FF\x07<\x02\x02\u01FF\u0201\x07=\x02\x02\u0200" + - "\u01FE\x03\x02\x02\x02\u0200\u0201\x03\x02\x02\x02\u0201Q\x03\x02\x02" + - "\x02\u0202\u0203\x07\x0E\x02\x02\u0203\u0204\x05@!\x02\u0204S\x03\x02" + - "\x02\x02\u0205\u0206\x07\x13\x02\x02\u0206\u0207\x05@!\x02\u0207U\x03" + - "\x02\x02\x02\u0208\u0209\x07\x0F\x02\x02\u0209\u020A\x05@!\x02\u020AW" + - "\x03\x02\x02\x02\u020B\u0210\x05B\"\x02\u020C\u020D\x07#\x02\x02\u020D" + - "\u020F\x05B\"\x02\u020E\u020C\x03\x02\x02\x02\u020F\u0212\x03\x02\x02" + - "\x02\u0210\u020E\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211Y\x03" + - "\x02\x02\x02\u0212\u0210\x03\x02\x02\x02\u0213\u0214\x07\x10\x02\x02\u0214" + - "\u0219\x05\\/\x02\u0215\u0216\x07\"\x02\x02\u0216\u0218\x05\\/\x02\u0217" + - "\u0215\x03\x02\x02\x02\u0218\u021B\x03\x02\x02\x02\u0219\u0217\x03\x02" + - "\x02\x02\u0219\u021A\x03\x02\x02\x02\u021A[\x03\x02\x02\x02\u021B\u0219" + - "\x03\x02\x02\x02\u021C\u021D\x05> \x02\u021D\u021E\x07,\x02\x02\u021E" + - "\u021F\x05X-\x02\u021F]\x03\x02\x02\x02\u0220\u0221\x07\x03\x02\x02\u0221" + - "\u0222\x05@!\x02\u0222\u0224\x05n8\x02\u0223\u0225\x05b2\x02\u0224\u0223" + - "\x03\x02\x02\x02\u0224\u0225\x03\x02\x02\x02\u0225_\x03\x02\x02\x02\u0226" + - "\u0227\x07\x04\x02\x02\u0227\u0228\x05@!\x02\u0228\u0229\x05n8\x02\u0229" + - "a\x03\x02\x02\x02\u022A\u022F\x05d3\x02\u022B\u022C\x07\"\x02\x02\u022C" + - "\u022E\x05d3\x02\u022D\u022B\x03\x02\x02\x02\u022E\u0231\x03\x02\x02\x02" + - "\u022F\u022D\x03\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230c\x03\x02" + - "\x02\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0233\x05B\"\x02\u0233\u0234" + - "\x07!\x02\x02\u0234\u0235\x05H%\x02\u0235e\x03\x02\x02\x02\u0236\u0237" + - "\x073\x02\x02\u0237g\x03\x02\x02\x02\u0238\u023B\x07\x1D\x02\x02\u0239" + - "\u023B\x07\x1C\x02"; + "\t4\x045\t5\x046\t6\x047\t7\x048\t8\x049\t9\x04:\t:\x04;\t;\x04<\t<\x04" + + "=\t=\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + + "\x03\x07\x03\x84\n\x03\f\x03\x0E\x03\x87\v\x03\x03\x04\x03\x04\x03\x04" + + "\x03\x04\x05\x04\x8D\n\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x9C" + + "\n\x05\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xA2\n\x06\x03\x06\x03\x06" + + "\x03\x06\x03\x06\x07\x06\xA8\n\x06\f\x06\x0E\x06\xAB\v\x06\x05\x06\xAD" + + "\n\x06\x03\x07\x03\x07\x03\x07\x05\x07\xB2\n\x07\x03\x07\x03\x07\x03\b" + + "\x03\b\x03\b\x03\t\x03\t\x03\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03" + + "\n\x05\n\xC3\n\n\x03\n\x03\n\x03\n\x03\n\x03\n\x07\n\xCA\n\n\f\n\x0E\n" + + "\xCD\v\n\x03\n\x03\n\x03\n\x05\n\xD2\n\n\x03\n\x03\n\x03\n\x03\n\x03\n" + + "\x07\n\xD9\n\n\f\n\x0E\n\xDC\v\n\x05\n\xDE\n\n\x03\n\x03\n\x03\n\x03\n" + + "\x03\n\x05\n\xE5\n\n\x03\n\x03\n\x05\n\xE9\n\n\x03\n\x03\n\x03\n\x03\n" + + "\x03\n\x03\n\x07\n\xF1\n\n\f\n\x0E\n\xF4\v\n\x03\v\x03\v\x03\v\x03\v\x05" + + "\v\xFA\n\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x07\v\u0102\n\v\f\v\x0E" + + "\v\u0105\v\v\x03\f\x03\f\x05\f\u0109\n\f\x03\f\x03\f\x03\f\x03\f\x03\f" + + "\x05\f\u0110\n\f\x03\f\x03\f\x03\f\x05\f\u0115\n\f\x03\r\x03\r\x05\r\u0119" + + "\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x07\x0F\u0124\n\x0F\f\x0F\x0E\x0F\u0127\v\x0F\x05\x0F\u0129\n\x0F" + + "\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x07\x10\u0132" + + "\n\x10\f\x10\x0E\x10\u0135\v\x10\x05\x10\u0137\n\x10\x03\x10\x03\x10\x03" + + "\x11\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x05" + + "\x12\u0144\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12" + + "\u014C\n\x12\f\x12\x0E\x12\u014F\v\x12\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13" + + "\u015D\n\x13\f\x13\x0E\x13\u0160\v\x13\x05\x13\u0162\n\x13\x03\x13\x03" + + "\x13\x05\x13\u0166\n\x13\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15" + + "\x07\x15\u016E\n\x15\f\x15\x0E\x15\u0171\v\x15\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x05\x16\u0178\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03" + + "\x19\x03\x19\x03\x19\x03\x19\x07\x19\u0182\n\x19\f\x19\x0E\x19\u0185\v" + + "\x19\x03\x19\x05\x19\u0188\n\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A" + + "\x07\x1A\u018F\n\x1A\f\x1A\x0E\x1A\u0192\v\x1A\x03\x1A\x03\x1A\x03\x1B" + + "\x03\x1B\x03\x1B\x03\x1C\x03\x1C\x05\x1C\u019B\n\x1C\x03\x1C\x03\x1C\x05" + + "\x1C\u019F\n\x1C\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F" + + "\x05\x1F\u01A8\n\x1F\x03 \x03 \x03 \x03 \x03 \x03 \x05 \u01B0\n \x03!" + + "\x03!\x03!\x07!\u01B5\n!\f!\x0E!\u01B8\v!\x03\"\x03\"\x03\"\x07\"\u01BD" + + "\n\"\f\"\x0E\"\u01C0\v\"\x03#\x03#\x03$\x03$\x03%\x03%\x03&\x03&\x03&" + + "\x03&\x03&\x03&\x03&\x03&\x07&\u01D0\n&\f&\x0E&\u01D3\v&\x03&\x03&\x03" + + "&\x03&\x03&\x03&\x07&\u01DB\n&\f&\x0E&\u01DE\v&\x03&\x03&\x03&\x03&\x03" + + "&\x03&\x07&\u01E6\n&\f&\x0E&\u01E9\v&\x03&\x03&\x05&\u01ED\n&\x03\'\x03" + + "\'\x05\'\u01F1\n\'\x03(\x03(\x03(\x03)\x03)\x03)\x03)\x07)\u01FA\n)\f" + + ")\x0E)\u01FD\v)\x03*\x03*\x05*\u0201\n*\x03*\x03*\x05*\u0205\n*\x03+\x03" + + "+\x03+\x03,\x03,\x03,\x03-\x03-\x03-\x03.\x03.\x03.\x07.\u0213\n.\f.\x0E" + + ".\u0216\v.\x03/\x03/\x03/\x03/\x07/\u021C\n/\f/\x0E/\u021F\v/\x030\x03" + + "0\x030\x030\x031\x031\x031\x031\x051\u0229\n1\x032\x032\x032\x032\x03" + + "3\x033\x033\x073\u0232\n3\f3\x0E3\u0235\v3\x034\x034\x034\x034\x035\x03" + + "5\x036\x036\x056\u023F\n6\x037\x037\x038\x038\x039\x039\x03:\x03:\x03" + + ";\x03;\x03;\x03<\x03<\x03<\x03<\x03=\x03=\x03=\x03=\x05=\u0254\n=\x03" + + "=\x02\x02\x06\x04\x12\x14\">\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02" + + "\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02" + + " \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02" + + "<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02V\x02" + + "X\x02Z\x02\\\x02^\x02`\x02b\x02d\x02f\x02h\x02j\x02l\x02n\x02p\x02r\x02" + + "t\x02v\x02x\x02\x02\x07\x03\x0256\x03\x0279\x03\x02NO\x03\x02GH\x04\x02" + + "77AB\x02\u0273\x02z\x03\x02\x02\x02\x04}\x03\x02\x02\x02\x06\x8C\x03\x02" + + "\x02\x02\b\x9B\x03\x02\x02\x02\n\x9D\x03\x02\x02\x02\f\xB1\x03\x02\x02" + + "\x02\x0E\xB5\x03\x02\x02\x02\x10\xB8\x03\x02\x02\x02\x12\xE8\x03\x02\x02" + + "\x02\x14\xF9\x03\x02\x02\x02\x16\u0114\x03\x02\x02\x02\x18\u0118\x03\x02" + + "\x02\x02\x1A\u011A\x03\x02\x02\x02\x1C\u011E\x03\x02\x02\x02\x1E\u012C" + + "\x03\x02\x02\x02 \u013A\x03\x02\x02\x02\"\u0143\x03\x02\x02\x02$\u0165" + + "\x03\x02\x02\x02&\u0167\x03\x02\x02\x02(\u016A\x03\x02\x02\x02*\u0177" + + "\x03\x02\x02\x02,\u0179\x03\x02\x02\x02.\u017B\x03\x02\x02\x020\u017D" + + "\x03\x02\x02\x022\u0189\x03\x02\x02\x024\u0195\x03\x02\x02\x026\u0198" + + "\x03\x02\x02\x028\u01A0\x03\x02\x02\x02:\u01A2\x03\x02\x02\x02<\u01A7" + + "\x03\x02\x02\x02>\u01AF\x03\x02\x02\x02@\u01B1\x03\x02\x02\x02B\u01B9" + + "\x03\x02\x02\x02D\u01C1\x03\x02\x02\x02F\u01C3\x03\x02\x02\x02H\u01C5" + + "\x03\x02\x02\x02J\u01EC\x03\x02\x02\x02L\u01F0\x03\x02\x02\x02N\u01F2" + + "\x03\x02\x02\x02P\u01F5\x03\x02\x02\x02R\u01FE\x03\x02\x02\x02T\u0206" + + "\x03\x02\x02\x02V\u0209\x03\x02\x02\x02X\u020C\x03\x02\x02\x02Z\u020F" + + "\x03\x02\x02\x02\\\u0217\x03\x02\x02\x02^\u0220\x03\x02\x02\x02`\u0224" + + "\x03\x02\x02\x02b\u022A\x03\x02\x02\x02d\u022E\x03\x02\x02\x02f\u0236" + + "\x03\x02\x02\x02h\u023A\x03\x02\x02\x02j\u023E\x03\x02\x02\x02l\u0240" + + "\x03\x02\x02\x02n\u0242\x03\x02\x02\x02p\u0244\x03\x02\x02\x02r\u0246" + + "\x03\x02\x02\x02t\u0248\x03\x02\x02\x02v\u024B\x03\x02\x02\x02x\u0253" + + "\x03\x02\x02\x02z{\x05\x04\x03\x02{|\x07\x02\x02\x03|\x03\x03\x02\x02" + + "\x02}~\b\x03\x01\x02~\x7F\x05\x06\x04\x02\x7F\x85\x03\x02\x02\x02\x80" + + "\x81\f\x03\x02\x02\x81\x82\x07\x1A\x02\x02\x82\x84\x05\b\x05\x02\x83\x80" + + "\x03\x02\x02\x02\x84\x87\x03\x02\x02\x02\x85\x83\x03\x02\x02\x02\x85\x86" + + "\x03\x02\x02\x02\x86\x05\x03\x02\x02\x02\x87\x85\x03\x02\x02\x02\x88\x8D" + + "\x05t;\x02\x89\x8D\x050\x19\x02\x8A\x8D\x05&\x14\x02\x8B\x8D\x05x=\x02" + + "\x8C\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02\x02\x8C\x8A\x03\x02\x02\x02" + + "\x8C\x8B\x03\x02\x02\x02\x8D\x07\x03\x02\x02\x02\x8E\x9C\x054\x1B\x02" + + "\x8F\x9C\x05N(\x02\x90\x9C\x05T+\x02\x91\x9C\x05V,\x02\x92\x9C\x05\\/" + + "\x02\x93\x9C\x05X-\x02\x94\x9C\x05`1\x02\x95\x9C\x05b2\x02\x96\x9C\x05" + + "P)\x02\x97\x9C\x056\x1C\x02\x98\x9C\x05\x10\t\x02\x99\x9C\x05\x0E\b\x02" + + "\x9A\x9C\x05\n\x06\x02\x9B\x8E\x03\x02\x02\x02\x9B\x8F\x03\x02\x02\x02" + + "\x9B\x90\x03\x02\x02\x02\x9B\x91\x03\x02\x02\x02\x9B\x92\x03\x02\x02\x02" + + "\x9B\x93\x03\x02\x02\x02\x9B\x94\x03\x02\x02\x02\x9B\x95\x03\x02\x02\x02" + + "\x9B\x96\x03\x02\x02\x02\x9B\x97\x03\x02\x02\x02\x9B\x98\x03\x02\x02\x02" + + "\x9B\x99\x03\x02\x02\x02\x9B\x9A\x03\x02\x02\x02\x9C\t\x03\x02\x02\x02" + + "\x9D\x9E\x07\x12\x02\x02\x9E\xA1\x05:\x1E\x02\x9F\xA0\x07L\x02\x02\xA0" + + "\xA2\x05,\x17\x02\xA1\x9F\x03\x02\x02\x02\xA1\xA2\x03\x02\x02\x02\xA2" + + "\xAC\x03\x02\x02\x02\xA3\xA4\x07M\x02\x02\xA4\xA9\x05\f\x07\x02\xA5\xA6" + + "\x07\"\x02\x02\xA6\xA8\x05\f\x07\x02\xA7\xA5\x03\x02\x02\x02\xA8\xAB\x03" + + "\x02\x02\x02\xA9\xA7\x03\x02\x02\x02\xA9\xAA\x03\x02\x02\x02\xAA\xAD\x03" + + "\x02\x02\x02\xAB\xA9\x03\x02\x02\x02\xAC\xA3\x03\x02\x02\x02\xAC\xAD\x03" + + "\x02\x02\x02\xAD\v\x03\x02\x02\x02\xAE\xAF\x05,\x17\x02\xAF\xB0\x07!\x02" + + "\x02\xB0\xB2\x03\x02\x02\x02\xB1\xAE\x03\x02\x02\x02\xB1\xB2\x03\x02\x02" + + "\x02\xB2\xB3\x03\x02\x02\x02\xB3\xB4\x05,\x17\x02\xB4\r\x03\x02\x02\x02" + + "\xB5\xB6\x07\f\x02\x02\xB6\xB7\x05B\"\x02\xB7\x0F\x03\x02\x02\x02\xB8" + + "\xB9\x07\n\x02\x02\xB9\xBA\x05\x12\n\x02\xBA\x11\x03\x02\x02\x02\xBB\xBC" + + "\b\n\x01\x02\xBC\xBD\x07\'\x02\x02\xBD\xE9\x05\x12\n\n\xBE\xE9\x05\x18" + + "\r\x02\xBF\xE9\x05\x16\f\x02\xC0\xC2\x05\x18\r\x02\xC1\xC3\x07\'\x02\x02" + + "\xC2\xC1\x03\x02\x02\x02\xC2\xC3\x03\x02\x02\x02\xC3\xC4\x03\x02\x02\x02" + + "\xC4\xC5\x07*\x02\x02\xC5\xC6\x07$\x02\x02\xC6\xCB\x05\x18\r\x02\xC7\xC8" + + "\x07\"\x02\x02\xC8\xCA\x05\x18\r\x02\xC9\xC7\x03\x02\x02\x02\xCA\xCD\x03" + + "\x02\x02\x02\xCB\xC9\x03\x02\x02\x02\xCB\xCC\x03\x02\x02\x02\xCC\xCE\x03" + + "\x02\x02\x02\xCD\xCB\x03\x02\x02\x02\xCE\xCF\x07/\x02\x02\xCF\xE9\x03" + + "\x02\x02\x02\xD0\xD2\x07\'\x02\x02\xD1\xD0\x03\x02\x02\x02\xD1\xD2\x03" + + "\x02\x02\x02\xD2\xD3\x03\x02\x02\x02\xD3\xD4\x07@\x02\x02\xD4\xD5\x07" + + "$\x02\x02\xD5\xDD\x05@!\x02\xD6\xD7\x07\"\x02\x02\xD7\xD9\x05<\x1F\x02" + + "\xD8\xD6\x03\x02\x02\x02\xD9\xDC\x03\x02\x02\x02\xDA\xD8\x03\x02\x02\x02" + + "\xDA\xDB\x03\x02\x02\x02\xDB\xDE\x03\x02\x02\x02\xDC\xDA\x03\x02\x02\x02" + + "\xDD\xDA\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02\xDE\xDF\x03\x02\x02\x02" + + "\xDF\xE0\x07/\x02\x02\xE0\xE9\x03\x02\x02\x02\xE1\xE2\x05\x18\r\x02\xE2" + + "\xE4\x07+\x02\x02\xE3\xE5\x07\'\x02\x02\xE4\xE3\x03\x02\x02\x02\xE4\xE5" + + "\x03\x02\x02\x02\xE5\xE6\x03\x02\x02\x02\xE6\xE7\x07-\x02\x02\xE7\xE9" + + "\x03\x02\x02\x02\xE8\xBB\x03\x02\x02\x02\xE8\xBE\x03\x02\x02\x02\xE8\xBF" + + "\x03\x02\x02\x02\xE8\xC0\x03\x02\x02\x02\xE8\xD1\x03\x02\x02\x02\xE8\xE1" + + "\x03\x02\x02\x02\xE9\xF2\x03\x02\x02\x02\xEA\xEB\f\x07\x02\x02\xEB\xEC" + + "\x07 \x02\x02\xEC\xF1\x05\x12\n\b\xED\xEE\f\x06\x02\x02\xEE\xEF\x07.\x02" + + "\x02\xEF\xF1\x05\x12\n\x07\xF0\xEA\x03\x02\x02\x02\xF0\xED\x03\x02\x02" + + "\x02\xF1\xF4\x03\x02\x02\x02\xF2\xF0\x03\x02\x02\x02\xF2\xF3\x03\x02\x02" + + "\x02\xF3\x13\x03\x02\x02\x02\xF4\xF2\x03\x02\x02\x02\xF5\xF6\b\v\x01\x02" + + "\xF6\xF7\x07\'\x02\x02\xF7\xFA\x05\x14\v\x06\xF8\xFA\x05\x18\r\x02\xF9" + + "\xF5\x03\x02\x02\x02\xF9\xF8\x03\x02\x02\x02\xFA\u0103\x03\x02\x02\x02" + + "\xFB\xFC\f\x04\x02\x02\xFC\xFD\x07 \x02\x02\xFD\u0102\x05\x14\v\x05\xFE" + + "\xFF\f\x03\x02\x02\xFF\u0100\x07.\x02\x02\u0100\u0102\x05\x14\v\x04\u0101" + + "\xFB\x03\x02\x02\x02\u0101\xFE\x03\x02\x02\x02\u0102\u0105\x03\x02\x02" + + "\x02\u0103\u0101\x03\x02\x02\x02\u0103\u0104\x03\x02\x02\x02\u0104\x15" + + "\x03\x02\x02\x02\u0105\u0103\x03\x02\x02\x02\u0106\u0108\x05\x18\r\x02" + + "\u0107\u0109\x07\'\x02\x02\u0108\u0107\x03\x02\x02\x02\u0108\u0109\x03" + + "\x02\x02\x02\u0109\u010A\x03\x02\x02\x02\u010A\u010B\x07(\x02\x02\u010B" + + "\u010C\x05p9\x02\u010C\u0115\x03\x02\x02\x02\u010D\u010F\x05\x18\r\x02" + + "\u010E\u0110\x07\'\x02\x02\u010F\u010E\x03\x02\x02\x02\u010F\u0110\x03" + + "\x02\x02\x02\u0110\u0111\x03\x02\x02\x02\u0111\u0112\x07)\x02\x02\u0112" + + "\u0113\x05p9\x02\u0113\u0115\x03\x02\x02\x02\u0114\u0106\x03\x02\x02\x02" + + "\u0114\u010D\x03\x02\x02\x02\u0115\x17\x03\x02\x02\x02\u0116\u0119\x05" + + "\"\x12\x02\u0117\u0119\x05\x1A\x0E\x02\u0118\u0116\x03\x02\x02\x02\u0118" + + "\u0117\x03\x02\x02\x02\u0119\x19\x03\x02\x02\x02\u011A\u011B\x05\"\x12" + + "\x02\u011B\u011C\x05r:\x02\u011C\u011D\x05\"\x12\x02\u011D\x1B\x03\x02" + + "\x02\x02\u011E\u011F\x05H%\x02\u011F\u0128\x07$\x02\x02\u0120\u0125\x05" + + "<\x1F\x02\u0121\u0122\x07\"\x02\x02\u0122\u0124\x05<\x1F\x02\u0123\u0121" + + "\x03\x02\x02\x02\u0124\u0127\x03\x02\x02\x02\u0125\u0123\x03\x02\x02\x02" + + "\u0125\u0126\x03\x02\x02\x02\u0126\u0129\x03\x02\x02\x02\u0127\u0125\x03" + + "\x02\x02\x02\u0128\u0120\x03\x02\x02\x02\u0128\u0129\x03\x02\x02\x02\u0129" + + "\u012A\x03\x02\x02\x02\u012A\u012B\x07/\x02\x02\u012B\x1D\x03\x02\x02" + + "\x02\u012C\u012D\x05F$\x02\u012D\u0136\x07$\x02\x02\u012E\u0133\x05> " + + "\x02\u012F\u0130\x07\"\x02\x02\u0130\u0132\x05> \x02\u0131\u012F\x03\x02" + + "\x02\x02\u0132\u0135\x03\x02\x02\x02\u0133\u0131\x03\x02\x02\x02\u0133" + + "\u0134\x03\x02\x02\x02\u0134\u0137\x03\x02\x02\x02\u0135\u0133\x03\x02" + + "\x02\x02\u0136\u012E\x03\x02\x02\x02\u0136\u0137\x03\x02\x02\x02\u0137" + + "\u0138\x03\x02\x02\x02\u0138\u0139\x07/\x02\x02\u0139\x1F\x03\x02\x02" + + "\x02\u013A\u013B\x05j6\x02\u013B\u013C\x07\x1F\x02\x02\u013C!\x03\x02" + + "\x02\x02\u013D\u013E\b\x12\x01\x02\u013E\u0144\x05$\x13\x02\u013F\u0144" + + "\x05\x1C\x0F\x02\u0140\u0144\x05\x1E\x10\x02\u0141\u0142\t\x02\x02\x02" + + "\u0142\u0144\x05\"\x12\x05\u0143\u013D\x03\x02\x02\x02\u0143\u013F\x03" + + "\x02\x02\x02\u0143\u0140\x03\x02\x02\x02\u0143\u0141\x03\x02\x02\x02\u0144" + + "\u014D\x03\x02\x02\x02\u0145\u0146\f\x04\x02\x02\u0146\u0147\t\x03\x02" + + "\x02\u0147\u014C\x05\"\x12\x05\u0148\u0149\f\x03\x02\x02\u0149\u014A\t" + + "\x02\x02\x02\u014A\u014C\x05\"\x12\x04\u014B\u0145\x03\x02\x02\x02\u014B" + + "\u0148\x03\x02\x02\x02\u014C\u014F\x03\x02\x02\x02\u014D\u014B\x03\x02" + + "\x02\x02\u014D\u014E\x03\x02\x02\x02\u014E#\x03\x02\x02\x02\u014F\u014D" + + "\x03\x02\x02\x02\u0150\u0166\x05J&\x02\u0151\u0166\x05@!\x02\u0152\u0166" + + "\x05 \x11\x02\u0153\u0154\x07$\x02\x02\u0154\u0155\x05\x14\v\x02\u0155" + + "\u0156\x07/\x02\x02\u0156\u0166\x03\x02\x02\x02\u0157\u0158\x05D#\x02" + + "\u0158\u0161\x07$\x02\x02\u0159\u015E\x05\x14\v\x02\u015A\u015B\x07\"" + + "\x02\x02\u015B\u015D\x05\x14\v\x02\u015C\u015A\x03\x02\x02\x02\u015D\u0160" + + "\x03\x02\x02\x02\u015E\u015C\x03\x02\x02\x02\u015E\u015F\x03\x02\x02\x02" + + "\u015F\u0162\x03\x02\x02\x02\u0160\u015E\x03\x02\x02\x02\u0161\u0159\x03" + + "\x02\x02\x02\u0161\u0162\x03\x02\x02\x02\u0162\u0163\x03\x02\x02\x02\u0163" + + "\u0164\x07/\x02\x02\u0164\u0166\x03\x02\x02\x02\u0165\u0150\x03\x02\x02" + + "\x02\u0165\u0151\x03\x02\x02\x02\u0165\u0152\x03\x02\x02\x02\u0165\u0153" + + "\x03\x02\x02\x02\u0165\u0157\x03\x02\x02\x02\u0166%\x03\x02\x02\x02\u0167" + + "\u0168\x07\b\x02\x02\u0168\u0169\x05(\x15\x02\u0169\'\x03\x02\x02\x02" + + "\u016A\u016F\x05*\x16\x02\u016B\u016C\x07\"\x02\x02\u016C\u016E\x05*\x16" + + "\x02\u016D\u016B\x03\x02\x02\x02\u016E\u0171\x03\x02\x02\x02\u016F\u016D" + + "\x03\x02\x02\x02\u016F\u0170\x03\x02\x02\x02\u0170)\x03\x02\x02\x02\u0171" + + "\u016F\x03\x02\x02\x02\u0172\u0178\x05\x14\v\x02\u0173\u0174\x05.\x18" + + "\x02\u0174\u0175\x07!\x02\x02\u0175\u0176\x05\x14\v\x02\u0176\u0178\x03" + + "\x02\x02\x02\u0177\u0172\x03\x02\x02\x02\u0177\u0173\x03\x02\x02\x02\u0178" + + "+\x03\x02\x02\x02\u0179\u017A\t\x04\x02\x02\u017A-\x03\x02\x02\x02\u017B" + + "\u017C\x05D#\x02\u017C/\x03\x02\x02\x02\u017D\u017E\x07\x07\x02\x02\u017E" + + "\u0183\x058\x1D\x02\u017F\u0180\x07\"\x02\x02\u0180\u0182\x058\x1D\x02" + + "\u0181\u017F\x03\x02\x02\x02\u0182\u0185\x03\x02\x02\x02\u0183\u0181\x03" + + "\x02\x02\x02\u0183\u0184\x03\x02\x02\x02\u0184\u0187\x03\x02\x02\x02\u0185" + + "\u0183\x03\x02\x02\x02\u0186\u0188\x052\x1A\x02\u0187\u0186\x03\x02\x02" + + "\x02\u0187\u0188\x03\x02\x02\x02\u01881\x03\x02\x02\x02\u0189\u018A\x07" + + "%\x02\x02\u018A\u018B\x07F\x02\x02\u018B\u0190\x058\x1D\x02\u018C\u018D" + + "\x07\"\x02\x02\u018D\u018F\x058\x1D\x02\u018E\u018C\x03\x02\x02\x02\u018F" + + "\u0192\x03\x02\x02\x02\u0190\u018E\x03\x02\x02\x02\u0190\u0191\x03\x02" + + "\x02\x02\u0191\u0193\x03\x02\x02\x02\u0192\u0190\x03\x02\x02\x02\u0193" + + "\u0194\x07&\x02\x02\u01943\x03\x02\x02\x02\u0195\u0196\x07\x05\x02\x02" + + "\u0196\u0197\x05(\x15\x02\u01975\x03\x02\x02\x02\u0198\u019A\x07\t\x02" + + "\x02\u0199\u019B\x05(\x15\x02\u019A\u0199\x03\x02\x02\x02\u019A\u019B" + + "\x03\x02\x02\x02\u019B\u019E\x03\x02\x02\x02\u019C\u019D\x07\x1E\x02\x02" + + "\u019D\u019F\x05B\"\x02\u019E\u019C\x03\x02\x02\x02\u019E\u019F\x03\x02" + + "\x02\x02\u019F7\x03\x02\x02\x02\u01A0\u01A1\t\x05\x02\x02\u01A19\x03\x02" + + "\x02\x02\u01A2\u01A3\t\x04\x02\x02\u01A3;\x03\x02\x02\x02\u01A4\u01A8" + + "\x05@!\x02\u01A5\u01A8\x05p9\x02\u01A6\u01A8\x05j6\x02\u01A7\u01A4\x03" + + "\x02\x02\x02\u01A7\u01A5\x03\x02\x02\x02\u01A7\u01A6\x03\x02\x02\x02\u01A8" + + "=\x03\x02\x02\x02\u01A9\u01B0\x05@!\x02\u01AA\u01B0\x05p9\x02\u01AB\u01B0" + + "\x05j6\x02\u01AC\u01B0\x05\"\x12\x02\u01AD\u01B0\x05 \x11\x02\u01AE\u01B0" + + "\x05\x1A\x0E\x02\u01AF\u01A9\x03\x02\x02\x02\u01AF\u01AA\x03\x02\x02\x02" + + "\u01AF\u01AB\x03\x02\x02\x02\u01AF\u01AC\x03\x02\x02\x02\u01AF\u01AD\x03" + + "\x02\x02\x02\u01AF\u01AE\x03\x02\x02\x02\u01B0?\x03\x02\x02\x02\u01B1" + + "\u01B6\x05D#\x02\u01B2\u01B3\x07#\x02\x02\u01B3\u01B5\x05D#\x02\u01B4" + + "\u01B2\x03\x02\x02\x02\u01B5\u01B8\x03\x02\x02\x02\u01B6\u01B4\x03\x02" + + "\x02\x02\u01B6\u01B7\x03\x02\x02\x02\u01B7A\x03\x02\x02\x02\u01B8\u01B6" + + "\x03\x02\x02\x02\u01B9\u01BE\x05@!\x02\u01BA\u01BB\x07\"\x02\x02\u01BB" + + "\u01BD\x05@!\x02\u01BC\u01BA\x03\x02\x02\x02\u01BD\u01C0\x03\x02\x02\x02" + + "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BFC\x03\x02" + + "\x02\x02\u01C0\u01BE\x03\x02\x02\x02\u01C1\u01C2\t\x06\x02\x02\u01C2E" + + "\x03\x02\x02\x02\u01C3\u01C4\x07>\x02\x02\u01C4G\x03\x02\x02\x02\u01C5" + + "\u01C6\x07?\x02\x02\u01C6I\x03\x02\x02\x02\u01C7\u01ED\x07-\x02\x02\u01C8" + + "\u01ED\x05L\'\x02\u01C9\u01ED\x05h5\x02\u01CA\u01ED\x05p9\x02\u01CB\u01CC" + + "\x07%\x02\x02\u01CC\u01D1\x05L\'\x02\u01CD\u01CE\x07\"\x02\x02\u01CE\u01D0" + + "\x05L\'\x02\u01CF\u01CD\x03\x02\x02\x02\u01D0\u01D3\x03\x02\x02\x02\u01D1" + + "\u01CF\x03\x02\x02\x02\u01D1\u01D2\x03\x02\x02\x02\u01D2\u01D4\x03\x02" + + "\x02\x02\u01D3\u01D1\x03\x02\x02\x02\u01D4\u01D5\x07&\x02\x02\u01D5\u01ED" + + "\x03\x02\x02\x02\u01D6\u01D7\x07%\x02\x02\u01D7\u01DC\x05h5\x02\u01D8" + + "\u01D9\x07\"\x02\x02\u01D9\u01DB\x05h5\x02\u01DA\u01D8\x03\x02\x02\x02" + + "\u01DB\u01DE\x03\x02\x02\x02\u01DC\u01DA\x03\x02\x02\x02\u01DC\u01DD\x03" + + "\x02\x02\x02\u01DD\u01DF\x03\x02\x02\x02\u01DE\u01DC\x03\x02\x02\x02\u01DF" + + "\u01E0\x07&\x02\x02\u01E0\u01ED\x03\x02\x02\x02\u01E1\u01E2\x07%\x02\x02" + + "\u01E2\u01E7\x05p9\x02\u01E3\u01E4\x07\"\x02\x02\u01E4\u01E6\x05p9\x02" + + "\u01E5\u01E3\x03\x02\x02\x02\u01E6\u01E9\x03\x02\x02\x02\u01E7\u01E5\x03" + + "\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8\u01EA\x03\x02\x02\x02\u01E9" + + "\u01E7\x03\x02\x02\x02\u01EA\u01EB\x07&\x02\x02\u01EB\u01ED\x03\x02\x02" + + "\x02\u01EC\u01C7\x03\x02\x02\x02\u01EC\u01C8\x03\x02\x02\x02\u01EC\u01C9" + + "\x03\x02\x02\x02\u01EC\u01CA\x03\x02\x02\x02\u01EC\u01CB\x03\x02\x02\x02" + + "\u01EC\u01D6\x03\x02\x02\x02\u01EC\u01E1\x03\x02\x02\x02\u01EDK\x03\x02" + + "\x02\x02\u01EE\u01F1\x05l7\x02\u01EF\u01F1\x05n8\x02\u01F0\u01EE\x03\x02" + + "\x02\x02\u01F0\u01EF\x03\x02\x02\x02\u01F1M\x03\x02\x02\x02\u01F2\u01F3" + + "\x07\r\x02\x02\u01F3\u01F4\x07\x1C\x02\x02\u01F4O\x03\x02\x02\x02\u01F5" + + "\u01F6\x07\v\x02\x02\u01F6\u01FB\x05R*\x02\u01F7\u01F8\x07\"\x02\x02\u01F8" + + "\u01FA\x05R*\x02\u01F9\u01F7\x03\x02\x02\x02\u01FA\u01FD\x03\x02\x02\x02" + + "\u01FB\u01F9\x03\x02\x02\x02\u01FB\u01FC\x03\x02\x02\x02\u01FCQ\x03\x02" + + "\x02\x02\u01FD\u01FB\x03\x02\x02\x02\u01FE\u0200\x05\x14\v\x02\u01FF\u0201" + + "\x07;\x02\x02\u0200\u01FF\x03\x02\x02\x02\u0200\u0201\x03\x02\x02\x02" + + "\u0201\u0204\x03\x02\x02\x02\u0202\u0203\x07<\x02\x02\u0203\u0205\x07" + + "=\x02\x02\u0204\u0202\x03\x02\x02\x02\u0204\u0205\x03\x02\x02\x02\u0205" + + "S\x03\x02\x02\x02\u0206\u0207\x07\x0E\x02\x02\u0207\u0208\x05B\"\x02\u0208" + + "U\x03\x02\x02\x02\u0209\u020A\x07\x13\x02\x02\u020A\u020B\x05B\"\x02\u020B" + + "W\x03\x02\x02\x02\u020C\u020D\x07\x0F\x02\x02\u020D\u020E\x05B\"\x02\u020E" + + "Y\x03\x02\x02\x02\u020F\u0214\x05D#\x02\u0210\u0211\x07#\x02\x02\u0211" + + "\u0213\x05D#\x02\u0212\u0210\x03\x02\x02\x02\u0213\u0216\x03\x02\x02\x02" + + "\u0214\u0212\x03\x02\x02\x02\u0214\u0215\x03\x02\x02\x02\u0215[\x03\x02" + + "\x02\x02\u0216\u0214\x03\x02\x02\x02\u0217\u0218\x07\x10\x02\x02\u0218" + + "\u021D\x05^0\x02\u0219\u021A\x07\"\x02\x02\u021A\u021C\x05^0\x02\u021B" + + "\u0219\x03\x02\x02\x02\u021C\u021F\x03\x02\x02\x02\u021D\u021B\x03\x02" + + "\x02\x02\u021D\u021E\x03\x02\x02\x02\u021E]\x03\x02\x02\x02\u021F\u021D" + + "\x03\x02\x02\x02\u0220\u0221\x05@!\x02\u0221\u0222\x07,\x02\x02\u0222" + + "\u0223\x05Z.\x02\u0223_\x03\x02\x02\x02\u0224\u0225\x07\x03\x02\x02\u0225" + + "\u0226\x05B\"\x02\u0226\u0228\x05p9\x02\u0227\u0229\x05d3\x02\u0228\u0227" + + "\x03\x02\x02\x02\u0228\u0229\x03\x02\x02\x02\u0229a\x03\x02\x02\x02\u022A" + + "\u022B\x07\x04\x02\x02\u022B\u022C\x05B\"\x02\u022C\u022D\x05p9\x02\u022D" + + "c\x03\x02\x02\x02\u022E\u0233\x05f4\x02\u022F\u0230\x07\"\x02\x02\u0230" + + "\u0232\x05f4\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0235\x03\x02\x02\x02" + + "\u0233\u0231\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234e\x03\x02" + + "\x02\x02\u0235\u0233\x03\x02\x02\x02\u0236\u0237\x05D#\x02\u0237\u0238" + + "\x07!\x02\x02\u0238"; private static readonly _serializedATNSegment1: string = - "\x02\u023A\u0238\x03\x02\x02\x02\u023A\u0239\x03\x02\x02\x02\u023Bi\x03" + - "\x02\x02\x02\u023C\u023D\x07\x1D\x02\x02\u023Dk\x03\x02\x02\x02\u023E" + - "\u023F\x07\x1C\x02\x02\u023Fm\x03\x02\x02\x02\u0240\u0241\x07\x1B\x02" + - "\x02\u0241o\x03\x02\x02\x02\u0242\u0243\x074\x02\x02\u0243q\x03\x02\x02" + - "\x02\u0244\u0245\x07\x06\x02\x02\u0245\u0246\x05t;\x02\u0246s\x03\x02" + - "\x02\x02\u0247\u0248\x07%\x02\x02\u0248\u0249\x05\x04\x03\x02\u0249\u024A" + - "\x07&\x02\x02\u024Au\x03\x02\x02\x02\u024B\u024C\x07\x11\x02\x02\u024C" + - "\u0250\x071\x02\x02\u024D\u024E\x07\x11\x02\x02\u024E\u0250\x072\x02\x02" + - "\u024F\u024B\x03\x02\x02\x02\u024F\u024D\x03\x02\x02\x02\u0250w\x03\x02" + - "\x02\x02<\x83\x8A\x99\x9F\xA7\xAA\xAF\xC0\xC9\xCF\xD8\xDB\xE2\xE6\xEE" + - "\xF0\xF7\xFF\u0101\u0106\u010D\u0112\u0116\u0123\u0126\u0131\u0134\u013E" + - "\u0146\u0148\u0158\u015B\u015F\u0169\u0171\u017D\u0181\u018A\u0194\u0198" + - "\u01A1\u01AB\u01B2\u01BA\u01CD\u01D8\u01E3\u01E8\u01EC\u01F7\u01FC\u0200" + - "\u0210\u0219\u0224\u022F\u023A\u024F"; + "\u0239\x05J&\x02\u0239g\x03\x02\x02\x02\u023A\u023B\x073\x02\x02\u023B" + + "i\x03\x02\x02\x02\u023C\u023F\x07\x1D\x02\x02\u023D\u023F\x07\x1C\x02" + + "\x02\u023E\u023C\x03\x02\x02\x02\u023E\u023D\x03\x02\x02\x02\u023Fk\x03" + + "\x02\x02\x02\u0240\u0241\x07\x1D\x02\x02\u0241m\x03\x02\x02\x02\u0242" + + "\u0243\x07\x1C\x02\x02\u0243o\x03\x02\x02\x02\u0244\u0245\x07\x1B\x02" + + "\x02\u0245q\x03\x02\x02\x02\u0246\u0247\x074\x02\x02\u0247s\x03\x02\x02" + + "\x02\u0248\u0249\x07\x06\x02\x02\u0249\u024A\x05v<\x02\u024Au\x03\x02" + + "\x02\x02\u024B\u024C\x07%\x02\x02\u024C\u024D\x05\x04\x03\x02\u024D\u024E" + + "\x07&\x02\x02\u024Ew\x03\x02\x02\x02\u024F\u0250\x07\x11\x02\x02\u0250" + + "\u0254\x071\x02\x02\u0251\u0252\x07\x11\x02\x02\u0252\u0254\x072\x02\x02" + + "\u0253\u024F\x03\x02\x02\x02\u0253\u0251\x03\x02\x02\x02\u0254y\x03\x02" + + "\x02\x02<\x85\x8C\x9B\xA1\xA9\xAC\xB1\xC2\xCB\xD1\xDA\xDD\xE4\xE8\xF0" + + "\xF2\xF9\u0101\u0103\u0108\u010F\u0114\u0118\u0125\u0128\u0133\u0136\u0143" + + "\u014B\u014D\u015E\u0161\u0165\u016F\u0177\u0183\u0187\u0190\u019A\u019E" + + "\u01A7\u01AF\u01B6\u01BE\u01D1\u01DC\u01E7\u01EC\u01F0\u01FB\u0200\u0204" + + "\u0214\u021D\u0228\u0233\u023E\u0253"; public static readonly _serializedATN: string = Utils.join( [ esql_parser._serializedATNSegment0, @@ -4108,6 +4142,32 @@ export class MathEvalFnContext extends ParserRuleContext { } +export class DateExpressionContext extends ParserRuleContext { + public _quantifier: NumberContext; + public DATE_LITERAL(): TerminalNode { return this.getToken(esql_parser.DATE_LITERAL, 0); } + public number(): NumberContext { + return this.getRuleContext(0, NumberContext); + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return esql_parser.RULE_dateExpression; } + // @Override + public enterRule(listener: esql_parserListener): void { + if (listener.enterDateExpression) { + listener.enterDateExpression(this); + } + } + // @Override + public exitRule(listener: esql_parserListener): void { + if (listener.exitDateExpression) { + listener.exitDateExpression(this); + } + } +} + + export class OperatorExpressionContext extends ParserRuleContext { public _left: OperatorExpressionContext; public _operator: Token; @@ -4162,6 +4222,9 @@ export class PrimaryExpressionContext extends ParserRuleContext { public qualifiedName(): QualifiedNameContext | undefined { return this.tryGetRuleContext(0, QualifiedNameContext); } + public dateExpression(): DateExpressionContext | undefined { + return this.tryGetRuleContext(0, DateExpressionContext); + } public LP(): TerminalNode | undefined { return this.tryGetToken(esql_parser.LP, 0); } public booleanExpression(): BooleanExpressionContext[]; public booleanExpression(i: number): BooleanExpressionContext; @@ -4572,7 +4635,9 @@ export class MathFunctionExpressionArgumentContext extends ParserRuleContext { public operatorExpression(): OperatorExpressionContext | undefined { return this.tryGetRuleContext(0, OperatorExpressionContext); } - public DATE_LITERAL(): TerminalNode | undefined { return this.tryGetToken(esql_parser.DATE_LITERAL, 0); } + public dateExpression(): DateExpressionContext | undefined { + return this.tryGetRuleContext(0, DateExpressionContext); + } public comparison(): ComparisonContext | undefined { return this.tryGetRuleContext(0, ComparisonContext); } diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts b/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts index 99a91b0bd84a3..f131d4072b773 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser_listener.ts @@ -23,6 +23,7 @@ import { ValueExpressionContext } from "./esql_parser"; import { ComparisonContext } from "./esql_parser"; import { MathFnContext } from "./esql_parser"; import { MathEvalFnContext } from "./esql_parser"; +import { DateExpressionContext } from "./esql_parser"; import { OperatorExpressionContext } from "./esql_parser"; import { PrimaryExpressionContext } from "./esql_parser"; import { RowCommandContext } from "./esql_parser"; @@ -291,6 +292,17 @@ export interface esql_parserListener extends ParseTreeListener { */ exitMathEvalFn?: (ctx: MathEvalFnContext) => void; + /** + * Enter a parse tree produced by `esql_parser.dateExpression`. + * @param ctx the parse tree + */ + enterDateExpression?: (ctx: DateExpressionContext) => void; + /** + * Exit a parse tree produced by `esql_parser.dateExpression`. + * @param ctx the parse tree + */ + exitDateExpression?: (ctx: DateExpressionContext) => void; + /** * Enter a parse tree produced by `esql_parser.operatorExpression`. * @param ctx the parse tree diff --git a/packages/kbn-monaco/src/esql/language.ts b/packages/kbn-monaco/src/esql/language.ts index 8ab28106460fb..cca4cb3718f06 100644 --- a/packages/kbn-monaco/src/esql/language.ts +++ b/packages/kbn-monaco/src/esql/language.ts @@ -31,6 +31,19 @@ export const ESQLLang: CustomLangModuleType = { new DiagnosticsAdapter(ESQL_LANG_ID, (...uris) => workerProxyService.getWorker(uris)); }, + languageConfiguration: { + brackets: [['(', ')']], + autoClosingPairs: [ + { open: '(', close: ')' }, + { open: `'`, close: `'` }, + { open: '"', close: '"' }, + ], + surroundingPairs: [ + { open: '(', close: ')' }, + { open: `'`, close: `'` }, + { open: '"', close: '"' }, + ], + }, getSuggestionProvider(callbacks?: ESQLCustomAutocompleteCallbacks) { return new ESQLCompletionAdapter((...uris) => workerProxyService.getWorker(uris), callbacks); diff --git a/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/date_math_expressions.ts b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/date_math_expressions.ts new file mode 100644 index 0000000000000..2eb0226914ee9 --- /dev/null +++ b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/date_math_expressions.ts @@ -0,0 +1,157 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import type { AutocompleteCommandDefinition } from '../types'; + +export const dateExpressionDefinitions: AutocompleteCommandDefinition[] = [ + { + label: 'year', + insertText: 'year', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.year', { + defaultMessage: 'Year', + }), + sortText: 'D', + }, + { + label: 'years', + insertText: 'years', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.years', { + defaultMessage: 'Years (Plural)', + }), + sortText: 'D', + }, + { + label: 'month', + insertText: 'month', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.month', { + defaultMessage: 'Month', + }), + sortText: 'D', + }, + { + label: 'months', + insertText: 'months', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.months', { + defaultMessage: 'Months (Plural)', + }), + sortText: 'D', + }, + { + label: 'week', + insertText: 'week', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.week', { + defaultMessage: 'Week', + }), + sortText: 'D', + }, + { + label: 'weeks', + insertText: 'weeks', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.weeks', { + defaultMessage: 'Weeks (Plural)', + }), + sortText: 'D', + }, + { + label: 'day', + insertText: 'day', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.day', { + defaultMessage: 'Day', + }), + sortText: 'D', + }, + { + label: 'days', + insertText: 'days', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.days', { + defaultMessage: 'Days (Plural)', + }), + sortText: 'D', + }, + { + label: 'hour', + insertText: 'hour', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.hour', { + defaultMessage: 'Hour', + }), + sortText: 'D', + }, + { + label: 'hours', + insertText: 'hours', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.hours', { + defaultMessage: 'Hours (Plural)', + }), + sortText: 'D', + }, + { + label: 'minute', + insertText: 'minute', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.minute', { + defaultMessage: 'Minute', + }), + sortText: 'D', + }, + { + label: 'minutes', + insertText: 'minutes', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.minutes', { + defaultMessage: 'Minutes (Plural)', + }), + sortText: 'D', + }, + { + label: 'second', + insertText: 'second', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.second', { + defaultMessage: 'Second', + }), + sortText: 'D', + }, + { + label: 'seconds', + insertText: 'seconds', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.seconds', { + defaultMessage: 'Seconds (Plural)', + }), + sortText: 'D', + }, + { + label: 'millisecond', + insertText: 'millisecond', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.millisecond', { + defaultMessage: 'Millisecond', + }), + sortText: 'D', + }, + { + label: 'milliseconds', + insertText: 'milliseconds', + kind: 12, + detail: i18n.translate('monaco.esql.autocomplete.dateDurationDefinition.milliseconds', { + defaultMessage: 'Milliseconds (Plural)', + }), + sortText: 'D', + }, +]; diff --git a/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/functions_commands.ts b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/functions_commands.ts index 53add21af9f1a..aa85eee2e3d44 100644 --- a/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/functions_commands.ts +++ b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/functions_commands.ts @@ -315,11 +315,11 @@ export const mathCommandDefinition: AutocompleteCommandDefinition[] = [ insertText: 'date_trunc', kind: 1, detail: i18n.translate('monaco.esql.autocomplete.dateTruncDoc', { - defaultMessage: `Rounds down a date to the closest interval.`, + defaultMessage: `Rounds down a date to the closest interval. Intervals can be expressed using the timespan literal syntax.`, }), documentation: { - value: buildDocumentation('substring(grouped[T]): aggregated[T]', [ - 'from index where field="value" | eval year_hired = DATE_TRUNC(hire_date, 1 year)', + value: buildDocumentation('date_trunc(time_literal, grouped[T]): aggregated[T]', [ + 'from index where field="value" | eval year_hired = DATE_TRUNC(1 year, hire_date)', ]), }, sortText: 'C', @@ -332,7 +332,7 @@ export const mathCommandDefinition: AutocompleteCommandDefinition[] = [ defaultMessage: `Parse dates from strings.`, }), documentation: { - value: buildDocumentation('substring(grouped[T]): aggregated[T]', [ + value: buildDocumentation('date_parse(grouped[T]): aggregated[T]', [ `from index where field="value" | eval year_hired = date_parse(hire_date, yyyy-MM-dd'T'HH:mm:ss.SSS'Z')`, ]), }, diff --git a/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/processing_commands.ts b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/processing_commands.ts index a53330d638158..5fe6969f3eddb 100644 --- a/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/processing_commands.ts +++ b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_definitions/processing_commands.ts @@ -62,6 +62,7 @@ export const processingCommandsDefinitions: AutocompleteCommandDefinition[] = [ documentation: { value: buildDocumentation('eval columns = fieldSpecification ( `,` fieldSpecification )*', [ '… | eval a = b * c', + '… | eval then = 1 year + 2 weeks', ]), }, sortText: 'B', diff --git a/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_listener.test.ts b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_listener.test.ts index bbcdb04060689..cbc20564b13da 100644 --- a/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_listener.test.ts +++ b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_listener.test.ts @@ -13,6 +13,7 @@ import { ANTLREErrorListener } from '../../../common/error_listener'; import { getParser, ROOT_STATEMENT } from '../antlr_facade'; import { isDynamicAutocompleteItem } from './dymanic_item'; +import { getDurationItemsWithQuantifier } from './helpers'; describe('autocomplete_listener', () => { const getAutocompleteSuggestions = (text: string) => { @@ -176,9 +177,7 @@ describe('autocomplete_listener', () => { }); describe('eval', () => { - testSuggestions('from a | eval ', ['var0']); - testSuggestions('from a | eval a ', ['=']); - testSuggestions('from a | eval a=', [ + const functionSuggestions = [ 'round', 'abs', 'pow', @@ -205,16 +204,49 @@ describe('autocomplete_listener', () => { 'is_infinite', 'case', 'length', - ]); + ]; + + testSuggestions('from a | eval ', ['var0']); + testSuggestions('from a | eval a ', ['=']); + testSuggestions('from a | eval a=', functionSuggestions); testSuggestions('from a | eval a=b, ', ['var0']); testSuggestions('from a | eval a=round', ['(']); testSuggestions('from a | eval a=round(', ['FieldIdentifier']); testSuggestions('from a | eval a=round(b) ', ['|', '+', '-', '/', '*']); testSuggestions('from a | eval a=round(b),', ['var0']); - testSuggestions('from a | eval a=round(b) +', ['FieldIdentifier']); + testSuggestions('from a | eval a=round(b) + ', ['FieldIdentifier', ...functionSuggestions]); + // NOTE: this is handled also partially in the suggestion wrapper with auto-injection of closing brackets testSuggestions('from a | eval a=round(b', [')', 'FieldIdentifier']); testSuggestions('from a | eval a=round(b), b=round(', ['FieldIdentifier']); testSuggestions('from a | stats a=round(b), b=round(', ['FieldIdentifier']); testSuggestions('from a | eval var0=round(b), var1=round(c) | stats ', ['var2']); + + describe('date math', () => { + const dateSuggestions = [ + 'year', + 'month', + 'week', + 'day', + 'hour', + 'minute', + 'second', + 'millisecond', + ].flatMap((v) => [v, `${v}s`]); + const dateMathSymbols = ['+', '-']; + testSuggestions('from a | eval a = 1 ', dateMathSymbols.concat(dateSuggestions, ['|'])); + testSuggestions('from a | eval a = 1 year ', dateMathSymbols.concat(dateSuggestions, ['|'])); + testSuggestions( + 'from a | eval a = 1 day + 2 ', + dateMathSymbols.concat(dateSuggestions, ['|']) + ); + testSuggestions( + 'from a | eval var0=date_trunc(', + ['FieldIdentifier'].concat(...getDurationItemsWithQuantifier().map(({ label }) => label)) + ); + testSuggestions( + 'from a | eval var0=date_trunc(2 ', + [')', 'FieldIdentifier'].concat(dateSuggestions) + ); + }); }); }); diff --git a/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_listener.ts b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_listener.ts index ad439caad1dce..35c75e6ce6021 100644 --- a/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_listener.ts +++ b/packages/kbn-monaco/src/esql/lib/autocomplete/autocomplete_listener.ts @@ -15,6 +15,7 @@ import { esql_parser as ESQLParser, EnrichCommandContext, EnrichWithClauseContext, + OperatorExpressionContext, } from '../../antlr/esql_parser'; import { @@ -67,6 +68,13 @@ import { onOperatorDefinition, withOperatorDefinition, } from './autocomplete_definitions/operators_commands'; +import { dateExpressionDefinitions } from './autocomplete_definitions/date_math_expressions'; +import { + endsWithOpenBracket, + getDateMathOperation, + getDurationItemsWithQuantifier, + isDateFunction, +} from './helpers'; export function nonNullable(v: T): v is NonNullable { return v != null; @@ -105,6 +113,37 @@ export class AutocompleteListener implements ESQLParserListener { return node && node.payload?.startIndex >= 0; } + private inspectOperatorExpressionContext( + context: OperatorExpressionContext | OperatorExpressionContext[] | undefined, + innerScope: 'constant' | 'dateExpression' | 'booleanExpression' + ): boolean { + if (!context) { + return false; + } + if (Array.isArray(context)) { + return context.some((c) => this.inspectOperatorExpressionContext(c, innerScope)); + } + if (context.operatorExpression()?.length) { + return this.inspectOperatorExpressionContext(context.operatorExpression(), innerScope); + } + if (context.primaryExpression()) { + return Boolean(context.primaryExpression()?.[innerScope]()); + } + return false; + } + + private hasDateExpressionTerminalNode( + context: OperatorExpressionContext | OperatorExpressionContext[] | undefined + ): boolean { + return this.inspectOperatorExpressionContext(context, 'dateExpression'); + } + + private hasOnlyConstantDefined( + context: OperatorExpressionContext | OperatorExpressionContext[] | undefined + ): boolean { + return this.inspectOperatorExpressionContext(context, 'constant'); + } + private applyConditionalSuggestion( skipDefinitions: AutocompleteCommandDefinition[], targetDefinition: AutocompleteCommandDefinition, @@ -346,36 +385,101 @@ export class AutocompleteListener implements ESQLParserListener { const isInStats = this.parentContext === ESQLParser.STATS; const isInEval = this.parentContext === ESQLParser.EVAL; - if (this.parentContext && (isInStats || isInEval)) { + if (isInStats || isInEval) { const hasFN = ctx.tryGetToken(esql_parser.UNARY_FUNCTION, 0) || ctx.tryGetToken(esql_parser.MATH_FUNCTION, 0); const hasLP = ctx.tryGetToken(esql_parser.LP, 0); const hasRP = ctx.tryGetToken(esql_parser.RP, 0); + // TODO: handle also other math signs later on + const hasPlusOrMinus = + ctx.tryGetToken(esql_parser.PLUS, 0) || ctx.tryGetToken(esql_parser.MINUS, 0); + + const hasDateLiteral = ctx.tryGetToken(esql_parser.DATE_LITERAL, 0); + + const isInDurationMode = hasDateLiteral || (hasFN && isDateFunction(hasFN.text)); + if (hasPlusOrMinus && this.isTerminalNodeExists(hasPlusOrMinus)) { + if (isInEval) { + this.suggestions = isInDurationMode + ? // eval a = 1 year + || eval a = date_trunc(1 year, date) - + [ + ...mathCommandDefinition.filter(({ label }) => isDateFunction(String(label))), + ...getDurationItemsWithQuantifier(), + ] + : // eval a = 1 + || eval a = abs(b) - + [...this.fields, ...mathCommandDefinition]; + } else { + this.suggestions = [...this.fields, ...aggregationFunctionsDefinitions]; + } + return; + } + // Monaco will auto close the brackets but the language listener will not pick up yet this auto-change. + // We try to inject it outside but it won't cover all scenarios if (hasFN) { if (!hasLP) { this.suggestions = [openBracketDefinition]; return; } + + this.suggestions = []; + if (!hasRP) { if (ctx.childCount === 3) { - this.suggestions = [closeBracketDefinition, ...this.fields]; - return; + // TODO: improve here to suggest comma if signature has multiple args + this.suggestions.push(closeBracketDefinition); } } + this.suggestions.push(...this.fields); + // Need to get the function name from the previous node (current is "(" ) + const fnName = hasFN.text; + const fnsToCheck = isInEval ? mathCommandDefinition : aggregationFunctionsDefinitions; + if (fnName && fnsToCheck.some(({ label }) => label === fnName)) { + // push date suggestions only for date functions + // TODO: improve this checks + if (isInEval && isDateFunction(fnName)) { + if (!ctx.tryGetToken(esql_parser.DATE_LITERAL, 0)) { + this.suggestions.push( + // if it's just after the open bracket, suggest also a number together with a date period, + // otherwise just the date period unit + ...(endsWithOpenBracket(ctx.text) + ? getDurationItemsWithQuantifier() + : dateExpressionDefinitions) + ); + } + } + } + + return; } else { if (ctx.childCount === 1) { if (ctx.text && ctx.text.indexOf('(') === -1) { - this.suggestions = [ - ...(isInEval ? mathCommandDefinition : []), - ...(isInStats ? aggregationFunctionsDefinitions : []), - ]; + this.suggestions = [...mathOperatorsCommandsDefinitions]; + if (isInEval) { + // eval a = 1 || eval a = 1 year + 1 + if ( + this.hasDateExpressionTerminalNode(ctx.operatorExpression()) || + this.hasOnlyConstantDefined(ctx.operatorExpression()) + ) { + this.suggestions = [...getDateMathOperation(), ...dateExpressionDefinitions]; + } + } + + if (isInStats) { + this.suggestions.push(...aggregationFunctionsDefinitions); + } + + this.suggestions.push(...this.getEndCommandSuggestions()); } return; } } - this.suggestions = this.fields; + this.suggestions = [...this.fields]; + if (ctx.exception && isInEval) { + // case: eval a = x * or / + this.suggestions.push(...mathCommandDefinition); + } + this.suggestions.push(...this.getEndCommandSuggestions()); } } diff --git a/packages/kbn-monaco/src/esql/lib/autocomplete/helpers.ts b/packages/kbn-monaco/src/esql/lib/autocomplete/helpers.ts new file mode 100644 index 0000000000000..be1392cb11e72 --- /dev/null +++ b/packages/kbn-monaco/src/esql/lib/autocomplete/helpers.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { mathOperatorsCommandsDefinitions } from './autocomplete_definitions'; +import { dateExpressionDefinitions } from './autocomplete_definitions/date_math_expressions'; + +export function endsWithOpenBracket(text: string) { + return /\($/.test(text); +} + +export function isDateFunction(fnName: string) { + // TODO: improve this and rely in signature in the future + return ['to_datetime', 'date_trunc', 'date_parse'].includes(fnName.toLowerCase()); +} + +export function getDateMathOperation() { + return mathOperatorsCommandsDefinitions.filter(({ label }) => ['+', '-'].includes(String(label))); +} + +export function getDurationItemsWithQuantifier(quantifier: number = 1) { + return dateExpressionDefinitions + .filter(({ label }) => !/s$/.test(label.toString())) + .map(({ label, insertText, ...rest }) => ({ + label: `${quantifier} ${label}`, + insertText: `${quantifier} ${insertText}`, + ...rest, + })); +} diff --git a/x-pack/plugins/profiling_data_access/common/__fixtures__/README.md b/packages/kbn-profiling-utils/common/__fixtures__/README.md similarity index 100% rename from x-pack/plugins/profiling_data_access/common/__fixtures__/README.md rename to packages/kbn-profiling-utils/common/__fixtures__/README.md diff --git a/packages/kbn-profiling-utils/common/__fixtures__/stacktraces.ts b/packages/kbn-profiling-utils/common/__fixtures__/stacktraces.ts new file mode 100644 index 0000000000000..105132ec15941 --- /dev/null +++ b/packages/kbn-profiling-utils/common/__fixtures__/stacktraces.ts @@ -0,0 +1,25 @@ +/* + * 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 { StackTraceResponse } from '../stack_traces'; + +import stackTraces1x from './stacktraces_60s_1x.json'; +import stackTraces5x from './stacktraces_3600s_5x.json'; +import stackTraces125x from './stacktraces_86400s_125x.json'; +import stackTraces625x from './stacktraces_604800s_625x.json'; + +export const stackTraceFixtures: Array<{ + response: StackTraceResponse; + seconds: number; + upsampledBy: number; +}> = [ + { response: stackTraces1x, seconds: 60, upsampledBy: 1 }, + { response: stackTraces5x, seconds: 3600, upsampledBy: 5 }, + { response: stackTraces125x, seconds: 86400, upsampledBy: 125 }, + { response: stackTraces625x, seconds: 604800, upsampledBy: 625 }, +]; diff --git a/x-pack/plugins/profiling_data_access/common/__fixtures__/stacktraces_3600s_5x.json b/packages/kbn-profiling-utils/common/__fixtures__/stacktraces_3600s_5x.json similarity index 100% rename from x-pack/plugins/profiling_data_access/common/__fixtures__/stacktraces_3600s_5x.json rename to packages/kbn-profiling-utils/common/__fixtures__/stacktraces_3600s_5x.json diff --git a/x-pack/plugins/profiling_data_access/common/__fixtures__/stacktraces_604800s_625x.json b/packages/kbn-profiling-utils/common/__fixtures__/stacktraces_604800s_625x.json similarity index 100% rename from x-pack/plugins/profiling_data_access/common/__fixtures__/stacktraces_604800s_625x.json rename to packages/kbn-profiling-utils/common/__fixtures__/stacktraces_604800s_625x.json diff --git a/x-pack/plugins/profiling_data_access/common/__fixtures__/stacktraces_60s_1x.json b/packages/kbn-profiling-utils/common/__fixtures__/stacktraces_60s_1x.json similarity index 100% rename from x-pack/plugins/profiling_data_access/common/__fixtures__/stacktraces_60s_1x.json rename to packages/kbn-profiling-utils/common/__fixtures__/stacktraces_60s_1x.json diff --git a/x-pack/plugins/profiling_data_access/common/__fixtures__/stacktraces_86400s_125x.json b/packages/kbn-profiling-utils/common/__fixtures__/stacktraces_86400s_125x.json similarity index 100% rename from x-pack/plugins/profiling_data_access/common/__fixtures__/stacktraces_86400s_125x.json rename to packages/kbn-profiling-utils/common/__fixtures__/stacktraces_86400s_125x.json diff --git a/x-pack/plugins/profiling_data_access/common/callee.test.ts b/packages/kbn-profiling-utils/common/callee.test.ts similarity index 90% rename from x-pack/plugins/profiling_data_access/common/callee.test.ts rename to packages/kbn-profiling-utils/common/callee.test.ts index a796062948b33..431f914bd6a10 100644 --- a/x-pack/plugins/profiling_data_access/common/callee.test.ts +++ b/packages/kbn-profiling-utils/common/callee.test.ts @@ -1,15 +1,15 @@ /* * 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. + * 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 { sum } from 'lodash'; import { createCalleeTree } from './callee'; import { decodeStackTraceResponse } from './stack_traces'; - import { stackTraceFixtures } from './__fixtures__/stacktraces'; describe('Callee operations', () => { diff --git a/x-pack/plugins/profiling_data_access/common/callee.ts b/packages/kbn-profiling-utils/common/callee.ts similarity index 86% rename from x-pack/plugins/profiling_data_access/common/callee.ts rename to packages/kbn-profiling-utils/common/callee.ts index 68fa9170f44ec..9315548b81ef3 100644 --- a/x-pack/plugins/profiling_data_access/common/callee.ts +++ b/packages/kbn-profiling-utils/common/callee.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { createFrameGroupID, FrameGroupID } from './frame_group'; @@ -20,24 +21,48 @@ import { type NodeID = number; +/** + * Callee tree + */ export interface CalleeTree { + /** size */ Size: number; + /** edges */ Edges: Array>; - + /** file ids */ FileID: string[]; + /** frame types */ FrameType: number[]; + /** inlines */ Inline: boolean[]; + /** executable file names */ ExeFilename: string[]; + /** address or lines */ AddressOrLine: number[]; + /** function names */ FunctionName: string[]; + /** function offsets */ FunctionOffset: number[]; + /** source file names */ SourceFilename: string[]; + /** source lines */ SourceLine: number[]; - + /** total cpu */ CountInclusive: number[]; + /** self cpu */ CountExclusive: number[]; } +/** + * Create a callee tree + * @param events Map + * @param stackTraces Map + * @param stackFrames Map + * @param executables Map + * @param totalFrames number + * @param samplingRate number + * @returns + */ export function createCalleeTree( events: Map, stackTraces: Map, diff --git a/x-pack/plugins/profiling_data_access/common/elasticsearch.ts b/packages/kbn-profiling-utils/common/elasticsearch.ts similarity index 92% rename from x-pack/plugins/profiling_data_access/common/elasticsearch.ts rename to packages/kbn-profiling-utils/common/elasticsearch.ts index a47e4c018d581..c3d18c16545e1 100644 --- a/x-pack/plugins/profiling_data_access/common/elasticsearch.ts +++ b/packages/kbn-profiling-utils/common/elasticsearch.ts @@ -1,12 +1,16 @@ /* * 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. + * 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 { UnionToIntersection, ValuesType } from 'utility-types'; +/** + * Profiling Elasticsearch fields + */ export enum ProfilingESField { Timestamp = '@timestamp', ContainerName = 'container.name', diff --git a/x-pack/plugins/profiling_data_access/common/flamegraph.test.ts b/packages/kbn-profiling-utils/common/flamegraph.test.ts similarity index 90% rename from x-pack/plugins/profiling_data_access/common/flamegraph.test.ts rename to packages/kbn-profiling-utils/common/flamegraph.test.ts index 8014264667239..cc6b3cca69926 100644 --- a/x-pack/plugins/profiling_data_access/common/flamegraph.test.ts +++ b/packages/kbn-profiling-utils/common/flamegraph.test.ts @@ -1,14 +1,14 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { createCalleeTree } from './callee'; import { createBaseFlameGraph, createFlameGraph } from './flamegraph'; import { decodeStackTraceResponse } from './stack_traces'; - import { stackTraceFixtures } from './__fixtures__/stacktraces'; describe('Flamegraph operations', () => { diff --git a/x-pack/plugins/profiling_data_access/common/flamegraph.ts b/packages/kbn-profiling-utils/common/flamegraph.ts similarity index 80% rename from x-pack/plugins/profiling_data_access/common/flamegraph.ts rename to packages/kbn-profiling-utils/common/flamegraph.ts index 16fb8c1a396c5..20dc5419d6230 100644 --- a/x-pack/plugins/profiling_data_access/common/flamegraph.ts +++ b/packages/kbn-profiling-utils/common/flamegraph.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { CalleeTree } from './callee'; @@ -10,28 +11,49 @@ import { createFrameGroupID } from './frame_group'; import { fnv1a64 } from './hash'; import { createStackFrameMetadata, getCalleeLabel } from './profiling'; +/** + * Base Flamegraph + */ export interface BaseFlameGraph { + /** size */ Size: number; + /** edges */ Edges: number[][]; - + /** file ids */ FileID: string[]; + /** frame types */ FrameType: number[]; + /** inlines */ Inline: boolean[]; + /** executable file names */ ExeFilename: string[]; + /** address or line */ AddressOrLine: number[]; + /** function names */ FunctionName: string[]; + /** function offsets */ FunctionOffset: number[]; + /** source file names */ SourceFilename: string[]; + /** source lines */ SourceLine: number[]; - + /** total cpu */ CountInclusive: number[]; + /** self cpu */ CountExclusive: number[]; - + /** total seconds */ TotalSeconds: number; + /** sampling rate */ SamplingRate: number; } -// createBaseFlameGraph encapsulates the tree representation into a serialized form. +/** + * createBaseFlameGraph encapsulates the tree representation into a serialized form. + * @param tree CalleeTree + * @param samplingRate number + * @param totalSeconds number + * @returns BaseFlameGraph + */ export function createBaseFlameGraph( tree: CalleeTree, samplingRate: number, @@ -71,14 +93,22 @@ export function createBaseFlameGraph( return graph; } +/** Elasticsearch flamegraph */ export interface ElasticFlameGraph extends BaseFlameGraph { + /** ID */ ID: string[]; + /** Label */ Label: string[]; } -// createFlameGraph combines the base flamegraph with CPU-intensive values. -// This allows us to create a flamegraph in two steps (e.g. first on the server -// and finally in the browser). +/** + * + * createFlameGraph combines the base flamegraph with CPU-intensive values. + * This allows us to create a flamegraph in two steps (e.g. first on the server + * and finally in the browser). + * @param base BaseFlameGraph + * @returns ElasticFlameGraph + */ export function createFlameGraph(base: BaseFlameGraph): ElasticFlameGraph { const graph: ElasticFlameGraph = { Size: base.Size, diff --git a/x-pack/plugins/profiling_data_access/common/frame_group.test.ts b/packages/kbn-profiling-utils/common/frame_group.test.ts similarity index 94% rename from x-pack/plugins/profiling_data_access/common/frame_group.test.ts rename to packages/kbn-profiling-utils/common/frame_group.test.ts index b5f0fddd7b903..b6bfa6161a175 100644 --- a/x-pack/plugins/profiling_data_access/common/frame_group.test.ts +++ b/packages/kbn-profiling-utils/common/frame_group.test.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { createFrameGroupID } from './frame_group'; diff --git a/x-pack/plugins/profiling_data_access/common/frame_group.ts b/packages/kbn-profiling-utils/common/frame_group.ts similarity index 58% rename from x-pack/plugins/profiling_data_access/common/frame_group.ts rename to packages/kbn-profiling-utils/common/frame_group.ts index 6881b14ed98fe..56a190ee58062 100644 --- a/x-pack/plugins/profiling_data_access/common/frame_group.ts +++ b/packages/kbn-profiling-utils/common/frame_group.ts @@ -1,24 +1,34 @@ /* * 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. + * 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 { takeRight } from 'lodash'; import { StackFrameMetadata } from './profiling'; +/** Frame group ID */ export type FrameGroupID = string; function stripLeadingSubdirs(sourceFileName: string) { return takeRight(sourceFileName.split('/'), 2).join('/'); } -// createFrameGroupID is the "standard" way of grouping frames, by commonly -// shared group identifiers. -// -// For ELF-symbolized frames, group by FunctionName, ExeFileName and FileID. -// For non-symbolized frames, group by FileID and AddressOrLine. -// otherwise group by ExeFileName, SourceFilename and FunctionName. +/** + * + * createFrameGroupID is the "standard" way of grouping frames, by commonly shared group identifiers. + * For ELF-symbolized frames, group by FunctionName, ExeFileName and FileID. + * For non-symbolized frames, group by FileID and AddressOrLine. + * otherwise group by ExeFileName, SourceFilename and FunctionName. + * @param fileID string + * @param addressOrLine string + * @param exeFilename string + * @param sourceFilename string + * @param functionName string + * @returns FrameGroupID + */ export function createFrameGroupID( fileID: StackFrameMetadata['FileID'], addressOrLine: StackFrameMetadata['AddressOrLine'], diff --git a/x-pack/plugins/profiling_data_access/common/hash.test.ts b/packages/kbn-profiling-utils/common/hash.test.ts similarity index 87% rename from x-pack/plugins/profiling_data_access/common/hash.test.ts rename to packages/kbn-profiling-utils/common/hash.test.ts index eaec348caa0ea..14a167d2c5998 100644 --- a/x-pack/plugins/profiling_data_access/common/hash.test.ts +++ b/packages/kbn-profiling-utils/common/hash.test.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { fnv1a64 } from './hash'; diff --git a/x-pack/plugins/profiling_data_access/common/hash.ts b/packages/kbn-profiling-utils/common/hash.ts similarity index 74% rename from x-pack/plugins/profiling_data_access/common/hash.ts rename to packages/kbn-profiling-utils/common/hash.ts index 3eab4bde871e0..2c19b2f19b723 100644 --- a/x-pack/plugins/profiling_data_access/common/hash.ts +++ b/packages/kbn-profiling-utils/common/hash.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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. */ // prettier-ignore @@ -25,23 +26,24 @@ const lowerHex = [ 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff', ]; -// fnv1a64 computes a 64-bit hash of a byte array using the FNV-1a hash function [1]. -// -// Due to the lack of a native uint64 in JavaScript, we operate on 64-bit values using an array -// of 4 uint16s instead. This method follows Knuth's Algorithm M in section 4.3.1 [2] using a -// modified multiword multiplication implementation described in [3]. The modifications include: -// -// * rewrite default algorithm for the special case m = n = 4 -// * unroll loops -// * simplify expressions -// * create pre-computed lookup table for serialization to hexadecimal -// -// 1. https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function -// 2. Knuth, Donald E. The Art of Computer Programming, Volume 2, Third Edition: Seminumerical -// Algorithms. Addison-Wesley, 1998. -// 3. Warren, Henry S. Hacker's Delight. Upper Saddle River, NJ: Addison-Wesley, 2013. - /* eslint no-bitwise: ["error", { "allow": ["^=", ">>", "&"] }] */ + +/** + * - fnv1a64 computes a 64-bit hash of a byte array using the FNV-1a hash function [1]. + * Due to the lack of a native uint64 in JavaScript, we operate on 64-bit values using an array + * of 4 uint16s instead. This method follows Knuth's Algorithm M in section 4.3.1 [2] using a + * modified multiword multiplication implementation described in [3]. The modifications include: + * - rewrite default algorithm for the special case m = n = 4 + * - unroll loops + * - simplify expressions + * - create pre-computed lookup table for serialization to hexadecimal + * 1. https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + * 2. Knuth, Donald E. The Art of Computer Programming, Volume 2, Third Edition: Seminumerical + * Algorithms. Addison-Wesley, 1998. + * 3. Warren, Henry S. Hacker's Delight. Upper Saddle River, NJ: Addison-Wesley, 2013. + * @param bytes Uint8Array + * @returns string + */ export function fnv1a64(bytes: Uint8Array): string { const n = bytes.length; let [h0, h1, h2, h3] = [0x2325, 0x8422, 0x9ce4, 0xcbf2]; diff --git a/x-pack/plugins/profiling_data_access/common/profiling.test.ts b/packages/kbn-profiling-utils/common/profiling.test.ts similarity index 95% rename from x-pack/plugins/profiling_data_access/common/profiling.test.ts rename to packages/kbn-profiling-utils/common/profiling.test.ts index 24c898bf1cfbe..e235633890069 100644 --- a/x-pack/plugins/profiling_data_access/common/profiling.test.ts +++ b/packages/kbn-profiling-utils/common/profiling.test.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { diff --git a/x-pack/plugins/profiling_data_access/common/profiling.ts b/packages/kbn-profiling-utils/common/profiling.ts similarity index 70% rename from x-pack/plugins/profiling_data_access/common/profiling.ts rename to packages/kbn-profiling-utils/common/profiling.ts index c6f72f20629d3..955be2e1485e6 100644 --- a/x-pack/plugins/profiling_data_access/common/profiling.ts +++ b/packages/kbn-profiling-utils/common/profiling.ts @@ -1,14 +1,27 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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. */ +/** + * Stacktrace ID + */ export type StackTraceID = string; +/** + * StackFrame ID + */ export type StackFrameID = string; +/** + * File ID + */ export type FileID = string; +/** + * Frame type + */ export enum FrameType { Unsymbolized = 0, Python, @@ -35,94 +48,134 @@ const frameTypeDescriptions = { [FrameType.PHPJIT]: 'PHP JIT', }; +/** + * get frame type name + * @param ft FrameType + * @returns string + */ export function describeFrameType(ft: FrameType): string { return frameTypeDescriptions[ft]; } export interface StackTraceEvent { + /** stacktrace ID */ StackTraceID: StackTraceID; + /** count */ Count: number; } +/** Stack trace */ export interface StackTrace { + /** frame ids */ FrameIDs: string[]; + /** file ids */ FileIDs: string[]; + /** address or lines */ AddressOrLines: number[]; + /** types */ Types: number[]; } - +/** + * Empty stack trace + */ export const emptyStackTrace: StackTrace = { + /** Frame IDs */ FrameIDs: [], + /** File IDs */ FileIDs: [], + /** Address or lines */ AddressOrLines: [], + /** Types */ Types: [], }; +/** Stack frame */ export interface StackFrame { + /** file name */ FileName: string; + /** function name */ FunctionName: string; + /** function offset */ FunctionOffset: number; + /** line number */ LineNumber: number; + /** inline */ Inline: boolean; } +/** + * Empty stack frame + */ export const emptyStackFrame: StackFrame = { + /** File name */ FileName: '', + /** Function name */ FunctionName: '', + /** Function offset */ FunctionOffset: 0, + /** Line number */ LineNumber: 0, + /** Inline */ Inline: false, }; +/** Executable */ export interface Executable { + /** file name */ FileName: string; } +/** + * Empty exectutable + */ export const emptyExecutable: Executable = { + /** file name */ FileName: '', }; +/** Stack frame metadata */ export interface StackFrameMetadata { - // StackTrace.FrameID + /** StackTrace.FrameID */ FrameID: string; - // StackTrace.FileID + /** StackTrace.FileID */ FileID: FileID; - // StackTrace.Type + /** StackTrace.Type */ FrameType: FrameType; - // StackFrame.Inline + /** StackFrame.Inline */ Inline: boolean; - - // StackTrace.AddressOrLine + /** StackTrace.AddressOrLine */ AddressOrLine: number; - // StackFrame.FunctionName + /** StackFrame.FunctionName */ FunctionName: string; - // StackFrame.FunctionOffset + /** StackFrame.FunctionOffset */ FunctionOffset: number; - // should this be StackFrame.SourceID? + /** should this be StackFrame.SourceID? */ SourceID: FileID; - // StackFrame.Filename + /** StackFrame.Filename */ SourceFilename: string; - // StackFrame.LineNumber + /** StackFrame.LineNumber */ SourceLine: number; - // auto-generated - see createStackFrameMetadata + /** auto-generated - see createStackFrameMetadata */ FunctionSourceLine: number; - - // Executable.FileName + /** Executable.FileName */ ExeFileName: string; - - // unused atm due to lack of symbolization metadata + /** unused atm due to lack of symbolization metadata */ CommitHash: string; - // unused atm due to lack of symbolization metadata + /** unused atm due to lack of symbolization metadata */ SourceCodeURL: string; - // unused atm due to lack of symbolization metadata + /** unused atm due to lack of symbolization metadata */ SourcePackageHash: string; - // unused atm due to lack of symbolization metadata + /** unused atm due to lack of symbolization metadata */ SourcePackageURL: string; - // unused atm due to lack of symbolization metadata - + /** unused atm due to lack of symbolization metadata */ SamplingRate: number; } +/** + * create stackframe metadata + * @param options Partial + * @returns StackFrameMetadata + */ export function createStackFrameMetadata( options: Partial = {} ): StackFrameMetadata { @@ -182,6 +235,11 @@ function getExeFileName(metadata: StackFrameMetadata) { return describeFrameType(metadata.FrameType); } +/** + * Get callee label + * @param metadata StackFrameMetadata + * @returns string + */ export function getCalleeLabel(metadata: StackFrameMetadata) { if (metadata.FunctionName !== '') { const sourceFilename = metadata.SourceFilename; @@ -192,7 +250,11 @@ export function getCalleeLabel(metadata: StackFrameMetadata) { } return getExeFileName(metadata); } - +/** + * Get callee function name + * @param frame StackFrameMetadata + * @returns string + */ export function getCalleeFunction(frame: StackFrameMetadata): string { // In the best case scenario, we have the file names, source lines, // and function names. However we need to deal with missing function or @@ -202,20 +264,32 @@ export function getCalleeFunction(frame: StackFrameMetadata): string { // When there is no function name, only use the executable name return frame.FunctionName ? exeDisplayName + ': ' + frame.FunctionName : exeDisplayName; } +/** + * Frame symbol status + */ export enum FrameSymbolStatus { PARTIALLY_SYMBOLYZED = 'PARTIALLY_SYMBOLYZED', NOT_SYMBOLIZED = 'NOT_SYMBOLIZED', SYMBOLIZED = 'SYMBOLIZED', } -export function getFrameSymbolStatus({ - sourceFilename, - sourceLine, - exeFileName, -}: { + +/** Frame symbols status params */ +interface FrameSymbolStatusParams { + /** source file name */ sourceFilename: string; + /** source file line */ sourceLine: number; + /** executable file name */ exeFileName?: string; -}) { +} + +/** + * Get frame symbol status + * @param param FrameSymbolStatusParams + * @returns FrameSymbolStatus + */ +export function getFrameSymbolStatus(param: FrameSymbolStatusParams) { + const { sourceFilename, sourceLine, exeFileName } = param; if (sourceFilename === '' && sourceLine === 0) { if (exeFileName) { return FrameSymbolStatus.PARTIALLY_SYMBOLYZED; @@ -228,10 +302,28 @@ export function getFrameSymbolStatus({ } const nativeLanguages = [FrameType.Native, FrameType.Kernel]; -export function getLanguageType({ frameType }: { frameType: FrameType }) { - return nativeLanguages.includes(frameType) ? 'NATIVE' : 'INTERPRETED'; + +interface LanguageTypeParams { + /** frame type */ + frameType: FrameType; } +/** + * Get language type + * @param param LanguageTypeParams + * @returns string + */ +export function getLanguageType(param: LanguageTypeParams) { + return nativeLanguages.includes(param.frameType) ? 'NATIVE' : 'INTERPRETED'; +} + +/** + * Get callee source information. + * If we don't have the executable filename, display + * If no source line or filename available, display the executable offset + * @param frame StackFrameMetadata + * @returns string + */ export function getCalleeSource(frame: StackFrameMetadata): string { const frameSymbolStatus = getFrameSymbolStatus({ sourceFilename: frame.SourceFilename, @@ -254,6 +346,13 @@ export function getCalleeSource(frame: StackFrameMetadata): string { } } +/** + * Group stackframe by stack trace + * @param stackTraces Map + * @param stackFrames Map + * @param executables Map + * @returns Record + */ export function groupStackFrameMetadataByStackTrace( stackTraces: Map, stackFrames: Map, diff --git a/x-pack/plugins/profiling_data_access/common/stack_traces.test.ts b/packages/kbn-profiling-utils/common/stack_traces.test.ts similarity index 97% rename from x-pack/plugins/profiling_data_access/common/stack_traces.test.ts rename to packages/kbn-profiling-utils/common/stack_traces.test.ts index 9486ba1e4b920..832ebe7bb66b4 100644 --- a/x-pack/plugins/profiling_data_access/common/stack_traces.test.ts +++ b/packages/kbn-profiling-utils/common/stack_traces.test.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { diff --git a/x-pack/plugins/profiling_data_access/common/stack_traces.ts b/packages/kbn-profiling-utils/common/stack_traces.ts similarity index 81% rename from x-pack/plugins/profiling_data_access/common/stack_traces.ts rename to packages/kbn-profiling-utils/common/stack_traces.ts index 97a18d09ed389..f7893c66c5e29 100644 --- a/x-pack/plugins/profiling_data_access/common/stack_traces.ts +++ b/packages/kbn-profiling-utils/common/stack_traces.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { ProfilingESField } from './elasticsearch'; @@ -15,13 +16,17 @@ import { StackTraceID, } from './profiling'; +/** Profiling status response */ export interface ProfilingStatusResponse { + /** profiling enabled */ profiling: { enabled: boolean; }; + /** resource management status*/ resource_management: { enabled: boolean; }; + /** Indices creates / pre 8.9.1 data still available */ resources: { created: boolean; pre_8_9_1_data: boolean; @@ -58,24 +63,43 @@ interface ProfilingExecutables { [key: string]: string; } +/** Profiling stacktrace */ export interface StackTraceResponse { + /** stack trace events */ ['stack_trace_events']?: ProfilingEvents; + /** stack traces */ ['stack_traces']?: ProfilingStackTraces; + /** stack frames */ ['stack_frames']?: ProfilingStackFrames; + /** executables */ ['executables']?: ProfilingExecutables; + /** total frames */ ['total_frames']: number; + /** sampling rate */ ['sampling_rate']: number; } +/** Decoded stack trace response */ export interface DecodedStackTraceResponse { + /** Map of Stacktrace ID and event */ events: Map; + /** Map of stacktrace ID and stacktrace */ stackTraces: Map; + /** Map of stackframe ID and stackframe */ stackFrames: Map; + /** Map of file ID and Executables */ executables: Map; + /** Total number of frames */ totalFrames: number; + /** sampling rate */ samplingRate: number; } - +/** + * Generate Frame ID + * @param frameID string + * @param n number + * @returns string + */ export const makeFrameID = (frameID: string, n: number): string => { return n === 0 ? frameID : frameID + ';' + n.toString(); }; @@ -119,6 +143,11 @@ const createInlineTrace = ( } as StackTrace; }; +/** + * Decodes stack trace response + * @param response StackTraceResponse + * @returns DecodedStackTraceResponse + */ export function decodeStackTraceResponse(response: StackTraceResponse): DecodedStackTraceResponse { const stackTraceEvents: Map = new Map(); for (const [key, value] of Object.entries(response.stack_trace_events ?? {})) { @@ -165,11 +194,17 @@ export function decodeStackTraceResponse(response: StackTraceResponse): DecodedS }; } +/** + * Stacktraces options + */ export enum StackTracesDisplayOption { StackTraces = 'stackTraces', Percentage = 'percentage', } +/** + * Functions TopN types definition + */ export enum TopNType { Containers = 'containers', Deployments = 'deployments', @@ -178,6 +213,11 @@ export enum TopNType { Traces = 'traces', } +/** + * Get Profiling ES field based on TopN Type + * @param type TopNType + * @returns string + */ export function getFieldNameForTopNType(type: TopNType): string { return { [TopNType.Containers]: ProfilingESField.ContainerName, diff --git a/packages/kbn-profiling-utils/index.ts b/packages/kbn-profiling-utils/index.ts new file mode 100644 index 0000000000000..9bb0de92f3733 --- /dev/null +++ b/packages/kbn-profiling-utils/index.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { decodeStackTraceResponse } from './common/stack_traces'; +export { createBaseFlameGraph, createFlameGraph } from './common/flamegraph'; +export { createCalleeTree } from './common/callee'; +export { ProfilingESField } from './common/elasticsearch'; +export { + groupStackFrameMetadataByStackTrace, + describeFrameType, + FrameType, + getCalleeFunction, + getCalleeSource, + getLanguageType, + FrameSymbolStatus, + getFrameSymbolStatus, + createStackFrameMetadata, + emptyExecutable, + emptyStackFrame, + emptyStackTrace, +} from './common/profiling'; +export { getFieldNameForTopNType, TopNType, StackTracesDisplayOption } from './common/stack_traces'; +export { createFrameGroupID } from './common/frame_group'; + +export type { CalleeTree } from './common/callee'; +export type { + ProfilingStatusResponse, + StackTraceResponse, + DecodedStackTraceResponse, +} from './common/stack_traces'; +export type { ElasticFlameGraph, BaseFlameGraph } from './common/flamegraph'; +export type { FrameGroupID } from './common/frame_group'; +export type { + Executable, + FileID, + StackFrame, + StackFrameID, + StackFrameMetadata, + StackTrace, + StackTraceID, +} from './common/profiling'; diff --git a/packages/kbn-profiling-utils/jest.config.js b/packages/kbn-profiling-utils/jest.config.js new file mode 100644 index 0000000000000..a853bb5666fc6 --- /dev/null +++ b/packages/kbn-profiling-utils/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../..', + roots: ['/packages/kbn-profiling-utils'], +}; diff --git a/packages/kbn-profiling-utils/kibana.jsonc b/packages/kbn-profiling-utils/kibana.jsonc new file mode 100644 index 0000000000000..dc45e822e620b --- /dev/null +++ b/packages/kbn-profiling-utils/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/profiling-utils", + "owner": "@elastic/profiling-ui" +} diff --git a/packages/kbn-profiling-utils/package.json b/packages/kbn-profiling-utils/package.json new file mode 100644 index 0000000000000..984883e078975 --- /dev/null +++ b/packages/kbn-profiling-utils/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/profiling-utils", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-profiling-utils/tsconfig.json b/packages/kbn-profiling-utils/tsconfig.json new file mode 100644 index 0000000000000..0bf626e25d9f9 --- /dev/null +++ b/packages/kbn-profiling-utils/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + "**/*.json", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [] +} diff --git a/packages/kbn-search-api-panels/components/code_box.scss b/packages/kbn-search-api-panels/components/code_box.scss index b04dbe0ffba42..50e1bcb2b6168 100644 --- a/packages/kbn-search-api-panels/components/code_box.scss +++ b/packages/kbn-search-api-panels/components/code_box.scss @@ -1,3 +1,3 @@ -.serverlessSearchCodeBoxPanel { +.codeBoxPanel { border-top: $euiBorderThin $euiColorLightShade; } diff --git a/packages/kbn-search-api-panels/components/code_box.tsx b/packages/kbn-search-api-panels/components/code_box.tsx index 9a00bdd86e4e3..ca3dd4d8b52c5 100644 --- a/packages/kbn-search-api-panels/components/code_box.tsx +++ b/packages/kbn-search-api-panels/components/code_box.tsx @@ -86,7 +86,7 @@ export const CodeBox: React.FC = ({ return ( - + diff --git a/packages/kbn-search-api-panels/components/install_client.tsx b/packages/kbn-search-api-panels/components/install_client.tsx index 6d56f69e09530..7fa0ecee6a049 100644 --- a/packages/kbn-search-api-panels/components/install_client.tsx +++ b/packages/kbn-search-api-panels/components/install_client.tsx @@ -96,15 +96,19 @@ export const InstallClientPanel: React.FC = ({ defaultMessage: 'Elastic builds and maintains clients in several popular languages and our community has contributed many more. Install your favorite language client to get started.', })} - links={[ - { - href: language.docLink, - label: i18n.translate('searchApiPanels.welcomeBanner.installClient.clientDocLink', { - defaultMessage: '{languageName} client documentation', - values: { languageName: language.name }, - }), - }, - ]} + links={ + language.docLink + ? [ + { + href: language.docLink, + label: i18n.translate('searchApiPanels.welcomeBanner.installClient.clientDocLink', { + defaultMessage: '{languageName} client documentation', + values: { languageName: language.name }, + }), + }, + ] + : [] + } title={i18n.translate('searchApiPanels.welcomeBanner.installClient.title', { defaultMessage: 'Install a client', })} diff --git a/packages/kbn-search-api-panels/index.tsx b/packages/kbn-search-api-panels/index.tsx index 5fa35ac35ef68..67bc9b221bdab 100644 --- a/packages/kbn-search-api-panels/index.tsx +++ b/packages/kbn-search-api-panels/index.tsx @@ -54,10 +54,14 @@ export const WelcomeBanner: React.FC = ({

    - {i18n.translate('searchApiPanels.welcomeBanner.header.greeting.title', { - defaultMessage: 'Hi {name}!', - values: { name: user?.full_name || user.username }, - })} + {user + ? i18n.translate('searchApiPanels.welcomeBanner.header.greeting.customTitle', { + defaultMessage: 'Hi {name}!', + values: { name: user.full_name || user.username }, + }) + : i18n.translate('searchApiPanels.welcomeBanner.header.greeting.defaultTitle', { + defaultMessage: 'Hi!', + })}

    diff --git a/packages/kbn-search-api-panels/languages/console.ts b/packages/kbn-search-api-panels/languages/console.ts index be924d5fa3cbf..e156409239242 100644 --- a/packages/kbn-search-api-panels/languages/console.ts +++ b/packages/kbn-search-api-panels/languages/console.ts @@ -8,6 +8,8 @@ import { LanguageDefinition } from '../types'; +const INDEX_NAME_PLACEHOLDER = 'index_name'; + export const consoleDefinition: Partial = { buildSearchQuery: `POST /books/_search?pretty { @@ -30,4 +32,8 @@ export const consoleDefinition: Partial = { {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268} { "index" : { "_index" : "books" } } {"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311}`, + ingestDataIndex: ({ indexName }) => `POST _bulk?pretty +{ "index" : { "_index" : "${indexName ?? INDEX_NAME_PLACEHOLDER}" } } +{"name": "foo", "title": "bar"} +`, }; diff --git a/packages/kbn-search-api-panels/types.ts b/packages/kbn-search-api-panels/types.ts index 5aba2d7b46bc0..774dd6c4bc9f0 100644 --- a/packages/kbn-search-api-panels/types.ts +++ b/packages/kbn-search-api-panels/types.ts @@ -30,22 +30,22 @@ export interface LanguageDefinitionSnippetArguments { type CodeSnippet = string | ((args: LanguageDefinitionSnippetArguments) => string); export interface LanguageDefinition { + name: string; + id: Languages; + iconType: string; + docLink?: string; + configureClient?: CodeSnippet; + ingestData?: CodeSnippet; + ingestDataIndex?: CodeSnippet; + installClient?: string; + buildSearchQuery?: CodeSnippet; + testConnection?: CodeSnippet; advancedConfig?: string; apiReference?: string; basicConfig?: string; - configureClient: CodeSnippet; - docLink: string; github?: { link: string; label: string; }; - iconType: string; - id: Languages; - ingestData: CodeSnippet; - ingestDataIndex: CodeSnippet; - installClient: string; languageStyling?: string; - name: string; - buildSearchQuery: CodeSnippet; - testConnection: CodeSnippet; } diff --git a/packages/kbn-search-api-panels/utils.test.ts b/packages/kbn-search-api-panels/utils.test.ts new file mode 100644 index 0000000000000..c842dd03cf275 --- /dev/null +++ b/packages/kbn-search-api-panels/utils.test.ts @@ -0,0 +1,37 @@ +/* + * 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 { consoleDefinition } from './languages/console'; +import { getConsoleRequest } from './utils'; + +describe('utils', () => { + describe('getConsoleRequest()', () => { + test('accepts string values', () => { + const consoleRequest = getConsoleRequest('ingestData'); + expect(consoleRequest).toEqual(consoleDefinition.ingestData); + }); + + test('accepts function values', () => { + const consoleRequest = getConsoleRequest('ingestDataIndex', { + url: 'https://your_deployment_url', + apiKey: 'yourApiKey', + indexName: 'test-index', + }); + expect(consoleRequest).toContain(`POST _bulk?pretty +{ \"index\" : { \"_index\" : \"test-index\" } } +{\"name\": \"foo\", \"title\": \"bar\"}`); + }); + + test('returns undefined if language definition is undefined', () => { + // @ts-ignore TS should not allow an invalid language definition + // We add @ts-ignore here to test the safeguard + const consoleRequest = getConsoleRequest('nonExistentRequest'); + expect(consoleRequest).toEqual(undefined); + }); + }); +}); diff --git a/packages/kbn-search-api-panels/utils.ts b/packages/kbn-search-api-panels/utils.ts index ffd81257c5a30..6cc16439ea2f5 100644 --- a/packages/kbn-search-api-panels/utils.ts +++ b/packages/kbn-search-api-panels/utils.ts @@ -26,7 +26,23 @@ export const getLanguageDefinitionCodeSnippet = ( } }; -export const getConsoleRequest = (code: keyof LanguageDefinition): string | undefined => - code in consoleDefinition && typeof consoleDefinition[code] === 'string' - ? (consoleDefinition[code] as string) - : undefined; +export const getConsoleRequest = ( + code: keyof LanguageDefinition, + args?: LanguageDefinitionSnippetArguments +): string | undefined => { + if (code in consoleDefinition) { + const codeType = consoleDefinition[code]; + + switch (typeof codeType) { + case 'string': + return codeType as string; + case 'function': + if (args) { + return codeType(args) as string; + } + return undefined; + default: + return undefined; + } + } +}; diff --git a/packages/kbn-storybook/templates/index.ejs b/packages/kbn-storybook/templates/index.ejs index 21e1035627aeb..bf40dfb9fd3ca 100644 --- a/packages/kbn-storybook/templates/index.ejs +++ b/packages/kbn-storybook/templates/index.ejs @@ -74,4 +74,4 @@ <% }); %> - + \ No newline at end of file diff --git a/packages/kbn-test/src/es/test_es_cluster.ts b/packages/kbn-test/src/es/test_es_cluster.ts index 31efd5ef709e8..b7b58b88d53d9 100644 --- a/packages/kbn-test/src/es/test_es_cluster.ts +++ b/packages/kbn-test/src/es/test_es_cluster.ts @@ -234,9 +234,9 @@ export function createTestEsCluster< port, clean: true, teardown: true, - ssl: true, background: true, files, + ssl, kill: true, // likely don't need this but avoids any issues where the ESS cluster wasn't cleaned up waitForReady: true, }); diff --git a/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx b/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx index a3b4ef893a771..6dde72c1c22d5 100644 --- a/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx +++ b/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx @@ -58,9 +58,50 @@ export const sourceCommands = { { defaultMessage: `### FROM The \`FROM\` source command returns a table with up to 10,000 documents from a data stream, index, or alias. Each row in the resulting table represents a document. Each column corresponds to a field, and can be accessed by the name of that field. - + +\`\`\` +FROM employees +\`\`\` + +You can use [date math](https://www.elastic.co/guide/en/elasticsearch/reference/current/api-conventions.html#api-date-math-index-names) to refer to indices, aliases and data streams. This can be useful for time series data. + +Use comma-separated lists or wildcards to query multiple data streams, indices, or aliases: + +\`\`\` +FROM employees-00001,employees-* +\`\`\` + +#### Metadata + +ES|QL can access the following metadata fields: + +* \`_index\`: the index to which the document belongs. The field is of the type \`keyword\`. +* \`_id\`: the source document's ID. The field is of the type \`keyword\`. +* \`_version\`: the source document's version. The field is of the type \`long\`. + +Use the \`METADATA\` directive to enable metadata fields: + +\`\`\` +FROM index [METADATA _index, _id] \`\`\` -FROM index + +Metadata fields are only available if the source of the data is an index. Consequently, \`FROM\` is the only source commands that supports the \`METADATA\` directive. + +Once enabled, the fields are then available to subsequent processing commands, just like the other index fields: + +\`\`\` +FROM ul_logs, apps [METADATA _index, _version] +| WHERE id IN (13, 14) AND _version == 1 +| EVAL key = CONCAT(_index, "_", TO_STR(id)) +| SORT id, _index +| KEEP id, _index, _version, key +\`\`\` + +Also, similar to the index fields, once an aggregation is performed, a metadata field will no longer be accessible to subsequent commands, unless used as grouping field: + +\`\`\` +FROM employees [METADATA _index, _id] +| STATS max = MAX(emp_no) BY _index \`\`\` `, description: @@ -277,7 +318,7 @@ In case of name collisions, the newly created fields will override the existing 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.eval.markdown', { defaultMessage: `### EVAL -\`EVAL\` enables you to add new columns to the end of a table: +\`EVAL\` enables you to add new columns: \`\`\` FROM employees @@ -444,7 +485,7 @@ ROW a=[1,2,3], b="b", j=["a","b"] Use \`RENAME\` to rename a column using the following syntax: \`\`\` -RENAME = +RENAME AS \`\`\` For example: @@ -452,7 +493,7 @@ For example: \`\`\` FROM employees | KEEP first_name, last_name, still_hired -| RENAME employed = still_hired +| RENAME still_hired AS employed \`\`\` If a column with the new name already exists, it will be replaced by the new column. @@ -462,7 +503,7 @@ Multiple columns can be renamed with a single \`RENAME\` command: \`\`\` FROM employees | KEEP first_name, last_name -| RENAME fn = first_name, ln = last_name +| RENAME first_name AS fn, last_name AS ln \`\`\` `, description: @@ -600,56 +641,11 @@ FROM employees \`\`\` #### Operators -These binary comparison operators are supported: - -* equality: \`==\` -* inequality: \`!=\` -* less than: \`<\` -* less than or equal: \`<=\` -* larger than: \`>\` -* larger than or equal: \`>=\` -The \`IN\` operator allows testing whether a field or expression equals an element in a list of literals, fields or expressions: - -\`\`\` -ROW a = 1, b = 4, c = 3 -| WHERE c-a IN (3, b / 2, a) -\`\`\` - -For string comparison using wildcards or regular expressions, use \`LIKE\` or \`RLIKE\`: - -* Use \`LIKE\` to match strings using wildcards. The following wildcard characters are supported: - * \`*\` matches zero or more characters. - * \`?\` matches one character. - - \`\`\` - FROM employees - | WHERE first_name LIKE "?b*" - | KEEP first_name, last_name - \`\`\` - -* Use \`RLIKE\` to match strings using [regular expressions](https://www.elastic.co/guide/en/elasticsearch/reference/current/regexp-syntax.html): - - \`\`\` - FROM employees - | WHERE first_name RLIKE ".leja.*" - | KEEP first_name, last_name - \`\`\` - -You can use the following boolean operators: - -* \`AND\` -* \`OR\` -* \`NOT\` - -\`\`\` -FROM employees -| KEEP first_name, last_name, height, still_hired -| WHERE height > 2 AND NOT still_hired -\`\`\` +Refer to **Operators** for an overview of the supported operators. #### Functions -\`WHERE\` supports various functions for calculating values. Refer to Functions for more information. +\`WHERE\` supports various functions for calculating values. Refer to **Functions** for more information. `, description: 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', @@ -691,6 +687,114 @@ Returns the absolute value. FROM employees | KEEP first_name, last_name, height | EVAL abs_height = ABS(0.0 - height) +\`\`\` + `, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + )} + /> + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.acosFunction', + { + defaultMessage: 'ACOS', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.asinFunction', + { + defaultMessage: 'ASIN', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.atanFunction', + { + defaultMessage: 'ATAN', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.atan2Function', + { + defaultMessage: 'ATAN2', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.eFunction', + { + defaultMessage: 'E', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.floorFunction', + { + defaultMessage: 'FLOOR', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.greatestFunction', + { + defaultMessage: 'GREATEST', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.isFiniteFunction', + { + defaultMessage: 'IS_FINITE', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.isInfiniteFunction', + { + defaultMessage: 'IS_INFINITE', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.isNanFunction', + { + defaultMessage: 'IS_NAN', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.leastFunction', + { + defaultMessage: 'LEAST', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.leftFunction', + { + defaultMessage: 'LEFT', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.lengthFunction', + { + defaultMessage: 'LENGTH', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.ltrimunction', + { + defaultMessage: 'LTRIM', + } + ), + description: ( + ), }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.nowFunction', + { + defaultMessage: 'NOW', + } + ), + description: ( + + ), + }, { label: i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.piFunction', @@ -1471,7 +1878,7 @@ NOTE: The input type can be any number and the output type is the same as the in 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.piFunction.markdown', { defaultMessage: `### PI -The ratio of a circle’s circumference to its diameter. +The ratio of a circle's circumference to its diameter. \`\`\` ROW PI() @@ -1497,11 +1904,81 @@ ROW PI() 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.powFunction.markdown', { defaultMessage: `### POW -Returns the the value of a base (first argument) raised to a power (second argument). +Returns the the value of a base (first argument) raised to a power (second argument). Both arguments must be numeric. \`\`\` ROW base = 2.0, exponent = 2.0 | EVAL s = POW(base, exponent) +\`\`\` + +#### Type rules + +The type of the returned value is determined by the types of the base and exponent. The following rules are applied to determine the result type: + +* If either of the base or exponent are of a floating point type, the result will be a double +* Otherwise, if either the base or the exponent are 64-bit (long or unsigned long), the result will be a long +* Otherwise, the result will be a 32-bit integer (this covers all other numeric types, including int, short and byte) + +For example, using simple integers as arguments will lead to an integer result: + +\`\`\` +ROW base = 2, exponent = 2 +| EVAL s = POW(base, exponent) +\`\`\` + +Note: the actual power function is performed using double precision values for all cases. This means that for very large non-floating point values there is a small chance that the operation can lead to slightly different answers than expected. However, a more likely outcome of very large non-floating point values is numerical overflow. + +#### Arithmetic errors + +Arithmetic errors and numeric overflow do not result in an error. Instead, the result will be \`null\` and a warning for the \`ArithmeticException\` added. For example: + +\`\`\` +ROW x = POW(9223372036854775808, 2) +\`\`\` + +If it is desired to protect against numerical overruns, use \`TO_DOUBLE\` on either of the arguments: + +\`\`\` +ROW x = POW(9223372036854775808, TO_DOUBLE(1)) +\`\`\` + +#### Fractional exponents + +The exponent can be a fraction, which is similar to performing a root. For example, the exponent of 0.5 will give the square root of the base: + +\`\`\` +ROW base = 4, exponent = 0.5 +| EVAL s = POW(base, exponent) +\`\`\` + `, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + )} + /> + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.rightFunction', + { + defaultMessage: 'RIGHT', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.rtrimFunction', + { + defaultMessage: 'RTRIM', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sinFunction', + { + defaultMessage: 'SIN', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sinhFunction', + { + defaultMessage: 'SINH', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.sqrtFunction', + { + defaultMessage: 'SQRT', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tanFunction', + { + defaultMessage: 'TAN', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.tanhFunction', + { + defaultMessage: 'TANH', + } + ), + description: ( + ), }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDegreesFunction', + { + defaultMessage: 'TO_DEGREES', + } + ), + description: ( + + ), + }, { label: i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toDoubleFunction', @@ -1927,11 +2600,40 @@ Returning: 2147483648 | 2147483648.2 | foo | 2147483648 | 2147483648 | null \`\`\` -Note that in this example, the last conversion of the string isn’t possible. When this happens, the result is a **null** value. +Note that in this example, the last conversion of the string isn't possible. When this happens, the result is a **null** value. If the input parameter is of a date type, its value will be interpreted as milliseconds since the Unix epoch, converted to integer. -Boolean **true** will be converted to long **1**, **false** to **0**. +Boolean \`true\` will be converted to long \`1\`, \`false\` to \`0\`. + `, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + )} + /> + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toRadiansFunction', + { + defaultMessage: 'TO_RADIANS', + } + ), + description: ( + ), }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toUnsignedLongFunction', + { + defaultMessage: 'TO_UNSIGNED_LONG', + } + ), + description: ( + + ), + }, { label: i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.toVersionFunction', @@ -2316,3 +3065,176 @@ FROM employees }, ], }; + +export const operators = { + label: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.operators', { + defaultMessage: 'Operators', + }), + description: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.operatorsDocumentationESQLDescription', + { + defaultMessage: `ES|QL supports the following operators:`, + } + ), + items: [ + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.binaryOperators', + { + defaultMessage: 'Binary operators', + } + ), + description: ( + \` +* larger than or equal: \`>=\` + `, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + )} + /> + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.booleanOperators', + { + defaultMessage: 'Boolean operators', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.inOperator', + { + defaultMessage: 'IN', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.stringOperators', + { + defaultMessage: 'LIKE and RLIKE', + } + ), + description: ( + + ), + }, + { + label: i18n.translate( + 'textBasedEditor.query.textBasedLanguagesEditor.documentationESQL.predicates', + { + defaultMessage: 'NULL values', + } + ), + description: ( + + ), + }, + ], +}; diff --git a/packages/kbn-text-based-editor/src/helpers.ts b/packages/kbn-text-based-editor/src/helpers.ts index fd7c9c2f9406d..6b4e99f6e3093 100644 --- a/packages/kbn-text-based-editor/src/helpers.ts +++ b/packages/kbn-text-based-editor/src/helpers.ts @@ -139,15 +139,21 @@ export const getDocumentationSections = async (language: string) => { }; } if (language === 'esql') { - const { sourceCommands, processingCommands, initialSection, functions, aggregationFunctions } = - await import('./esql_documentation_sections'); + const { + sourceCommands, + processingCommands, + initialSection, + functions, + aggregationFunctions, + operators, + } = await import('./esql_documentation_sections'); groups.push({ label: i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.esql', { defaultMessage: 'ES|QL', }), items: [], }); - groups.push(sourceCommands, processingCommands, functions, aggregationFunctions); + groups.push(sourceCommands, processingCommands, functions, aggregationFunctions, operators); return { groups, initialSection, diff --git a/packages/kbn-unified-data-table/index.ts b/packages/kbn-unified-data-table/index.ts index 2c5e995619436..cc692420cd209 100644 --- a/packages/kbn-unified-data-table/index.ts +++ b/packages/kbn-unified-data-table/index.ts @@ -9,6 +9,7 @@ export { UnifiedDataTable, DataLoadingState } from './src/components/data_table'; export type { UnifiedDataTableProps } from './src/components/data_table'; export { getDisplayedColumns } from './src/utils/columns'; +export { ROWS_HEIGHT_OPTIONS } from './src/constants'; export { JSONCodeEditorCommonMemoized } from './src/components/json_code_editor/json_code_editor_common'; diff --git a/packages/kbn-unified-data-table/src/components/data_table.scss b/packages/kbn-unified-data-table/src/components/data_table.scss index 8b0f8719a450f..048a641cf7562 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.scss +++ b/packages/kbn-unified-data-table/src/components/data_table.scss @@ -3,32 +3,6 @@ max-width: 100%; height: 100%; overflow: hidden; - border-radius: $euiBorderRadius; - - .euiDataGrid__controls { - border: none; - border-bottom: $euiBorderThin; - } - - .euiDataGridRowCell.euiDataGridRowCell--firstColumn { - border-left: none; - padding: 0; - } - - .euiDataGridRowCell.euiDataGridRowCell--lastColumn { - border-right: none; - } - - .unifiedDataTable__table .euiDataGridRowCell:first-of-type, - .unifiedDataTable__table .euiDataGrid--headerShade.euiDataGrid--bordersAll .euiDataGridHeaderCell:first-of-type { - border-left: none; - border-right: none; - } - - .euiDataGridRowCell:last-of-type, - .euiDataGridHeaderCell:last-of-type { - border-right: none; - } } .unifiedDataTable__cellValue { @@ -57,6 +31,29 @@ flex-direction: column; flex-wrap: nowrap; height: 100%; + + .euiDataGrid__content { + background: transparent; + } + + .euiDataGrid__controls { + border-top: $euiBorderThin; + } + + .euiDataGrid--headerUnderline .euiDataGridHeaderCell { + border-bottom: $euiBorderThin; + } + + .euiDataGridRowCell.euiDataGridRowCell--controlColumn[data-gridcell-column-id='openDetails'], + .euiDataGridRowCell.euiDataGridRowCell--controlColumn[data-gridcell-column-id='select'] { + padding-left: 0; + padding-right: 0; + } + + .euiDataGrid--rowHoverHighlight .euiDataGridRow:hover, + .euiDataGrid--rowHoverHighlight .euiDataGridRow:hover .euiDataGridRowCell__contentByHeight + .euiDataGridRowCell__expandActions { + background-color: tintOrShade($euiColorLightShade, 50%, 0); + } } .unifiedDataTable__table { @@ -65,14 +62,6 @@ min-height: 0; } -.unifiedDataTable__footer { - flex-shrink: 0; - background-color: $euiColorLightShade; - padding: $euiSize / 2 $euiSize; - margin-top: $euiSize / 4; - text-align: center; -} - .unifiedDataTable__flyoutHeader { white-space: nowrap; } @@ -118,7 +107,35 @@ @include euiTextTruncate; } +.unifiedDataTable__rowControl { + // fine-tuning the vertical alignment with the text for any row height setting + margin-top: -3px; + .euiDataGridRowCell__truncate & { // "Single line" row height setting + margin-top: 0; + } +} + +.unifiedDataTable__descriptionList { + // force the content truncation when "Single line" row height setting is active + .euiDataGridRowCell__truncate & { + -webkit-line-clamp: 1; + display: -webkit-box; + -webkit-box-orient: vertical; + height: 100%; + overflow: hidden; + } +} + +.unifiedDataTable__descriptionListTitle { + margin-inline: 0 0; + padding-inline: 0; + background: transparent; + font-weight: $euiFontWeightBold; +} + .unifiedDataTable__descriptionListDescription { + margin-inline: $euiSizeS $euiSizeS; + padding-inline: 0; word-break: break-all; white-space: normal; diff --git a/packages/kbn-unified-data-table/src/components/data_table_columns.test.tsx b/packages/kbn-unified-data-table/src/components/data_table_columns.test.tsx index 01246603643fd..7eceeda173809 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_columns.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_columns.test.tsx @@ -218,7 +218,7 @@ describe('Data table columns', function () {
    , "displayAsText": "timestamp", "id": "timestamp", - "initialWidth": 210, + "initialWidth": 212, "isSortable": true, "schema": "datetime", "visibleCellActions": undefined, @@ -406,7 +406,7 @@ describe('Data table columns', function () { , "displayAsText": "timestamp", "id": "timestamp", - "initialWidth": 210, + "initialWidth": 212, "isSortable": true, "schema": "datetime", "visibleCellActions": undefined, diff --git a/packages/kbn-unified-data-table/src/components/data_table_columns.tsx b/packages/kbn-unified-data-table/src/components/data_table_columns.tsx index 4b66f2a2bd6cf..4b4ac622e78f6 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_columns.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_columns.tsx @@ -30,7 +30,7 @@ import { buildEditFieldButton } from './build_edit_field_button'; const openDetails = { id: 'openDetails', - width: 24, + width: 26, headerCellRender: () => ( diff --git a/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx b/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx index 213e24790e840..bb0a0dc2b775a 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_document_selection.tsx @@ -15,14 +15,19 @@ import { EuiCopy, EuiDataGridCellValueElementProps, EuiPopover, + EuiFlexGroup, + EuiFlexItem, + useEuiTheme, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { euiDarkVars as themeDark, euiLightVars as themeLight } from '@kbn/ui-theme'; import { i18n } from '@kbn/i18n'; +import { css } from '@emotion/react'; import type { DataTableRecord } from '@kbn/discover-utils/types'; import { UnifiedDataTableContext } from '../table_context'; export const SelectButton = ({ rowIndex, setCellProps }: EuiDataGridCellValueElementProps) => { + const { euiTheme } = useEuiTheme(); const { selectedDocs, expanded, rows, isDarkMode, setSelectedDocs } = useContext(UnifiedDataTableContext); const doc = useMemo(() => rows[rowIndex], [rows, rowIndex]); @@ -46,20 +51,33 @@ export const SelectButton = ({ rowIndex, setCellProps }: EuiDataGridCellValueEle }, [expanded, doc, setCellProps, isDarkMode]); return ( - { - if (checked) { - const newSelection = selectedDocs.filter((docId) => docId !== doc.id); - setSelectedDocs(newSelection); - } else { - setSelectedDocs([...selectedDocs, doc.id]); - } - }} - /> + + + { + if (checked) { + const newSelection = selectedDocs.filter((docId) => docId !== doc.id); + setSelectedDocs(newSelection); + } else { + setSelectedDocs([...selectedDocs, doc.id]); + } + }} + /> + + ); }; diff --git a/packages/kbn-unified-data-table/src/components/data_table_expand_button.tsx b/packages/kbn-unified-data-table/src/components/data_table_expand_button.tsx index 108ffaa4ec5fe..c44ea74791b33 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_expand_button.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_expand_button.tsx @@ -62,23 +62,25 @@ export const ExpandButton = ({ rowIndex, setCellProps }: EuiDataGridCellValueEle } return ( - - { - const nextHit = isCurrentRowExpanded ? undefined : current; - toolTipRef.current?.hideToolTip(); - setPressed(Boolean(nextHit)); - setExpanded?.(nextHit); - }} - color={isCurrentRowExpanded ? 'primary' : 'text'} - iconType={isCurrentRowExpanded ? 'minimize' : 'expand'} - isSelected={isCurrentRowExpanded} - /> - +
    + + { + const nextHit = isCurrentRowExpanded ? undefined : current; + toolTipRef.current?.hideToolTip(); + setPressed(Boolean(nextHit)); + setExpanded?.(nextHit); + }} + color={isCurrentRowExpanded ? 'primary' : 'text'} + iconType={isCurrentRowExpanded ? 'minimize' : 'expand'} + isSelected={isCurrentRowExpanded} + /> + +
    ); }; diff --git a/packages/kbn-unified-data-table/src/constants.ts b/packages/kbn-unified-data-table/src/constants.ts index 1fb391ddc7f70..6b5dda5ca54b8 100644 --- a/packages/kbn-unified-data-table/src/constants.ts +++ b/packages/kbn-unified-data-table/src/constants.ts @@ -11,17 +11,30 @@ export const DEFAULT_ROWS_PER_PAGE = 100; export const MAX_LOADED_GRID_ROWS = 10000; export const ROWS_PER_PAGE_OPTIONS = [10, 25, 50, DEFAULT_ROWS_PER_PAGE, 250, 500]; +/** + * Row height might be a value from -1 to 20 + * A value of -1 automatically adjusts the row height to fit the contents. + * A value of 0 displays the content in a single line. + * A value from 1 to 20 represents number of lines of Document explorer row to display. + */ +export const ROWS_HEIGHT_OPTIONS = { + auto: -1, + single: 0, + default: -1, +}; export const defaultMonacoEditorWidth = 370; -export const defaultTimeColumnWidth = 210; +export const defaultTimeColumnWidth = 212; export const kibanaJSON = 'kibana-json'; -export const GRID_STYLE = { - border: 'all', +export const GRID_STYLE: EuiDataGridStyle = { + border: 'horizontal', fontSize: 's', - cellPadding: 's', - rowHover: 'none', -} as EuiDataGridStyle; + cellPadding: 'l', + rowHover: 'highlight', + header: 'underline', + stripes: true, +}; export const toolbarVisibility = { showColumnSelector: { diff --git a/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.test.tsx b/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.test.tsx index 2da08c178720a..1ef0d9c70d139 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.test.tsx +++ b/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.test.tsx @@ -11,8 +11,6 @@ import { Storage } from '@kbn/kibana-utils-plugin/public'; import { LocalStorageMock } from '../../__mocks__/local_storage_mock'; import { useRowHeightsOptions } from './use_row_heights_options'; -const CONFIG_ROW_HEIGHT = 3; - describe('useRowHeightsOptions', () => { test('should apply rowHeight from savedSearch', () => { const { result } = renderHook(() => { @@ -32,7 +30,7 @@ describe('useRowHeightsOptions', () => { storage: new LocalStorageMock({ ['discover:dataGridRowHeight']: { previousRowHeight: 5, - previousConfigRowHeight: 3, + previousConfigRowHeight: -1, }, }) as unknown as Storage, consumer: 'discover', @@ -52,7 +50,7 @@ describe('useRowHeightsOptions', () => { }); expect(result.current.defaultHeight).toEqual({ - lineCount: CONFIG_ROW_HEIGHT, + lineCount: 3, }); }); @@ -61,8 +59,8 @@ describe('useRowHeightsOptions', () => { return useRowHeightsOptions({ storage: new LocalStorageMock({ ['discover:dataGridRowHeight']: { - previousRowHeight: 4, - // different from uiSettings (config), now user changed it to 3, but prev was 4 + previousRowHeight: 5, + // different from uiSettings (config), now user changed it to -1, but prev was 4 previousConfigRowHeight: 4, }, }) as unknown as Storage, @@ -70,8 +68,6 @@ describe('useRowHeightsOptions', () => { }); }); - expect(result.current.defaultHeight).toEqual({ - lineCount: CONFIG_ROW_HEIGHT, - }); + expect(result.current.defaultHeight).toEqual('auto'); }); }); diff --git a/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.ts b/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.ts index 9d460c8ea2ba9..727677a42e7df 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.ts +++ b/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.ts @@ -15,6 +15,7 @@ import { getStoredRowHeight, updateStoredRowHeight, } from '../utils/row_heights'; +import { ROWS_HEIGHT_OPTIONS } from '../constants'; interface UseRowHeightProps { rowHeightState?: number; @@ -24,36 +25,26 @@ interface UseRowHeightProps { consumer: string; } -/** - * Row height might be a value from -1 to 20 - * A value of -1 automatically adjusts the row height to fit the contents. - * A value of 0 displays the content in a single line. - * A value from 1 to 20 represents number of lines of Document explorer row to display. - */ -const SINGLE_ROW_HEIGHT_OPTION = 0; -const AUTO_ROW_HEIGHT_OPTION = -1; -const DEFAULT_ROW_HEIGHT_OPTION = 3; - /** * Converts rowHeight of EuiDataGrid to rowHeight number (-1 to 20) */ const serializeRowHeight = (rowHeight?: EuiDataGridRowHeightOption): number => { - if (rowHeight === 'auto') { - return AUTO_ROW_HEIGHT_OPTION; + if (rowHeight === 'auto' || rowHeight === ROWS_HEIGHT_OPTIONS.auto) { + return ROWS_HEIGHT_OPTIONS.auto; } else if (typeof rowHeight === 'object' && rowHeight.lineCount) { return rowHeight.lineCount; // custom } - return SINGLE_ROW_HEIGHT_OPTION; + return ROWS_HEIGHT_OPTIONS.single; }; /** * Converts rowHeight number (-1 to 20) of EuiDataGrid rowHeight */ const deserializeRowHeight = (number: number): EuiDataGridRowHeightOption | undefined => { - if (number === AUTO_ROW_HEIGHT_OPTION) { + if (number === ROWS_HEIGHT_OPTIONS.auto) { return 'auto'; - } else if (number === SINGLE_ROW_HEIGHT_OPTION) { + } else if (number === ROWS_HEIGHT_OPTIONS.single) { return undefined; } @@ -64,7 +55,7 @@ export const useRowHeightsOptions = ({ rowHeightState, onUpdateRowHeight, storage, - configRowHeight = DEFAULT_ROW_HEIGHT_OPTION, + configRowHeight = ROWS_HEIGHT_OPTIONS.default, consumer, }: UseRowHeightProps) => { return useMemo((): EuiDataGridRowHeightsOptions => { @@ -84,11 +75,16 @@ export const useRowHeightsOptions = ({ rowHeight = configRowHeight; } + const defaultHeight = deserializeRowHeight(rowHeight); + return { - defaultHeight: deserializeRowHeight(rowHeight), + defaultHeight, lineHeight: '1.6em', onChange: ({ defaultHeight: newRowHeight }: EuiDataGridRowHeightsOptions) => { - const newSerializedRowHeight = serializeRowHeight(newRowHeight); + const newSerializedRowHeight = serializeRowHeight( + // pressing "Reset to default" triggers onChange with the same value + newRowHeight === defaultHeight ? configRowHeight : newRowHeight + ); updateStoredRowHeight(newSerializedRowHeight, configRowHeight, storage, consumer); onUpdateRowHeight?.(newSerializedRowHeight); }, diff --git a/packages/kbn-unified-data-table/src/utils/get_render_cell_value.test.tsx b/packages/kbn-unified-data-table/src/utils/get_render_cell_value.test.tsx index 941dccabf2474..0f6624a120b9c 100644 --- a/packages/kbn-unified-data-table/src/utils/get_render_cell_value.test.tsx +++ b/packages/kbn-unified-data-table/src/utils/get_render_cell_value.test.tsx @@ -212,7 +212,9 @@ describe('Unified data table cell rendering', function () { compressed={true} type="inline" > - + extension - + bytesDisplayName - + _index - + _score - + extension - + bytesDisplayName - + _index - + _score - + extension - + bytesDisplayName - + _index - + _score - + object.value - + object.value {pairs.map(([key, value]) => ( - {key} + + {key} + renders properly with a drag handl "aria-label": "Preview bytes: number", } } - className="unifiedFieldListItemButton unifiedFieldListItemButton--number unifiedFieldListItemButton--exists custom" + className="unifiedFieldListItemButton unifiedFieldListItemButton--number unifiedFieldListItemButton--exists unifiedFieldListItemButton--withDragHandle custom" dataTestSubj="test-subj" dragHandle={ diff --git a/packages/kbn-unified-field-list/src/components/field_item_button/field_item_button.tsx b/packages/kbn-unified-field-list/src/components/field_item_button/field_item_button.tsx index 13860a0e4f155..c9be7af08638c 100644 --- a/packages/kbn-unified-field-list/src/components/field_item_button/field_item_button.tsx +++ b/packages/kbn-unified-field-list/src/components/field_item_button/field_item_button.tsx @@ -105,6 +105,7 @@ export function FieldItemButton({ [`unifiedFieldListItemButton--${type}`]: type, [`unifiedFieldListItemButton--exists`]: !isEmpty, [`unifiedFieldListItemButton--missing`]: isEmpty, + [`unifiedFieldListItemButton--withDragHandle`]: Boolean(otherProps.dragHandle), }, className ); diff --git a/packages/kbn-unified-field-list/src/components/field_list_filters/field_list_filters.tsx b/packages/kbn-unified-field-list/src/components/field_list_filters/field_list_filters.tsx index e1834dd8fd5f0..4410bc82eeef8 100644 --- a/packages/kbn-unified-field-list/src/components/field_list_filters/field_list_filters.tsx +++ b/packages/kbn-unified-field-list/src/components/field_list_filters/field_list_filters.tsx @@ -23,6 +23,7 @@ export interface FieldListFiltersProps { getCustomFieldType?: FieldTypeFilterProps['getCustomFieldType']; onSupportedFieldFilter?: FieldTypeFilterProps['onSupportedFieldFilter']; onChangeFieldTypes: FieldTypeFilterProps['onChange']; + compressed?: FieldNameSearchProps['compressed']; nameFilter: FieldNameSearchProps['nameFilter']; screenReaderDescriptionId?: FieldNameSearchProps['screenReaderDescriptionId']; onChangeNameFilter: FieldNameSearchProps['onChange']; @@ -38,6 +39,7 @@ export interface FieldListFiltersProps { * @param getCustomFieldType * @param onSupportedFieldFilter * @param onChangeFieldTypes + * @param compressed * @param nameFilter * @param screenReaderDescriptionId * @param onChangeNameFilter @@ -52,6 +54,7 @@ function InnerFieldListFilters({ getCustomFieldType, onSupportedFieldFilter, onChangeFieldTypes, + compressed, nameFilter, screenReaderDescriptionId, onChangeNameFilter, @@ -72,6 +75,7 @@ function InnerFieldListFilters({ /> ) : undefined } + compressed={compressed} nameFilter={nameFilter} screenReaderDescriptionId={screenReaderDescriptionId} onChange={onChangeNameFilter} diff --git a/packages/kbn-unified-field-list/src/components/field_list_filters/field_name_search.tsx b/packages/kbn-unified-field-list/src/components/field_list_filters/field_name_search.tsx index 91d78850e4453..faf146adfd831 100644 --- a/packages/kbn-unified-field-list/src/components/field_list_filters/field_name_search.tsx +++ b/packages/kbn-unified-field-list/src/components/field_list_filters/field_name_search.tsx @@ -16,6 +16,7 @@ import { EuiFieldSearch, type EuiFieldSearchProps } from '@elastic/eui'; export interface FieldNameSearchProps { 'data-test-subj': string; append?: EuiFieldSearchProps['append']; + compressed?: EuiFieldSearchProps['compressed']; nameFilter: string; screenReaderDescriptionId?: string; onChange: (nameFilter: string) => unknown; @@ -25,6 +26,7 @@ export interface FieldNameSearchProps { * Search input for fields list * @param dataTestSubject * @param append + * @param compressed * @param nameFilter * @param screenReaderDescriptionId * @param onChange @@ -33,6 +35,7 @@ export interface FieldNameSearchProps { export const FieldNameSearch: React.FC = ({ 'data-test-subj': dataTestSubject, append, + compressed, nameFilter, screenReaderDescriptionId, onChange, @@ -52,6 +55,7 @@ export const FieldNameSearch: React.FC = ({ placeholder={searchPlaceholder} value={nameFilter} append={append} + compressed={compressed} /> ); }; diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.test.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.test.tsx index 6ccbf54516995..4feeb9b1be23e 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.test.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.test.tsx @@ -82,6 +82,7 @@ async function getComponent({ isEmpty: false, groupIndex: 1, itemIndex: 0, + size: 'xs', workspaceSelectedFieldNames: [], }; const comp = await mountWithIntl(); diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx index 837818399eccf..745d463b28386 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx @@ -33,6 +33,7 @@ import type { interface GetCommonFieldItemButtonPropsParams { stateService: UnifiedFieldListSidebarContainerStateService; field: DataViewField; + size: FieldItemButtonProps['size']; isSelected: boolean; toggleDisplay: (field: DataViewField, isSelected?: boolean) => void; } @@ -40,10 +41,12 @@ interface GetCommonFieldItemButtonPropsParams { function getCommonFieldItemButtonProps({ stateService, field, + size, isSelected, toggleDisplay, }: GetCommonFieldItemButtonPropsParams): { field: FieldItemButtonProps['field']; + size: FieldItemButtonProps['size']; isSelected: FieldItemButtonProps['isSelected']; buttonAddFieldToWorkspaceProps?: FieldItemButtonProps['buttonAddFieldToWorkspaceProps']; buttonRemoveFieldFromWorkspaceProps?: FieldItemButtonProps['buttonRemoveFieldFromWorkspaceProps']; @@ -54,6 +57,7 @@ function getCommonFieldItemButtonProps({ field.name === '_source' ? undefined : (f: DataViewField) => toggleDisplay(f, isSelected); return { field, + size, isSelected, buttonAddFieldToWorkspaceProps: stateService.creationOptions.buttonAddFieldToWorkspaceProps, buttonRemoveFieldFromWorkspaceProps: @@ -68,10 +72,11 @@ interface MultiFieldsProps { multiFields: NonNullable; toggleDisplay: (field: DataViewField) => void; alwaysShowActionButton: boolean; + size: FieldItemButtonProps['size']; } const MultiFields: React.FC = memo( - ({ stateService, multiFields, toggleDisplay, alwaysShowActionButton }) => ( + ({ stateService, multiFields, toggleDisplay, alwaysShowActionButton, size }) => (
    @@ -84,7 +89,6 @@ const MultiFields: React.FC = memo( {multiFields.map((entry) => ( = memo( field: entry.field, isSelected: entry.isSelected, toggleDisplay, + size, })} /> ))} @@ -187,6 +192,10 @@ export interface UnifiedFieldListItemProps { * Item index in the field list */ itemIndex: number; + /** + * Item size + */ + size: FieldItemButtonProps['size']; } function UnifiedFieldListItemComponent({ @@ -209,6 +218,7 @@ function UnifiedFieldListItemComponent({ workspaceSelectedFieldNames, groupIndex, itemIndex, + size, }: UnifiedFieldListItemProps) { const [infoIsOpen, setOpen] = useState(false); @@ -284,6 +294,7 @@ function UnifiedFieldListItemComponent({ multiFields={multiFields} alwaysShowActionButton={alwaysShowActionButton} toggleDisplay={toggleDisplay} + size={size} /> )} @@ -315,6 +326,8 @@ function UnifiedFieldListItemComponent({ [field, itemIndex] ); const order = useMemo(() => [0, groupIndex, itemIndex], [groupIndex, itemIndex]); + const isDragDisabled = + alwaysShowActionButton || stateService.creationOptions.disableFieldListItemDragAndDrop; return ( } diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss index d01d93c345ef9..b646d60ec3b0f 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss @@ -6,6 +6,11 @@ width: $euiSize * 19; height: 100%; + &--collapsed { + width: auto; + padding: $euiSizeS $euiSizeS 0; + } + @include euiBreakpoint('xs', 's') { width: 100%; padding: $euiSize; @@ -14,7 +19,7 @@ } .unifiedFieldListSidebar__list { - padding: $euiSizeS 0 $euiSizeS $euiSizeS; + padding: $euiSizeS $euiSizeS 0; @include euiBreakpoint('xs', 's') { padding: $euiSizeS 0 0 0; @@ -38,3 +43,18 @@ .unifiedFieldListSidebar__flyoutHeader { align-items: center; } + +.unifiedFieldListSidebar .unifiedFieldListItemButton { + &.kbnFieldButton { + margin-bottom: $euiSizeXS / 2; + } + + &.domDragDrop-isDraggable { + box-shadow: none; + } + + &:not(.unifiedFieldListItemButton__dragging) { + padding: 0; + background: none; + } +} diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx index 12eb7209cd05a..fb90e2b36d39e 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx @@ -9,16 +9,29 @@ import './field_list_sidebar.scss'; import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiPageSidebar } from '@elastic/eui'; +import { css } from '@emotion/react'; +import classnames from 'classnames'; +import { + EuiButton, + EuiButtonProps, + EuiFlexGroup, + EuiFlexItem, + EuiHideFor, + EuiPageSidebar, + EuiPageSidebarProps, + useEuiTheme, +} from '@elastic/eui'; +import { ToolbarButton } from '@kbn/shared-ux-button-toolbar'; import { type DataViewField } from '@kbn/data-views-plugin/public'; import { getDataViewFieldSubtypeMulti } from '@kbn/es-query/src/utils'; import { FIELDS_LIMIT_SETTING, SEARCH_FIELDS_FROM_SOURCE } from '@kbn/discover-utils'; import { FieldList } from '../../components/field_list'; import { FieldListFilters } from '../../components/field_list_filters'; import { FieldListGrouped, type FieldListGroupedProps } from '../../components/field_list_grouped'; -import { FieldsGroupNames } from '../../types'; +import { FieldsGroupNames, type ButtonAddFieldVariant } from '../../types'; import { GroupedFieldsParams, useGroupedFields } from '../../hooks/use_grouped_fields'; import { UnifiedFieldListItem, type UnifiedFieldListItemProps } from '../unified_field_list_item'; +import { SidebarToggleButton, type SidebarToggleButtonProps } from './sidebar_toggle_button'; import { getSelectedFields, shouldShowField, @@ -46,6 +59,11 @@ export type UnifiedFieldListSidebarCustomizableProps = Pick< */ showFieldList?: boolean; + /** + * Compressed view + */ + compressed?: boolean; + /** * Custom logic for determining which field is selected */ @@ -83,6 +101,22 @@ interface UnifiedFieldListSidebarInternalProps { */ alwaysShowActionButton?: UnifiedFieldListItemProps['alwaysShowActionButton']; + /** + * What button style type to use + */ + buttonAddFieldVariant: ButtonAddFieldVariant; + + /** + * In case if sidebar is collapsible by default + * Pass `undefined` to hide the collapse/expand buttons from the sidebar + */ + isSidebarCollapsed?: boolean; + + /** + * A handler to toggle the sidebar + */ + onToggleSidebar?: SidebarToggleButtonProps['onChange']; + /** * Trigger a field editing */ @@ -104,10 +138,13 @@ export const UnifiedFieldListSidebarComponent: React.FC { const { dataViews, core } = services; const useNewFieldsApi = useMemo( @@ -210,6 +248,7 @@ export const UnifiedFieldListSidebarComponent: React.FC + ) : null; + + const pageSidebarProps: Partial = { + className: classnames('unifiedFieldListSidebar', { + 'unifiedFieldListSidebar--collapsed': isSidebarCollapsed, + }), + 'aria-label': i18n.translate( + 'unifiedFieldList.fieldListSidebar.indexAndFieldsSectionAriaLabel', + { + defaultMessage: 'Index and fields', } - > + ), + id: + stateService.creationOptions.dataTestSubj?.fieldListSidebarDataTestSubj ?? + 'unifiedFieldListSidebarId', + 'data-test-subj': + stateService.creationOptions.dataTestSubj?.fieldListSidebarDataTestSubj ?? + 'unifiedFieldListSidebarId', + }; + + if (isSidebarCollapsed && sidebarToggleButton) { + return ( + +
    {sidebarToggleButton}
    +
    + ); + } + + const hasButtonAddFieldToolbarStyle = buttonAddFieldVariant === 'toolbar'; + const buttonAddFieldCommonProps: Partial = { + size: 's', + iconType: 'indexOpen', + 'data-test-subj': + stateService.creationOptions.dataTestSubj?.fieldListAddFieldButtonTestSubj ?? + 'unifiedFieldListAddField', + }; + const buttonAddFieldLabel = i18n.translate( + 'unifiedFieldList.fieldListSidebar.addFieldButtonLabel', + { + defaultMessage: 'Add a field', + } + ); + + return ( + - {Boolean(prepend) && {prepend}} + {Boolean(prepend) && ( + + {prepend} + + )} } + prepend={ + + {sidebarToggleButton && ( + {sidebarToggleButton} + )} + + + + + } className="unifiedFieldListSidebar__list" > {showFieldList ? ( @@ -293,25 +387,33 @@ export const UnifiedFieldListSidebarComponent: React.FC )} - {!!onEditField && ( - - onEditField()} - size="s" - > - {i18n.translate('unifiedFieldList.fieldListSidebar.addFieldButtonLabel', { - defaultMessage: 'Add a field', - })} - - - )} + {!!onEditField && ( + + {hasButtonAddFieldToolbarStyle ? ( + onEditField()} + /> + ) : ( + onEditField()}> + {buttonAddFieldLabel} + + )} + + )} ); diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar_container.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar_container.tsx index 4765280b4ef68..520a64f8d69b0 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar_container.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar_container.tsx @@ -35,6 +35,7 @@ import { type ExistingFieldsFetcher, } from '../../hooks/use_existing_fields'; import { useQuerySubscriber } from '../../hooks/use_query_subscriber'; +import { useSidebarToggle } from '../../hooks/use_sidebar_toggle'; import { UnifiedFieldListSidebar, type UnifiedFieldListSidebarCustomizableProps, @@ -72,11 +73,6 @@ export type UnifiedFieldListSidebarContainerProps = Omit< */ getCreationOptions: () => UnifiedFieldListSidebarContainerCreationOptions; - /** - * In case if you have a sidebar toggle button - */ - isSidebarCollapsed?: boolean; - /** * Custom content to render at the top of field list in the flyout (for example a data view picker) */ @@ -115,7 +111,6 @@ const UnifiedFieldListSidebarContainer = forwardRef< services, dataView, workspaceSelectedFieldNames, - isSidebarCollapsed, // TODO later: pull the logic of collapsing the sidebar to this component prependInFlyout, variant = 'responsive', onFieldEdited, @@ -125,6 +120,7 @@ const UnifiedFieldListSidebarContainer = forwardRef< ); const { data, dataViewFieldEditor } = services; const [isFieldListFlyoutVisible, setIsFieldListFlyoutVisible] = useState(false); + const { isSidebarCollapsed, onToggleSidebar } = useSidebarToggle({ stateService }); const canEditDataView = Boolean(dataViewFieldEditor?.userPermissions.editIndexPattern()) || @@ -250,8 +246,15 @@ const UnifiedFieldListSidebarContainer = forwardRef< isAffectedByGlobalFilter, onEditField: editField, onDeleteField: deleteField, + compressed: stateService.creationOptions.compressed ?? false, + buttonAddFieldVariant: stateService.creationOptions.buttonAddFieldVariant ?? 'primary', }; + if (stateService.creationOptions.showSidebarToggleButton) { + commonSidebarProps.isSidebarCollapsed = isSidebarCollapsed; + commonSidebarProps.onToggleSidebar = onToggleSidebar; + } + const buttonPropsToTriggerFlyout = stateService.creationOptions.buttonPropsToTriggerFlyout; const renderListVariant = () => { @@ -319,6 +322,8 @@ const UnifiedFieldListSidebarContainer = forwardRef< @@ -333,12 +338,12 @@ const UnifiedFieldListSidebarContainer = forwardRef< } if (variant === 'list-always') { - return (!isSidebarCollapsed && renderListVariant()) || null; + return renderListVariant(); } return ( <> - {!isSidebarCollapsed && {renderListVariant()}} + {renderListVariant()} {renderButtonVariant()} ); diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/sidebar_toggle_button/index.ts b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/sidebar_toggle_button/index.ts new file mode 100644 index 0000000000000..f3dd50b48c968 --- /dev/null +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/sidebar_toggle_button/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export { SidebarToggleButton, type SidebarToggleButtonProps } from './sidebar_toggle_button'; diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/sidebar_toggle_button/sidebar_toggle_button.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/sidebar_toggle_button/sidebar_toggle_button.tsx new file mode 100644 index 0000000000000..1bf8f62b2cced --- /dev/null +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/sidebar_toggle_button/sidebar_toggle_button.tsx @@ -0,0 +1,70 @@ +/* + * 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 React from 'react'; +import { i18n } from '@kbn/i18n'; +import { IconButtonGroup, type IconButtonGroupProps } from '@kbn/shared-ux-button-toolbar'; + +/** + * Toggle button props + */ +export interface SidebarToggleButtonProps { + 'data-test-subj'?: string; + isSidebarCollapsed: boolean; + buttonSize: IconButtonGroupProps['buttonSize']; + onChange: (isSidebarCollapsed: boolean) => void; +} + +/** + * A toggle button for the fields sidebar + * @param data-test-subj + * @param isSidebarCollapsed + * @param onChange + * @constructor + */ +export const SidebarToggleButton: React.FC = ({ + 'data-test-subj': dataTestSubj = 'unifiedFieldListSidebar__toggle', + isSidebarCollapsed, + buttonSize, + onChange, +}) => { + // TODO: replace with new Eui icons once available + return ( +
    + onChange(false), + }, + ] + : [ + { + label: i18n.translate('unifiedFieldList.fieldListSidebar.collapseSidebarButton', { + defaultMessage: 'Hide sidebar', + }), + iconType: 'menuLeft', + 'data-test-subj': `${dataTestSubj}-collapse`, + onClick: () => onChange(true), + }, + ]), + ]} + /> +
    + ); +}; diff --git a/packages/kbn-unified-field-list/src/hooks/use_sidebar_toggle.test.tsx b/packages/kbn-unified-field-list/src/hooks/use_sidebar_toggle.test.tsx new file mode 100644 index 0000000000000..16ee451400c6c --- /dev/null +++ b/packages/kbn-unified-field-list/src/hooks/use_sidebar_toggle.test.tsx @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { renderHook, act } from '@testing-library/react-hooks'; +import { useSidebarToggle } from './use_sidebar_toggle'; +import * as localStorageModule from 'react-use/lib/useLocalStorage'; + +jest.spyOn(localStorageModule, 'default'); + +describe('UnifiedFieldList useSidebarToggle', () => { + const stateService = { + creationOptions: { + originatingApp: 'test', + localStorageKeyPrefix: 'this', + }, + }; + + beforeEach(() => { + (localStorageModule.default as jest.Mock).mockClear(); + }); + + it('should toggle correctly', async () => { + const storeMock = jest.fn(); + (localStorageModule.default as jest.Mock).mockImplementation(() => { + return [false, storeMock]; + }); + + const { result } = renderHook(useSidebarToggle, { + initialProps: { + stateService, + }, + }); + + expect(result.current.isSidebarCollapsed).toBe(false); + + act(() => { + result.current.onToggleSidebar(true); + }); + + expect(result.current.isSidebarCollapsed).toBe(true); + expect(storeMock).toHaveBeenCalledWith(true); + + act(() => { + result.current.onToggleSidebar(false); + }); + + expect(result.current.isSidebarCollapsed).toBe(false); + expect(storeMock).toHaveBeenLastCalledWith(false); + }); + + it('should restore collapsed state and expand from it', async () => { + const storeMock = jest.fn(); + (localStorageModule.default as jest.Mock).mockImplementation(() => { + return [true, storeMock]; + }); + + const { result } = renderHook(useSidebarToggle, { + initialProps: { + stateService, + }, + }); + + expect(result.current.isSidebarCollapsed).toBe(true); + + act(() => { + result.current.onToggleSidebar(false); + }); + + expect(result.current.isSidebarCollapsed).toBe(false); + expect(storeMock).toHaveBeenCalledWith(false); + }); + + it('should not persist if local storage key is not defined', async () => { + const storeMock = jest.fn(); + (localStorageModule.default as jest.Mock).mockImplementation(() => { + return [false, storeMock]; + }); + + const { result } = renderHook(useSidebarToggle, { + initialProps: { + stateService: { + creationOptions: { + originatingApp: 'test', + localStorageKeyPrefix: undefined, + }, + }, + }, + }); + + expect(result.current.isSidebarCollapsed).toBe(false); + + act(() => { + result.current.onToggleSidebar(true); + }); + + expect(result.current.isSidebarCollapsed).toBe(true); + expect(storeMock).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/kbn-unified-field-list/src/hooks/use_sidebar_toggle.ts b/packages/kbn-unified-field-list/src/hooks/use_sidebar_toggle.ts new file mode 100644 index 0000000000000..b12c7dc7dae95 --- /dev/null +++ b/packages/kbn-unified-field-list/src/hooks/use_sidebar_toggle.ts @@ -0,0 +1,64 @@ +/* + * 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 { useCallback, useState, useMemo } from 'react'; +import useLocalStorage from 'react-use/lib/useLocalStorage'; +import type { UnifiedFieldListSidebarContainerStateService } from '../types'; + +/** + * Hook params + */ +export interface UseSidebarToggleParams { + /** + * Service for managing the state + */ + stateService: UnifiedFieldListSidebarContainerStateService; +} + +/** + * Hook result type + */ +export interface UseSidebarToggleResult { + isSidebarCollapsed: boolean; + onToggleSidebar: (isSidebarCollapsed: boolean) => void; +} + +/** + * Hook for managing sidebar toggle state + * @param stateService + */ +export const useSidebarToggle = ({ + stateService, +}: UseSidebarToggleParams): UseSidebarToggleResult => { + const [initialIsSidebarCollapsed, storeIsSidebarCollapsed] = useLocalStorage( + `${stateService.creationOptions.localStorageKeyPrefix ?? 'unifiedFieldList'}:sidebarClosed`, // as legacy `discover:sidebarClosed` key + false + ); + const [isSidebarCollapsed, setIsSidebarCollapsed] = useState( + initialIsSidebarCollapsed ?? false + ); + + const onToggleSidebar = useCallback( + (isCollapsed) => { + setIsSidebarCollapsed(isCollapsed); + if (stateService.creationOptions.localStorageKeyPrefix) { + storeIsSidebarCollapsed(isCollapsed); + } + }, + [ + storeIsSidebarCollapsed, + setIsSidebarCollapsed, + stateService.creationOptions.localStorageKeyPrefix, + ] + ); + + return useMemo( + () => ({ isSidebarCollapsed, onToggleSidebar }), + [isSidebarCollapsed, onToggleSidebar] + ); +}; diff --git a/packages/kbn-unified-field-list/src/types.ts b/packages/kbn-unified-field-list/src/types.ts index 76997c73176b3..dad321dbe56b3 100755 --- a/packages/kbn-unified-field-list/src/types.ts +++ b/packages/kbn-unified-field-list/src/types.ts @@ -107,6 +107,8 @@ export type OverrideFieldGroupDetails = ( export type TimeRangeUpdatesType = 'search-session' | 'timefilter'; +export type ButtonAddFieldVariant = 'primary' | 'toolbar'; + export type SearchMode = 'documents' | 'text-based'; export interface UnifiedFieldListSidebarContainerCreationOptions { @@ -116,7 +118,12 @@ export interface UnifiedFieldListSidebarContainerCreationOptions { originatingApp: string; /** - * Your app name: "discover", "lens", etc. If not provided, sections state would not be persisted. + * Pass `true` to enable the compressed view + */ + compressed?: boolean; + + /** + * Your app name: "discover", "lens", etc. If not provided, sections and sidebar toggle states would not be persisted. */ localStorageKeyPrefix?: string; @@ -125,6 +132,16 @@ export interface UnifiedFieldListSidebarContainerCreationOptions { */ timeRangeUpdatesType?: TimeRangeUpdatesType; + /** + * Choose how the bottom "Add a field" button should look like. Default `primary`. + */ + buttonAddFieldVariant?: ButtonAddFieldVariant; + + /** + * Pass `true` to make the sidebar collapsible. Additionally, define `localStorageKeyPrefix` to persist toggle state. + */ + showSidebarToggleButton?: boolean; + /** * Pass `true` to skip auto fetching of fields existence info */ diff --git a/packages/kbn-unified-field-list/tsconfig.json b/packages/kbn-unified-field-list/tsconfig.json index 78ea71ca44344..f60d203786439 100644 --- a/packages/kbn-unified-field-list/tsconfig.json +++ b/packages/kbn-unified-field-list/tsconfig.json @@ -29,6 +29,7 @@ "@kbn/shared-ux-utility", "@kbn/discover-utils", "@kbn/ebt-tools", + "@kbn/shared-ux-button-toolbar", ], "exclude": ["target/**/*"] } diff --git a/packages/serverless/settings/common/README.mdx b/packages/serverless/settings/common/README.mdx new file mode 100644 index 0000000000000..ece99219fbc3b --- /dev/null +++ b/packages/serverless/settings/common/README.mdx @@ -0,0 +1,14 @@ +--- +id: serverless/packages/settings/common +slug: /serverless/packages/settings/common +title: Serverless Common Advanced Settings +description: A package of common settings for all Serverless projects. +tags: ['serverless', 'package'] +date: 2023-08-24 +--- + +This package contains a list of UI settings that are available in all Serverless projects in the Advanced settings app. +This list is consumed by the `serverless` plugin, which merges it with any serverless project-specific settings that +have been set up, and sends it to the uiSettings service to set an allowlist for the settings. + +If you need to register a setting that should be available in all serverless projects, make sure to add its Id to this list. diff --git a/packages/serverless/settings/common/index.ts b/packages/serverless/settings/common/index.ts new file mode 100644 index 0000000000000..326108abcd747 --- /dev/null +++ b/packages/serverless/settings/common/index.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 * as settings from '@kbn/management-settings-ids'; + +const GENERAL_SETTINGS = [ + settings.CSV_QUOTE_VALUES_ID, + settings.DATE_FORMAT_DOW_ID, + settings.DATE_FORMAT_SCALED_ID, + settings.DATE_FORMAT_TZ_ID, + settings.DATE_FORMAT_NANOS_ID, + settings.DEFAULT_INDEX_ID, + settings.FILTERS_PINNED_BY_DEFAULT_ID, + settings.FORMAT_BYTES_DEFAULT_PATTERN_ID, + settings.FORMAT_CURRENCY_DEFAULT_PATTERN_ID, + settings.FORMAT_NUMBER_DEFAULT_LOCALE_ID, + settings.FORMAT_NUMBER_DEFAULT_PATTERN_ID, + settings.FORMAT_PERCENT_DEFAULT_PATTERN_ID, + settings.META_FIELDS_ID, + settings.STATE_STORE_IN_SESSION_STORAGE_ID, + settings.TIMEPICKER_QUICK_RANGES_ID, + settings.TIMEPICKER_TIME_DEFAULTS_ID, +]; + +const PRESENTATION_LABS_SETTINGS = [settings.LABS_DASHBOARD_DEFER_BELOW_FOLD_ID]; + +const ACCESSIBILITY_SETTINGS = [settings.ACCESSIBILITY_DISABLE_ANIMATIONS_ID]; + +const BANNER_SETTINGS = [ + settings.BANNERS_PLACEMENT_ID, + settings.BANNERS_TEXT_CONTENT_ID, + settings.BANNERS_TEXT_COLOR_ID, + settings.BANNERS_BACKGROUND_COLOR_ID, +]; + +const DISCOVER_SETTINGS = [settings.DEFAULT_COLUMNS_ID]; + +const NOTIFICATION_SETTINGS = [ + settings.NOTIFICATIONS_BANNER_ID, + settings.NOTIFICATIONS_LIFETIME_BANNER_ID, + settings.NOTIFICATIONS_LIFETIME_ERROR_ID, + settings.NOTIFICATIONS_LIFETIME_INFO_ID, + settings.NOTIFICATIONS_LIFETIME_WARNING_ID, +]; + +export const ALL_COMMON_SETTINGS = [ + ...GENERAL_SETTINGS, + ...PRESENTATION_LABS_SETTINGS, + ...ACCESSIBILITY_SETTINGS, + ...BANNER_SETTINGS, + ...DISCOVER_SETTINGS, + ...NOTIFICATION_SETTINGS, +]; diff --git a/packages/serverless/settings/common/kibana.jsonc b/packages/serverless/settings/common/kibana.jsonc new file mode 100644 index 0000000000000..ee4ea591c85c5 --- /dev/null +++ b/packages/serverless/settings/common/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/serverless-common-settings", + "owner": "@elastic/appex-sharedux @elastic/platform-deployment-management" +} diff --git a/packages/serverless/settings/common/package.json b/packages/serverless/settings/common/package.json new file mode 100644 index 0000000000000..3674091a63be5 --- /dev/null +++ b/packages/serverless/settings/common/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/serverless-common-settings", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/serverless/settings/common/tsconfig.json b/packages/serverless/settings/common/tsconfig.json new file mode 100644 index 0000000000000..16d6022e3d9bc --- /dev/null +++ b/packages/serverless/settings/common/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/management-settings-ids", + ] +} diff --git a/packages/serverless/settings/observability_project/README.mdx b/packages/serverless/settings/observability_project/README.mdx new file mode 100644 index 0000000000000..e7c16971c6cb6 --- /dev/null +++ b/packages/serverless/settings/observability_project/README.mdx @@ -0,0 +1,31 @@ +--- +id: serverless/packages/settings/observability_project +slug: /serverless/packages/settings/observability_project +title: Serverless Observability Advanced Settings +description: A package of settings for the Serverless Observability project. +tags: ['serverless', 'package'] +date: 2023-08-24 +--- + +This package contains a list of UI settings that are only available in the Serverless Observability project. +This list is consumed by the `serverless_observability` plugin, which sets up its project settings: + +```ts +export class ServerlessObservabilityPlugin + implements + Plugin< + ServerlessObservabilityPluginSetup, + ServerlessObservabilityPluginStart, + SetupDependencies, + StartDependencies + > +{ + public setup(_coreSetup: CoreSetup, pluginsSetup: SetupDependencies) { + pluginsSetup.serverless.setupProjectSettings(OBSERVABILITY_PROJECT_SETTINGS); + return {}; + } +} +``` + +If you need to register a setting that should be available in the Serverless Observability project, make sure to add +its Id to this list. diff --git a/packages/serverless/settings/observability_project/index.ts b/packages/serverless/settings/observability_project/index.ts new file mode 100644 index 0000000000000..7f76a35e0fcea --- /dev/null +++ b/packages/serverless/settings/observability_project/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 * as settings from '@kbn/management-settings-ids'; + +export const OBSERVABILITY_PROJECT_SETTINGS = [ + settings.ML_ANOMALY_DETECTION_RESULTS_ENABLE_TIME_DEFAULTS_ID, + settings.ML_ANOMALY_DETECTION_RESULTS_TIME_DEFAULTS_ID, +]; diff --git a/packages/serverless/settings/observability_project/kibana.jsonc b/packages/serverless/settings/observability_project/kibana.jsonc new file mode 100644 index 0000000000000..4df29091e6619 --- /dev/null +++ b/packages/serverless/settings/observability_project/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/serverless-observability-settings", + "owner": "@elastic/appex-sharedux @elastic/apm-ui @elastic/platform-deployment-management" +} diff --git a/packages/serverless/settings/observability_project/package.json b/packages/serverless/settings/observability_project/package.json new file mode 100644 index 0000000000000..127cb4621c742 --- /dev/null +++ b/packages/serverless/settings/observability_project/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/serverless-observability-settings", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/serverless/settings/observability_project/tsconfig.json b/packages/serverless/settings/observability_project/tsconfig.json new file mode 100644 index 0000000000000..16d6022e3d9bc --- /dev/null +++ b/packages/serverless/settings/observability_project/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/management-settings-ids", + ] +} diff --git a/packages/serverless/settings/search_project/README.mdx b/packages/serverless/settings/search_project/README.mdx new file mode 100644 index 0000000000000..a19718c645a82 --- /dev/null +++ b/packages/serverless/settings/search_project/README.mdx @@ -0,0 +1,34 @@ +--- +id: serverless/packages/settings/search_project +slug: /serverless/packages/settings/search_project +title: Serverless Search Advanced Settings +description: A package of settings for the Serverless Search project. +tags: ['serverless', 'package'] +date: 2023-08-24 +--- + +This package contains a list of UI settings that are only available in the Serverless Search project. +This list is consumed by the `serverless_search` plugin, which sets up its project settings: + +```ts +export class ServerlessSearchPlugin + implements + Plugin< + ServerlessSearchPluginSetup, + ServerlessSearchPluginStart, + SetupDependencies, + StartDependencies + > +{ + public setup( + { getStartServices, http }: CoreSetup, + pluginsSetup: SetupDependencies + ) { + pluginsSetup.serverless.setupProjectSettings(SEARCH_PROJECT_SETTINGS); + return {}; + } +} +``` + +If you need to register a setting that should be available in the Serverless Search project, make sure to add +its Id to this list. diff --git a/packages/serverless/settings/search_project/index.ts b/packages/serverless/settings/search_project/index.ts new file mode 100644 index 0000000000000..a26c658501617 --- /dev/null +++ b/packages/serverless/settings/search_project/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX_ID } from '@kbn/management-settings-ids'; + +export const SEARCH_PROJECT_SETTINGS = [COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX_ID]; diff --git a/packages/serverless/settings/search_project/kibana.jsonc b/packages/serverless/settings/search_project/kibana.jsonc new file mode 100644 index 0000000000000..f73b63503ae4d --- /dev/null +++ b/packages/serverless/settings/search_project/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/serverless-search-settings", + "owner": "@elastic/enterprise-search-frontend @elastic/platform-deployment-management" +} diff --git a/packages/serverless/settings/search_project/package.json b/packages/serverless/settings/search_project/package.json new file mode 100644 index 0000000000000..2dc7bf717e612 --- /dev/null +++ b/packages/serverless/settings/search_project/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/serverless-search-settings", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/serverless/settings/search_project/tsconfig.json b/packages/serverless/settings/search_project/tsconfig.json new file mode 100644 index 0000000000000..16d6022e3d9bc --- /dev/null +++ b/packages/serverless/settings/search_project/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/management-settings-ids", + ] +} diff --git a/packages/serverless/settings/security_project/README.mdx b/packages/serverless/settings/security_project/README.mdx new file mode 100644 index 0000000000000..4d5d788eb84d0 --- /dev/null +++ b/packages/serverless/settings/security_project/README.mdx @@ -0,0 +1,31 @@ +--- +id: serverless/packages/settings/security_project +slug: /serverless/packages/settings/security_project +title: Serverless Security Advanced Settings +description: A package of settings for the Serverless Security project. +tags: ['serverless', 'package'] +date: 2023-08-24 +--- + +This package contains a list of UI settings that are only available in the Serverless Security project. +This list is consumed by the `security_solution_serverless` plugin, which sets up its project settings: + +```ts +export class SecuritySolutionServerlessPlugin + implements + Plugin< + SecuritySolutionServerlessPluginSetup, + SecuritySolutionServerlessPluginStart, + SecuritySolutionServerlessPluginSetupDeps, + SecuritySolutionServerlessPluginStartDeps + > +{ + public setup(coreSetup: CoreSetup, pluginsSetup: SecuritySolutionServerlessPluginSetupDeps) { + pluginsSetup.serverless.setupProjectSettings(SECURITY_PROJECT_SETTINGS); + return {}; + } +} +``` + +If you need to register a setting that should be available in the Serverless Security project, make sure to add +its Id to this list. diff --git a/packages/serverless/settings/security_project/index.ts b/packages/serverless/settings/security_project/index.ts new file mode 100644 index 0000000000000..070a75f163d41 --- /dev/null +++ b/packages/serverless/settings/security_project/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 * as settings from '@kbn/management-settings-ids'; + +export const SECURITY_PROJECT_SETTINGS = [ + settings.ML_ANOMALY_DETECTION_RESULTS_ENABLE_TIME_DEFAULTS_ID, + settings.ML_ANOMALY_DETECTION_RESULTS_TIME_DEFAULTS_ID, + settings.SECURITY_SOLUTION_REFRESH_INTERVAL_DEFAULTS_ID, + settings.SECURITY_SOLUTION_TIME_DEFAULTS_ID, + settings.SECURITY_SOLUTION_DEFAULT_INDEX_ID, + settings.SECURITY_SOLUTION_DEFAULT_THREAT_INDEX_ID, + settings.SECURITY_SOLUTION_DEFAULT_ANOMALY_SCORE_ID, + settings.SECURITY_SOLUTION_RULES_TABLE_REFRESH_ID, + settings.SECURITY_SOLUTION_IP_REPUTATION_LINKS_ID, + settings.SECURITY_SOLUTION_ENABLE_CCS_WARNING_ID, + settings.SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID, +]; diff --git a/packages/serverless/settings/security_project/kibana.jsonc b/packages/serverless/settings/security_project/kibana.jsonc new file mode 100644 index 0000000000000..818e3068d704c --- /dev/null +++ b/packages/serverless/settings/security_project/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/serverless-security-settings", + "owner": "@elastic/security-solution @elastic/platform-deployment-management" +} diff --git a/packages/serverless/settings/security_project/package.json b/packages/serverless/settings/security_project/package.json new file mode 100644 index 0000000000000..5d58ccbd142b2 --- /dev/null +++ b/packages/serverless/settings/security_project/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/serverless-security-settings", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/serverless/settings/security_project/tsconfig.json b/packages/serverless/settings/security_project/tsconfig.json new file mode 100644 index 0000000000000..16d6022e3d9bc --- /dev/null +++ b/packages/serverless/settings/security_project/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/management-settings-ids", + ] +} diff --git a/src/core/server/integration_tests/elasticsearch/capabilities_serverless.test.ts b/src/core/server/integration_tests/elasticsearch/capabilities_serverless.test.ts index 56754a12daed7..314fa311cf705 100644 --- a/src/core/server/integration_tests/elasticsearch/capabilities_serverless.test.ts +++ b/src/core/server/integration_tests/elasticsearch/capabilities_serverless.test.ts @@ -13,9 +13,7 @@ import { import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; import { getCapabilitiesFromClient } from '@kbn/core-elasticsearch-server-internal'; -// skipped because test serverless ES nodes are currently using static ports -// causing parallel jest runners to fail for obvious port conflicts reasons. -describe.skip('ES capabilities for serverless ES', () => { +describe('ES capabilities for serverless ES', () => { let serverlessES: TestServerlessESUtils; let client: ElasticsearchClient; diff --git a/src/core/server/integration_tests/http/router.test.ts b/src/core/server/integration_tests/http/router.test.ts index de5e10d1ee599..fdfbb76effbcf 100644 --- a/src/core/server/integration_tests/http/router.test.ts +++ b/src/core/server/integration_tests/http/router.test.ts @@ -568,6 +568,7 @@ describe('Handler', () => { router.get({ path: '/', validate: false }, (context, req, res) => { throw new Error('unexpected error'); }); + await server.start(); const result = await supertest(innerServer.listener).get('/').expect(500); @@ -575,21 +576,9 @@ describe('Handler', () => { expect(result.body.message).toBe( 'An internal server error occurred. Check Kibana server logs for details.' ); - expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(` - Array [ - Array [ - "500 Server Error - /", - Object { - "error": [Error: unexpected error], - "http": Object { - "response": Object { - "status_code": 500, - }, - }, - }, - ], - ] - `); + + const [message] = loggingSystemMock.collect(logger).error[0]; + expect(message).toEqual('500 Server Error - /'); }); it('captures the error if handler throws', async () => { @@ -627,7 +616,6 @@ describe('Handler', () => { Array [ "500 Server Error - /", Object { - "error": [Error: Unauthorized], "http": Object { "response": Object { "status_code": 500, @@ -657,7 +645,6 @@ describe('Handler', () => { Array [ "500 Server Error - /", Object { - "error": [Error: Unexpected result from Route Handler. Expected KibanaResponse, but given: string.], "http": Object { "response": Object { "status_code": 500, @@ -702,7 +689,6 @@ describe('Handler', () => { Array [ "400 Bad Request - /", Object { - "error": [Error: [request query.page]: expected value of type [number] but got [string]], "http": Object { "response": Object { "status_code": 400, @@ -1187,7 +1173,6 @@ describe('Response factory', () => { Array [ "500 Server Error - /", Object { - "error": [Error: expected 'location' header to be set], "http": Object { "response": Object { "status_code": 500, @@ -1601,7 +1586,6 @@ describe('Response factory', () => { Array [ "500 Server Error - /", Object { - "error": [Error: Unexpected Http status code. Expected from 400 to 599, but given: 200], "http": Object { "response": Object { "status_code": 500, @@ -1678,7 +1662,6 @@ describe('Response factory', () => { Array [ "500 Server Error - /", Object { - "error": [Error: expected 'location' header to be set], "http": Object { "response": Object { "status_code": 500, @@ -1826,7 +1809,6 @@ describe('Response factory', () => { Array [ "500 Server Error - /", Object { - "error": [Error: expected error message to be provided], "http": Object { "response": Object { "status_code": 500, @@ -1860,7 +1842,6 @@ describe('Response factory', () => { Array [ "500 Server Error - /", Object { - "error": [Error: expected error message to be provided], "http": Object { "response": Object { "status_code": 500, @@ -1893,7 +1874,6 @@ describe('Response factory', () => { Array [ "500 Server Error - /", Object { - "error": [Error: options.statusCode is expected to be set. given options: undefined], "http": Object { "response": Object { "status_code": 500, @@ -1926,7 +1906,6 @@ describe('Response factory', () => { Array [ "500 Server Error - /", Object { - "error": [Error: Unexpected Http status code. Expected from 100 to 599, but given: 20.], "http": Object { "response": Object { "status_code": 500, diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts index dc583d97190a9..a951ecc37d1f4 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts @@ -6,2061 +6,27 @@ * Side Public License, v 1. */ -import Path from 'path'; -import * as Either from 'fp-ts/lib/Either'; -import * as Option from 'fp-ts/lib/Option'; -import { errors } from '@elastic/elasticsearch'; -import type { TaskEither } from 'fp-ts/lib/TaskEither'; -import type { SavedObjectsRawDoc } from '@kbn/core-saved-objects-server'; -import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; -import { createTestServers, type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; -import { - bulkOverwriteTransformedDocuments, - closePit, - createIndex, - openPit, - type OpenPitResponse, - reindex, - readWithPit, - type EsResponseTooLargeError, - type ReadWithPit, - setWriteBlock, - updateAliases, - waitForReindexTask, - type ReindexResponse, - waitForPickupUpdatedMappingsTask, - pickupUpdatedMappings, - type UpdateByQueryResponse, - updateAndPickupMappings, - type UpdateAndPickupMappingsResponse, - updateMappings, - removeWriteBlock, - transformDocs, - waitForIndexStatus, - initAction, - cloneIndex, - type DocumentsTransformFailed, - type DocumentsTransformSuccess, - MIGRATION_CLIENT_OPTIONS, - createBulkIndexOperationTuple, -} from '@kbn/core-saved-objects-migration-server-internal'; +import { createTestServers } from '@kbn/core-test-helpers-kbn-server'; +import { MIGRATION_CLIENT_OPTIONS } from '@kbn/core-saved-objects-migration-server-internal'; +import { runActionTestSuite } from './actions_test_suite'; const { startES } = createTestServers({ adjustTimeout: (t: number) => jest.setTimeout(t), settings: { es: { license: 'basic', - dataArchive: Path.resolve(__dirname, '../../archives/7.7.2_xpack_100k_obj.zip'), esArgs: ['http.max_content_length=10Kb'], }, }, }); -let esServer: TestElasticsearchUtils; describe('migration actions', () => { - let client: ElasticsearchClient; - let esCapabilities: ReturnType; - - beforeAll(async () => { - esServer = await startES(); - client = esServer.es.getClient().child(MIGRATION_CLIENT_OPTIONS); - esCapabilities = elasticsearchServiceMock.createCapabilities(); - - // Create test fixture data: - await createIndex({ - client, - indexName: 'existing_index_with_docs', - aliases: ['existing_index_with_docs_alias'], - esCapabilities, - mappings: { - dynamic: true, - properties: { - someProperty: { - type: 'integer', - }, - }, - _meta: { - migrationMappingPropertyHashes: { - references: '7997cf5a56cc02bdc9c93361bde732b0', - }, - }, - }, - })(); - const docs = [ - { _source: { title: 'doc 1' } }, - { _source: { title: 'doc 2' } }, - { _source: { title: 'doc 3' } }, - { _source: { title: 'saved object 4', type: 'another_unused_type' } }, - { _source: { title: 'f-agent-event 5', type: 'f_agent_event' } }, - { _source: { title: new Array(1000).fill('a').join(), type: 'large' } }, // "large" saved object - ] as unknown as SavedObjectsRawDoc[]; - await bulkOverwriteTransformedDocuments({ - client, - index: 'existing_index_with_docs', - operations: docs.map((doc) => createBulkIndexOperationTuple(doc)), - refresh: 'wait_for', - })(); - - await createIndex({ - client, - indexName: 'existing_index_2', - mappings: { properties: {} }, - esCapabilities, - })(); - await createIndex({ - client, - indexName: 'existing_index_with_write_block', - mappings: { properties: {} }, - esCapabilities, - })(); - await bulkOverwriteTransformedDocuments({ - client, - index: 'existing_index_with_write_block', - operations: docs.map((doc) => createBulkIndexOperationTuple(doc)), - refresh: 'wait_for', - })(); - await setWriteBlock({ client, index: 'existing_index_with_write_block' })(); - await updateAliases({ - client, - aliasActions: [{ add: { index: 'existing_index_2', alias: 'existing_index_2_alias' } }], - })(); - }); - - afterAll(async () => { - await esServer.stop(); - }); - - describe('initAction', () => { - afterAll(async () => { - await client.cluster.putSettings({ - body: { - persistent: { - // Reset persistent test settings - cluster: { routing: { allocation: { enable: null } } }, - }, - }, - }); - }); - it('resolves right empty record if no indices were found', async () => { - expect.assertions(1); - const task = initAction({ client, indices: ['no_such_index'] }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": Object {}, - } - `); - }); - it('resolves right record with found indices', async () => { - expect.assertions(1); - const res = (await initAction({ - client, - indices: ['no_such_index', 'existing_index_with_docs'], - })()) as Either.Right; - - expect(res.right).toEqual( - expect.objectContaining({ - existing_index_with_docs: { - aliases: { - existing_index_with_docs_alias: {}, - }, - mappings: expect.anything(), - settings: expect.anything(), - }, - }) - ); - }); - it('includes the _meta data of the indices in the response', async () => { - expect.assertions(1); - const res = (await initAction({ - client, - indices: ['existing_index_with_docs'], - })()) as Either.Right; - - expect(res.right).toEqual( - expect.objectContaining({ - existing_index_with_docs: { - aliases: { - existing_index_with_docs_alias: {}, - }, - mappings: { - // FIXME https://github.com/elastic/elasticsearch-js/issues/1796 - dynamic: 'true', - properties: expect.anything(), - _meta: { - migrationMappingPropertyHashes: { - references: '7997cf5a56cc02bdc9c93361bde732b0', - }, - }, - }, - settings: expect.anything(), - }, - }) - ); - }); - it('resolves left when cluster.routing.allocation.enabled is incompatible', async () => { - expect.assertions(3); - await client.cluster.putSettings({ - body: { - persistent: { - // Disable all routing allocation - cluster: { routing: { allocation: { enable: 'none' } } }, - }, - }, - }); - const task = initAction({ - client, - indices: ['existing_index_with_docs'], - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "incompatible_cluster_routing_allocation", - }, - } - `); - await client.cluster.putSettings({ - body: { - persistent: { - // Allow routing to existing primaries only - cluster: { routing: { allocation: { enable: 'primaries' } } }, - }, - }, - }); - const task2 = initAction({ - client, - indices: ['existing_index_with_docs'], - }); - await expect(task2()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "incompatible_cluster_routing_allocation", - }, - } - `); - await client.cluster.putSettings({ - body: { - persistent: { - // Allow routing to new primaries only - cluster: { routing: { allocation: { enable: 'new_primaries' } } }, - }, - }, - }); - const task3 = initAction({ - client, - indices: ['existing_index_with_docs'], - }); - await expect(task3()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "incompatible_cluster_routing_allocation", - }, - } - `); - }); - it('resolves right when cluster.routing.allocation.enabled=all', async () => { - expect.assertions(1); - await client.cluster.putSettings({ - body: { - persistent: { - cluster: { routing: { allocation: { enable: 'all' } } }, - }, - }, - }); - const task = initAction({ - client, - indices: ['existing_index_with_docs'], - }); - const result = await task(); - expect(Either.isRight(result)).toBe(true); - }); - }); - - describe('setWriteBlock', () => { - beforeAll(async () => { - await createIndex({ - client, - indexName: 'new_index_without_write_block', - mappings: { properties: {} }, - esCapabilities, - })(); - }); - it('resolves right when setting the write block succeeds', async () => { - expect.assertions(1); - const task = setWriteBlock({ client, index: 'new_index_without_write_block' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "set_write_block_succeeded", - } - `); - }); - it('resolves right when setting a write block on an index that already has one', async () => { - expect.assertions(1); - const task = setWriteBlock({ client, index: 'existing_index_with_write_block' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "set_write_block_succeeded", - } - `); - }); - it('once resolved, prevents further writes to the index', async () => { - expect.assertions(1); - const task = setWriteBlock({ client, index: 'new_index_without_write_block' }); - await task(); - const sourceDocs = [ - { _source: { title: 'doc 1' } }, - { _source: { title: 'doc 2' } }, - { _source: { title: 'doc 3' } }, - { _source: { title: 'doc 4' } }, - ] as unknown as SavedObjectsRawDoc[]; - - const res = (await bulkOverwriteTransformedDocuments({ - client, - index: 'new_index_without_write_block', - operations: sourceDocs.map((doc) => createBulkIndexOperationTuple(doc)), - refresh: 'wait_for', - })()) as Either.Left; - - expect(res.left).toEqual({ - type: 'target_index_had_write_block', - }); - }); - it('resolves left index_not_found_exception when the index does not exist', async () => { - expect.assertions(1); - const task = setWriteBlock({ client, index: 'no_such_index' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "index": "no_such_index", - "type": "index_not_found_exception", - }, - } - `); - }); - }); - - describe('removeWriteBlock', () => { - beforeAll(async () => { - await createIndex({ - client, - indexName: 'existing_index_without_write_block_2', - mappings: { properties: {} }, - esCapabilities, - })(); - await createIndex({ - client, - indexName: 'existing_index_with_write_block_2', - mappings: { properties: {} }, - esCapabilities, - })(); - await setWriteBlock({ client, index: 'existing_index_with_write_block_2' })(); - }); - it('resolves right if successful when an index already has a write block', async () => { - expect.assertions(1); - const task = removeWriteBlock({ client, index: 'existing_index_with_write_block_2' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "remove_write_block_succeeded", - } - `); - }); - it('resolves right if successful when an index does not have a write block', async () => { - expect.assertions(1); - const task = removeWriteBlock({ client, index: 'existing_index_without_write_block_2' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "remove_write_block_succeeded", - } - `); - }); - it('rejects if there is a non-retryable error', async () => { - expect.assertions(1); - const task = removeWriteBlock({ client, index: 'no_such_index' }); - await expect(task()).rejects.toThrow('index_not_found_exception'); - }); - }); - - describe('waitForIndexStatus', () => { - afterEach(async () => { - try { - await client.indices.delete({ index: 'red_then_yellow_index' }); - await client.indices.delete({ index: 'red_index' }); - } catch (e) { - /** ignore */ - } - }); - it('resolves right after waiting for an index status to be yellow if the index already existed', async () => { - // Create a red index - await client.indices.create( - { - index: 'red_then_yellow_index', - timeout: '5s', - body: { - mappings: { properties: {} }, - settings: { - // Allocate 1 replica so that this index stays yellow - number_of_replicas: '1', - // Disable all shard allocation so that the index status is red - routing: { allocation: { enable: 'none' } }, - }, - }, - }, - { maxRetries: 0 /** handle retry ourselves for now */ } - ); - - // Start tracking the index status - const indexStatusPromise = waitForIndexStatus({ - client, - index: 'red_then_yellow_index', - status: 'yellow', - })(); - - const redStatusResponse = await client.cluster.health({ index: 'red_then_yellow_index' }); - expect(redStatusResponse.status).toBe('red'); - - client.indices.putSettings({ - index: 'red_then_yellow_index', - body: { - // Enable all shard allocation so that the index status turns yellow - routing: { allocation: { enable: 'all' } }, - }, - }); - - await indexStatusPromise; - // Assert that the promise didn't resolve before the index became yellow - - const yellowStatusResponse = await client.cluster.health({ index: 'red_then_yellow_index' }); - expect(yellowStatusResponse.status).toBe('yellow'); - }); - it('resolves left with "index_not_yellow_timeout" after waiting for an index status to be yellow timeout', async () => { - // Create a red index - await client.indices - .create({ - index: 'red_index', - timeout: '5s', - body: { - mappings: { properties: {} }, - settings: { - // Allocate no replicas so that this index stays red - number_of_replicas: '0', - // Disable all shard allocation so that the index status is red - index: { routing: { allocation: { enable: 'none' } } }, - }, - }, - }) - .catch((e) => {}); - // try to wait for index status yellow: - const task = waitForIndexStatus({ - client, - index: 'red_index', - timeout: '1s', - status: 'yellow', - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "message": "[index_not_yellow_timeout] Timeout waiting for the status of the [red_index] index to become 'yellow'", - "type": "index_not_yellow_timeout", - }, - } - `); - }); - - it('resolves left with "index_not_green_timeout" after waiting for an index status to be green timeout', async () => { - // Create a yellow index - await client.indices - .create({ - index: 'yellow_index', - timeout: '5s', - body: { - mappings: { properties: {} }, - settings: { - // Allocate no replicas so that this index stays yellow - number_of_replicas: '0', - }, - }, - }) - .catch((e) => {}); - // try to wait for index status yellow: - const task = waitForIndexStatus({ - client, - index: 'red_index', - timeout: '1s', - status: 'green', - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "message": "[index_not_green_timeout] Timeout waiting for the status of the [red_index] index to become 'green'", - "type": "index_not_green_timeout", - }, - } - `); - }); - }); - - describe('cloneIndex', () => { - afterAll(async () => { - try { - // Restore the default setting of 1000 shards per node - await client.cluster.putSettings({ - persistent: { cluster: { max_shards_per_node: null } }, - }); - await client.indices.delete({ index: 'clone_*' }); - } catch (e) { - /** ignore */ - } - }); - it('resolves right if cloning into a new target index', async () => { - const task = cloneIndex({ - client, - source: 'existing_index_with_write_block', - target: 'clone_target_1', - esCapabilities, - }); - expect.assertions(3); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": Object { - "acknowledged": true, - "shardsAcknowledged": true, - }, - } - `); - const { clone_target_1: cloneTarget1 } = await client.indices.getSettings({ - index: 'clone_target_1', - }); - // @ts-expect-error https://github.com/elastic/elasticsearch/issues/89381 - expect(cloneTarget1.settings?.index.mapping?.total_fields.limit).toBe('1500'); - expect(cloneTarget1.settings?.blocks?.write).toBeUndefined(); - }); - it('resolves right if clone target already existed after waiting for index status to be green ', async () => { - expect.assertions(2); - - // Create a red index that we later turn into green - await client.indices - .create({ - index: 'clone_red_then_green_index', - timeout: '5s', - body: { - mappings: { properties: {} }, - settings: { - // Allocate 1 replica so that this index can go to green - number_of_replicas: '0', - // Disable all shard allocation so that the index status is red - index: { routing: { allocation: { enable: 'none' } } }, - }, - }, - }) - .catch((e) => {}); - - // Call clone even though the index already exists - const cloneIndexPromise = cloneIndex({ - client, - source: 'existing_index_with_write_block', - target: 'clone_red_then_green_index', - esCapabilities, - })(); - - let indexGreen = false; - setTimeout(() => { - client.indices.putSettings({ - index: 'clone_red_then_green_index', - body: { - // Enable all shard allocation so that the index status goes green - routing: { allocation: { enable: 'all' } }, - }, - }); - indexGreen = true; - }, 10); - - await cloneIndexPromise.then((res) => { - // Assert that the promise didn't resolve before the index became green - expect(indexGreen).toBe(true); - expect(res).toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": Object { - "acknowledged": true, - "shardsAcknowledged": true, - }, - } - `); - }); - }); - it('resolves left with a index_not_green_timeout if clone target already exists but takes longer than the specified timeout before turning green', async () => { - // Create a red index - await client.indices - .create({ - index: 'clone_red_index', - timeout: '5s', - body: { - mappings: { properties: {} }, - settings: { - // Allocate 1 replica so that this index stays yellow - number_of_replicas: '1', - // Disable all shard allocation so that the index status is red - index: { routing: { allocation: { enable: 'none' } } }, - }, - }, - }) - .catch((e) => {}); - - // Call clone even though the index already exists - let cloneIndexPromise = cloneIndex({ - client, - source: 'existing_index_with_write_block', - target: 'clone_red_index', - timeout: '1s', - esCapabilities, - })(); - - await expect(cloneIndexPromise).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "message": "[index_not_green_timeout] Timeout waiting for the status of the [clone_red_index] index to become 'green'", - "type": "index_not_green_timeout", - }, - } - `); - - // Now make the index yellow and repeat - - await client.indices.putSettings({ - index: 'clone_red_index', - body: { - // Enable all shard allocation so that the index status goes yellow - routing: { allocation: { enable: 'all' } }, - }, - }); - - // Call clone even though the index already exists - cloneIndexPromise = cloneIndex({ - client, - source: 'existing_index_with_write_block', - target: 'clone_red_index', - timeout: '1s', - esCapabilities, - })(); - - await expect(cloneIndexPromise).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "message": "[index_not_green_timeout] Timeout waiting for the status of the [clone_red_index] index to become 'green'", - "type": "index_not_green_timeout", - }, - } - `); - - // Now make the index green and it should succeed - - await client.indices.putSettings({ - index: 'clone_red_index', - body: { - // Set zero replicas so status goes green - number_of_replicas: 0, - }, - }); - - // Call clone even though the index already exists - cloneIndexPromise = cloneIndex({ - client, - source: 'existing_index_with_write_block', - target: 'clone_red_index', - timeout: '30s', - esCapabilities, - })(); - - await expect(cloneIndexPromise).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": Object { - "acknowledged": true, - "shardsAcknowledged": true, - }, - } - `); - }); - it('resolves left index_not_found_exception if the source index does not exist', async () => { - expect.assertions(1); - const task = cloneIndex({ - client, - source: 'no_such_index', - target: 'clone_target_3', - esCapabilities, - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "index": "no_such_index", - "type": "index_not_found_exception", - }, - } - `); - }); - it('resolves left cluster_shard_limit_exceeded when the action would exceed the maximum normal open shards', async () => { - // Set the max shards per node really low so that any new index that's created would exceed the maximum open shards for this cluster - await client.cluster.putSettings({ persistent: { cluster: { max_shards_per_node: 1 } } }); - const cloneIndexPromise = cloneIndex({ - client, - source: 'existing_index_with_write_block', - target: 'clone_target_4', - esCapabilities, - })(); - await expect(cloneIndexPromise).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "cluster_shard_limit_exceeded", - }, - } - `); - }); - }); - - // Reindex doesn't return any errors on it's own, so we have to test - // together with waitForReindexTask - describe('reindex & waitForReindexTask', () => { - it('resolves right when reindex succeeds without reindex script', async () => { - const res = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'reindex_target', - reindexScript: Option.none, - requireAlias: false, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "reindex_succeeded", - } - `); - - const results = await client.search({ index: 'reindex_target', size: 1000 }); - expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) - .toMatchInlineSnapshot(` - Array [ - "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a", - "doc 1", - "doc 2", - "doc 3", - "f-agent-event 5", - "saved object 4", - ] - `); - }); - it('resolves right and excludes all documents not matching the excludeOnUpgradeQuery', async () => { - const res = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'reindex_target_excluded_docs', - reindexScript: Option.none, - requireAlias: false, - excludeOnUpgradeQuery: { - bool: { - must_not: ['f_agent_event', 'another_unused_type'].map((type) => ({ - term: { type }, - })), - }, - }, - batchSize: 1000, - })()) as Either.Right; - const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "reindex_succeeded", - } - `); - - const results = await client.search({ index: 'reindex_target_excluded_docs', size: 1000 }); - expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) - .toMatchInlineSnapshot(` - Array [ - "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a", - "doc 1", - "doc 2", - "doc 3", - ] - `); - }); - it('resolves right when reindex succeeds with reindex script', async () => { - expect.assertions(2); - const res = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'reindex_target_2', - reindexScript: Option.some(`ctx._source.title = ctx._source.title + '_updated'`), - requireAlias: false, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "reindex_succeeded", - } - `); - - const results = await client.search({ index: 'reindex_target_2', size: 1000 }); - expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) - .toMatchInlineSnapshot(` - Array [ - "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a_updated", - "doc 1_updated", - "doc 2_updated", - "doc 3_updated", - "f-agent-event 5_updated", - "saved object 4_updated", - ] - `); - }); - it('resolves right, ignores version conflicts and does not update existing docs when reindex multiple times', async () => { - expect.assertions(3); - // Reindex with a script - let res = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'reindex_target_3', - reindexScript: Option.some(`ctx._source.title = ctx._source.title + '_updated'`), - requireAlias: false, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - let task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "reindex_succeeded", - } - `); - - // reindex without a script - res = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'reindex_target_3', - reindexScript: Option.none, - requireAlias: false, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "reindex_succeeded", - } - `); - - // Assert that documents weren't overridden by the second, unscripted reindex - const results = await client.search({ index: 'reindex_target_3', size: 1000 }); - expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) - .toMatchInlineSnapshot(` - Array [ - "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a_updated", - "doc 1_updated", - "doc 2_updated", - "doc 3_updated", - "f-agent-event 5_updated", - "saved object 4_updated", - ] - `); - }); - it('resolves right and proceeds to add missing documents if there are some existing docs conflicts', async () => { - expect.assertions(2); - // Simulate a reindex that only adds some of the documents from the - // source index into the target index - await createIndex({ - client, - indexName: 'reindex_target_4', - mappings: { properties: {} }, - esCapabilities, - })(); - const response = await client.search({ index: 'existing_index_with_docs', size: 1000 }); - const sourceDocs = (response.hits?.hits as SavedObjectsRawDoc[]) - .slice(0, 2) - .map(({ _id, _source }) => ({ - _id, - _source, - })); - await bulkOverwriteTransformedDocuments({ - client, - index: 'reindex_target_4', - operations: sourceDocs.map((doc) => createBulkIndexOperationTuple(doc)), - refresh: 'wait_for', - })(); - - // Now do a real reindex - const res = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'reindex_target_4', - reindexScript: Option.some(`ctx._source.title = ctx._source.title + '_updated'`), - requireAlias: false, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "reindex_succeeded", - } - `); - // Assert that existing documents weren't overridden, but that missing - // documents were added by the reindex - const results = await client.search({ index: 'reindex_target_4', size: 1000 }); - expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) - .toMatchInlineSnapshot(` - Array [ - "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a_updated", - "doc 1", - "doc 2", - "doc 3_updated", - "f-agent-event 5_updated", - "saved object 4_updated", - ] - `); - }); - it('resolves left incompatible_mapping_exception if all reindex failures are due to a strict_dynamic_mapping_exception', async () => { - expect.assertions(1); - // Simulates one instance having completed the UPDATE_TARGET_MAPPINGS - // step which makes the mappings incompatible with outdated documents. - // If another instance then tries a reindex it will get a - // strict_dynamic_mapping_exception even if the documents already exist - // and should ignore this error. - - // Create an index with incompatible mappings - await createIndex({ - client, - indexName: 'reindex_target_5', - mappings: { - dynamic: 'strict', - properties: { - /** no title field */ - }, - }, - esCapabilities, - })(); - - const { - right: { taskId: reindexTaskId }, - } = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'reindex_target_5', - reindexScript: Option.none, - requireAlias: false, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - const task = waitForReindexTask({ client, taskId: reindexTaskId, timeout: '10s' }); - - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "incompatible_mapping_exception", - }, - } - `); - }); - it('resolves left incompatible_mapping_exception if all reindex failures are due to a mapper_parsing_exception', async () => { - expect.assertions(1); - // Simulates one instance having completed the UPDATE_TARGET_MAPPINGS - // step which makes the mappings incompatible with outdated documents. - // If another instance then tries a reindex it will get a - // strict_dynamic_mapping_exception even if the documents already exist - // and should ignore this error. - - // Create an index with incompatible mappings - await createIndex({ - client, - indexName: 'reindex_target_6', - mappings: { - dynamic: false, - properties: { title: { type: 'integer' } }, // integer is incompatible with string title - }, - esCapabilities, - })(); - - const { - right: { taskId: reindexTaskId }, - } = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'reindex_target_6', - reindexScript: Option.none, - requireAlias: false, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - const task = waitForReindexTask({ client, taskId: reindexTaskId, timeout: '10s' }); - - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "incompatible_mapping_exception", - }, - } - `); - }); - it('resolves left index_not_found_exception if source index does not exist', async () => { - expect.assertions(1); - const res = (await reindex({ - client, - sourceIndex: 'no_such_index', - targetIndex: 'reindex_target', - reindexScript: Option.none, - requireAlias: false, - excludeOnUpgradeQuery: { - match_all: {}, - }, - batchSize: 1000, - })()) as Either.Right; - const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "index": "no_such_index", - "type": "index_not_found_exception", - }, - } - `); - }); - it('resolves left target_index_had_write_block if all failures are due to a write block', async () => { - expect.assertions(1); - const res = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'existing_index_with_write_block', - reindexScript: Option.none, - requireAlias: false, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - - const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); - - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "target_index_had_write_block", - }, - } - `); - }); - it('resolves left if requireAlias=true and the target is not an alias', async () => { - expect.assertions(1); - const res = (await reindex({ - client, - sourceIndex: 'existing_index_with_docs', - targetIndex: 'existing_index_with_write_block', - reindexScript: Option.none, - requireAlias: true, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - - const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); - - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "index": "existing_index_with_write_block", - "type": "index_not_found_exception", - }, - } - `); - }); - it('resolves left wait_for_task_completion_timeout when the task does not finish within the timeout', async () => { - await waitForIndexStatus({ - client, - index: '.kibana_1', - status: 'yellow', - })(); - - const res = (await reindex({ - client, - sourceIndex: '.kibana_1', - targetIndex: 'reindex_target', - reindexScript: Option.none, - requireAlias: false, - excludeOnUpgradeQuery: { match_all: {} }, - batchSize: 1000, - })()) as Either.Right; - - const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '0s' }); - - await expect(task()).resolves.toMatchObject({ - _tag: 'Left', - left: { - error: expect.any(errors.ResponseError), - message: expect.stringContaining('[timeout_exception]'), - type: 'wait_for_task_completion_timeout', - }, - }); - }); - }); - - describe('openPit', () => { - it('opens PointInTime for an index', async () => { - const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); - const pitResponse = (await openPitTask()) as Either.Right; - - expect(pitResponse.right.pitId).toEqual(expect.any(String)); - - const searchResponse = await client.search({ - body: { - pit: { id: pitResponse.right.pitId }, - }, - }); - - await expect(searchResponse.hits.hits.length).toBeGreaterThan(0); - }); - it('rejects if index does not exist', async () => { - const openPitTask = openPit({ client, index: 'no_such_index' }); - await expect(openPitTask()).rejects.toThrow('index_not_found_exception'); - }); - }); - - describe('readWithPit', () => { - it('requests documents from an index using given PIT', async () => { - const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); - const pitResponse = (await openPitTask()) as Either.Right; - - const readWithPitTask = readWithPit({ - client, - pitId: pitResponse.right.pitId, - query: { match_all: {} }, - batchSize: 1000, - searchAfter: undefined, - }); - const docsResponse = (await readWithPitTask()) as Either.Right; - - await expect(docsResponse.right.outdatedDocuments.length).toBe(6); - }); - - it('requests the batchSize of documents from an index', async () => { - const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); - const pitResponse = (await openPitTask()) as Either.Right; - - const readWithPitTask = readWithPit({ - client, - pitId: pitResponse.right.pitId, - query: { match_all: {} }, - batchSize: 3, - searchAfter: undefined, - }); - const docsResponse = (await readWithPitTask()) as Either.Right; - - await expect(docsResponse.right.outdatedDocuments.length).toBe(3); - }); - - it('it excludes documents not matching the provided "query"', async () => { - const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); - const pitResponse = (await openPitTask()) as Either.Right; - - const readWithPitTask = readWithPit({ - client, - pitId: pitResponse.right.pitId, - query: { - bool: { - must_not: [ - { - term: { - type: 'f_agent_event', - }, - }, - { - term: { - type: 'another_unused_type', - }, - }, - ], - }, - }, - batchSize: 1000, - searchAfter: undefined, - }); - - const docsResponse = (await readWithPitTask()) as Either.Right; - - expect(docsResponse.right.outdatedDocuments.map((doc) => doc._source.title).sort()) - .toMatchInlineSnapshot(` - Array [ - "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a", - "doc 1", - "doc 2", - "doc 3", - ] - `); - }); - - it('only returns documents that match the provided "query"', async () => { - const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); - const pitResponse = (await openPitTask()) as Either.Right; - - const readWithPitTask = readWithPit({ - client, - pitId: pitResponse.right.pitId, - query: { - match: { title: { query: 'doc' } }, - }, - batchSize: 1000, - searchAfter: undefined, - }); - - const docsResponse = (await readWithPitTask()) as Either.Right; - - expect(docsResponse.right.outdatedDocuments.map((doc) => doc._source.title).sort()) - .toMatchInlineSnapshot(` - Array [ - "doc 1", - "doc 2", - "doc 3", - ] - `); - }); - - it('returns docs with _seq_no and _primary_term when specified', async () => { - const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); - const pitResponse = (await openPitTask()) as Either.Right; - - const readWithPitTask = readWithPit({ - client, - pitId: pitResponse.right.pitId, - query: { - match: { title: { query: 'doc' } }, - }, - batchSize: 1000, - searchAfter: undefined, - seqNoPrimaryTerm: true, - }); - - const docsResponse = (await readWithPitTask()) as Either.Right; - - expect(docsResponse.right.outdatedDocuments).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - _seq_no: expect.any(Number), - _primary_term: expect.any(Number), - }), - ]) - ); - }); - - it('does not return docs with _seq_no and _primary_term if not specified', async () => { - const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); - const pitResponse = (await openPitTask()) as Either.Right; - - const readWithPitTask = readWithPit({ - client, - pitId: pitResponse.right.pitId, - query: { - match: { title: { query: 'doc' } }, - }, - batchSize: 1000, - searchAfter: undefined, - }); - - const docsResponse = (await readWithPitTask()) as Either.Right; - - expect(docsResponse.right.outdatedDocuments).toEqual( - expect.arrayContaining([ - expect.not.objectContaining({ - _seq_no: expect.any(Number), - _primary_term: expect.any(Number), - }), - ]) - ); - }); - - it('returns a left es_response_too_large error when a read batch exceeds the maxResponseSize', async () => { - const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); - const pitResponse = (await openPitTask()) as Either.Right; - - let readWithPitTask = readWithPit({ - client, - pitId: pitResponse.right.pitId, - query: { match_all: {} }, - batchSize: 1, // small batch size so we don't exceed the maxResponseSize - searchAfter: undefined, - maxResponseSizeBytes: 500, // set a small size to force the error - }); - const rightResponse = (await readWithPitTask()) as Either.Right; - - await expect(Either.isRight(rightResponse)).toBe(true); - - readWithPitTask = readWithPit({ - client, - pitId: pitResponse.right.pitId, - query: { match_all: {} }, - batchSize: 10, // a bigger batch will exceed the maxResponseSize - searchAfter: undefined, - maxResponseSizeBytes: 500, // set a small size to force the error - }); - const leftResponse = (await readWithPitTask()) as Either.Left; - - expect(leftResponse.left.type).toBe('es_response_too_large'); - // ES response contains a field that indicates how long it took ES to get the response, e.g.: "took": 7 - // if ES takes more than 9ms, the payload will be 1 byte bigger. - // see https://github.com/elastic/kibana/issues/160994 - // Thus, the statements below account for response times up to 99ms - expect(leftResponse.left.contentLength).toBeGreaterThanOrEqual(3184); - expect(leftResponse.left.contentLength).toBeLessThanOrEqual(3185); - }); - - it('rejects if PIT does not exist', async () => { - const readWithPitTask = readWithPit({ - client, - pitId: 'no_such_pit', - query: { match_all: {} }, - batchSize: 1000, - searchAfter: undefined, - }); - await expect(readWithPitTask()).rejects.toThrow('illegal_argument_exception'); - }); - }); - - describe('closePit', () => { - it('closes PointInTime', async () => { - const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); - const pitResponse = (await openPitTask()) as Either.Right; - - const pitId = pitResponse.right.pitId; - await closePit({ client, pitId })(); - - const searchTask = client.search({ - body: { - pit: { id: pitId }, - }, - }); - - await expect(searchTask).rejects.toThrow('search_phase_execution_exception'); - }); - - it('rejects if PIT does not exist', async () => { - const closePitTask = closePit({ client, pitId: 'no_such_pit' }); - await expect(closePitTask()).rejects.toThrow('illegal_argument_exception'); - }); - }); - - describe('transformDocs', () => { - it('applies "transformRawDocs" and returns the transformed documents', async () => { - const originalDocs = [ - { _id: 'foo:1', _source: { type: 'dashboard', value: 1 } }, - { _id: 'foo:2', _source: { type: 'dashboard', value: 2 } }, - ]; - - function innerTransformRawDocs( - docs: SavedObjectsRawDoc[] - ): TaskEither { - return async () => { - const processedDocs: SavedObjectsRawDoc[] = []; - for (const doc of docs) { - doc._source.value += 1; - processedDocs.push(doc); - } - return Either.right({ processedDocs }); - }; - } - - const transformTask = transformDocs({ - transformRawDocs: innerTransformRawDocs, - outdatedDocuments: originalDocs, - }); - - const resultsWithProcessDocs = ( - (await transformTask()) as Either.Right - ).right.processedDocs; - expect(resultsWithProcessDocs.length).toEqual(2); - const foo2 = resultsWithProcessDocs.find((h) => h._id === 'foo:2'); - expect(foo2?._source?.value).toBe(3); - }); - }); - - describe('waitForPickupUpdatedMappingsTask', () => { - it('rejects if there are failures', async () => { - const res = (await pickupUpdatedMappings( - client, - 'existing_index_with_write_block', - 1000 - )()) as Either.Right; - - const task = waitForPickupUpdatedMappingsTask({ - client, - taskId: res.right.taskId, - timeout: '10s', - }); - - // We can't do a snapshot match because the response includes an index - // id which ES assigns dynamically - await expect(task()).rejects.toMatchObject({ - message: - /pickupUpdatedMappings task failed with the following failures:\n\[\{\"index\":\"existing_index_with_write_block\"/, - }); - }); - it('rejects if there is an error', async () => { - const res = (await pickupUpdatedMappings( - client, - 'no_such_index', - 1000 - )()) as Either.Right; - - const task = waitForPickupUpdatedMappingsTask({ - client, - taskId: res.right.taskId, - timeout: '10s', - }); - - await expect(task()).rejects.toThrow('index_not_found_exception'); - }); - - it('resolves left wait_for_task_completion_timeout when the task does not complete within the timeout', async () => { - const res = (await pickupUpdatedMappings( - client, - '.kibana_1', - 1000 - )()) as Either.Right; - - const task = waitForPickupUpdatedMappingsTask({ - client, - taskId: res.right.taskId, - timeout: '0s', - }); - - await expect(task()).resolves.toMatchObject({ - _tag: 'Left', - left: { - error: expect.any(errors.ResponseError), - message: expect.stringContaining('[timeout_exception]'), - type: 'wait_for_task_completion_timeout', - }, - }); - }); - it('resolves right when successful', async () => { - const res = (await pickupUpdatedMappings( - client, - 'existing_index_with_docs', - 1000 - )()) as Either.Right; - - const task = waitForPickupUpdatedMappingsTask({ - client, - taskId: res.right.taskId, - timeout: '10s', - }); - - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "pickup_updated_mappings_succeeded", - } - `); - }); - }); - - describe('updateAndPickupMappings', () => { - it('resolves right when mappings were updated and picked up', async () => { - // Create an index without any mappings and insert documents into it - await createIndex({ - client, - indexName: 'existing_index_without_mappings', - mappings: { - dynamic: false, - properties: {}, - }, - esCapabilities, - })(); - const sourceDocs = [ - { _source: { title: 'doc 1' } }, - { _source: { title: 'doc 2' } }, - { _source: { title: 'doc 3' } }, - { _source: { title: 'doc 4' } }, - ] as unknown as SavedObjectsRawDoc[]; - await bulkOverwriteTransformedDocuments({ - client, - index: 'existing_index_without_mappings', - operations: sourceDocs.map((doc) => createBulkIndexOperationTuple(doc)), - refresh: 'wait_for', - })(); - - // Assert that we can't search over the unmapped fields of the document - - const originalSearchResults = await client.search({ - index: 'existing_index_without_mappings', - size: 1000, - query: { - match: { title: { query: 'doc' } }, - }, - }); - expect(originalSearchResults.hits?.hits.length).toBe(0); - - // Update and pickup mappings so that the title field is searchable - const res = await updateAndPickupMappings({ - client, - index: 'existing_index_without_mappings', - mappings: { - properties: { - title: { type: 'text' }, - }, - }, - batchSize: 1000, - })(); - expect(Either.isRight(res)).toBe(true); - const taskId = (res as Either.Right).right.taskId; - await waitForPickupUpdatedMappingsTask({ client, taskId, timeout: '60s' })(); - - // Repeat the search expecting to be able to find the existing documents - const pickedUpSearchResults = await client.search({ - index: 'existing_index_without_mappings', - size: 1000, - query: { - match: { title: { query: 'doc' } }, - }, - }); - expect(pickedUpSearchResults.hits?.hits.length).toBe(4); - }); - }); - - describe('updateMappings', () => { - it('rejects if ES throws an error', async () => { - const task = updateMappings({ - client, - index: 'no_such_index', - mappings: { - properties: { - created_at: { - type: 'date', - }, - }, - _meta: { - migrationMappingPropertyHashes: { - references: 'updateda56cc02bdc9c93361bupdated', - newReferences: 'fooBarHashMd509387420934879300d9', - }, - }, - }, - })(); - - await expect(task).rejects.toThrow('index_not_found_exception'); - }); - - it('resolves left when the mappings are incompatible', async () => { - const res = await updateMappings({ - client, - index: 'existing_index_with_docs', - mappings: { - properties: { - someProperty: { - type: 'date', // attempt to change an existing field's type in an incompatible fashion - }, - }, - _meta: { - migrationMappingPropertyHashes: { - references: 'updateda56cc02bdc9c93361bupdated', - newReferences: 'fooBarHashMd509387420934879300d9', - }, - }, - }, - })(); - - expect(Either.isLeft(res)).toBe(true); - expect(res).toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "incompatible_mapping_exception", - }, - } - `); - }); - - it('resolves right when mappings are correctly updated', async () => { - const res = await updateMappings({ - client, - index: 'existing_index_with_docs', - mappings: { - properties: { - created_at: { - type: 'date', - }, - }, - _meta: { - migrationMappingPropertyHashes: { - references: 'updateda56cc02bdc9c93361bupdated', - newReferences: 'fooBarHashMd509387420934879300d9', - }, - }, - }, - })(); - - expect(Either.isRight(res)).toBe(true); - - const indices = await client.indices.get({ - index: ['existing_index_with_docs'], - }); - - expect(indices.existing_index_with_docs.mappings?.properties).toEqual( - expect.objectContaining({ - created_at: { - type: 'date', - }, - }) - ); - - expect(indices.existing_index_with_docs.mappings?._meta).toEqual({ - migrationMappingPropertyHashes: { - references: 'updateda56cc02bdc9c93361bupdated', - newReferences: 'fooBarHashMd509387420934879300d9', - }, - }); - }); - }); - - describe('updateAliases', () => { - describe('remove', () => { - it('resolves left index_not_found_exception when the index does not exist', async () => { - const task = updateAliases({ - client, - aliasActions: [ - { - remove: { - alias: 'no_such_alias', - index: 'no_such_index', - must_exist: false, - }, - }, - ], - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "index": "no_such_index", - "type": "index_not_found_exception", - }, - } - `); - }); - describe('with must_exist=false', () => { - it('resolves left alias_not_found_exception when alias does not exist', async () => { - const task = updateAliases({ - client, - aliasActions: [ - { - remove: { - alias: 'no_such_alias', - index: 'existing_index_with_docs', - must_exist: false, - }, - }, - ], - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "alias_not_found_exception", - }, - } - `); - }); - }); - describe('with must_exist=true', () => { - it('resolves left alias_not_found_exception when alias does not exist on specified index', async () => { - const task = updateAliases({ - client, - aliasActions: [ - { - remove: { - alias: 'existing_index_2_alias', - index: 'existing_index_with_docs', - must_exist: true, - }, - }, - ], - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "alias_not_found_exception", - }, - } - `); - }); - it('resolves left alias_not_found_exception when alias does not exist', async () => { - const task = updateAliases({ - client, - aliasActions: [ - { - remove: { - alias: 'no_such_alias', - index: 'existing_index_with_docs', - must_exist: true, - }, - }, - ], - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "alias_not_found_exception", - }, - } - `); - }); - }); - }); - describe('remove_index', () => { - it('left index_not_found_exception if index does not exist', async () => { - const task = updateAliases({ - client, - aliasActions: [ - { - remove_index: { - index: 'no_such_index', - }, - }, - ], - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "index": "no_such_index", - "type": "index_not_found_exception", - }, - } - `); - }); - it('left remove_index_not_a_concrete_index when remove_index targets an alias', async () => { - const task = updateAliases({ - client, - aliasActions: [ - { - remove_index: { - index: 'existing_index_2_alias', - }, - }, - ], - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "remove_index_not_a_concrete_index", - }, - } - `); - }); - }); - }); - - describe('createIndex', () => { - afterEach(async () => { - // Restore the default setting of 1000 shards per node - await client.cluster.putSettings({ persistent: { cluster: { max_shards_per_node: null } } }); - }); - afterAll(async () => { - await client.indices.delete({ index: 'red_then_yellow_index' }).catch(); - await client.indices.delete({ index: 'yellow_then_green_index' }).catch(); - await client.indices.delete({ index: 'create_new_index' }).catch(); - }); - it('resolves right after waiting for an index status to become green when cluster state is not propagated within the timeout', async () => { - // By specifying a very short timeout Elasticsearch will respond before the shard is allocated - const createIndexPromise = createIndex({ - client, - indexName: 'create_new_index', - mappings: undefined as any, - timeout: '1nanos', - esCapabilities, - })(); - await expect(createIndexPromise).resolves.toEqual({ - _tag: 'Right', - right: 'create_index_succeeded', - }); - const { create_new_index: createNewIndex } = await client.indices.getSettings({ - index: 'create_new_index', - }); - // @ts-expect-error https://github.com/elastic/elasticsearch/issues/89381 - expect(createNewIndex.settings?.index?.mapping.total_fields.limit).toBe('1500'); - }); - it('resolves left if an existing index status does not become green', async () => { - expect.assertions(2); - // Create a red index - await client.indices - .create( - { - index: 'red_then_yellow_index', - timeout: '5s', - body: { - mappings: { properties: {} }, - settings: { - // Allocate 1 replica so that this index stays yellow - number_of_replicas: '1', - // Disable all shard allocation so that the index status starts as red - index: { routing: { allocation: { enable: 'none' } } }, - }, - }, - }, - { maxRetries: 0 /** handle retry ourselves for now */ } - ) - .catch((e) => { - /** ignore */ - }); - - // Call createIndex even though the index already exists - const createIndexPromise = createIndex({ - client, - indexName: 'red_then_yellow_index', - mappings: undefined as any, - esCapabilities, - })(); - let indexYellow = false; - - setTimeout(() => { - client.indices.putSettings({ - index: 'red_then_yellow_index', - body: { - // Renable allocation so that the status becomes yellow - routing: { allocation: { enable: 'all' } }, - }, - }); - indexYellow = true; - }, 10); - - await createIndexPromise.then((err) => { - // Assert that the promise didn't resolve before the index became yellow - expect(indexYellow).toBe(true); - expect(err).toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "message": "[index_not_green_timeout] Timeout waiting for the status of the [red_then_yellow_index] index to become 'green'", - "type": "index_not_green_timeout", - }, - } - `); - }); - }); - it('resolves right after waiting for an existing index status to become green', async () => { - expect.assertions(2); - // Create a yellow index - await client.indices - .create({ - index: 'yellow_then_green_index', - timeout: '5s', - body: { - mappings: { properties: {} }, - settings: { - // Allocate 1 replica so that this index stays yellow - number_of_replicas: '1', - }, - }, - }) - .catch((e) => { - /** ignore */ - }); - - // Call createIndex even though the index already exists - const createIndexPromise = createIndex({ - client, - indexName: 'yellow_then_green_index', - mappings: undefined as any, - esCapabilities, - })(); - let indexGreen = false; - - setTimeout(() => { - client.indices.putSettings({ - index: 'yellow_then_green_index', - body: { - // Set 0 replican so that this index becomes green - number_of_replicas: '0', - }, - }); - indexGreen = true; - }, 10); - - await createIndexPromise.then((res) => { - // Assert that the promise didn't resolve before the index became green - expect(indexGreen).toBe(true); - expect(res).toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "index_already_exists", - } - `); - }); - }); - it('resolves left cluster_shard_limit_exceeded when the action would exceed the maximum normal open shards', async () => { - // Set the max shards per node really low so that any new index that's created would exceed the maximum open shards for this cluster - await client.cluster.putSettings({ persistent: { cluster: { max_shards_per_node: 1 } } }); - const createIndexPromise = createIndex({ - client, - indexName: 'create_index_1', - mappings: undefined as any, - esCapabilities, - })(); - await expect(createIndexPromise).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "cluster_shard_limit_exceeded", - }, - } - `); - }); - it('rejects when there is an unexpected error creating the index', async () => { - // Creating an index with the same name as an existing alias to induce - // failure - await expect( - createIndex({ - client, - indexName: 'existing_index_2_alias', - mappings: undefined as any, - esCapabilities, - })() - ).rejects.toThrow('invalid_index_name_exception'); - }); - }); - - describe('bulkOverwriteTransformedDocuments', () => { - it('resolves right when documents do not yet exist in the index', async () => { - const newDocs = [ - { _source: { title: 'doc 5' } }, - { _source: { title: 'doc 6' } }, - { _source: { title: 'doc 7' } }, - ] as unknown as SavedObjectsRawDoc[]; - const task = bulkOverwriteTransformedDocuments({ - client, - index: 'existing_index_with_docs', - operations: newDocs.map((doc) => createBulkIndexOperationTuple(doc)), - refresh: 'wait_for', - }); - - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "bulk_index_succeeded", - } - `); - }); - it('resolves right even if there were some version_conflict_engine_exception', async () => { - const response = await client.search({ index: 'existing_index_with_docs', size: 1000 }); - const existingDocs = response.hits?.hits as SavedObjectsRawDoc[]; - - const task = bulkOverwriteTransformedDocuments({ - client, - index: 'existing_index_with_docs', - operations: [ - ...existingDocs, - { _source: { title: 'doc 8' } } as unknown as SavedObjectsRawDoc, - ].map((doc) => createBulkIndexOperationTuple(doc)), - refresh: 'wait_for', - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Right", - "right": "bulk_index_succeeded", - } - `); - }); - it('resolves left index_not_found_exception if the index does not exist and useAliasToPreventAutoCreate=true', async () => { - const newDocs = [ - { _source: { title: 'doc 5' } }, - { _source: { title: 'doc 6' } }, - { _source: { title: 'doc 7' } }, - ] as unknown as SavedObjectsRawDoc[]; - await expect( - bulkOverwriteTransformedDocuments({ - client, - index: 'existing_index_with_docs_alias_that_does_not_exist', - useAliasToPreventAutoCreate: true, - operations: newDocs.map((doc) => createBulkIndexOperationTuple(doc)), - refresh: 'wait_for', - })() - ).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "index": "existing_index_with_docs_alias_that_does_not_exist", - "type": "index_not_found_exception", - }, - } - `); - }); - it('resolves left target_index_had_write_block if there are write_block errors', async () => { - const newDocs = [ - { _source: { title: 'doc 5' } }, - { _source: { title: 'doc 6' } }, - { _source: { title: 'doc 7' } }, - ] as unknown as SavedObjectsRawDoc[]; - await expect( - bulkOverwriteTransformedDocuments({ - client, - index: 'existing_index_with_write_block', - operations: newDocs.map((doc) => createBulkIndexOperationTuple(doc)), - refresh: 'wait_for', - })() - ).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "target_index_had_write_block", - }, - } - `); - }); - - it('resolves left request_entity_too_large_exception when the payload is too large', async () => { - const newDocs = new Array(10000).fill({ - _source: { - title: - 'how do I create a document thats large enoug to exceed the limits without typing long sentences', - }, - }) as SavedObjectsRawDoc[]; - const task = bulkOverwriteTransformedDocuments({ - client, - index: 'existing_index_with_docs', - operations: newDocs.map((doc) => createBulkIndexOperationTuple(doc)), - }); - await expect(task()).resolves.toMatchInlineSnapshot(` - Object { - "_tag": "Left", - "left": Object { - "type": "request_entity_too_large_exception", - }, - } - `); - }); + runActionTestSuite({ + startEs: async () => { + const esServer = await startES(); + const client = esServer.es.getClient().child(MIGRATION_CLIENT_OPTIONS); + return { esServer, client }; + }, + environment: 'traditional', }); }); diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts new file mode 100644 index 0000000000000..9df98deea3b89 --- /dev/null +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions_test_suite.ts @@ -0,0 +1,2097 @@ +/* + * 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 * as Either from 'fp-ts/lib/Either'; +import * as Option from 'fp-ts/lib/Option'; +import { errors } from '@elastic/elasticsearch'; +import type { TaskEither } from 'fp-ts/lib/TaskEither'; +import type { SavedObjectsRawDoc } from '@kbn/core-saved-objects-server'; +import type { + ElasticsearchClient, + ElasticsearchCapabilities, +} from '@kbn/core-elasticsearch-server'; +import { getCapabilitiesFromClient } from '@kbn/core-elasticsearch-server-internal'; +import { + bulkOverwriteTransformedDocuments, + closePit, + createIndex, + openPit, + type OpenPitResponse, + reindex, + readWithPit, + type EsResponseTooLargeError, + type ReadWithPit, + setWriteBlock, + updateAliases, + waitForReindexTask, + type ReindexResponse, + waitForPickupUpdatedMappingsTask, + pickupUpdatedMappings, + type UpdateByQueryResponse, + updateAndPickupMappings, + type UpdateAndPickupMappingsResponse, + updateMappings, + removeWriteBlock, + transformDocs, + waitForIndexStatus, + initAction, + cloneIndex, + type DocumentsTransformFailed, + type DocumentsTransformSuccess, + createBulkIndexOperationTuple, +} from '@kbn/core-saved-objects-migration-server-internal'; + +interface EsServer { + stop: () => Promise; +} + +type StartEs = () => Promise<{ + esServer: EsServer; + client: ElasticsearchClient; +}>; + +export const runActionTestSuite = ({ + startEs, + environment, +}: { + startEs: StartEs; + environment: 'traditional' | 'serverless'; +}) => { + let esServer: EsServer; + let client: ElasticsearchClient; + let esCapabilities: ElasticsearchCapabilities; + + const runOnTraditionalOnly = (fn: Function) => { + if (environment === 'traditional') { + fn(); + } + }; + + beforeAll(async () => { + const { esServer: _esServer, client: _client } = await startEs(); + esServer = _esServer; + client = _client; + esCapabilities = await getCapabilitiesFromClient(client); + + // Create test fixture data: + await createIndex({ + client, + indexName: 'existing_index_with_docs', + aliases: ['existing_index_with_docs_alias'], + esCapabilities, + mappings: { + dynamic: true, + properties: { + someProperty: { + type: 'integer', + }, + }, + _meta: { + migrationMappingPropertyHashes: { + references: '7997cf5a56cc02bdc9c93361bde732b0', + }, + }, + }, + })(); + const docs = [ + { _source: { title: 'doc 1' } }, + { _source: { title: 'doc 2' } }, + { _source: { title: 'doc 3' } }, + { _source: { title: 'saved object 4', type: 'another_unused_type' } }, + { _source: { title: 'f-agent-event 5', type: 'f_agent_event' } }, + { _source: { title: new Array(1000).fill('a').join(), type: 'large' } }, // "large" saved object + ] as unknown as SavedObjectsRawDoc[]; + await bulkOverwriteTransformedDocuments({ + client, + index: 'existing_index_with_docs', + operations: docs.map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + })(); + + await createIndex({ + client, + indexName: 'existing_index_2', + mappings: { properties: {} }, + esCapabilities, + })(); + await createIndex({ + client, + indexName: 'existing_index_with_write_block', + mappings: { properties: {} }, + esCapabilities, + })(); + await bulkOverwriteTransformedDocuments({ + client, + index: 'existing_index_with_write_block', + operations: docs.map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + })(); + await setWriteBlock({ client, index: 'existing_index_with_write_block' })(); + await updateAliases({ + client, + aliasActions: [{ add: { index: 'existing_index_2', alias: 'existing_index_2_alias' } }], + })(); + }); + + afterAll(async () => { + await client.indices.delete({ index: 'existing_index_with_docs' }).catch(() => ({})); + await client.indices.delete({ index: 'existing_index_2' }).catch(() => ({})); + await client.indices.delete({ index: 'existing_index_with_write_block' }).catch(() => ({})); + + await esServer.stop(); + }); + + describe('initAction', () => { + afterAll(async () => { + await client.cluster.putSettings({ + body: { + persistent: { + // Reset persistent test settings + cluster: { routing: { allocation: { enable: null } } }, + }, + }, + }); + }); + it('resolves right empty record if no indices were found', async () => { + expect.assertions(1); + const task = initAction({ client, indices: ['no_such_index'] }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": Object {}, + } + `); + }); + it('resolves right record with found indices', async () => { + expect.assertions(1); + const res = (await initAction({ + client, + indices: ['no_such_index', 'existing_index_with_docs'], + })()) as Either.Right; + + expect(res.right).toEqual( + expect.objectContaining({ + existing_index_with_docs: expect.objectContaining({ + aliases: { + existing_index_with_docs_alias: {}, + }, + mappings: expect.anything(), + settings: expect.anything(), + }), + }) + ); + }); + it('includes the _meta data of the indices in the response', async () => { + expect.assertions(1); + const res = (await initAction({ + client, + indices: ['existing_index_with_docs'], + })()) as Either.Right; + + expect(res.right).toEqual( + expect.objectContaining({ + existing_index_with_docs: expect.objectContaining({ + aliases: { + existing_index_with_docs_alias: {}, + }, + mappings: { + // FIXME https://github.com/elastic/elasticsearch-js/issues/1796 + dynamic: 'true', + properties: expect.anything(), + _meta: { + migrationMappingPropertyHashes: { + references: '7997cf5a56cc02bdc9c93361bde732b0', + }, + }, + }, + settings: expect.anything(), + }), + }) + ); + }); + it('resolves left when cluster.routing.allocation.enabled is incompatible', async () => { + expect.assertions(3); + await client.cluster.putSettings({ + body: { + persistent: { + // Disable all routing allocation + cluster: { routing: { allocation: { enable: 'none' } } }, + }, + }, + }); + const task = initAction({ + client, + indices: ['existing_index_with_docs'], + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "incompatible_cluster_routing_allocation", + }, + } + `); + await client.cluster.putSettings({ + body: { + persistent: { + // Allow routing to existing primaries only + cluster: { routing: { allocation: { enable: 'primaries' } } }, + }, + }, + }); + const task2 = initAction({ + client, + indices: ['existing_index_with_docs'], + }); + await expect(task2()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "incompatible_cluster_routing_allocation", + }, + } + `); + await client.cluster.putSettings({ + body: { + persistent: { + // Allow routing to new primaries only + cluster: { routing: { allocation: { enable: 'new_primaries' } } }, + }, + }, + }); + const task3 = initAction({ + client, + indices: ['existing_index_with_docs'], + }); + await expect(task3()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "incompatible_cluster_routing_allocation", + }, + } + `); + }); + it('resolves right when cluster.routing.allocation.enabled=all', async () => { + expect.assertions(1); + await client.cluster.putSettings({ + body: { + persistent: { + cluster: { routing: { allocation: { enable: 'all' } } }, + }, + }, + }); + const task = initAction({ + client, + indices: ['existing_index_with_docs'], + }); + const result = await task(); + expect(Either.isRight(result)).toBe(true); + }); + }); + + describe('setWriteBlock', () => { + beforeAll(async () => { + await createIndex({ + client, + indexName: 'new_index_without_write_block', + mappings: { properties: {} }, + esCapabilities, + })(); + }); + it('resolves right when setting the write block succeeds', async () => { + expect.assertions(1); + const task = setWriteBlock({ client, index: 'new_index_without_write_block' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "set_write_block_succeeded", + } + `); + }); + it('resolves right when setting a write block on an index that already has one', async () => { + expect.assertions(1); + const task = setWriteBlock({ client, index: 'existing_index_with_write_block' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "set_write_block_succeeded", + } + `); + }); + it('once resolved, prevents further writes to the index', async () => { + expect.assertions(1); + const task = setWriteBlock({ client, index: 'new_index_without_write_block' }); + await task(); + const sourceDocs = [ + { _source: { title: 'doc 1' } }, + { _source: { title: 'doc 2' } }, + { _source: { title: 'doc 3' } }, + { _source: { title: 'doc 4' } }, + ] as unknown as SavedObjectsRawDoc[]; + + const res = (await bulkOverwriteTransformedDocuments({ + client, + index: 'new_index_without_write_block', + operations: sourceDocs.map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + })()) as Either.Left; + + expect(res.left).toEqual({ + type: 'target_index_had_write_block', + }); + }); + it('resolves left index_not_found_exception when the index does not exist', async () => { + expect.assertions(1); + const task = setWriteBlock({ client, index: 'no_such_index' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "index": "no_such_index", + "type": "index_not_found_exception", + }, + } + `); + }); + }); + + describe('removeWriteBlock', () => { + beforeAll(async () => { + await createIndex({ + client, + indexName: 'existing_index_without_write_block_2', + mappings: { properties: {} }, + esCapabilities, + })(); + await createIndex({ + client, + indexName: 'existing_index_with_write_block_2', + mappings: { properties: {} }, + esCapabilities, + })(); + await setWriteBlock({ client, index: 'existing_index_with_write_block_2' })(); + }); + it('resolves right if successful when an index already has a write block', async () => { + expect.assertions(1); + const task = removeWriteBlock({ client, index: 'existing_index_with_write_block_2' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "remove_write_block_succeeded", + } + `); + }); + it('resolves right if successful when an index does not have a write block', async () => { + expect.assertions(1); + const task = removeWriteBlock({ client, index: 'existing_index_without_write_block_2' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "remove_write_block_succeeded", + } + `); + }); + it('rejects if there is a non-retryable error', async () => { + expect.assertions(1); + const task = removeWriteBlock({ client, index: 'no_such_index' }); + await expect(task()).rejects.toThrow('index_not_found_exception'); + }); + }); + + describe('waitForIndexStatus', () => { + afterEach(async () => { + await client.indices.delete({ index: 'red_then_yellow_index' }).catch(() => ({})); + await client.indices.delete({ index: 'red_index' }).catch(() => ({})); + }); + + // routing allocation and number_of_replicas settings not supported on serverless + runOnTraditionalOnly(() => { + it('resolves right after waiting for an index status to be yellow if the index already existed', async () => { + // Create a red index + await client.indices.create( + { + index: 'red_then_yellow_index', + timeout: '5s', + body: { + mappings: { properties: {} }, + settings: { + // Allocate 1 replica so that this index stays yellow + number_of_replicas: '1', + // Disable all shard allocation so that the index status is red + routing: { allocation: { enable: 'none' } }, + }, + }, + }, + { maxRetries: 0 /** handle retry ourselves for now */ } + ); + + // Start tracking the index status + const indexStatusPromise = waitForIndexStatus({ + client, + index: 'red_then_yellow_index', + status: 'yellow', + })(); + + const redStatusResponse = await client.cluster.health({ index: 'red_then_yellow_index' }); + expect(redStatusResponse.status).toBe('red'); + + client.indices.putSettings({ + index: 'red_then_yellow_index', + body: { + // Enable all shard allocation so that the index status turns yellow + routing: { allocation: { enable: 'all' } }, + }, + }); + + await indexStatusPromise; + // Assert that the promise didn't resolve before the index became yellow + + const yellowStatusResponse = await client.cluster.health({ + index: 'red_then_yellow_index', + }); + expect(yellowStatusResponse.status).toBe('yellow'); + }); + }); + + it('resolves left with "index_not_yellow_timeout" after waiting for an index status to be yellow timeout', async () => { + // Create a red index + await client.indices + .create({ + index: 'red_index', + timeout: '5s', + body: { + mappings: { properties: {} }, + settings: { + // Allocate no replicas so that this index stays red + number_of_replicas: '0', + // Disable all shard allocation so that the index status is red + index: { routing: { allocation: { enable: 'none' } } }, + }, + }, + }) + .catch((e) => {}); + // try to wait for index status yellow: + const task = waitForIndexStatus({ + client, + index: 'red_index', + timeout: '1s', + status: 'yellow', + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "message": "[index_not_yellow_timeout] Timeout waiting for the status of the [red_index] index to become 'yellow'", + "type": "index_not_yellow_timeout", + }, + } + `); + }); + + it('resolves left with "index_not_green_timeout" after waiting for an index status to be green timeout', async () => { + // Create a yellow index + await client.indices + .create({ + index: 'yellow_index', + timeout: '5s', + body: { + mappings: { properties: {} }, + settings: { + // Allocate no replicas so that this index stays yellow + number_of_replicas: '0', + }, + }, + }) + .catch((e) => {}); + // try to wait for index status yellow: + const task = waitForIndexStatus({ + client, + index: 'red_index', + timeout: '1s', + status: 'green', + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "message": "[index_not_green_timeout] Timeout waiting for the status of the [red_index] index to become 'green'", + "type": "index_not_green_timeout", + }, + } + `); + }); + }); + + // _clone is blocked on serverless + runOnTraditionalOnly(() => { + describe('cloneIndex', () => { + afterAll(async () => { + try { + // Restore the default setting of 1000 shards per node + await client.cluster.putSettings({ + persistent: { cluster: { max_shards_per_node: null } }, + }); + await client.indices.delete({ index: 'clone_*' }); + } catch (e) { + /** ignore */ + } + }); + it('resolves right if cloning into a new target index', async () => { + const task = cloneIndex({ + client, + source: 'existing_index_with_write_block', + target: 'clone_target_1', + esCapabilities, + }); + expect.assertions(3); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": Object { + "acknowledged": true, + "shardsAcknowledged": true, + }, + } + `); + const { clone_target_1: cloneTarget1 } = await client.indices.getSettings({ + index: 'clone_target_1', + }); + // @ts-expect-error https://github.com/elastic/elasticsearch/issues/89381 + expect(cloneTarget1.settings?.index.mapping?.total_fields.limit).toBe('1500'); + expect(cloneTarget1.settings?.blocks?.write).toBeUndefined(); + }); + it('resolves right if clone target already existed after waiting for index status to be green ', async () => { + expect.assertions(2); + + // Create a red index that we later turn into green + await client.indices + .create({ + index: 'clone_red_then_green_index', + timeout: '5s', + body: { + mappings: { properties: {} }, + settings: { + // Allocate 1 replica so that this index can go to green + number_of_replicas: '0', + // Disable all shard allocation so that the index status is red + index: { routing: { allocation: { enable: 'none' } } }, + }, + }, + }) + .catch((e) => {}); + + // Call clone even though the index already exists + const cloneIndexPromise = cloneIndex({ + client, + source: 'existing_index_with_write_block', + target: 'clone_red_then_green_index', + esCapabilities, + })(); + + let indexGreen = false; + setTimeout(() => { + client.indices.putSettings({ + index: 'clone_red_then_green_index', + body: { + // Enable all shard allocation so that the index status goes green + routing: { allocation: { enable: 'all' } }, + }, + }); + indexGreen = true; + }, 10); + + await cloneIndexPromise.then((res) => { + // Assert that the promise didn't resolve before the index became green + expect(indexGreen).toBe(true); + expect(res).toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": Object { + "acknowledged": true, + "shardsAcknowledged": true, + }, + } + `); + }); + }); + it('resolves left with a index_not_green_timeout if clone target already exists but takes longer than the specified timeout before turning green', async () => { + // Create a red index + await client.indices + .create({ + index: 'clone_red_index', + timeout: '5s', + body: { + mappings: { properties: {} }, + settings: { + // Allocate 1 replica so that this index stays yellow + number_of_replicas: '1', + // Disable all shard allocation so that the index status is red + index: { routing: { allocation: { enable: 'none' } } }, + }, + }, + }) + .catch((e) => {}); + + // Call clone even though the index already exists + let cloneIndexPromise = cloneIndex({ + client, + source: 'existing_index_with_write_block', + target: 'clone_red_index', + timeout: '1s', + esCapabilities, + })(); + + await expect(cloneIndexPromise).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "message": "[index_not_green_timeout] Timeout waiting for the status of the [clone_red_index] index to become 'green'", + "type": "index_not_green_timeout", + }, + } + `); + + // Now make the index yellow and repeat + + await client.indices.putSettings({ + index: 'clone_red_index', + body: { + // Enable all shard allocation so that the index status goes yellow + routing: { allocation: { enable: 'all' } }, + }, + }); + + // Call clone even though the index already exists + cloneIndexPromise = cloneIndex({ + client, + source: 'existing_index_with_write_block', + target: 'clone_red_index', + timeout: '1s', + esCapabilities, + })(); + + await expect(cloneIndexPromise).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "message": "[index_not_green_timeout] Timeout waiting for the status of the [clone_red_index] index to become 'green'", + "type": "index_not_green_timeout", + }, + } + `); + + // Now make the index green and it should succeed + + await client.indices.putSettings({ + index: 'clone_red_index', + body: { + // Set zero replicas so status goes green + number_of_replicas: 0, + }, + }); + + // Call clone even though the index already exists + cloneIndexPromise = cloneIndex({ + client, + source: 'existing_index_with_write_block', + target: 'clone_red_index', + timeout: '30s', + esCapabilities, + })(); + + await expect(cloneIndexPromise).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": Object { + "acknowledged": true, + "shardsAcknowledged": true, + }, + } + `); + }); + it('resolves left index_not_found_exception if the source index does not exist', async () => { + expect.assertions(1); + const task = cloneIndex({ + client, + source: 'no_such_index', + target: 'clone_target_3', + esCapabilities, + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "index": "no_such_index", + "type": "index_not_found_exception", + }, + } + `); + }); + it('resolves left cluster_shard_limit_exceeded when the action would exceed the maximum normal open shards', async () => { + // Set the max shards per node really low so that any new index that's created would exceed the maximum open shards for this cluster + await client.cluster.putSettings({ persistent: { cluster: { max_shards_per_node: 1 } } }); + const cloneIndexPromise = cloneIndex({ + client, + source: 'existing_index_with_write_block', + target: 'clone_target_4', + esCapabilities, + })(); + await expect(cloneIndexPromise).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "cluster_shard_limit_exceeded", + }, + } + `); + }); + }); + }); + + // Reindex doesn't return any errors on it's own, so we have to test + // together with waitForReindexTask + // Failing: See https://github.com/elastic/kibana/issues/166190 + describe.skip('reindex & waitForReindexTask', () => { + it('resolves right when reindex succeeds without reindex script', async () => { + const res = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'reindex_target', + reindexScript: Option.none, + requireAlias: false, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "reindex_succeeded", + } + `); + + const results = await client.search({ index: 'reindex_target', size: 1000 }); + expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) + .toMatchInlineSnapshot(` + Array [ + "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a", + "doc 1", + "doc 2", + "doc 3", + "f-agent-event 5", + "saved object 4", + ] + `); + }); + it('resolves right and excludes all documents not matching the excludeOnUpgradeQuery', async () => { + const res = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'reindex_target_excluded_docs', + reindexScript: Option.none, + requireAlias: false, + excludeOnUpgradeQuery: { + bool: { + must_not: ['f_agent_event', 'another_unused_type'].map((type) => ({ + term: { type }, + })), + }, + }, + batchSize: 1000, + })()) as Either.Right; + const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "reindex_succeeded", + } + `); + + const results = await client.search({ index: 'reindex_target_excluded_docs', size: 1000 }); + expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) + .toMatchInlineSnapshot(` + Array [ + "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a", + "doc 1", + "doc 2", + "doc 3", + ] + `); + }); + it('resolves right when reindex succeeds with reindex script', async () => { + expect.assertions(2); + const res = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'reindex_target_2', + reindexScript: Option.some(`ctx._source.title = ctx._source.title + '_updated'`), + requireAlias: false, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "reindex_succeeded", + } + `); + + const results = await client.search({ index: 'reindex_target_2', size: 1000 }); + expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) + .toMatchInlineSnapshot(` + Array [ + "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a_updated", + "doc 1_updated", + "doc 2_updated", + "doc 3_updated", + "f-agent-event 5_updated", + "saved object 4_updated", + ] + `); + }); + it('resolves right, ignores version conflicts and does not update existing docs when reindex multiple times', async () => { + expect.assertions(3); + // Reindex with a script + let res = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'reindex_target_3', + reindexScript: Option.some(`ctx._source.title = ctx._source.title + '_updated'`), + requireAlias: false, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + let task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "reindex_succeeded", + } + `); + + // reindex without a script + res = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'reindex_target_3', + reindexScript: Option.none, + requireAlias: false, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "reindex_succeeded", + } + `); + + // Assert that documents weren't overridden by the second, unscripted reindex + const results = await client.search({ index: 'reindex_target_3', size: 1000 }); + expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) + .toMatchInlineSnapshot(` + Array [ + "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a_updated", + "doc 1_updated", + "doc 2_updated", + "doc 3_updated", + "f-agent-event 5_updated", + "saved object 4_updated", + ] + `); + }); + it('resolves right and proceeds to add missing documents if there are some existing docs conflicts', async () => { + expect.assertions(2); + // Simulate a reindex that only adds some of the documents from the + // source index into the target index + await createIndex({ + client, + indexName: 'reindex_target_4', + mappings: { properties: {} }, + esCapabilities, + })(); + const response = await client.search({ index: 'existing_index_with_docs', size: 1000 }); + const sourceDocs = (response.hits?.hits as SavedObjectsRawDoc[]) + .slice(0, 2) + .map(({ _id, _source }) => ({ + _id, + _source, + })); + await bulkOverwriteTransformedDocuments({ + client, + index: 'reindex_target_4', + operations: sourceDocs.map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + })(); + + // Now do a real reindex + const res = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'reindex_target_4', + reindexScript: Option.some(`ctx._source.title = ctx._source.title + '_updated'`), + requireAlias: false, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "reindex_succeeded", + } + `); + // Assert that existing documents weren't overridden, but that missing + // documents were added by the reindex + const results = await client.search({ index: 'reindex_target_4', size: 1000 }); + expect((results.hits?.hits as SavedObjectsRawDoc[]).map((doc) => doc._source.title).sort()) + .toMatchInlineSnapshot(` + Array [ + "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a_updated", + "doc 1", + "doc 2", + "doc 3_updated", + "f-agent-event 5_updated", + "saved object 4_updated", + ] + `); + }); + it('resolves left incompatible_mapping_exception if all reindex failures are due to a strict_dynamic_mapping_exception', async () => { + expect.assertions(1); + // Simulates one instance having completed the UPDATE_TARGET_MAPPINGS + // step which makes the mappings incompatible with outdated documents. + // If another instance then tries a reindex it will get a + // strict_dynamic_mapping_exception even if the documents already exist + // and should ignore this error. + + // Create an index with incompatible mappings + await createIndex({ + client, + indexName: 'reindex_target_5', + mappings: { + dynamic: 'strict', + properties: { + /** no title field */ + }, + }, + esCapabilities, + })(); + + const { + right: { taskId: reindexTaskId }, + } = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'reindex_target_5', + reindexScript: Option.none, + requireAlias: false, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + const task = waitForReindexTask({ client, taskId: reindexTaskId, timeout: '10s' }); + + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "incompatible_mapping_exception", + }, + } + `); + }); + it('resolves left incompatible_mapping_exception if all reindex failures are due to a mapper_parsing_exception', async () => { + expect.assertions(1); + // Simulates one instance having completed the UPDATE_TARGET_MAPPINGS + // step which makes the mappings incompatible with outdated documents. + // If another instance then tries a reindex it will get a + // strict_dynamic_mapping_exception even if the documents already exist + // and should ignore this error. + + // Create an index with incompatible mappings + await createIndex({ + client, + indexName: 'reindex_target_6', + mappings: { + dynamic: false, + properties: { title: { type: 'integer' } }, // integer is incompatible with string title + }, + esCapabilities, + })(); + + const { + right: { taskId: reindexTaskId }, + } = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'reindex_target_6', + reindexScript: Option.none, + requireAlias: false, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + const task = waitForReindexTask({ client, taskId: reindexTaskId, timeout: '10s' }); + + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "incompatible_mapping_exception", + }, + } + `); + }); + it('resolves left index_not_found_exception if source index does not exist', async () => { + expect.assertions(1); + const res = (await reindex({ + client, + sourceIndex: 'no_such_index', + targetIndex: 'reindex_target', + reindexScript: Option.none, + requireAlias: false, + excludeOnUpgradeQuery: { + match_all: {}, + }, + batchSize: 1000, + })()) as Either.Right; + const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "index": "no_such_index", + "type": "index_not_found_exception", + }, + } + `); + }); + it('resolves left target_index_had_write_block if all failures are due to a write block', async () => { + expect.assertions(1); + const res = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'existing_index_with_write_block', + reindexScript: Option.none, + requireAlias: false, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + + const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); + + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "target_index_had_write_block", + }, + } + `); + }); + it('resolves left if requireAlias=true and the target is not an alias', async () => { + expect.assertions(1); + const res = (await reindex({ + client, + sourceIndex: 'existing_index_with_docs', + targetIndex: 'existing_index_with_write_block', + reindexScript: Option.none, + requireAlias: true, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + + const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '10s' }); + + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "index": "existing_index_with_write_block", + "type": "index_not_found_exception", + }, + } + `); + }); + it('resolves left wait_for_task_completion_timeout when the task does not finish within the timeout', async () => { + await waitForIndexStatus({ + client, + index: '.kibana_1', + status: 'yellow', + })(); + + const res = (await reindex({ + client, + sourceIndex: '.kibana_1', + targetIndex: 'reindex_target', + reindexScript: Option.none, + requireAlias: false, + excludeOnUpgradeQuery: { match_all: {} }, + batchSize: 1000, + })()) as Either.Right; + + const task = waitForReindexTask({ client, taskId: res.right.taskId, timeout: '0s' }); + + await expect(task()).resolves.toMatchObject({ + _tag: 'Left', + left: { + error: expect.any(errors.ResponseError), + message: expect.stringContaining('[timeout_exception]'), + type: 'wait_for_task_completion_timeout', + }, + }); + }); + }); + + describe('openPit', () => { + it('opens PointInTime for an index', async () => { + const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); + const pitResponse = (await openPitTask()) as Either.Right; + + expect(pitResponse.right.pitId).toEqual(expect.any(String)); + + const searchResponse = await client.search({ + body: { + pit: { id: pitResponse.right.pitId }, + }, + }); + + await expect(searchResponse.hits.hits.length).toBeGreaterThan(0); + }); + it('rejects if index does not exist', async () => { + const openPitTask = openPit({ client, index: 'no_such_index' }); + await expect(openPitTask()).rejects.toThrow('index_not_found_exception'); + }); + }); + + describe('readWithPit', () => { + it('requests documents from an index using given PIT', async () => { + const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); + const pitResponse = (await openPitTask()) as Either.Right; + + const readWithPitTask = readWithPit({ + client, + pitId: pitResponse.right.pitId, + query: { match_all: {} }, + batchSize: 1000, + searchAfter: undefined, + }); + const docsResponse = (await readWithPitTask()) as Either.Right; + + await expect(docsResponse.right.outdatedDocuments.length).toBe(6); + }); + + it('requests the batchSize of documents from an index', async () => { + const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); + const pitResponse = (await openPitTask()) as Either.Right; + + const readWithPitTask = readWithPit({ + client, + pitId: pitResponse.right.pitId, + query: { match_all: {} }, + batchSize: 3, + searchAfter: undefined, + }); + const docsResponse = (await readWithPitTask()) as Either.Right; + + await expect(docsResponse.right.outdatedDocuments.length).toBe(3); + }); + + it('it excludes documents not matching the provided "query"', async () => { + const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); + const pitResponse = (await openPitTask()) as Either.Right; + + const readWithPitTask = readWithPit({ + client, + pitId: pitResponse.right.pitId, + query: { + bool: { + must_not: [ + { + term: { + type: 'f_agent_event', + }, + }, + { + term: { + type: 'another_unused_type', + }, + }, + ], + }, + }, + batchSize: 1000, + searchAfter: undefined, + }); + + const docsResponse = (await readWithPitTask()) as Either.Right; + + expect(docsResponse.right.outdatedDocuments.map((doc) => doc._source.title).sort()) + .toMatchInlineSnapshot(` + Array [ + "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a", + "doc 1", + "doc 2", + "doc 3", + ] + `); + }); + + it('only returns documents that match the provided "query"', async () => { + const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); + const pitResponse = (await openPitTask()) as Either.Right; + + const readWithPitTask = readWithPit({ + client, + pitId: pitResponse.right.pitId, + query: { + match: { title: { query: 'doc' } }, + }, + batchSize: 1000, + searchAfter: undefined, + }); + + const docsResponse = (await readWithPitTask()) as Either.Right; + + expect(docsResponse.right.outdatedDocuments.map((doc) => doc._source.title).sort()) + .toMatchInlineSnapshot(` + Array [ + "doc 1", + "doc 2", + "doc 3", + ] + `); + }); + + it('returns docs with _seq_no and _primary_term when specified', async () => { + const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); + const pitResponse = (await openPitTask()) as Either.Right; + + const readWithPitTask = readWithPit({ + client, + pitId: pitResponse.right.pitId, + query: { + match: { title: { query: 'doc' } }, + }, + batchSize: 1000, + searchAfter: undefined, + seqNoPrimaryTerm: true, + }); + + const docsResponse = (await readWithPitTask()) as Either.Right; + + expect(docsResponse.right.outdatedDocuments).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + _seq_no: expect.any(Number), + _primary_term: expect.any(Number), + }), + ]) + ); + }); + + it('does not return docs with _seq_no and _primary_term if not specified', async () => { + const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); + const pitResponse = (await openPitTask()) as Either.Right; + + const readWithPitTask = readWithPit({ + client, + pitId: pitResponse.right.pitId, + query: { + match: { title: { query: 'doc' } }, + }, + batchSize: 1000, + searchAfter: undefined, + }); + + const docsResponse = (await readWithPitTask()) as Either.Right; + + expect(docsResponse.right.outdatedDocuments).toEqual( + expect.arrayContaining([ + expect.not.objectContaining({ + _seq_no: expect.any(Number), + _primary_term: expect.any(Number), + }), + ]) + ); + }); + + it('returns a left es_response_too_large error when a read batch exceeds the maxResponseSize', async () => { + const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); + const pitResponse = (await openPitTask()) as Either.Right; + + let readWithPitTask = readWithPit({ + client, + pitId: pitResponse.right.pitId, + query: { match_all: {} }, + batchSize: 1, // small batch size so we don't exceed the maxResponseSize + searchAfter: undefined, + maxResponseSizeBytes: 500, // set a small size to force the error + }); + const rightResponse = (await readWithPitTask()) as Either.Right; + + await expect(Either.isRight(rightResponse)).toBe(true); + + readWithPitTask = readWithPit({ + client, + pitId: pitResponse.right.pitId, + query: { match_all: {} }, + batchSize: 10, // a bigger batch will exceed the maxResponseSize + searchAfter: undefined, + maxResponseSizeBytes: 500, // set a small size to force the error + }); + const leftResponse = (await readWithPitTask()) as Either.Left; + + expect(leftResponse.left.type).toBe('es_response_too_large'); + // ES response contains a field that indicates how long it took ES to get the response, e.g.: "took": 7 + // if ES takes more than 9ms, the payload will be 1 byte bigger. + // see https://github.com/elastic/kibana/issues/160994 + // Thus, the statements below account for response times up to 99ms + expect(leftResponse.left.contentLength).toBeGreaterThanOrEqual(3184); + expect(leftResponse.left.contentLength).toBeLessThanOrEqual(3185); + }); + + it('rejects if PIT does not exist', async () => { + const readWithPitTask = readWithPit({ + client, + pitId: 'no_such_pit', + query: { match_all: {} }, + batchSize: 1000, + searchAfter: undefined, + }); + await expect(readWithPitTask()).rejects.toThrow('illegal_argument_exception'); + }); + }); + + describe('closePit', () => { + it('closes PointInTime', async () => { + const openPitTask = openPit({ client, index: 'existing_index_with_docs' }); + const pitResponse = (await openPitTask()) as Either.Right; + + const pitId = pitResponse.right.pitId; + await closePit({ client, pitId })(); + + const searchTask = client.search({ + body: { + pit: { id: pitId }, + }, + }); + + await expect(searchTask).rejects.toThrow('search_phase_execution_exception'); + }); + + it('rejects if PIT does not exist', async () => { + const closePitTask = closePit({ client, pitId: 'no_such_pit' }); + await expect(closePitTask()).rejects.toThrow('illegal_argument_exception'); + }); + }); + + describe('transformDocs', () => { + it('applies "transformRawDocs" and returns the transformed documents', async () => { + const originalDocs = [ + { _id: 'foo:1', _source: { type: 'dashboard', value: 1 } }, + { _id: 'foo:2', _source: { type: 'dashboard', value: 2 } }, + ]; + + function innerTransformRawDocs( + docs: SavedObjectsRawDoc[] + ): TaskEither { + return async () => { + const processedDocs: SavedObjectsRawDoc[] = []; + for (const doc of docs) { + doc._source.value += 1; + processedDocs.push(doc); + } + return Either.right({ processedDocs }); + }; + } + + const transformTask = transformDocs({ + transformRawDocs: innerTransformRawDocs, + outdatedDocuments: originalDocs, + }); + + const resultsWithProcessDocs = ( + (await transformTask()) as Either.Right + ).right.processedDocs; + expect(resultsWithProcessDocs.length).toEqual(2); + const foo2 = resultsWithProcessDocs.find((h) => h._id === 'foo:2'); + expect(foo2?._source?.value).toBe(3); + }); + }); + + // Failing: See https://github.com/elastic/kibana/issues/166199 + describe.skip('waitForPickupUpdatedMappingsTask', () => { + it('rejects if there are failures', async () => { + const res = (await pickupUpdatedMappings( + client, + 'existing_index_with_write_block', + 1000 + )()) as Either.Right; + + const task = waitForPickupUpdatedMappingsTask({ + client, + taskId: res.right.taskId, + timeout: '10s', + }); + + // We can't do a snapshot match because the response includes an index + // id which ES assigns dynamically + await expect(task()).rejects.toMatchObject({ + message: + /pickupUpdatedMappings task failed with the following failures:\n\[\{\"index\":\"existing_index_with_write_block\"/, + }); + }); + it('rejects if there is an error', async () => { + const res = (await pickupUpdatedMappings( + client, + 'no_such_index', + 1000 + )()) as Either.Right; + + const task = waitForPickupUpdatedMappingsTask({ + client, + taskId: res.right.taskId, + timeout: '10s', + }); + + await expect(task()).rejects.toThrow('index_not_found_exception'); + }); + + it('resolves left wait_for_task_completion_timeout when the task does not complete within the timeout', async () => { + const res = (await pickupUpdatedMappings( + client, + '.kibana_1', + 1000 + )()) as Either.Right; + + const task = waitForPickupUpdatedMappingsTask({ + client, + taskId: res.right.taskId, + timeout: '0s', + }); + + await expect(task()).resolves.toMatchObject({ + _tag: 'Left', + left: { + error: expect.any(errors.ResponseError), + message: expect.stringContaining('[timeout_exception]'), + type: 'wait_for_task_completion_timeout', + }, + }); + }); + it('resolves right when successful', async () => { + const res = (await pickupUpdatedMappings( + client, + 'existing_index_with_docs', + 1000 + )()) as Either.Right; + + const task = waitForPickupUpdatedMappingsTask({ + client, + taskId: res.right.taskId, + timeout: '10s', + }); + + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "pickup_updated_mappings_succeeded", + } + `); + }); + }); + + describe('updateAndPickupMappings', () => { + it('resolves right when mappings were updated and picked up', async () => { + // Create an index without any mappings and insert documents into it + await createIndex({ + client, + indexName: 'existing_index_without_mappings', + mappings: { + dynamic: false, + properties: {}, + }, + esCapabilities, + })(); + const sourceDocs = [ + { _source: { title: 'doc 1' } }, + { _source: { title: 'doc 2' } }, + { _source: { title: 'doc 3' } }, + { _source: { title: 'doc 4' } }, + ] as unknown as SavedObjectsRawDoc[]; + await bulkOverwriteTransformedDocuments({ + client, + index: 'existing_index_without_mappings', + operations: sourceDocs.map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + })(); + + // Assert that we can't search over the unmapped fields of the document + + const originalSearchResults = await client.search({ + index: 'existing_index_without_mappings', + size: 1000, + query: { + match: { title: { query: 'doc' } }, + }, + }); + expect(originalSearchResults.hits?.hits.length).toBe(0); + + // Update and pickup mappings so that the title field is searchable + const res = await updateAndPickupMappings({ + client, + index: 'existing_index_without_mappings', + mappings: { + properties: { + title: { type: 'text' }, + }, + }, + batchSize: 1000, + })(); + expect(Either.isRight(res)).toBe(true); + const taskId = (res as Either.Right).right.taskId; + await waitForPickupUpdatedMappingsTask({ client, taskId, timeout: '60s' })(); + + // Repeat the search expecting to be able to find the existing documents + const pickedUpSearchResults = await client.search({ + index: 'existing_index_without_mappings', + size: 1000, + query: { + match: { title: { query: 'doc' } }, + }, + }); + expect(pickedUpSearchResults.hits?.hits.length).toBe(4); + }); + }); + + describe('updateMappings', () => { + it('rejects if ES throws an error', async () => { + const task = updateMappings({ + client, + index: 'no_such_index', + mappings: { + properties: { + created_at: { + type: 'date', + }, + }, + _meta: { + migrationMappingPropertyHashes: { + references: 'updateda56cc02bdc9c93361bupdated', + newReferences: 'fooBarHashMd509387420934879300d9', + }, + }, + }, + })(); + + await expect(task).rejects.toThrow('index_not_found_exception'); + }); + + it('resolves left when the mappings are incompatible', async () => { + const res = await updateMappings({ + client, + index: 'existing_index_with_docs', + mappings: { + properties: { + someProperty: { + type: 'date', // attempt to change an existing field's type in an incompatible fashion + }, + }, + _meta: { + migrationMappingPropertyHashes: { + references: 'updateda56cc02bdc9c93361bupdated', + newReferences: 'fooBarHashMd509387420934879300d9', + }, + }, + }, + })(); + + expect(Either.isLeft(res)).toBe(true); + expect(res).toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "incompatible_mapping_exception", + }, + } + `); + }); + + it('resolves right when mappings are correctly updated', async () => { + const res = await updateMappings({ + client, + index: 'existing_index_with_docs', + mappings: { + properties: { + created_at: { + type: 'date', + }, + }, + _meta: { + migrationMappingPropertyHashes: { + references: 'updateda56cc02bdc9c93361bupdated', + newReferences: 'fooBarHashMd509387420934879300d9', + }, + }, + }, + })(); + + expect(Either.isRight(res)).toBe(true); + + const indices = await client.indices.get({ + index: ['existing_index_with_docs'], + }); + + expect(indices.existing_index_with_docs.mappings?.properties).toEqual( + expect.objectContaining({ + created_at: { + type: 'date', + }, + }) + ); + + expect(indices.existing_index_with_docs.mappings?._meta).toEqual({ + migrationMappingPropertyHashes: { + references: 'updateda56cc02bdc9c93361bupdated', + newReferences: 'fooBarHashMd509387420934879300d9', + }, + }); + }); + }); + + describe('updateAliases', () => { + describe('remove', () => { + it('resolves left index_not_found_exception when the index does not exist', async () => { + const task = updateAliases({ + client, + aliasActions: [ + { + remove: { + alias: 'no_such_alias', + index: 'no_such_index', + must_exist: false, + }, + }, + ], + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "index": "no_such_index", + "type": "index_not_found_exception", + }, + } + `); + }); + describe('with must_exist=false', () => { + it('resolves left alias_not_found_exception when alias does not exist', async () => { + const task = updateAliases({ + client, + aliasActions: [ + { + remove: { + alias: 'no_such_alias', + index: 'existing_index_with_docs', + must_exist: false, + }, + }, + ], + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "alias_not_found_exception", + }, + } + `); + }); + }); + describe('with must_exist=true', () => { + it('resolves left alias_not_found_exception when alias does not exist on specified index', async () => { + const task = updateAliases({ + client, + aliasActions: [ + { + remove: { + alias: 'existing_index_2_alias', + index: 'existing_index_with_docs', + must_exist: true, + }, + }, + ], + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "alias_not_found_exception", + }, + } + `); + }); + it('resolves left alias_not_found_exception when alias does not exist', async () => { + const task = updateAliases({ + client, + aliasActions: [ + { + remove: { + alias: 'no_such_alias', + index: 'existing_index_with_docs', + must_exist: true, + }, + }, + ], + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "alias_not_found_exception", + }, + } + `); + }); + }); + }); + describe('remove_index', () => { + it('left index_not_found_exception if index does not exist', async () => { + const task = updateAliases({ + client, + aliasActions: [ + { + remove_index: { + index: 'no_such_index', + }, + }, + ], + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "index": "no_such_index", + "type": "index_not_found_exception", + }, + } + `); + }); + it('left remove_index_not_a_concrete_index when remove_index targets an alias', async () => { + const task = updateAliases({ + client, + aliasActions: [ + { + remove_index: { + index: 'existing_index_2_alias', + }, + }, + ], + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "remove_index_not_a_concrete_index", + }, + } + `); + }); + }); + }); + + describe('createIndex', () => { + afterEach(async () => { + // Restore the default setting of 1000 shards per node + await client.cluster.putSettings({ persistent: { cluster: { max_shards_per_node: null } } }); + }); + afterAll(async () => { + await client.indices.delete({ index: 'red_then_yellow_index' }).catch(() => ({})); + await client.indices.delete({ index: 'yellow_then_green_index' }).catch(() => ({})); + await client.indices.delete({ index: 'create_new_index' }).catch(() => ({})); + }); + it('resolves right after waiting for an index status to become green when cluster state is not propagated within the timeout', async () => { + // By specifying a very short timeout Elasticsearch will respond before the shard is allocated + const createIndexPromise = createIndex({ + client, + indexName: 'create_new_index', + mappings: undefined as any, + timeout: '1nanos', + esCapabilities, + })(); + await expect(createIndexPromise).resolves.toEqual({ + _tag: 'Right', + right: 'create_index_succeeded', + }); + const { create_new_index: createNewIndex } = await client.indices.getSettings({ + index: 'create_new_index', + }); + // @ts-expect-error https://github.com/elastic/elasticsearch/issues/89381 + expect(createNewIndex.settings?.index?.mapping.total_fields.limit).toBe('1500'); + }); + + // number_of_replicas and routing allocation not available on serverless + runOnTraditionalOnly(() => { + it('resolves left if an existing index status does not become green', async () => { + expect.assertions(2); + // Create a red index + await client.indices + .create( + { + index: 'red_then_yellow_index', + timeout: '5s', + body: { + mappings: { properties: {} }, + settings: { + // Allocate 1 replica so that this index stays yellow + number_of_replicas: '1', + // Disable all shard allocation so that the index status starts as red + index: { routing: { allocation: { enable: 'none' } } }, + }, + }, + }, + { maxRetries: 0 /** handle retry ourselves for now */ } + ) + .catch((e) => { + /** ignore */ + }); + + // Call createIndex even though the index already exists + const createIndexPromise = createIndex({ + client, + indexName: 'red_then_yellow_index', + mappings: undefined as any, + esCapabilities, + })(); + let indexYellow = false; + + setTimeout(() => { + client.indices.putSettings({ + index: 'red_then_yellow_index', + body: { + // Renable allocation so that the status becomes yellow + routing: { allocation: { enable: 'all' } }, + }, + }); + indexYellow = true; + }, 10); + + await createIndexPromise.then((err) => { + // Assert that the promise didn't resolve before the index became yellow + expect(indexYellow).toBe(true); + expect(err).toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "message": "[index_not_green_timeout] Timeout waiting for the status of the [red_then_yellow_index] index to become 'green'", + "type": "index_not_green_timeout", + }, + } + `); + }); + }); + it('resolves right after waiting for an existing index status to become green', async () => { + expect.assertions(2); + // Create a yellow index + await client.indices + .create({ + index: 'yellow_then_green_index', + timeout: '5s', + body: { + mappings: { properties: {} }, + settings: { + // Allocate 1 replica so that this index stays yellow + number_of_replicas: '1', + }, + }, + }) + .catch((e) => { + /** ignore */ + }); + + // Call createIndex even though the index already exists + const createIndexPromise = createIndex({ + client, + indexName: 'yellow_then_green_index', + mappings: undefined as any, + esCapabilities, + })(); + let indexGreen = false; + + setTimeout(() => { + client.indices.putSettings({ + index: 'yellow_then_green_index', + body: { + // Set 0 replican so that this index becomes green + number_of_replicas: '0', + }, + }); + indexGreen = true; + }, 10); + + await createIndexPromise.then((res) => { + // Assert that the promise didn't resolve before the index became green + expect(indexGreen).toBe(true); + expect(res).toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "index_already_exists", + } + `); + }); + }); + }); + + it('resolves left cluster_shard_limit_exceeded when the action would exceed the maximum normal open shards', async () => { + // Set the max shards per node really low so that any new index that's created would exceed the maximum open shards for this cluster + await client.cluster.putSettings({ persistent: { cluster: { max_shards_per_node: 1 } } }); + const createIndexPromise = createIndex({ + client, + indexName: 'create_index_1', + mappings: undefined as any, + esCapabilities, + })(); + await expect(createIndexPromise).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "cluster_shard_limit_exceeded", + }, + } + `); + }); + it('rejects when there is an unexpected error creating the index', async () => { + // Creating an index with the same name as an existing alias to induce + // failure + await expect( + createIndex({ + client, + indexName: 'existing_index_2_alias', + mappings: undefined as any, + esCapabilities, + })() + ).rejects.toThrow('invalid_index_name_exception'); + }); + }); + + describe('bulkOverwriteTransformedDocuments', () => { + it('resolves right when documents do not yet exist in the index', async () => { + const newDocs = [ + { _source: { title: 'doc 5' } }, + { _source: { title: 'doc 6' } }, + { _source: { title: 'doc 7' } }, + ] as unknown as SavedObjectsRawDoc[]; + const task = bulkOverwriteTransformedDocuments({ + client, + index: 'existing_index_with_docs', + operations: newDocs.map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + }); + + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "bulk_index_succeeded", + } + `); + }); + it('resolves right even if there were some version_conflict_engine_exception', async () => { + const response = await client.search({ index: 'existing_index_with_docs', size: 1000 }); + const existingDocs = response.hits?.hits as SavedObjectsRawDoc[]; + + const task = bulkOverwriteTransformedDocuments({ + client, + index: 'existing_index_with_docs', + operations: [ + ...existingDocs, + { _source: { title: 'doc 8' } } as unknown as SavedObjectsRawDoc, + ].map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Right", + "right": "bulk_index_succeeded", + } + `); + }); + it('resolves left index_not_found_exception if the index does not exist and useAliasToPreventAutoCreate=true', async () => { + const newDocs = [ + { _source: { title: 'doc 5' } }, + { _source: { title: 'doc 6' } }, + { _source: { title: 'doc 7' } }, + ] as unknown as SavedObjectsRawDoc[]; + await expect( + bulkOverwriteTransformedDocuments({ + client, + index: 'existing_index_with_docs_alias_that_does_not_exist', + useAliasToPreventAutoCreate: true, + operations: newDocs.map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + })() + ).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "index": "existing_index_with_docs_alias_that_does_not_exist", + "type": "index_not_found_exception", + }, + } + `); + }); + it('resolves left target_index_had_write_block if there are write_block errors', async () => { + const newDocs = [ + { _source: { title: 'doc 5' } }, + { _source: { title: 'doc 6' } }, + { _source: { title: 'doc 7' } }, + ] as unknown as SavedObjectsRawDoc[]; + await expect( + bulkOverwriteTransformedDocuments({ + client, + index: 'existing_index_with_write_block', + operations: newDocs.map((doc) => createBulkIndexOperationTuple(doc)), + refresh: 'wait_for', + })() + ).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "target_index_had_write_block", + }, + } + `); + }); + + // no way to configure http.max_content_length on the serverless instance for now. + runOnTraditionalOnly(() => { + it('resolves left request_entity_too_large_exception when the payload is too large', async () => { + const newDocs = new Array(10000).fill({ + _source: { + title: + 'how do I create a document thats large enoug to exceed the limits without typing long sentences', + }, + }) as SavedObjectsRawDoc[]; + const task = bulkOverwriteTransformedDocuments({ + client, + index: 'existing_index_with_docs', + operations: newDocs.map((doc) => createBulkIndexOperationTuple(doc)), + }); + await expect(task()).resolves.toMatchInlineSnapshot(` + Object { + "_tag": "Left", + "left": Object { + "type": "request_entity_too_large_exception", + }, + } + `); + }); + }); + }); +}; diff --git a/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts b/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts index 6249137d8e7be..a911fcdbdead5 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts @@ -16,7 +16,6 @@ import { ConfigService, Env } from '@kbn/config'; import { getEnvOptions } from '@kbn/config-mocks'; import { REPO_ROOT } from '@kbn/repo-info'; import { KibanaMigrator } from '@kbn/core-saved-objects-migration-server-internal'; -import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; import { SavedObjectConfig, type SavedObjectsConfigType, @@ -30,6 +29,7 @@ import { SavedObjectsRepository } from '@kbn/core-saved-objects-api-server-inter import { ElasticsearchConfig, type ElasticsearchConfigType, + getCapabilitiesFromClient, } from '@kbn/core-elasticsearch-server-internal'; import { AgentManager, configureClient } from '@kbn/core-elasticsearch-client-server-internal'; import { type LoggingConfigType, LoggingSystem } from '@kbn/core-logging-server-internal'; @@ -276,6 +276,7 @@ interface GetMigratorParams { kibanaBranch: string; nodeRoles: NodeRoles; } + const getMigrator = async ({ configService, client, @@ -300,6 +301,8 @@ const getMigrator = async ({ links: getDocLinks({ kibanaBranch }), }; + const esCapabilities = await getCapabilitiesFromClient(client); + return new KibanaMigrator({ client, kibanaIndex, @@ -311,7 +314,7 @@ const getMigrator = async ({ docLinks, waitForMigrationCompletion: false, // ensure we have an active role in the migration nodeRoles, - esCapabilities: elasticsearchServiceMock.createCapabilities(), + esCapabilities, }); }; diff --git a/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/basic_document_migration.ts b/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/basic_document_migration.ts new file mode 100644 index 0000000000000..0c43a40478d03 --- /dev/null +++ b/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/basic_document_migration.ts @@ -0,0 +1,247 @@ +/* + * 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 fs from 'fs/promises'; +import { range, sortBy } from 'lodash'; +import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; +import '../../jest_matchers'; +import { getKibanaMigratorTestKit } from '../../kibana_migrator_test_kit'; +import { delay, parseLogFile } from '../../test_utils'; +import { EsRunner, EsServer } from '../../test_types'; +import { + getBaseMigratorParams, + getSampleAType, + getSampleBType, +} from '../../fixtures/zdt_base.fixtures'; + +export function createBasicDocumentsMigrationTest({ + startES, + logFilePath, +}: { + startES: EsRunner; + logFilePath: string; +}) { + let esServer: EsServer; + + beforeAll(async () => { + await fs.unlink(logFilePath).catch(() => {}); + esServer = await startES(); + }); + + afterAll(async () => { + await esServer?.stop(); + await delay(10); + }); + + const createBaseline = async () => { + const { runMigrations, savedObjectsRepository } = await getKibanaMigratorTestKit({ + ...getBaseMigratorParams(), + types: [getSampleAType(), getSampleBType()], + }); + await runMigrations(); + + const sampleAObjs = range(5).map((number) => ({ + id: `a-${number}`, + type: 'sample_a', + attributes: { + keyword: `a_${number}`, + boolean: true, + }, + })); + + await savedObjectsRepository.bulkCreate(sampleAObjs); + + const sampleBObjs = range(5).map((number) => ({ + id: `b-${number}`, + type: 'sample_b', + attributes: { + text: `i am number ${number}`, + text2: `some static text`, + }, + })); + + await savedObjectsRepository.bulkCreate(sampleBObjs); + }; + + it('migrates the documents', async () => { + await createBaseline(); + + const typeA = getSampleAType(); + const typeB = getSampleBType(); + + // typeA -> we add a new field and bump the model version by one with a migration + + typeA.mappings.properties = { + ...typeA.mappings.properties, + someAddedField: { type: 'keyword' }, + }; + + typeA.modelVersions = { + ...typeA.modelVersions, + '2': { + changes: [ + { + type: 'data_backfill', + backfillFn: (doc) => { + return { + attributes: { + someAddedField: `${doc.attributes.keyword}-mig`, + }, + }; + }, + }, + { + type: 'mappings_addition', + addedMappings: { + someAddedField: { type: 'keyword' }, + }, + }, + ], + }, + }; + + // typeB -> we add two new model version with migrations + + typeB.modelVersions = { + ...typeB.modelVersions, + '2': { + changes: [ + { + type: 'data_backfill', + backfillFn: (doc) => { + return { + attributes: { + text2: `${doc.attributes.text2} - mig2`, + }, + }; + }, + }, + ], + }, + '3': { + changes: [ + { + type: 'data_backfill', + backfillFn: (doc) => { + return { + attributes: { + text2: `${doc.attributes.text2} - mig3`, + }, + }; + }, + }, + ], + }, + }; + + const { runMigrations, client, savedObjectsRepository } = await getKibanaMigratorTestKit({ + ...getBaseMigratorParams(), + logFilePath, + types: [typeA, typeB], + }); + + await runMigrations(); + + const indices = await client.indices.get({ index: '.kibana*' }); + expect(Object.keys(indices)).toEqual(['.kibana_1']); + + const index = indices['.kibana_1']; + const mappings = index.mappings ?? {}; + const mappingMeta = mappings._meta ?? {}; + + expect(mappings.properties).toEqual( + expect.objectContaining({ + sample_a: typeA.mappings, + sample_b: typeB.mappings, + }) + ); + + expect(mappingMeta.docVersions).toEqual({ + sample_a: '10.2.0', + sample_b: '10.3.0', + }); + + const { saved_objects: sampleADocs } = await savedObjectsRepository.find({ type: 'sample_a' }); + const { saved_objects: sampleBDocs } = await savedObjectsRepository.find({ type: 'sample_b' }); + + expect(sampleADocs).toHaveLength(5); + expect(sampleBDocs).toHaveLength(5); + + const sampleAData = sortBy(sampleADocs, 'id').map((object) => ({ + id: object.id, + type: object.type, + attributes: object.attributes, + })); + + expect(sampleAData).toEqual([ + { + id: 'a-0', + type: 'sample_a', + attributes: { boolean: true, keyword: 'a_0', someAddedField: 'a_0-mig' }, + }, + { + id: 'a-1', + type: 'sample_a', + attributes: { boolean: true, keyword: 'a_1', someAddedField: 'a_1-mig' }, + }, + { + id: 'a-2', + type: 'sample_a', + attributes: { boolean: true, keyword: 'a_2', someAddedField: 'a_2-mig' }, + }, + { + id: 'a-3', + type: 'sample_a', + attributes: { boolean: true, keyword: 'a_3', someAddedField: 'a_3-mig' }, + }, + { + id: 'a-4', + type: 'sample_a', + attributes: { boolean: true, keyword: 'a_4', someAddedField: 'a_4-mig' }, + }, + ]); + + const sampleBData = sortBy(sampleBDocs, 'id').map((object) => ({ + id: object.id, + type: object.type, + attributes: object.attributes, + })); + + expect(sampleBData).toEqual([ + { + id: 'b-0', + type: 'sample_b', + attributes: { text: 'i am number 0', text2: 'some static text - mig2 - mig3' }, + }, + { + id: 'b-1', + type: 'sample_b', + attributes: { text: 'i am number 1', text2: 'some static text - mig2 - mig3' }, + }, + { + id: 'b-2', + type: 'sample_b', + attributes: { text: 'i am number 2', text2: 'some static text - mig2 - mig3' }, + }, + { + id: 'b-3', + type: 'sample_b', + attributes: { text: 'i am number 3', text2: 'some static text - mig2 - mig3' }, + }, + { + id: 'b-4', + type: 'sample_b', + attributes: { text: 'i am number 4', text2: 'some static text - mig2 - mig3' }, + }, + ]); + + const records = await parseLogFile(logFilePath); + expect(records).toContainLogEntry('Starting to process 10 documents'); + expect(records).toContainLogEntry('Migration completed'); + }); +} diff --git a/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/standard_workflow.ts b/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/standard_workflow.ts new file mode 100644 index 0000000000000..b22e522d1d2c1 --- /dev/null +++ b/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/standard_workflow.ts @@ -0,0 +1,118 @@ +/* + * 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 fs from 'fs/promises'; +import { range } from 'lodash'; +import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; +import '../../jest_matchers'; +import { getKibanaMigratorTestKit } from '../../kibana_migrator_test_kit'; +import { delay, parseLogFile } from '../../test_utils'; +import { EsRunner, EsServer } from '../../test_types'; +import { + getBaseMigratorParams, + getSampleAType, + getSampleBType, + dummyModelVersion, +} from '../../fixtures/zdt_base.fixtures'; + +export function createStandardWorkflowTest({ + startES, + logFilePath, +}: { + startES: EsRunner; + logFilePath: string; +}) { + let esServer: EsServer; + + beforeAll(async () => { + await fs.unlink(logFilePath).catch(() => {}); + esServer = await startES(); + }); + + afterAll(async () => { + await esServer?.stop(); + await delay(10); + }); + + const createBaseline = async () => { + const { runMigrations, savedObjectsRepository } = await getKibanaMigratorTestKit({ + ...getBaseMigratorParams(), + types: [getSampleAType(), getSampleBType()], + }); + await runMigrations(); + + const sampleAObjs = range(5).map((number) => ({ + id: `a-${number}`, + type: 'sample_a', + attributes: { keyword: `a_${number}`, boolean: true }, + })); + + await savedObjectsRepository.bulkCreate(sampleAObjs); + + const sampleBObjs = range(5).map((number) => ({ + id: `b-${number}`, + type: 'sample_b', + attributes: { text: `i am number ${number}`, text2: `some static text` }, + })); + + await savedObjectsRepository.bulkCreate(sampleBObjs); + }; + + it('follows the expected stages and transitions', async () => { + await createBaseline(); + + const typeA = getSampleAType(); + const typeB = getSampleBType(); + + typeA.modelVersions = { + ...typeA.modelVersions, + '2': dummyModelVersion, + }; + + typeB.modelVersions = { + ...typeB.modelVersions, + '2': dummyModelVersion, + }; + + const { runMigrations } = await getKibanaMigratorTestKit({ + ...getBaseMigratorParams(), + logFilePath, + types: [typeA, typeB], + }); + + await runMigrations(); + + const records = await parseLogFile(logFilePath); + + expect(records).toContainLogEntries( + [ + 'INIT -> UPDATE_INDEX_MAPPINGS', + 'UPDATE_INDEX_MAPPINGS -> UPDATE_INDEX_MAPPINGS_WAIT_FOR_TASK', + 'UPDATE_INDEX_MAPPINGS_WAIT_FOR_TASK -> UPDATE_MAPPING_MODEL_VERSIONS', + 'UPDATE_MAPPING_MODEL_VERSIONS -> INDEX_STATE_UPDATE_DONE', + 'INDEX_STATE_UPDATE_DONE -> DOCUMENTS_UPDATE_INIT', + 'DOCUMENTS_UPDATE_INIT -> SET_DOC_MIGRATION_STARTED', + 'SET_DOC_MIGRATION_STARTED -> SET_DOC_MIGRATION_STARTED_WAIT_FOR_INSTANCES', + 'SET_DOC_MIGRATION_STARTED_WAIT_FOR_INSTANCES -> CLEANUP_UNKNOWN_AND_EXCLUDED_DOCS', + 'CLEANUP_UNKNOWN_AND_EXCLUDED_DOCS -> CLEANUP_UNKNOWN_AND_EXCLUDED_DOCS_WAIT_FOR_TASK', + 'CLEANUP_UNKNOWN_AND_EXCLUDED_DOCS_WAIT_FOR_TASK -> OUTDATED_DOCUMENTS_SEARCH_OPEN_PIT', + 'OUTDATED_DOCUMENTS_SEARCH_OPEN_PIT -> OUTDATED_DOCUMENTS_SEARCH_READ', + 'OUTDATED_DOCUMENTS_SEARCH_READ -> OUTDATED_DOCUMENTS_SEARCH_TRANSFORM', + 'OUTDATED_DOCUMENTS_SEARCH_TRANSFORM -> OUTDATED_DOCUMENTS_SEARCH_BULK_INDEX', + 'OUTDATED_DOCUMENTS_SEARCH_BULK_INDEX -> OUTDATED_DOCUMENTS_SEARCH_READ', + 'OUTDATED_DOCUMENTS_SEARCH_READ -> OUTDATED_DOCUMENTS_SEARCH_CLOSE_PIT', + 'OUTDATED_DOCUMENTS_SEARCH_CLOSE_PIT -> OUTDATED_DOCUMENTS_SEARCH_REFRESH', + 'OUTDATED_DOCUMENTS_SEARCH_REFRESH -> UPDATE_DOCUMENT_MODEL_VERSIONS', + 'UPDATE_DOCUMENT_MODEL_VERSIONS -> UPDATE_DOCUMENT_MODEL_VERSIONS_WAIT_FOR_INSTANCES', + 'UPDATE_DOCUMENT_MODEL_VERSIONS_WAIT_FOR_INSTANCES -> DONE', + 'Migration completed', + ], + { ordered: true } + ); + }); +} diff --git a/src/core/server/integration_tests/saved_objects/migrations/test_types.ts b/src/core/server/integration_tests/saved_objects/migrations/test_types.ts new file mode 100644 index 0000000000000..ed6990dd2b68e --- /dev/null +++ b/src/core/server/integration_tests/saved_objects/migrations/test_types.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +export interface EsServer { + stop: () => Promise; +} + +export type EsRunner = () => Promise; diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/basic_document_migration.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/basic_document_migration.test.ts index f6234c770eaf8..e38207a4ffeba 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/basic_document_migration.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/basic_document_migration.test.ts @@ -7,238 +7,13 @@ */ import Path from 'path'; -import fs from 'fs/promises'; -import { range, sortBy } from 'lodash'; -import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; -import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import '../jest_matchers'; -import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; -import { - getBaseMigratorParams, - getSampleAType, - getSampleBType, -} from '../fixtures/zdt_base.fixtures'; - -export const logFilePath = Path.join(__dirname, 'basic_document_migration.test.log'); +import { startElasticsearch } from '../kibana_migrator_test_kit'; +import { createBasicDocumentsMigrationTest } from '../shared_suites/zdt/basic_document_migration'; describe('ZDT upgrades - basic document migration', () => { - let esServer: TestElasticsearchUtils['es']; - - beforeAll(async () => { - await fs.unlink(logFilePath).catch(() => {}); - esServer = await startElasticsearch(); - }); - - afterAll(async () => { - await esServer?.stop(); - await delay(10); - }); - - const createBaseline = async () => { - const { runMigrations, savedObjectsRepository } = await getKibanaMigratorTestKit({ - ...getBaseMigratorParams(), - types: [getSampleAType(), getSampleBType()], - }); - await runMigrations(); - - const sampleAObjs = range(5).map((number) => ({ - id: `a-${number}`, - type: 'sample_a', - attributes: { - keyword: `a_${number}`, - boolean: true, - }, - })); - - await savedObjectsRepository.bulkCreate(sampleAObjs); - - const sampleBObjs = range(5).map((number) => ({ - id: `b-${number}`, - type: 'sample_b', - attributes: { - text: `i am number ${number}`, - text2: `some static text`, - }, - })); - - await savedObjectsRepository.bulkCreate(sampleBObjs); - }; - - it('migrates the documents', async () => { - await createBaseline(); - - const typeA = getSampleAType(); - const typeB = getSampleBType(); - - // typeA -> we add a new field and bump the model version by one with a migration - - typeA.mappings.properties = { - ...typeA.mappings.properties, - someAddedField: { type: 'keyword' }, - }; - - typeA.modelVersions = { - ...typeA.modelVersions, - '2': { - changes: [ - { - type: 'data_backfill', - backfillFn: (doc) => { - return { - attributes: { - someAddedField: `${doc.attributes.keyword}-mig`, - }, - }; - }, - }, - { - type: 'mappings_addition', - addedMappings: { - someAddedField: { type: 'keyword' }, - }, - }, - ], - }, - }; - - // typeB -> we add two new model version with migrations - - typeB.modelVersions = { - ...typeB.modelVersions, - '2': { - changes: [ - { - type: 'data_backfill', - backfillFn: (doc) => { - return { - attributes: { - text2: `${doc.attributes.text2} - mig2`, - }, - }; - }, - }, - ], - }, - '3': { - changes: [ - { - type: 'data_backfill', - backfillFn: (doc) => { - return { - attributes: { - text2: `${doc.attributes.text2} - mig3`, - }, - }; - }, - }, - ], - }, - }; - - const { runMigrations, client, savedObjectsRepository } = await getKibanaMigratorTestKit({ - ...getBaseMigratorParams(), - logFilePath, - types: [typeA, typeB], - }); - - await runMigrations(); - - const indices = await client.indices.get({ index: '.kibana*' }); - expect(Object.keys(indices)).toEqual(['.kibana_1']); - - const index = indices['.kibana_1']; - const mappings = index.mappings ?? {}; - const mappingMeta = mappings._meta ?? {}; - - expect(mappings.properties).toEqual( - expect.objectContaining({ - sample_a: typeA.mappings, - sample_b: typeB.mappings, - }) - ); - - expect(mappingMeta.docVersions).toEqual({ - sample_a: '10.2.0', - sample_b: '10.3.0', - }); - - const { saved_objects: sampleADocs } = await savedObjectsRepository.find({ type: 'sample_a' }); - const { saved_objects: sampleBDocs } = await savedObjectsRepository.find({ type: 'sample_b' }); - - expect(sampleADocs).toHaveLength(5); - expect(sampleBDocs).toHaveLength(5); - - const sampleAData = sortBy(sampleADocs, 'id').map((object) => ({ - id: object.id, - type: object.type, - attributes: object.attributes, - })); - - expect(sampleAData).toEqual([ - { - id: 'a-0', - type: 'sample_a', - attributes: { boolean: true, keyword: 'a_0', someAddedField: 'a_0-mig' }, - }, - { - id: 'a-1', - type: 'sample_a', - attributes: { boolean: true, keyword: 'a_1', someAddedField: 'a_1-mig' }, - }, - { - id: 'a-2', - type: 'sample_a', - attributes: { boolean: true, keyword: 'a_2', someAddedField: 'a_2-mig' }, - }, - { - id: 'a-3', - type: 'sample_a', - attributes: { boolean: true, keyword: 'a_3', someAddedField: 'a_3-mig' }, - }, - { - id: 'a-4', - type: 'sample_a', - attributes: { boolean: true, keyword: 'a_4', someAddedField: 'a_4-mig' }, - }, - ]); - - const sampleBData = sortBy(sampleBDocs, 'id').map((object) => ({ - id: object.id, - type: object.type, - attributes: object.attributes, - })); - - expect(sampleBData).toEqual([ - { - id: 'b-0', - type: 'sample_b', - attributes: { text: 'i am number 0', text2: 'some static text - mig2 - mig3' }, - }, - { - id: 'b-1', - type: 'sample_b', - attributes: { text: 'i am number 1', text2: 'some static text - mig2 - mig3' }, - }, - { - id: 'b-2', - type: 'sample_b', - attributes: { text: 'i am number 2', text2: 'some static text - mig2 - mig3' }, - }, - { - id: 'b-3', - type: 'sample_b', - attributes: { text: 'i am number 3', text2: 'some static text - mig2 - mig3' }, - }, - { - id: 'b-4', - type: 'sample_b', - attributes: { text: 'i am number 4', text2: 'some static text - mig2 - mig3' }, - }, - ]); - - const records = await parseLogFile(logFilePath); - expect(records).toContainLogEntry('Starting to process 10 documents'); - expect(records).toContainLogEntry('Migration completed'); + createBasicDocumentsMigrationTest({ + startES: startElasticsearch, + logFilePath: Path.join(__dirname, 'basic_document_migration.test.log'), }); }); diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/standard_workflow.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/standard_workflow.test.ts index f8b0cfe78e2ed..8fb678e49dcc9 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/standard_workflow.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/standard_workflow.test.ts @@ -7,133 +7,13 @@ */ import Path from 'path'; -import fs from 'fs/promises'; -import { range } from 'lodash'; -import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; -import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import '../jest_matchers'; -import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; -import { - getBaseMigratorParams, - getSampleAType, - getSampleBType, - dummyModelVersion, -} from '../fixtures/zdt_base.fixtures'; +import { startElasticsearch } from '../kibana_migrator_test_kit'; +import { createStandardWorkflowTest } from '../shared_suites/zdt/standard_workflow'; -export const logFilePath = Path.join(__dirname, 'standard_workflow.test.log'); - -describe('ZDT upgrades - basic document migration', () => { - let esServer: TestElasticsearchUtils['es']; - - beforeAll(async () => { - await fs.unlink(logFilePath).catch(() => {}); - esServer = await startElasticsearch(); - }); - - afterAll(async () => { - await esServer?.stop(); - await delay(10); - }); - - const createBaseline = async () => { - const { runMigrations, savedObjectsRepository } = await getKibanaMigratorTestKit({ - ...getBaseMigratorParams(), - types: [getSampleAType(), getSampleBType()], - }); - await runMigrations(); - - const sampleAObjs = range(5).map((number) => ({ - id: `a-${number}`, - type: 'sample_a', - attributes: { keyword: `a_${number}`, boolean: true }, - })); - - await savedObjectsRepository.bulkCreate(sampleAObjs); - - const sampleBObjs = range(5).map((number) => ({ - id: `b-${number}`, - type: 'sample_b', - attributes: { text: `i am number ${number}`, text2: `some static text` }, - })); - - await savedObjectsRepository.bulkCreate(sampleBObjs); - }; - - it('follows the expected stages and transitions', async () => { - await createBaseline(); - - const typeA = getSampleAType(); - const typeB = getSampleBType(); - - typeA.modelVersions = { - ...typeA.modelVersions, - '2': dummyModelVersion, - }; - - typeB.modelVersions = { - ...typeB.modelVersions, - '2': dummyModelVersion, - }; - - const { runMigrations } = await getKibanaMigratorTestKit({ - ...getBaseMigratorParams(), - logFilePath, - types: [typeA, typeB], - }); - - await runMigrations(); - - const records = await parseLogFile(logFilePath); - - expect(records).toContainLogEntry('INIT -> UPDATE_INDEX_MAPPINGS'); - expect(records).toContainLogEntry( - 'UPDATE_INDEX_MAPPINGS -> UPDATE_INDEX_MAPPINGS_WAIT_FOR_TASK' - ); - expect(records).toContainLogEntry( - 'UPDATE_INDEX_MAPPINGS_WAIT_FOR_TASK -> UPDATE_MAPPING_MODEL_VERSIONS' - ); - expect(records).toContainLogEntry('UPDATE_MAPPING_MODEL_VERSIONS -> INDEX_STATE_UPDATE_DONE'); - expect(records).toContainLogEntry('INDEX_STATE_UPDATE_DONE -> DOCUMENTS_UPDATE_INIT'); - expect(records).toContainLogEntry('DOCUMENTS_UPDATE_INIT -> SET_DOC_MIGRATION_STARTED'); - expect(records).toContainLogEntry( - 'SET_DOC_MIGRATION_STARTED -> SET_DOC_MIGRATION_STARTED_WAIT_FOR_INSTANCES' - ); - expect(records).toContainLogEntry( - 'SET_DOC_MIGRATION_STARTED_WAIT_FOR_INSTANCES -> CLEANUP_UNKNOWN_AND_EXCLUDED_DOCS' - ); - expect(records).toContainLogEntry( - 'CLEANUP_UNKNOWN_AND_EXCLUDED_DOCS -> CLEANUP_UNKNOWN_AND_EXCLUDED_DOCS_WAIT_FOR_TASK' - ); - expect(records).toContainLogEntry( - 'CLEANUP_UNKNOWN_AND_EXCLUDED_DOCS_WAIT_FOR_TASK -> OUTDATED_DOCUMENTS_SEARCH_OPEN_PIT' - ); - expect(records).toContainLogEntry( - 'OUTDATED_DOCUMENTS_SEARCH_OPEN_PIT -> OUTDATED_DOCUMENTS_SEARCH_READ' - ); - expect(records).toContainLogEntry( - 'OUTDATED_DOCUMENTS_SEARCH_READ -> OUTDATED_DOCUMENTS_SEARCH_TRANSFORM' - ); - expect(records).toContainLogEntry( - 'OUTDATED_DOCUMENTS_SEARCH_TRANSFORM -> OUTDATED_DOCUMENTS_SEARCH_BULK_INDEX' - ); - expect(records).toContainLogEntry( - 'OUTDATED_DOCUMENTS_SEARCH_BULK_INDEX -> OUTDATED_DOCUMENTS_SEARCH_READ' - ); - expect(records).toContainLogEntry( - 'OUTDATED_DOCUMENTS_SEARCH_READ -> OUTDATED_DOCUMENTS_SEARCH_CLOSE_PIT' - ); - expect(records).toContainLogEntry( - 'OUTDATED_DOCUMENTS_SEARCH_CLOSE_PIT -> OUTDATED_DOCUMENTS_SEARCH_REFRESH' - ); - expect(records).toContainLogEntry( - 'OUTDATED_DOCUMENTS_SEARCH_REFRESH -> UPDATE_DOCUMENT_MODEL_VERSIONS' - ); - expect(records).toContainLogEntry( - 'UPDATE_DOCUMENT_MODEL_VERSIONS -> UPDATE_DOCUMENT_MODEL_VERSIONS_WAIT_FOR_INSTANCES' - ); - expect(records).toContainLogEntry('UPDATE_DOCUMENT_MODEL_VERSIONS_WAIT_FOR_INSTANCES -> DONE'); - - expect(records).toContainLogEntry('Migration completed'); +describe('ZDT upgrades - standard workflow', () => { + createStandardWorkflowTest({ + startES: startElasticsearch, + logFilePath: Path.join(__dirname, 'standard_workflow.test.log'), }); }); diff --git a/src/core/server/integration_tests/saved_objects/serverless/migrations/actions.test.ts b/src/core/server/integration_tests/saved_objects/serverless/migrations/actions.test.ts new file mode 100644 index 0000000000000..bbd4984eae0b8 --- /dev/null +++ b/src/core/server/integration_tests/saved_objects/serverless/migrations/actions.test.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { createTestServerlessInstances } from '@kbn/core-test-helpers-kbn-server'; +import { runActionTestSuite } from '../../migrations/group3/actions/actions_test_suite'; + +const { startES } = createTestServerlessInstances({ + adjustTimeout: jest.setTimeout, +}); + +describe('Migration actions - serverless environment', () => { + runActionTestSuite({ + startEs: async () => { + const serverlessEs = await startES(); + const client = serverlessEs.getClient(); + return { + esServer: serverlessEs, + client, + }; + }, + environment: 'serverless', + }); +}); diff --git a/src/core/server/integration_tests/saved_objects/serverless/migrations/basic_document_migration.test.ts b/src/core/server/integration_tests/saved_objects/serverless/migrations/basic_document_migration.test.ts new file mode 100644 index 0000000000000..cfc30c5bd2266 --- /dev/null +++ b/src/core/server/integration_tests/saved_objects/serverless/migrations/basic_document_migration.test.ts @@ -0,0 +1,25 @@ +/* + * 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 Path from 'path'; +import { createTestServerlessInstances } from '@kbn/core-test-helpers-kbn-server'; +import { createBasicDocumentsMigrationTest } from '../../migrations/shared_suites/zdt/basic_document_migration'; + +describe('serverless - ZDT upgrades - basic document migration', () => { + const startElasticsearch = async () => { + const { startES } = createTestServerlessInstances({ + adjustTimeout: jest.setTimeout, + }); + return await startES(); + }; + + createBasicDocumentsMigrationTest({ + startES: startElasticsearch, + logFilePath: Path.join(__dirname, 'basic_document_migration.test.log'), + }); +}); diff --git a/src/core/server/integration_tests/saved_objects/serverless/migrations/smoke.test.ts b/src/core/server/integration_tests/saved_objects/serverless/migrations/smoke.test.ts index 1d884706fc8ba..01be93e7a296c 100644 --- a/src/core/server/integration_tests/saved_objects/serverless/migrations/smoke.test.ts +++ b/src/core/server/integration_tests/saved_objects/serverless/migrations/smoke.test.ts @@ -13,10 +13,11 @@ import { createTestServerlessInstances, } from '@kbn/core-test-helpers-kbn-server'; -describe('smoke', () => { +describe('Basic smoke test', () => { let serverlessES: TestServerlessESUtils; let serverlessKibana: TestServerlessKibanaUtils; let root: TestServerlessKibanaUtils['root']; + beforeEach(async () => { const { startES, startKibana } = createTestServerlessInstances({ adjustTimeout: jest.setTimeout, @@ -25,11 +26,13 @@ describe('smoke', () => { serverlessKibana = await startKibana(); root = serverlessKibana.root; }); + afterEach(async () => { await serverlessES?.stop(); await serverlessKibana?.stop(); }); - test('it can start Kibana and ES serverless', async () => { + + test('it can start Kibana running against serverless ES', async () => { const { body } = await request.get(root, '/api/status').expect(200); expect(body).toMatchObject({ status: { overall: { level: 'available' } } }); }); diff --git a/src/core/server/integration_tests/saved_objects/serverless/migrations/standard_workflow.test.ts b/src/core/server/integration_tests/saved_objects/serverless/migrations/standard_workflow.test.ts new file mode 100644 index 0000000000000..77368869e6e59 --- /dev/null +++ b/src/core/server/integration_tests/saved_objects/serverless/migrations/standard_workflow.test.ts @@ -0,0 +1,25 @@ +/* + * 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 Path from 'path'; +import { createTestServerlessInstances } from '@kbn/core-test-helpers-kbn-server'; +import { createStandardWorkflowTest } from '../../migrations/shared_suites/zdt/standard_workflow'; + +describe('serverless - ZDT upgrades - standard workflow', () => { + const startElasticsearch = async () => { + const { startES } = createTestServerlessInstances({ + adjustTimeout: jest.setTimeout, + }); + return await startES(); + }; + + createStandardWorkflowTest({ + startES: startElasticsearch, + logFilePath: Path.join(__dirname, 'standard_workflow.test.log'), + }); +}); diff --git a/src/plugins/console/public/application/models/legacy_core_editor/mode/worker/worker.js b/src/plugins/console/public/application/models/legacy_core_editor/mode/worker/worker.js index fa03617f5824f..e8953152a5932 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/mode/worker/worker.js +++ b/src/plugins/console/public/application/models/legacy_core_editor/mode/worker/worker.js @@ -2090,6 +2090,12 @@ ace.define( case 'p': next('p'); switch (ch) { + case 'a': + next('a'); + next('t'); + next('c'); + next('h'); + return 'patch'; case 'u': next('u'); next('t'); @@ -2106,6 +2112,12 @@ ace.define( case 'P': next('P'); switch (ch) { + case 'A': + next('A'); + next('T'); + next('C'); + next('H'); + return 'PATCH'; case 'U': next('U'); next('T'); @@ -2120,7 +2132,7 @@ ace.define( } break; default: - error('Expected one of GET/POST/PUT/DELETE/HEAD'); + error('Expected one of GET/POST/PUT/DELETE/HEAD/PATCH'); } }, value, // Place holder for the value function. @@ -2254,7 +2266,7 @@ ace.define( annotate('error', e.message); // snap const substring = text.substr(at); - const nextMatch = substring.search(/^POST|HEAD|GET|PUT|DELETE/m); + const nextMatch = substring.search(/^POST|HEAD|GET|PUT|DELETE|PATCH/m); if (nextMatch < 1) return; reset(at + nextMatch); } diff --git a/src/plugins/console/public/application/models/sense_editor/curl.ts b/src/plugins/console/public/application/models/sense_editor/curl.ts index 74cbebf051d03..894ee2bf70168 100644 --- a/src/plugins/console/public/application/models/sense_editor/curl.ts +++ b/src/plugins/console/public/application/models/sense_editor/curl.ts @@ -38,13 +38,13 @@ export function parseCURL(text: string) { const EscapedQuotes = /^((?:[^\\"']|\\.)+)/; const LooksLikeCurl = /^\s*curl\s+/; - const CurlVerb = /-X ?(GET|HEAD|POST|PUT|DELETE)/; + const CurlVerb = /-X ?(GET|HEAD|POST|PUT|DELETE|PATCH)/; const HasProtocol = /[\s"']https?:\/\//; const CurlRequestWithProto = /[\s"']https?:\/\/[^\/ ]+\/+([^\s"']+)/; const CurlRequestWithoutProto = /[\s"'][^\/ ]+\/+([^\s"']+)/; const CurlData = /^.+\s(--data|-d)\s*/; - const SenseLine = /^\s*(GET|HEAD|POST|PUT|DELETE)\s+\/?(.+)/; + const SenseLine = /^\s*(GET|HEAD|POST|PUT|DELETE|PATCH)\s+\/?(.+)/; if (lines.length > 0 && ExecutionComment.test(lines[0])) { lines.shift(); diff --git a/src/plugins/console/public/application/models/sense_editor/integration.test.js b/src/plugins/console/public/application/models/sense_editor/integration.test.js index cd7e13d5c6a56..e47439a899edd 100644 --- a/src/plugins/console/public/application/models/sense_editor/integration.test.js +++ b/src/plugins/console/public/application/models/sense_editor/integration.test.js @@ -985,7 +985,7 @@ describe('Integration', () => { { name: 'Cursor rows after request end', cursor: { lineNumber: 5, column: 1 }, - autoCompleteSet: ['GET', 'PUT', 'POST', 'DELETE', 'HEAD'], + autoCompleteSet: ['GET', 'PUT', 'POST', 'DELETE', 'HEAD', 'PATCH'], prefixToAdd: '', suffixToAdd: ' ', }, diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts index 167a0e0ab1bd3..74d06cd21ed70 100644 --- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts +++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts @@ -967,7 +967,7 @@ export default function ({ } function addMethodAutoCompleteSetToContext(context: AutoCompleteContext) { - context.autoCompleteSet = ['GET', 'PUT', 'POST', 'DELETE', 'HEAD'].map((m, i) => ({ + context.autoCompleteSet = ['GET', 'PUT', 'POST', 'DELETE', 'HEAD', 'PATCH'].map((m, i) => ({ name: m, score: -i, meta: i18n.translate('console.autocomplete.addMethodMetaText', { defaultMessage: 'method' }), diff --git a/src/plugins/console/public/lib/autocomplete/components/url_pattern_matcher.js b/src/plugins/console/public/lib/autocomplete/components/url_pattern_matcher.js index f2666052b988f..8d6a0a8f60b12 100644 --- a/src/plugins/console/public/lib/autocomplete/components/url_pattern_matcher.js +++ b/src/plugins/console/public/lib/autocomplete/components/url_pattern_matcher.js @@ -33,7 +33,7 @@ export class UrlPatternMatcher { // We'll group endpoints by the methods which are attached to them, //to avoid suggesting endpoints that are incompatible with the //method that the user has entered. - ['HEAD', 'GET', 'PUT', 'POST', 'DELETE'].forEach((method) => { + ['HEAD', 'GET', 'PUT', 'POST', 'DELETE', 'PATCH'].forEach((method) => { this[method] = { rootComponent: new SharedComponent('ROOT'), parametrizedComponentFactories: parametrizedComponentFactories || { diff --git a/src/plugins/console/public/lib/curl_parsing/curl.js b/src/plugins/console/public/lib/curl_parsing/curl.js index 1ae6335f3249e..519cb3a3bbd0a 100644 --- a/src/plugins/console/public/lib/curl_parsing/curl.js +++ b/src/plugins/console/public/lib/curl_parsing/curl.js @@ -38,13 +38,13 @@ export function parseCURL(text) { const EscapedQuotes = /^((?:[^\\"']|\\.)+)/; const LooksLikeCurl = /^\s*curl\s+/; - const CurlVerb = /-X ?(GET|HEAD|POST|PUT|DELETE)/; + const CurlVerb = /-X ?(GET|HEAD|POST|PUT|DELETE|PATCH)/; const HasProtocol = /[\s"']https?:\/\//; const CurlRequestWithProto = /[\s"']https?:\/\/[^\/ ]+\/+([^\s"']+)/; const CurlRequestWithoutProto = /[\s"'][^\/ ]+\/+([^\s"']+)/; const CurlData = /^.+\s(--data|-d)\s*/; - const SenseLine = /^\s*(GET|HEAD|POST|PUT|DELETE)\s+\/?(.+)/; + const SenseLine = /^\s*(GET|HEAD|POST|PUT|DELETE|PATCH)\s+\/?(.+)/; if (lines.length > 0 && ExecutionComment.test(lines[0])) { lines.shift(); diff --git a/src/plugins/console/server/lib/spec_definitions/js/query/dsl.ts b/src/plugins/console/server/lib/spec_definitions/js/query/dsl.ts index c8eceba98b52f..6a8ddc0053203 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/query/dsl.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/query/dsl.ts @@ -496,6 +496,17 @@ export const query = (specService: SpecDefinitionsService) => { format: 'dd/MM/yyyy||yyyy', }, }, + rule_query: { + __template: { + organic: { + query: {}, + }, + ruleset_id: '', + match_criteria: { + FIELD: 'VALUE', + }, + }, + }, span_first: { __template: spanFirstTemplate, match: SPAN_QUERIES, diff --git a/src/plugins/console/server/lib/spec_definitions/json/overrides/query_ruleset.put.json b/src/plugins/console/server/lib/spec_definitions/json/overrides/query_ruleset.put.json index d19b1f14f0f64..9b50197db9689 100644 --- a/src/plugins/console/server/lib/spec_definitions/json/overrides/query_ruleset.put.json +++ b/src/plugins/console/server/lib/spec_definitions/json/overrides/query_ruleset.put.json @@ -3,11 +3,11 @@ "data_autocomplete_rules": { "rules": [{ "rule_id": "", - "type": "", + "type": "pinned", "criteria": [{ - "type": "", + "type": { "__one_of": [ "exact", "fuzzy", "prefix", "suffix", "contains", "lt", "lte", "gt", "gte", "always" ]}, "metadata": "", - "value": "" + "values": [""] }], "actions": { "docs":[{ diff --git a/src/plugins/console/server/routes/api/console/proxy/body.test.ts b/src/plugins/console/server/routes/api/console/proxy/body.test.ts index 893f00f975e89..5500be776dcbc 100644 --- a/src/plugins/console/server/routes/api/console/proxy/body.test.ts +++ b/src/plugins/console/server/routes/api/console/proxy/body.test.ts @@ -90,5 +90,11 @@ describe('Console Proxy Route', () => { }); }); }); + describe('PATCH request', () => { + it('returns the exact body', async () => { + const { payload } = await request('PATCH', '/', 'foobar'); + expect(await readStream(payload)).toBe('foobar'); + }); + }); }); }); diff --git a/src/plugins/console/server/routes/api/console/proxy/validation_config.ts b/src/plugins/console/server/routes/api/console/proxy/validation_config.ts index 4492863a16bcb..9a3ee2efd66c1 100644 --- a/src/plugins/console/server/routes/api/console/proxy/validation_config.ts +++ b/src/plugins/console/server/routes/api/console/proxy/validation_config.ts @@ -13,11 +13,11 @@ export type Body = TypeOf; const acceptedHttpVerb = schema.string({ validate: (method) => { - return ['HEAD', 'GET', 'POST', 'PUT', 'DELETE'].some( + return ['HEAD', 'GET', 'POST', 'PUT', 'DELETE', 'PATCH'].some( (verb) => verb.toLowerCase() === method.toLowerCase() ) ? undefined - : `Method must be one of, case insensitive ['HEAD', 'GET', 'POST', 'PUT', 'DELETE']. Received '${method}'.`; + : `Method must be one of, case insensitive ['HEAD', 'GET', 'POST', 'PUT', 'DELETE', 'PATCH']. Received '${method}'.`; }, }); diff --git a/src/plugins/dashboard/public/dashboard_actions/clone_panel_action.tsx b/src/plugins/dashboard/public/dashboard_actions/clone_panel_action.tsx index e028d8f387312..8b3e9545114ff 100644 --- a/src/plugins/dashboard/public/dashboard_actions/clone_panel_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/clone_panel_action.tsx @@ -91,7 +91,7 @@ export class ClonePanelAction implements Action { explicitInput: { ...(await embeddable.getInputAsValueType()), hidePanelTitles: panelToClone.explicitInput.hidePanelTitles, - title: newTitle, + ...(newTitle ? { title: newTitle } : {}), id, }, }; diff --git a/src/plugins/discover/public/__mocks__/__storybook_mocks__/with_discover_services.tsx b/src/plugins/discover/public/__mocks__/__storybook_mocks__/with_discover_services.tsx index 62b04533c2a41..cf280767e0d4b 100644 --- a/src/plugins/discover/public/__mocks__/__storybook_mocks__/with_discover_services.tsx +++ b/src/plugins/discover/public/__mocks__/__storybook_mocks__/with_discover_services.tsx @@ -21,7 +21,6 @@ import { SEARCH_FIELDS_FROM_SOURCE, SHOW_MULTIFIELDS, } from '@kbn/discover-utils'; -import { SIDEBAR_CLOSED_KEY } from '../../application/main/components/layout/discover_layout'; import { LocalStorageMock } from '../local_storage_mock'; import { DiscoverServices } from '../../build_services'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; @@ -73,9 +72,7 @@ export const services = { docLinks: { links: { discover: {} } }, theme, }, - storage: new LocalStorageMock({ - [SIDEBAR_CLOSED_KEY]: false, - }) as unknown as Storage, + storage: new LocalStorageMock({}) as unknown as Storage, data: { query: { timefilter: { diff --git a/src/plugins/discover/public/application/context/components/action_bar/action_bar.tsx b/src/plugins/discover/public/application/context/components/action_bar/action_bar.tsx index 5cbb72f0602ee..747cd68837545 100644 --- a/src/plugins/discover/public/application/context/components/action_bar/action_bar.tsx +++ b/src/plugins/discover/public/application/context/components/action_bar/action_bar.tsx @@ -156,7 +156,7 @@ export function ActionBar({ {!isSuccessor && showWarning && } {!isSuccessor && showWarning && } - {!isSuccessor && } + ); } diff --git a/src/plugins/discover/public/application/context/context_app.scss b/src/plugins/discover/public/application/context/context_app.scss index 13593a7ed32dd..19ae9a7471302 100644 --- a/src/plugins/discover/public/application/context/context_app.scss +++ b/src/plugins/discover/public/application/context/context_app.scss @@ -17,8 +17,4 @@ &__cell--highlight { background-color: tintOrShade($euiColorPrimary, 90%, 70%); } - - .euiDataGridRowCell.euiDataGridRowCell--firstColumn { - padding: 0; - } } diff --git a/src/plugins/discover/public/application/context/context_app.tsx b/src/plugins/discover/public/application/context/context_app.tsx index 19a5058638392..355c82417f632 100644 --- a/src/plugins/discover/public/application/context/context_app.tsx +++ b/src/plugins/discover/public/application/context/context_app.tsx @@ -10,7 +10,8 @@ import React, { Fragment, memo, useEffect, useRef, useMemo, useCallback } from ' import './context_app.scss'; import classNames from 'classnames'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiText, EuiPage, EuiPageBody, EuiSpacer } from '@elastic/eui'; +import { EuiText, EuiPage, EuiPageBody, EuiSpacer, useEuiPaddingSize } from '@elastic/eui'; +import { css } from '@emotion/react'; import { cloneDeep } from 'lodash'; import { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import { useExecutionContext } from '@kbn/kibana-react-plugin/public'; @@ -215,6 +216,8 @@ export const ContextApp = ({ dataView, anchorId, referrer }: ContextAppProps) => }; }; + const titlePadding = useEuiPaddingSize('m'); + return ( {fetchedState.anchorStatus.value === LoadingStatus.FAILED ? ( @@ -235,12 +238,16 @@ export const ContextApp = ({ dataView, anchorId, referrer }: ContextAppProps) => - - + - {!!interceptedWarnings?.length && ( - <> - - - - )} - - {loadingFeedback()} - + + {!!interceptedWarnings?.length && ( + <> + + + + )} + + {loadingFeedback()} + {isLegacy && rows && rows.length !== 0 && ( )} - - + + + ); } + +const WrapperWithPadding: React.FC = ({ children }) => { + const padding = useEuiPaddingSize('s'); + + return ( +
    + {children} +
    + ); +}; diff --git a/src/plugins/discover/public/application/doc/components/doc.tsx b/src/plugins/discover/public/application/doc/components/doc.tsx index 83c2c08eafa2e..5bf79863ecfbe 100644 --- a/src/plugins/discover/public/application/doc/components/doc.tsx +++ b/src/plugins/discover/public/application/doc/components/doc.tsx @@ -50,7 +50,7 @@ export function Doc(props: DocProps) { values: { id: props.id }, })}
    - + {reqState === ElasticRequestState.NotFoundDataView && ( time; (services.data.query.queryString.getDefaultQuery as jest.Mock).mockReturnValue({ @@ -77,6 +73,9 @@ async function mountComponent( (searchSourceInstanceMock.fetch$ as jest.Mock).mockImplementation( jest.fn().mockReturnValue(of({ rawResponse: { hits: { total: 2 } } })) ); + (localStorageModule.default as jest.Mock).mockImplementation( + jest.fn(() => [prevSidebarClosed, jest.fn()]) + ); const stateContainer = getDiscoverStateMock({ isTimeBased: true }); diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx index 58c23aa561e12..3402bfbce1bcc 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx @@ -6,17 +6,18 @@ * Side Public License, v 1. */ import './discover_layout.scss'; -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import { - EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiHideFor, EuiPage, EuiPageBody, EuiPanel, - EuiSpacer, + useEuiBackgroundColor, + useEuiTheme, } from '@elastic/eui'; +import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { METRIC_TYPE } from '@kbn/analytics'; import classNames from 'classnames'; @@ -52,11 +53,6 @@ import { DiscoverHistogramLayout } from './discover_histogram_layout'; import { ErrorCallout } from '../../../../components/common/error_callout'; import { addLog } from '../../../../utils/add_log'; -/** - * Local storage key for sidebar persistence state - */ -export const SIDEBAR_CLOSED_KEY = 'discover:sidebarClosed'; - const SidebarMemoized = React.memo(DiscoverSidebarResponsive); const TopNavMemoized = React.memo(DiscoverTopNav); @@ -72,11 +68,12 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { data, uiSettings, filterManager, - storage, history, spaces, inspector, } = useDiscoverServices(); + const { euiTheme } = useEuiTheme(); + const pageBackgroundColor = useEuiBackgroundColor('plain'); const globalQueryState = data.query.getState(); const { main$ } = stateContainer.dataState.data$; const [query, savedQuery, columns, sort] = useAppStateSelector((state) => [ @@ -109,8 +106,6 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { return dataView.type !== DataViewType.ROLLUP && dataView.isTimeBased(); }, [dataView]); - const initialSidebarClosed = Boolean(storage.get(SIDEBAR_CLOSED_KEY)); - const [isSidebarClosed, setIsSidebarClosed] = useState(initialSidebarClosed); const useNewFieldsApi = useMemo(() => !uiSettings.get(SEARCH_FIELDS_FROM_SOURCE), [uiSettings]); const isPlainRecord = useMemo(() => getRawRecordType(query) === RecordRawType.PLAIN, [query]); @@ -172,11 +167,6 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { filterManager.setFilters(disabledFilters); }, [filterManager]); - const toggleSidebarCollapse = useCallback(() => { - storage.set(SIDEBAR_CLOSED_KEY, !isSidebarClosed); - setIsSidebarClosed(!isSidebarClosed); - }, [isSidebarClosed, storage]); - const contentCentered = resultState === 'uninitialized' || resultState === 'none'; const documentState = useDataState(stateContainer.dataState.data$.documents$); @@ -240,7 +230,13 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { ]); return ( - +

    - + - -
    - - -
    -
    +
    {resultState === 'none' ? ( @@ -335,7 +319,10 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { role="main" panelRef={resizeRef} paddingSize="none" + borderRadius="none" hasShadow={false} + hasBorder={false} + color="transparent" className={classNames('dscPageContent', { 'dscPageContent--centered': contentCentered, })} diff --git a/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx b/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx index d7d90ff6b517e..e241a52b1d259 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { DragDrop, type DropType, DropOverlayWrapper } from '@kbn/dom-drag-drop'; import useObservable from 'react-use/lib/useObservable'; import React, { useCallback } from 'react'; @@ -97,7 +97,6 @@ export const DiscoverMainContent = ({ data-test-subj="dscMainContent" > - {!isPlainRecord && ( = ({ return ( } - hasBorder + hasBorder={false} title={

    void; }) => { + const { euiTheme } = useEuiTheme(); const { uiSettings } = useDiscoverServices(); const tabsCss = css` padding: 0 ${useEuiPaddingSize('s')}; - background-color: ${euiThemeVars.euiPageBackgroundColor}; + border-bottom: ${viewMode === VIEW_MODE.AGGREGATED_LEVEL ? euiTheme.border.thin : 'none'}; `; const showViewModeToggle = uiSettings.get(SHOW_FIELD_STATISTICS) ?? false; @@ -36,7 +36,7 @@ export const DocumentViewModeToggle = ({ } return ( - + setDiscoverViewMode(VIEW_MODE.DOCUMENT_LEVEL)} diff --git a/src/plugins/discover/server/ui_settings.ts b/src/plugins/discover/server/ui_settings.ts index d6bbbd0eed9f0..bc5ad09d260c4 100644 --- a/src/plugins/discover/server/ui_settings.ts +++ b/src/plugins/discover/server/ui_settings.ts @@ -287,7 +287,7 @@ export const getUiSettings: (docLinks: DocLinksServiceSetup) => Record boolean; } export class FeatureCatalogueRegistry { @@ -116,7 +118,10 @@ export class FeatureCatalogueRegistry { } const capabilities = this.capabilities; return [...this.solutions.values()] - .filter((solution) => capabilities.catalogue[solution.id] !== false) + .filter( + (solution) => + solution.isVisible?.(capabilities) ?? capabilities.catalogue[solution.id] !== false + ) .sort(compareByKey('title')); } diff --git a/src/plugins/home/server/services/sample_data/sample_data_installer.test.ts b/src/plugins/home/server/services/sample_data/sample_data_installer.test.ts index af3108ddafce9..361a9c74c0090 100644 --- a/src/plugins/home/server/services/sample_data/sample_data_installer.test.ts +++ b/src/plugins/home/server/services/sample_data/sample_data_installer.test.ts @@ -159,8 +159,14 @@ describe('SampleDataInstaller', () => { expect(esClient.asCurrentUser.indices.create).toHaveBeenCalledWith({ index: 'kibana_sample_data_test_single_data_index', body: { - settings: { index: { number_of_shards: 1, auto_expand_replicas: '0-1' } }, - mappings: { properties: { someField: { type: 'keyword' } } }, + mappings: { + properties: { + someField: { type: 'keyword' }, + }, + }, + settings: { + index: {}, + }, }, }); }); diff --git a/src/plugins/home/server/services/sample_data/sample_data_installer.ts b/src/plugins/home/server/services/sample_data/sample_data_installer.ts index 958f952fdd5a1..3f165a4a0e219 100644 --- a/src/plugins/home/server/services/sample_data/sample_data_installer.ts +++ b/src/plugins/home/server/services/sample_data/sample_data_installer.ts @@ -155,13 +155,13 @@ export class SampleDataInstaller { private async installDataIndex(dataset: SampleDatasetSchema, dataIndex: DataIndexSchema) { const index = createIndexName(dataset.id, dataIndex.id); + try { if (dataIndex.isDataStream) { const request = { name: index, body: { template: { - settings: { number_of_shards: 1, auto_expand_replicas: '0-1' }, mappings: { properties: dataIndex.fields }, }, index_patterns: [index], @@ -180,8 +180,6 @@ export class SampleDataInstaller { settings: { index: { ...dataIndex.indexSettings, - number_of_shards: 1, - auto_expand_replicas: '0-1', }, }, mappings: { properties: dataIndex.fields }, diff --git a/src/plugins/unified_histogram/public/layout/layout.tsx b/src/plugins/unified_histogram/public/layout/layout.tsx index d2088d4776445..95661ed9b3f2f 100644 --- a/src/plugins/unified_histogram/public/layout/layout.tsx +++ b/src/plugins/unified_histogram/public/layout/layout.tsx @@ -275,7 +275,7 @@ export const UnifiedHistogramLayout = ({ chart={chart} breakdown={breakdown} appendHitsCounter={appendHitsCounter} - appendHistogram={showFixedPanels ? : } + appendHistogram={} disableAutoFetching={disableAutoFetching} disableTriggers={disableTriggers} disabledActions={disabledActions} diff --git a/src/plugins/unified_histogram/public/panels/panels_resizable.tsx b/src/plugins/unified_histogram/public/panels/panels_resizable.tsx index 773ebe172b25e..9f8fd5338a38f 100644 --- a/src/plugins/unified_histogram/public/panels/panels_resizable.tsx +++ b/src/plugins/unified_histogram/public/panels/panels_resizable.tsx @@ -6,12 +6,7 @@ * Side Public License, v 1. */ -import { - EuiResizableContainer, - useEuiTheme, - useGeneratedHtmlId, - useResizeObserver, -} from '@elastic/eui'; +import { EuiResizableContainer, useGeneratedHtmlId, useResizeObserver } from '@elastic/eui'; import type { ResizeTrigger } from '@elastic/eui/src/components/resizable_container/types'; import { css } from '@emotion/react'; import { isEqual, round } from 'lodash'; @@ -162,12 +157,6 @@ export const PanelsResizable = ({ disableResizeWithPortalsHack(); }, [disableResizeWithPortalsHack, resizeWithPortalsHackIsResizing]); - const { euiTheme } = useEuiTheme(); - const buttonCss = css` - margin-top: -${euiTheme.size.base}; - margin-bottom: 0; - `; - return ( { searchValue: string, OPTION_CONTENT_CLASSNAME: string ) => React.ReactNode; + inputRef?: ((instance: HTMLInputElement | null) => void) | undefined; [propName: string]: any; } diff --git a/src/plugins/unified_search/public/filter_bar/filter_editor/phrase_value_input.tsx b/src/plugins/unified_search/public/filter_bar/filter_editor/phrase_value_input.tsx index ae87024bb61a9..0a466c61770ce 100644 --- a/src/plugins/unified_search/public/filter_bar/filter_editor/phrase_value_input.tsx +++ b/src/plugins/unified_search/public/filter_bar/filter_editor/phrase_value_input.tsx @@ -31,12 +31,8 @@ const COMBOBOX_PADDINGS = 10; const DEFAULT_FONT = '14px Inter'; class PhraseValueInputUI extends PhraseSuggestorUI { - comboBoxRef: React.RefObject; - - constructor(props: PhraseValueInputProps) { - super(props); - this.comboBoxRef = React.createRef(); - } + comboBoxWrapperRef = React.createRef(); + inputRef: HTMLInputElement | null = null; public render() { return ( @@ -69,8 +65,11 @@ class PhraseValueInputUI extends PhraseSuggestorUI { const valueAsStr = String(value); const options = value ? uniq([valueAsStr, ...suggestions]) : suggestions; return ( -
    +
    { + this.inputRef = ref; + }} isDisabled={this.props.disabled} fullWidth={fullWidth} compressed={this.props.compressed} @@ -85,7 +84,13 @@ class PhraseValueInputUI extends PhraseSuggestorUI { options={options} getLabel={(option) => option} selectedOptions={value ? [valueAsStr] : []} - onChange={([newValue = '']) => onChange(newValue)} + onChange={([newValue = '']) => { + onChange(newValue); + setTimeout(() => { + // Note: requires a tick skip to correctly blur element focus + this.inputRef?.blur(); + }); + }} onSearchChange={this.onSearchChange} singleSelection={{ asPlainText: true }} onCreateOption={onChange} @@ -98,7 +103,7 @@ class PhraseValueInputUI extends PhraseSuggestorUI { defaultComboboxWidth={DEFAULT_COMBOBOX_WIDTH} defaultFont={DEFAULT_FONT} comboboxPaddings={COMBOBOX_PADDINGS} - comboBoxRef={this.comboBoxRef} + comboBoxWrapperRef={this.comboBoxWrapperRef} label={option.label} search={searchValue} /> diff --git a/src/plugins/unified_search/public/filter_bar/filter_editor/phrases_values_input.tsx b/src/plugins/unified_search/public/filter_bar/filter_editor/phrases_values_input.tsx index 336849c4ee65a..b31e6aad7d438 100644 --- a/src/plugins/unified_search/public/filter_bar/filter_editor/phrases_values_input.tsx +++ b/src/plugins/unified_search/public/filter_bar/filter_editor/phrases_values_input.tsx @@ -33,12 +33,7 @@ const COMBOBOX_PADDINGS = 20; const DEFAULT_FONT = '14px Inter'; class PhrasesValuesInputUI extends PhraseSuggestorUI { - comboBoxRef: React.RefObject; - - constructor(props: PhrasesValuesInputProps) { - super(props); - this.comboBoxRef = React.createRef(); - } + comboBoxWrapperRef = React.createRef(); public render() { const { suggestions } = this.state; @@ -46,7 +41,7 @@ class PhrasesValuesInputUI extends PhraseSuggestorUI { const options = values ? uniq([...values, ...suggestions]) : suggestions; return ( -
    +
    { defaultComboboxWidth={DEFAULT_COMBOBOX_WIDTH} defaultFont={DEFAULT_FONT} comboboxPaddings={COMBOBOX_PADDINGS} - comboBoxRef={this.comboBoxRef} + comboBoxWrapperRef={this.comboBoxWrapperRef} label={option.label} search={searchValue} /> diff --git a/src/plugins/unified_search/public/filter_bar/filter_editor/truncated_label.test.tsx b/src/plugins/unified_search/public/filter_bar/filter_editor/truncated_label.test.tsx index 47ea4cbf2c0eb..08236041ab93a 100644 --- a/src/plugins/unified_search/public/filter_bar/filter_editor/truncated_label.test.tsx +++ b/src/plugins/unified_search/public/filter_bar/filter_editor/truncated_label.test.tsx @@ -6,18 +6,16 @@ * Side Public License, v 1. */ -import React from 'react'; +import React, { ComponentProps } from 'react'; import { mount } from 'enzyme'; import { TruncatedLabel } from './truncated_label'; describe('truncated_label', () => { - const defaultProps = { + const defaultProps: ComponentProps = { defaultFont: '14px Inter', - // jest-canvas-mock mocks measureText as the number of string characters, thats why the width is so low - width: 30, defaultComboboxWidth: 130, comboboxPaddings: 100, - comboBoxRef: React.createRef(), + comboBoxWrapperRef: React.createRef(), search: '', label: 'example_field', }; diff --git a/src/plugins/unified_search/public/filter_bar/filter_editor/truncated_label.tsx b/src/plugins/unified_search/public/filter_bar/filter_editor/truncated_label.tsx index 9f268e46d7929..21304ad244edf 100644 --- a/src/plugins/unified_search/public/filter_bar/filter_editor/truncated_label.tsx +++ b/src/plugins/unified_search/public/filter_bar/filter_editor/truncated_label.tsx @@ -15,7 +15,7 @@ import { throttle } from 'lodash'; interface TruncatedLabelProps { label: string; search: string; - comboBoxRef: RefObject; + comboBoxWrapperRef: RefObject; defaultFont: string; defaultComboboxWidth: number; comboboxPaddings: number; @@ -56,7 +56,7 @@ const truncateLabel = ( export const TruncatedLabel = React.memo(function TruncatedLabel({ label, - comboBoxRef, + comboBoxWrapperRef, search, defaultFont, defaultComboboxWidth, @@ -69,15 +69,14 @@ export const TruncatedLabel = React.memo(function TruncatedLabel({ width: defaultComboboxWidth - comboboxPaddings, font: defaultFont, }); - const computeStyles = (_e: UIEvent | undefined, shouldRecomputeAll = false) => { - if (comboBoxRef.current) { + if (comboBoxWrapperRef.current) { const current = { ...labelProps, - width: comboBoxRef.current?.clientWidth - comboboxPaddings, + width: comboBoxWrapperRef.current.clientWidth - comboboxPaddings, }; if (shouldRecomputeAll) { - current.font = window.getComputedStyle(comboBoxRef.current).font; + current.font = window.getComputedStyle(comboBoxWrapperRef.current).font; } setLabelProps(current); } @@ -88,7 +87,7 @@ export const TruncatedLabel = React.memo(function TruncatedLabel({ }, 50); useEffectOnce(() => { - if (comboBoxRef.current) { + if (comboBoxWrapperRef.current) { handleResize(undefined, true); } diff --git a/src/plugins/unified_search/public/filters_builder/filter_item/field_input.tsx b/src/plugins/unified_search/public/filters_builder/filter_item/field_input.tsx index 3dceef3ef52c9..8c3dc65758c29 100644 --- a/src/plugins/unified_search/public/filters_builder/filter_item/field_input.tsx +++ b/src/plugins/unified_search/public/filters_builder/filter_item/field_input.tsx @@ -43,7 +43,8 @@ export function FieldInput({ field, dataView, onHandleField }: FieldInputProps) const { disabled, suggestionsAbstraction } = useContext(FiltersBuilderContextType); const fields = dataView ? getFilterableFields(dataView) : []; const id = useGeneratedHtmlId({ prefix: 'fieldInput' }); - const comboBoxRef = useRef(null); + const comboBoxWrapperRef = useRef(null); + const inputRef = useRef(null); const onFieldChange = useCallback( ([selectedField]: DataViewField[]) => { @@ -77,12 +78,25 @@ export function FieldInput({ field, dataView, onHandleField }: FieldInputProps) ({ label }) => fields[optionFields.findIndex((optionField) => optionField.label === label)] ); onFieldChange(newValues); + + setTimeout(() => { + // Note: requires a tick skip to correctly blur element focus + inputRef?.current?.blur(); + }); + }; + + const handleFocus: React.FocusEventHandler = () => { + // Force focus on input due to https://github.com/elastic/eui/issues/7170 + inputRef?.current?.focus(); }; return ( -
    +
    { + inputRef.current = ref; + }} options={euiOptions} selectedOptions={selectedEuiOptions} onChange={onComboBoxChange} @@ -94,6 +108,7 @@ export function FieldInput({ field, dataView, onHandleField }: FieldInputProps) isClearable={false} compressed fullWidth + onFocus={handleFocus} data-test-subj="filterFieldSuggestionList" renderOption={(option, searchValue) => ( @@ -105,7 +120,7 @@ export function FieldInput({ field, dataView, onHandleField }: FieldInputProps) defaultComboboxWidth={DEFAULT_COMBOBOX_WIDTH} defaultFont={DEFAULT_FONT} comboboxPaddings={COMBOBOX_PADDINGS} - comboBoxRef={comboBoxRef} + comboBoxWrapperRef={comboBoxWrapperRef} label={option.label} search={searchValue} /> diff --git a/src/plugins/unified_search/public/filters_builder/filter_item/filter_item.styles.ts b/src/plugins/unified_search/public/filters_builder/filter_item/filter_item.styles.ts index 5ca888735f5ad..6ec0ac9ab7058 100644 --- a/src/plugins/unified_search/public/filters_builder/filter_item/filter_item.styles.ts +++ b/src/plugins/unified_search/public/filters_builder/filter_item/filter_item.styles.ts @@ -22,6 +22,13 @@ export const cursorOrCss = css` export const fieldAndParamCss = (euiTheme: EuiThemeComputed) => css` min-width: calc(${euiTheme.size.xl} * 5); + flex-grow: 1; + .euiFormRow { + max-width: 800px; + } + &:focus-within { + flex-grow: 4; + } `; export const operationCss = (euiTheme: EuiThemeComputed) => css` diff --git a/src/plugins/vis_default_editor/public/components/controls/percentiles.tsx b/src/plugins/vis_default_editor/public/components/controls/percentiles.tsx index 839d97c51228d..85bf77567c1cd 100644 --- a/src/plugins/vis_default_editor/public/components/controls/percentiles.tsx +++ b/src/plugins/vis_default_editor/public/components/controls/percentiles.tsx @@ -42,6 +42,7 @@ function PercentilesEditor({ id={`visEditorPercentileLabel${agg.id}`} isInvalid={showValidation ? !isValid : false} display="rowCompressed" + data-test-subj="visEditorPercentile" > ({ - getFieldNameFromField: jest.fn(() => mockGetFieldNameFromField()), - getLabel: jest.fn(() => mockGetLabel()), - getLabelForPercentile: jest.fn(() => mockGetLabelForPercentile()), -})); +jest.mock('../utils', () => { + const utils = jest.requireActual('../utils'); + return { + ...utils, + getFieldNameFromField: jest.fn(() => mockGetFieldNameFromField()), + getLabel: jest.fn(() => mockGetLabel()), + getLabelForPercentile: jest.fn(() => mockGetLabelForPercentile()), + }; +}); describe('convertToPercentileColumn', () => { const visType = 'heatmap'; diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentile.ts b/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentile.ts index 9989db1c5dda7..43229a610b041 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentile.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/convert/percentile.ts @@ -9,7 +9,7 @@ import { METRIC_TYPES } from '@kbn/data-plugin/common'; import { SchemaConfig } from '../../..'; import { isFieldValid, PercentileParams } from '../..'; -import { getFieldNameFromField, getLabelForPercentile } from '../utils'; +import { getAggIdAndValue, getFieldNameFromField, getLabelForPercentile } from '../utils'; import { createColumn, getFormat } from './column'; import { PercentileColumn, CommonColumnConverterArgs } from './types'; import { SUPPORTED_METRICS } from './supported_metrics'; @@ -40,7 +40,7 @@ const getPercent = ( const { percents } = aggParams; - const [, percentStr] = aggId.split('.'); + const [, percentStr] = getAggIdAndValue(aggId); const percent = Number(percentStr); if (!percents || !percents.length || percentStr === '' || isNaN(percent)) { diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/formula.test.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/formula.test.ts index 72cd07ba03f7c..2c36925b74d3b 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/formula.test.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/formula.test.ts @@ -19,14 +19,18 @@ const mockIsStdDevAgg = jest.fn(); const mockGetFieldByName = jest.fn(); const originalGetFieldByName = stubLogstashDataView.getFieldByName; -jest.mock('../utils', () => ({ - getFieldNameFromField: jest.fn((field) => field), - getMetricFromParentPipelineAgg: jest.fn(() => mockGetMetricFromParentPipelineAgg()), - isPercentileAgg: jest.fn(() => mockIsPercentileAgg()), - isPercentileRankAgg: jest.fn(() => mockIsPercentileRankAgg()), - isPipeline: jest.fn(() => mockIsPipeline()), - isStdDevAgg: jest.fn(() => mockIsStdDevAgg()), -})); +jest.mock('../utils', () => { + const utils = jest.requireActual('../utils'); + return { + ...utils, + getFieldNameFromField: jest.fn((field) => field), + getMetricFromParentPipelineAgg: jest.fn(() => mockGetMetricFromParentPipelineAgg()), + isPercentileAgg: jest.fn(() => mockIsPercentileAgg()), + isPercentileRankAgg: jest.fn(() => mockIsPercentileRankAgg()), + isPipeline: jest.fn(() => mockIsPipeline()), + isStdDevAgg: jest.fn(() => mockIsStdDevAgg()), + }; +}); const dataView = stubLogstashDataView; const visType = 'heatmap'; diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/formula.ts b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/formula.ts index 4492cd58ac230..c2e30425e9488 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/metrics/formula.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/metrics/formula.ts @@ -12,6 +12,7 @@ import { Operations } from '../../constants'; import { isMetricWithField, getStdDeviationFormula, ExtendedColumnConverterArgs } from '../convert'; import { getFormulaFromMetric, SUPPORTED_METRICS } from '../convert/supported_metrics'; import { + getAggIdAndValue, getFieldNameFromField, getMetricFromParentPipelineAgg, isPercentileAgg, @@ -125,7 +126,7 @@ const getFormulaForPercentile = ( selector: string, reducedTimeRange?: string ) => { - const percentile = Number(agg.aggId?.split('.')[1]); + const percentile = Number(getAggIdAndValue(agg.aggId)[1]); const op = SUPPORTED_METRICS[agg.aggType]; if (!isValidAgg(visType, agg, dataView) || !op) { return null; diff --git a/src/plugins/visualizations/common/convert_to_lens/lib/utils.ts b/src/plugins/visualizations/common/convert_to_lens/lib/utils.ts index ce50312d92cf3..e323b2169f519 100644 --- a/src/plugins/visualizations/common/convert_to_lens/lib/utils.ts +++ b/src/plugins/visualizations/common/convert_to_lens/lib/utils.ts @@ -199,3 +199,17 @@ export const getMetricFromParentPipelineAgg = ( return metric as SchemaConfig; }; + +const aggIdWithDecimalsRegexp = /^(\w)+\['([0-9]+\.[0-9]+)'\]$/; + +export const getAggIdAndValue = (aggId?: string) => { + if (!aggId) { + return []; + } + // agg value contains decimals + if (/\['/.test(aggId)) { + const [_, id, value] = aggId.match(aggIdWithDecimalsRegexp) || []; + return [id, value]; + } + return aggId.split('.'); +}; diff --git a/src/plugins/visualizations/public/convert_to_lens/schemas.test.ts b/src/plugins/visualizations/public/convert_to_lens/schemas.test.ts index aa338db367988..9b4f9d718804c 100644 --- a/src/plugins/visualizations/public/convert_to_lens/schemas.test.ts +++ b/src/plugins/visualizations/public/convert_to_lens/schemas.test.ts @@ -40,9 +40,13 @@ jest.mock('../../common/convert_to_lens/lib/buckets', () => ({ convertBucketToColumns: jest.fn(() => mockConvertBucketToColumns()), })); -jest.mock('../../common/convert_to_lens/lib/utils', () => ({ - getCustomBucketsFromSiblingAggs: jest.fn(() => mockGetCutomBucketsFromSiblingAggs()), -})); +jest.mock('../../common/convert_to_lens/lib/utils', () => { + const utils = jest.requireActual('../../common/convert_to_lens/lib/utils'); + return { + ...utils, + getCustomBucketsFromSiblingAggs: jest.fn(() => mockGetCutomBucketsFromSiblingAggs()), + }; +}); jest.mock('../vis_schemas', () => ({ getVisSchemas: jest.fn(() => mockGetVisSchemas()), diff --git a/src/plugins/visualizations/public/convert_to_lens/schemas.ts b/src/plugins/visualizations/public/convert_to_lens/schemas.ts index 1b44f7cdffda1..886be04bb654a 100644 --- a/src/plugins/visualizations/public/convert_to_lens/schemas.ts +++ b/src/plugins/visualizations/public/convert_to_lens/schemas.ts @@ -10,7 +10,10 @@ import type { DataView } from '@kbn/data-views-plugin/common'; import { IAggConfig, METRIC_TYPES, TimefilterContract } from '@kbn/data-plugin/public'; import { AggBasedColumn, PercentageModeConfig, SchemaConfig } from '../../common'; import { convertMetricToColumns } from '../../common/convert_to_lens/lib/metrics'; -import { getCustomBucketsFromSiblingAggs } from '../../common/convert_to_lens/lib/utils'; +import { + getAggIdAndValue, + getCustomBucketsFromSiblingAggs, +} from '../../common/convert_to_lens/lib/utils'; import { BucketColumn } from '../../common/convert_to_lens/lib'; import type { Vis } from '../types'; import { getVisSchemas, Schemas } from '../vis_schemas'; @@ -178,11 +181,12 @@ export const getColumnsFromVis = ( if (series && series.length) { for (const { metrics: metricAggIds } of series) { + const metricAggIdsLookup = new Set(metricAggIds); const metrics = aggs.filter( - (agg) => agg.aggId && metricAggIds.includes(agg.aggId.split('.')[0]) + (agg) => agg.aggId && metricAggIdsLookup.has(getAggIdAndValue(agg.aggId)[0]) ); const customBucketsForLayer = customBucketsWithMetricIds.filter((c) => - c.metricIds.some((m) => metricAggIds.includes(m)) + c.metricIds.some((m) => metricAggIdsLookup.has(m)) ); const layer = createLayer( vis.type.name, diff --git a/test/functional/apps/console/_autocomplete.ts b/test/functional/apps/console/_autocomplete.ts index 8f2a927a4ff24..1944b5ec24761 100644 --- a/test/functional/apps/console/_autocomplete.ts +++ b/test/functional/apps/console/_autocomplete.ts @@ -54,7 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('HTTP methods', async () => { const suggestions = { G: ['GET'], - P: ['PUT', 'POST'], + P: ['PUT', 'POST', 'PATCH'], D: ['DELETE'], H: ['HEAD'], }; @@ -234,6 +234,8 @@ GET _search dELETE dELETe dELEtE dELEte dELeTE dELeTe dELetE dELete dElETE dElETe dElEtE dElEte dEleTE dEleTe dEletE dElete deLETE deLETe deLEtE deLEte deLeTE deLeTe deLetE deLete delETE delETe delEtE delEte deleTE deleTe deletE delete HEAD HEAd HEaD HEad HeAD HeAd HeaD Head hEAD hEAd hEaD hEad heAD heAd heaD head + PATCH PATCh PATcH PATch PAtCH PAtCh PAtcH PAtch PaTCH PaTCh PaTcH PaTch PatCH PatCh PatcH Patch pATCH pATCh pATcH + pATch pAtCH pAtCh pAtcH pAtch paTCH paTCh paTcH paTch patCH patCh patcH patch `.split(/\s+/m) ), 20 // 20 of 112 (approx. one-fifth) should be enough for testing diff --git a/test/functional/apps/console/_console.ts b/test/functional/apps/console/_console.ts index 091ad8ee5a2e8..b8324ce58ce6c 100644 --- a/test/functional/apps/console/_console.ts +++ b/test/functional/apps/console/_console.ts @@ -68,6 +68,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(initialSize.width).to.be.greaterThan(afterSize.width); }); + it('should return statusCode 400 to unsupported HTTP verbs', async () => { + const expectedResponseContains = '"statusCode": 400'; + await PageObjects.console.enterRequest('\n OPTIONS /'); + await PageObjects.console.clickPlay(); + await retry.try(async () => { + const actualResponse = await PageObjects.console.getResponse(); + log.debug(actualResponse); + expect(actualResponse).to.contain(expectedResponseContains); + + expect(await PageObjects.console.hasSuccessBadge()).to.be(false); + }); + }); + describe('with kbn: prefix in request', () => { before(async () => { await PageObjects.console.clearTextArea(); diff --git a/test/functional/apps/discover/classic/_doc_table.ts b/test/functional/apps/discover/classic/_doc_table.ts index 2a0fbebe8cf13..7ab640cf42ee1 100644 --- a/test/functional/apps/discover/classic/_doc_table.ts +++ b/test/functional/apps/discover/classic/_doc_table.ts @@ -28,6 +28,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const defaultSettings = { defaultIndex: 'logstash-*', hideAnnouncements: true, + 'doc_table:legacy': true, }; const testSubjects = getService('testSubjects'); @@ -75,7 +76,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('classic table in window 900x700', async function () { before(async () => { - await kibanaServer.uiSettings.update({ 'doc_table:legacy': true }); await browser.setWindowSize(900, 700); await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); @@ -95,7 +95,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('classic table in window 600x700', async function () { before(async () => { - await kibanaServer.uiSettings.update({ 'doc_table:legacy': true }); await browser.setWindowSize(600, 700); await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); @@ -115,7 +114,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('legacy', async function () { before(async () => { - await kibanaServer.uiSettings.update({ 'doc_table:legacy': true }); await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); }); diff --git a/test/functional/apps/discover/group1/_date_nanos_mixed.ts b/test/functional/apps/discover/group1/_date_nanos_mixed.ts index dab0003a63f07..df45356a69789 100644 --- a/test/functional/apps/discover/group1/_date_nanos_mixed.ts +++ b/test/functional/apps/discover/group1/_date_nanos_mixed.ts @@ -15,6 +15,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'timePicker', 'discover']); const kibanaServer = getService('kibanaServer'); const security = getService('security'); + const browser = getService('browser'); const from = 'Jan 1, 2019 @ 00:00:00.000'; const to = 'Jan 1, 2019 @ 23:59:59.999'; @@ -25,7 +26,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await kibanaServer.importExport.load( 'test/functional/fixtures/kbn_archiver/date_nanos_mixed' ); - await kibanaServer.uiSettings.replace({ defaultIndex: 'timestamp-*' }); + await kibanaServer.uiSettings.replace({ + defaultIndex: 'timestamp-*', + hideAnnouncements: true, // should be enough vertical space to render rows + }); + await browser.setWindowSize(1200, 900); await security.testUser.setRoles(['kibana_admin', 'kibana_date_nanos_mixed']); await PageObjects.common.setTime({ from, to }); await PageObjects.common.navigateToApp('discover'); diff --git a/test/functional/apps/discover/group1/_discover_histogram.ts b/test/functional/apps/discover/group1/_discover_histogram.ts index c19005bfb12ff..db83f764ce6f5 100644 --- a/test/functional/apps/discover/group1/_discover_histogram.ts +++ b/test/functional/apps/discover/group1/_discover_histogram.ts @@ -88,7 +88,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return actualCount <= expectedCount; }); const newDurationHours = await PageObjects.timePicker.getTimeDurationInHours(); - expect(Math.round(newDurationHours)).to.be(26); + expect(Math.round(newDurationHours)).to.be(24); // might fail if histogram's width changes await retry.waitFor('doc table containing the documents of the brushed range', async () => { const rowData = await PageObjects.discover.getDocTableField(1); diff --git a/test/functional/apps/discover/group2/_data_grid_context.ts b/test/functional/apps/discover/group2/_data_grid_context.ts index 1b43de8a72353..4d90acab5eebb 100644 --- a/test/functional/apps/discover/group2/_data_grid_context.ts +++ b/test/functional/apps/discover/group2/_data_grid_context.ts @@ -30,7 +30,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'header', 'unifiedFieldList', ]); - const defaultSettings = { defaultIndex: 'logstash-*' }; + const defaultSettings = { + defaultIndex: 'logstash-*', + 'discover:rowHeightOption': 0, // single line + }; const kibanaServer = getService('kibanaServer'); const esArchiver = getService('esArchiver'); const dashboardAddPanel = getService('dashboardAddPanel'); diff --git a/test/functional/apps/discover/group2/_data_grid_doc_table.ts b/test/functional/apps/discover/group2/_data_grid_doc_table.ts index dd2481b13ad9f..5a60d6cf1f98c 100644 --- a/test/functional/apps/discover/group2/_data_grid_doc_table.ts +++ b/test/functional/apps/discover/group2/_data_grid_doc_table.ts @@ -28,6 +28,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ]); const defaultSettings = { defaultIndex: 'logstash-*', + 'discover:rowHeightOption': 0, // single line }; const testSubjects = getService('testSubjects'); const security = getService('security'); diff --git a/test/functional/apps/discover/group2/_data_grid_pagination.ts b/test/functional/apps/discover/group2/_data_grid_pagination.ts index 4d0c81c4cfebc..4c0a3aa53759e 100644 --- a/test/functional/apps/discover/group2/_data_grid_pagination.ts +++ b/test/functional/apps/discover/group2/_data_grid_pagination.ts @@ -15,7 +15,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const dataGrid = getService('dataGrid'); const PageObjects = getPageObjects(['settings', 'common', 'discover', 'header', 'timePicker']); - const defaultSettings = { defaultIndex: 'logstash-*' }; + const defaultSettings = { + defaultIndex: 'logstash-*', + 'discover:rowHeightOption': 0, // single line + }; const testSubjects = getService('testSubjects'); const retry = getService('retry'); const security = getService('security'); diff --git a/test/functional/apps/discover/group2/_data_grid_row_height.ts b/test/functional/apps/discover/group2/_data_grid_row_height.ts new file mode 100644 index 0000000000000..2c385b67aaa02 --- /dev/null +++ b/test/functional/apps/discover/group2/_data_grid_row_height.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 expect from '@kbn/expect'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const browser = getService('browser'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const dataGrid = getService('dataGrid'); + const PageObjects = getPageObjects(['settings', 'common', 'discover', 'header', 'timePicker']); + const defaultSettings = { defaultIndex: 'logstash-*' }; + const security = getService('security'); + + describe('discover data grid row height', function describeIndexTests() { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await browser.setWindowSize(1200, 2000); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.uiSettings.replace({}); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + beforeEach(async function () { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update(defaultSettings); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + it('should use the default row height', async () => { + const rows = await dataGrid.getDocTableRows(); + expect(rows.length).to.be.above(0); + + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentRowHeightValue()).to.be('Auto fit'); + }); + + it('should allow to change row height and reset it', async () => { + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentRowHeightValue()).to.be('Auto fit'); + + await dataGrid.changeRowHeightValue('Single'); + + // toggle the popover + await dataGrid.clickGridSettings(); + await dataGrid.clickGridSettings(); + + expect(await dataGrid.getCurrentRowHeightValue()).to.be('Single'); + + await dataGrid.resetRowHeightValue(); + + expect(await dataGrid.getCurrentRowHeightValue()).to.be('Auto fit'); + + await dataGrid.changeRowHeightValue('Custom'); + + await dataGrid.resetRowHeightValue(); + + expect(await dataGrid.getCurrentRowHeightValue()).to.be('Auto fit'); + }); + + it('should persist the selection after reloading the page', async () => { + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentRowHeightValue()).to.be('Auto fit'); + + await dataGrid.changeRowHeightValue('Single'); + + expect(await dataGrid.getCurrentRowHeightValue()).to.be('Single'); + + await browser.refresh(); + + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickGridSettings(); + + expect(await dataGrid.getCurrentRowHeightValue()).to.be('Single'); + }); + }); +} diff --git a/test/functional/apps/discover/group2/index.ts b/test/functional/apps/discover/group2/index.ts index 163c6b1a9f205..3d4103c6de85b 100644 --- a/test/functional/apps/discover/group2/index.ts +++ b/test/functional/apps/discover/group2/index.ts @@ -29,6 +29,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./_data_grid_row_navigation')); loadTestFile(require.resolve('./_data_grid_doc_table')); loadTestFile(require.resolve('./_data_grid_copy_to_clipboard')); + loadTestFile(require.resolve('./_data_grid_row_height')); loadTestFile(require.resolve('./_data_grid_pagination')); loadTestFile(require.resolve('./_data_grid_footer')); loadTestFile(require.resolve('./_adhoc_data_views')); diff --git a/test/functional/apps/discover/group3/_sidebar.ts b/test/functional/apps/discover/group3/_sidebar.ts index eefda4891390b..6a09524777487 100644 --- a/test/functional/apps/discover/group3/_sidebar.ts +++ b/test/functional/apps/discover/group3/_sidebar.ts @@ -214,16 +214,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('collapse expand', function () { it('should initially be expanded', async function () { await testSubjects.existOrFail('discover-sidebar'); + await testSubjects.existOrFail('fieldList'); }); it('should collapse when clicked', async function () { await PageObjects.discover.toggleSidebarCollapse(); - await testSubjects.missingOrFail('discover-sidebar'); + await testSubjects.existOrFail('discover-sidebar'); + await testSubjects.missingOrFail('fieldList'); }); it('should expand when clicked', async function () { await PageObjects.discover.toggleSidebarCollapse(); await testSubjects.existOrFail('discover-sidebar'); + await testSubjects.existOrFail('fieldList'); }); }); diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index 1545975667c60..d36cd4b56b129 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -370,13 +370,14 @@ export class DiscoverPageObject extends FtrService { } public async toggleSidebarCollapse() { - return await this.testSubjects.click('collapseSideBarButton'); + return await this.testSubjects.click('unifiedFieldListSidebar__toggle'); } public async closeSidebar() { await this.retry.tryForTime(2 * 1000, async () => { - await this.toggleSidebarCollapse(); - await this.testSubjects.missingOrFail('discover-sidebar'); + await this.testSubjects.click('unifiedFieldListSidebar__toggle-collapse'); + await this.testSubjects.missingOrFail('unifiedFieldListSidebar__toggle-collapse'); + await this.testSubjects.missingOrFail('fieldList'); }); } diff --git a/test/functional/page_objects/visualize_editor_page.ts b/test/functional/page_objects/visualize_editor_page.ts index e85f560fec909..f6f4f121ad11a 100644 --- a/test/functional/page_objects/visualize_editor_page.ts +++ b/test/functional/page_objects/visualize_editor_page.ts @@ -211,10 +211,21 @@ export class VisualizeEditorPageObject extends FtrService { const input = await this.find.byCssSelector( '[data-test-subj="visEditorPercentileRanks"] input' ); + this.log.debug(`Setting percentile rank value of ${newValue}`); await input.clearValue(); await input.type(newValue); } + public async setPercentileValue(newValue: string, index: number = 0) { + const correctIndex = index * 2 + 1; + const input = await this.find.byCssSelector( + `[data-test-subj="visEditorPercentile"]>div:nth-child(2)>div:nth-child(${correctIndex}) input` + ); + this.log.debug(`Setting percentile value at ${index}th input of ${newValue}`); + await input.clearValueWithKeyboard(); + await input.type(newValue, { charByChar: true }); + } + public async clickEditorSidebarCollapse() { await this.testSubjects.click('collapseSideBarButton'); } diff --git a/test/functional/services/data_grid.ts b/test/functional/services/data_grid.ts index 1f022c890b724..1bdc1b070dc33 100644 --- a/test/functional/services/data_grid.ts +++ b/test/functional/services/data_grid.ts @@ -304,6 +304,27 @@ export class DataGridService extends FtrService { await this.testSubjects.click('gridEditFieldButton'); } + public async clickGridSettings() { + await this.testSubjects.click('dataGridDisplaySelectorButton'); + } + + public async getCurrentRowHeightValue() { + const buttonGroup = await this.testSubjects.find('rowHeightButtonGroup'); + return ( + await buttonGroup.findByCssSelector('.euiButtonGroupButton-isSelected') + ).getVisibleText(); + } + + public async changeRowHeightValue(newValue: string) { + const buttonGroup = await this.testSubjects.find('rowHeightButtonGroup'); + const option = await buttonGroup.findByCssSelector(`[data-text="${newValue}"]`); + await option.click(); + } + + public async resetRowHeightValue() { + await this.testSubjects.click('resetDisplaySelector'); + } + public async getDetailsRow(): Promise { const detailRows = await this.getDetailsRows(); return detailRows[0]; diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index 49951b9a3100a..ea5ac251ae6a0 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -237,6 +237,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.fleet.internal.activeAgentsSoftLimit (number)', 'xpack.fleet.internal.disableProxies (boolean)', 'xpack.fleet.internal.fleetServerStandalone (boolean)', + 'xpack.fleet.internal.onlyAllowAgentUpgradeToKnownVersions (boolean)', 'xpack.fleet.developer.maxAgentPoliciesWithInactivityTimeout (number)', 'xpack.global_search.search_timeout (duration)', 'xpack.graph.canEditDrillDownUrls (boolean)', diff --git a/tsconfig.base.json b/tsconfig.base.json index e5808369793ae..c345a5232b726 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -954,8 +954,20 @@ "@kbn/management-cards-navigation/*": ["packages/kbn-management/cards_navigation/*"], "@kbn/management-plugin": ["src/plugins/management"], "@kbn/management-plugin/*": ["src/plugins/management/*"], + "@kbn/management-settings-components-field-input": ["packages/kbn-management/settings/components/field_input"], + "@kbn/management-settings-components-field-input/*": ["packages/kbn-management/settings/components/field_input/*"], + "@kbn/management-settings-components-field-row": ["packages/kbn-management/settings/components/field_row"], + "@kbn/management-settings-components-field-row/*": ["packages/kbn-management/settings/components/field_row/*"], + "@kbn/management-settings-field-definition": ["packages/kbn-management/settings/field_definition"], + "@kbn/management-settings-field-definition/*": ["packages/kbn-management/settings/field_definition/*"], + "@kbn/management-settings-ids": ["packages/kbn-management/settings/setting_ids"], + "@kbn/management-settings-ids/*": ["packages/kbn-management/settings/setting_ids/*"], "@kbn/management-settings-section-registry": ["packages/kbn-management/settings/section_registry"], "@kbn/management-settings-section-registry/*": ["packages/kbn-management/settings/section_registry/*"], + "@kbn/management-settings-types": ["packages/kbn-management/settings/types"], + "@kbn/management-settings-types/*": ["packages/kbn-management/settings/types/*"], + "@kbn/management-settings-utilities": ["packages/kbn-management/settings/utilities"], + "@kbn/management-settings-utilities/*": ["packages/kbn-management/settings/utilities/*"], "@kbn/management-storybook-config": ["packages/kbn-management/storybook/config"], "@kbn/management-storybook-config/*": ["packages/kbn-management/storybook/config/*"], "@kbn/management-test-plugin": ["test/plugin_functional/plugins/management_test_plugin"], @@ -1088,6 +1100,8 @@ "@kbn/profiling-data-access-plugin/*": ["x-pack/plugins/profiling_data_access/*"], "@kbn/profiling-plugin": ["x-pack/plugins/profiling"], "@kbn/profiling-plugin/*": ["x-pack/plugins/profiling/*"], + "@kbn/profiling-utils": ["packages/kbn-profiling-utils"], + "@kbn/profiling-utils/*": ["packages/kbn-profiling-utils/*"], "@kbn/random-sampling": ["x-pack/packages/kbn-random-sampling"], "@kbn/random-sampling/*": ["x-pack/packages/kbn-random-sampling/*"], "@kbn/react-field": ["packages/kbn-react-field"], @@ -1260,12 +1274,20 @@ "@kbn/server-route-repository/*": ["packages/kbn-server-route-repository/*"], "@kbn/serverless": ["x-pack/plugins/serverless"], "@kbn/serverless/*": ["x-pack/plugins/serverless/*"], + "@kbn/serverless-common-settings": ["packages/serverless/settings/common"], + "@kbn/serverless-common-settings/*": ["packages/serverless/settings/common/*"], "@kbn/serverless-observability": ["x-pack/plugins/serverless_observability"], "@kbn/serverless-observability/*": ["x-pack/plugins/serverless_observability/*"], + "@kbn/serverless-observability-settings": ["packages/serverless/settings/observability_project"], + "@kbn/serverless-observability-settings/*": ["packages/serverless/settings/observability_project/*"], "@kbn/serverless-project-switcher": ["packages/serverless/project_switcher"], "@kbn/serverless-project-switcher/*": ["packages/serverless/project_switcher/*"], "@kbn/serverless-search": ["x-pack/plugins/serverless_search"], "@kbn/serverless-search/*": ["x-pack/plugins/serverless_search/*"], + "@kbn/serverless-search-settings": ["packages/serverless/settings/search_project"], + "@kbn/serverless-search-settings/*": ["packages/serverless/settings/search_project/*"], + "@kbn/serverless-security-settings": ["packages/serverless/settings/security_project"], + "@kbn/serverless-security-settings/*": ["packages/serverless/settings/security_project/*"], "@kbn/serverless-storybook-config": ["packages/serverless/storybook/config"], "@kbn/serverless-storybook-config/*": ["packages/serverless/storybook/config/*"], "@kbn/serverless-types": ["packages/serverless/types"], diff --git a/x-pack/plugins/actions/docs/openapi/bundled.json b/x-pack/plugins/actions/docs/openapi/bundled.json index d6ca91579738d..6027a53092de1 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.json +++ b/x-pack/plugins/actions/docs/openapi/bundled.json @@ -125,6 +125,9 @@ }, "createWebhookConnectorRequest": { "$ref": "#/components/examples/create_webhook_connector_request" + }, + "createXmattersConnectorRequest": { + "$ref": "#/components/examples/create_xmatters_connector_request" } } } @@ -144,6 +147,9 @@ }, "createWebhookConnectorResponse": { "$ref": "#/components/examples/create_webhook_connector_response" + }, + "createXmattersConnectorResponse": { + "$ref": "#/components/examples/create_xmatters_connector_response" } } } @@ -477,6 +483,12 @@ }, { "$ref": "#/components/schemas/update_connector_request_swimlane" + }, + { + "$ref": "#/components/schemas/update_connector_request_teams" + }, + { + "$ref": "#/components/schemas/update_connector_request_xmatters" } ] }, @@ -2549,7 +2561,15 @@ "title": "Connector secrets properties for a Microsoft Teams connector", "description": "Defines secrets for connectors when type is `.teams`.", "type": "object", - "additionalProperties": true + "required": [ + "webhookUrl" + ], + "properties": { + "webhookUrl": { + "type": "string", + "description": "The URL of the incoming webhook. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts.\n" + } + } }, "create_connector_request_teams": { "title": "Create Microsoft Teams connector request", @@ -2743,16 +2763,40 @@ } }, "config_properties_xmatters": { - "title": "Connector request properties for a xMatters connector", + "title": "Connector request properties for an xMatters connector", "description": "Defines properties for connectors when type is `.xmatters`.", "type": "object", - "additionalProperties": true + "properties": { + "configUrl": { + "description": "The request URL for the Elastic Alerts trigger in xMatters. It is applicable only when `usesBasic` is `true`.\n", + "type": "string", + "nullable": true + }, + "usesBasic": { + "description": "Specifies whether the connector uses HTTP basic authentication (`true`) or URL authentication (`false`).", + "type": "boolean", + "default": true + } + } }, "secrets_properties_xmatters": { "title": "Connector secrets properties for an xMatters connector", "description": "Defines secrets for connectors when type is `.xmatters`.", "type": "object", - "additionalProperties": true + "properties": { + "password": { + "description": "A user name for HTTP basic authentication. It is applicable only when `usesBasic` is `true`.\n", + "type": "string" + }, + "secretsUrl": { + "description": "The request URL for the Elastic Alerts trigger in xMatters with the API key included in the URL. It is applicable only when `usesBasic` is `false`.\n", + "type": "string" + }, + "user": { + "description": "A password for HTTP basic authentication. It is applicable only when `usesBasic` is `true`.\n", + "type": "string" + } + } }, "create_connector_request_xmatters": { "title": "Create xMatters connector request", @@ -3426,6 +3470,9 @@ "name" ], "properties": { + "config": { + "type": "object" + }, "connector_type_id": { "type": "string", "description": "The type of connector.", @@ -3883,6 +3930,44 @@ } } }, + "update_connector_request_teams": { + "title": "Update Microsoft Teams connector request", + "type": "object", + "required": [ + "name", + "secrets" + ], + "properties": { + "name": { + "type": "string", + "description": "The display name for the connector." + }, + "secrets": { + "$ref": "#/components/schemas/secrets_properties_teams" + } + } + }, + "update_connector_request_xmatters": { + "title": "Update xMatters connector request", + "type": "object", + "required": [ + "config", + "name", + "secrets" + ], + "properties": { + "config": { + "$ref": "#/components/schemas/config_properties_xmatters" + }, + "name": { + "type": "string", + "description": "The display name for the connector." + }, + "secrets": { + "$ref": "#/components/schemas/secrets_properties_xmatters" + } + } + }, "connector_types": { "title": "Connector types", "type": "string", @@ -4662,6 +4747,19 @@ } } }, + "create_xmatters_connector_request": { + "summary": "Create an xMatters connector with URL authentication.", + "value": { + "name": "my-xmatters-connector", + "connector_type_id": ".xmatters", + "config": { + "usesBasic": false + }, + "secrets": { + "secretsUrl": "https://example.com?apiKey=xxxxx" + } + } + }, "create_index_connector_response": { "summary": "A new index connector.", "value": { @@ -4700,6 +4798,22 @@ "is_system_action": false } }, + "create_xmatters_connector_response": { + "summary": "A new xMatters connector.", + "value": { + "id": "4d2d8da0-4d1f-11ee-9367-577408be4681", + "name": "my-xmatters-connector", + "config": { + "usesBasic": false, + "configUrl": null + }, + "connector_type_id": ".xmatters", + "is_preconfigured": false, + "is_deprecated": false, + "is_missing_secrets": false, + "is_system_action": false + } + }, "get_connector_response": { "summary": "A list of connector types", "value": { diff --git a/x-pack/plugins/actions/docs/openapi/bundled.yaml b/x-pack/plugins/actions/docs/openapi/bundled.yaml index 611ec6c72309a..ee987ebed1568 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.yaml +++ b/x-pack/plugins/actions/docs/openapi/bundled.yaml @@ -63,6 +63,8 @@ paths: $ref: '#/components/examples/create_index_connector_request' createWebhookConnectorRequest: $ref: '#/components/examples/create_webhook_connector_request' + createXmattersConnectorRequest: + $ref: '#/components/examples/create_xmatters_connector_request' responses: '200': description: Indicates a successful call. @@ -75,6 +77,8 @@ paths: $ref: '#/components/examples/create_index_connector_response' createWebhookConnectorResponse: $ref: '#/components/examples/create_webhook_connector_response' + createXmattersConnectorResponse: + $ref: '#/components/examples/create_xmatters_connector_response' '401': $ref: '#/components/responses/401' servers: @@ -250,6 +254,8 @@ paths: - $ref: '#/components/schemas/update_connector_request_slack_api' - $ref: '#/components/schemas/update_connector_request_slack_webhook' - $ref: '#/components/schemas/update_connector_request_swimlane' + - $ref: '#/components/schemas/update_connector_request_teams' + - $ref: '#/components/schemas/update_connector_request_xmatters' examples: updateIndexConnectorRequest: $ref: '#/components/examples/update_index_connector_request' @@ -1708,7 +1714,13 @@ components: title: Connector secrets properties for a Microsoft Teams connector description: Defines secrets for connectors when type is `.teams`. type: object - additionalProperties: true + required: + - webhookUrl + properties: + webhookUrl: + type: string + description: | + The URL of the incoming webhook. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. create_connector_request_teams: title: Create Microsoft Teams connector request description: The Microsoft Teams connector uses Incoming Webhooks. @@ -1866,15 +1878,36 @@ components: secrets: $ref: '#/components/schemas/secrets_properties_webhook' config_properties_xmatters: - title: Connector request properties for a xMatters connector + title: Connector request properties for an xMatters connector description: Defines properties for connectors when type is `.xmatters`. type: object - additionalProperties: true + properties: + configUrl: + description: | + The request URL for the Elastic Alerts trigger in xMatters. It is applicable only when `usesBasic` is `true`. + type: string + nullable: true + usesBasic: + description: Specifies whether the connector uses HTTP basic authentication (`true`) or URL authentication (`false`). + type: boolean + default: true secrets_properties_xmatters: title: Connector secrets properties for an xMatters connector description: Defines secrets for connectors when type is `.xmatters`. type: object - additionalProperties: true + properties: + password: + description: | + A user name for HTTP basic authentication. It is applicable only when `usesBasic` is `true`. + type: string + secretsUrl: + description: | + The request URL for the Elastic Alerts trigger in xMatters with the API key included in the URL. It is applicable only when `usesBasic` is `false`. + type: string + user: + description: | + A password for HTTP basic authentication. It is applicable only when `usesBasic` is `true`. + type: string create_connector_request_xmatters: title: Create xMatters connector request description: | @@ -2369,6 +2402,8 @@ components: - is_preconfigured - name properties: + config: + type: object connector_type_id: type: string description: The type of connector. @@ -2674,6 +2709,33 @@ components: example: my-connector secrets: $ref: '#/components/schemas/secrets_properties_swimlane' + update_connector_request_teams: + title: Update Microsoft Teams connector request + type: object + required: + - name + - secrets + properties: + name: + type: string + description: The display name for the connector. + secrets: + $ref: '#/components/schemas/secrets_properties_teams' + update_connector_request_xmatters: + title: Update xMatters connector request + type: object + required: + - config + - name + - secrets + properties: + config: + $ref: '#/components/schemas/config_properties_xmatters' + name: + type: string + description: The display name for the connector. + secrets: + $ref: '#/components/schemas/secrets_properties_xmatters' connector_types: title: Connector types type: string @@ -3240,6 +3302,15 @@ components: crt: QmFnIEF0dH... key: LS0tLS1CRUdJ... password: my-passphrase + create_xmatters_connector_request: + summary: Create an xMatters connector with URL authentication. + value: + name: my-xmatters-connector + connector_type_id: .xmatters + config: + usesBasic: false + secrets: + secretsUrl: https://example.com?apiKey=xxxxx create_index_connector_response: summary: A new index connector. value: @@ -3272,6 +3343,19 @@ components: is_deprecated: false is_missing_secrets: false is_system_action: false + create_xmatters_connector_response: + summary: A new xMatters connector. + value: + id: 4d2d8da0-4d1f-11ee-9367-577408be4681 + name: my-xmatters-connector + config: + usesBasic: false + configUrl: null + connector_type_id: .xmatters + is_preconfigured: false + is_deprecated: false + is_missing_secrets: false + is_system_action: false get_connector_response: summary: A list of connector types value: diff --git a/x-pack/plugins/actions/docs/openapi/components/examples/create_xmatters_connector_request.yaml b/x-pack/plugins/actions/docs/openapi/components/examples/create_xmatters_connector_request.yaml new file mode 100644 index 0000000000000..818e8695bb1bb --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/examples/create_xmatters_connector_request.yaml @@ -0,0 +1,8 @@ +summary: Create an xMatters connector with URL authentication. +value: + name: my-xmatters-connector + connector_type_id: .xmatters + config: + usesBasic: false + secrets: + secretsUrl: https://example.com?apiKey=xxxxx \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/examples/create_xmatters_connector_response.yaml b/x-pack/plugins/actions/docs/openapi/components/examples/create_xmatters_connector_response.yaml new file mode 100644 index 0000000000000..c681cf31b9c47 --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/examples/create_xmatters_connector_response.yaml @@ -0,0 +1,12 @@ +summary: A new xMatters connector. +value: + id: 4d2d8da0-4d1f-11ee-9367-577408be4681 + name: my-xmatters-connector + config: + usesBasic: false + configUrl: null + connector_type_id: .xmatters + is_preconfigured: false + is_deprecated: false + is_missing_secrets: false + is_system_action: false \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_xmatters.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_xmatters.yaml index 6625eb09b4d35..350e96f3aa63d 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_xmatters.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_xmatters.yaml @@ -1,5 +1,15 @@ -title: Connector request properties for a xMatters connector +title: Connector request properties for an xMatters connector description: Defines properties for connectors when type is `.xmatters`. type: object -additionalProperties: true -# TO-DO: Add the properties for this connector. \ No newline at end of file +properties: + configUrl: + description: > + The request URL for the Elastic Alerts trigger in xMatters. + It is applicable only when `usesBasic` is `true`. + type: string + nullable: true + usesBasic: + description: Specifies whether the connector uses HTTP basic authentication (`true`) or URL authentication (`false`). + type: boolean + default: true + \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties_teams.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties_teams.yaml index 3d082bfdf7821..3e0dc777efa98 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties_teams.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties_teams.yaml @@ -7,6 +7,8 @@ required: - is_preconfigured - name properties: + config: + type: object connector_type_id: type: string description: The type of connector. diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_teams.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_teams.yaml index f5e3aa51c7528..6af6278220287 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_teams.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_teams.yaml @@ -1,5 +1,11 @@ title: Connector secrets properties for a Microsoft Teams connector description: Defines secrets for connectors when type is `.teams`. type: object -additionalProperties: true -# TO-DO: Add the properties for this connector. \ No newline at end of file +required: + - webhookUrl +properties: + webhookUrl: + type: string + description: > + The URL of the incoming webhook. + If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_xmatters.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_xmatters.yaml index 67071884663dd..0d9622a3bbd3f 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_xmatters.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_xmatters.yaml @@ -1,5 +1,19 @@ title: Connector secrets properties for an xMatters connector description: Defines secrets for connectors when type is `.xmatters`. type: object -additionalProperties: true -# TO-DO: Add the properties for this connector. \ No newline at end of file +properties: + password: + description: > + A user name for HTTP basic authentication. + It is applicable only when `usesBasic` is `true`. + type: string + secretsUrl: + description: > + The request URL for the Elastic Alerts trigger in xMatters with the API key included in the URL. + It is applicable only when `usesBasic` is `false`. + type: string + user: + description: > + A password for HTTP basic authentication. + It is applicable only when `usesBasic` is `true`. + type: string diff --git a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector.yaml b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector.yaml index d8d8735db82d8..33786a0871c54 100644 --- a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector.yaml +++ b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector.yaml @@ -42,6 +42,8 @@ post: $ref: '../components/examples/create_index_connector_request.yaml' createWebhookConnectorRequest: $ref: '../components/examples/create_webhook_connector_request.yaml' + createXmattersConnectorRequest: + $ref: '../components/examples/create_xmatters_connector_request.yaml' responses: '200': description: Indicates a successful call. @@ -54,6 +56,8 @@ post: $ref: '../components/examples/create_index_connector_response.yaml' createWebhookConnectorResponse: $ref: '../components/examples/create_webhook_connector_response.yaml' + createXmattersConnectorResponse: + $ref: '../components/examples/create_xmatters_connector_response.yaml' '401': $ref: '../components/responses/401.yaml' servers: diff --git a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml index f0158d9c2a5cd..f4c1cd3dda868 100644 --- a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml +++ b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml @@ -172,10 +172,10 @@ put: - $ref: '../components/schemas/update_connector_request_slack_api.yaml' - $ref: '../components/schemas/update_connector_request_slack_webhook.yaml' - $ref: '../components/schemas/update_connector_request_swimlane.yaml' -# - $ref: '../components/schemas/update_connector_request_teams.yaml' + - $ref: '../components/schemas/update_connector_request_teams.yaml' # - $ref: '../components/schemas/update_connector_request_tines.yaml' # - $ref: '../components/schemas/update_connector_request_webhook.yaml' -# - $ref: '../components/schemas/update_connector_request_xmatters.yaml' + - $ref: '../components/schemas/update_connector_request_xmatters.yaml' examples: updateIndexConnectorRequest: $ref: '../components/examples/update_index_connector_request.yaml' diff --git a/x-pack/plugins/actions/server/plugin.test.ts b/x-pack/plugins/actions/server/plugin.test.ts index d3bc3be1a9deb..dd936600d7055 100644 --- a/x-pack/plugins/actions/server/plugin.test.ts +++ b/x-pack/plugins/actions/server/plugin.test.ts @@ -15,6 +15,7 @@ import { featuresPluginMock } from '@kbn/features-plugin/server/mocks'; import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { eventLogMock } from '@kbn/event-log-plugin/server/mocks'; +import { serverlessPluginMock } from '@kbn/serverless/server/mocks'; import { ActionType, ActionsApiRequestHandlerContext, ExecutorType } from './types'; import { ActionsConfig } from './config'; import { @@ -361,7 +362,7 @@ describe('Actions Plugin', () => { eventLog: eventLogMock.createSetup(), usageCollection: usageCollectionPluginMock.createSetupContract(), features: featuresPluginMock.createSetup(), - serverless: {}, + serverless: serverlessPluginMock.createSetupContract(), }; } @@ -560,7 +561,7 @@ describe('Actions Plugin', () => { ...pluginsSetup.encryptedSavedObjects, canEncrypt: true, }, - serverless: {}, + serverless: serverlessPluginMock.createSetupContract(), }); pluginSetup.registerType({ @@ -579,7 +580,10 @@ describe('Actions Plugin', () => { pluginSetup.setEnabledConnectorTypes(['.server-log', 'non-existing']); await expect(async () => - plugin.start(coreStart, { ...pluginsStart, serverless: {} }) + plugin.start(coreStart, { + ...pluginsStart, + serverless: serverlessPluginMock.createStartContract(), + }) ).rejects.toThrowErrorMatchingInlineSnapshot( `"Action type \\"non-existing\\" is not registered."` ); diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index ef5de6194d475..60a27eb04e411 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -40,7 +40,7 @@ import { } from '@kbn/event-log-plugin/server'; import { MonitoringCollectionSetup } from '@kbn/monitoring-collection-plugin/server'; -import { ServerlessPluginSetup } from '@kbn/serverless/server'; +import { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/server'; import { ActionsConfig, AllowedHosts, EnabledConnectorTypes, getValidatedConfig } from './config'; import { resolveCustomHosts } from './lib/custom_host_settings'; import { ActionsClient } from './actions_client/actions_client'; @@ -179,7 +179,7 @@ export interface ActionsPluginsStart { eventLog: IEventLogClientService; spaces?: SpacesPluginStart; security?: SecurityPluginStart; - serverless?: ServerlessPluginSetup; + serverless?: ServerlessPluginStart; } const includedHiddenTypes = [ diff --git a/x-pack/plugins/alerting/server/plugin.test.ts b/x-pack/plugins/alerting/server/plugin.test.ts index 148d35a87c7f8..c92207a05819c 100644 --- a/x-pack/plugins/alerting/server/plugin.test.ts +++ b/x-pack/plugins/alerting/server/plugin.test.ts @@ -27,6 +27,8 @@ import { PluginSetup as DataPluginSetup, } from '@kbn/data-plugin/server'; import { spacesMock } from '@kbn/spaces-plugin/server/mocks'; +import { schema } from '@kbn/config-schema'; +import { serverlessPluginMock } from '@kbn/serverless/server/mocks'; import { AlertsService } from './alerts_service/alerts_service'; import { alertsServiceMock } from './alerts_service/alerts_service.mock'; @@ -37,7 +39,6 @@ jest.mock('./alerts_service/alerts_service', () => ({ import { SharePluginStart } from '@kbn/share-plugin/server'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; import { generateAlertingConfig } from './test_utils'; -import { schema } from '@kbn/config-schema'; const sampleRuleType: RuleType = { id: 'test', @@ -74,8 +75,9 @@ describe('Alerting Plugin', () => { data: dataPluginMock.createSetupContract() as unknown as DataPluginSetup, features: featuresPluginMock.createSetup(), unifiedSearch: autocompletePluginMock.createSetupContract(), - // serverless setup is currently empty, and there is no mock - ...(useDataStreamForAlerts ? { serverless: {} } : {}), + ...(useDataStreamForAlerts + ? { serverless: serverlessPluginMock.createSetupContract() } + : {}), }; let plugin: AlertingPlugin; @@ -269,7 +271,9 @@ describe('Alerting Plugin', () => { data: dataPluginMock.createSetupContract() as unknown as DataPluginSetup, features: featuresPluginMock.createSetup(), unifiedSearch: autocompletePluginMock.createSetupContract(), - ...(useDataStreamForAlerts ? { serverless: {} } : {}), + ...(useDataStreamForAlerts + ? { serverless: serverlessPluginMock.createSetupContract() } + : {}), }); const startContract = plugin.start(coreMock.createStart(), { @@ -319,7 +323,9 @@ describe('Alerting Plugin', () => { data: dataPluginMock.createSetupContract() as unknown as DataPluginSetup, features: featuresPluginMock.createSetup(), unifiedSearch: autocompletePluginMock.createSetupContract(), - ...(useDataStreamForAlerts ? { serverless: {} } : {}), + ...(useDataStreamForAlerts + ? { serverless: serverlessPluginMock.createSetupContract() } + : {}), }); const startContract = plugin.start(coreMock.createStart(), { @@ -380,7 +386,9 @@ describe('Alerting Plugin', () => { data: dataPluginMock.createSetupContract() as unknown as DataPluginSetup, features: featuresPluginMock.createSetup(), unifiedSearch: autocompletePluginMock.createSetupContract(), - ...(useDataStreamForAlerts ? { serverless: {} } : {}), + ...(useDataStreamForAlerts + ? { serverless: serverlessPluginMock.createSetupContract() } + : {}), }); const startContract = plugin.start(coreMock.createStart(), { diff --git a/x-pack/plugins/apm/common/critical_path/get_critical_path.test.ts b/x-pack/plugins/apm/common/critical_path/get_critical_path.test.ts index 284147303ced0..8b78798d2bc55 100644 --- a/x-pack/plugins/apm/common/critical_path/get_critical_path.test.ts +++ b/x-pack/plugins/apm/common/critical_path/get_critical_path.test.ts @@ -23,7 +23,7 @@ describe('getCriticalPath', () => { errorDocs: [], exceedsMax: false, spanLinksCountById: {}, - traceItemCount: events.length, + traceDocsTotal: events.length, maxTraceItems: 5000, }, entryTransaction, diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/service_map.cy.ts b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/service_map.cy.ts index 899ffe9d928b7..2caeba304f3b4 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/service_map.cy.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/service_map.cy.ts @@ -50,27 +50,48 @@ describe('service map', () => { describe('when navigating to service map', () => { beforeEach(() => { cy.intercept('GET', '/internal/apm/service-map?*').as('serviceMap'); - cy.visitKibana(serviceMapHref); + }); + it.skip('shows nodes in service map', () => { + cy.visitKibana(serviceMapHref); cy.wait('@serviceMap'); - }); + cy.getByTestSubj('apmServiceGroupsTourDismissButton').click(); + + prepareCanvasForScreenshot(); - it('shows nodes in service map', { retries: 3 }, () => { - cy.wait(500); - cy.getByTestSubj('serviceMap').matchImage(); + cy.withHidden('[data-test-subj="headerGlobalNav"]', () => + cy.getByTestSubj('serviceMap').matchImage({ + imagesPath: '{spec_path}/snapshots', + title: 'global_service_map', + matchAgainstPath: 'cypress/e2e/service_map/snapshots/service_map.png', + maxDiffThreshold: 0.02, // maximum threshold above which the test should fail + }) + ); }); - it('shows nodes in detailed service map', () => { + it.skip('shows nodes in detailed service map', () => { cy.visitKibana(detailedServiceMap); + cy.wait('@serviceMap'); cy.contains('h1', 'opbeans-java'); - cy.wait(500); - cy.getByTestSubj('serviceMap').matchImage(); + + prepareCanvasForScreenshot(); + + cy.withHidden('[data-test-subj="headerGlobalNav"]', () => + cy.getByTestSubj('serviceMap').matchImage({ + imagesPath: '{spec_path}/snapshots', + title: 'detailed_service_map', + matchAgainstPath: + 'cypress/e2e/service_map/snapshots/detailed_service_map.png', + maxDiffThreshold: 0.02, // maximum threshold above which the test should fail + }) + ); }); describe('when there is no data', () => { it('shows empty state', () => { + cy.visitKibana(serviceMapHref); // we need to dismiss the service-group call out first - cy.contains('Dismiss').click(); + cy.getByTestSubj('apmServiceGroupsTourDismissButton').click(); cy.getByTestSubj('apmUnifiedSearchBar').type('_id : foo{enter}'); cy.contains('No services available'); // search bar is still visible @@ -79,3 +100,15 @@ describe('service map', () => { }); }); }); + +function prepareCanvasForScreenshot() { + cy.get('html, body').invoke( + 'attr', + 'style', + 'height: auto; scroll-behavior: auto;' + ); + + cy.wait(300); + cy.getByTestSubj('centerServiceMap').click(); + cy.scrollTo('top'); +} diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/snapshots/detailed_service_map.png b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/snapshots/detailed_service_map.png new file mode 100644 index 0000000000000..a8d8ccdbd7936 Binary files /dev/null and b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/snapshots/detailed_service_map.png differ diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/snapshots/service_map.png b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/snapshots/service_map.png new file mode 100644 index 0000000000000..91fba348325b4 Binary files /dev/null and b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_map/snapshots/service_map.png differ diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/generate_large_trace.ts b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/generate_large_trace.ts new file mode 100644 index 0000000000000..80ba2485a44f9 --- /dev/null +++ b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/generate_large_trace.ts @@ -0,0 +1,138 @@ +/* + * 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. + */ + +/* eslint-disable @typescript-eslint/no-shadow */ +import { apm, timerange, DistributedTrace } from '@kbn/apm-synthtrace-client'; +import { synthtrace } from '../../../../synthtrace'; + +const RATE_PER_MINUTE = 1; + +export function generateLargeTrace({ + start, + end, + rootTransactionName, + repeaterFactor, + environment, +}: { + start: number; + end: number; + rootTransactionName: string; + repeaterFactor: number; + environment: string; +}) { + const range = timerange(start, end); + + const synthRum = apm + .service({ name: 'synth-rum', environment, agentName: 'rum-js' }) + .instance('my-instance'); + + const synthNode = apm + .service({ name: 'synth-node', environment, agentName: 'nodejs' }) + .instance('my-instance'); + + const synthGo = apm + .service({ name: 'synth-go', environment, agentName: 'go' }) + .instance('my-instance'); + + const synthDotnet = apm + .service({ name: 'synth-dotnet', environment, agentName: 'dotnet' }) + .instance('my-instance'); + + const synthJava = apm + .service({ name: 'synth-java', environment, agentName: 'java' }) + .instance('my-instance'); + + const traces = range.ratePerMinute(RATE_PER_MINUTE).generator((timestamp) => { + return new DistributedTrace({ + serviceInstance: synthRum, + transactionName: rootTransactionName, + timestamp, + children: (_) => { + _.service({ + repeat: 5 * repeaterFactor, + serviceInstance: synthNode, + transactionName: 'GET /nodejs/products', + latency: 100, + + children: (_) => { + _.service({ + serviceInstance: synthGo, + transactionName: 'GET /go', + children: (_) => { + _.service({ + repeat: 5 * repeaterFactor, + serviceInstance: synthJava, + transactionName: 'GET /java', + children: (_) => { + _.external({ + name: 'GET telemetry.elastic.co', + url: 'https://telemetry.elastic.co/ping', + duration: 50, + }); + }, + }); + }, + }); + _.db({ + name: 'GET apm-*/_search', + type: 'elasticsearch', + duration: 400, + }); + _.db({ name: 'GET', type: 'redis', duration: 500 }); + _.db({ + name: 'SELECT * FROM users', + type: 'sqlite', + duration: 600, + }); + }, + }); + + _.service({ + serviceInstance: synthNode, + transactionName: 'GET /nodejs/users', + latency: 100, + repeat: 5 * repeaterFactor, + children: (_) => { + _.service({ + serviceInstance: synthGo, + transactionName: 'GET /go/security', + latency: 50, + children: (_) => { + _.service({ + repeat: 5 * repeaterFactor, + serviceInstance: synthDotnet, + transactionName: 'GET /dotnet/cases/4', + latency: 50, + children: (_) => + _.db({ + name: 'GET apm-*/_search', + type: 'elasticsearch', + duration: 600, + statement: JSON.stringify( + { + query: { + query_string: { + query: '(new york city) OR (big apple)', + default_field: 'content', + }, + }, + }, + null, + 2 + ), + }), + }); + }, + }); + }, + }); + }, + }).getTransaction(); + }); + + return synthtrace.index(traces); +} diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/large_traces_in_waterfall.cy.ts b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/large_traces_in_waterfall.cy.ts new file mode 100644 index 0000000000000..5f40687274fb5 --- /dev/null +++ b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/large_traces_in_waterfall.cy.ts @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { synthtrace } from '../../../../synthtrace'; +import { generateLargeTrace } from './generate_large_trace'; + +const start = '2021-10-10T00:00:00.000Z'; +const end = '2021-10-10T00:01:00.000Z'; +const rootTransactionName = `Large trace`; + +const timeRange = { rangeFrom: start, rangeTo: end }; + +describe('Large Trace in waterfall', () => { + before(() => { + synthtrace.clean(); + + generateLargeTrace({ + start: new Date(start).getTime(), + end: new Date(end).getTime(), + rootTransactionName, + repeaterFactor: 10, + environment: 'large_trace', + }); + }); + + after(() => { + synthtrace.clean(); + }); + + describe('when navigating to a trace sample with default maxTraceItems', () => { + beforeEach(() => { + cy.loginAsViewerUser(); + cy.visitKibana( + `/app/apm/services/synth-rum/transactions/view?${new URLSearchParams({ + ...timeRange, + transactionName: rootTransactionName, + })}` + ); + }); + + it('renders waterfall items', () => { + cy.getByTestSubj('waterfallItem').should('have.length.greaterThan', 200); + }); + + it('shows warning about trace size', () => { + cy.getByTestSubj('apmWaterfallSizeWarning').should( + 'have.text', + 'The number of items in this trace is 15551 which is higher than the current limit of 5000. Please increase the limit via `xpack.apm.ui.maxTraceItems` to see the full trace' + ); + }); + }); + + describe('when navigating to a trace sample with maxTraceItems=20000', () => { + beforeEach(() => { + cy.loginAsViewerUser(); + + cy.intercept('GET', '/internal/apm/traces/**', (req) => { + req.query.maxTraceItems = 20000; + }).as('getTraces'); + + cy.visitKibana( + `/app/apm/services/synth-rum/transactions/view?${new URLSearchParams({ + ...timeRange, + transactionName: rootTransactionName, + })}` + ); + }); + + it('renders waterfall items', () => { + cy.getByTestSubj('waterfallItem').should('have.length.greaterThan', 400); + }); + + it('does not show the warning about trace size', () => { + cy.getByTestSubj('apmWaterfallSizeWarning').should('not.exist'); + }); + }); +}); diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/support/commands.ts b/x-pack/plugins/apm/ftr_e2e/cypress/support/commands.ts index 204d05255ac58..da8b1d418f3a6 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/support/commands.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/support/commands.ts @@ -153,6 +153,12 @@ Cypress.Commands.add('dismissServiceGroupsTour', () => { ); }); +Cypress.Commands.add('withHidden', (selector, callback) => { + cy.get(selector).invoke('attr', 'style', 'display: none'); + callback(); + cy.get(selector).invoke('attr', 'style', ''); +}); + // A11y configuration const axeConfig = { diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/support/types.d.ts b/x-pack/plugins/apm/ftr_e2e/cypress/support/types.d.ts index fe9ac641c1ce0..46bdb95d6ff82 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/support/types.d.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/support/types.d.ts @@ -28,5 +28,6 @@ declare namespace Cypress { updateAdvancedSettings(settings: Record): void; getByTestSubj(selector: string): Chainable>; dismissServiceGroupsTour(): void; + withHidden(selector: string, callback: () => void): void; } } diff --git a/x-pack/plugins/apm/kibana.jsonc b/x-pack/plugins/apm/kibana.jsonc index 906596709b189..42f969f5a3ee1 100644 --- a/x-pack/plugins/apm/kibana.jsonc +++ b/x-pack/plugins/apm/kibana.jsonc @@ -15,7 +15,6 @@ "controls", "embeddable", "features", - "infra", "logsShared", "inspector", "licensing", @@ -41,6 +40,7 @@ "discover", "fleet", "fieldFormats", + "infra", "home", "ml", "security", @@ -50,6 +50,7 @@ "customIntegrations", // Move this to requiredPlugins after completely migrating from the Tutorials Home App "licenseManagement", "profiling", + "profilingDataAccess" ], "requiredBundles": [ "advancedSettings", diff --git a/x-pack/plugins/apm/public/components/app/profiling_overview/index.tsx b/x-pack/plugins/apm/public/components/app/profiling_overview/index.tsx new file mode 100644 index 0000000000000..611f79492a62c --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/profiling_overview/index.tsx @@ -0,0 +1,75 @@ +/* + * 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 { EmbeddableFlamegraph } from '@kbn/observability-shared-plugin/public'; +import React from 'react'; +import { useApmParams } from '../../../hooks/use_apm_params'; +import { isPending, useFetcher } from '../../../hooks/use_fetcher'; +import { useProfilingPlugin } from '../../../hooks/use_profiling_plugin'; +import { useTimeRange } from '../../../hooks/use_time_range'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { usePreferredDataSourceAndBucketSize } from '../../../hooks/use_preferred_data_source_and_bucket_size'; + +export function ProfilingOverview() { + const { + path: { serviceName }, + query: { kuery, rangeFrom, rangeTo, environment }, + } = useApmParams('/services/{serviceName}/profiling'); + const { isProfilingAvailable } = useProfilingPlugin(); + + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + const preferred = usePreferredDataSourceAndBucketSize({ + start, + end, + kuery, + type: ApmDocumentType.TransactionMetric, + numBuckets: 20, + }); + const { data, status } = useFetcher( + (callApmApi) => { + if (isProfilingAvailable && preferred) { + return callApmApi( + 'GET /internal/apm/services/{serviceName}/profiling/flamegraph', + { + params: { + path: { serviceName }, + query: { + start, + end, + kuery, + environment, + documentType: preferred.source.documentType, + rollupInterval: preferred.source.rollupInterval, + }, + }, + } + ); + } + }, + [ + isProfilingAvailable, + preferred, + serviceName, + start, + end, + kuery, + environment, + ] + ); + + if (!isProfilingAvailable) { + return null; + } + + return ( + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/service_map/controls.tsx b/x-pack/plugins/apm/public/components/app/service_map/controls.tsx index f73f798cbe942..a2695e071a32e 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/controls.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/controls.tsx @@ -212,6 +212,7 @@ export function Controls() {

    - } - description={ - <> - - - - {(deleteAgentPolicyPrompt) => { - return ( - - ) : undefined - } - > - deleteAgentPolicyPrompt(agentPolicy.id!, onDelete)} - isDisabled={hasManagedPackagePolicy} - > - - - - ); - }} - - - } - /> - ) : null} + ); }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx index 7abeb00dfb65d..b3f06abf72e12 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx @@ -189,7 +189,6 @@ export const AgentPolicyCreateInlineForm: React.FunctionComponent = ({ updateAgentPolicy={updateNewAgentPolicy} validation={validation} isEditing={false} - onDelete={() => {}} /> diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx index e4720bad5a091..e3bf5fb72dfe3 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx @@ -36,7 +36,6 @@ interface Props { updateSysMonitoring: (newValue: boolean) => void; validation: ValidationResults; isEditing?: boolean; - onDelete?: () => void; } export const AgentPolicyForm: React.FunctionComponent = ({ @@ -46,7 +45,6 @@ export const AgentPolicyForm: React.FunctionComponent = ({ updateSysMonitoring, validation, isEditing = false, - onDelete = () => {}, }) => { const generalSettingsWrapper = (children: JSX.Element[]) => ( = ({ updateAgentPolicy={updateAgentPolicy} validation={validation} isEditing={isEditing} - onDelete={onDelete} /> @@ -122,7 +119,6 @@ export const AgentPolicyForm: React.FunctionComponent = ({ updateAgentPolicy={updateAgentPolicy} validation={validation} isEditing={isEditing} - onDelete={onDelete} /> )} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_integration.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_integration.tsx index da7ca2f3e18ec..759c85b54a181 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_integration.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_integration.tsx @@ -102,7 +102,6 @@ export const AgentPolicyIntegrationForm: React.FunctionComponent = ({ updateAgentPolicy={updateAgentPolicy} validation={validation} isEditing={isEditing} - onDelete={onDelete} /> diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_managed.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_managed.tsx index e78f0407baf91..c6b603cd14700 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_managed.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/page_steps/install_agent/install_agent_managed.tsx @@ -7,10 +7,10 @@ import React, { useState } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiText, EuiLink, EuiSteps, EuiSpacer } from '@elastic/eui'; +import { EuiText, EuiLink, EuiSteps, EuiSpacer, EuiLoadingSpinner } from '@elastic/eui'; import { Error } from '../../../../../../../components'; -import { useKibanaVersion, useStartServices } from '../../../../../../../../../hooks'; +import { useStartServices, useAgentVersion } from '../../../../../../../../../hooks'; import { CreatePackagePolicyBottomBar, NotObscuredByBottomBar } from '../..'; import { @@ -40,7 +40,7 @@ export const InstallElasticAgentManagedPageStep: React.FC const { docLinks } = core; const link = docLinks.links.fleet.troubleshooting; - const kibanaVersion = useKibanaVersion(); + const agentVersion = useAgentVersion(); const [commandCopied, setCommandCopied] = useState(false); const [applyCommandCopied, setApplyCommandCopied] = useState(false); @@ -66,7 +66,7 @@ export const InstallElasticAgentManagedPageStep: React.FC apiKey: enrollmentAPIKey.api_key, fleetProxy, fleetServerHosts, - kibanaVersion, + agentVersion: agentVersion || '', }); const steps = [ @@ -103,6 +103,10 @@ export const InstallElasticAgentManagedPageStep: React.FC }) ); + if (!agentVersion) { + return ; + } + return ( <> diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/components/post_install_google_cloud_shell_modal.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/components/post_install_google_cloud_shell_modal.tsx index 3879f44d5fbe0..a9185d3efa743 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/components/post_install_google_cloud_shell_modal.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/components/post_install_google_cloud_shell_modal.tsx @@ -10,6 +10,7 @@ import { EuiButton, EuiButtonEmpty, EuiCallOut, + EuiLoadingSpinner, EuiModal, EuiModalBody, EuiModalFooter, @@ -25,7 +26,7 @@ import { sendGetEnrollmentAPIKeys, useCreateCloudShellUrl, useFleetServerHostsForPolicy, - useKibanaVersion, + useAgentVersion, } from '../../../../../hooks'; import { GoogleCloudShellGuide } from '../../../../../components'; import { ManualInstructions } from '../../../../../../../components/enrollment_instructions'; @@ -44,18 +45,22 @@ export const PostInstallGoogleCloudShellModal: React.FunctionComponent<{ }) ); const { fleetServerHosts, fleetProxy } = useFleetServerHostsForPolicy(agentPolicy); - const kibanaVersion = useKibanaVersion(); + const agentVersion = useAgentVersion(); + + const { cloudShellUrl, error, isError, isLoading } = useCreateCloudShellUrl({ + enrollmentAPIKey: apyKeysData?.data?.items[0]?.api_key, + packagePolicy, + }); + + if (!agentVersion) { + return ; + } const installManagedCommands = ManualInstructions({ apiKey: apyKeysData?.data?.items[0]?.api_key || 'no_key', fleetServerHosts, fleetProxy, - kibanaVersion, - }); - - const { cloudShellUrl, error, isError, isLoading } = useCreateCloudShellUrl({ - enrollmentAPIKey: apyKeysData?.data?.items[0]?.api_key, - packagePolicy, + agentVersion, }); return ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/settings/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/settings/index.tsx index 0728a3d369d87..eb77e63fd2c82 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/settings/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/components/settings/index.tsx @@ -6,7 +6,6 @@ */ import React, { memo, useMemo, useState } from 'react'; -import { useHistory } from 'react-router-dom'; import styled from 'styled-components'; import { pick } from 'lodash'; import { @@ -22,7 +21,6 @@ import { FormattedMessage } from '@kbn/i18n-react'; import type { AgentPolicy } from '../../../../../types'; import { - useLink, useStartServices, useAuthz, sendUpdateAgentPolicy, @@ -69,8 +67,6 @@ export const SettingsView = memo<{ agentPolicy: AgentPolicy }>( const { agents: { enabled: isFleetEnabled }, } = useConfig(); - const history = useHistory(); - const { getPath } = useLink(); const hasFleetAllPrivileges = useAuthz().fleet.all; const refreshAgentPolicy = useAgentPolicyRefresh(); const [agentPolicy, setAgentPolicy] = useState({ @@ -173,9 +169,6 @@ export const SettingsView = memo<{ agentPolicy: AgentPolicy }>( updateSysMonitoring={(newValue) => setWithSysMonitoring(newValue)} validation={validation} isEditing={true} - onDelete={() => { - history.push(getPath('policies_list')); - }} /> {hasChanges ? ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx index e9e96cb54cac4..014075b1f0241 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx @@ -24,10 +24,8 @@ import { FormattedMessage } from '@kbn/i18n-react'; import type { EuiComboBoxOptionOption } from '@elastic/eui'; -import semverCoerce from 'semver/functions/coerce'; import semverGt from 'semver/functions/gt'; import semverLt from 'semver/functions/lt'; -import semverValid from 'semver/functions/valid'; import { getMinVersion } from '../../../../../../../common/services/get_min_max_version'; import type { Agent } from '../../../../types'; @@ -36,6 +34,7 @@ import { sendPostBulkAgentUpgrade, useStartServices, useKibanaVersion, + useConfig, } from '../../../../hooks'; import { sendGetAgentsAvailableVersions } from '../../../../hooks'; @@ -71,7 +70,8 @@ export const AgentUpgradeAgentModal: React.FunctionComponent { const { notifications } = useStartServices(); - const kibanaVersion = semverCoerce(useKibanaVersion())?.version || ''; + const kibanaVersion = useKibanaVersion() || ''; + const config = useConfig(); const [isSubmitting, setIsSubmitting] = useState(false); const [errors, setErrors] = useState(); const [availableVersions, setVersions] = useState([]); @@ -204,23 +204,13 @@ export const AgentUpgradeAgentModal: React.FunctionComponent { - if (!semverValid(searchValue)) { - return; - } + const normalizedSearchValue = searchValue.trim().toLowerCase(); - const agentVersionNumber = semverCoerce(searchValue); - if ( - agentVersionNumber?.version && - semverGt(kibanaVersion, agentVersionNumber?.version) && - minVersion && - semverGt(agentVersionNumber?.version, minVersion) - ) { - const newOption = { - label: searchValue, - value: searchValue, - }; - setSelectedVersion([newOption]); - } + const newOption = { + label: normalizedSearchValue, + value: normalizedSearchValue, + }; + setSelectedVersion([newOption]); }; return ( @@ -320,8 +310,10 @@ export const AgentUpgradeAgentModal: React.FunctionComponent {!isSingleAgent && diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.mocks.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.mocks.tsx index 8f9b13671ce65..47ee70bf2438a 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.mocks.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.mocks.tsx @@ -15,6 +15,7 @@ jest.mock('../../hooks', () => { ...jest.requireActual('../../hooks'), useFleetServerStandalone: jest.fn(), useAgentEnrollmentFlyoutData: jest.fn(), + useAgentVersion: jest.fn().mockReturnValue('8.1.0'), }; }); diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx index 912ad1e4ae42d..7d3e26fe2e954 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/compute_steps.tsx @@ -7,7 +7,7 @@ import React, { useState, useMemo, useEffect } from 'react'; -import { EuiSteps } from '@elastic/eui'; +import { EuiSteps, EuiLoadingSpinner } from '@elastic/eui'; import { safeDump } from 'js-yaml'; import type { EuiContainedStepProps } from '@elastic/eui/src/components/steps/steps'; @@ -21,8 +21,8 @@ import { StandaloneInstructions, ManualInstructions } from '../../enrollment_ins import { useGetOneEnrollmentAPIKey, useStartServices, - useKibanaVersion, sendGetOneAgentPolicyFull, + useAgentVersion, } from '../../../hooks'; import type { InstructionProps } from '../types'; @@ -59,7 +59,6 @@ export const StandaloneSteps: React.FunctionComponent = ({ const { notifications } = core; const [fullAgentPolicy, setFullAgentPolicy] = useState(); const [yaml, setYaml] = useState(''); - const kibanaVersion = useKibanaVersion(); let downloadLink = ''; @@ -123,8 +122,10 @@ export const StandaloneSteps: React.FunctionComponent = ({ } }, [fullAgentPolicy, isK8s]); + const agentVersion = useAgentVersion(); + const instructionsSteps = useMemo(() => { - const standaloneInstallCommands = StandaloneInstructions(kibanaVersion); + const standaloneInstallCommands = StandaloneInstructions(agentVersion || ''); const steps: EuiContainedStepProps[] = !agentPolicy ? [ @@ -164,7 +165,7 @@ export const StandaloneSteps: React.FunctionComponent = ({ return steps; }, [ - kibanaVersion, + agentVersion, isK8s, cloudSecurityIntegration, agentPolicy, @@ -181,6 +182,10 @@ export const StandaloneSteps: React.FunctionComponent = ({ setMode, ]); + if (!agentVersion) { + return ; + } + return ; }; @@ -202,7 +207,6 @@ export const ManagedSteps: React.FunctionComponent = ({ cloudSecurityIntegration, installedPackagePolicy, }) => { - const kibanaVersion = useKibanaVersion(); const core = useStartServices(); const { docLinks } = core; const link = docLinks.links.fleet.troubleshooting; @@ -214,11 +218,13 @@ export const ManagedSteps: React.FunctionComponent = ({ const enrolledAgentIds = usePollingAgentCount(selectedPolicy?.id || ''); + const agentVersion = useAgentVersion(); + const installManagedCommands = ManualInstructions({ apiKey: enrollToken, fleetServerHosts, fleetProxy, - kibanaVersion, + agentVersion: agentVersion || '', }); const instructionsSteps = useMemo(() => { @@ -326,5 +332,9 @@ export const ManagedSteps: React.FunctionComponent = ({ installedPackagePolicy, ]); + if (!agentVersion) { + return ; + } + return ; }; diff --git a/x-pack/plugins/fleet/public/components/enrollment_instructions/manual/index.tsx b/x-pack/plugins/fleet/public/components/enrollment_instructions/manual/index.tsx index ceda8b4c68905..b7a4fed713cad 100644 --- a/x-pack/plugins/fleet/public/components/enrollment_instructions/manual/index.tsx +++ b/x-pack/plugins/fleet/public/components/enrollment_instructions/manual/index.tsx @@ -27,12 +27,12 @@ export const ManualInstructions = ({ apiKey, fleetServerHosts, fleetProxy, - kibanaVersion, + agentVersion: agentVersion, }: { apiKey: string; fleetServerHosts: string[]; fleetProxy?: FleetProxy; - kibanaVersion: string; + agentVersion: string; }) => { const enrollArgs = getfleetServerHostsEnrollArgs(apiKey, fleetServerHosts, fleetProxy); const fleetServerUrl = enrollArgs?.split('--url=')?.pop()?.split('--enrollment')[0]; @@ -40,31 +40,31 @@ export const ManualInstructions = ({ const k8sCommand = 'kubectl apply -f elastic-agent-managed-kubernetes.yml'; - const linuxCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz -tar xzvf elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz -cd elastic-agent-${kibanaVersion}-linux-x86_64 + const linuxCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-linux-x86_64.tar.gz +tar xzvf elastic-agent-${agentVersion}-linux-x86_64.tar.gz +cd elastic-agent-${agentVersion}-linux-x86_64 sudo ./elastic-agent install ${enrollArgs}`; - const macCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-darwin-x86_64.tar.gz -tar xzvf elastic-agent-${kibanaVersion}-darwin-x86_64.tar.gz -cd elastic-agent-${kibanaVersion}-darwin-x86_64 + const macCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-darwin-x86_64.tar.gz +tar xzvf elastic-agent-${agentVersion}-darwin-x86_64.tar.gz +cd elastic-agent-${agentVersion}-darwin-x86_64 sudo ./elastic-agent install ${enrollArgs}`; const windowsCommand = `$ProgressPreference = 'SilentlyContinue' -Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-windows-x86_64.zip -OutFile elastic-agent-${kibanaVersion}-windows-x86_64.zip -Expand-Archive .\\elastic-agent-${kibanaVersion}-windows-x86_64.zip -DestinationPath . -cd elastic-agent-${kibanaVersion}-windows-x86_64 +Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-windows-x86_64.zip -OutFile elastic-agent-${agentVersion}-windows-x86_64.zip +Expand-Archive .\\elastic-agent-${agentVersion}-windows-x86_64.zip -DestinationPath . +cd elastic-agent-${agentVersion}-windows-x86_64 .\\elastic-agent.exe install ${enrollArgs}`; - const linuxDebCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-amd64.deb -sudo dpkg -i elastic-agent-${kibanaVersion}-amd64.deb + const linuxDebCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-amd64.deb +sudo dpkg -i elastic-agent-${agentVersion}-amd64.deb sudo elastic-agent enroll ${enrollArgs} \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; - const linuxRpmCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-x86_64.rpm -sudo rpm -vi elastic-agent-${kibanaVersion}-x86_64.rpm + const linuxRpmCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-x86_64.rpm +sudo rpm -vi elastic-agent-${agentVersion}-x86_64.rpm sudo elastic-agent enroll ${enrollArgs} \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; - const googleCloudShellCommand = `gcloud config set project && \nFLEET_URL=${fleetServerUrl} ENROLLMENT_TOKEN=${enrollmentToken} STACK_VERSION=${kibanaVersion} ./deploy.sh`; + const googleCloudShellCommand = `gcloud config set project && \nFLEET_URL=${fleetServerUrl} ENROLLMENT_TOKEN=${enrollmentToken} STACK_VERSION=${agentVersion} ./deploy.sh`; return { linux: linuxCommand, diff --git a/x-pack/plugins/fleet/public/components/enrollment_instructions/standalone/index.tsx b/x-pack/plugins/fleet/public/components/enrollment_instructions/standalone/index.tsx index 6994cf2a7ebc2..54a03d9dc942c 100644 --- a/x-pack/plugins/fleet/public/components/enrollment_instructions/standalone/index.tsx +++ b/x-pack/plugins/fleet/public/components/enrollment_instructions/standalone/index.tsx @@ -6,27 +6,27 @@ */ import type { CommandsByPlatform } from '../../../applications/fleet/components/fleet_server_instructions/utils/install_command_utils'; -export const StandaloneInstructions = (kibanaVersion: string): CommandsByPlatform => { - const linuxDebCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-amd64.deb -sudo dpkg -i elastic-agent-${kibanaVersion}-amd64.deb \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; +export const StandaloneInstructions = (agentVersion: string): CommandsByPlatform => { + const linuxDebCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-amd64.deb +sudo dpkg -i elastic-agent-${agentVersion}-amd64.deb \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; - const linuxRpmCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-x86_64.rpm -sudo rpm -vi elastic-agent-${kibanaVersion}-x86_64.rpm \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; + const linuxRpmCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-x86_64.rpm +sudo rpm -vi elastic-agent-${agentVersion}-x86_64.rpm \nsudo systemctl enable elastic-agent \nsudo systemctl start elastic-agent`; - const linuxCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz -tar xzvf elastic-agent-${kibanaVersion}-linux-x86_64.tar.gz -cd elastic-agent-${kibanaVersion}-linux-x86_64 + const linuxCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-linux-x86_64.tar.gz +tar xzvf elastic-agent-${agentVersion}-linux-x86_64.tar.gz +cd elastic-agent-${agentVersion}-linux-x86_64 sudo ./elastic-agent install`; - const macCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-darwin-x86_64.tar.gz -tar xzvf elastic-agent-${kibanaVersion}-darwin-x86_64.tar.gz -cd elastic-agent-${kibanaVersion}-darwin-x86_64 + const macCommand = `curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-darwin-x86_64.tar.gz +tar xzvf elastic-agent-${agentVersion}-darwin-x86_64.tar.gz +cd elastic-agent-${agentVersion}-darwin-x86_64 sudo ./elastic-agent install`; const windowsCommand = `$ProgressPreference = 'SilentlyContinue' -Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${kibanaVersion}-windows-x86_64.zip -OutFile elastic-agent-${kibanaVersion}-windows-x86_64.zip -Expand-Archive .\elastic-agent-${kibanaVersion}-windows-x86_64.zip -DestinationPath . -cd elastic-agent-${kibanaVersion}-windows-x86_64 +Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-${agentVersion}-windows-x86_64.zip -OutFile elastic-agent-${agentVersion}-windows-x86_64.zip +Expand-Archive .\elastic-agent-${agentVersion}-windows-x86_64.zip -DestinationPath . +cd elastic-agent-${agentVersion}-windows-x86_64 .\\elastic-agent.exe install`; const k8sCommand = 'kubectl apply -f elastic-agent-standalone-kubernetes.yml'; diff --git a/x-pack/plugins/fleet/public/hooks/index.ts b/x-pack/plugins/fleet/public/hooks/index.ts index eaddfbaa08009..f0ff14da7b454 100644 --- a/x-pack/plugins/fleet/public/hooks/index.ts +++ b/x-pack/plugins/fleet/public/hooks/index.ts @@ -34,3 +34,4 @@ export * from './use_fleet_server_standalone'; export * from './use_locator'; export * from './use_create_cloud_formation_url'; export * from './use_create_cloud_shell_url'; +export * from './use_agent_version'; diff --git a/x-pack/plugins/fleet/public/hooks/use_agent_version.ts b/x-pack/plugins/fleet/public/hooks/use_agent_version.ts new file mode 100644 index 0000000000000..32d0ee128ddcc --- /dev/null +++ b/x-pack/plugins/fleet/public/hooks/use_agent_version.ts @@ -0,0 +1,37 @@ +/* + * 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 { useEffect, useState } from 'react'; + +import { useKibanaVersion } from './use_kibana_version'; +import { sendGetAgentsAvailableVersions } from './use_request'; + +/** + * @returns The most recent agent version available to install or upgrade to. + */ +export const useAgentVersion = (): string | undefined => { + const kibanaVersion = useKibanaVersion(); + const [agentVersion, setAgentVersion] = useState(undefined); + + useEffect(() => { + const getVersions = async () => { + try { + const res = await sendGetAgentsAvailableVersions(); + // if the endpoint returns an error, use the fallback versions + const versionsList = res?.data?.items ? res.data.items : [kibanaVersion]; + + setAgentVersion(versionsList[0]); + } catch (err) { + return; + } + }; + + getVersions(); + }, [kibanaVersion]); + + return agentVersion; +}; diff --git a/x-pack/plugins/fleet/server/config.ts b/x-pack/plugins/fleet/server/config.ts index 9726837375eed..60d62c099498e 100644 --- a/x-pack/plugins/fleet/server/config.ts +++ b/x-pack/plugins/fleet/server/config.ts @@ -43,6 +43,7 @@ export const config: PluginConfigDescriptor = { fleetServerStandalone: true, disableProxies: true, activeAgentsSoftLimit: true, + onlyAllowAgentUpgradeToKnownVersions: true, }, }, deprecations: ({ renameFromRoot, unused, unusedFromRoot }) => [ @@ -176,6 +177,9 @@ export const config: PluginConfigDescriptor = { fleetServerStandalone: schema.boolean({ defaultValue: false, }), + onlyAllowAgentUpgradeToKnownVersions: schema.boolean({ + defaultValue: false, + }), activeAgentsSoftLimit: schema.maybe( schema.number({ min: 0, diff --git a/x-pack/plugins/fleet/server/routes/agent/handlers.test.ts b/x-pack/plugins/fleet/server/routes/agent/handlers.test.ts index 5bec8fda584ba..8e064a92a96a1 100644 --- a/x-pack/plugins/fleet/server/routes/agent/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/agent/handlers.test.ts @@ -5,38 +5,35 @@ * 2.0. */ -import { readFile } from 'fs/promises'; - import { coreMock, httpServerMock } from '@kbn/core/server/mocks'; import { getAvailableVersionsHandler } from './handlers'; +jest.mock('../../services/agents/versions', () => { + return { + getAvailableVersions: jest.fn().mockReturnValue(['8.1.0', '8.0.0', '7.17.0']), + }; +}); + jest.mock('../../services/app_context', () => { const { loggerMock } = jest.requireActual('@kbn/logging-mocks'); return { appContextService: { getLogger: () => loggerMock.create(), - getKibanaVersion: () => '300.0.0', }, }; }); -jest.mock('fs/promises'); - -const mockedReadFile = readFile as jest.MockedFunction; - describe('getAvailableVersionsHandler', () => { - it('should return available version and filter version < 7.17', async () => { + it('should return the value from getAvailableVersions', async () => { const ctx = coreMock.createCustomRequestHandlerContext(coreMock.createRequestHandlerContext()); const response = httpServerMock.createResponseFactory(); - mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); - await getAvailableVersionsHandler(ctx, httpServerMock.createKibanaRequest(), response); expect(response.ok).toBeCalled(); expect(response.ok.mock.calls[0][0]?.body).toEqual({ - items: ['300.0.0', '8.1.0', '8.0.0', '7.17.0'], + items: ['8.1.0', '8.0.0', '7.17.0'], }); }); }); diff --git a/x-pack/plugins/fleet/server/routes/agent/handlers.ts b/x-pack/plugins/fleet/server/routes/agent/handlers.ts index 30c1ccb736dec..03c4805873892 100644 --- a/x-pack/plugins/fleet/server/routes/agent/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent/handlers.ts @@ -5,21 +5,10 @@ * 2.0. */ -import { readFile } from 'fs/promises'; -import Path from 'path'; - -import { REPO_ROOT } from '@kbn/repo-info'; import { uniq } from 'lodash'; -import semverGte from 'semver/functions/gte'; -import semverGt from 'semver/functions/gt'; -import semverCoerce from 'semver/functions/coerce'; import { type RequestHandler, SavedObjectsErrorHelpers } from '@kbn/core/server'; import type { TypeOf } from '@kbn/config-schema'; -import { appContextService } from '../../services'; - -const MINIMUM_SUPPORTED_VERSION = '7.17.0'; - import type { GetAgentsResponse, GetOneAgentResponse, @@ -363,33 +352,10 @@ function isStringArray(arr: unknown | string[]): arr is string[] { return Array.isArray(arr) && arr.every((p) => typeof p === 'string'); } -// Read a static file generated at build time export const getAvailableVersionsHandler: RequestHandler = async (context, request, response) => { - const AGENT_VERSION_BUILD_FILE = 'x-pack/plugins/fleet/target/agent_versions_list.json'; - let versionsToDisplay: string[] = []; - - const kibanaVersion = appContextService.getKibanaVersion(); - const kibanaVersionCoerced = semverCoerce(kibanaVersion)?.version ?? kibanaVersion; - try { - const file = await readFile(Path.join(REPO_ROOT, AGENT_VERSION_BUILD_FILE), 'utf-8'); - - // Exclude versions older than MINIMUM_SUPPORTED_VERSION and pre-release versions (SNAPSHOT, rc..) - // De-dup and sort in descending order - const data: string[] = JSON.parse(file); - - const versions = data - .map((item: any) => semverCoerce(item)?.version || '') - .filter((v: any) => semverGte(v, MINIMUM_SUPPORTED_VERSION)) - .sort((a: any, b: any) => (semverGt(a, b) ? -1 : 1)); - const parsedVersions = uniq(versions) as string[]; - - // Add current version if not already present - const hasCurrentVersion = parsedVersions.some((v) => v === kibanaVersionCoerced); - versionsToDisplay = !hasCurrentVersion - ? [kibanaVersionCoerced].concat(parsedVersions) - : parsedVersions; - const body: GetAvailableVersionsResponse = { items: versionsToDisplay }; + const availableVersions = await AgentService.getAvailableVersions(); + const body: GetAvailableVersionsResponse = { items: availableVersions }; return response.ok({ body }); } catch (error) { return defaultFleetErrorHandler({ error, response }); diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index e3e4a5bd577d6..ce0bb850d644a 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -83,7 +83,7 @@ import { } from './elastic_agent_manifest'; import { bulkInstallPackages } from './epm/packages'; -import { getAgentsByKuery } from './agents'; +import { getAgentsByKuery, getLatestAvailableVersion } from './agents'; import { packagePolicyService } from './package_policy'; import { incrementPackagePolicyCopyName } from './package_policies'; import { outputService } from './output'; @@ -1048,11 +1048,9 @@ class AgentPolicyService { }, }; + const agentVersion = await getLatestAvailableVersion(); const configMapYaml = fullAgentConfigMapToYaml(fullAgentConfigMap, safeDump); - const updateManifestVersion = elasticAgentStandaloneManifest.replace( - 'VERSION', - appContextService.getKibanaVersion() - ); + const updateManifestVersion = elasticAgentStandaloneManifest.replace('VERSION', agentVersion); const fixedAgentYML = configMapYaml.replace('agent.yml:', 'agent.yml: |-'); return [fixedAgentYML, updateManifestVersion].join('\n'); } else { @@ -1064,10 +1062,8 @@ class AgentPolicyService { fleetServer: string, enrolToken: string ): Promise { - const updateManifestVersion = elasticAgentManagedManifest.replace( - 'VERSION', - appContextService.getKibanaVersion() - ); + const agentVersion = await getLatestAvailableVersion(); + const updateManifestVersion = elasticAgentManagedManifest.replace('VERSION', agentVersion); let updateManifest = updateManifestVersion; if (fleetServer !== '') { updateManifest = updateManifest.replace('https://fleet-server:8220', fleetServer); diff --git a/x-pack/plugins/fleet/server/services/agents/index.ts b/x-pack/plugins/fleet/server/services/agents/index.ts index 6b83a4369dd8f..273e87fc436d4 100644 --- a/x-pack/plugins/fleet/server/services/agents/index.ts +++ b/x-pack/plugins/fleet/server/services/agents/index.ts @@ -20,3 +20,4 @@ export { getAgentUploads, getAgentUploadFile } from './uploads'; export { AgentServiceImpl } from './agent_service'; export type { AgentClient, AgentService } from './agent_service'; export { BulkActionsResolver } from './bulk_actions_resolver'; +export { getAvailableVersions, getLatestAvailableVersion } from './versions'; diff --git a/x-pack/plugins/fleet/server/services/agents/versions.test.ts b/x-pack/plugins/fleet/server/services/agents/versions.test.ts new file mode 100644 index 0000000000000..baf2a46762f9e --- /dev/null +++ b/x-pack/plugins/fleet/server/services/agents/versions.test.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { readFile } from 'fs/promises'; + +let mockKibanaVersion = '300.0.0'; +let mockConfig = {}; +jest.mock('../app_context', () => { + const { loggerMock } = jest.requireActual('@kbn/logging-mocks'); + return { + appContextService: { + getLogger: () => loggerMock.create(), + getKibanaVersion: () => mockKibanaVersion, + getConfig: () => mockConfig, + }, + }; +}); + +jest.mock('fs/promises'); + +const mockedReadFile = readFile as jest.MockedFunction; +import { getAvailableVersions } from './versions'; + +describe('getAvailableVersions', () => { + it('should return available version and filter version < 7.17', async () => { + mockKibanaVersion = '300.0.0'; + mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); + + const res = await getAvailableVersions(false); + + expect(res).toEqual(['300.0.0', '8.1.0', '8.0.0', '7.17.0']); + }); + + it('should not strip -SNAPSHOT from kibana version', async () => { + mockKibanaVersion = '300.0.0-SNAPSHOT'; + mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); + + const res = await getAvailableVersions(false); + expect(res).toEqual(['300.0.0-SNAPSHOT', '8.1.0', '8.0.0', '7.17.0']); + }); + + it('should not include the current version if onlyAllowAgentUpgradeToKnownVersions = true', async () => { + mockKibanaVersion = '300.0.0-SNAPSHOT'; + mockConfig = { + internal: { + onlyAllowAgentUpgradeToKnownVersions: true, + }, + }; + mockedReadFile.mockResolvedValue(`["8.1.0", "8.0.0", "7.17.0", "7.16.0"]`); + + const res = await getAvailableVersions(false); + + expect(res).toEqual(['8.1.0', '8.0.0', '7.17.0']); + }); +}); diff --git a/x-pack/plugins/fleet/server/services/agents/versions.ts b/x-pack/plugins/fleet/server/services/agents/versions.ts new file mode 100644 index 0000000000000..7d8856fdd4c38 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/agents/versions.ts @@ -0,0 +1,73 @@ +/* + * 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 { readFile } from 'fs/promises'; +import Path from 'path'; + +import { REPO_ROOT } from '@kbn/repo-info'; +import { uniq } from 'lodash'; +import semverGte from 'semver/functions/gte'; +import semverGt from 'semver/functions/gt'; +import semverCoerce from 'semver/functions/coerce'; + +import { appContextService } from '..'; + +const MINIMUM_SUPPORTED_VERSION = '7.17.0'; +const AGENT_VERSION_BUILD_FILE = 'x-pack/plugins/fleet/target/agent_versions_list.json'; + +let availableVersions: string[] | undefined; + +export const getLatestAvailableVersion = async (): Promise => { + const versions = await getAvailableVersions(); + return versions[0]; +}; + +export const getAvailableVersions = async (cached = true): Promise => { + // Use cached value to avoid reading from disk each time + if (cached && availableVersions) { + return availableVersions; + } + + // Read a static file generated at build time + const config = appContextService.getConfig(); + let versionsToDisplay: string[] = []; + + const kibanaVersion = appContextService.getKibanaVersion(); + + try { + const file = await readFile(Path.join(REPO_ROOT, AGENT_VERSION_BUILD_FILE), 'utf-8'); + + // Exclude versions older than MINIMUM_SUPPORTED_VERSION and pre-release versions (SNAPSHOT, rc..) + // De-dup and sort in descending order + const data: string[] = JSON.parse(file); + + const versions = data + .map((item: any) => semverCoerce(item)?.version || '') + .filter((v: any) => semverGte(v, MINIMUM_SUPPORTED_VERSION)) + .sort((a: any, b: any) => (semverGt(a, b) ? -1 : 1)); + versionsToDisplay = uniq(versions) as string[]; + + if (!config?.internal?.onlyAllowAgentUpgradeToKnownVersions) { + // Add current version if not already present + const hasCurrentVersion = versionsToDisplay.some((v) => v === kibanaVersion); + + versionsToDisplay = !hasCurrentVersion + ? [kibanaVersion].concat(versionsToDisplay) + : versionsToDisplay; + } + + availableVersions = versionsToDisplay; + + return availableVersions; + } catch (e) { + if (e.code === 'ENOENT' && !config?.internal?.onlyAllowAgentUpgradeToKnownVersions) { + // If the file does not exist, return the current version + return [kibanaVersion]; + } + throw e; + } +}; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts index 78e6249e6d816..96582ff554190 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts @@ -124,6 +124,7 @@ describe('_installPackage', () => { disableILMPolicies: true, disableProxies: false, fleetServerStandalone: false, + onlyAllowAgentUpgradeToKnownVersions: false, capabilities: [], }, }) @@ -177,6 +178,7 @@ describe('_installPackage', () => { disableProxies: false, disableILMPolicies: false, fleetServerStandalone: false, + onlyAllowAgentUpgradeToKnownVersions: false, capabilities: [], }, }) diff --git a/x-pack/plugins/fleet/server/services/index.ts b/x-pack/plugins/fleet/server/services/index.ts index 69f5889bcd210..323d091cae1d2 100644 --- a/x-pack/plugins/fleet/server/services/index.ts +++ b/x-pack/plugins/fleet/server/services/index.ts @@ -38,6 +38,7 @@ export interface AgentPolicyServiceInterface { // Agent services export { AgentServiceImpl } from './agents'; export type { AgentClient, AgentService } from './agents'; +export { getAvailableVersions, getLatestAvailableVersion } from './agents'; // Saved object services export { agentPolicyService } from './agent_policy'; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx index 0e485de1e7775..97d092fc36b26 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx @@ -16,10 +16,14 @@ import { uiSettingsServiceMock, themeServiceMock, executionContextServiceMock, + applicationServiceMock, + fatalErrorsServiceMock, + httpServiceMock, } from '@kbn/core/public/mocks'; import { GlobalFlyout } from '@kbn/es-ui-shared-plugin/public'; +import { usageCollectionPluginMock } from '@kbn/usage-collection-plugin/server/mocks'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; - +import { sharePluginMock } from '@kbn/share-plugin/public/mocks'; import { settingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; import { MAJOR_VERSION } from '../../../common'; import { AppContextProvider } from '../../../public/application/app_context'; @@ -52,15 +56,23 @@ setUiMetricService(services.uiMetricService); const appDependencies = { services, core: { - getUrlForApp: () => {}, + getUrlForApp: applicationServiceMock.createStartContract().getUrlForApp, executionContext: executionContextServiceMock.createStartContract(), + http: httpServiceMock.createSetupContract(), + application: applicationServiceMock.createStartContract(), + fatalErrors: fatalErrorsServiceMock.createSetupContract(), + }, + plugins: { + usageCollection: usageCollectionPluginMock.createSetupContract(), + isFleetEnabled: false, + share: sharePluginMock.createStartContract(), }, - plugins: {}, // Default stateful configuration config: { enableLegacyTemplates: true, enableIndexActions: true, enableIndexStats: true, + enableIndexDetailsPage: false, }, } as any; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts index a92df925be1a6..24cf015e3918d 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts @@ -76,6 +76,11 @@ export interface IndexDetailsPageTestBed extends TestBed { indexStatsTabExists: () => boolean; isWarningDisplayed: () => boolean; }; + overview: { + indexStatsContentExists: () => boolean; + indexDetailsContentExists: () => boolean; + addDocCodeBlockExists: () => boolean; + }; }; } @@ -116,6 +121,18 @@ export const setup = async ( return find('indexDetailsContent').text(); }; + const overview = { + indexStatsContentExists: () => { + return exists('overviewTabIndexStats'); + }, + indexDetailsContentExists: () => { + return exists('overviewTabIndexDetails'); + }, + addDocCodeBlockExists: () => { + return exists('codeBlockControlsPanel'); + }, + }; + const mappings = { getCodeBlockContent: () => { return find('indexDetailsMappingsCodeBlock').text(); @@ -258,6 +275,7 @@ export const setup = async ( getActiveTabContent, mappings, settings, + overview, clickBackToIndicesButton, discoverLinkExists, contextMenu, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx index 62fe47b2529d4..78a9369222477 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx @@ -186,9 +186,24 @@ describe('', () => { expect(header).toEqual(testIndexName); }); - it('defaults to overview tab', () => { - const tabContent = testBed.actions.getActiveTabContent(); - expect(tabContent).toEqual('Overview'); + describe('Overview tab', () => { + it('renders index details', () => { + expect(testBed.actions.overview.indexDetailsContentExists()).toBe(true); + expect(testBed.actions.overview.indexStatsContentExists()).toBe(true); + expect(testBed.actions.overview.addDocCodeBlockExists()).toBe(true); + }); + + it('hides index stats from detail panels if enableIndexStats===false', async () => { + await act(async () => { + testBed = await setup(httpSetup, { + config: { enableIndexStats: false }, + }); + }); + testBed.component.update(); + + expect(testBed.actions.overview.indexDetailsContentExists()).toBe(true); + expect(testBed.actions.overview.indexStatsContentExists()).toBe(false); + }); }); it('documents tab', async () => { diff --git a/x-pack/plugins/index_management/kibana.jsonc b/x-pack/plugins/index_management/kibana.jsonc index 47171db66450d..250fde111d29b 100644 --- a/x-pack/plugins/index_management/kibana.jsonc +++ b/x-pack/plugins/index_management/kibana.jsonc @@ -19,7 +19,8 @@ "optionalPlugins": [ "security", "usageCollection", - "fleet" + "fleet", + "cloud" ], "requiredBundles": [ "kibanaReact", diff --git a/x-pack/plugins/index_management/public/application/app_context.tsx b/x-pack/plugins/index_management/public/application/app_context.tsx index fcedba9a1b941..f23baeb342c00 100644 --- a/x-pack/plugins/index_management/public/application/app_context.tsx +++ b/x-pack/plugins/index_management/public/application/app_context.tsx @@ -18,10 +18,12 @@ import { DocLinksStart, IUiSettingsClient, ExecutionContextStart, + HttpSetup, } from '@kbn/core/public'; -import { SharePluginStart } from '@kbn/share-plugin/public'; +import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { SettingsStart } from '@kbn/core-ui-settings-browser'; +import type { CloudSetup } from '@kbn/cloud-plugin/public'; import { ExtensionsService } from '../services'; import { UiMetricService, NotificationService, HttpService } from './services'; @@ -33,10 +35,13 @@ export interface AppDependencies { getUrlForApp: ApplicationStart['getUrlForApp']; executionContext: ExecutionContextStart; application: ApplicationStart; + http: HttpSetup; }; plugins: { usageCollection: UsageCollectionSetup; isFleetEnabled: boolean; + share: SharePluginStart; + cloud?: CloudSetup; }; services: { uiMetricService: UiMetricService; diff --git a/x-pack/plugins/index_management/public/application/mount_management_section.ts b/x-pack/plugins/index_management/public/application/mount_management_section.ts index df723e21ae287..10caf3bcc5a57 100644 --- a/x-pack/plugins/index_management/public/application/mount_management_section.ts +++ b/x-pack/plugins/index_management/public/application/mount_management_section.ts @@ -11,6 +11,7 @@ import { CoreSetup, CoreStart } from '@kbn/core/public'; import { ManagementAppMountParams } from '@kbn/management-plugin/public'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; +import { CloudSetup } from '@kbn/cloud-plugin/public'; import { UIM_APP_NAME } from '../../common/constants'; import { PLUGIN } from '../../common/constants/plugin'; import { ExtensionsService } from '../services'; @@ -57,6 +58,7 @@ export async function mountManagementSection({ enableLegacyTemplates = true, enableIndexDetailsPage = false, enableIndexStats = true, + cloud, }: { coreSetup: CoreSetup; usageCollection: UsageCollectionSetup; @@ -68,6 +70,7 @@ export async function mountManagementSection({ enableLegacyTemplates?: boolean; enableIndexDetailsPage?: boolean; enableIndexStats?: boolean; + cloud?: CloudSetup; }) { const { element, setBreadcrumbs, history, theme$ } = params; const [core, startDependencies] = await coreSetup.getStartServices(); @@ -79,6 +82,7 @@ export async function mountManagementSection({ uiSettings, executionContext, settings, + http, } = core; const { url } = startDependencies.share; @@ -98,10 +102,13 @@ export async function mountManagementSection({ getUrlForApp: application.getUrlForApp, executionContext, application, + http, }, plugins: { usageCollection, isFleetEnabled, + share: startDependencies.share, + cloud, }, services: { httpService, diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page.tsx index 17cbeb7649449..33378fc138c04 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page.tsx @@ -30,6 +30,7 @@ import { DetailsPageError } from './details_page_error'; import { ManageIndexButton } from './manage_index_button'; import { DetailsPageStats } from './details_page_stats'; import { DetailsPageMappings } from './details_page_mappings'; +import { DetailsPageOverview } from './details_page_overview'; import { DetailsPageSettings } from './details_page_settings'; export enum IndexDetailsSection { @@ -189,7 +190,7 @@ export const DetailsPage: React.FunctionComponent<
    Overview
    } + render={() => } /> = ({ indexDetails }) => { + const { + name, + status, + documents, + documents_deleted: documentsDeleted, + primary, + replica, + aliases, + } = indexDetails; + const { config, core, plugins } = useAppContext(); + + const [selectedLanguage, setSelectedLanguage] = useState(curlDefinition); + + const elasticsearchURL = useMemo(() => { + return plugins.cloud?.elasticsearchUrl ?? 'https://your_deployment_url'; + }, [plugins.cloud]); + + const codeSnippetArguments: LanguageDefinitionSnippetArguments = { + url: elasticsearchURL, + apiKey: 'your_api_key', + indexName: name, + }; + + return ( + <> + + {config.enableIndexStats && ( + + + + + + + + + + + + + + + + )} + + + + + {primary && ( + + + + )} + + {replica && ( + + + + )} + + + + + + + + + + + + + + +

    + {i18n.translate('xpack.idxMgmt.indexDetails.overviewTab.addMoreDataTitle', { + defaultMessage: 'Add more data to this index', + })} +

    +
    + + + + + +

    + {i18n.translate('xpack.idxMgmt.indexDetails.overviewTab.addMoreDataDescription', { + defaultMessage: + 'Keep adding more documents to your already created index using the API', + })} +

    +
    +
    +
    + + + + +
    + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_overview/index.ts b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_overview/index.ts new file mode 100644 index 0000000000000..e3f5b65bdcadf --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_overview/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { DetailsPageOverview } from './details_page_overview'; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_overview/languages.ts b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_overview/languages.ts new file mode 100644 index 0000000000000..838efe28580c0 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_overview/languages.ts @@ -0,0 +1,179 @@ +/* + * 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 { Languages, LanguageDefinition } from '@kbn/search-api-panels'; +import { i18n } from '@kbn/i18n'; + +const INDEX_NAME_PLACEHOLDER = 'index_name'; + +export const curlDefinition: LanguageDefinition = { + id: Languages.CURL, + name: i18n.translate('xpack.idxMgmt.indexDetails.languages.cURL', { + defaultMessage: 'cURL', + }), + iconType: 'curl.svg', + languageStyling: 'shell', + ingestDataIndex: ({ apiKey, indexName, url }) => `curl -X POST ${url}/_bulk?pretty \\ + -H "Authorization: ApiKey ${apiKey}" \\ + -H "Content-Type: application/json" \\ + -d' +{ "index" : { "_index" : "${indexName ?? INDEX_NAME_PLACEHOLDER}" } } +{"name": "foo", "title": "bar" } +`, +}; + +export const javascriptDefinition: LanguageDefinition = { + id: Languages.JAVASCRIPT, + name: i18n.translate('xpack.idxMgmt.indexDetails.languages.javascript', { + defaultMessage: 'JavaScript', + }), + iconType: 'javascript.svg', + ingestDataIndex: ({ + apiKey, + url, + indexName, + }) => `const { Client } = require('@elastic/elasticsearch'); +const client = new Client({ + node: '${url}', + auth: { + apiKey: '${apiKey}' + } +}); +const dataset = [ + {'name': 'foo', 'title': 'bar'}, +]; + +// Index with the bulk helper +const result = await client.helpers.bulk({ + datasource: dataset, + onDocument (doc) { + return { index: { _index: '${indexName ?? 'index_name'}' }}; + } +}); +console.log(result); +`, +}; + +export const goDefinition: LanguageDefinition = { + id: Languages.GO, + name: i18n.translate('xpack.idxMgmt.indexDetails.languages.go', { + defaultMessage: 'Go', + }), + iconType: 'go.svg', + ingestDataIndex: ({ apiKey, url, indexName }) => `import ( + "context" + "fmt" + "log" + "strings" +​ + "github.com/elastic/elasticsearch-serverless-go" +) +​ +func main() { + cfg := elasticsearch.Config{ + Address: "${url}", + APIKey: "${apiKey}", + } + es, err := elasticsearch.NewClient(cfg) + if err != nil { + log.Fatalf("Error creating the client: %s", err) + } + res, err := es.Bulk(). + Index("${indexName}"). + Raw(strings.NewReader(\` +{ "index": { "_id": "1"}} +{"name": "foo", "title": "bar"}\n\`)). + Do(context.Background()) + ​ + fmt.Println(res, err) +}`, +}; + +export const pythonDefinition: LanguageDefinition = { + id: Languages.PYTHON, + name: i18n.translate('xpack.idxMgmt.indexDetails.languages.python', { + defaultMessage: 'Python', + }), + iconType: 'python.svg', + ingestDataIndex: ({ apiKey, url, indexName }) => `from elasticsearch import Elasticsearch + +client = Elasticsearch( + "${url}", + api_key="${apiKey}" +) + +documents = [ + {"index": {"_index": "${indexName ?? INDEX_NAME_PLACEHOLDER}"}}, + {"name": "foo", "title": "bar"}, +] + +client.bulk(operations=documents) +`, +}; + +export const phpDefinition: LanguageDefinition = { + id: Languages.PHP, + name: i18n.translate('xpack.idxMgmt.indexDetails.languages.php', { + defaultMessage: 'PHP', + }), + iconType: 'php.svg', + ingestDataIndex: ({ apiKey, url, indexName }) => `$client = ClientBuilder::create() + ->setHosts(['${url}']) + ->setApiKey('${apiKey}') + ->build(); + +$params = [ +'body' => [ +[ +'index' => [ +'_index' => '${indexName ?? INDEX_NAME_PLACEHOLDER}', +'_id' => '1', +], +], +[ +'name' => 'foo', +'title' => 'bar', +], +], +]; + +$response = $client->bulk($params); +echo $response->getStatusCode(); +echo (string) $response->getBody(); +`, +}; + +export const rubyDefinition: LanguageDefinition = { + id: Languages.RUBY, + name: i18n.translate('xpack.idxMgmt.indexDetails.languages.ruby', { + defaultMessage: 'Ruby', + }), + iconType: 'ruby.svg', + ingestDataIndex: ({ apiKey, url, indexName }) => `client = ElasticsearchServerless::Client.new( + api_key: '${apiKey}', + url: '${url}' +) + +documents = [ + { index: { _index: '${ + indexName ?? INDEX_NAME_PLACEHOLDER + }', data: {name: "foo", "title": "bar"} } }, +] +client.bulk(body: documents) +`, +}; + +const languageDefinitionRecords: Partial> = { + [Languages.CURL]: curlDefinition, + [Languages.PYTHON]: pythonDefinition, + [Languages.JAVASCRIPT]: javascriptDefinition, + [Languages.PHP]: phpDefinition, + [Languages.GO]: goDefinition, + [Languages.RUBY]: rubyDefinition, +}; + +export const languageDefinitions: LanguageDefinition[] = Object.values(languageDefinitionRecords); diff --git a/x-pack/plugins/index_management/public/assets/curl.svg b/x-pack/plugins/index_management/public/assets/curl.svg new file mode 100644 index 0000000000000..e922b12283f7d --- /dev/null +++ b/x-pack/plugins/index_management/public/assets/curl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/x-pack/plugins/index_management/public/assets/go.svg b/x-pack/plugins/index_management/public/assets/go.svg new file mode 100644 index 0000000000000..715978f645771 --- /dev/null +++ b/x-pack/plugins/index_management/public/assets/go.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/x-pack/plugins/index_management/public/assets/javascript.svg b/x-pack/plugins/index_management/public/assets/javascript.svg new file mode 100644 index 0000000000000..6d514f5448c50 --- /dev/null +++ b/x-pack/plugins/index_management/public/assets/javascript.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/x-pack/plugins/index_management/public/assets/php.svg b/x-pack/plugins/index_management/public/assets/php.svg new file mode 100644 index 0000000000000..df4ae0ccc1863 --- /dev/null +++ b/x-pack/plugins/index_management/public/assets/php.svg @@ -0,0 +1,3 @@ + + + diff --git a/x-pack/plugins/index_management/public/assets/python.svg b/x-pack/plugins/index_management/public/assets/python.svg new file mode 100644 index 0000000000000..bd8a27810c575 --- /dev/null +++ b/x-pack/plugins/index_management/public/assets/python.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/index_management/public/assets/ruby.svg b/x-pack/plugins/index_management/public/assets/ruby.svg new file mode 100644 index 0000000000000..55d2d7eea4f45 --- /dev/null +++ b/x-pack/plugins/index_management/public/assets/ruby.svg @@ -0,0 +1,3 @@ + + + diff --git a/x-pack/plugins/index_management/public/plugin.ts b/x-pack/plugins/index_management/public/plugin.ts index 401c37770fd79..33006b7b21cde 100644 --- a/x-pack/plugins/index_management/public/plugin.ts +++ b/x-pack/plugins/index_management/public/plugin.ts @@ -45,7 +45,7 @@ export class IndexMgmtUIPlugin { } = this.ctx.config.get(); if (isIndexManagementUiEnabled) { - const { fleet, usageCollection, management } = plugins; + const { fleet, usageCollection, management, cloud } = plugins; const kibanaVersion = new SemVer(this.ctx.env.packageInfo.version); management.sections.section.data.registerApp({ id: PLUGIN.id, @@ -64,6 +64,7 @@ export class IndexMgmtUIPlugin { enableLegacyTemplates, enableIndexDetailsPage, enableIndexStats, + cloud, }); }, }); diff --git a/x-pack/plugins/index_management/public/types.ts b/x-pack/plugins/index_management/public/types.ts index 7ca83e70b5e0f..78519e9452402 100644 --- a/x-pack/plugins/index_management/public/types.ts +++ b/x-pack/plugins/index_management/public/types.ts @@ -7,7 +7,8 @@ import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import { ManagementSetup } from '@kbn/management-plugin/public'; -import { SharePluginStart } from '@kbn/share-plugin/public'; +import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; +import { CloudSetup } from '@kbn/cloud-plugin/public'; import { ExtensionsSetup, PublicApiServiceSetup } from './services'; export interface IndexManagementPluginSetup { @@ -19,6 +20,8 @@ export interface SetupDependencies { fleet?: unknown; usageCollection: UsageCollectionSetup; management: ManagementSetup; + share: SharePluginSetup; + cloud?: CloudSetup; } export interface StartDependencies { diff --git a/x-pack/plugins/index_management/tsconfig.json b/x-pack/plugins/index_management/tsconfig.json index 2df96ae23c47a..90514823c5ac0 100644 --- a/x-pack/plugins/index_management/tsconfig.json +++ b/x-pack/plugins/index_management/tsconfig.json @@ -36,6 +36,8 @@ "@kbn/core-ui-settings-browser", "@kbn/kibana-utils-plugin", "@kbn/core-http-browser", + "@kbn/search-api-panels", + "@kbn/cloud-plugin", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/infra/public/common/visualizations/constants.ts b/x-pack/plugins/infra/public/common/visualizations/constants.ts index d24f937770d31..1ad738cb02706 100644 --- a/x-pack/plugins/infra/public/common/visualizations/constants.ts +++ b/x-pack/plugins/infra/public/common/visualizations/constants.ts @@ -20,7 +20,7 @@ import { diskWriteThroughput, diskSpaceAvailability, diskSpaceAvailable, - diskSpaceUsage, + diskUsage, logRate, normalizedLoad1m, load1m, @@ -58,7 +58,7 @@ export const hostLensFormulas = { diskWriteThroughput, diskSpaceAvailability, diskSpaceAvailable, - diskSpaceUsage, + diskUsage, hostCount, logRate, normalizedLoad1m, diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_kpi_charts.ts b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_kpi_charts.ts index a781a0404eb0c..b911eadbc6583 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_kpi_charts.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_kpi_charts.ts @@ -97,15 +97,15 @@ export const hostKPICharts: KPIChartProps[] = [ }, { id: 'diskSpaceUsage', - title: i18n.translate('xpack.infra.assetDetailsEmbeddable.overview.kpi.diskSpaceUsage.title', { - defaultMessage: 'Disk Space Usage', + title: i18n.translate('xpack.infra.assetDetailsEmbeddable.overview.kpi.diskUsage.title', { + defaultMessage: 'Disk Usage', }), layers: { data: { - ...hostLensFormulas.diskSpaceUsage, - format: hostLensFormulas.diskSpaceUsage.format + ...hostLensFormulas.diskUsage, + format: hostLensFormulas.diskUsage.format ? { - ...hostLensFormulas.diskSpaceUsage.format, + ...hostLensFormulas.diskUsage.format, params: { decimals: 1, }, diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_metric_charts.ts b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_metric_charts.ts index 5da21aba45c33..8a116bdb40ce8 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_metric_charts.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_metric_charts.ts @@ -9,7 +9,7 @@ import { diskSpaceUsageAvailable, diskThroughputReadWrite, diskIOReadWrite, - diskSpaceUsageByMountPoint, + diskUsageByMountPoint, } from '../metric_charts/disk'; import { logRate } from '../metric_charts/log'; import { memoryUsage, memoryUsageBreakdown } from '../metric_charts/memory'; @@ -22,7 +22,7 @@ export const hostMetricFlyoutCharts: XYConfig[] = [ normalizedLoad1m, logRate, diskSpaceUsageAvailable, - diskSpaceUsageByMountPoint, + diskUsageByMountPoint, diskThroughputReadWrite, diskIOReadWrite, rxTx, @@ -37,7 +37,7 @@ export const hostMetricChartsFullPage: XYConfig[] = [ loadBreakdown, logRate, diskSpaceUsageAvailable, - diskSpaceUsageByMountPoint, + diskUsageByMountPoint, diskThroughputReadWrite, diskIOReadWrite, rxTx, diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/metric_charts/disk.ts b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/metric_charts/disk.ts index 8d2daa435fbdc..b6c20c7abaa20 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/metric_charts/disk.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/metric_charts/disk.ts @@ -14,22 +14,22 @@ const TOP_VALUES_SIZE = 5; export const diskSpaceUsageAvailable: XYConfig = { id: 'diskSpaceUsageAvailable', - title: i18n.translate('xpack.infra.assetDetails.metricsCharts.diskSpace', { - defaultMessage: 'Disk Space', + title: i18n.translate('xpack.infra.assetDetails.metricsCharts.diskUsage', { + defaultMessage: 'Disk Usage', }), layers: [ { data: [ { - ...hostLensFormulas.diskSpaceUsage, - label: i18n.translate('xpack.infra.assetDetails.metricsCharts.diskSpace.label.used', { + ...hostLensFormulas.diskUsage, + label: i18n.translate('xpack.infra.assetDetails.metricsCharts.diskUsage.label.used', { defaultMessage: 'Used', }), }, { ...hostLensFormulas.diskSpaceAvailability, label: i18n.translate( - 'xpack.infra.assetDetails.metricsCharts.diskSpace.label.available', + 'xpack.infra.assetDetails.metricsCharts.diskUsage.label.available', { defaultMessage: 'Available', } @@ -49,17 +49,17 @@ export const diskSpaceUsageAvailable: XYConfig = { dataViewOrigin: 'metrics', }; -export const diskSpaceUsageByMountPoint: XYConfig = { - id: 'DiskSpaceUsageByMountPoint', - title: i18n.translate('xpack.infra.assetDetails.metricsCharts.diskSpaceByMountingPoint', { - defaultMessage: 'Disk Space by Mount Point', +export const diskUsageByMountPoint: XYConfig = { + id: 'DiskUsageByMountPoint', + title: i18n.translate('xpack.infra.assetDetails.metricsCharts.diskUsageByMountingPoint', { + defaultMessage: 'Disk Usage by Mount Point', }), layers: [ { data: [ { - ...hostLensFormulas.diskSpaceUsage, - label: i18n.translate('xpack.infra.assetDetails.metricsCharts.diskSpace.label.used', { + ...hostLensFormulas.diskUsage, + label: i18n.translate('xpack.infra.assetDetails.metricsCharts.diskUsage.label.used', { defaultMessage: 'Used', }), }, diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/hosts_view/hosts_metric_charts.ts b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/hosts_view/hosts_metric_charts.ts index 78ea831ff2c5d..eee6ffca3ab2a 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/hosts_view/hosts_metric_charts.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/hosts_view/hosts_metric_charts.ts @@ -83,12 +83,12 @@ export const hostsMetricCharts: Array< }, { id: 'diskSpaceUsed', - title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.diskSpaceUsed', { - defaultMessage: 'Disk Space Usage', + title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.diskUsage', { + defaultMessage: 'Disk Usage', }), layers: [ { - data: [hostLensFormulas.diskSpaceUsage], + data: [hostLensFormulas.diskUsage], options: XY_LAYER_OPTIONS, type: 'visualization', }, diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_usage.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_usage.ts similarity index 84% rename from x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_usage.ts rename to x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_usage.ts index 24143b58c81e6..c45ebac82a9e8 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_usage.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_usage.ts @@ -7,8 +7,8 @@ import type { FormulaValueConfig } from '@kbn/lens-embeddable-utils'; -export const diskSpaceUsage: FormulaValueConfig = { - label: 'Disk Space Usage', +export const diskUsage: FormulaValueConfig = { + label: 'Disk Usage', value: 'average(system.filesystem.used.pct)', format: { id: 'percent', diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/index.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/index.ts index 0635992ba1792..0b39cda885b4c 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/index.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/index.ts @@ -19,7 +19,7 @@ export { diskReadThroughput } from './disk_read_throughput'; export { diskWriteThroughput } from './disk_write_throughput'; export { diskSpaceAvailability } from './disk_space_availability'; export { diskSpaceAvailable } from './disk_space_available'; -export { diskSpaceUsage } from './disk_space_usage'; +export { diskUsage } from './disk_usage'; export { hostCount } from './host_count'; export { logRate } from './log_rate'; export { normalizedLoad1m } from './normalized_load_1m'; diff --git a/x-pack/plugins/infra/public/components/asset_details/__stories__/context/fixtures/asset_details_props.ts b/x-pack/plugins/infra/public/components/asset_details/__stories__/context/fixtures/asset_details_props.ts index 05e17c16eb929..b6e35dbf51773 100644 --- a/x-pack/plugins/infra/public/components/asset_details/__stories__/context/fixtures/asset_details_props.ts +++ b/x-pack/plugins/infra/public/components/asset_details/__stories__/context/fixtures/asset_details_props.ts @@ -6,42 +6,42 @@ */ import { i18n } from '@kbn/i18n'; -import { type AssetDetailsProps, FlyoutTabIds, type Tab } from '../../../types'; +import { type AssetDetailsProps, ContentTabIds, type Tab } from '../../../types'; const links: AssetDetailsProps['links'] = ['alertRule', 'nodeDetails', 'apmServices']; const tabs: Tab[] = [ { - id: FlyoutTabIds.OVERVIEW, + id: ContentTabIds.OVERVIEW, name: i18n.translate('xpack.infra.nodeDetails.tabs.overview.title', { defaultMessage: 'Overview', }), }, { - id: FlyoutTabIds.LOGS, + id: ContentTabIds.LOGS, name: i18n.translate('xpack.infra.nodeDetails.tabs.logs', { defaultMessage: 'Logs', }), }, { - id: FlyoutTabIds.METADATA, + id: ContentTabIds.METADATA, name: i18n.translate('xpack.infra.metrics.nodeDetails.tabs.metadata', { defaultMessage: 'Metadata', }), }, { - id: FlyoutTabIds.PROCESSES, + id: ContentTabIds.PROCESSES, name: i18n.translate('xpack.infra.metrics.nodeDetails.tabs.processes', { defaultMessage: 'Processes', }), }, { - id: FlyoutTabIds.ANOMALIES, + id: ContentTabIds.ANOMALIES, name: i18n.translate('xpack.infra.nodeDetails.tabs.anomalies', { defaultMessage: 'Anomalies', }), }, { - id: FlyoutTabIds.LINK_TO_APM, + id: ContentTabIds.LINK_TO_APM, name: i18n.translate('xpack.infra.infra.nodeDetails.apmTabLabel', { defaultMessage: 'APM', }), diff --git a/x-pack/plugins/infra/public/components/asset_details/components/metadata_explanation.tsx b/x-pack/plugins/infra/public/components/asset_details/components/metadata_explanation.tsx index bdd77916db02f..857dc493041c1 100644 --- a/x-pack/plugins/infra/public/components/asset_details/components/metadata_explanation.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/components/metadata_explanation.tsx @@ -21,7 +21,7 @@ const MetadataExplanationTooltipContent = React.memo(() => { }; return ( - + { iconSize="s" iconColor="subdued" icon="iInCircle" - panelPaddingSize="m" data-test-subj="infraAssetDetailsMetadataPopoverButton" > diff --git a/x-pack/plugins/infra/public/components/asset_details/components/processes_explanation.tsx b/x-pack/plugins/infra/public/components/asset_details/components/processes_explanation.tsx index 5f1af3f9f8a26..2cf339c2e36d8 100644 --- a/x-pack/plugins/infra/public/components/asset_details/components/processes_explanation.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/components/processes_explanation.tsx @@ -22,7 +22,7 @@ const ProcessesExplanationTooltipContent = React.memo(() => { }; return ( - +

    { iconSize="s" iconColor="subdued" icon="iInCircle" - panelPaddingSize="m" data-test-subj="infraAssetDetailsProcessesPopoverButton" > diff --git a/x-pack/plugins/infra/public/components/asset_details/constants.ts b/x-pack/plugins/infra/public/components/asset_details/constants.ts index 726f47450d0cc..cdd5b95082158 100644 --- a/x-pack/plugins/infra/public/components/asset_details/constants.ts +++ b/x-pack/plugins/infra/public/components/asset_details/constants.ts @@ -8,3 +8,5 @@ export const ASSET_DETAILS_FLYOUT_COMPONENT_NAME = 'infraAssetDetailsFlyout'; export const METRIC_CHART_HEIGHT = 300; export const APM_HOST_FILTER_FIELD = 'host.hostname'; + +export const ASSET_DETAILS_URL_STATE_KEY = 'assetDetails'; diff --git a/x-pack/plugins/infra/public/components/asset_details/content/content.tsx b/x-pack/plugins/infra/public/components/asset_details/content/content.tsx index c9d622cf01493..0cf51f1fff3d7 100644 --- a/x-pack/plugins/infra/public/components/asset_details/content/content.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/content/content.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { DatePicker } from '../date_picker/date_picker'; import { useTabSwitcherContext } from '../hooks/use_tab_switcher'; import { Anomalies, Metadata, Processes, Osquery, Logs, Overview } from '../tabs'; -import { FlyoutTabIds } from '../types'; +import { ContentTabIds } from '../types'; export const Content = () => { return ( @@ -18,31 +18,31 @@ export const Content = () => { - + - + - + - + - + - + @@ -50,11 +50,11 @@ export const Content = () => { ); }; -const DatePickerWrapper = ({ visibleFor }: { visibleFor: FlyoutTabIds[] }) => { +const DatePickerWrapper = ({ visibleFor }: { visibleFor: ContentTabIds[] }) => { const { activeTabId } = useTabSwitcherContext(); return ( -