From 68f2adf1b19b77ba9e00c7abfd572a09d12792da Mon Sep 17 00:00:00 2001 From: Brad White Date: Tue, 5 Sep 2023 15:36:35 -0600 Subject: [PATCH 01/25] Add waitForReady to base config for FTR serverless (#165522) ## Summary `waitForReady` was added in #165467. This PR utilizes it so that FTR doesn't continue with starting Kibana until ES has reported its ready. We get quite a few of [these errors](https://buildkite.com/elastic/kibana-pull-request/builds/155832#018a5223-a3f7-4a43-990d-004ca465ab84/2350-2452) every time, and it could be misleading. It adds 20-30s to startup time. --------- Co-authored-by: Tiago Costa --- packages/kbn-es/src/utils/docker.ts | 51 +++++++++++++++++---- packages/kbn-test/src/es/test_es_cluster.ts | 1 + 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/packages/kbn-es/src/utils/docker.ts b/packages/kbn-es/src/utils/docker.ts index 01db89a14c6ab..7a014d9fc19b9 100644 --- a/packages/kbn-es/src/utils/docker.ts +++ b/packages/kbn-es/src/utils/docker.ts @@ -10,11 +10,16 @@ import execa from 'execa'; import fs from 'fs'; import Fsp from 'fs/promises'; import { resolve, basename, join } from 'path'; -import { Client, HttpConnection } from '@elastic/elasticsearch'; +import { Client, ClientOptions, HttpConnection } from '@elastic/elasticsearch'; import { ToolingLog } from '@kbn/tooling-log'; import { kibanaPackageJson as pkg, REPO_ROOT } from '@kbn/repo-info'; -import { ES_P12_PASSWORD, ES_P12_PATH } from '@kbn/dev-utils'; +import { + CA_CERT_PATH, + ES_P12_PASSWORD, + ES_P12_PATH, + kibanaDevServiceAccount, +} from '@kbn/dev-utils'; import { createCliError } from '../errors'; import { EsClusterExecOptions } from '../cluster_exec_options'; @@ -547,19 +552,21 @@ export async function runServerlessEsNode( ); } -function getESClient( - { node }: { node: string } = { node: `http://localhost:${DEFAULT_PORT}` } -): Client { +function getESClient(clientOptions: ClientOptions): Client { return new Client({ - node, Connection: HttpConnection, + ...clientOptions, }); } const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)); -async function waitUntilClusterReady(timeoutMs = 60 * 1000): Promise { +async function waitUntilClusterReady( + clientOptions: ClientOptions, + timeoutMs = 60 * 1000 +): Promise { const started = Date.now(); - const client = getESClient(); + const client = getESClient(clientOptions); + while (started + timeoutMs > Date.now()) { try { await client.info(); @@ -579,6 +586,7 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO await setupDocker({ log, image, options }); const volumeCmd = await setupServerlessVolumes(log, options); + const portCmd = resolvePort(options); const nodeNames = await Promise.all( SERVERLESS_NODES.map(async (node, i) => { @@ -593,7 +601,7 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO ), options ), - i === 0 ? resolvePort(options) : [], + i === 0 ? portCmd : [], volumeCmd ), }); @@ -621,7 +629,30 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO if (options.waitForReady) { log.info('Waiting until ES is ready to serve requests...'); - await waitUntilClusterReady(); + + const esNodeUrl = `${options.ssl ? 'https' : 'http'}://${portCmd[1].substring( + 0, + portCmd[1].lastIndexOf(':') + )}`; + + await waitUntilClusterReady({ + node: esNodeUrl, + ...(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 + // for the ip which is not validated. As such we are getting the error + // Hostname/IP does not match certificate's altnames: IP: 127.0.0.1 is not in the cert's list: + // To work around that we are overriding the function checkServerIdentity too + checkServerIdentity: () => { + return undefined; + }, + }, + } + : {}), + }); log.success('ES is ready'); } diff --git a/packages/kbn-test/src/es/test_es_cluster.ts b/packages/kbn-test/src/es/test_es_cluster.ts index 580840b6b35a8..31efd5ef709e8 100644 --- a/packages/kbn-test/src/es/test_es_cluster.ts +++ b/packages/kbn-test/src/es/test_es_cluster.ts @@ -238,6 +238,7 @@ export function createTestEsCluster< background: true, files, kill: true, // likely don't need this but avoids any issues where the ESS cluster wasn't cleaned up + waitForReady: true, }); } else if (Path.isAbsolute(esFrom)) { installPath = esFrom; From 4d47b49f104ad91aacfa8c937a18952342f4da16 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 5 Sep 2023 15:31:57 -0700 Subject: [PATCH 02/25] [DOCS] Automate Opsgenie connector screenshots (#165265) --- .../connectors/action-types/opsgenie.asciidoc | 2 ++ .../connectors/images/opsgenie-connector.png | Bin 55074 -> 181577 bytes .../images/opsgenie-params-test.png | Bin 56953 -> 145875 bytes .../stack_connectors/connector_types.ts | 13 +++++++++++++ 4 files changed, 15 insertions(+) diff --git a/docs/management/connectors/action-types/opsgenie.asciidoc b/docs/management/connectors/action-types/opsgenie.asciidoc index 817acdfb135d4..e7cb784ca31fc 100644 --- a/docs/management/connectors/action-types/opsgenie.asciidoc +++ b/docs/management/connectors/action-types/opsgenie.asciidoc @@ -15,6 +15,7 @@ or as needed when you're creating a rule. For example: [role="screenshot"] image::management/connectors/images/opsgenie-connector.png[Opsgenie connector] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. [float] [[opsgenie-connector-configuration]] @@ -37,6 +38,7 @@ as you're creating or editing the connector in {kib}. For example: [role="screenshot"] image::management/connectors/images/opsgenie-params-test.png[Opsgenie params test] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. The Opsgenie connector supports two types of actions: Create alert and Close alert. The properties supported for each action are different because Opsgenie defines different properties for each operation. diff --git a/docs/management/connectors/images/opsgenie-connector.png b/docs/management/connectors/images/opsgenie-connector.png index ccb08b27d69344ec1f0f4bc833969bb7cf253e1b..29b9db891a5d59c9aff07b667bf692349c6dfc43 100644 GIT binary patch literal 181577 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%0AsSv)Jk&tz1s_*}d=+ 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

i&5?V5OjI-&;z< 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 z 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 z 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 Se>WW9@8JVw+2Z?8{r(SATjNpy diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts index 90fe6e7749840..0f0a2e40fba00 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_connectors/connector_types.ts @@ -186,5 +186,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await commonScreenshots.takeScreenshot('pagerduty-params-test', screenshotDirectories); await testSubjects.click('euiFlyoutCloseButton'); }); + + it('opsgenie connector screenshots', async () => { + await pageObjects.common.navigateToApp('connectors'); + await pageObjects.header.waitUntilLoadingHasFinished(); + await actions.common.openNewConnectorForm('opsgenie'); + await testSubjects.setValue('nameInput', 'Opsgenie test connector'); + await testSubjects.setValue('secrets.apiKey-input', 'testkey'); + await commonScreenshots.takeScreenshot('opsgenie-connector', screenshotDirectories); + await testSubjects.click('create-connector-flyout-save-test-btn'); + await testSubjects.click('toastCloseButton'); + await commonScreenshots.takeScreenshot('opsgenie-params-test', screenshotDirectories); + await testSubjects.click('euiFlyoutCloseButton'); + }); }); } From 2d8c8c16c43e918788e8ce4b1dfad745d48a80a9 Mon Sep 17 00:00:00 2001 From: Youhei Sakurai Date: Wed, 6 Sep 2023 10:32:07 +0900 Subject: [PATCH 03/25] Add autocomplete for knn in search query (#165531) ## Summary This PR adds autocomplete for knn in search query. ![autocomplete-for-knn](https://github.com/elastic/kibana/assets/721858/3e185db5-f132-4865-9ca0-245af71ea9bd) Closes #165529 ### Checklist - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ## Release note Improves autocomplete to suggest knn in search query --- .../server/lib/spec_definitions/js/search.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/plugins/console/server/lib/spec_definitions/js/search.ts b/src/plugins/console/server/lib/spec_definitions/js/search.ts index 25e1a782fa0a6..6dc30ba7f8906 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/search.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/search.ts @@ -222,6 +222,37 @@ export const search = (specService: SpecDefinitionsService) => { timeout: '1s', version: { __one_of: [true, false] }, track_total_hits: { __one_of: [true, false] }, + knn: { + __template: { + field: '', + k: 10, + num_candidates: 100, + }, + __one_of: [ + { + field: '{field}', + filter: { __scope_link: 'GLOBAL.filter' }, + k: 10, + num_candidates: 100, + query_vector: [], + query_vector_builder: {}, + similarity: { __one_of: ['l2_norm', 'cosine', 'dot_product'] }, + boost: 1.0, + }, + [ + { + field: '{field}', + filter: { __scope_link: 'GLOBAL.filter' }, + k: 10, + num_candidates: 100, + query_vector: [], + query_vector_builder: {}, + similarity: { __one_of: ['l2_norm', 'cosine', 'dot_product'] }, + boost: 1.0, + }, + ], + ], + }, }, }); From 434be0c759c77ad0988ef5e122b14bef8328d530 Mon Sep 17 00:00:00 2001 From: Youhei Sakurai Date: Wed, 6 Sep 2023 10:32:27 +0900 Subject: [PATCH 04/25] Change to not prompt autocomplete in the end triple quotes (#165535) ## Summary This PR stops prompting autocomplete in the middle of the end triple quotes. ![not-prompt-autocomplete-in-triple-quotes](https://github.com/elastic/kibana/assets/721858/14a74b6e-985c-4739-99a9-4f3232c305b5) Closes #124084 ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) `backport:skip` because the bug is trivial. ## Release note Fixes autocomplete not to be prompt between the triple quotes --- src/plugins/console/public/lib/autocomplete/autocomplete.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts index 04634e635ac12..167a0e0ab1bd3 100644 --- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts +++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts @@ -1056,6 +1056,12 @@ export default function ({ return context; } + const t = editor.getTokenAt(pos); + if (t && t.type === 'punctuation.end_triple_quote' && pos.column !== t.position.column + 3) { + // skip to populate context as the current position is not on the edge of end_triple_quote + return context; + } + // needed for scope linking + global term resolving context.endpointComponentResolver = getEndpointBodyCompleteComponents; context.globalComponentResolver = getGlobalAutocompleteComponents; From 9b963bfe337737555d302db78aa3daa81ea9af41 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Tue, 5 Sep 2023 18:32:50 -0700 Subject: [PATCH 05/25] [DOCS] Move preconfigured index connector details (#165277) --- .../connector-apis-passthru.asciidoc | 2 +- .../connectors/action-types/index.asciidoc | 74 ++---------------- ...pre-configured-alert-history-connector.png | Bin 163742 -> 152201 bytes .../pre-configured-connectors.asciidoc | 62 ++++++++++++--- docs/settings/alert-action-settings.asciidoc | 9 +++ packages/kbn-doc-links/src/get_doc_links.ts | 2 +- .../plugins/actions/docs/openapi/bundled.json | 2 +- .../plugins/actions/docs/openapi/bundled.yaml | 2 +- .../schemas/config_properties_index.yaml | 2 +- 9 files changed, 75 insertions(+), 80 deletions(-) diff --git a/docs/api-generated/connectors/connector-apis-passthru.asciidoc b/docs/api-generated/connectors/connector-apis-passthru.asciidoc index f5128f88f1b1e..aefb065281d3a 100644 --- a/docs/api-generated/connectors/connector-apis-passthru.asciidoc +++ b/docs/api-generated/connectors/connector-apis-passthru.asciidoc @@ -1389,7 +1389,7 @@ Any modifications made to this file will be overwritten.

config_properties_index - Connector request properties for an index connector Up

Defines properties for connectors when type is .index.
-
executionTimeField (optional)
String Specifies a field that will contain the time the alert condition was detected.
+
executionTimeField (optional)
String A field that indicates when the document was indexed.
index
String The Elasticsearch index to be written to.
refresh (optional)
Boolean The refresh policy for the write request, which affects when changes are made visible to search. Refer to the refresh setting for Elasticsearch document APIs.
diff --git a/docs/management/connectors/action-types/index.asciidoc b/docs/management/connectors/action-types/index.asciidoc index 87c7494df23ea..5a09ab2d23c5f 100644 --- a/docs/management/connectors/action-types/index.asciidoc +++ b/docs/management/connectors/action-types/index.asciidoc @@ -3,13 +3,13 @@ ++++ Index ++++ +:frontmatter-description: Add a connector that can add documents to {es} indices. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [configure] -An index connector indexes a document into {es}. -You can create index connectors in {kib} or by using the -<>. Alternatively, you can use the <>. -If you are running {kib} on-prem, you can also create more preconfigured index -connectors. +An index connector indexes a document into {es}. [float] [[define-index-ui]] @@ -26,72 +26,14 @@ image::management/connectors/images/index-connector.png[Index connector] [[index-connector-configuration]] ==== Connector configuration -Index connectors must have a name and an {es} index. You can optionally set the time field, which contains the -details about when each alert condition was detected. - -[float] -[[preconfigured-index-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-index: - name: preconfigured-index-connector-type - actionTypeId: .index - config: - index: .kibana - executionTimeField: my-field --- - -For more information, go to <>. - -[float] -[[preconfigured-connector-alert-history]] -==== Preconfigured alert history {es} index connector - -preview::[] - -{kib} offers a preconfigured index connector to facilitate indexing active alert -data into {es}. - -To use this connector, set -<> to `true`. - -When you subsequently create rules, you can use the -`Alert history Elasticsearch index (preconfigured)` connector. - -[role="screenshot"] -image::images/pre-configured-alert-history-connector.png[Select pre-configured alert history connectors] - -Documents are indexed using a preconfigured schema that captures the -<> available for the rule. -By default, these documents are indexed into the `kibana-alert-history-default` -index, but you can specify a different index. Index names must start with -`kibana-alert-history-` to take advantage of the preconfigured alert history -index template. - -[IMPORTANT] -==== -* To write documents to the preconfigured index, you must have `all` or `write` -privileges to the `kibana-alert-history-*` indices. Refer to -<> for more information. -* The `kibana-alert-history-*` indices are not configured to use ILM so they must -be maintained manually. If the index size grows large, consider using the -{ref}/docs-delete-by-query.html[delete by query] API to clean up older documents -in the index. -==== +Index connectors must have a name and an {es} index. +You can optionally choose a field that indicates when the document was indexed. [float] [[index-action-configuration]] === Test connectors -You can test connectors with the <> or -as you're creating or editing the connector in {kib}. For example: +You can test connectors as you're creating or editing the connector in {kib}. For example: [role="screenshot"] image::management/connectors/images/index-params-test.png[Index params test] diff --git a/docs/management/connectors/images/pre-configured-alert-history-connector.png b/docs/management/connectors/images/pre-configured-alert-history-connector.png index 98cfbd0f39f7b2ce3060564ac344f7ab4864008b..dd72a96a761c9d5f98914cf2d69a771d24cf7ec0 100644 GIT binary patch literal 152201 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 Qy#xG_mQ;{{iyM9TKe2p;f&c&j literal 163742 zcmeFY)mK|z)HVtfDHLn50!1o7i@RG(3&q_bxCD21S||ldTb$q&w?c4t4-O#&ceen+ z`SN?uIOpP}f55r;E|QUvHTK?fuQ}&4?O72jN-_j^RCs7;XausKKdPajVUD0aO^>lr z|A4Yev(V7+C4f>=DzZ{i^eQfnmOwiTG_=nV@!B{#>iy*D`oDilT4%}QHsikH3yLGw z+iHeAmJL!d#m6M`)zxs?&&J?))BM61v)!$>SL3q#hKc!77ByDcZpmo4>( z#lYd4&7pc8hs~<47-W3Af#?>V;8-noB+63n?p7JmqBV{C&4#NO2hRzc!yq4`91Wg{ z=*7hkpCMi`HUVgS2^r}l#RR_$W5G;gerwJoS%P!?D&W0JQ->wkOD(m7V)o}dOD?h- z-5)v|+B>@~Zv=i7js~VdtXNLDrdIa8n16dmtWS#jJDXnX>r4f`fVhDPPo5x%jL-aa zLYM4nZIIv(4t(67yJnw~SC$07`U3;nNBt@wFbt14j6;qgrN{A`IJT=U=Et4&#)%gn zELVOKw$d}0TCe(VJrF;JMcpn4p!$XhIzA}3g%^bXUWYD8n;FBr^=`GOSoN^^e@)h zeIxARoM!Z&dEryGOEkF}uXlJMjN{MmeFMJT4s*UF$ufQ;MZ0YymC!|RO3xMdT%oF) zz{zNiIwnXvP$$h9`#^{{=J5Or(--y*sSdsm0?X4M+eMF+Ri#553g}AuKJ~=Zx0Pn* zQPT!pOS%_C?Ji-rp?iJ}NUEbd-NV*Rc;x`p+L8d?+ha?J5`3kBMMV8}@4qt#WyloG z7B&zRe|Eh!3s|eL#NPz*%^|>n(?qb%cK#bHdAp|`Xtupdrkj6rbY5qgvFVUZ2h+r^ zEKi;3)HH-Ob@#9Ie-#c1yrA}}99JM0oDx10_Wy+>JIR+@91G%;j}S3q32RK5c3CHE1GL08J|~>AblM|~(@@VPo)G#sU%rnL z`*&eheB66#^(FY?)%(ww&%*z_+Wt)b>f@U}d~~~Fp@iuA8;LWOQZLOC9$`0$ zGrKrt##fGZmZLPUM+;#_?Q~1G7XldZ#-IN(c|D!^Li&N+1TX80iqedd;736Mq#DsO z&9BdsFZD>omH-M28^rk}iNpfLyAe#^47+5y(4R&8QLbdV{FyELLhWVYm#XwC(By{( zg`JoFDr#EXsxDf1T5{^om?7%S+OxTC2HTb6>bWE4?v)I%$QOzmzw&=2{;K^2>Zj-z zTN@!I_|DfI{#&v?YbduQXHr#3{XlKuEei|ioiB4Q^OLyEx8>>!#eQ0s!6!0giew^W z2?K&;5d&)RG|WsI4uwrwYK2-Ffi_gtKO5roq{KcoE8k|ysk>`f6rX5V6>Amo7XY;U z3#GNd8fHa`DlA$o+9H`As-?__YlA(EAdaw0f8<|D)ut&R6 zjqu8*Xr;VQ5rtr-=<_K9#j{O#U8y2_av}NlIca%k)=#TTs%P|s^epsztAwkss`;u7 zt7EJ3ZM1FZCJv_C-AdeMguR6a-OhInpqGDa{|rv9@3K#qPBfQX1027kx6&GwYm@^H zQx=%~8v=d?l-=RoO5gfo*9E7&FKH(YjmFL=xRSPxKB8@>Q5815{{{~$$VxLwU3Tj% z4WkKrB;6zZQulIM&|mp-2o z-vPyf)YB*U^F?y_WWuA<1sc3hZLLJC%3O01niNIye+TUn856b3&ddCu(PaYj)(*cM zp3Ljbw>0?HMb7We`HHcMj*AtEI&fA!=Za#80;i+m`3NjsMohw|-j~d0A9*zhZx@03 zCL+OH(`FZDHPPN{W*eQyu$75@d88t8eh0?J?_Gg!jOL?63QF;ER;Fq00)F+g$2b%hSz;nAQE~i_n3gl@TpIz zeb+{%?aZwStqD)(Y=>sYY9~tvo%GD7Z?98ckM;fS)BNR`!ul>eyzZK&ngA_CfeiP+JmrmnAuC;R-Qr3g z@NMNF_!^V-{nsT;CF|k5RAl{Fy@(4A;x}Rk5q~m)AbP_0wZ5Z9wkI}EY3CU%Qtsn? zY%^nd@*D>tg(HU~UJnH?nN2(0C1FJL8byETtHtbrY$EmFc`uTRxHJW;%~Iy8x+l`f zaVYNjX)=b>7KA(9dgdsJEV->5lD`fOBuxp!{mw&RVy+)H_EP1OK_W<`w-Q2Y*jGft zI{<-^gXKytdd0AoIQwksnR9>i*M%nnY#kK1_RsuG!1r=t6!ZglUp#U0E@GTGTbbqe`F- zIgY3p@dbPX_#LoZs;`a|CGv9+-L2ni%LK{=j<6gTw?pL@wpwAw(`WX(l0$8`o|lK> ztsJ+R_a>V%J-z43{Tb;2=_g-LE#|f1<&edW)_IyCx)-F*T`yqeXxJ<%$+&I1G-xX7 z=$Y*ZN{f=48zz=-H$%))OA;oRl&V^D=mnwohZX)uha1>vzP0VE6qDN2IFk5eL72)x z4R!d?EO5%6!8^8(UW79*uK8X|Jh}nBl5o8vMvk!kENTeJfCr+V(fjdU@O*VgRTP32 zI!!1K-4d)TGS`v3U2o8X0WD{csOat5YxEvIm#9UiJ*7@WD%(r}Zq0 zOKW&-ODd$D(VeOu-cJ%6B{_E+^IAzH`7Q9u!0DH_%iP5hr_Hp%1b*{6qiY*FTPQH< zUn(mhEvTH6XED-hsW@!Su<8-N`#A7Ogy4FjarN8EjMjG!pGx%2x=@*VevQyo!H;(cGSe^y`Gg+qVK-5djMrXT z-!|j@ALu4{oTA{g9V{agBP)M=+}o?UwUjJ33Q4;*T&u9Fw;)k3)++7uPN}mVqpLvh zuJ+Oe$_ZyA|3i)nJdK?t*y%RUP0#U!P%Sa$V2c@p>KVHi{f>cwsA)+-MmJ`uMMOx zS>!fa@2^DG%M84`gZf0_j;(1zd!tgXHo2bu<9d%^IciaLiN`Tf-yP^B4*uj%R7lQM zlKEc++ryJ8VxqZA^=nV$v))-x@0J{FRE)(WX=)o*XCI1Rhd(sRxJb#|(wfWV@Cno6 zcRjMoX;)>7WjeQ4)ZG^EwzeA&Yl_F{{^i8s2k=^EKy(i! z2gueqZVYinQruhYOqSX6&t#SXC#}^diq`Ke5fA}a3Kp(1B@DaQ_vNj3VXFDqsfhH_QQ7q`L z!ul8N?*evS!0pw-qO|3rKayXc7x>#v>|m(QUp+ltY#6`t?rOJu#hs{G@L_R%pRtgqxclf?9-Jba&O1(3bKFkt z;`zBFZ2F0?|I_-S>%+$0s=3xrYoa2my&faYuOXpCVyV*=g+A8#N=(U8vvhVv8il6X zBti-`j;@ttp{lJ{`afE#G z`FP=3)6GC}p62c&$iC-Xyq1&fphAXtXX@;wo2w-fJk;^^318udyhO&Yf+tkTnxTzsMU^$UCO zm7uCeR(e?&*`e4(T#W*Yy$aV`t8sApM-PN0ZIR4?r7*x8-pPq(M)@JXP(bz5cZYm=71&mVOIW}AV5INtf zE4e#u3?m@gkl^yDYE4bp_ch5d_VHRP$Pvc8jMEM*^f|#Ve|@8;sTzBxRTKovi4nE7 zgrqu%`vn$xd+tyN5M?Z%)s<_0;DDcxOlr-?YvXf5jXb04J^JW#hSAk>mGhN3eyvwS z0UTTqCBc;=DF_rSA@KTu(sKAp+z83OBgtuB(4u1k@RND1H;X!5-9P+e4 zqn(FuHiMOBrpCQv&tre3*r7;cESyeBzVEO_#dv>AW)&{29*#Mp@Z9Q$*v4CMJ2v&j z`^Kv?fs;oPhK(K`+VPxsEAp`qO2@@8$K!Cw~TZS;<9;%&5hD?DqVyhI@Wc zT4?w{}nOS-Cz8{CPT~!OT)*4#M!H05}2mDuDOBQ4xnjFLy57 z7Bp5A7_jCwO7-|$0f%74PDOraCZ?#s%k`2k(Aie=?W}N_WCnS;8k3r{Y5n9xqm;G# zLek|;9`SQ|q(A@dYu8;i0Y-fW#6#R}!(vuEQXr@+h7Q!Zbv+GFF480+($4)pTPyL_ z;b{&)V3q1iASyDLB~C=eDv7dtv|zla`61dtbo2It(Q7{Qh&ok5ksw z-*VaR;%9MnFlmNe?rp)Pq?{P;YMZI=1{pQ(qwjH~hbOvFIRc1NxgE@w!YiA!(c-mJ zh--PTWk1ALyWp_kd+3kY%m~B=QwuE2Z7JtIh8nm=XI?q}41W3`A1{c*h;X08yC635 zI`01C8)yvY|Ainr58=Q|`N&XxnTx&bxo8i42Hu2RXLa$4WOWBzr=V;a-V*hKuxaO{ zZ=1}-w9?GBKJW>6Sa|o%JY*WDid$gOMc*#nDA3S&+9LY+Y4qv~a)DaCdFHXJ;Gxd4rUdOSf04RnmeNy?wIoW9P2^ zBCrx5Di1d{T^w$g4$>H(Z%P!y21gPDGxRwl}c1de~jPT@0_U#Ni z{(pK0UdwFW?1<0$6jbhvH!5%k=sFdjNLl+)t1@ggmhZEp=P7ukl~dI|vb5!D$FkPY zvjR3?k+e4>o+kc!UA%DY*1XW;yT{OPHqeOoj=y_`|M|(i2A}7_+~LrFQHw6{B*ObX zlnC;KqbbhCbtm4n$0`FJ&CV3AzLCG|VnOSZ~jad+38_gjyLD(p^|hS=MW z8?PFRigM3C;e1z+J+A0n=y@m}0M}JTEczhGCX81v&ScnPM}UPt>}O@@KzVRSibh$! zzjTTJl}M9Cx;zdZ^-ASNfvWwA}VNQV+X%0T~p2MvrZ0?-n zxl!^|<1AZBp-PL9r=Es$I%ut(E(YFli5Q&`r{DY8p-N?@v=0s(E;w~gc!zmWCbbdc|9h=?dhqQrJ=7sM=vHLA~ zh#nLycslgruhh|S_)I#$vdEK6Uimaw{0krJ>zSqGlcu$J1DnM=deD5T(@jN1JC8-f z{T&Vj2LRVC)jM$Hhy4k@JQ>ur+_Lw?9F&QE;kh@a8Vj+Eruw7=?aBzag6&np)AP>I zOBK$j_->fLSf!8g@dpa?sL{ZeY|D5i^8D@e_G)8v?W?DT?8>`f1u`-qa~eFm8r|0u zCAxl^({AT1iK6>N4pwEfq=u$SVW={}c32c#4D+uwgyezvdHDr>JEH}d=Jz%hoPRw8 zQ5U@b)ODIvAv-eAa=n-47T}c^qMT@O)q1qHbVj25L-}z!jn8M_oM*sT#%AI*+?axt z%)4<}8={g>Z9R5oKH#{ZjSHuu=F@5pIeo|G_ z5kMBbV!yd&c4atR*k{Xs0gG~f;br&>yB)2d1u33cAoqi2jN~lFIz|6yUy2-_;nd4q zRk(?>?0bSUgJfB?Gf_=Ylsq2k?K#}BeUDkQD9IMv(1P@IKt_#hqR!u8$z4UI@%##C zFU^ihzpeDVSGl)m!VFy97k=!Ah&Q7$tOMfOdTvkvEGWQxUTg8m@W}3!4&_5^XAKS^ zNEZ`ZPX6n6HgVBl_|xq1e=Sp3$<#dwDeP~7)7_w*c$?i zN`4{2=iM9YM_JOyrf@&3VOVfhtlzQSpryImI*zzE5TuE+f#wvBwEglNzgo(%P zb-t=Bk*o{0>}9SM`D;HtML^9z*X78=>aZSb6wuA8TUph$=MFW5ie9umMoiXKFqVx4 zdcMS(yE63o<$akeo9Di(bx`tWb$(cMzUiW)>q`wZn_TDQ@OMGKuA;v0el^7Zbr>kW zSK`3)_fH!J;hJ`U`!r=nfHk2Flwb2ab)&pm%a15$w*;)T*FYv2+bow=2%U8MU4+3h zdU;_M!`Li6u1n$lP2TBEu}HJn!Dh0+VP~?? zY_evSk$`H=PZCuIAJ-o5r`B7JWke38*p_UU>+hB?pEc;}0gqR@H{kWIp=QN^=CH-p zjj%KRqvG=EV(s!OenXqx+v~$tNE2NECt|~UbNAYN18Nk=S8X%RyIb0t4xKiz2S-y7 zmjIeGuc2@GM6~{Q$57IOoZd?-d4#<;>_PqWnEq$1SdY_l zaX;}tNcT`{DPb3V*VgcK&`zMN3}$|J%@!%|8?8{`^f*h zvH$-wpWvNt&%Pd3qn0@dI}ujtM?W6+*zwde<>Hy|e!xvkXg@9Qxs!1ORlWMHA$XlS zogPNSawA+C|MMR`(6?y8PV{Uy4QPZ}9S5elc0&OCeUmuw{~i>`#!$lnwSy!3S}UUWF2?<2^U^>oFBX2ZAN% zeOa%D$`pShn?AXB(|H#>c^R5Q%Lm!8`t}fcNGl~Zh*?G1Zf0p6QGsv&ZRg|Q5ERys z@Pga9M4|+zjn%yTw^>P8haUgqxr7+YOWMNkIU1vAY-;D7k(}eY8K7339u~hN))!lq zOg-359a50miMivtvzarlkN>+^LC3_?Y{PDuYtxymOS24LUaj86Rp!`$lJR@xp(Rmc zf|>f2N(b`O4j zID|mM0HD7v#~eFZmp>a}vD2vj2;`-v2TMT}CbIJyy}z3@eQ?h=eq`=^#IKWgNoCaF zR(P-7%>t~MBNmKwH4}cY|D^drc$Dufvu7frb7n3gsjVU=D!f-WC^}E^NJPO*orH#d zzTEqw1nwPtC3>X|+OtvLlgcPoA4(R)k~tG$`qn|=6XI<4uKsdg)bn||5ozttQ!~5ZrC9{J}-+eEfx%eJk{WdYW{SAA2u?tZ;jKnPb;9bP`pxIdcQau6z zmVXG1h5>y1HqUgG#lxDy)r`v{B^ox9l?Gt#bRkI3jVvRvdYyI04R9nnEz)I8eA^rG zz;G@}kIa|>cAvP&Z(()v!tl=m39-Wscnr$**dwfJq)jM`qR|dW8?^yE@_h5J2)Tzz zs;?T=%_wlU(ql4r>CrS3woWb@Dg2bZMGWZB63-OBz-P$P^PtK?3s%5P0FhP1$5$l8 z?`PImBo(;lrO;I?yi{hXUDD;|r504D6>(6`3%hq8PPQX^SmdJ+=^M$B55ecC>XMR6 zD>E+VNOJh83vPP-Q#nsjvb*nX$)4Qm7Utp)Y=%BavLtBVc>;UXlt-9n?l~%#HZP3J zS$`%f&j3^oqG4|BIZN!9Rjj7jc#zVgVRSPSld8ECUBGmrXvmABedjD_MdiQJk-Y%F z2Wt#A;Pm_hoPs1>g3Y-S3!XHR8Trcn zy1_St+Q}R7z#~?&ziH)JcWx_t{oo0^^Z~bLg5(c1l39Y)Q9(`}UNKQEQMkfcxRH3q z72k6{!0VN8fZmn%$5im;Hr20(H6n4JW?OXijI#iH?Cupy=Ls3J7rD65fhs08B{(EL`iR!#Ti9y3BiZB&LZ^hz3cb?fNfjntd|fLMh)+!X*1Za&a* z#4hPFO7{Pag$$ZguYG!GGsK@4Vi}#2$h1G#V~&h>dm_50s@FgK>j8a$w&?o0iX?Me z1p%WE9ZUlyF0J>G*5l5IUq&Oaf8Sq)mne= zW3Gf#(qb=_!HK~XL-tZ}8xqxtDZZk-Mk#yu{@)CDRk`wsRJWzo!&k6WspkncOr$;dQ_@SpegV@c)`Hv@>s1#O0{lNwvP5eas&&^% zdA?4`Z*}?(q8-+@F2_wLo26vQytN<8RxCW&U+W)<-?`HD?k2fF71Ki{x?qTs$iA_b zu0{O!+R#1KF}$10O;ZGFB0e;&?`VOVW$tIYFSX@h)rn^t4w&x5y;FzGRIJ`8Ry!^Z z?=>USEh=#_}n!rKAuGyzkxdtm;1%``OYGV(6*b!E2lS z!=K%)zub;5oSs1!_u?}RRz95< zg8Rg&StKtA%$f#64jGz*oGc*2VSCz^tf7Yayw!bFGB&;Xoe_GoDh4ia!fT;F-@0WGv)wBCfA_Ro1H}(08&HdWNJ)E%+ z+$aq}bYGgXmMf|}{o1lSj?&!fShCBj=RzmwJb`z9_Y~`8h9aQqX}#jA=K~has1ac; zCHES34jo`x$IRWepMfG_FyQal99F>HCB?l+8>*|TtOJwhXttZJ5o;q#*IYyDbtqA6 zMfS%U9fu~)-k$Fh$z7z{&Nz{v2my=F{SQI>_9-ybTPUE$J5NqO!|X8!q}$l+6CBWn z5_l&@*&QDNJpk;!8LS(>?Evg>);|{VVqOVE=8c3RtZ$6Zr;_{(sddfy`qrYNsF4~+JEs#OpcFoq>BJ{Ue{xNHftgEQX>xW0>-2yt zU5QO{{WWq?@b1_^z^!|*_ipLCyibw-6El%Rm1~F#9=J<4q%@qw|K%`mY3tn;Lx>gG z?UiTDSTi}V*uiZk4xWG*a_$K(5!r!g4@+2(FOA2Jn`z-fILpb|@zt(l(uhRHc1Bz% zk%KmB0DD!UwWLs}U(4f_gk-=w%sA+_N^^Hu+Z@%>w+Hgi7(cqtWIpjNJ(`q1I7SVF zp8Dn6&ipm$*i5x~rFkPE&>M*y#jWf?P` z!#cBxFWxBLi+zVJfV373Ds!27zZh^0nRACa1+Fr?PdB(1pTM5hq=4JBjr`My1t;oX z@NVI`!tDi;U5B?ROEQpplB(>lA)v$m`ZxQIzNcFi3qsdr2IryCuT;jc=Gt@zvyeSn zV+xys8qJ6q0g2;KYv$lQ_e4wP^CZQ>MA5;sHL`2mfvK2v1WV>QKcf;WY&r$Q25tv- z4-n{?eTGRWaYGDV@Yzj4kqmnF>Njcg0L^5ryiDdRp9-Ix?s@0I0$%Jmlfjaep|E@{68eBKMBMPbRwx8(LBfSK~a)mHt`*B=+TimS3TS6rZucLK|bTPdL>Qt_RmN3>V0yDMK&&+^6$Dq zyE%I!cQX~r*wpj(wT7Y2(s;_o?IDXHX$!XH8|_|`j}NQg##e%B;0}$L?cn_M6k{c! z^)9*j8b?@vW$wT$V>pwoklV)vBH8`C=8FYViJ)nh%^R$Z4v`cGW43v} z4{f+b>&!Y83AOg|F#gfKT{q-7d!obLc%Ojt${*wE{B)nnF^Wgk`Pt_*3jw}GFsqE_ zkjqQjOXOnUEeC!5G@Vh6UH#=P@+;uc*i@58z%(oLYD+$m{Ve&^)&iL8S8q`nIGZQ@ zr9iLR912M;k@245>PErnzUL2>AqJ+&BVmU(&Bc4rf< zS`J=bHUY-X``&`6;xl+Q;l`Blk0FffyD0-}dc*nlE#hW~%j7)7&q2QCgN9v8SLRsu zoXzOg`@7!jC|!olYprnt3of46L$u2VkCO0%{N#WbnA=2{beeFXz25D1qjOP^6*((w zh~#^`8RqzYpNXOMHjP<@-I^%@SKz(E^?TO5HCW%RzDvJ*!cN?GuV)e$OHznCoQa{r zG^K&vio|IjL__SSD(>5pLRva|oBu*mk;kvNbbk*uK&Ta}2g+66bdo}s2@<T_KXe(vZjNNOJ=`A})Y(^H%8S9sK<{ zml^Fj^ccm*!frO5?a7G;F157>1SziK)yzBhvQa_aZRwvxqo+eWBR>11{u{NQtmraNzdAq- zLCHBW2hXeeO|*aR9`CkqO=%nPkT8ncw%oXAIT;X8+1X8E52D6hJ9Iho053t{_!G<1 zt=^k{lwo~`StMF+jLGySF{MAJ;PoiADc($VO&F6}jut2rB`RXq0b8CZF-?M(q9}Q8 z&T1V4{|cRshITfpECY7^2G=4vEU^hvY?-ExKZ5viE^>+0#XfE$R&o;o$G&&JLCrOq z`!e<$G_DH0&vLgWr3Zu1wXbOLqTql0lSMBruE!1hj=xGn;}p+t^JtCBn>|$Qh?x%j z=c|C~tpl4a*9U2T0gVBkNf77yLHKdKYb%dgulTa2fd68jzAXO^rMB4PeE7@ogJ``G z6a~Q85|Tm|H$2r)MVQ6`9dIy`Li#tO#si8>hprmY0TQR9uW>hbv%;ktA}?1_))o%+ zI^zilI6KLs^nP3d<)mw0g7V5wgf29e2^++>v7%Fu{LQzPAQiJAi^)vwOs`A~z<0AAGzs+w4)5G$4u zGPB1sYF72w)xTwJ<^zs~Z0}iP_cgkn%U7N7%?bAoTm+SFjJKHa%gMZy37e}6aE`6L{2;~+F zDg_VE3ekP1UE*ju8ea>KWM;=QT94jD^X z{7J`)eH~w0afpfzM6bKyX$gaM=Q%PlVEMgp45ce|BCkZl>5;wKMR5lH93vz9qnxgx zd&Vt!^ZUC*9HTGuem;N4GUiAX=KPWIQ(i7Y0rp_W#owE9@afLtyHl)YsqoI*^nz?T z*fu(Z7Id=P4%sId6(ht_ZoTzzFfM57r|Ot~6w+8mAW*VdR@M>Cp?8{JzZ?dFAV!!x zhDWmyxc!375GDO~AI~{l5%BOllS1wj#xbias zQW|xnSNqFij;`-f#N^Z2(MBPYTj9gQW@PYv{?c$;a3aG#rR!wD7+|W<1b27z$>rO> z*^)<@?^!~+7`VSOuK6@q*}*zQPx`C_OMMQNQU&{~Y@z&BWM*z0&AYAGcYNw%XBK)p z-DMgXvHbfr`aB|frh=Xa$ae4h?fi@zvF3+Y#>{`T&4ZZY+uo3-{V67@w{UHf-Qf> zY`*AWQ_Hyp=VW~iGG?K9FozfaRcYOF|kS znV&M(K5M_ivC4TURW&~uHuCQ;#eY;_LQy@WaFGiIBX65yMnu8+m+OgZ8LHcW!TQjf|vR=&>*^jh>*&y)O$6$c5fq=P}63F zvDqqn;m|`|3iJCX$@Y>;Ietki`G(xa`R~tdWjz-MnT^gWXH_ibf5?4FThZjH$Q{|^ zgg>)hZcCm{+i$>w8B8%qN9i0N6*z;|RB2_6-p(5lXjTv8@!RX+5CKr<0#da<9TJPM ztY*y?KNr1d_#&AYun+Gp?y)MiF5>OVd@prl)LxB_MSVW!>Uo%Wbg{rx9YvcyEZ&$8 z1Lo7*FkASv{biWeU^NPqn{Uk6*Cv>}_)3xPh|15Yqc>7X_eL{nTo3BSLT_)O#U~d> zojK2FJIDmL<{P!8;eJQ$G8h74od2aGcP(&cer}af1*5e%X|Lb|ma>ZsiFC;E;Nebj zI3|4ZyIYwC-jMiS@taN>&p8^*(9_X!+c!m%Ut3=vd+P4RpnFK}u9akx9Jm^`4f7v76Yj=9ztyLrIK=q)yJo78f<@vP zQpENz^t=j4=X;O)2#l4Bx^ zZ9RLZxM2a+s`|vl+u&&EKDE@QmYd_|k0J==d{IPk@I_v77A=7eR{4|ayKD(1rBNy+DJFc~mT*&q&Q{>Qx6Ekt`#f)r_^z?hi`DYr8Z>jG{%Z*?5NY)*hop(?9l$X4iJ7f zH*rp3H1tO*&26bqy%1}owKZEPSfNPG^2u*oAlR-}AAeA@@3&QhZn*knl~ekOPw7$u z^`t7AVk??uN>vm=3lL_CpZZRP5$6^-N08dzbvCwJDaYYubY(v~#iF?!z~uzT8kaJ? zh-@@uPs^g6p5w5U3NzUE$8{jV9Ihh7YDXRQ`TPM`RInp-a89aIj~LDhD5SpT%)^1W zeTO&f_PZOjZv;Q$Ai}WH%bPOwJYra+S3>(79l%nC;%;|@7UvaCew8C;kVm=kGFEg0PB729JGA(jhA=h= z;9F|WM*~qm8ullmagvm8{5;)BByscB%W)QIJvoZ4zzzFJWmnUi%kOiAY!!To0=h!d z2oM2_Mg>Tgy|!zl&qdjlw-XJocGZg^}WgnydzBLNA|7tM;z|%mQkAv zdx*YzoC@?UQi7K+e!^v-n`_HISzE1hXgby^9Z(i_(2Siv(`df>zBuldM&r`=9P@1q4;o`AR75y* zq}wHFJc0QW%7=Tkx0Z)fv*{tes5X&z$61yKO=thzmU(`$KNl+a^QLWXKs=GfqHxjv zu*(L3h8j4Af*8C#CPVjxwhP50H@cUh7f}x8PrJ8MuUm5wPE(w*-$rO5X;2rt#h+`^ ztGDBWG^&-Mu9a~+dc%pOa*GRx@%&ZWaq3E^0i0VX)8IA4zA|u@r-joQ@44h&CMOK? z*&{jVq^f@v&|#ti=4XkLnZplMMZ8C&Sppkw1hZ#WA_`|T^hVHOo)HCwqfsJ7-@|4r z6+=B*ywODuIE2!7X2gZ^=En8pI-o|06?KT~lH%L<`j3i(_X$tTqT@sdC%h|jJMElg zh+^^3=Dk*bR@E4Xe&Tnvz)!8V9_x`1g-<8@+s6n^WF;gz0&8*d)n2dmO3>^9K>Vd4 z&d~)QlL8EDraqEd@6KJueG%PmN#X@sh$zoDxJTR1XcK+MD|0*W3v1ocn93rxa|*@T zK2UB!05eu+|El(_VP+om%yvIN?&7~V)zG5OjHV)LTr}YFBpF@qoU6O zkryWA9kut_R6LEr7P_#397C!^8q|hICa~~#jg>sXp8?xVI-jlfJLjSQ2!p_<0vAAp z^_DmqbLLZ}E57->x*bhE+v!s|p1E}i4NI3a*qJ4_TR9mPr)Ksm=EAsSTAwMErg6ts zHif=~UFU6RU~_F8DW{q-LvqEen}*q}Tt*Zxxn#=RZGx&o6ptR32AU<_=O4DOLYKzn}zFd9Q`_lypxsMZhuL zs9`wp>6K>>rQtISf`h%=rgI9iKj7RdjSr&)C3W5it}=TXca7dYO<*Gq-5mQ{FmfyE%^W&oJ2eqkYWu2R{>hwnsIzbq&;LBrbbglsjjYKU4`k-E4eh91@M&BONIGwC ziE(d!s}e8oBJpGn=fZ6omMfn>GeT2MlIL5?=8s50=6tH8H>$K1%BVT;2OL(DC<*eP zsGPNo$B0UW%@GfIN?6TbYlursxYXx`(m*D@VSM2)T+74wq$)dw6!8>?J-H+LmSR{m zq2`a%w^@xCmyZoK6S`P>bc^y_+~IF666r1jxB%lzJS&?MReyn+!(E9xoy%L+OSPd- znJ0J!C^Gn~CroE;$-uLLBVi3i9)oO1jW7A|;O-oz)=dcrE?f!l@&1SlF45LPC&y2e z1fy4JG-}}ogEg>W!$fe4#&mO38Go*NwDiaCN{v#pNmoI(*Wfm#7(qDVW7t5QmTl=-;1!?QJpm+9a2KGVF{k&k~BDc^q((?Clt;P8T# z>P-BJ<%Ws*ZYksf2AIp?|~dU`mo9^!r1cEs-N9cGShO^#2WD|}s^-R^c3Xpl;6t*(hj%x^Aq znH&U)!Wou&U!yx^MvY$bt$CF)UtwS5Ai!6bsFYeQ6PcrVP<0**vkQXX3a^&gz|Iha zaobIeEf6vJ&I*hKdC)j`tkScX;CUd0`7LvL$YvAyY+Z|0T;Fcm_bWAfO4MQ>rcP(( z;*JL{hpVVTVl1OKJCYsNKje|*jP$t!}Yjh>!s!z1>)4u(Za3Xn$e7^P?I zJ~=KJnB8%#DRmxem0Wn0)s&Vg7wN57psgq`A>q1fFip}{L!*$8o3FN4C4MKVJ`SHVzp^H_0mB=!zQ$TDh& zLzxSg&b8j1Egs-2`afO(Ci0;Bs*Z~pi1DRD?M!ead%@7dih(Sxq@$O)&{ShUXR`GQ z=Fg3eetaVrS6J5D{Q=|B|9Yg{Q42I#rPUy;enPPw#31Z&=gZl4Yxnw7KqmGQaUPTaDBh#kyPmJ~ z)!hGtp)#?UDytTm&P=-+xf#8^=W2*Pcooh{LTbb-5U9}_PZJI=W%@5D$LukwV)Sa5 zva8VW9FEu2ByGGm^r%(X+gmc*cizzG4e}&;&}nV3C(U0DqIzr9y2N1A3`WU=MZ2o#gMhGEh8jM@PAE65sO6Bl4Esq5L(1J+U+JOMhA-3Eui50wzb|?*r*D>RCjQgG23xn72~&8 zKBQKm-);3eTWuYmaaL-^$o~c zbW>Ht*;fwHK0f4mt%IpoqRvw45;s?>aIi)9VJhbRmvxH0@FRNa)jhfXHXjY;N@VET ztDi6hncwV}V%4Widgk^BHmlEj0k%lSKqIT&#Yq#Zr!|XGg;oEI_esnYGBL>PYZ>7m zuKaka#g5nYiox{07B^Mcs2P3@<>kaILa?6luXRPN@ZTysm}|W+mb-oj;gbVSzXZmi?)T@x2TnyW z+_-$~c=>wnqvukSMlQ|ra$6Oe#ENRnw?m*C`~AjnL^r0!L%C?UX$g#q>p*L(t3LX^ zC{=_MJIQ^w473NL%M)xqg$l&Yns6UII*RLYJvs5(Z#)H3(r(WM_d|-iMgb?Pulhom zH9#avTeZFqPTs!J28yrHkke9;}+2Ly^@{$67;qg*8eo zQ|1X9+gmNC~d zeE8Is6FS}KN=+V{Vj_GRUxGqsHXTZdp=gT_PRmc?ed#KD1YV?;QlJ8y5tw~!VJ7sg zogzT7P^(>Vlz?$wh`FZZnNnKqQ1UT`lDyx2WiB;7i^gYmqm?S_(~oCaK)Z-{{R9d? zDq59d^M$@i9;2S73E$ba)ZQko$;%&y3XVv}wjTp%&&U=?$FV8*I|QcSvz+8bO~MZp zvEPnb?VEI)D;**YJ?wfDox>4snTTim02_b|-krgeZ1&^hO^}q1tvExXhOK}QZNZvb zC0e9{??KeFmwLuRqH~hD2;3)$WMT?+{TgEpNhR@_Gdwr%dO0BOdpBV6zx-FVn(hClia(&XhJ3^_A)AL3l9b+=>T2Z}JTNZC?j8k?N=bInbNu8KWd8|n^ zFZ3p_ubM4S=Q$rEHBOe4yMfZBvupCe@~l8`(H zgq|A1PZ!!emvq9f&4!s8cd?Nz4?cu@>NuwRK`u06TzqH-z@gTW9e98S<5Ry<_~?5U z`3HbF!+{gyi^5fVw*oA1=4)dy3O-N*U(Z=7@&FyA&&e^@jn z?C#(q8nwvnV{#y{u-hl2?p>8jq71ZnH+pm45Y`K8yBbt%mbIA3bJ7!a94$$&b$qEx zfxCjV(rH1pKXN0-@nxK`#JAFpB9ktysg80L+G827ENa7Ssag+mcaBw*eX<2mccc~Y zYl$c&na_Se-D~SCpQ7xVxzDe!j-XsxA9uZ!HJ(+Nq!2EQZ~vuj)bUhPx#}P`K}flh zhVh)-m4hOwERP?*&yBP6*(#rSjK*c|K7RpF2=Xz;75O4@tNUEfzo|BtxO{tTXOJbl zz-N3BsSG(W_x|;%gDCY7f%#b_gXEBsG6HK^y#NTyWQN&lejJ&It@QWq zCbWTfDnE|*eCC!)U9<2b?q99UG+hIYJk|d!;eYaZP5Ah9+}`+y&KxYCjX;g1MF+9Yzt#Oe$j;ktMki zufiqQ$0<2@vblzF{U9ex6?skf_jc=7vUyE5fI{=FKiNo!`9K10SRb*weOo!l;AoNTMzV>wtzV4AX-ebEjT-GibEwNAAK4oFRU^CwtlpVCDx zfK^|&8w$PeSgewn?I1GOru7Sz{G6%Q5Q=KJE>XTc{vL9+v9l={9_yL#IqPicBU^;9B9lj5^xq<3q*WG3>2J*!ryh|d}gOozomFqG=qX>BPbyM)x#yz>y) zN<%40!uPklFY9Kn#MX7@I~7Uw2To2RvAe}k{Mu6g^9l0x0S}AD^0lyfge2`VK%k{t z3@2!@==r?}VnEiI754|Qt$qIu0Gq$XFNt;rIR6CI4tP(y52=QisLfITA0izF117(fFflqm+2fIMKD ziuA)_a#3Rg{~v!pAFvb;OQ~=E@`pkT zJ69CmX`@g#2vAk0xN)$5$;&_({&EBQekyS(U17fC07q-OIg4htICCcCQ*Y;#*Vpao zTS&rIScyf7N>!h3bf2KL*RJ%Me+Tq;TbF+ajV6O;#qyih_ljtxxFxbafL4+8q^}`v z9kv4f^~rVLs<+kGM54d|$Fk99>_thX^n~oz8N)ys<`UI|tt6~*J8n{b2rk%FCzw$y z-F`FYG07T88^j6XS8+^Pl(0>z9M;d0dP{5fg?;9I?x>zibD0jg&XwKP=Co&H%by#* z+KKR{yb8L3EPn@eQ{hg*1ZxvGV32K9BF!n!^l}S;; zsKoE6DJ0!Gyw-j^;W+`zl-N_QgEAJZ*cMdS9gXl;q(EiE2=e-JvA}jMHK#F|Jhbt} z{j2FRHkq3zZ+A{tyLerD^`6K}*ReMr-co&8AIEyr*O&%QY3WlCXq5(^e`G#|x#JXt zc8UUfY4nVku=MYw)JR`T6ILvUgZ9Ix;Gzf0=IP@Jxmu)~Aua%ofV^kyJ5QyJxgr|i zaLwu2Uwvr#WU%2x?kc96-g-}^s?i2S7<6mI(9SHY*>;9dnRxScb-3nE@q5I)87e?d zzZv$_uezL2w`VdCQWeSE4l-|hD0EoJH6R>*=eO)951ZuCf+jcVp;sJ9H}chp7^Jhz zE^+IV3}cQUx&kwOV_}F`?!9|Vnjb==*K`v$R{lzEkHNXF&AF#jZAgQvayi+@A5fMo zp)vS0{OVopTzk!Z*ljVvy-SBX-Z;huzh(C!fbg2b1o!QrM5O@HY?t0BYphd$w&8i@X% zOv%+{PRjGgH$RVOPkBzXo$cg!Q~Y#aamh#G0D{v;`*;As|7wsineAA;NNYm%#qh4w z>?2AR=@x(t8jXeYEloE#ugN^-`j#u3uByoB8h6!eFx7jNxiOfY&d4QsAXYUK;J^q0 z{JmwEzeK-1Ls22i9|N(r41pTVq#xW1caru5w-S2ht!WMq=)rntvBFDc}h(mr%~IH0rU`P~-uyONU3+={>y~ zEmKLX0s0E~*{lkC{v=VYAws!X0Ds4!2nIY8L)?zL<#boZ1{$Sh&W^901@(E1`o9a1 z9RsLR3iTA+xe43$MfIBuB6j7u7@H$1g^_57t1lP3^t76uHNRvq8aa|WTIkKvFH1V{ zSpaODP6i)PG>vC?Zk9TZO%Md0i(jugH4!50uksH@ASb7>5YAWEGq9nOq8`w!nRS@MeV?pUH_3r zG#6)Qjrj!fjt6Z9m%p9FZdqT$qnlr9W`n2Mq0=fAr`yNAScJ~8_i_@Bv|WN6zA|%0 z!FGu$1i|gU)0I6fwNzl%5HZ4YGmoBTRe)z~K=SK~bU)Dg@aK5C&zwyiO1Q>BzY2No zh;7fj&U9TQT~UU%E@iL&c|eVI4b#sRqpB1!*L7ttXhUHVz+bVh@mROJEvP$qaA(9u zbgzHkpIoX&r0!sv*j#TkA~{rD)VSN*4OUDLo|2wwz0X1-e=pUu^Y*0H_C_0Xc0$ba z-68M5(aa1FYlF4?N3*-`-!AvliSF+k-kE1Eean2XvJ~YGaL$3%@!vK~*S^?g1w>tei7io9P_= zn#)ZIv^)m4Cn`0CC%TvU^-PXrhVn4p&2$oet6^Mnsg8*7tRc1ag>aZkJYyrX&WHvf zRSrYO{W(u7=K?xaP7msDf7yFiEKLi{Rq|#CXs=R7FO&}LJRQcHv50FGI0LpF+E%aP zX4=*t$g=a`>RC4#*W`%b71Q!MZ9>o4od>7zTXojujnE69p;sb@fb#ebz3*uC+IR)z z*(xV#IV?;43`M1N$TxVHeSilZ$|Mbf0;mX2r^a2FCq38YEmjE9)og5IW698)n%7QY}uh&bd|J)ZrSTg|TWuVO?kr0V$eO9jVt-=1LWq?Z$uOItg#W(ovG3^U0b-M&Y6lf5#v!M57`Wp5DX{+Lwsu@$j%89hDBHS`puZa27Pd>1_c^$mIUe{+I>w-BBH2M8(&% z2%6E+x`6w>Gy%O>e$&LG*SIXL1SB+a^I}k0{uKd(oM)tcIri{@YVJ5xb)|ZYoj2Yl zp)Z3E<>bN&=i6GF)4(Y{S`DiAIS>doE^l-qzja^Xx_C~(0lO9Cta;e+cnUpUYIO~Q zddh^3F?5*b__i0XtA9F<_5`HB=uVp?Va0|c|!j$8g8xhQ_avD_Gn$7el2{S)hZ%!9ge`q7? z)ioCK;qYPPqF*5EVVU_EjN!=JzZLl8OT8GF#LRr=eB$LI8@9u4rhlLX&p z4U(P^O@G0d<5w1a1h3@Obbyt$SLGV)Mh`f_=V0Z64=Yg@J%bk!`o_z zyBL6o4iHe9LDH6NddBSg3%p}CDCiq;8#&56-1dBmAK$Bwg`=MvXAp-@qMs16Eoc1F7&husH8Hggk?) zPo!2#n94EMTk8Bh$QeLONeDHKW67R-&(S*Q+7R+Dg%GMJ7_er6bW&K<6|^4pkuV1!;W;34+Ki%*94$GCHJXx6Hfb)(1{@hb@ykYzsNoF(hmnc{~x#fp;` zkI0niH!PU2r##DVkKKm;nDZ4~yCteFvv~DQD@Jto|*3 z*mXaB?st1z0L|8VKgu-i<;dw8X6BLYw+EY5{9>nobx*4=0QQ|$4?dSYZ@ePpSKc(1 zM=3evelAk&la}D+UwN~vxAy}&33R=;P^frQXh#VGYZ;}gQV+%74^irhkY7Lg-ErhU zBIp;BU(%kC^`@1KQ~Ae>0_|lzD*d%d*=6A*wHIll>9#;8XR}CoYaMX$>JW6Q(^pvL zHtop7=Oko8$wn`IMJ%i}Ysp2Z1k>7W0XCfRCRbAe>L4RcRHE-M&AQT7tLb&+viQes z;m(Tuw_Ks$(3UfhDSvqr6CBN|Uj{KQxCn3q+1pygZbBLgV;ztwU2YW2TocwIX#zeG;&q&=Z4FWTH&P&jD7sJq#NF-Ik5{fKE0PxxyG({z*Wz;Hy=pi zPjMZba9%VI`SFAwb7^MnKZOBnAi0!K)Zl}{i(lynDE2>cl_ZwzQ+7RYE7dA9B6y%t zrv>P~ z+&MD!2&;My$|b3QW!(du0={4r`g!DpKozxFYjx*J;MCWo!>3a}K6vg?nPytIM=*iz z%QDePa_g3vi){i-g(<$(ob~(qS`u!MrF@&<`JEnOyx+kThyH$AN;b*$4rZUoGYi-g zW~fcZS%|_w>xDqsyCie03C1s)pR$8`{>b)?5oUW!I~wk9OlZ58hV0R~Y)(397YCS+ z@YtMnl67B6Xd8T*{*qKjwZ(A;jr(2k@|CCquom1dRw#M^{b*E@*ECMA3qUyN>deNQ z+t9`3wVt2n>A(ncP%}l@wjgWP(>Plw=*bOStPKf+Rau{wgF^&*;!P{ zo7+J;B#8E089=+1>Hw&w4#URIMSHg9(n<-L<19;x*KX@j~t37cMG`wMfP-0wTgl9!}}#Kiz!9cmUNh_;Q=Ej3ZUeFiVv-DAHTCDbDXKmHGu8z99qYS`=4#+p&auBTg?>P#PbZlf*;U9$>qed$bGf7CB7wBSZ^6R?{?Xx4nY13 zGi2RjB73Kt9BOK)HW8Ht9DFxHr*wD2eqthvX>cN|?;;-1j$%j?=|w17l9>%OjcYf4Ie#I_*7jJsAob5!wd$ zM0YBpFd1D-CNyaDF-sbd-SUEM|Kr0AQ^x-+PA`_76u4AU=bEb=dtSf%0GE+gENU0LJ^zBrG=g{>@e* z{^|`$ZUH;tcmH-;8{o7QxG(=AJO`qq)kE3sd{hqh#=o8R$N6c?1=>&V|J`R6c%SHa z;1ltugP;FH&kh_MdVbpfUg&@CDDa^C_t8CHTeAOe)~H53s#2#*cy9^roG^DVInM$D zER4}OB&852FUJ3|8^D7A98Od4$Xfk$G^&lxRHw^QjPalQaq2H%%tgRorwj2O$7&Uw*sl)-xzYElP@$mxI38r+%c9r99+-0rTRndUB zdZ0&siyH|zE<^x)AAY;*Z2Iine%=e}8|CcFc*yY5s_9-N~S z08-orh<1g~r-1B84H|3`x6q}TJ?CQy7QAtGfL}lebr_FPRe#++Vf}OuRCglYG$Dhv zZOne_nU`Ps84D14RREWH6&M$YIwk-(Cz@(^nK)F5-!A|2@x(IM$3+pSkF(sT9j_`$i|I8ZykqKYwB5=uUWir)QB#mUSQVcc#aaZ--Qu0Qf81X!GYSwI?UU0|CHV?b=d+sAGcI zdcMi&I-o8el04bd&U*eKLSck)DuZ>Y0(1S<6;=~JJS(8&W;w(bHb7Io-S=!D0QPY% z=*1X&6^I=dw<@WeL4KPL^+?bnaT4%XF7t$w0ya1DgXK~c=5Br>}>CE0^jF1gi zxnwBAFi?EjJPH2mMy}yNqBHS$QDD07n(n(x*5eBRuktwcV=$9b0>1}h)o%gd9YWq4Q2O`$?R z@t$i-@<5GgDowYKW4NrGKKjGf+GqLwKT{U&^O&*&OAUl69lPVk+Y((`eqS}z{!|Fy z+2V0oTp<*vRjXeF&L=F?k0e6&v8M|;P2a$eu6P06hRe;oFkh`txxeR=_dZm1XCdx* zu0o;3p9uJM_;kGN zYkb_d;5u6BAl>;$9^1DI-xUcMV?egsZe{fkr#hHPpdCEZ_cM(sd}rVA+>>S(>3;0m z5g#(aLhS%*W`<{ZgKkVA5-3EOd^So>9V(t@R@T;dY`rPt_+vymp_Z4_)j_iCh-d-4ibfVB(%DlIPly3nK^3SQ{E>EEw;YobD;pK%q` zb`0o5k0q(355KLBXDWZ2VbX+KdrfZQ&H`}o-170WQxVqAv`Uolgo70;CxEVgABUe3$hxP3tzzi_e1@W3rmEtB-<7YttUlI+$&lKbOC)QEcqvoSGW^k%n`h z!t=7coGes1P~z+=#LcseK^WfT)G2YGuLd9TUw$xsvV%s&4Fq9Hms6Y*kT&#pP{n>Z zM`=s>eIGV=YwU}J&XvY94gkYLW~f>j)1-|yR~I|7L`u=8j20MTPp1)N9T*kJ1i49) zxDVO7yQ-b%nlgsh7}f9N7V@3q0rTLJMkBWFl)zBPQe`G@qkx7~IAW?H>@zOZI}d! zp5*@Yci>NwG^c;Wfh{QPCze_O`IiAosx1}pmNerU2cs4WG%iciMcfq zzh^_zQK@iePnMKVwDmKKvBtE3sLNDA;eGYa=N_T;&k1$BCUrmg6jXfhlH!2ysr6=M z8PVlv;`*~2c^g*buG`HDjuMTcbQVyI5;6 zeUpKM_#AbYR9`SyL5REl{zB%I;7Us<-9A;sw!U<{b@w=%3$4b}kpB}pzkx|^HO5&; zA1@Wn?rvmE%D8j*UPRwA_-(lQ(WFgNl zGi-d}r{w%ot(KA36xY?LU^E`RbtZhqYhvX&-SF%ulvXLCX?(+DX_F2TNoz2i2d-h% z$Xl3{^s14+49wF)q3G$Yb`pQMua0d%mY2ZtIC>yr`Cbre{sID{32dWlRqHXl#tGIF zbGV6Reat;B2)BA@|L5v}W$=KlM;canfOvF@efFXE*2`o2P18Aaa~*$sBqzO<`3ACN z)q3yu5~>&dENq(A{;2Vcwszz{H$C4%p@<0SO=(6Tgw5{cy{J9i?W=n|VjdBEx9mRm zpPc)~T1d)H_3gmDCeh3JTmE7aed4<3UUBm5H`vTIbUrMJlG4~{G&cN3^JS~1Y$~Mh z`FR~#oJgFR$}l{29CKkwceqa@bRc<@5p};(kuS%z#6`csx4PPTrG5_NfiEE|q>tb+@9lx&3s#oB-qxB6jx;vQ#W*_xohnLi~Yn zyn2x}O|A9*pNex%nmcFuPJ^;ro_O?bl)pP>m%z~&KkW!P3xL*zC5kP}?4IO@g1_TL z3Uu+^S@QLOFf=pqtdZH7rLo}&kznyc9Rn^B83G?Wo*EQS=A#Xq*S0D{Y>SE4vv!0R z)AAG^^XZqgtE7na?GIJ9cp6%$gfk(Z5=C;HD)U|orzO+s=J)cajBQB53`URw9$r(^ zkBzHGeepewOPJ~~G_QoCeZppSRIZ5?gC56mAGzt7t$R2O$+;fUC~Ti})JyOq5=qKV zDi=5Kx=$%LgqHPa`AjXcu;7xj#|Ce>u+ocnCm7NPh*6KfQc4*QMZmRhC`UWx#}{rK<>=?73FO%S=ak*p$x+fS6ff>?Xqq z6*lX00@2oV=BMkR&sMecbPG{xXC)oH(+~%L%jf7=CSXc zbXg08(tLY(u(rKrH!ye#J#?(8dLQ=Y&L%gne#)%nk9bOk(GM|SY$rvLpK^tLPw*Hg zjUbmyPVH>6FuUoyOh(s)`TuXo1DY8W`AE&L80lUnmjdYo*8Zofl-c zWPb$Dc{p0$+xu{+5+S}@c-4Df0^z{~8M#V~FOB~mP^Z_{;lN_qYKq30cWymCxVK#C zdQq&ASCZ$W>e<{@sFz33%Ya6`v32p&;>n-aNE!Hw@d3y!C3o9m9~yy;;8v6xj17J! zeK7rX3Ab8igzwuTy?)E)ej<(MFAxSg;`;rK_eZj^@oYl}jJq5U|zS1GpYp z6;?0VHQGoV1$6FX@Y= zf?Vl}mIedhrwVh~*2F@W4R&7#3E+w@YxhilfKpxoq7)q>e3qeYuq;-rhV6W^cK^?_?|k~pH$io z=X^iH$C|S7k4DE=&iL~fOOY-XHqN!r7T?X89kYmV?Ey^R@-;h-xiBVP_1>q|)*@Jz zQF+f79RN?c#_#sZ`e=PEkaLFVSKDQN61o$VXLDBF1Wr|r`^M0`)nAfsJ5!j{^%!mo zxTVzeH4pUihyj-)4$S zgP{zS*Z_;gFQ+BfHSoz_Bb5HJUO|{X?vv zRr+DNif#JCk6vTzn!*VRw?Vgt-dA|K*V<3u`qZedXA(s-TvahseZ)%dMYQ@-xnT8X ziMo+M?~=#verW#E58~LoF=X&G%LEO~^xcg~SZ7K3ReIoVW>q0nhSeL8Z{{V_KE$o+ur0fj;dvawXnyd$!~1*{|JrNAnHW8z9|$!8LAK;i3nU23o2tSnf~YewoP zseTK+{lRsnyY5S8>lK&vF9)CMsy-XIQ#KWdHoGs&16gf>Ct7#0H-ID_yB&N z?306?APbL%Wr7RE8~J2Tj#5(40`-fiQQj4uUg16+nKzdr9B*nW2JxBRcHdi^3sQ`` zv|s4dJ#Lms5VN20^%9t^n)K`Vu=!M8d~ zq44LP>!UpP`-djMb@&bJ(AMVKdpHRhLmK$Hpaa<59bl+w`Xc$1$Gy=P3;t2BEn#K9c%|1sX&3kde)qdur+#Uc(aXp;TU6nyi>^_o#)l`HqM#RdI-gfze zjxr(D0`cfVbuZYqjjMoR^yBM#$554_O8rf*A1>Rdl*aFrDs6W)WaXZjHk|nVNb$II z^Ds1c?9lI*YQUB7erTl-{$PEb`-=B_-1ENJ*K9R*hIB-SN9@|H`~)q2%E+2^i-=XL zy-&O}+&abR2N3Pxbfo=J#Dud~%Ik^pLbW6*#~CwZwSO<5L~}eRXqycyk(LvZJ#_1g zRY`sP@%o;C`w{k!9B=T^j#XhmF))g@+HsBvbO0}6Blc1_V~&lzu6w4e;Nb?ko^jH^ zR6Ah+Gj;Lvv~^dsDqqwawoZ`tZ`{~$5ZM8Xe!DY$_AP{JI^$r^wwh`2!-3z?Vq!CW z%X-VM;=#(By{;k~ouOOmqRq$lTdvr_%)+g*yFzwV)-f~wU56{)xwcC%J(D-5fUu^l z`Lw9UuW(@T=PmUo^*$_Hg|-7N@()`*H*)O<&2E+`-G5)QZ^87Z62VZ3mGQQ{2{J*y z*b?Nj_TFdX4l2*$pvOTsYOBr!@B87{uJF!C+7J%;JkyPLy%V!b&W&m~y;G7k=idgP z{+DwJcAkgUllk8!3>uA411U}V3~-1@sq4jwo& zirbf4fX;BsUDV$i)fuoRh95yBg3rvECiH#WyG$CVjSd>sC)Zw?qJ)(lgrf*0S{%o< zdK0}?KDjJ;R>EPb`rtYK`LFVGZDv4;Nk;zZX;~5FBhI&3J0pB&;}@y!E4JzEPfDcp zc~0bEH_AgcR$|uDmGv#{B6737l_XfMC07{B%W;Q4O!!RQpld~G_d=Ppotm?2>;;S0 zN&8az9G>DeVJ931QM+{KMXa;Pet0&X@*s!0K7Ns!_gg|r7Ij1~?r&G&U@+?pXWu(g z-wpn3JwB`7akAgJy9$+cguKnUML1~aUj3jfAzX42c*K7g+6OpgARx!&9sajUcPT;FpK?Q(R~*S7Tgx6I|d+uP}^H)vURALlnq{%L`qw-d*&9RBgx zxL>niJhFAYzIlnz7AKYJZhG{&tCrk?rB-$x<>+GUe1(xIKrio9-D$?sYOx48e zf(8Pwbc_4o(oHA*a-2o14C?L6aL4s|kTVOaaGBs7ndzm(6yUs2;bDIOw!R;G3<0KU)Q)z;KzD9Cujc>xhF@D4#!Yr46q7h z7?ZCYy>I=*h)AD$cL~lq#Ir*`z25OX)=T)>HjD~FezHDP{T<88B{5*iG8D-T5DgZj zeKr~Y(rbKa9|WYpca2hlEskKil=he5jmO>%nlri-iGqdoQPr91_7L3J!&=;3ropc_ za%t>F^+)$>GnWQEuLLR)+A*PU;*d+fv`FQ@AVNMA)Sk{AANdn@Wn}D?CQuD>*({c7>s9J6m_YqR z4_!?ACiEGP>{P>C!#u?rU1DOqIiH4I2#>rs-N1)1ll^4_X9@Q&)0IxfYKG2@Xg+Ie zYlec|AufrfGv%R_5YE4@3Si8StY0F!0&CKvTOd?{(Bsw6$N@mF-HrrA{2UOj<0vcP zg;RN;ZltZ<+cWtdT{x+-ZZ!ymEV8MbsWf^EF+lT~G_<2k>jsU7A|_y7a;TM5{rqcc zqYBHVU&l9$s)OyXGx#~+KMD6GtV?OkmP28VTEb1w_9`4#7v--lW1GxvC%%ZW#jV}# zj^?x=hdx>yJzCtZ2t|fs>`f+G*r8%|1y!h9lH9!NpV$8}(C6ai&l&(H&OAr@VhI1|Hw_X1D}yzC=;irako`{?@c`iZJbuby_iwbNXxa14Z~F(N=ie^n6TmN0 z{_kb}e{nY*mp(KATm!T(+4X?r70U5_=i4I z&@%rM==0-z%f?%iQh$BUWV>!W0(Hj?W-7zK@b5=yj$4AGONRK_=a-PbY9GASeL*F{ zZJ(qMhdGYsqbn~8l%hX>gth*u82t~=OvB-Fv}9TD!@-p@Z~=*Jrb=}weU=0GeHZG% zM_mVI%i&OJ$uN>vU{`#?<1(m6OpoBuDNVO^g4^N-)%$S%*pdM-#a}-c@FYk7agnsQ z)WN=7$i5WK#lYRKcvWQ4F+bI}8WkB-44YyH=ylTlpgc?hEN`?XE1n|3u~t=|1RN@8 z<@Kk0@;?-q&v}87HhY}TQFgc4UN@K*TuUu@UESV(U3lyrytEBJs@?b-AyDuDIP3#nSv`lL81Y1xm7V<=sG>Q5BBmHN=@;$#m$ju}q~Y>QI5VJV=Sv z;vLb^#>HPvWdGFZ^!Ftcec>Ye#3RqtJHh5xKXYn){tB$%2PrTz@_w5HJH)GY{m73S ze;;@$d-bNqhV0YJZPd55Q*W~XtMip)-o}Q9la4A5vEKvCtpLPIfB9jiO(Oli7+j#* zSyDo(^!oWPq^8*}xy)kt(p_dPQ|>kBSQqre)?Yr zKPtJ=w$lFT^!D}}D=RDPUU%Yb{22R!;n4kKWJePJ_SPRn`Z`F_iuU+uNkBDU1BTY7eIYv=ot&Z*W?En{SbV_lijMz~SHS_+*!L)P4 znrj{L7-&i!BT9MRHzf$!PZG1eo_tr|lOXH~@Lk^e6-;`~BJrM--tTD#>~bj-pD-)s zJsb4l^YOwhjs|OS&$Tz=?vjJPlHN++S!BLnieQm>TGbIRa~j>rJN)PM5_J2jWyVTf zqVTJrtG6B|z{#iP_MOJdOX!c9>fw@+4IfVrX3X`@=SjlzQ+jD=c?}je*#!j3nqoOW z0P=?s9LHCHS24yI;9Eq(lKo)I#dm86b$oR8P^G`#&>AuVx)eg_iRGc1Zp+WlH}ezk z+n#nf$_7Gy&8*Y_3&rOeKq478`>p6Jz4dh`KaJwLOt9|wOxx+f&bW|0a@bak>d&F~ z!9Cd}eQKLrz=Q-oA2Jkhf=6bFTB+9y6DT355{}xwuQI2MlN~V$oTd$lw$u5xE;U(1 z;pfk#EfKS0Q6~;N-i1 zMl^v(e2sK8h2w2vaZSMfZ85INBBu*+8^|8 zwE}>({*(#;&eL|WJB$@Kqmp;CC3M5@j)X15wau}f@U0-bdh)fi_aClj)I7Tne2TZu zT7EO^N5|Poo{_erzNXqWI-EmQuC0+O&GmoIlVnNGb23?_Sgy5fj+!steu-j73)5NA zC)6*o<+9aoivY???o@MMXon`pz{48SaGN_F1fRM>IQX1#`Ulk9&& z)uVeProKlNN58^~Q2N%%x*1+|)e(mO4}0$!)zr4W@u~fZ;|t!hgOyVUBxOS=8a$5B>U>P_@qKC^auRa@8mW%^Oy; z$yt%Qa>@oh*g@2q1T$0#f&+9|NB2itDsQbFt0t@RlUTz%HDt?bqbCGrJ1M@s`;p3< zo66hPi9r~9lD}6MnBRhSpUmVkNAyJbCWa&&G$SYP{$(kjK2u)pdux zR5vVAMeE?``VsbPW0l)@kT^0IoK z+Jj1qH5)|CKJU=huFc7=qhjPno#)U4FeQbGLmqdPuD5K|xU6ZrGU8VkkG&37ifh+h z4Nt*j2n);`AJZiPc4@B?0|PaNShgm-Z&H(q2$?{Xs@-Ut*_E)?Id1^egs3 zmMvQR0l|F~jLC9Wdex6$kN33Tc*1SAP{zCT;Nf0q47@Ey*T&~yPOzyHLagrsDe-DK zScs)k66JcS=p+O6+o(0Ip_7;f1QnmAvC2Ij)3K(Y~W5J=(HVg=zc8zgh z^gl$19zO2Xswqyr*;m?rV=aFA2MH_dYdqj~Cd5GL)+pSudeuMRWjggn@0a>Bv-35Z zeDrokPh<|do-H{o^&6Y)Z$_|ARHrnhHeicvxf&ObYT&DUR~CV>#p>RW2pt#6jJ`2i ziGKt$x9Z6CY`AFZ6&{t#^fj$qQL# zJRc#O%){Mqr0rIjFmmXdES4RxR{FumC)snIWoMrX@$~2@XMG(uRDs`Tu=Lnn{9-yX zf_592aMtXRWT6bBH)+K09lpaJj2e2z%X5iKj4Ju>2RnyeCtkTAFdD}yaJaJCXnGCL z6m`@Ih!Jqk>PcfzT*sFdzt?nB7GnLW%m5yExACyCb}4IoqI8`>cyyI%nZUX?wPhal zd;@09DrD_=RXDH{k<8r6vqF~0s9(GKchwy6FQLDUPvX-hP3QSkZnaET5_HRINUw2xtS z?n7bCuAr!M?qXtYSkG270cBhWSL1}SZw)?ekCKUF@+gOx=>hY)FAsv&en@i<@q|*s z1PIUl-C!`xfmXHkIO{030V_^6pKi*kluTc+Ji4`MARf(2Qj%;pv-E(#w2q4~vuDZm z>%nGg{aJluUQ9VcQ7U5*D|N`8I)3$H+2&rbKR*;dDP@#aHN~yj_Qe1b>hvn!^I%IMggbqc*MH7f$H3RXPEHAb{fi zN4+L&$J7lv$6a4NUr37RerpP6^qnzJ_p9&`NbmaO`L?!MW7mU|BlQvRv2X{6lzU(W zjvr8zXg5x_5YkuqB)_4y%fzS#-H19DTU`HH#3E;yvZliK6aW4%Rm7OL@6d888!wRA zY*2hDZd&g&NT&NUP)mJufh}h!8r&^z|a6ljh>tP#!CxRdFNio&|#4 z*A3AQ7$SDQbqUHv-fHn4SAWVKZ1czvoD=vVa+z<6Oi$q|>G0<#+8D6X3%gKZSO%gP5t9gRziswQL4 z?=slZkEYz>x5aPg7sCSuNY&2@5E@)9DAu$so{Def6<-_zacqpVMw@``WS>BXnu_xB z@c24OkqXi(3FhSF+cv<~LSnO0o5vPd5e8?pq@gDtu`W4b8_nqd`o!}Pwsa|mI-51> z6pQINgy^0U367s`bqIWH6MTDLRsvhMK5M;K82`gEHL`SeQovB~m~jB%h_%t{wgK7X z#5L&nRh{|9MZMvTkcQ>erEYZGqYk{{RuidL!{#n9MWHNftpL1ePb8Wej@l>#wxK^3 zDd|1LNv4K!R5*X~3?YuAHFYh3Xobf0(SgMFCSHnapqT z4C_>&j`)tk04Ut}F(L8#nZM245h>9qzL8|_77)YoP@QhQ$)cQe_>DVvZ;E6%W>d7x z-Rqqr5Vx5BqOb`9UE+Z5w?%s)Ye3^Pe~wi6{W(?Kj2Dh>p(gc*s*;##Sc!kB8?jB{s16CTzQ=q zFF@gX)rcE|oiv>BNW=M;mRfWYBn3;1hS6@rd7c?-luA$>W=>nGcJb_$sP`EP_o4$S zCeVcL6OYdxt8BjTkA_4WdSKqUiEk})5Xdt)l>vCG1+gf~JMm1zItUQ1a# z^`7|gHOKxAZ{6O<*c{-rLKazT!{8M_{`25W*ty}>VDbmxTsc&vI6#!aI@LV2fs3#= z${7pnM&tDx!bplNClYL7?)=mm2AmTWssie+lSq?~sHtVP5O)1d1?qJ=hhU-2X1p$H zQ^K&lVXjDZ#VHwteC?R@9AmLa<}fqUcmea(bCTNF<^1AyvSf1|M6zsc0lNgxhoe1I z^?RYZh4<^o zKEKTNsKS4*xjMn}lT)wKHAUlUmgu=B1*=qKrLU87Pe1J-bvo7+H0RfaJH&bY#OyCzD=S{34>e55h&RC zAydRLZ!C8n@O53M+NpC!H?om(={An;kH`~}+14C)-n5%vVFUFmI*#Weee~S&T*sRb zdaDT2N8tajRYM&GJIlUMUkkIT61HoW<}%1#!y+XzHLv`}(Jlq2jb<)&HB0 zZl|7!FKhGKI?LB|!&YwUelpq04i!ikrYO=|4bVEG&sIF7xY|uZYaF|umK9BSZ@T#f zZ$euH9kW@+>>4Un-)=NcAo7-m$^a{&WR+2_j%#sj_P{f@Mzg0~Pvu(Q3PGN!V?jve zn3Qw3&h~cuiG!g=^zsi<0kiS5#1(_zqY+I%A-DEc_)t-mWd>1NX=zyrefa611S>`_ zI}S}-N4%;Uw0B6M^drN?e%esc0Qobxi3l_M?sjmCnxA+OYIs7>C~ zr+@$)+pHW5az&#mVdF&pZ2U`Ro#lNJu6rC17Oy0mHrC^N>g?6uEJV_*>if&2SHq6^ z*)y0PJw^H*dw&!UBa6~vi2-=af%so|rO##Dv!QvpS-%>)QzXy`8l)Qhl_52M^e#|Y z%#F~7YODt4!V}i6yBb08j3XO6FQwrRz0JQMBuPT8OiH->@M-4Xhpt;S562837HRng z)cwRKMP^rc|Ed)E5F#l>V0OOeLsulEX(a<`f)k5;$3a5;eenD<@2DX8n(&+aktBj} zl93Sp;>)XEDpVOtSqeKL_SwsZoEo|MV%RRDf;H&|MJWQ~-S6zw)g9)IS=IvcpOsYx z6fv0jL(LZ_Iyg3tg)<^o&@I6g4&D^^((lG?7hBIS%ER>>4`sJkj`$`{5^zBu)UTAT zzfN$!XK)4Oq?)dUV@&|_4F8gX6sB-@EMExH{8}#^x{!c8n1euQ$H*j|qmF~fZyfI( z-XB5YXWHZ^ynj^}%RI)MWkFR7TWYE(L%gLcZGB^NH3}_!f}dIFJTfd*JS*!pcoEFN z?)zzykP(}Pqu0r~l)u;_pQr1CwYW-(0mFg?W_-2Bw|rtB4BW43*EU(%_YU}Q(EYuW zRTZ7}Y}t;q^iiE)$4vcB!p{wo<a}I zru0??k16<(m85GrQRNmmwJ2%27lLS~(6x3;C6NHs;!VHQ)IeNkzwB8N^4MOuOPGFd znSo)sGGWq;@%~b5=XVv8INZG4FZb`Tu&OFUjEI21z>5J0dIR}OITEhOKp9@``FMqt z>e74XbA*^8n2qwLw1h^I+e-YHf{63SqKM0_@E6p|1G3DI+3iyAXS1ujymO5`S3Gi) zy78%L5Ds$y0j*Ei@{OerYt#}TEw!m2(LSQikpritg92 z$nG9O@Ag(?9>2gAaS*)#4^#eqEqdgjP{cyM_yxmg5N|wqeMgnBo76+8G^|Vb&$$04 z3LtoTwJU9y$cCL;2xDY)%i=w8-nRux{3LIH9KF3k|Eo%28coT9o5n}`u8<}lQ`U+u zmuQD_<-vm0j7ZOR6t|`I7a-fEE9cIu5uq+8?_^&w6!8SS%1GVFa&GILTy87VsYYf` z@AnOBdoYO0p721r?7H8%_Y?DqE?2)H1rDD;9fm$W)aT{H9Aq@deK=>`LBo$!ZJ%D| z6BS*ahh0zDTOM6@64mPjX%n)tHYW&)6TkV`C|g(2=d}w^I@NMhg#GbWkycVE+I@kO z%h5C*uCH1yMM&zsDb)fTuVACVGyYu-d})S3WYU9B%^T!@nhf`t=BwKiXm;ybk%q$a zpKevRi&Sh$ROe0c(qN90`m&*yGSmioTF0vFM~cuFg&QB{^C>?olio<-_OM~ee3KAy zTv^K0=!RuPX~q|8y2I9v3WQ)AbXh(*NUxGtvmbpMMK-P?6VW4{`_t_}1Vh2}pwrmU zrlav5GnXIXpD)0Gmt@}{mMKUz`vXP1IfFm%J!KMhpu0$Yty6OR=3-<(IfKJ9%YoXR z%PkIWCZX0o&I52EXe#>JVb;<(cK3~N;N(}i=qa8~3YF%7wAJE%n?VWw_v$>5Bx{MC z)sWN7Lf8UG)3DoZD)^H!T~!@cN)oO#d~q1|t(2N;wqNvxcM6Z1y$yt)BOp!$R4&_^?R?bglY9QIKcB; zGcLcx2U1E<*nWsTSxi?7nEQ7AwbLaG2Ke8o4>}DH_f&Yjfy>EfZ-eQRI41q_HN$B0 z0mqd$)%lJdVj|wVj#OM0x5tZ6Ujxjrt_epsm?7W;Utvm~XdY!!S5fX)Wb~+$5nqpcB%yN2WSmX;<^or_=79wOBd6qpD=MHG~!#r&? z{eAxmU0!od5wBR75Zi4_@0{z(O^+$*T}iFO1lwa zsQii)q3f^|ou#_KIKRnU2kTi*S1KlBB^*_YYMTyxp-mBfDM#|Hug%!J{CFz`rhG4C zb+#&fk2}CvBAtwZKYu$@Z+yc0s4hTZh^%s<4~62gs1tIrQao`dUt{xzZ8YjgQB)#V z)=ePZ@A)m#>h(RA)S)b|aY67q1LXsr-(e z)#L4BlZlu0{|KP_NW%MrQBH`l%89IRy45~+_Z{LIObI*ELSzh9hw<02j^j-yeg->S zU&VjUw_W@C0`C$^fACCM0!eoQlRiW{?J#f!^5R}1#y%=G#NfPBn^lF4pU6Nh)4Fi- z*&oiW0?e#@GFHVmqh@*e`V3={O1gKznZ$>(DW1o3qR#w}z9qR*IG?`0Y{fW66)lmpd;4gss?k2}WHr0rYSLBShTCtoEx@?( zz>my*{6K&pBh>o#SThmfmr)h`r02<#kzK?Fz-x*fS@~yAAN%RMO;eYCp28j`BPaky=o;I(#+?WUds~fNw;Iu`Bv&1k=Z`7NmhrIUZ)8*#0R3j znwf3+BO8T3YfSwMHT+VM8i!`pi=mfA$I~X>Cn?aKCGpE;Yt1zdfnd`!xOGu5R~M*S zB|5muJQY_zrlztm^(2_W1$vAjgd&xI0NEAgZn@beF}w#UBqb(Q8wr2yetck>5UD8Y zqYASfURxWlc7{G0Qjml0&W2ie*sTOA6r6cooGcsHB0%+2I#6`qpK&*a0vg4cG4IGM zD>l=!gU3#;ZQtrV83y{+F1P8Ls+Kh}!Zzkt7| zx|m#Pvo16Mt!zn?31Bpl7!%(zY*o=H9G8{S@i2*Z3fD5R9&h29>BDu!yxA#2~G4^DI zN=p%B`>A@=269rt>1)7N3qRrO-HR~;t8Ae{?WDz=`(7ucxH$KnV`sz@gu0em>BHQj zI*U}5OWu}j`FUAj(N#x^^!$VoxmQ(BC> zYcU>Qcwdzo@3Ykuyo(MC;TGq99m8wI6h`ury+qKY`{h6uWaVZJjY`B{fz7GfM_lK3c=?^ystKa%z2&ox zY!A4fw<#dOv{K`fkdha-_-^`1_r-?r_hx&G)ps9q>IpCCAH}r2JbY8k!pw}FR2Qs= z-W%tRerrh*uA&2|2H_Z9?$h zoTH`ErsUA&ij>7YyiAQvqSp-z7AI;AOEi#@7L3)Iay8HMd$d@0MdgAg@J5ghk)G|<8zGIR3_2TW=XgqG&|;^lar6@;)I8w; zvoPBR(nT+WDM`9it zJNVKbI4|$mje5JbS?S*tAvf7xz=iWx-SOq0-JScQL$qM7v0VM& zuYECCA^dgyUtG89(7S)6yE~m0gQpu*aoQC?Yet~wV}?qrh7Zi68S)QWGmPpC`W##* zm({Cv0Yn|O2y`5}d*3>v^L0N-`&WK%RG?WU!B}Y)YR^rcHEy~W$(qy&5>9ZaKtgsD z9$f?*E;-xX{f1i!s_*Ozj&=FxI-^5sQzr3kRaylb%Jp)aNS zYJV*47gml1WOuA_RY#^wsv4`3R2Mj>D_rvxa8qvczJh83$w=d{JhT8tzB0tyRbUAE zYJZHx5d}a2s+NQV{B`-0O;10_3?ChCxXUmbS-cs65PrWRWKtkpHgs5o^%<8NA2Wdu z^{+384?EMkB;o3HY78RoSrZuXyP`5Bo8*sb`TGmX+IAI}T!X~_+P0qYpW)m@93@^} zcg-uama{eL`{uq5+~Ld$H;#|PM{vyLjVU-c$z7(T*6}pkn>bJFT?Z%pOo_tg{rA}w z{KSaQQwA}7G|HEj7t=jq9BM>^yoe+2+d6kcxs&9doDRIdgl1LRU=!E2(#JZ?SmK7F z(hQM&Pow-cT$uU<>KXWCcZi(3puuwDv9{(H0ZCdcz0Sd!b-|wlC|{Y$ubALwMMyV`$9Ghc#A zrl+grYw-IJR{gGT^ppH{E|aS0x%7YE?%z!!cPhlave#Uz_Yar-zk@rl*hoYE>DrZ3 z=-wMKI~&^nY~6pi^G$ou$nSMjsQ%$v>YG#0-z&<*@&6n&e}3?pE;vJ&(HQ&(vGOIh zSD-cJMhO;N{#+pc{HxQqdxaL{{%WZC|LNNQ$Dip(Daygo6~(UJoRkAVtiMYm-<*HP z`G%+8>&ukZStey5_PeJi9BhrM!w^m+EdT!Do64UFz3#WP)5w)c+t<3DN+NSVJ`}Rj zLY@b`_#ecL1%BZy`=gKF2eHWrDuVtV932tST4e%px#C$)`nP9^Qaj5ezgZged09De zJpo7?l{k3QKU&vmbrxtR8GF?kUkQHoHv#1(HmP$TZn1qyjSYBB8Z~nZbn*8KQLmtz z4#vC_$z7TSkeLgA6Gomn#{y|?zjReq*~$^)TN!jeOM*Ux3_`t%JC3#Q$ z+#6xit%A;&Ej(_xgLBI$bFG631wN`Kl&b#+MBujt%Lc$=1LXs8B|lHGbKq> zFHjz4`yzQyAM`4cgL?KTZcE=Ya&bd@#8MJuIJFX$Uk-B*trmPUFJ@5p$Dn@iS8R&s zNMenRiv{V`RUe$A<{wh~LFZpSvwH`)%S~w&N%uQ?9CSr-Sr3~SC-7T3`aC+KeAZ8F z{C6fU+weK?6@dgf;k@w{G-%o9n+5NZlYB1h_EAb}>rVo#MAw ze{0m6)`Ww6iF=y<7S3iSl1}0dSv|@~A$?*Z(vJIGql;|NZ6vTFC!@Jpn95{~IeHjQL+r_+L-> zBP{!0PdME){Qov5{CtKb{e}BX^|HaE5}0AVH)#nV%<{zAm;i;i+`6QWSuu79dQxqGI5ug*Il!{z=1tHgj=+UMG2bf=nV`|=0A#?#s`to%B%_=%!Xe` zmVQ_AuPxAjhRZtI;Oj4c2)`lJc?1}@mt{p~cL%z~4_B#5i`ZxwJy-1ksFvO}N5Gn* z!!hg>TlWaQkm74oR#v89Vq#LlrDrl+q-Pl>nkSpwl?%WZxd7*wj4AkQbN7FdQB?+5 zm2dY01G$v#^B{R?4;&@$mZ)FNzTvUa0JP-P>&hZ($Xf^@T#{qh0RRBQj}CU=Kpvj- z#h+L2$QA8P+tOEVs^sW)xR*5}K+QZ{{`cQ=A>;As56W#i7}j|ZzS}R)ogmL$`yDWz zSm*cPm1X7wtR^!eRNcUmLLv7>rof0fiTA{Y@BXcsYt>|RNFd|jdd)!kw;h6?WF82o zsr~DPYcxM~)A9=);jw5`8g2_W6T%J5jVgB&3>AmY??ftP#R~cMJmAnQ;Pc!-HT zP|sh#p>h(!-Nh&D?PC ziHZTF{SYa@ueZ5zPBl}Gx_lwIa;-Ob=nnXuK<^UesJJp*|G^DZgzOBtc%M8 zodsd8vXt8B0ljCsjOIk=CV@~BpOIK7~iyOLu z;@y`07jN(5w2d(U&@%BkT56vX7It1WlZy$vk?IP>+Vis=k%7XY^a6Y!ujX0OP4@d3 zYST-N!ar{O%4T~TXV=$ttV=@w)D|GBlg3x859X|{Kk5^fC@eGN_l>QHWq$_}{Ov>| z+xxTOac2pLh#00)ociAb%&-kfl`KNR3#;e2lu2+KATt#`MP`19Vae>Jt`v%_?@w~Q zoUfKu@~vv2Abhk=CpDLnEU( z5tOk%1pKaY)ybmrI{`rqXbNU2c`XJ5r`c_Metv>M!qdY#%f;(w01|{h25K+urvCj1 zh>Czna9z0EVTj$60TN){SEUDYdeHh7wNRD69z?5eHtD&6Pi;(5;aQFdW_nomj?2Qq zb5980ofzuR)zn};-rD{AZn9Al4yQg3@~rlO*PcR03{N}d0Glr zfFXLVqusBm%S}iF6tc>_kh0>ft4-BL}me6>w;W0 z?8ZtAPE-DuThalJ_L}oYrhJ8RI<buXP`YAc`0s&stkIi@EGZ!wZ#yBqt!=0JP= z;3QH>^s?1}0>A>&XFtFdC9HnBieCDNY!LyfA*>&4;rs%RrsxKcF3wcaOPcSE; z8ON;&t^<#6d7xRWZ=LLWd|+_! zZ=$evNrCu;ukXYsU<bnQ2*vY3%wlmp! zG1>WeK2#+%^in~;JcSw2qINf1DFv60CS!`5aAOD=g`uYiVy_A*q)UUx9@+AD3nDtJ z``^0(f|>U6qk*pg51jpu*=5o0O}U1h3KJ$~q(P@TwFkh}*XM^uv}$rrD(rNu$j{jI zN)ZR;U+wVPr^|^;C(_;=$ukFl?%OFXBVY=YPC5D)8hI?s(7c2MI^UDDVhSnS(B=@4 z44kxtitkT7k+5WKh~cdX)G(7IV^Sk!=lN6G`e$=AYuuEa*Sf`+7LU$tb%I_s(<(9W zhw?$z*utl`!Q>lfb3O18$)eYumd&tgLD(w)W5XIP!~K^XJ(jyU}Jk9~6!cUHdMfOJVM4=Jo(_Bq~CZ-AT!7^3=)_ z>Cp7fnDfR&UFCIuUc}qS1^e4w6Q-$FMF2b;AN@n*SCh+~!IzmsQia(djLr*3Pd#Px*Mb7J-dqRpYpAqK|L@T9a+@|zYU@i=hMva_Z_d3K+4;D z8YfEA;;FX<#t8X+cUsCbk9!!y@O6Vg3ur-ur#BMYZ`jWm4j2(QC5*SsZ)1f*4p{ zeRugRlHS&FXCgBGHBE-ut_+4b%Lg{Npjo5D7us0Eatd7iSeB$_f@k#PgG(I$Bww$v zLORInYJBavOkt;9tdE)yaAKkS>L8uO63FIWph-dx;>rBYm66UdKS0H9J7 zaP{8wTfF%p;A*(&XI=~AHf#3yL*O$I92#p=0+FQRBzaT6+uv1GhiiF}eGtt)XVOrp z2OCyMIX1VenTN*{?kowX`=xS|Z1P!F6@$XeH0WFwhh~uzM9q5vr;WVHo^OTQU2+dF zoi@E8Zctlh+!}IP3l<;7AaZ`isnHH?(n2IsUTmGUlyKPDqNAFn zFu7W`S$ZXj8%)$z0+?a}t5G}GI@i09htpZvvJCDZN{NXZCL5l8z9)o@TSYsco=^xN#1C~#4hkB*Q9q-m7ig@=;J_(DJWGC| zXC7WX>0rrSw|^yFQjb~0ueG@8$bxlL@xWWfBwnWMzSTX@fgCx?Uu=ZgZm$$)dt%ow zGyC8$zlV#LMzuk)xBSfWJoD6tZ@q-(WAzUNidP0p(~Fn0Y#ZXJ_*5iRl*A97J~bHw zly(;a(l-P=z)B(y>>V7xKXB@?Q>pqKZ%b)&lUq#Mj}1feZQb zVOyO+_(Pb1mK)61hF+{vvp9Jg(o!Gb4WOZG0g*nL@oSUb*h{p7yY0PIp1~BMW*RFi zv`*TwuJ9C&Vf+nbLjt<{>c1o6Kljl7g)hM7_DZ-qeCJ!HYPRBZo9Ip_8;L7U+-0IB zRk1Qp9bS$QW$3%#V+$&KzSbUOCFp9XJE1kj!h|~~9-4i+?$kUo!Z(5Rb@O%;XJ&3C zV-o1zUGvmPo(f-10{fhz;>r)y>~CB-dh5%!s+>Udcg}GDA}GU`y*qMK9z!R1>RuV0 z(1}U*d|N|S0nWaO$DQ!ilMjC;BD0lBxI9cuMYNYj1@#4qnGz#AvexL&r@3xSn*1Wb zCRnr2(;Jz{>_un{@5Q+^kt;6mmlp7SYL4wIjsqdFOp3ttoWfyZD+|&U&h!N7FrDVf zNkJg@rZ~?1_t}Dk{S*;Jh`QH=`vVenSX7-fA#1DZtHSP+0PX4NaalR4=nNY=dR3LT z)Ty4|jdnZ{(9*JmgM7v-_B)sAKTjX|p77^e5o6S?Z*tY8A3@Fnf=F%meat{6#WM9T zFd0r{xyY}qdH5ddl{DWk$7ZyLW5AO3bU#%6LZgr>(aaOGZy4CfG^x=Pyny087hO{*pX$5fLv`o-?nq%n(g zn^iLpnd0JK=oWc!G$;}pFApNiC0(;)lusg{9+y{472GT?sq;pGy;mB*hw zC#g&x!jR-J`Ohfh6vrm#Y(yOT{$%)xSf*8-+Wi!+rKLA!r6;TeBcC?!m&iZUQGFp- z+aApg)!t=((TDnR?)T)&MVdN!{$N) zPdN_8?AseI-xM9cF4ptgJaO9gN9X0D`|S}g?(nm8czrgW&04Es8G9Q#4r%`Kl$1}R z_$Ac13Vs3oNuVX;Z(@`)=UUG5v2o~RRjB3aYOu$CF%xDVdkY!2s_rpZC=uH`e*tmZ z>#nfSnZLj7OQVsJbi6Ajb8^OTvcy~$UA~7wV(;6AeZG}nn3T<;+f*_g`llOyy^xWe z8GDA)_S+fwRX&~6@4;uLwa#ytd;U=D=zxb#DJcHlAI|tcz1qu_IJT`I5r5CDO7cDB z+0%Qd%FGvC=$ZLH(bAtC@|lr;zX_`%!=VBx^6}Bp74RF}G~-0fwdu}Y&;Gp$KJ}gx zCN=f&$m74M^DZUj+_YBg20I6byhGVi86E5O;J=Lzzst`c&#NemNVj$zZ;F!c=w)VQ zjpZ7*iiWoSE=d4y=ec4}$ZH2k-M=1s-%V-o%Ab$<*SOg`>z|SF;;>ou&M@<(WR~H> zdGmkxrt{w}f!h&;Jo%?G!_5CFw>(L=*f^*Y11) zkMp|0HksycEdfl$$-ukiDS7mJ^mF>ro2B4!uB>?PRQ$e#oW9go7cM0S`L})jr)%$7 zB;CHe+(^j&hv9SS!V}PTWcMll>DsgV;BmftphY?VHgo}R@fv8mR|fWM|8(v3#sAk= z`RwBCON!82{-M_eJGbYWI`W1rjR1M)MXj81ZmF-cd2ec?TCqOoTMIe$*Ut^+2ON#} zR^6-Ql)By2^3?O`<%iO_e*dB06G6LnH+=rau?teV37fNY?rWIp07f^EW&bHno6HP+ zNG^DgiCj@NSou;|_NrCpa8pZ5>;3y?)!#cg=rJgP*5(g;Uzxl%BX;ZdJ0Az~7N#=- zJ_P<3(B*w_iEeH5Ra6X1^gYgW*b{0n`u^_0s}!cri!Aox%F8VeetWjB7w>D~DixCU zo|+K{+pF2@34Ua^GrMu2cl$nt{%4IXK*op~->4Zcw5A?_lxr4~W8kp5;>wHUMk$3~X%n<{c7Yl%#(=N)fODiu;h-5KX=Y){bPdYJJZM$OZW=VnWK{l-CZ!5#roz#{u zs(ep5KG2v=PAL>O7L!0 zy+g_8N=oIRek{Dwas+8Qf_7LFt~B=LRgnP)cTaU_EW9gnp3BK?`ofnQFxW=t6%AEv z-X4}}86UEew7yh}{133DWZFfukdny;ZhM^+p~BwV*8cNMiA$Bt4H{_;Ay2(0r+o7j z)FQ5V+Tck+wSKp&CI8fy>wDMC%>C?I$wy$*$Y3TPt5*N*xh~iUow(OW*vTy6M(i)2 zw;<7yzizPI<6k{70quE|uG72uQ;4eF8*OTO8K)g_9#jZ&;qIe(DCc zj+B=3OH1I!rqKFz$K#IdU)5CC>|PZ!o|yTW#zl*6;p9!~(P~(I?Ma zX%ai*t5D)h{%*dp?jl=aQDfbcCk5*$ zMF7TGw{B&_8X&&4lS)JcvntxdMulO!6QDRjAGg;q{Br+zWo}MWKj!db&==V(g%YWm z^l(LPJMzLq=MnvTK=JI%wX%axh~qPyc@q8;IOMID>!o=1rY2;(ZX1$P}+|N{s{w9S9s6S-xMnBS&kp(2eT?!t_{H8MFVca1|!U^ z)VB8%N9}qeolm=t*JsQOkzdFJ@$ptAs z>%m;+^!ndOO-EJFH*wJF4T>1pWsUTeEO+MPMm1E{om*>yN7}_CnjeQP#M7I(hcv=S zAq)hBrXGnsv3XRIW|mEMU52Wr?_4^ZO?q~dZJ$W*OgeoF>h7-pqCbi6*}iVu$SKT~ zEcj@^+XH?#Igy1@;waWJ2Z6<7mH2KAtr0%vUYIaV_Ld@|xUpPC@1(egGuzBG+!vZ1 z7iwRuK6b&Od77)P?%IqPlNaGIOv*RGH{m8gF;Dva<6Tm{N|s(vUE`v@YBcBBKwdHP zy+l*v?>`^RA2)8OVyPEIhF1Qn-v48Ht??r=qjwRKe!@fE`k3>)=~p@X#3n!6flDV1 z1+sdQIzJy}N_WloyncozW*8hLr}Np-Z9n;y%lfX*U|n=zCd)WvKFd zcJzs9Pa-p_E}6@D`NpEJMKd^Wu0|^VKnjgk5cPjCpieg2PsI-O{_5h6i9cf)al`lM zL4T2+PMo-PnVGyu(mk~hqM#?X3lO~_a%1}Gya+_bzY z$6l;{4&jc{DAbOB#1H(9%)VN~v+j0#c@#N`;@Cv)1v&bs_~^4D#Ib4R>?2Uu=*10( zCU*6wI&XwHJH!u<+eZYazXT)(i=P$y2~?Yf2=5mxnqu6Hn@I`Fv{_Ww&HpTk!KHonAo0~ z(0YwwM%9wsX%TBD01jFCCJ0LfkC}Jz+ukd3U2Y)$F9h=?-R363c&gO3TtfO5Ej!h{ zRV}|wD};=S*tY}uMvb)Rkw0DyWj>#kS>Iae-dAps18gJX{*1%5Sf!o^!d2QubioQb zvgUoM9D|!yrP(5=P{G{@MzK2KnCM7FVSRA!YoK$ySPpXa?E<0$TpsXv{>te%M?2td zxhi0aI?%7*R~3v}cJ6a`z+*H;V5>Dc)(~GeYv(MKw1lAlM?e)c{1W6yi4C~SWyY2z z^_3=R>Z|X`$^-`ka@tPl*Qenu%UQUL#k zX3Ur#ESWV%&nFa>B^A@txr`2a;cDTA>3xC?adCC}@HShRG48E_why0FO3&hQ)Pe1s zbJCDwFgZ+JIL;1!53@27{e`%i=hpOrOXRT$-zb^JkI?IDj%y|m$}+<&azW1diu<}X zqjyC;kApOg4z|&&;)OeRR9y>$X_6j2@zoJtj}P0TEdZzJ$cDEr2@JwcspI^W#$7a3 zo<(CzwyLo2$yP;3H*8A!j7N6Ma;M9G2H6+xU$XI&v7;G{DEvy=Yt8GFpL3(u1?7Ql z422tPPDi~ZUx5V|>om3K?LljPe6-FC%sixJ@a()d?Zm0Ok?Z&YU8CvI002E*mc`}v-$RTWZe7N7IXX1oD~!_hr3A>4T+g zrcJ;Rl!W^5^Zz7}o-Ztm#wkvioyb zvYKpCRt#y%5H!h}DF`%E&8$R1^ixv2zwkqW+lhkLk%wq60XM-z3Lzmxp$>}kR$8&7 zEvws^h@DT}<7EW{l&JdeacPy9nazE7E^nULXZp_B@fcM(lqTR+R0~OGs5P$x(`$C1JNZ97wL~-?x@agQ|_nXJ*uk6eY3X=Nt~v$ zey&+*={u$i=Xos%zP|lIOCciB_3wF28vH1EMMev*6{R)G9K?XvUe^NIpgU_RGZ(T| zkf_;PNH&|E#-q1R3)h`?DTx#Tz1viyxXi&VBKiQIXzNlsvFLQ1BXt6>0Kwi@C197!2vUdM1HV)^Ct?F$8|PoaBdSh|rRV z#5I2~)SUiUEIa#{xYZso>vq|lD_LMLRcIEpbDTRW%#GjVb*q4rJBU)Y>sLLx?=h^q zz7gB8vK5!lbV#cTHD~58=JJ}SU@8^w zIfOJS)lHd`;8$Hk`zkCx7h9nchcjAlqM|_5GXPO@s?bj6`0|Swwkf@pf9Cc61BY8y zpY)&0N@U}Rf2NcULeh7QQEgsWC$#Sdx$X;oD-BX{DY2~RdxkGMdZ<0<5B}1eg}glo$R}s z#!r`YJcFv2sX3N%(vs-s+8G|S?84yha?KZ--*=ih+$ihWR{Gs*F zgC;i)oUh0Z($PG>~&#& zaXu|i{s0=}j?wUe3Y5wl*;3d^1B>cmq}u0J{VMSE*THVU*(E+Dm+9Xxd=f;B=m{5i z7}H8k`=aopMtnD1;ESpmZ1!g~jDB`aOBm+VaqA zEA&|u=qWYev|2&DnD4=!d(`gMf0A5(C7}Z94<16FMT|E;1MA|T#uNLdjF@%jS`n^q zPuoW1p3!Ks3lF*VTuf$B29BN1D+PdyF}_1*twly?;w@=ch$t`JZsB%+jS!m0{X4Dv z>@2cBW|F3J=Me5`nCkgbyS{RXl-lN47rToP#>0zY@7DXEwZmzFXzh zs}`RYXh^wihJuzdHhMj1kUe7bnH^7{j#D(ks+5E4lOwa_;M_ zJ#udOty2G9R3QIlcNn-PlEWcdc_p@kU*ulYkDT%7UjRJeGFO6A(j(8&vX0EPYRfkT zhl`*ClAG9)BXLlgEaK7U3g-1fV+`_7g&(O4$irNZL!y-#w(>6rO4-N*^zA%~LVls1 zw4Kc%n>cH&lhxIJZC>KGvw`c-)23qpxGnCyI*rH4(5Sl4sWpeR!h>?QK(1JgRzt}4LiGX{L6>m0(?@_d@j90N_1E%s+# zwR8}Qer8bn2iQst;{x@x>;6X|O#you%8@zxmgXV|UpHl^x?k~e^7XUxKkUQEuU5zr zPMwV*R&~?(u)_y^>xL9!Fg!V?fm?841-a(eM^pV&2x{j2t9%Q>(BsV6I+5@Sb7 zIg7R2cQ-@18$-~ZZk~(#Y#J+d*+o-f0xX+qC`hH~-tQ{S#VLrE2Ca`oT7Vir80>p~_WW7#-g zFmPM~!n4c67CjQ*KS;X0x7wI85r61y-gqF#upksEz@PJYhzQJNnP%dCi}$g4lP}Np zBYT`#Tsg}?6s88~--#NTT?qtkKB$vaA7`3S?{)}{11`ZQ_$qlL(trOjiJO4Rr%DZm zG0gU?3|k;2v68MSM@~5gTG7io+|g`6+`crCXtOVqS3;r-R&Mo@)SJdMgpa@`_BSp7 zAYU!E$f6>CXwqCOW-vW{dpH{Q4Sx`awYJXK@#u5ok|GGNkUR-PJr?MBwsiyv3q$tf%IzWhg!FL;n=97zmTIEKX*AGJqaaGENtR#99YJY1~q%?mh zQq)XplEuPpTLg!~52`_atPJDcC{E0~bbBoH^Om=4Vhe1@y=v$+)n!tTqVB+e1oUL3 zx7`5Th`eEzVeM1e|7NGOr3B7zOH)>0Z`f!hg?@NR&I5mv%he?C&3?vQeV%as-28rL z4L@4IQiG2tZgPJ{(I-}G`*HMV6spI5tA0!I!ma@$9M&Z}eI(O68Ib2+(L5hLnU@u+ z2sgVGoChg$-W;z8a^a$wt+loR9bNN<{x!*qa*N*#;FB>Fryqs+<8wK$f{i3>XJKm$ zv#+<3I9gonhl;w40qbDO;DWsTh!FPa3bYKiA@4r?)hUfWQAa!3v?Z=I({1#q9Mv-# z+m8pEo=_4Wa00*edg1ZEj-mg4tn&vX`x#jzXWgsZZkSD7@}KL;EApf5K=sTF2POPG zBD)=S)N5jUr`}JRhoC_5o>OpGG9ltaVk~xXu?K?BA;%xYYae@Q8_;9yrv_9NdK3cP z+c_1B`F|~Zxx*ZIQb+t15>(7+sf2Zq@^?)OAX>IE@BIou~{kw)hB*Qcy zLPJkK(N4MU5+?RWL1jJ)s?%L!&4hWaW8PO}VvZif4K`dXp%DRV1-(LY( zBBA2qr&mg;^j1Aai3hF&e<&X=TMYTqCyxZlO0E^5_7+dyf4gn~U#esUh$rlNK7e+3 z&pU36zGx_JMMvg@wS0*VMi=#$uT^)ntLL_NsmJ}%S|;Tp0E}KMzq18r z)hoIO`41YPI?++3O-D9RHyh*VPPxkc4r>OavhZ9Lu(_B20^IdNirCZcPddfl@pW(i z9c%)>;e-|s|I+DLzCDNr0H+cMpix_b^x=Qc>3=W4Lv;{fSc@4e_5U98zo0nq@ezPV zK~vxF?e#ahivYv&7fHOe*F6tu01QiBSsln88;kR{s4LXmCn-7H#bHL4TuU+{euZxVARy^^OxJ- zRI2-fgMU6<3E*4i=9Yb7mWShn?vCxEgwKeP(b1PC8#8Y?UfAmJ`m{4_h4>ey9{iuI48fu;SF_r~fKnQ&ZU325@ zyIQ)|^)Z$C{;0X6Jip754lUu(0kQLS=bQIHEokqyMmtn#D+p0tN}C-kF6I< zim|aXMMFmpWEWeR1t&nKt1s`%$3>qQ(?y~BS;RhZX0 zLz`D#NTo3|Cc31g(}(ntX=DZ*0@J(@bMuC&JhmbzEO^4xAU^7nj%q#n^`Y3Ne`8I% zcJEjq^_@Ez0FEtKQiogLDE7IPxnn0-YSb8|5%YQy!z-V7Oo+zB=(f(;tMspO76T=r zeP=i%p%L@*oOdMs9$$)9i|NRSP@yc|J$BJP0PIj^qR>}`Uq|ZO=>y_dF^_m`_25?f zlMy-4forO`g)ikkytb{>wp z8TZ-l+%Y8wRgO$N_(@}BN@aMU{PLE6Ak>J&rwC}e!Otl`5PftH@kn*F?@WR!Q z#UN`Yb&#`fX$GP5jS2BTu3<{W(AXHwFC@!Z&a%*$qpxgWbJ#3p^4<3ziq@ByM{PSA zs7gd!4q}c(ut1KVb!Pu{i1ty_@!b8{T&`bsUtbJVX0@CU*G~B!1{U4{!X?a+jjUpu z*@=C!KiPgi!@)wjsLmrV^y7e)7ZZ(DW=bD5uL4-;v~QiaqePX95X?n*l|p!Q%C|Dqkaw5YQkfS7hTN&hh(BH?lG zdqOn+I#@3E`+OkqOGxNAxA?76{vcHXk4Kuip}}k6gB|=B`V}XK1eHOO%G)H4Kde1K z$1fjvuwCf{ju056^VDDa@Yj!&=V16$55*1qzEyVpmhZ`6O13M-Z1!p_dRH0PAKn8k z&_C=tFkE9=z{HTTY!Z8UG#AeRdwAm6l;mDkWQh-$JU_x4_CMYRJWymfcp$oKE*!rv zNbn2+8%)5GqC9TC-OJ{w-u4F?N-1S~RAT!pZ3D~xV^}Wj=UxxQdtS*?SGjHQe_gu% zNA3c%O$MVkMo7G8w$}rl*foe}tn7a;F#5|9`R%&mM0EC*-T1KvBoU5r3Ei zFnKQ(!RY;8Oy_;oX@%W~9een=C*SD3g~GeY^!pj-g@js?;@-XEha~!ZG{QS?srmfM7TYFp2ems_Xf#&w7lW zgH`2AlQG8cfkfwkg7JX+LOP(5lV;Oy?v$POeEj|@rKah4R~lep11UJMg)$kLzFk5S zvceiO^)jDzjxWy;g;hu+Z@#(NS8nmyHX$mC`5rTz&^u~u2AM*?%&)%l%QSwgIty0R zxP$ZBCmp~@couHs)#Oj*+^)iU=l=aCt3P*E3Q&*YfxlT(9PZ2ejw`+DbeKH4+_6YO7a{N3INSY{~|;=XkFyYLwx(+86L2BAX5{joT=s4A)k{?ElzM7D3!a> zUkV+^1|B?60Tz_;Tj_^Mpi^4<2mE8e<|*nMet4nJ3Q^9Bb(Am)dNM zbC$81Qc)=e01-*PttAl?pS8DIp6=BL4COg@L8iCCIlzLRZMUjL!i zb-esS6ND-0N8bRn^J^hEQE^@6cbH^SuhZt3psEIeOaeY)8&m+g9}$P@ELD>TAxGEq zC&S@T`Zpn&b!2F{qK!<7rG|Carzj(ks1Fg89M7|EFN_bBBYQS9G`vgpBkM;$-ONaj z78cTI-eHuPIL2>5^L$u)bL(?~IcT1?{)L^ElLyca)@3Glh*+07{no3k*Jvjh@8+-d z>}XnJQ-iDz>I~?wZKCVz!wFR+&8nR#jy?y}PP*61l=EForb69D!S?!q!}1VfxPNPg zhhTHJ?#(&Y?57qH$XHi^JTsU*wZB^AGx#QJG#cuY5DGEhATH%0VGNbx%qyovEVo+OVLuwz! z?3TaNtSa(QTJL{}U%*y*t*~r@GJ_U^g3fHb6HQZ;0P=;{QxDw4M58K3)uED&G4D>q z&HJD?-thjz`k3hZpEZWo*d$K&c*pQ-XNHR@4`jG)5r_RIQ50Q$!q(bcuug%JNBdn9 zzM!^LH+9uUl1DATd(8}BJCL7Nx#viF1-c`{Y+D45wLS~%+_j&4oj8m~PF_8DJu_eW zjEtXD66rt50d>BERX#{7f*C>Dv0R9spD>&SJ~BC$;G9bJO+Y>vWcUqMq0Ktux579JmOKAvnU}JGBIXcId4K9qK^wo3zb#9`G(Uv@DjnD zG8tpyrIG|&*GK9HUa3sd25J>^+O1|`^17!JE?4&nDUvtR3|WVyG3qJDE?yqA(WV|l zydo8g&$OBpk+s`q6WRAb3uIPE6oH3&PJOQ7_&I`@&_zX}Osd-)o^<2W-&z2HEy%Ka z?2>jP#YTGNZgRK8SEa{Zu8V@qxO0!uxyiX9vxhTeJrl3)?bDy9Q-wlUgrawmjmaiI z7s)=tjz+!nOa^NMAR=zs5%Vh+#{`y3Vk?kCD)5%uI}KHSCmx4~4}^xh>hqU}j}b%Q&ofyr$&OBXG#az4j*1c9xp_feTsZgj z`V1^Yh9E%Xd?pt2EJ*pl2{ZFe<$dcxM&$AJc~L)8k;YvFVx|Y-5HO-nD70!nTLxL3 zmdECs)rI1(0O*|wnl~8m&eTx*C3*2?l~KUr7@6m~L~jilNWY)0Gx-{KD2s zt302UeC)8Iv6M|n)Z^+{d=HDVo{3u&N92qoWw~ahmG%gF_3J?J(I^vlMEbH~*xJazKEwiv^K%7)y5=6)^)@7)%F z6wEwf96w6z-62=Up3WVxFPqejm36xr;8Mx)Gc=xu{hM_!PKe!L2&CJKM#fdJE%@b{ zpb!giSnsESc!!6INj)C9JHXx|&;LCLST$_-kfJmOqqs40u57i)Rz0MIqFfP2Fva?@ zT3g9@uRffcm!Ad9)aW_V;Ca6fj~C)>x4<*6K9tYY8jgpmT_cpCmrG`}>c78YWIcpV za3QTDReU!_`EZU65|lo(c1!Dj+}(f=EN%NVYK60`4rQ7?%nlk6e83;N!kRJ}i@MF3 zk6Jgt`Y&j9*~a2yRE$b&&EzpgdA2?IaKm((N1CyUepQ=Ij@$!2oqbajpI*}!n|2-e zusSY}grW6KTvcAEYnnTsTe-XMXrEujjKZwDVJQT+GhQ%cq%}}#%XiCT_B?m&){K0@ za=5jM`;0|QpKx|Lw1jTELI}Mz>=@`OJ$9(?v2rCKF&2J|4GxZZ^t7-7QeI`FCQcbE zQPPe8%^mM1UCEmfcXerG60_{p^+L-IS5dQfTFFdCGPO8-jOfhMHY|Y+r{4){Y*eHa zRo8!j)ir&mGxO0Jtjwf}XMz538@p4dh6#+j-JLIpm>bD2&m`vIRON_h|eh}B};P6r2Z*fFUJ!YcE z$3VrGvco9q*ao#XDtD7_ffs$gmsU=97!@Hk>^%Ta#rV&J%H8^~xaD`SJg1zGB$TUP ztQ$P&orTmfB+Qr}d&?nF63{h3sDK1E#fss+*4-#y{2ozk*Ys7OphDe1+`)2qVd4dM zarHRR*O`1qFM^2azOVsF>Z{efy+k4inAhO%s)JUKJ3=!)n?DqEJjdT|E`N3ENfjcX z6+UM{Ei&_(N>mc#Y-jvxm0~wLAIN-joy>jsF;zWTvd^B|f?A$W-Dkf26&|HkLi$(c zmS_Fowqc44RezE}%JGCBWaQgP_7h1zmIvtWB7S7rK6%ZyB3M`QzAXiStqKvKnL<0R zKJ*s%Lb35l0okd(jivFSD*;n2i2`ZrJvXwfnhI*j%it_mkyD6cvI0-aYVQfRGBpk# zd8CGNLj^Z3Kz_#pQ37et$d$=noo z#iR<&UkswRvT|-}*%=&;a>rZ+oHys6v8?@%=Kx!>zi|EiduploUEgd0CAdYf*jhoV zV`-Cyv8;B;eE=Gm-ZYa{J|`Y*RPeCynYh(mlg7BEiV~ez_(cpps=D0QhP8&4`_ws$rm3)ZnWpdHpD++iYQVi> zOO1sh_Z3caYKg4XIgi9gj^sY{Cx)?d4@Dzk*Fmb*5#j!4{CwLRJ8q2tD8vPIOZ*v9B2i( z%Q4+DcHfj(|3E;k21X8K9OMK1Ue}&5nanf>(NdL^s(4yH^=Lqoha|UO z$$yaZ9#&ybfAS}i_Fs}$$0DdlX{-)Fu57Z8f4Uz)xyh~<7XC15!DVO7{ZYYOer2~i z!zv@1=Ex}?EQ*sQN|T5m8uGth;8hXZjxp5TLE!9->pm1VC!`iXx7ln>z&(E;Vbkg8 z-jsFWWM?YVNzbOyOt*($oVRAONb|Cr=@C!6*NhFek=jXCNhCjZrShb^QC!Gninz60{#imP+@y>l;QKEu|0rr3rCN1DsRH9be5qaGh)6T2uo z*8Wp(CfC>S-9hM0Kquq2vEi8oUo#U%<;HBf#IoL$&0|XR`4`?gFGu~+ee}HafCtt~ zJo)*eVBD69rvn%LJZRJL&NwsP)afL}J_f{s#F@rvuDOf7J7HIsZ+pau;bWyfl=pTH z#U4_EY<03cQIj7}oOuZ8`ouhcI*YaI&Y==bY)5Bv@QjcwQ(82k#rzO9^_u=IOlk`W z9G#zFFU8cdk)}jtK1^dX%9HPuqe03hcdd7lKMiNKW!LJ_libZFNH1NW-prHb-sGxk z*!pb=Er}yN#$!7iQk~X5Tx=w&C%Ceug@&jX z=u2AU$^tx4?#XK+)%Y1d&bhO1o23n_Re`q5ppk6xlay35{euG7Z{`#AFpK4hTl-JX zKEG4Gl9e1&R&0{gy?I{D7B`3Qwbj(S#;|=&D+O(zllw}YzR9+|lQJ?>dND05A z31eJYpcnb}m6chkYy#(rMZ>zg7^muzX%|mqFpcaeVp#WUJcn1gY&nNKJ*|ZGguB3+ z-BH_iYkA$?JJmIq37#QW3dtb~R%V;OKoBO0cn;42vL6F`(N=Pu?Ems9Ag!~@5#*b; zy^y>t()?*gq{dqs1j(aTKfV?2r#$2J{&=5|ffnJIZkoHF+FM$~<~p(by8NV!-{YG=1HAwDmR9jhPDz#?sau zJECs=5%_(p4oqJBLNheMR{ApC>=%}uk z%S_U1M37;N^0Ql&nk@zrMAx$Hd6PLh*6Utb1`QI({XerGe2D)Csfc_D3IG<=!y=SE z#_EoIe1Qjy;tzjQ3V(d_iuq8zRJs<6c|S*X8lO0YiMm^d?HC*WbUiQ|ut?hT%G}qs z$fRxiC-~4OkEVMI(>Ri3gql~~`#-50LQA3X!$$M%w^j`4t?%|Ok9->{smZesiQXJ) z5Wi|?apA(ELus01f4?TgGW~n960g{`Anp9BS!e5hK~I6g+(iBN2C_PzNN#l9`=E=U zo&?arC%}t-8GkpkZ%39XJ9=1e`;4B^P%C=uR4(bG_KUly%5mm=(Y)LWBhHU|uKqk%d+r38nP%U!HsDelAbW759@YeN*X>9(lM!S%^=rZku#t-Z$}1 zC7{I;wy^&az+vZaigmFU&l^7EB2wRv67fhBr(f5Ee$C_zEprd!sdg$ zh3gmkx$f~DlP1kq^lgf7w_o|5VE?**Y;Gb#OLD(Ew?*CUa<}^MG007z_&QW2$# zt!!>*);)#8YWCqCGYlo%ZR=y1@d%`0c&eFr+4R{FQ89a2F(Lc@k~_lXi^_AEYcpM+ zV;(^+*nqtFH{T29PO5L&Nlov#s44gav%@4|GlSDW^q_q`?ONQ?CzRea%)+U|-dIp} zGLDYc?{!n|(<`-MCSGR1^|LIaLU$XY;|o8!zFQ4F2QnTgB#y>lO*YbiVJ{klVM zR;HfEfSd}m1J9{ES*L$+s({|(|DhM!1-TB28N~lUBVQ5YE}JSPpsHQaGIfv<@)B{F z0Kb8`wL+NfEpRZA$<*eXab0a+Ucw7U@ZPx#ST2|rA=G4y3!%0j;lVO#rL9PDF3EAY z$IQS?3wu^8levcdae)Uz$BO3?yNQ;_)Evpq+X}sGbccV5*YS3I1=VBL6>=b(h$6l5XXpuslm-=6z4^e~b5 zsTfBiV0iY!fwR4(z5fW&A2Xyr04ZEk7^{?g4sjyWxLwT$ZN1uk4l}?k(Frs8CN2x5 z?%}>3f%=Z+UN$egDsM3o@=xe1tbZMUicec>yW7Ig)%=}`oRPghm%jNsJ+|At-)C*K zA;O|NSAUF)7T+jPAnt=3*wlNmc8XPcV}!;2?kZ@P+B7fI%935EdBc%VIX>B3EL@WO zBY7goj=jQFAunrZ8dS-3GfR7bl1e;0S||?L1VfJG5o1h*qw2U@+8A%x! z)Bu{LMaYV*gIu)AA?|9RPtWrWS~WJdSm(JmQ&_or=X&zv3pS38r&jP)SMv7lgjAty z^Jj2XdX&QU3ZoJfdDf7E(f<|PJG{%v=Xr%-*KpS@X8c(V9{wGp8r~yHl!GX$yBti%>@!Y8Vbf6udKOb zH1aDx6%5SIM`~+Eg4itRDT%z3?{-}UYUEx@7Yi8Ve6rC4faKZYd90@almQ1lt$eTW z#ePWEIXXl8xmGy9&t-2$*6hMis&u;e`KfIL;>$9j# zf14GOO(Eaz=8&-A0qi~Ht@$Kl!$7W`4c3L4>}&V$-=AKI)&+h;@avdI-ldfZVz6vt ze}8E)j3_MmVA(z_YEsxpw&{{sU}ms!|1&%&UoPUNY~{4JNHHHlX@Sxz!0LVk`x=~v z@j&2#xqNjEqPd2WoclLG0LtV`uBxRF^Tcj}J&0jIpO|i^_j$lD_erlnxW6XvmGv5n zptQj1S-NuVK*Owb&*(%bc^KPwoIZYE4a|s8MD(tP!@_o5c6HCiD*ydKHpEJ7jEP`z zlJ8)N!qqldoE3dmR#Mz0T(Spz;C>U#pT?5Cc}6{nEW`=Q-_(_Tsv;wwUdNr5z4z_B zn0DLf0;8K`*{}h@xDp-Ho`!#~l&2CQ-=lVTQB(W@Xx~MfQObsFLAi!Kt*0h5z4s$c1i!LQJ4DdU&0Q@C|8niiWSe7 zm(KAv9563s%w@j(hJMYUU0RbOcf&9&&jeLX4x^^!yj$zKDa_%l(O_qcvX6ouOQDRTB#$_lN575f1S^%P)I04*u}<&34#ambB`mYSazIC4*Je z^I8Vw%2tDNSL=4hUomR{SEIr-Om7u3{))T)hs+gl;3QC5_!fgcw-?&^`~m>3;+Ssj z!GAe)J_R75)K#vh+4i{Z{|8uVVEmK;-b>%|Ds3Xn2c$ zTW0&6n*VrmYzm*Hg~c8I7499yU+wE(%)MiwN`NaRKWIrmnowVOk11tR|HEodPR{$t zN2<;)cV5?~k30Sk2>I_+oG{)ce@L|11)Sgp@y79rtdfqLb-_4;oBn%{(X#y|zwc7r zv(Q00EIA)_iFW`FIh-hUZr{W|N!!1lPMwF3@0O@&@%$~ZgDor7~X;A@OQC=0?z~-{~V3;@0D&&3HN=qe&J*OkHE`wLe7&-*E^b;MJ+-e3ytyo z=W5iP{$P9@ny;mn6LpUpu|oofOaGbW;mD0$xOfo|`?6G{R3~qcp!Sy=u22~~4^Q}& zX3FFLP2p0CkpzO!%Ma)>h_?=a5ERdAm8tZKJD}nnVLYqqiVjAVx$!0WTAShl_7t6q zF&6-xW-5$&kAc(qlQk!os2 zQaLf{`ukjuDf8652}w#!Jg1LTw~BseVHjs^m8pWXvGG-MWMM5RQsSipsu0gn*Zj7v zbND5%4#4GWeP8%7qm_6>1G;PxH{H)de%s(DKl`IUsNDYye+&I!V z4!)}bV=>v4FW}-XgODz1V6UrwuL46bk2+_wCxeg|yvfCC7r@y5-+=!8TR`tF zgK)>=2E$&%o(kA2EdMV|CJ*oW=i7VU@mMb`pd}trUo?qo>UZOq{{ckf&(ccR^DqnO z9`XiMq!jV_KVAY%P_NzracRTVnG+2_=a1XEYqnJKw%qJX_iOvb%c13u1pk?Ue}0?) zOx-`$%#k3|nls>P@t~6OJn!~pK{%GSbWgg`nSif$Ufo4^ z@=l#izqH3yw&}K4S{0Y{W-fMqh=$x#!bSi2Py49`Rd>((rKO~7-aqf?uXJ+PJo=;eyy{;ZbOkI^>7M5C8L$l} z+sgL5>MjxeM;$D6&tbo}`zF+~h&`{mtF^YbY#A8#!@K73|DVkNe=`4X@67ZYqe+9J zng>KhMJIqJaI}PN_wClCp$zX*8>jm#-*cw=OXntl;!qR_zwX3f^y+sdd4B5^k`w)#hRCl)4&I3|ye)*I);ENUFj0XeVJ%WkU6-(E4w z3o>4nZpSW{_6&!!Ci`WccR;lc*yM;M5Qb6zg^Td$HFyrR@ zwf*++IvdaR^#MXT&Ioh@zDM7BI$qXDRLrBloYTXOPiA8z+P>0t6bAs4IrcWIA#H8# zA*kSUzAsOHs1l_j;vDFdF6z{q;Hi zt`gWh^_9@;G;T514TWDIE$C$^d1eZw`5MF3b%EMkExsagM34p>i#W{B-yph;Hx+g6 zJhiJ4KG=&Y@R0gNMCLDBdG`RY04o03F`jd8_0IG1N@uzEy+JtFpMjcJzaXgE+vkHW zotLnml8>#)6BCLj6N+1lS{vn5U+ST+|7MOOzbGx1WIY!+K|lb3Z@{5`A2NT%^%4Jq zB0vCWiBHCnF<5GPP|vuVduwr2F{)LZmE_zTU5pn^}F$) zSZ^s~yJ((OA7z?WVue)~ANj1C_o>y1ECBK#?}I`V-bMN4M!ID-eJmHZAH3bq?QRty zyQ|Evur+N4dv!mPEPIFoND~t~j0#0=3r}YoIzDw(cwysqn0WDV*=?-0}+@+gF$C0@1n)z7|Wkzv!roTeS z9*kbw$u_dQnOP!}Udm~c&twC-_~Z$S;>chm?pHnavhG1007>>}Wd5}hKUOmjKKkEJ$&-cP+&LbIUzn^S;bCPB5MV$vPFFdeVltu7v`sqr`<#bHp|t`JYL^wU&e7a zL9Nay8k-Rpoj@leY=;qA~lCmJj3)5Aw=Q0#=gzMtL`fhtA!AWUPwJimq3| zCJr$P%c=xs*ycA8$Qv~)D-&AF?i9J>@-z^GmeNueu+MmHn!;NQ$6) z3?o(tE#US}d zs@B{+c1rb(9b@!=_k&Zu9;B9HxP(VK@Ay;8Zjf@a+~`jU&d~MWx2tcHo9M$mtqlal z?L#!@u+ipN4y&(j?LT5(2g|GIl$2s*a7L#tH+R6Srk%ZePTPM;8_*?hW^sCK^9Lym zf4hcwtq_Kou0$hK^x9z7p04XMtS1lEiyxWqp=44IB-(y%iiITdv7bCB&_kTzcGLr- zR2d!|AggVevb>rrvs|C1y?^1g)c~Mvb6=Lmgv|JW)IQF|h-*B*=SR#gl`I9c@-o45 zx+7Yb$O2e>gB{|`R!a5t$%d>XcMod;(M0K5epwdKFe-k27VJ9njrw-9FbAit?e#z6 zS6)!~qIKX1MTF-5yAC}qTdoj^KrG{(Fpkf;WvF}{*AuP%Q;=F<0< zH}V5Ln+7(Fd3zmq?@CE&91BBtlBZ3kQI%~kmnfuL+r4kI4oK0#2V7xa@X_eP{;tK; z5Rn)^%1&$Fd8wgZlT0nx4R6rt9;rdt{DzOVEq5Ysdkp%NI}TT-S&Tj-Lg^(O^y;06 ziqogFh_aMtYJ;$um7Eu$SF(mRV>A{dy>qM&;v%5~@Fp$~a;tu69^o{nqAu2R$D*vM z#C|2(Yh~GB&SM)hzEY;B=dzN!_2Z;$Z46%~I^ATH z$#cQ>nn4W^?|}+wJru!MjI*MbU@#U}-xcr#0(%R_pLCxH-3y>0Z5npW?-GJLIJ`so|}X)0oE@w}|%Z+1gq%`f;Z_zb{y3 z2}McT4_=HC(2EXZnRv^aNo%90mIccUHSJ3A^@$btdYzX=6C_&|8|>*V!nfVNVyUqC zm4j>*k^y+ljZ1tJGBeUnirb563*}#3AejsqyC=Tx_RE{jzMmh#T6ElXAd;0kp~#6PHZ57? zBp?As16?lU9ISW|g~W#o6nq^tRz`Zv61uEMvrIp%gsyt5&p?uq2-!4^CBQ{V%}W55AZ9@rHbO)h~{r)pgNr=cGkD6+SU_JlJin|A&6*FmA#3D8qWmeD6Ec8nG+m zL6e9iOn!9#4k5P~9S(5Df$-aP+$$m`@k-77EiDJA7@D6S&>YDcuwZ79q9$p^vsl7C8kkzYb6Dc++YZMqrnmN9^1}rQ^PMpk2YTA zZ=K}o1%0ttkOOELoO-fHhFrPF+-xv}UIERh?KWJN={DRPTYTgCU7`MrZhrQSS>Hd+ zj?k{z8S7uTlJj81_={}Q<7^c}s+osIvI42_&`Y@?2`(DYd*V;OTOmJHcVxE{`@@25 z6GIgYG{uS`?h@7N7x%Zx^$5-zLV8>qO<%Ai6pDf}F7LJSHkt1`3WUMp9|NM+z=uuc z76Kigu4&3oo}Xz?i=Q{CEFa3GfL=e_FzXOxW{Y7NiF%i#`4h6DrMM#~f?AGy3TkFj zuO&!%uE<=je+|d3h`duk5oOsA*c_V_qD3^@vQ67zx;<3xtr{C^S7uV|qCf%2y6!L~ zTnhQg#e`sf7!5a*b$hQg+9!fUzL2dm^6GL!Kl$e1!x|eKiznQNJmp#hDaL)g`Iotcc`|nUxOB=b8`v$ zPDO|fUis!r^7(PPU{3xqW~v20J5+mXVeK0!gZe-!cw@sW#o@Z;B_0wEeI;iFLr-iN z2M|_={WiyYtv3vSek?VuP0yIpWGjk%xTLHNDl3^N)!9`@07@^jE2OsQD4{qhkyY9G z-{awwuVBNxR+DU=vuWZ^3~Hl8i+^pyhu3kz-iX_Dw!zzGIu_pe>uKD%6AfVA7y)k+ z%b(1KBX9$ka?#m4{mhz>*@P=Qh5kK;f=`c^=7h&gO> z>PY?BuU4AvID%V)#qth9P2*JTSuAYklw*u>N0W^B2tuszS!l#mV&Q#6vYVxrOob0@ zZj(&Q-GAjLwXr!PN2S|g;wI5?CYxaYni$0<`Spzo9GLq%5GP-qYqpMuR3_m zx4+0x-dx6N9E=utusBp;R<%j{+2-oXj6M}|l;tZA$1iaVu=y9CfK0$ynzyUYWTV3n z#hrAn2g7Appih(d!+#jaZ-`e9u*fy|i?#b7l^#Y=-i|%D0*v!~Eh!m7P|eI)&*_g) zXwQ9l%6=wgXkU33-+6t|DRt0wg@?FI928TY?aYVvxIM~c;E<{}eF2X+C&y`unAtS@ z`Npk|)X`=+(@_AOD|Uwtd?of*Sh#$RcO1CEGAuB5{ypdu)>oTk)Bl=5G5+ z`{K(NsaEcq$u#fV^q3zQLlzNo$!@5_wx4-n>{GYqzDK3AzV4Fu2!%ia`~ACj_a1Y~ z$lo-q99lyi$B$xJtYr0nS|@7pw{>;NfA}q?qdM^V4$mTw(GOQKVGf|A*<`pN>tz~| z^l?7{1~FYVo@8ROpO${iz%Ef-%;US!PVE77O=#o#+aOIoDZ`;CcwxlXkn61j0~2)|NdevaTp$9Dm{?kw3Fag^?MTRA|0qV zWq#+}q#LAlc(J*nucQAB?qu$UhZk}yZf@aCtgP(>5VG26ellGdj8>i&^2V0o5}?Qn zvu~nX^xlR zYEsaTQcE8j4wloDv(lNKd5>cpEuugO>ihEIu##l=c$`ej%EcUU>*$N@hg2+8Rm|U< zNM4M&ctd5sC~L#Rk7rM)X1se4hx1B$F@Q*N!}oh6`VeJ^2`;UP$uR>--6ei7X_z9( zh@i@J=W=iDjt?P9YMA}=zDRx zR;0}A;N^4HXSG76S`u=P`DA?x;Ciz|*sS(mZDoCNRm6ihou}uwwuUIrjTVZJH&1xK zk1qVTAEhFu6aWT%&-`qVG8THtl<&i}dYb|GTP6yW~-^-+YZ;xiRoPJi^_|nb%IMj z{kwyHa6q0`qB%NE$YtMd)-HNHs+?uWeL!xzY@rX5?5=wzX&_t5IAZ+Lmx|-qOh01a zNGsGK)Vp@(=u1zhMSHO!u_3o>xvq#FBjc3G+eF2?Ue?eZrZC0KzEg~13EJ>4U4^we zN!x|or%sMxUUA({JaA(jjvMm8ePsK2dUiYkCNE}7`@p%;~8rfM&=7` zv!@2>O3dk+2k%u7sRm#=xAl9diQYSKtg|GbGfkK~hlT$~1wNG!O&S=%2BTK{u z|G%{88A2AOH$AQB__eX(2ID}Z`Ht`%#U*DbHv-#i-^p}^(K!HQ)PPjdP>D!KkO(j) zaao}S@dBI-m^IvJ<~d(+=Bd#13gv#jlq=P4)$Ts$B!q*$7Vx<9i+=M7sBawnW=srl zD775Qwl1KM@X`lWDCWwNxmIj~PWI-iBra$Mv!Y%z$$Gx#AFWebAr#aQiy*}6Fc;CJ zXsaDfTnBKy##AsbF^Bfqb~8D`^dB=7oIXbT3O*QNUX~m5z^^3w>%pNAe}3_NFDkx} zMOBKkNf91>Z3zp4&I^IlOFdqH^+DqGk*Q; zl>Yl$!E7qQV|sZKkAuH_RHPs?@L4{?%bdTf@&72cx1^NUic0p|yE*XRMrcF7NrlO5 zx1bb+`r}tZ;lI~Y^r+@r4@WWPkSrDRV;Hw0l0>UF#Qn|NP@$k_7`b_H3l>Q;-Ki`TORsK8=+x-;CC_ z%H(Y&rDRfgDK-aw^?=Vw!u}*EQay|=aurImYTWJww)(aH7>$$leww=R=-4J;=8%zN zKAV-$Jw9jka6*2vve+6Gpe^TmUjo~weE*-n8~T5Qlf?lAwl#`d{fOgr+BaRXdA3-l zM{RKUkQpVQWl5v@CSpy|#CZD~u)S{xYwka?&o&+gCG+9Xspyr9dpFckiiH=VXKuL1 zvc0S-g?~~Xc*)4&~Q4Lem}klN~OJ{3n1ttFS1{F5Yx8)&^8r6)Pz6n z6)UrMd^~RVH@?6(3{nKp?8XRn<6cmq-mxCYAdMg7AVpllXDkCJbX<}y$?xI6PXFOp zkYb>ArO*Xp(#DI~(hMW1Lb1cB-jD%G?4#!Z<^4F8oA}RX82@o4l&GPC#mUprUa@M_ z-r3JAykp-2XE0=mn@GVjwrq1yVgba%!z~DX7w`WEO=Bf^ZolleiT99BBdC`C0|hu+ zx*wq0qLuU%Am95DY8*`?|;)_t}0{z=z`oB>L;%s{U~c zpCR}OKg+b<=!wyw=9m$Fa~)6R0O&H}w@2{0D)?Xz%pnKsU%@=g!t zT)UJB{qr}5I+ASI_!v8C-UmMZd3z~Qk-ZC5+&v^!)!?ZqMzissyQKcWcTtr5(}9kh zh6jjIZunL(2S*lJ^g{k-ndE{1mBobWH~qsF{$tEWNC4xueHdT%^Upga2u1S_Ff1>< z4LSZc;Gbi0=F~T(`!^enNe(E6zhDLa-v*qC0dw5&8Je^FL6A?zLGUGDVq=BVRbKsV zz|E5dy(eO;j{k$oJguJ8AJ8!gvZ2C&zYVy5n&TlHPwkH)2kw_hVZaLiKs8nr`O}^} z4S0B(!?QD#f$C2x2-qNTGC*DB;MoiQsH0B-pNz@~d`RJS$g=rH6$O;A zUxg+2o_?Xd_-!QRNIStzZJpX zZbiz638;=YEa0estG<<=mvTzd49JqKii=z=>mYp4rW#j z+f*jgQ3_x(la)zoe~(Y(}%@Lf55xlkAD{9E>I{4u-_Zfq*cg&1E7T@ z^Qhjb4+1SO=q2KchOVhSFEWq^A}1udY;@_D&SBIvuDtB3YHoc2wAH4s-*d z{mtlOAd<*^TJN-P+tZuG#q^UcP|}(0_F~_Tn|yP7G)Mk3=oWloK8;H4tRN>Wl+??F zVg*+?1`r1TgbZ=J9IpsCUaEj*tL$!|(J*`ml89smOcF;WmXz zBbQZLkvw7KxW7O#TXQ(n5Au9)Q?+8875fie2cA;`4n{5QX&h#Xc+A>fE??=%v1mWb z&L_GUwKVq4)%!8lQ7k%(Jobm4N=llLkH=8!UnW^ij016RWnQO)~PD#6cn-~VP|K9LCyR^)0+y85dFRVgFaiDvfgxPi3$L}{TT-@RYJ z^#D1mRz@SdbuZCUlCrW*10eBQZnw$U{gonchgC)MWOI1^qOjo;Oheom_+WX0O*%^wYiGJ<$&OJ-KZ`O=-gdAio!Kjm$s&ix-p+PhL1uxYA1=xEh? z-BGX0od$`iof>b>e>fkn@GeZJ&exy2IH$Eryon@p#DeT+6i`E+aT-s_qOhaB;h(Tl znE#+us7%H;E@2mXVo#@1p2coFBp8fE7fVW@Tar*cR;VK16T`&h{OJK`cVS;xbYfc9 zWLl%7DL(~xFb2zQ{*VR0l@Mn+x78?x-9zRZ2BS*cVb3IUivc3Wax%?(MG*0qmmFf5iXmZ{Hh8ms-U=xYL+L?npnDV&4^S8yfT8=7ob1>+dbYI!nzrJMcf`u5@IesYKR z2*DY(no8{%s64Xcn(qzEAp%$q)zfTT z_KojRkYsBtiSSM*b}zD_Pk}0~*aE(ePN2?lMr-_MU(c*nMC=UCgl#O(Zx=@7&C{8G zU-JS zN&>ge@9YM<&9Urydm#?HR4<~r&^w6r9Mxb2ZVTPc$CX%h+Mp|@6Oh5j?*St6%nEbE zrlhwTnxBOB=Pf!M;eFp==t|1b&p2q?H&PRO&M`42nvg(7!|{tWBh4l`3(m$i&T4yZ zgYoBpI#!R-S=2P-m1%R1@^zrY`~8WKwusBrEs0w?%=>0&9mY@sF6l4NtX_AW1C@h4 zQuFnEyJVsK-(jX}OF0^C(ZqH`(sx=IuJIOv3!W*a6n8nUlV zyd4_Fw4vg$`Ojd_wX)7scH_HjK#T?GoH*U*leZ08_nfMTLAU3E&7H}gXo{p<97l5G zp-oaf4<4hZ^3{8ye+HnE&|kO}N+U)Td!Sq>kynq=LkDHiq&sPTc4kD$J?iwYNp-lnu2Z6~{an#C& zy#l6Y`*-}8jzM@+5vJq$JW0$mTWo`%Rr-3Pp;%(4MF#n%E8%>_qMZf85!=dLFKR{7 zWu#X=MpK0}Ro8YyAc z@W&|R#s_nCQt13|e9#6;%Y6f=N?-OCUv?A$?%ft+^5wj11Y?0h zuc6$!Mq2G`rjb@7GRq+GA;}|IhTsE~%l%m1B43*dK(oI#p=Jd%1kB%U<&UM;pjwUY zB!I3)5lGDK7@gR8z?kNzT#|-xrfXoV%si|NDLpY{^ZuM&6+_TfXrrY))cWnYFE~Tq z^8Cff#4&sx2f=49et48$jI~Qp-jgy-Zr6SJkvXVCjPmp2nl9G{cv&DYK-RmvcCXum z>0PRCezMl>(Kc;Sv&eWzi&8#p)kJgT!Uj9YY7cYHy83D|4=5)c&50l$YmvSLSj6~3 zob%jOs(Nu7VjeEr5Ls#d)xSxPJezDC@3I#l;BfaEH*W2VcR2CSsau!^M*`CZ1gAb^(L4Yu6415 zZ;cmD|2Wy96Io9jAX;lfGy@vcsncbOHhl-tF(Cy5mG(7+$GLie7bh!`MnBx^t9cit zxaLVSMH^}T5pNsd1a6F@KGsXe1v;Ao0J|a2Y#(75MBd%fe&;-?#{;+&==D%Hy;}9j z9~BTs(>EE7<@UQSDR+ybFC@|O32p=i+-&>PHL~|%6q3Rc9O7Mmg4wpYe}AA7K~2l$ zs7~P1c=OXXO*ekD_c?mjj(Aslym}Am^_S=LtC;+(R27e#7CuvLp=MG5DZvw|5kh+V ztRSNyoHW;bxU;rsLn_TFe;m!+RR~bX9Kp-8BKuxZ69YnJ4psk1iUK&ceQ`&XaAu?wiyZxAx-D4(;yYHR- z_>Vg>Jv6AwGMtZfPb$%CBqxUy3MSqR)9E1b%4biWwWIiiG#o^FUl?WGdr6LUBPqalR^aADEg9f zo*-)nH$hk0s2XIV(>~GiD)4N*MW<*BrU%~42hEQjVjvM4RGY>fALCu@0m<`8+Onx2 zBQ}pKAp~xjT{Gwx#PR3iu2txRq5gIQ37~C<;MzdkDs;yW_b$)HCj73((}mnQn7g8& z>mi2yszw_3E;t32(F+3at4tN0Mv7GL)9iOJ2j`|E{qP*}c^ywWJ{YC4{r23Z)W$gS z&?}R-e%p`gg{uRNz`o-+zCURHBDC`BD-hH^m&r&6+Mp~6L_3jDG$)2@>M~zqL5sE+ zbEOz2#B*ajJGQ5{&%$xZt!But5;Y6e_tklZT80vSec!i_?B(x~T?sZU0u0q^9pc>% zwgo&N_iJ7Xt1!2}N!C>S5Js7ZDKb~0?I`T<<(xIh(b6|A%_0L@wD~=Fmh9>+Qs-_M z*TRtJQFO=kxFUiH>Zs2bYsZxMh_JA63a`X-4t~+d_in84UKERNuH`8LgIbk$BPu6HSD7d7I5(jMxY6aNqY z2#{$o5OT41!*|Pq)DJ-n zwxIUUkt1z~j|OgFo%H_H-Tkj``7vr0Mdbnu;EjeayzCTV6TERE;(kKwti-%k-E9b$ zp)^Z?}zqQ<7)f2BOy~oiqL8qvled zYk#zy25aNq(br6m0ui+GYV$9bAJ2OU^`C=NU2asUt5qYj=HC4-gXd3SvLGr8OTlMO zYUyCxCBbXKFA~e4~4c<0vR z4P3KiD=&dP<4OYMSYD)lAy>xRc@UGe7gu4nUE-%LePpPaBR}07oTMmZRM7amKV^SJ zPWTeT;7G7|0A~6r20y;Yr*=QP4{uW*#d2$va zR^My^{Gw3|>R4 zJ1ws7`yO6`CAEwM^O)~bMbIvB5NC=hBN?`z#yj383JP;1!kH-EuY{Qw*?kl718|19 zcbR?B-jXr;j~Wb@JezC-kEgIO;CCPUfuWsdhpn=E}G-*ukaMo+4#cWDdh?^qLg+p%9z3_I9Ws90zF+GujJWbsL_ z?u>qNR@C4qUb5-|%{Qa7<2X4(J|zLD-;Y2bMXe^hfyd>YkN2yke%vnI@(%8#q5cZx zGQZUDE%e~sgx}H}k!1)S%|!Zp_kF0YN*^7{=w;Kr&OT+T&)BprrEpj+Gz4APWCg$X zM?(m^2l_+u7RRe_>PFVPX5gKVWL1d8v+qXnR@Kk7hV)`*FdMgEntkpS-wk#oI#4#C z5DOnGgGk<@3Ls}jahl92Cl(ZY>x~5^evO}(LM2CE@&18zYc@>YXa$haMbRnTG2hO0 z@R%dYpo)-D;!Bt}@6fW0;DXu#)Tkl$`dpnItMiez5gr@Is;I-c8eSVzL)4zLL+1E1 z#9z$mf`-*lFee4Y)jv6Wu1|4#n%r;sZCZBCkE5=hi|xJR$XBw%#$i;YN6ml&Q16Af@&fK!-gXchm$$DaOYX1hh4UhAoiu>qI*?9DCq zd-$mydJ7!u7$MaXYcQCq5s>e-F=>CWm$h928f;QXRmNptBlK00!g&p=tuF?zkE&~4 zzkIWMPA;13H>A_htEqTyr3hYr6^KUBET^e6%vp~}2~m1T!#^(-Y7fXKm^1-j&O62 z<-lY!Q z(EXS^>vhFo)^~jEWiG6wz6;*=uB7Um@A4)=Y`MJ`)$G$VRaRDpZ2MOrs@f_v3vdTyBuiS`$jrsK2&E0bC>@-|0|4zVo0 z?u7g<$%_zc?7dz4=@G1a0=E$Ba<<>Hwt_Fwfhe?3X{L$-0QYbJ6&a<1MR5?x3`-LO zops?@Q532Dm^x&A)4hl3=Pyo5b#y_4sM?KAX>SMMgSVotATKX0kqk0!Q_v>+Zn7lF zXWSCLtIATg9kV&@=RyRnhAQFdx-Jh|1R)qkOl>U?o8wUk&n(CW z`35!vH473zg^I6%)P+UR>P2$!IqWb}fSqm>I@&zY$e7~SOzf0L>#6PB)v;|7e*b7_ zV(=-BXZ3tOEdADaeN7|n-nE1R&L=fy(dXQnN2$Gg7uwCP24yERK1VQz2|jKj^AODV8`~_)*vOTJs?6h^JPg4;B3E~Nnz4*yR@f9Gx{xE zA{X|o-Xa_SCQHdJ>;%^=$LEYdMDP@-J@`dW#p}P>zQwh8M)x9tc?4(+G*b^UC$&F2 zTomx;lF=K7K}*%%QZ?zjpkmz>PMAp*_J4^LrBQY%4Cl*h zB_j9eA#UR#QU+~ z5ljz%^vi~DqUzNv2PLRgqaNSB3-ou7oVplRKP>S@2uw=Slxnrp~$DUxH>;PcBVxgTQ%pvu-NZ6Y^K&HvmfBuhY_)? z7|^KKMlMvkT`xjH;i7{s#zqIP5scacUws9LCF(-pA?gjzEUyO^_OcRAeojK%QO*EP zWc<@=?16)ZRcxbrS6HZtA)GWj#mDa*4V}cUat=wJvH?hV+5Q!d`!l@zPUr#LqfPf% z(jP-Pd6yd_Dr-{lXeOq+@cuJr!r%A6M$YB1i@L{~|YdJu126 zH9tx}s#J(5DScPI3$me6@w6R-DPd`-Y$fPAkX}>332zVIpFJmij`dlo!5F6LGQYP_ zBu>m3e_bh6tb6_X8==FJ`a+FW8Ywf+fRTMsUz$MkbWyJ4@_N8QFe>{|+{7N>o8L^e zzIa7Z)8Y%yggK0WE>n8ZQM#<^|^o zN+3HQy;~GAgu$0ojcz|xTQt8OP+Vh7hMXA?PP{*>l%-Z{T?RTk zTIKBpNQ4=b)Q5i!6mQ1m)tYO$U5BN~;s(k4^r;K|pLbqlF+!ncjYLhe`kUt9Dl`LTbrD&P&(W#(sCwIb@sz1E-s4_0)&nrNlUy(TsxHC!vg>O8nDgel)xOq)_uRp z_1_Sn$Ya3&=)LNUcl|H#?0?pbN(Rh<=A-vlA!4{cp+?NA>7mfV{vxksRBpSAWNGC8 z1!AoCBxr1YFED^U`ZENB<~jFDG6*bs*f@;MN)v2fHTwj@PzT$t57kMhUF7{l!)&Gh zZ}kFxk`UUm&9=GLRVMFJ5>_4AjhfXv{{!G}(dmuj%IU~GNa_qvLw8&VeMVaG2UL(C z6$L5*0UfnW%CP4UW;(;r2;9>?66Va+l}kLh)vYJvldX<*SD;0={AKztE#2})>rXJ8 zxQzeBkAS4#Bd&ifRMD%fU!SgM`pQa9AN*(i1h6w0)G~C-d$kw5zOm1w0MN`6cI8NU zeIP~SBW6F-Rt;E?rW13B9J<^54-$wJLP#&zIL63XZ)shfxuy!yAO2tP3_@pqkX&#G zPX8vnF|`7Y^e;gPC|SebqM1)e(HlwdS*B?!ue&0mq3Z>agCCnQ{1CeFc8Fm0+4x-L zq-ye&b=@2Qh$4LJB3Dj4NDe+-izehL|0pRLTREv+9rPy*1nCa6u7diR-KOq(-?W|W z$r>I*ypGp1T>BSinwi$v4tq3mqyX4T`&V}wpOND<99Lf^b!8B?zpe`O(^2<(uYI|Y zsq@3=Hynuf+H0>*94y?=bd$>p3{T3X2S#X8-+y6b^eL}H?D_Hy{13oP9p;5!n;U?s z8ISpv!jtKj@F!51VB%}9cte#6gRkm6tyD6_gi%aZ(&70Dh7pQeuQHvnc?%-tbaPdZ zxd_l{smT9*RR8aPyxC>EUchEui*&&L?O0}E13H!WKK1;s1Hiz^9=RjaeepK~B^Lr% z$uaUlm%j}d0ReNEJfN0&|3OFov157f0pno$)u{1r158qZIoLgerUd_Hp~jwYH&tB~ zntvMr$YMn$QQ)09>ECR%=@TYKbxnooZvzsa%zZxzIcMabRO$(IQuTD7GMp5~{cS)$ zMpx{HTG!KlP||t(1|s(!uTp2(=OIQ_5n~@nE!|z80&S+TY1Fc_*1Ep7^Px>h2J7t>!Y&K&vfh|nEFVTLJT_~~ClrV)BF$kBRwdInd!t0248)_mjPHn}o4 z6%*O!a2K+HgM@Ip52RHH=2MmLHNox;mZFo4N)kyE{ZWk{=#=iM<(qFm*=`QJMpsUrgWp}G+7)Z67gp#S7rX%qm#(4TZrTxPH7e2`V5 zv`9E!CA@aLiGUPR-(D){8qx4K+ng$1oA-SF^5x6d2bA-P+qiV$VtDbTy*j&-nXVcb z@)M$(Ino~=W8vdDi!6iI+}fJ5e%*5wv4)D)lh-{4$Q_cLK1RvBy`5pA85oVm9^7~+ zlYNM97N=FpC!H_eT>>(XI8gJG)T~#SF{!yhR6aL@fO{{} z>pbOAcrmCwDTrojz81`CV6!uDQ3-hahr|H@8NMvxYgXG2jUiFZZT7P5;Y9T*ik4HA z3Nzdi-CTA@OFHiRg63Vu*xgMQvrQ6u+zvaHggmyNU*gcl>(ejxU#ZAywoB}Y*OmYH zrmp!0Mi5>ZV*X>T`!274GBd<5Jfa-{Q|+6=02IlM)VOWXvnmoQHg!|(f8L@o zaC?_67JYqhcHu(Rc0G~{IZQs5Y>5FBJMSZ))tE<BHZmw19!(tJa!j_m`s}NKRYVI@^`l*1RkmC?AA{JQ+dJy z|HDEfIuKeD;U!iV)2kRU7KVEa@%=?V<3&&TRfx=^kSfgsvR=+F1N{lzMYvNF#A;Zq!SG~m3IT>Mk5ePX-iI$HV$LPHSE_CuYWj)yeL}1< zs)F-I(7jnkC%dM$3;2`9N?lmMm&@4$oUX)l`wd6pna&&OD@X`gJb(rNZY|CTDGgw+ zuN3l$B28`Nco3QPT#CFqJ;YDA9xd7VQSRVl5BNNJ@1JP|TQxMvn<@;tU_H0jXeD8= zz!1bK(sXi=nGMt59l?6O;5quR%$ud_)3!wOs-z;+u%X1?@m&gw0 zn10Glfm{#Y#d-!?3GR}W+~H_ zCkq9T3t03;N!6zunOquR^7TQmL0?#|^2GGJdNU0!QyY0TrB5XYJ~p`_=)F#_AI#_2 zt)%0FcwsVr7R*=3d$Zmf^P$q;+FR>%(S>28brf1lv^RI@@W9dr4w*R0Q>kct9sI@J zxV^18wpV4nOfJXqRd<>|nzY#o&?-p^pR2IIw>PtB%T&Hj4t&27;Vi`*U1qTB*vPcS z8E~Oh2;qX>?Xg#OP*8igqy;j9X#l!Pz9+g#Fm4+QMC3#1Q$Ufe9%dQ?qmivx;J%m( zA;e~oQwBJ-;z^JASB8O_2(gR3^SbU;Wzqlyq{2BC$BTVF(jYxQOPDDp^FXJJq#Q=l zubwR@hcRaQlLw7H_w>09il&qK*%xK{KFO8?fyg9Zu^tN*Z>!(4HC%mH^#HdmZ^R9& z!k@>thnS=U_xhhAb><4!mCI$i7!+jrRd7edF=*ut+`IeO!EF~P6-6^=bmET%HgH>R zewL&>%FjOWNwYxBRw}wk8RaIi)~wwxc}-`JBWh1w=ydGwkt9;o$@EQCyr-$Imvxif zXK1o`J;XtW1g8@3c-dOxzTPDz`K`OE6JCS3M&>k@(rhgKt(bH&H_c{rCmm8J9aZrl zLeKLTv!#!{N_Pc~`Z8&6Gxe^PW>7j`SS~*JmaERAJgC)tz;XXrHK?w&!CSSe_6H+>Hmmd2?Hx%sUs$_zRujgI2n6t5!<~8Bk_8-$4quz;_lV(s@*rL*WgZn>M)?)3YM>hf?v ziAkA6ngriiBY@~~lgkt4$;(fDWiBzWyI@H%fR;Q8pB!Pq*{c72^8h4Ytw*jEXH z@tUNKzExaC^-4*mB(t7r+zm;&gXWA>iKH3;6m}@R*%UxEa65`Kn&-ufd}VB^#yuH5 z$-l^mILOgE=8lKGr|G-DOzgT=*00W_Y&7YAyXWCx#nowAg3tVX_sCT<|1&~esbLj# zbEjind}mz<=qjwG4$&|JSyDgM%;xcpTy6SA`Y*P!*%pL`BLbCXON&dx`@KfagPOc- z$YXk;IK9yY?)Fq|q2z-@=D=GCa4Zb^V3XF`Za}zSN>Ya_ZR%SBx@P*tywf;2AJvp# zgfykG*Gv+Vhd4;|)>~61d79N;>gsu=m_56$za|pK1sqkTCTc}lDn7_K5rJrWKl7AE z`P=QXo(azh;8tq)bEYw?7ui40`#f^lV3l*67@?pMfRlR=V7!Qc^`cm@&L>s(tCD7+ zNMkQ2VdQ+i`*k$#mnj>m&$AUqAqdg$O9ULK6d%+Z#j5vsvKw{=CHie)vVcsp9Cw-k zPJN_E=RlX|EXr;*v4DeOOM~V*xr=E|$S=@4rXa25Uvw4zY-@lM7M9t{DozSUxM~K! zw$ex_w}*ZNLY!u6VO-Q(_gYz+YfNU~JQ76sXC=9? z_tq-|fpHUoHy5%@@BNddP<^25)p!@xE z1{`1GOJCo(Iw_hA7k-_a+s8M$FPyfk;x%%U$7OKeN_mWWV-*(em)NM)29kMVys(*4{d@aq zx;QX;SeQP2&uzH*H48y3Pa)de0Io@;Oq7i>rQK^DyT|BmE$LIWh?Wl2p}qSf3DlZr zO#L;~k|XoT^Rs*!^NLOg?84AjQV+U`(rVH$)}3JE*RItqB-XMWJSNwGpjK86!16i@>p zcHp%h+C=O)x&sNtbopps(61qdd3CK?X);sDD<%aIEihdxkN@q2@8!ZeUJ$`$w~|;m zP6vlAfiAA&;f%_OOLE9T)FEAyy)DxNYZ%Cs9wzw=e=HkAQ-4S%R#^KxOPY# zmAq|&eZKMC$ZbW1@*fkCC*H6946mJbsPR`8%H~uO=wj?&Cc?S#D$;qLV}E@&k8NB` z@bSR7w#jmT;io*k|5EVc{7;F;>Vhb%?EVoJuX{xZwh#ZLuyg(Gg{2479MyS-UBFBE zXYCw*5$3;!!da|5zr(P*!Mh*VQTJsBWfS4Y*mP7_ZCZVG<-2<8IPFjL*(dIcL%@05 zWZ0uD#NyBfd`GkxILp}ILybCEeJDV7*?gUIVP4VO;ifjeZnvco2mcO)`;J~78?@r# zx=!mL(Dl7$In8Rr;wx89@ksBw#9B<=pyq*jdtW`<#LJ847aR9d!svsf&gX9TDANtI z0-UdVJdYWzhSinQAH1*5$KWKAi%Sgov)`X=MlWBo!@p^}Z?dgfP;$Pn+YhJ9?`qdD z{h(;J_!X9A^MT8zj;~HrG*zrvo}@#HnQ!oOck>8C@@vnqLT|u>!-sZrS~iaEV1+{W zs(D4ssw1I}f^j6*f|!9ea1;gO-Rd0OlKB!U0jyj_myoWRd#r#0`w3C&yswvn*d>*S zRoFFi8XUzM!5Ip^rMPd=RQT!K-dkVBB`OoCQxZ0O`>9FYWM4-c8rj*!JsTRi=DxV& zHAONRLlf-^$|<#UYIMzF66KNR5i2xxpf#*CD&f+w_D;Lts|`e!lNB=x&Ei(Vct32aN)Q#<8H6tyZ&lAExRaW+xC?rn~{`5N!xg>DqyabD$HHHN-cRt50$(q zZ{fZC8bk6(SeKq=P7*IedN_7ctg&EFpz;N=a{$FfE4Gwmg0oPWKO3`OkdI!KOTWwY z%`6_3i4Tn?W@pps7mDQ8Riw?TJdEQPIqm|p-EhkX*_J8itPTF5vVK_3@Q-Wqi|{5( z@F)m+%M*GhuMHL@@s_1KoB2LzDJ=yt?V{RiA2mIr+si4VdbNA~^HfANd6PSi%#y$t zC#fHAdr3!o59hVqBl9Uv1+Km7N3drGvR#CTuARHijzLM7n^>Csk$O?iMYl8NN)v~s z#-$}6c<0IG5C?CpsI$`_MRB^!!5x_EFtuY0U=P5)S?p zxOiFFE8gP{weDwUNqUd7lWKx!RI9Xl`D<#>?jdq|he^)26aiM0yWIhCP|wb7nT&O> z%4WcwrObuAQTmf*>8){YGs2guK{MCd&1xk)=k3SE-b}(}q{|Y~S3A6fHi!PGI`lt^ zT`7{6omVc?UB-hU2ywY)Q+E#oYNb=`y;i0TpN{9ecHg2)^xSjJ+2xf(NMIo)9J!ul zqjzgf*~!6BeSR)`FZ5;X&r#SmjhB%+2`^3IYnauwNTklNyUD7j+wcak*4lY|jGD0W zbA(9SDy5Di0u0UnTN+X1AgU`>vM z?3=Cw9ZoE|zuVwf)HX#6p6K*it=L1`2@UWE6Pifs`U*nxjiY0>5u-Jbz%tVJc$N-X zSN%I-qmDs!p7I_8oLfJhppONs4PBBh@Y26X9fht~VGpYpAHFOS7fNJwzhJ8H(8H!g z9VjJQ7vMI`_>idmGUIR?rO}^_a=~*gx~IA2*slWd%4k$*o9{+uUSmSjYD3`8CI!Uq znBl_7W%h1CY1e!iiO?dpi|yg|N;%+|N8U2LO{J&IP>K@O0_xal!#J+*!7QpFWpMrx2itoF3&%h=F-j<(SC+%w*@|u*Gs(~aegYqV_QkQ~K zwPVlE7ujfYN38ZD===!DKI2G`HYDOBuhF7iqjLl7R3vAf4w9KEIj~3Tki&Yv4M`9F zYp-RY{LK`u?ei-*EyZI4i~zXuRHwNuklU?h%fdL5wzIOQjPkOmXgn6=#?u!JGnonV0KU&AmmwF zhI8SjxJlUmux{9cU=)18f9DZMo>1oP#N;t|2TS`k zvUgkWkuE>Ebgu6ev+O#@%8T&9TN0V!O%P}bpQCo_7}tE}3f)^f7^mmMw`K*6HB-}w zrUZfhaVU(PogY3YNyY77C%#3ypUy1GPA)@sMo+N?BKR9hh1R^b!Y%1UvmhV9TCGR6 zP=@<6)lt||1UCx)2jLW=x6q%Ch;l*SgE23_xhuHtciT!gwbBa01|P-^@HDD?@S4t6 zQ7-Y}XHX^g%;xE=_Q2;@s$g4u8~jNa%|z?B%dc@J)qkEe#j&q-R)yR`X*Lndr%GIK z!n>z=@@TjcE`z)_O(+9+wFuTR&aEF_Ij?DU@9u0QD%UN+4Kg@eOAVyEZR1vIiWOckV zyBzeQzD{kw5@(0C*@3!!{otflID%x6QUa^3thCt`&TS*nv!#~98R|55ibmJDLaq!a zF_d$29^v_VoA8zbl>MJ@ICqRKs4Ju_5l$)0Up<%d?A=dK^3CS)Q%*X6@O{1%dbCV; zjFUoQMGY2Gcd<5aU>+|rfZ-q&;+StlZ5w%{Vu+iTaOyeyc!Ym^-h8qa))XOEw5z^k z|3ahGrQ|^P%T0LxbHv!<*+ZrCHjdlRHS$`n6NjMhFm#m0KYF}S#0GHe9;f%=V@JEigOwl;y0sbPxDP}<4*8JaAbl!nLHrEhj5_#hXwnV*&o{j?tRmvYTx2+pxDGkvZ2--- z;VBB+Z_lq{Hxe-=@4g6P5ZCi#qZGv%2V#ZUr^{q7wGKt9Qu66?z}xj%P0ck(nqwp$ z={casv&=6qjdD>413r~{FV_;U?Ah}Foc z8r4c@n$ebZ$Ewtb#6e*~$?SxOhwgzC$vS+RW4HO1soF~hbV?=TQ1sOT&zFS}_HJ>v%U zlXsDAmfKi5=zNr+>T5QO!mR@g2s39DoJ>{~OdH;pG9*qk?s9l^LU+!+&DnDozU1i0 z^_h1aEb?f>o5%>s+dg=COph+&Mls5PcbWD))|x;X9P~mT(Won=I>B3))FYFC5a~8~ z?Die^CT#ICPMW)Li0jpswjWz1%qc@6$FIV0Hr#W!b>`!rkIpoimH(|$2-z|^voA+yx176`}dD6XzS=J;8+a>;}p%?}xeL8fN0qC!>`bY3h(KMbx-O=8s_61`Cd0 zD=dW6)%orM<}&=WfVW>i%_BpqjD^|lue|pR?ay@ z9WB~H$DkjJZ@lq@33i$rZyj9J*dI(5Ni|VLCdF@A><*XZSs%3)4_QDdi5kiP{WllQ zV9{$+OljPPaaf0v)sA)HxLozDA+0y!_x9E`% zrv($~7=B=}o)P8rI+81}+y2{5_RZ?;Z zO)Zy<4o6!ioqWi9GZPFyJeBYh<}3MLVS%DDG<|sS%41Q?-nse-5>8!p9#Seqg@39 zVRpyQjJuiv+*ns3)e0qw(BIGmc~?8FuiK)xh`I;jJ6PO!ngRr?(14F>Y3exnN!~HcRH3hMkv(tj?j@p4M)qzzMba^D+g;NOxD-on z+_`4~j9!lTjdJ(CjMi897EUGXvz#4`)?#lwB~jGTA?qp*fy#3icS%JF`AAXB1z);dKfGVluGl=g^Y=%jkd+Mud^^!8-u zEsRZNQZk6ssWyUciP39i6BxWg5rpu2DW@`Fwc=^hs6O1ETS^qOz3y@#=E9YHc@V|6Z##nuZ=Zh*5j+3bvuVd= zBEtZhB=4I9Nf;x(Uz*K_txmWF;-a+nEVwK9|cfK7YIRbw&hG>6twta!V0F($Im zlw!(lv!ZAYdZSdpt4%l70`=2%^aMk>sL>&rzo%_N=g#i3nX34%Ul>55u+?KU&cul(xGyp zzuBSHOjMI3;G9mIi(xO@_EK(Oq%EDYjv^Vg`m5#XhNIa!G1hNwSfR`p_Lza*;3$gp<+_(nm(G2##?w|+jO+?kQp1p<*LZP?_ z>po|HXP9%&^=JiOoEFmWf_@i}1F0GD>`{mr?EmKi@Gf3VHhmVP*ZCPl1X}M*Fk#XR zhDyQ7iROOcoAbPwZDZc~&nR^ov__3NFZ76eN1`-_D2_@)%YjnH zOKWv=J|@Rk7qM4hd84e$7t#8~U$5ju(%N%XiAz!7W^CzumD0~m&Y^?)dzYic8?f^kzWZIL=GV@gTZ+%2qYgzNYLr#kQ^>1hQ zxG^u1kC|wTOPI3|-Pt-h@dtf!{IpooGmJ0Ou-}HnT1AG+Ra(W4IHL@7%0%!MA}Alh z4H1rvQqH&H?sTG9UWP!*uzu9ADh>20I2{dJu+AKWSdJ5Q`%-@>!!O7j$mDP_P#ipG zhB28De|oe^Vq1@w!oIUvT0lmNVQ4-S4K{V&u3&MrlxSNh9Kd8ef% zZVWG2BQ6w>m{^{*$j~9o+ma?SP%olL#{M1R55H5}cYet^_hWy?rc1rDS$qBwp?0^! zc-d4B814OG^7-`#<9;U<+Ggd24XFkUl^tz5#K$jdiQK-pL>EDDg0usTR8nYs2X7P} z2v>NmGV!txkw+*ZUTkeFkma?+)g7epo`qW0<>0Jg7={p=kmtZg5+{yq4F9s*O2f{K zF*g0!5~N0l*N;f^`ZkG8JmEIZD0=rkVbBlRZ^&7^n7C<@bI2hw&|bL8gSZ+lKG55# z=4j=y2CymJ>k)Cd-fMy{XLT!NTxYlp*f{bYJtjh#tl5*hgrn6q9FNDf0$d{fZtq%Y z2AM>et|y$|OeFX!krBk)hiI87lgn%RnOUC9Irm=BkXg}4fOSMBl_m$+{qxFAk(y7w zlI3uKCfg712KOK&S?yVJwzHMq8bDo8<0kwMoZ#(y6ReSqCQXv;4 z_ilN_?})b^`Ay+6KQ20Yh0nHOXpp_f(-zx>VhJ*-yREReru$lj)?(jOci_AJu=j#y zDA(NH0(lvXz!tC{W<)Lcr2*_gVu%<`1iw*DQFwf;4!rf%3#4B9NvmZv5i81H6n3L0vjur6q3;Mw~r}lG%YGgJK3&deD ztNGoPKDCRly2tGdYE^(dB>sPMD%=tp8%hhmEe4v$jOapTS*F@J`Z?%sYc0x1D#o;zHE|Ul&S`#7P zy3za6rkcsOU3XX+#>_#kxmA|63qQ&G(eVv_G`MYlL6&TX;R-bz&LMUKsRD)I!aB=t zgx=v@?hL#sVIjZKAR=0F(`D2UOM3g&?*#+RbArO;-E#F0^i%auwz)T4z4lx;Nh_wZ zA>fW0VFc%h+!$l8!H5wx32L2cWefFsV!O$|5#Hn!m1wg26g7=JAXGc%?%5 zdxys}ITUN>heZ|wwqEEnyCVM)NvVR;1|Es&PL$LdQ1G-_CUHXnsiYSVn`9F&TcI_$ zU}iydzbZt{qDYx8V++L#s8ktSF#REXo_bt1Qec`GWNN(B?D|SPwF;WRuYM9<6Ei-&0Yf%9ZWbwRhnf^P$duclTB zLc=T{io>Comz~XN+T1zTp38`ptZ`Nz%fXj+Ab#mb=VCRwX_bbW*{VosL`J3i;)G3O z9>oEdaMAdw%Re5qZ_I6r$_IG3-u8!ArDyG>XnCsHP@Ge(CWX?hPh!zJw(0fWb?nBA z@J}VNM%JlFh;<)*%vty*ZQbepJ~j*%Y(F=BQK~+=y*s(}er48Iei^`8jtXN!=`qST zjr&|PMuR+W13v7sgOW_Xz$@CJpX2r@6TPFPdQY9)R3CPa zlEa)+%Nl7L)nnvq=M~i}ATWFF<*&sh)&ClZ7vE?Ok!`=Ve1l=a(Ako8L8e1 zrYdp#Xc<}WgwQQk#d|a&lJ-&qn`ga*Eq`E&i?L9qRf?aJ$RW{ucdgNIHUKS9H7YbI zxat$cx?cJaL-R3W_P}m@O#VsjJ2(exePiE{*GOxtzL_`lU6n>!dokWlPl+CL)$u9k zp=pZL%q*}ZmRv+?)w6#%bk3}13oo|+?3U(RSm)Heqia{7l^sGjQf60f-Kyv1Z;W!z z4w~oA+hJ4oQ)=#ib-F}h$BZrw>w1?mw`y8vVw8+XvL!}Dp6xqt7o}SM;+K0$fFgCl z@{GWZnnf!#5f#LoL^Dgqows{|=inQEW0LoN2PRJ49WeljTiXl#Sl?TX-is? zvAP_HKZ5u!5`$Do@p~lkZk!GB_Xp=6c$UHz!v*$)?f$ekbdeqYsPqw;eJg$|JWYY( zW!IoFt!weYX5kofq3L!k@`#5_o{eR3bjh^V+gV~L-IQ(TK-tl`pd-6TS>en;YruLBEjCC4$-sOrlhV||b5fcrs^>$caEx`!8ylAAR6RhI zZ8%<)Me8vJ7bQR;f2~a?yI%biSnzu?aKoBnf*ObC8QyGSS8jqVGKwBwwbgTY4pXJi z1r&2#AVsV{W@98?aYXr40~F6Q#elKgZoTyiZezHdLci2cZy`AYVY} z=Y12U9bp_?&5_MB33zJGsqF7_65UTym+nuSWLE2cdV$yj;OpklM+TsVUXs4^Z4fOp zzNy7GBeU#6%u7zYn8RY?=nuM^LS&y$EyB)&$QC=-?aV)_@*hDlBYOirT-M|!$Whr^ zhnqWios@DW=kz&CU?Mt>j~Zp4R92cVdxlrnrpyFe6^5@0_YS_xIDek3WJBm4WA*`I z+MFm6V3{)UK}I|0bq7XqxyMW%!wX!yx}N~W{}nJQCV;K;TGcU zc~nV2Uw_WSiC#TG^s@4$#|{&}Yj-QzT^($yw~~r&+*e^$n)o|PntRK2BbVo?C!E3@ z>+1z>=EMk?ve#x2EP!y#xC{v;Duf7`jrT9Y4#Z#etT;*RKVfQc(MPlqq7llF1GJ37 z=$&+*a{>;@s&4~7h89YWmNqbDqCAx} z@*W^Tgu@m$zP#Q-^;p8478rw&U9f(J2$bpEU$iEZwD@<7D#5c^P4jH*!dyPN6d`M& zplJrG=-+8DrWjA)D#jSzKluMa*`We)_ zqwr%0G9m)!JY=vL8y@5QOw`qz{`(;rM3h*%`Bfb}@h~%J%UEjM5r~9vr3(1p(Fdw2 zSB=|iEb1N(1~WV}yjRi}0i7;ulN4$}B{&On^PLuMxW!n+n)2Q>R~Xv)@N#_mzzT*kex7*`nS@*2>}cb4{0H)A?47=`S`Utx??O zke=bSGS(p*x6z_l8>ys`loi-a=2fuI4=kw~v<*449B5p&g?^4(=DLVN>ZcWGR09Ya zA}m(97xM!-g`lQ^W+yNFEv=j}lN2wfk6RO^`^QIG@qTbxq^Hhgon#;N{D|{3sAL!6 z`))2VdShSAv_sc*wUg8ER zy2Yf1EgL9##sb~`{95d!xuj&%)BW7 z#AqmMu`GIN6)NY?eq_;-@jdF2kLm#^pAX7=-+2a@s1N6gYCpYO)TLINc!a?9tDYQ1 zs_ns^^f|#4GTjHF?_!j=y&@z|z>_v}n4lrgP`HmOnL1Fs)jq&$JKuUg8=$!n1?v98pwCKv=wZ&ri-(NAp@7`fsl_OAXC5r8|==wxt3a3&}hga zek=_tgBe_#!5>KC;2{^nA->i!4Zh)Npj`1HyBr)qjghR{8=JX!AM&veoFV(VUe~YA z9EayH^U;Fpk)@H|d6U-t>z_0&wEeGc+o6!iQ)a5GPM~aXmn+UKnXBCgUom;&vs=T? zd!3Sov^8?Chc(8hJ0n9_7rbkJ_OqW!r<(KU(rc_2yI_<{Uv+MsL(*7NuYmYS?5=*; zX>tcAW+atJNrxJd@Dp2`A61#TT4ib7!c=?HjpOvtm*>S(3kzqQgd+4}h|Z$ptF;{i z2ozJa>7hq(#9vdUoLOcgm%z7??W5eFoeR-zu%HO-&Yn|`lECoO1F%uy4PN?%@u4o~ z*_t6z=Ikl!D3F0frnUasm}Qswc%}Bl_`Z*fEk?3Od0?=$W>@SgsyS_xnH+xl;UF(J z-Rai(n`cg_O)!hBR$&v2mOcR&p{RIg_NsVNQ!h&*xoa9f3MkQ5+PMgR~i~N;6*y?4*)okmJ@Qf$MQdYYZ84&)0 z8B<3B(7u=z^|k;~N^4x$%8|^qZ0pSd8u0`b+cnP5WS;tGexShj0!9m(0{NnB0YrF0 zV}s#oEW^tRun#gY*P5hTZR{xWSmfO!*AmGa9wucauTO5CPezJ#0y5}9vZ!y{`~7m! zrm5T5G1$<6Dvt1tVqVuDH$-{1rDty52m6Qe{_j2z$(n`SA$DpF!bL4YiA1|mUh-k_ zC5&Krv9G_mJ%BkwL~?Q{ooyWrms8mjCQTEGEn^w@>yj#lxF%{opPpCAu1M$-a~rUi zVfGL}QM=}TvUn{foVTRhZY9q@tcd73^6X*=uJ`aiOiMPWy|KW>$4Mt)@5*%+eYE5> zfayWD14)c8ciiQ;0wVW05$}{LEy8^dofA=Ef-aI>^)|N6c;gXQ=dHEsrO9Q?8Z;Z3 zv$;?faT#r{jcK*{fpp4gmHzxk58XI{i`uHgjLsQd3fc8bKpE`Dlm;aq%FBI1e8q(W ztFoFnHZ5uUmLuIXq^AeS8D5#tfDMif(TQ4!rK5M#lXJ}rFzsIQY4kjU;-axysWU=A z+A^huX$ehheGT>dMQ1JdT-j2a@fqT`kEsOh-|P)?yxdq5+RHZ`Ac1{0zOZV%lr0&5 z9T}TXJMG~AYpF>UkYvQ(?|7He&4~rZPzdQd6hc<1&F*%E*&`(2I*+9ySm3~wx~!D^ zDt(D@M%@qZ+i4u>1_>e4Z6y0co`}qoDCeP51v~1qsY|%mB>+p8x?vX7zRZT0%H5&y zN}wlvN(hi#L=Pzcyo6Hva<gOgNf@hB>hKM|W1_{B0XZ7th zO~2S(xSgh9^Q9Z;sh9Bv2}S*Q`3nw9k|9PonYQD_E9{4wHY()cQWV4}qouEi zPQ>&a2mdKIIT?Tf;P{^Bb|6mrlx1pN!OA{o@pbOyaRl)T(7To|QsrfljHW9qP2Emy z&$GYB9d4bKQCRE2XaBY9*85WPtj9xNOJ^d0f7ra#2F+;W;`wkn)by-Al4v4}G?Jv@ z)7ot4&v$J(N}weFTDXS5%{Try2eIcpk78N5a}RB&D_kM#gYlBAuc?p^V<-k=ZbVi} z$a;_$z(;FF(%`UXKSkW{Unk)DKbm42&c$Quj-9F}lIN#a%9_gW%b4bxc91Xy$2toR zJ39tmpsXeYdladzHSm%<`kYa5Nr~2y!0anobjN=g_qD%_yYr#RnUMd@+o}VzP>P#( z6aiiR?cSIpRWgy}<4}9P5z%G;yEaa&z=72rkqi}Y^^Z9#BA7HR#Uw!1r%qVt2lZy$ zi&VYkpm{W_g2=Y)En7icjWy(0NITh8z4UYhCSzdRs`Hk5bb zF^Kb0D=(-??PbLQOv$YYGTw+p?9JW4D&GHq%)Nt0IcRaalNKJ0!W}NLb|(qqOs4{7 zc9Q?2rtU5N1V$`w_m{DNzDYu#%A*63zt4RZ)CM~t;zv0CLf+N1muH$k_V0GdQh)mu zetHx6>>}Xr)~fnFGG%yLW8Mybb+$FBL^kEV`YlVsS)12}pZLrFd5j_k zK$9M^>nr^S0RMmfz>^UW)^C8o{{)*q0=gXj!;1AE0FH0~mrA$uzwhXO9l!(KNB9Us z>rYhM0M?x|9pN9?z~B7E`2cj|BjdW{e|6da`hn-^N96y8&j0s;-yu;4zx#_w4Qz)W5tsalYn&Q@)d?a0J)r;9I_gKj|HHNYhB4q@KlWN^jsJg+ z#(%c-{|){B8~Xp6Qh&ewzv8JE(|vllG+PY_Nv8n3>#+BLG)mP3SIuulC%F7`Y0NKtt1aa9QqID5_G?k^b6-uNZv@yMn)dK!Nusz0$bV#df$n;R0@Qlqq+(8rn{�yg&^PN`S)CH+tK}wCdGGzWw2#{V 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 T5;*HgfJ;~N_6>}>E$aUObD(5r diff --git a/docs/management/connectors/pre-configured-connectors.asciidoc b/docs/management/connectors/pre-configured-connectors.asciidoc index ceaf771a58f9e..443fda6cba218 100644 --- a/docs/management/connectors/pre-configured-connectors.asciidoc +++ b/docs/management/connectors/pre-configured-connectors.asciidoc @@ -57,36 +57,80 @@ Sensitive properties, such as passwords, can also be stored in the <>. ============================================== +[float] +[[managing-pre-configured-connectors]] +=== View preconfigured connectors + +When you open the main menu, click *{stack-manage-app} > {connectors-ui}*. +Preconfigured connectors appear regardless of which space you are in. +They are tagged as “preconfigured”, and you cannot delete them. + +[role="screenshot"] +image::images/preconfigured-connectors-managing.png[Connectors managing tab with pre-configured] + +Clicking a preconfigured connector shows the description, but not the configuration. + [float] [[build-in-preconfigured-connectors]] === Built-in preconfigured connectors {kib} provides the following built-in preconfigured connectors: -* <> +* <> * <> [float] -[[managing-pre-configured-connectors]] -=== View preconfigured connectors +[[preconfigured-connector-alert-history]] +==== Preconfigured alert history {es} index connector -When you open the main menu, click *{stack-manage-app} > {connectors-ui}*. -Preconfigured connectors appear regardless of which space you are -in. They are tagged as “preconfigured”, and you cannot delete them. +preview::[] + +{kib} offers a preconfigured index connector to facilitate indexing active alert data into {es}. +To use this connector, set <> to `true`. + +When you subsequently create rules, you can use the `Alert history Elasticsearch index (preconfigured)` connector. [role="screenshot"] -image::images/preconfigured-connectors-managing.png[Connectors managing tab with pre-configured] +image::images/pre-configured-alert-history-connector.png[Creating a rule action that uses the pre-configured alert history connector] -Clicking a preconfigured connector shows the description, but not the -configuration. +Documents are indexed using a preconfigured schema that captures the <> available for the rule. +By default, these documents are indexed into the `kibana-alert-history-default` index, but you can specify a different index. +Index names must start with `kibana-alert-history-` to take advantage of the preconfigured alert history index template. + +[IMPORTANT] +==== +* To write documents to the preconfigured index, you must have `all` or `write` privileges to the `kibana-alert-history-*` indices. +* The `kibana-alert-history-*` indices are not configured to use ILM so they must be maintained manually. If the index size grows large, consider using the {ref}/docs-delete-by-query.html[delete by query] API to clean up older documents in the index. +==== [float] === Examples +* <> * <> * <> * <> + +[float] +[[preconfigured-index-configuration]] +==== Index connectors + +The following example creates a <>: + +[source,text] +-- +xpack.actions.preconfigured: + my-index: + name: preconfigured-index-connector-type + actionTypeId: .index + config: + index: .kibana <1> + executionTimeField: my-field <2> +-- +<1> The {es} index to be written to. +<2> A field that indicates when the document was indexed. + [float] [[preconfigured-opsgenie-configuration]] ==== {opsgenie} connectors diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index 9ab4058d35e30..c7a43932fa1f8 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -252,6 +252,9 @@ Specifies configuration details that are specific to the type of preconfigured c The type of preconfigured connector. For example: `.email`, `.index`, `.opsgenie`, `.server-log`, `.resilient`, `.slack`, and `.webhook`. +`xpack.actions.preconfigured..config`:: +The configuration details, which are specific to the type of preconfigured connector. + `xpack.actions.preconfigured..config.apiUrl`:: A configuration URL that varies by connector: + @@ -261,6 +264,12 @@ A configuration URL that varies by connector: 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.executionTimeField`:: +For an <>, a field that indicates when the document was indexed. + +`xpack.actions.preconfigured..config.index`:: +For an <>, specifies the {es} index. + `xpack.actions.preconfigured..name`:: The name of the preconfigured connector. diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index a8d63137fa0a9..147b26fc6e03a 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -552,7 +552,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { maintenanceWindows: `${KIBANA_DOCS}maintenance-windows.html`, pagerDutyAction: `${KIBANA_DOCS}pagerduty-action-type.html`, preconfiguredConnectors: `${KIBANA_DOCS}pre-configured-connectors.html`, - preconfiguredAlertHistoryConnector: `${KIBANA_DOCS}index-action-type.html#preconfigured-connector-alert-history`, + preconfiguredAlertHistoryConnector: `${KIBANA_DOCS}pre-configured-connectors.html#preconfigured-connector-alert-history`, serviceNowAction: `${KIBANA_DOCS}servicenow-action-type.html#configuring-servicenow`, serviceNowSIRAction: `${KIBANA_DOCS}servicenow-sir-action-type.html`, setupPrerequisites: `${KIBANA_DOCS}alerting-setup.html#alerting-prerequisites`, diff --git a/x-pack/plugins/actions/docs/openapi/bundled.json b/x-pack/plugins/actions/docs/openapi/bundled.json index 67191da3842d6..ebd18fad973a3 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.json +++ b/x-pack/plugins/actions/docs/openapi/bundled.json @@ -1659,7 +1659,7 @@ "type": "object", "properties": { "executionTimeField": { - "description": "Specifies a field that will contain the time the alert condition was detected.", + "description": "A field that indicates when the document was indexed.", "default": null, "type": "string", "nullable": true diff --git a/x-pack/plugins/actions/docs/openapi/bundled.yaml b/x-pack/plugins/actions/docs/openapi/bundled.yaml index 5da86f4563a6c..39a6bea27385f 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.yaml +++ b/x-pack/plugins/actions/docs/openapi/bundled.yaml @@ -1028,7 +1028,7 @@ components: type: object properties: executionTimeField: - description: Specifies a field that will contain the time the alert condition was detected. + description: A field that indicates when the document was indexed. default: null type: string nullable: true diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml index c82f775fe15dc..6c335b166d20a 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml @@ -5,7 +5,7 @@ description: Defines properties for connectors when type is `.index`. type: object properties: executionTimeField: - description: Specifies a field that will contain the time the alert condition was detected. + description: A field that indicates when the document was indexed. default: null type: string nullable: true From 24cbba299787c9d3a5108fe2e2c6cc9f4a73b362 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 6 Sep 2023 04:24:59 +0100 Subject: [PATCH 06/25] skip flaky serverless test --- .../functional/test_suites/common/index_management/indices.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts b/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts index 02b6acdfbfa56..b4473f0ba16a5 100644 --- a/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts +++ b/x-pack/test_serverless/functional/test_suites/common/index_management/indices.ts @@ -15,7 +15,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const security = getService('security'); const retry = getService('retry'); - describe('Indices', function () { + // Flaky on serverless + describe.skip('Indices', function () { before(async () => { await security.testUser.setRoles(['index_management_user']); await pageObjects.common.navigateToApp('indexManagement'); From c9958485facc282294916508b2c5b766555c3205 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 6 Sep 2023 01:04:20 -0400 Subject: [PATCH 07/25] [api-docs] 2023-09-06 Daily api_docs build (#165794) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/452 --- api_docs/actions.devdocs.json | 32 + api_docs/actions.mdx | 4 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_chat.mdx | 2 +- api_docs/cloud_chat_provider.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 4 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mocks.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 556 +----------------- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_generate_csv_types.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.devdocs.json | 28 + api_docs/kbn_search_api_panels.mdx | 4 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.devdocs.json | 56 ++ api_docs/kbn_slo_schema.mdx | 4 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.devdocs.json | 144 +++++ api_docs/kbn_text_based_editor.mdx | 4 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_url_state.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 8 - api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/log_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.devdocs.json | 64 +- api_docs/observability.mdx | 4 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 20 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.devdocs.json | 194 +++++- api_docs/stack_alerts.mdx | 7 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/text_based_languages.devdocs.json | 14 + api_docs/text_based_languages.mdx | 4 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.devdocs.json | 61 ++ api_docs/triggers_actions_ui.mdx | 4 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 581 files changed, 1202 insertions(+), 1136 deletions(-) diff --git a/api_docs/actions.devdocs.json b/api_docs/actions.devdocs.json index ab2fd467cd958..68e7723fc7fa1 100644 --- a/api_docs/actions.devdocs.json +++ b/api_docs/actions.devdocs.json @@ -3509,6 +3509,38 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.setEnabledConnectorTypes", + "type": "Function", + "tags": [], + "label": "setEnabledConnectorTypes", + "description": [], + "signature": [ + "(connectorTypes: string[]) => void" + ], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "actions", + "id": "def-server.PluginSetupContract.setEnabledConnectorTypes.$1", + "type": "Array", + "tags": [], + "label": "connectorTypes", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/actions/server/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "lifecycle": "setup", diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 1675e5db1912c..0985f86300e69 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 267 | 0 | 261 | 30 | +| 269 | 0 | 263 | 30 | ## Client diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 17d00954ff5e6..4db3eb7532c53 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-05 +date: 2023-09-06 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 e69040bbcb687..85d9b71699e77 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 74220f3e48d63..319891bcf513d 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 1f3e0da71d41a..a895f490187fb 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-05 +date: 2023-09-06 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 7e0cb19b76349..2373d1d20cfac 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 7c9e072b32a5a..5a2e02e21714f 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-05 +date: 2023-09-06 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 b095e025ebb25..71690f87c1a92 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-05 +date: 2023-09-06 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 b35d2c259da58..cc1fe5f9fa748 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-05 +date: 2023-09-06 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 391741661db72..f8d7b2a27d369 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-05 +date: 2023-09-06 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 34f1b185e06bc..1af3539ef5ac9 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-05 +date: 2023-09-06 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 80664fabad87d..d3d61657ed676 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-05 +date: 2023-09-06 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 73b5ef4c2517e..01f2089596b6a 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-05 +date: 2023-09-06 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 8b0f6a65ddd8e..be0fb6438525b 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-05 +date: 2023-09-06 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 89e27b560261f..88d1e38aa0e5a 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-05 +date: 2023-09-06 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 5410157a3a4e8..b6124e08cd350 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-05 +date: 2023-09-06 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 765d3226f9c3a..4e21c123a96e8 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-05 +date: 2023-09-06 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 e0b54f328ba2c..8efe7de4747d1 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-05 +date: 2023-09-06 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 113f43f209db5..4c8df64fa2cfc 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-05 +date: 2023-09-06 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 6318a4faa542c..4940ef352585c 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-05 +date: 2023-09-06 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 9886b7a3ea00b..3237478bf66c9 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-05 +date: 2023-09-06 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 a5dd74b6330d1..2cb7a44d97fd0 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-05 +date: 2023-09-06 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 66ba3a87e78bb..d13956de9f217 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-05 +date: 2023-09-06 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 91b1eb51f287b..12a480db48c7d 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-05 +date: 2023-09-06 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 a45b5025b2fe9..74994c4829bec 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-05 +date: 2023-09-06 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 70949b17f4987..46531c9a02904 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-05 +date: 2023-09-06 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 62d0861bbbf19..310e48213af7a 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-05 +date: 2023-09-06 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 fde4b2f40f862..08230c72660ac 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-05 +date: 2023-09-06 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 d2fa815d40409..a29d62bd9c5ae 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-05 +date: 2023-09-06 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 c10490b5d7a9a..187c9712e4b69 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-05 +date: 2023-09-06 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 6e41bcc12d78a..07264a9d936a1 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-05 +date: 2023-09-06 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 0d85b10f37cbd..9e13e90657c1c 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-05 +date: 2023-09-06 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 dec5ec2987ed8..4fa0316ec8e5a 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-05 +date: 2023-09-06 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 a01b818334271..10632b2d4896b 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index b09904070bf9a..195314fc734f8 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -921,7 +921,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | - | | | [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=title), [persistence.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/persistence.ts#:~:text=title), [persistence.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/persistence.ts#:~:text=title), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=title) | - | | | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | - | -| | [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [workspace_top_nav_menu.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx#:~:text=toMountPoint), [workspace_top_nav_menu.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint) | - | +| | [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [confirm_modal_promise.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=toMountPoint) | - | | | [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=KibanaThemeProvider), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=KibanaThemeProvider), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.tsx#:~:text=KibanaThemeProvider) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/server/plugin.ts#:~:text=license%24) | 8.8.0 | | | [source_picker.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/source_picker.tsx#:~:text=includeFields) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index bbdf4234fb74b..a325fd6f43f55 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 6b0064c8f0858..de965350e87ad 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-05 +date: 2023-09-06 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 a63ae77760646..c74856cd3ff5e 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-05 +date: 2023-09-06 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 675890ffa1ac8..9f6ff44667e3a 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-05 +date: 2023-09-06 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 90e742bda6198..97310dfc057fe 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-05 +date: 2023-09-06 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 ace6dbb2a4c7d..ec0bdf9631439 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-05 +date: 2023-09-06 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 be41e8d5bc699..06a56b891b64e 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-05 +date: 2023-09-06 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 8fd457f066ffe..ec718fa5655d2 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-05 +date: 2023-09-06 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 cf6cd38a5251c..4f83486d558e2 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-05 +date: 2023-09-06 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 07418305cdc71..5499ef93aa543 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-05 +date: 2023-09-06 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 f5aaa1ac5bd5c..0f19677a6dad2 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-05 +date: 2023-09-06 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 d72d41002cf5d..2d036d98c176a 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-05 +date: 2023-09-06 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 edabbf7f2b416..28d0b86a754bf 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-05 +date: 2023-09-06 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 d977e9d3c6444..872e71e7d9514 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-05 +date: 2023-09-06 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 cf353aeb1663c..2ebc1a0477ab0 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-05 +date: 2023-09-06 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 4dc1d165e75fb..dbcfa79c17407 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-05 +date: 2023-09-06 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 bd676f00bd162..92cc5b1de1d4f 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-05 +date: 2023-09-06 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 e07f5ea5cd63f..3088aaeb30bfe 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-05 +date: 2023-09-06 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 38013982ab985..6069e11e72648 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-05 +date: 2023-09-06 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 0e8902fbf0a0f..a99de7d753807 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-05 +date: 2023-09-06 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 fcae81f5883cf..db6de17efd135 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-05 +date: 2023-09-06 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 039b050b32bc6..8e515e738c6df 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-05 +date: 2023-09-06 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 9f2f3434acb56..773380b5de18f 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-05 +date: 2023-09-06 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 8f9d323b53023..0d0470eb67888 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-05 +date: 2023-09-06 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 f3e7d5eeaee3c..105172011496c 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-05 +date: 2023-09-06 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 214d3d21153e2..1101379011fb9 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-05 +date: 2023-09-06 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 7f245d3889e1f..054d4560a99b0 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-05 +date: 2023-09-06 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 ce5cf4cc0939f..74a4cd4d131bf 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-05 +date: 2023-09-06 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 db13ee18b015e..fbfd9a1d0855f 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-05 +date: 2023-09-06 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 bc8dff8530b8e..176f7897ba0aa 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-05 +date: 2023-09-06 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 7cb2ca900ab10..d9b7d3b411174 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-05 +date: 2023-09-06 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 54c4bb33663b7..3eb1600270481 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-05 +date: 2023-09-06 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 fe86c6e0074a2..dd194c513358c 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-05 +date: 2023-09-06 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 58bf0969ecb00..02687c281e11c 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-05 +date: 2023-09-06 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 53425f7e23d24..eb73dfcd24143 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-05 +date: 2023-09-06 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 a1230a39ce3f2..ea77ddbecac91 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 9915ed0e2802a..689e76b0b9cad 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 586539ca0d0aa..99620afbd13a1 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-05 +date: 2023-09-06 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 c394ca0f93615..942abb35cb86f 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-05 +date: 2023-09-06 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 25a6849dd773c..d9904dab581e3 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-05 +date: 2023-09-06 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 0cccce355c006..90c41da824f8e 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-05 +date: 2023-09-06 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 5b47285b9edcd..b889647d6b02a 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-05 +date: 2023-09-06 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 c3c4259afdfb1..33964bc6de443 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-05 +date: 2023-09-06 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 9d13f55b01c3d..874707881804d 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-05 +date: 2023-09-06 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 6e51456817f54..05a81b1a8feef 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-05 +date: 2023-09-06 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 9bb30d89b5db3..677382c6e0405 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-05 +date: 2023-09-06 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 c60de50828f02..8a6ccbef94e04 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-05 +date: 2023-09-06 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 45459e55d57d2..c29ef9f2d3687 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-05 +date: 2023-09-06 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 64b3d4ae9600c..20c1b38ed8419 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-05 +date: 2023-09-06 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 0387bc14aa30c..2e4bcf1093c08 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-05 +date: 2023-09-06 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 a2dfb1d49ac93..5f117aad37f87 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index c36b7b83b967c..7bbdd9182c6a8 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-05 +date: 2023-09-06 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 053d4313a1174..91b41b353c85e 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-05 +date: 2023-09-06 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 5b8013b126b1a..b5f1c3fde5c2e 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-05 +date: 2023-09-06 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 c2055ef8d02bc..df1585a9557ba 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-05 +date: 2023-09-06 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 df61103a09941..fdd2bd041f9fc 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-05 +date: 2023-09-06 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 fb844e6b7c754..9025efdcccbee 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-05 +date: 2023-09-06 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 30c1a22a8ec4a..22ba77889cc08 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-05 +date: 2023-09-06 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 09007f8b0e82e..2145de70fd218 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-05 +date: 2023-09-06 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 a04a564cde49c..19469c8e8373b 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-05 +date: 2023-09-06 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 ce523adf57985..e064ff507b39b 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-05 +date: 2023-09-06 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 9f4d642a9f4ef..c817f89501300 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-05 +date: 2023-09-06 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 82da938a2e3b9..cc6c2e7c69890 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-05 +date: 2023-09-06 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 b14c9ededd480..71e1f390d6646 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-05 +date: 2023-09-06 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 e49db93b653a5..6dcb11df62f92 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-05 +date: 2023-09-06 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 6b8ed504dc92d..6cd8345f78503 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-05 +date: 2023-09-06 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 a5c29e677ec23..723bb8a4741b9 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-05 +date: 2023-09-06 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 50523b6543892..c24fd85553e1a 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-05 +date: 2023-09-06 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 30878509c9908..f92216a33e2c4 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-05 +date: 2023-09-06 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 001c90e047fae..aa3b7bac022d5 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-05 +date: 2023-09-06 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 909659dcf4b32..83331cb9c1a73 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-05 +date: 2023-09-06 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 4d1b33ff13923..5f1dc03899307 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-05 +date: 2023-09-06 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 2d3190c184aa0..27a106cc7a8e8 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-05 +date: 2023-09-06 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 a044b568a4c6d..bc12eabd449a3 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-05 +date: 2023-09-06 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 7dff56ea557ef..8b9f1735d0551 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-05 +date: 2023-09-06 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 d98cbfcac9f03..f0e644b3f6a72 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-05 +date: 2023-09-06 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 571943ac43efc..ca6e85734b249 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-05 +date: 2023-09-06 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 f840d96fb96a8..a2e394b5ea713 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-05 +date: 2023-09-06 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 80dc326e0b499..c0f56347084ff 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-05 +date: 2023-09-06 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 59ee0aee26e27..2ddb0a46a82c6 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-05 +date: 2023-09-06 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 da3749b332c70..71e1743ff2a9f 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-05 +date: 2023-09-06 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 abf01e9b87809..b8a5f7f52d98c 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-05 +date: 2023-09-06 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 eeafd6d571c92..97a38610e99ef 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-05 +date: 2023-09-06 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 56a4f9835d002..55f676eea5f44 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-05 +date: 2023-09-06 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 d62cfc6e67a36..09a7677e1b56a 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-05 +date: 2023-09-06 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 c734b69e04e11..54e73f3583b24 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-05 +date: 2023-09-06 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 af02ffe0dc431..f852dd94d67a4 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-05 +date: 2023-09-06 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 0c91163570254..fda9e4147f3d7 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-05 +date: 2023-09-06 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 2b4ca8a154b87..7b7bd2ff59c42 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-05 +date: 2023-09-06 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 839b32626a245..253bd423024a6 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-05 +date: 2023-09-06 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 498d5d98e4a90..dc7cb08859ada 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-05 +date: 2023-09-06 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 53cde53b4ed52..b43365fa7cf9d 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-05 +date: 2023-09-06 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 211b46e09eabd..2989abbfb45b1 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-05 +date: 2023-09-06 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 14b282a273f22..4bbc9f2727889 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-05 +date: 2023-09-06 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 315c7acf87a17..3057b026516fb 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-05 +date: 2023-09-06 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 9b9547190aa86..a41a066e3116d 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-05 +date: 2023-09-06 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 99e3e0ed02fa2..b1c4d5c02c3fe 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-05 +date: 2023-09-06 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 4e1e2c7844df3..2cec1dd239207 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-05 +date: 2023-09-06 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 647817f602e86..c0047306b8f83 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-05 +date: 2023-09-06 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 5a469f8fb6cc0..5cfa7b3df9daf 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-05 +date: 2023-09-06 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 fc98432fd11db..ddc641e1eee49 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-05 +date: 2023-09-06 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 707a34374771c..199ea676a211b 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-05 +date: 2023-09-06 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 ebfd9644f1ffa..87cc2be55db43 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-05 +date: 2023-09-06 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 86c1b2a59a51c..faed4a14018dc 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-05 +date: 2023-09-06 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 941f7eeab85a6..60d510d551c91 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-05 +date: 2023-09-06 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 ec369f63898dd..b878d1a7ab151 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-05 +date: 2023-09-06 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 e392692c7a0ce..5e2fc1372babd 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-05 +date: 2023-09-06 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 8871af521c930..8947bc93d11a1 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-05 +date: 2023-09-06 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 6b56be8c38b51..b9b47c43d59eb 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-05 +date: 2023-09-06 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 e667a125a4268..fbd85c0ed6b47 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-05 +date: 2023-09-06 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 9127767aba5b2..f02e9dcb86806 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-05 +date: 2023-09-06 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 8cf713c6da2f1..d42cc7ed4822e 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-05 +date: 2023-09-06 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 f1ef685c162ad..e72aa5b4728de 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-05 +date: 2023-09-06 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 324b3291c428b..89bc353e5baf8 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-05 +date: 2023-09-06 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 bd3bb18d01281..00d1054a0a915 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-05 +date: 2023-09-06 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 f72e86ef83440..0a266520ad02f 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-05 +date: 2023-09-06 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 4d968a10b1371..5befa6f5952ca 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-05 +date: 2023-09-06 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 aadb7ee12c9f5..f0b40dbdb50ad 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-05 +date: 2023-09-06 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 5891024b67a45..8fd99fbc6eee7 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-05 +date: 2023-09-06 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 f5369679076f2..0c10b629b805f 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-05 +date: 2023-09-06 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 a4628267a3b23..d9111ff5f70fe 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-05 +date: 2023-09-06 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 af7d968100a5a..84ffe2a552c1e 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-05 +date: 2023-09-06 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 6dffcd5bf011d..2c3f8173e7951 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-05 +date: 2023-09-06 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 9f3b157a0e7ad..d00a1502a7330 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-05 +date: 2023-09-06 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 7196d5b59d0b4..ac9c6838058a5 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-05 +date: 2023-09-06 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 dbc1eaec1fb49..cd0f5dfbc331c 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-05 +date: 2023-09-06 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 c353870e9bd1c..5c9ba89d1d3cc 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-05 +date: 2023-09-06 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 1a5426df061ed..8ddec293e6234 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-05 +date: 2023-09-06 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 ea6fd0531228d..e41cd33e69f2e 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-05 +date: 2023-09-06 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 bca77c3503b45..d2b49ab6107b0 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-05 +date: 2023-09-06 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 376f67dce7275..f91003ff0eb4e 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-05 +date: 2023-09-06 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 ea1da3f4749f4..a6e016cf61aeb 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-05 +date: 2023-09-06 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 bf0e09898be90..b37e85685210c 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-05 +date: 2023-09-06 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 5775b5d5f9b73..6c2ff683c7bae 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-05 +date: 2023-09-06 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 9a5c8dc842acb..b64ba2f04dd64 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-05 +date: 2023-09-06 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 24b454a40a72b..a8828523b867c 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-05 +date: 2023-09-06 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 2323310976cdf..8493514402cb1 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-05 +date: 2023-09-06 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 efa9880e343cd..5c69f0bf3be8c 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-05 +date: 2023-09-06 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 688cb85dc67d1..797af39591fed 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-05 +date: 2023-09-06 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 ed462f0b7103e..676aa7b03ec77 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-05 +date: 2023-09-06 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 9c9a2f63eab66..afc3e7d2c0f20 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-05 +date: 2023-09-06 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 f740c651d8dcf..1dc638f47b08e 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-05 +date: 2023-09-06 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 2307f7280d904..e1fc914d02688 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-05 +date: 2023-09-06 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 897affe7c09b8..af32e68b59eb9 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-05 +date: 2023-09-06 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 d4fdd95134136..b2d9f76b852a1 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-05 +date: 2023-09-06 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 87346e93af629..d36a9beb010a9 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-05 +date: 2023-09-06 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 c8dcdc45a54a4..623ad50e66332 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-05 +date: 2023-09-06 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 ef1491370a696..22c60891dfd63 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-05 +date: 2023-09-06 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 f85ebe7a68529..8cd5969d03905 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-05 +date: 2023-09-06 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 018b03c72899f..1972bc47648ab 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-05 +date: 2023-09-06 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.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 646cf9fd1bb02..cdf7045703aef 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3643,10 +3643,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/internal/find_tags.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "guidedOnboarding", "path": "src/plugins/guided_onboarding/server/routes/guide_state_routes.ts" @@ -4111,6 +4107,10 @@ "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts" }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/mapping.ts" @@ -4767,206 +4767,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/data_streams/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/setup/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/settings/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/app/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.test.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -5527,18 +5327,6 @@ "plugin": "cloudChat", "path": "x-pack/plugins/cloud_integrations/cloud_chat/server/routes/chat.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/uninstall_token/handlers.test.ts" - }, { "plugin": "remoteClusters", "path": "x-pack/plugins/remote_clusters/server/routes/api/get_route.test.ts" @@ -5727,14 +5515,6 @@ "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/test/helpers/router_mock.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.test.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.test.ts" - }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/anonymous_access/get_capabilities.test.ts" @@ -6429,10 +6209,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/internal/bulk_delete.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts" @@ -7361,186 +7137,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/setup/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/setup/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/app/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/app/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/preconfiguration/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/preconfiguration/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/health_check/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/message_signing_service/index.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -8431,10 +8027,6 @@ "plugin": "alerting", "path": "x-pack/plugins/alerting/server/routes/update_rule.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "guidedOnboarding", "path": "src/plugins/guided_onboarding/server/routes/plugin_state_routes.ts" @@ -8763,58 +8355,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/settings/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -8939,10 +8479,6 @@ "plugin": "cases", "path": "x-pack/plugins/cases/server/routes/api/register_routes.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts" - }, { "plugin": "security", "path": "x-pack/plugins/security/server/routes/api_keys/update.test.ts" @@ -9153,10 +8689,6 @@ "plugin": "alerting", "path": "x-pack/plugins/alerting/server/routes/bulk_disable_rules.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts" @@ -9201,14 +8733,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -9527,10 +9051,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/tags/delete_tag.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts" @@ -9775,54 +9295,6 @@ "plugin": "@kbn/core-http-server-internal", "path": "packages/core/http/core-http-server-internal/src/http_server.test.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/types.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/epm/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/package_policy/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/agent/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/enrollment_api_key/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/output/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/download_source/index.tsx" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_server_hosts/index.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/server/routes/fleet_proxies/index.ts" - }, { "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" @@ -13649,6 +13121,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_last_reported.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/json_schema.ts" @@ -14425,6 +13901,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_last_reported.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/install_prebuilt_rules_and_timelines/install_prebuilt_rules_and_timelines_route.ts" @@ -14761,6 +14241,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_usage_stats.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/annotations.ts" @@ -15401,6 +14885,10 @@ "plugin": "lists", "path": "x-pack/plugins/lists/server/routes/list/patch_list_route.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_patch_rules/route.ts" @@ -15545,6 +15033,10 @@ "plugin": "lists", "path": "x-pack/plugins/lists/server/routes/list/delete_list_route.ts" }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" + }, { "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/annotations.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index d75b9c88f0d8c..9c3496ef068f3 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-05 +date: 2023-09-06 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 17ec295e2b28a..9ea6c1275a4b1 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-05 +date: 2023-09-06 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 af7530ebe2780..064a29285937d 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-05 +date: 2023-09-06 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 8c8bf1891f9f1..528a58fcd9afa 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-05 +date: 2023-09-06 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 b28afa660b41c..fdb0954f4e478 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-05 +date: 2023-09-06 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 e26626cf1aa43..4528e9b4a1544 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-05 +date: 2023-09-06 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 1dde8083861cc..776c8c619f977 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-05 +date: 2023-09-06 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 4c96d38b98734..6a06e4503c60c 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-05 +date: 2023-09-06 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 c95da94e81dd9..ce6c84a1bd946 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-05 +date: 2023-09-06 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 313d1a1cbc7ce..adca2cad222a8 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-05 +date: 2023-09-06 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 b270138d4cde2..e1023f069e005 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-05 +date: 2023-09-06 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 bfad413d0dbae..58676fb7f6427 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-05 +date: 2023-09-06 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 a3d274221d1f7..b1d24176b8cb8 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-05 +date: 2023-09-06 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 b96e16ddd9e4e..559e1fa99ab74 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-05 +date: 2023-09-06 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 4ea507f43b8d8..58cfd92adec97 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-05 +date: 2023-09-06 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 e663c9a363275..a534b7d888b56 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-05 +date: 2023-09-06 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 c1e5800d3fc35..026bf2a562778 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-05 +date: 2023-09-06 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 377505265a597..c1d0e4b35eb36 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-05 +date: 2023-09-06 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 08e6c40d3b799..e837d8eb13ab7 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-05 +date: 2023-09-06 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 374fd7a4c3600..4e6036af67658 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-05 +date: 2023-09-06 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 789f56c123186..c5886d6d47910 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-05 +date: 2023-09-06 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 9ce1103581bb2..95a75ad4c18ce 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-05 +date: 2023-09-06 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 f65dc13cd22a7..380282b4554c9 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-05 +date: 2023-09-06 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 d9393f985758f..f78d7428e9be1 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-05 +date: 2023-09-06 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 2a7dcbd5d1af9..30ff706492b45 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-05 +date: 2023-09-06 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 8701f13ca30dc..d974a7a67c19f 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-05 +date: 2023-09-06 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 8d37a662156d1..9e2e896b4df6c 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-05 +date: 2023-09-06 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 4cc7d28317be7..c665b4838b3fe 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-05 +date: 2023-09-06 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 48905d30f9cfe..61ccc1bb4249c 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-05 +date: 2023-09-06 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 afca185707beb..c26140dc1a4f2 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-05 +date: 2023-09-06 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 f6a66c5963efc..4abe76f9aa06d 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-05 +date: 2023-09-06 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 147187be6169d..8ee27b4b6d659 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-05 +date: 2023-09-06 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 831b0fa16040c..d39dbc30f0e99 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-05 +date: 2023-09-06 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 13f3e351a4e1b..79796c21f1a30 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-05 +date: 2023-09-06 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 cee4243d41ec9..287e9f8b1253a 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-05 +date: 2023-09-06 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 d0e79df85e348..d2084acdedc68 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-05 +date: 2023-09-06 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 0efde46e225c8..a04f2da24f043 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-05 +date: 2023-09-06 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 b9b84c8887fc5..7a0c4e4360ba8 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-05 +date: 2023-09-06 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 7a04d07f67c12..f6950ead9c384 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-05 +date: 2023-09-06 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 8b8849d1e1a78..63c27b4dd965f 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-05 +date: 2023-09-06 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 bde0ba3320d89..a4b85da878aa8 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-05 +date: 2023-09-06 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 c5f0137d455e2..cabbdecb8810e 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-05 +date: 2023-09-06 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 b09d5759718c2..fede8551955b7 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-05 +date: 2023-09-06 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 71ec48a5a4eb3..d5a3a3a0cadd7 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-05 +date: 2023-09-06 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 985a16b0261ea..f8899741c8460 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-05 +date: 2023-09-06 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 c3e93e7242086..1a90b731a4887 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-05 +date: 2023-09-06 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 5389c790c3889..64389307dc138 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-05 +date: 2023-09-06 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 24d6094fecad2..0f8a33bebb2e9 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-05 +date: 2023-09-06 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 3348a66f9503c..dd9f7170f150b 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-05 +date: 2023-09-06 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 00ec9085ed5b0..90e9ac5bd716d 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-05 +date: 2023-09-06 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 46cca04b8c670..a1817a6a07a17 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-05 +date: 2023-09-06 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 15a10088397da..39c4cf7af65a6 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-05 +date: 2023-09-06 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 f11d1ea3fd27b..e54de71bfcbc2 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-05 +date: 2023-09-06 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 b38bf406d436f..3ff296d3868fc 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-05 +date: 2023-09-06 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 dcc9f8b8c8e94..f6960165a3be9 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-05 +date: 2023-09-06 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 d87aa7fa00c18..f19151f739d6f 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 0243585e35df1..25f1f95e6a02e 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 089cd4f11e138..c937a174fb823 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-05 +date: 2023-09-06 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 0d93a2c9924c8..6e626b240d86f 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-05 +date: 2023-09-06 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 038594c4e6f50..4fd533bb4bd96 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-05 +date: 2023-09-06 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 8de8c4fc312c4..9f52c18dfbf58 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-05 +date: 2023-09-06 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 14872988849f1..9d8cb3332c731 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-05 +date: 2023-09-06 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 0707f752b2a6c..94fd11c66372d 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-05 +date: 2023-09-06 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 35c63747efecb..dda2c0825eaa3 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-05 +date: 2023-09-06 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 b13279c38b32f..a19249d60f01d 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-05 +date: 2023-09-06 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 5740bf4cbada0..c966bb6c9d67a 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-05 +date: 2023-09-06 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 3126e14f0581c..b587cc553b72a 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-05 +date: 2023-09-06 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 d2910acd94f73..1e629acc9f8dc 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-05 +date: 2023-09-06 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 caca10c2fd48f..3bb3db62ea820 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-05 +date: 2023-09-06 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 96d43fb283968..4555f0c0cd81e 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-05 +date: 2023-09-06 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 52d1fb852d224..c165846077470 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-05 +date: 2023-09-06 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 e256f3ba6d69e..a91080213c357 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-05 +date: 2023-09-06 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 c883b482a9c69..9867d7595e2d6 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-05 +date: 2023-09-06 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 513db41d2f316..49a95f55c685f 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 38cfbeb018997..4f4a82e3edb6b 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-05 +date: 2023-09-06 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 cfe6994c0bbf7..9cc0c2c5ccd1b 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-05 +date: 2023-09-06 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 0bacde75c8ed3..c8480d7b9aebd 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index f1671013301da..c3b16d9766a8d 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 3f0b161976b96..6c6d03f53fba5 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 696ae1d316070..75dc24f2e5847 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-05 +date: 2023-09-06 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 6461a930f9926..86303d6f9925b 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-05 +date: 2023-09-06 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 11e95f64326de..7585ebcdc8491 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-05 +date: 2023-09-06 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 2fff03abb2438..0ea42f83373ff 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-05 +date: 2023-09-06 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 3d8450614de08..fe1bd0e1c356e 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-05 +date: 2023-09-06 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 8a4e30bc7f65e..c29d4fa88fcb8 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-05 +date: 2023-09-06 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 bbc16de105137..c0f46d66768c2 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-05 +date: 2023-09-06 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 f2235fdee4dee..69d4bc3d102b6 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-05 +date: 2023-09-06 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 c14fe4df54dc4..50e5bd19b4768 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-05 +date: 2023-09-06 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 cd44c94dbb706..3c831c1d0ee89 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-05 +date: 2023-09-06 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 1244ed0c0da4c..78a73de5d1867 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-05 +date: 2023-09-06 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 76ecfb8d270ca..a6105789f0523 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-05 +date: 2023-09-06 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 8a115eeed4cf6..766b8051ca37a 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-05 +date: 2023-09-06 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 bda8d0b6b8ab1..cb1ffb4254106 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-05 +date: 2023-09-06 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 023e5b73ca23d..b047cb06b1511 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-05 +date: 2023-09-06 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 247745c07f508..9219e6753b699 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-05 +date: 2023-09-06 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 bb3308665a207..44e124a7514ad 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-05 +date: 2023-09-06 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 315988ced942c..f75e59835c071 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-05 +date: 2023-09-06 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 8777eb2ca54ef..0180e463d2d72 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-05 +date: 2023-09-06 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 387d6797cd5a5..840bef3ce72ef 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-05 +date: 2023-09-06 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 efaffaf33ca7c..176cd083cf18e 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-05 +date: 2023-09-06 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 ef7beaef0f6a9..0ac9edfdd54fc 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-05 +date: 2023-09-06 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 763e602b18868..b20c3bdd080da 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-05 +date: 2023-09-06 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 918307a7aea1f..113cd6a82a2b5 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-05 +date: 2023-09-06 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 8889c66a849e1..d6bc349a21507 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-05 +date: 2023-09-06 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 787be9b13f6ff..56d8fec5c0828 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-05 +date: 2023-09-06 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 d0134b6dd43c5..b9d6443d12d88 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-05 +date: 2023-09-06 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 1ee3655894d70..53a748f72b7e0 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-05 +date: 2023-09-06 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 32a41d70a9325..e10d05ddd78de 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-05 +date: 2023-09-06 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 a276ef5f584e8..a670edb9d3018 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-05 +date: 2023-09-06 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 bd3a9ef6ceb82..23edb0ca7fe72 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-05 +date: 2023-09-06 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 ae8ce838528bd..c95007904924d 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-05 +date: 2023-09-06 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 31679eb5a4ee6..58903a3c81abd 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-05 +date: 2023-09-06 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 6af12ec235d93..10bad964f02e3 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-05 +date: 2023-09-06 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 057d553c9c272..bebee29d1038a 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-05 +date: 2023-09-06 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 2626b9b5e3793..5d064f79a07bd 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-05 +date: 2023-09-06 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 9ce008af48794..a9952ec8ee4af 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-05 +date: 2023-09-06 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 a8ab926401b82..0e57d7bc1d6bd 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-05 +date: 2023-09-06 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 34abd1a51f0fd..eec6a2e640015 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-05 +date: 2023-09-06 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 ca7517756e605..7196f80f9f763 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-05 +date: 2023-09-06 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 7899f9650cd30..46a0a1ea92a11 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-05 +date: 2023-09-06 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 fdd6e0c7f3fc3..4269e7ed98e83 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-05 +date: 2023-09-06 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 fc83a934bf7e1..e0b8669cdc1dd 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-05 +date: 2023-09-06 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 0788687a910fe..9bc0c96297a67 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-05 +date: 2023-09-06 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 8af6fb11bde12..e9b8161b5dc7d 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-05 +date: 2023-09-06 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 c99be713b8d90..bbd8695bcee88 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-05 +date: 2023-09-06 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 b911c6e1e1952..568548ff4aa6f 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-05 +date: 2023-09-06 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 b5bda95c806cb..fa5768753b039 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-05 +date: 2023-09-06 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 e3d7321f12ea1..419f938af074e 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-05 +date: 2023-09-06 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 65b0ac1dd0ecd..c1bfcd5bb2818 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-05 +date: 2023-09-06 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 a68e429f6013e..6c563f87fe9c4 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-05 +date: 2023-09-06 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 df6dcbf68a99c..9d8254b6d4c5f 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-05 +date: 2023-09-06 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 7fe9a26ba9dd7..ccc8ed8e145b8 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-05 +date: 2023-09-06 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 f64d1c6af5206..cd799193dec7a 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-05 +date: 2023-09-06 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 8676c7107d4dd..80c18b02ac5d9 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-05 +date: 2023-09-06 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 a0f2a90b37a14..fccf61bb0964f 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-05 +date: 2023-09-06 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 8024bad81452e..b7f726363dba7 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-05 +date: 2023-09-06 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 79f69a5cc71a0..4eee0d1ff683e 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-05 +date: 2023-09-06 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 cc4337a22a137..4884deac439ee 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-05 +date: 2023-09-06 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 81ae937e1aabc..d77d54b054703 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-05 +date: 2023-09-06 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 903ff74457bd2..89ce0ace7f38c 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-05 +date: 2023-09-06 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 2d1f2dd1b4f3e..94444ebdea104 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-05 +date: 2023-09-06 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 d3f8fb3e152da..bdd68dda0749d 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-05 +date: 2023-09-06 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 3b5fe7bcd0bb7..b1b983d226fc9 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-05 +date: 2023-09-06 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 eea14a63ba6ba..4f0bc0218e945 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-05 +date: 2023-09-06 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 5c11668ffa71e..5dd173d676d19 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-05 +date: 2023-09-06 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 f4b3cbee7bc65..b37f26feca8fb 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-05 +date: 2023-09-06 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 277d89eeb2666..f5ee3dc45859c 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-05 +date: 2023-09-06 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 3121954ab3512..80ec92818f67d 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-05 +date: 2023-09-06 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 6d1e806fffcf2..4d9107defc8a9 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-05 +date: 2023-09-06 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 ffb235143b227..dabeeff20ae91 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-05 +date: 2023-09-06 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 6dac7d9151945..cb57687c88b52 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-05 +date: 2023-09-06 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 c13b36d6a01b5..e26a3332382d8 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-05 +date: 2023-09-06 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_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 0643d300555bb..10cb7f1612594 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-05 +date: 2023-09-06 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_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 8bcf6ef9da913..4d78f021e9b8e 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-05 +date: 2023-09-06 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 268c13ee40c21..25b8eddaed820 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-05 +date: 2023-09-06 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 cda3b46c2c802..a486f91c6ce80 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-05 +date: 2023-09-06 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 d4c39692829a9..1f573f178aa48 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-05 +date: 2023-09-06 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 edb82b7d856a9..9aae44e563071 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-05 +date: 2023-09-06 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 9ee3a48b1ed90..b61bae7f686c0 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-05 +date: 2023-09-06 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 d4fcdeafed66b..d028bcdd292c2 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-05 +date: 2023-09-06 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 8e0369f66c66b..46160457cfb40 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-05 +date: 2023-09-06 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 0a44b471adea8..b49d37521dfc5 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-05 +date: 2023-09-06 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 1a8bff8e80c51..f36efa6260bed 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-05 +date: 2023-09-06 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 f376e5de94cbd..e67965622abf2 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-05 +date: 2023-09-06 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 5a614d4f7e906..2293abb378091 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-05 +date: 2023-09-06 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 cc1cd6b7c29c3..76d18ea443e22 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-05 +date: 2023-09-06 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 88af0e128fe6d..b63ebb802ae4b 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-05 +date: 2023-09-06 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 5004023259bfa..0e95c8df6db6c 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-05 +date: 2023-09-06 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 8ab31c0810681..09f3f34afa52f 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-05 +date: 2023-09-06 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 de7246615f050..c2686005a1b47 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-05 +date: 2023-09-06 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 300345dc19e9f..e364f70c184f4 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-05 +date: 2023-09-06 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 65e39c56c54cf..e7fe7ad9957c3 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-05 +date: 2023-09-06 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 5989125209f3c..096a5f9b29ae8 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-05 +date: 2023-09-06 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 8c2fe6d0f842b..7208fd4f27840 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-05 +date: 2023-09-06 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 b87966a18bcc8..cb41d872a670c 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-05 +date: 2023-09-06 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 54cb3c3ed4458..93bb955960964 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-05 +date: 2023-09-06 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 032e218c58780..4c283c282c8db 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-05 +date: 2023-09-06 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 7aed7a647acd3..a9c038be9f5c2 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-05 +date: 2023-09-06 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.mdx b/api_docs/kbn_monaco.mdx index e1d4a47d80bc5..463ab406fd55f 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 7e85861952f55..bda7e1b72a441 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-05 +date: 2023-09-06 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 3fb6a56259ba7..b8f82ea078ebd 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-05 +date: 2023-09-06 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 ab04f163b40df..bb6ff9ee4a617 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-05 +date: 2023-09-06 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 b3d04d8b790ae..c84308de8a868 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-05 +date: 2023-09-06 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 5680da729406a..066a71a3ae5cc 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-05 +date: 2023-09-06 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 6e12225151607..5f2f2e6c06ab9 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-05 +date: 2023-09-06 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 0c622fb705406..26eda92de104d 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-05 +date: 2023-09-06 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 149efa170d300..d4bc0aa7aeb60 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-05 +date: 2023-09-06 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 70d41bb5964de..d960522fa72fd 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-05 +date: 2023-09-06 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 037d30c889f87..da88dd664e8ff 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-05 +date: 2023-09-06 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 58fbeeee2d187..eecec8d83ceec 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-05 +date: 2023-09-06 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 959e2a057f24c..c82f905d9cae0 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-05 +date: 2023-09-06 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 7613d4be794d4..987e08f19e998 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-05 +date: 2023-09-06 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 0323e7ebc62b4..56a9cf9e42403 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-05 +date: 2023-09-06 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 cf70a70947460..6c1db92f4085f 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-05 +date: 2023-09-06 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 d04209a9f3568..a16b44419d80c 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-05 +date: 2023-09-06 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 c2e009a4b77fb..3fb309c33bca7 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-05 +date: 2023-09-06 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 31eb94cd3909e..9b7f9cae664f2 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-05 +date: 2023-09-06 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 0ea939bbde996..425b657af6cfc 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-05 +date: 2023-09-06 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 bd5a2b4bf7477..8215af139a97c 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-05 +date: 2023-09-06 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 ece34b24df02d..d56d17b99edbb 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-05 +date: 2023-09-06 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 dcec40e3a89da..ba5d06f60e55a 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-05 +date: 2023-09-06 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 ef9900034a6d5..0ce562174ec43 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-05 +date: 2023-09-06 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 0393965e2ebb2..a3b3283db157c 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-05 +date: 2023-09-06 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 3605f1aba2368..65c3223d3705c 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-05 +date: 2023-09-06 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 8c1ce9f259ef6..e493e1db46fd8 100644 --- a/api_docs/kbn_search_api_panels.devdocs.json +++ b/api_docs/kbn_search_api_panels.devdocs.json @@ -926,6 +926,34 @@ "path": "packages/kbn-search-api-panels/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-api-panels", + "id": "def-common.LanguageDefinitionSnippetArguments.ingestPipeline", + "type": "string", + "tags": [], + "label": "ingestPipeline", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-api-panels/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-api-panels", + "id": "def-common.LanguageDefinitionSnippetArguments.extraIngestDocumentValues", + "type": "Object", + "tags": [], + "label": "extraIngestDocumentValues", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "packages/kbn-search-api-panels/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 23d87424f2b07..f928c35ff17e3 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-05 +date: 2023-09-06 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 | |-------------------|-----------|------------------------|-----------------| -| 65 | 0 | 65 | 0 | +| 67 | 0 | 67 | 0 | ## Common diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index a7f3a7c301a2f..b61b3acebc30b 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-05 +date: 2023-09-06 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 feff9a8532c37..52f9bf0331d66 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-05 +date: 2023-09-06 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 43b8698ec5add..21a9a0d4229eb 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-05 +date: 2023-09-06 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 0edc300b7fbb8..8535e3c2ceb45 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-05 +date: 2023-09-06 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 303b370aed662..0989d2c61bc6c 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-05 +date: 2023-09-06 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 0e8e3606673c7..618fce3049404 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-05 +date: 2023-09-06 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 39fd4b1f96d01..b59feab2155c5 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-05 +date: 2023-09-06 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 e1881be0c8187..9b6e5f38500a4 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-05 +date: 2023-09-06 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 1c4796084d273..de06ac2178b85 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-05 +date: 2023-09-06 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 057fd8ddd0154..8dc2abd94a379 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-05 +date: 2023-09-06 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 bcab35e3734e8..b0b4e63b53415 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-05 +date: 2023-09-06 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 6188b4f538622..98e145e6c291a 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-05 +date: 2023-09-06 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 ee9589bd9fdab..be1b7c054f509 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-05 +date: 2023-09-06 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 55ab104bac818..f8c8e1d9bce9e 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-05 +date: 2023-09-06 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 16df8b1d3143c..9fd2114f82497 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-05 +date: 2023-09-06 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 9d02dbe8bf408..4674d7f39cc79 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-05 +date: 2023-09-06 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 47fd8f9a4d494..812a2357c9c1c 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-05 +date: 2023-09-06 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 5c0ca05384879..f23fad4563b05 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-05 +date: 2023-09-06 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 806945c74d6ef..2684bdf0d61e2 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-05 +date: 2023-09-06 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 67c024298e1af..4aa83b1b2a28a 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-05 +date: 2023-09-06 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 ae9982c0af157..fb5c6248a7aa4 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-05 +date: 2023-09-06 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 f9802c7fe0576..272b283e3809f 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-05 +date: 2023-09-06 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 6dc1d8f5b2b13..6cfe959f3b6a8 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-05 +date: 2023-09-06 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 1b4eefb68fc5f..fc08e81a4f1d4 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-05 +date: 2023-09-06 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 e106cb033c5c2..e75c15121e929 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-05 +date: 2023-09-06 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_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index f9ad4f267548f..a15223e4a5b18 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-05 +date: 2023-09-06 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_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 8f8629d869e68..45f677c9b03a8 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-05 +date: 2023-09-06 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 82f04c8c1f8f3..d7e66c2dfcafb 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-05 +date: 2023-09-06 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 e4ec0a2a0470d..2a7a12643f66c 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-05 +date: 2023-09-06 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 332ee7b559786..6d03355f6bb90 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-05 +date: 2023-09-06 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 b342b28412dd3..5000f6af0f8f1 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-05 +date: 2023-09-06 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 ea0dee0f20096..78930ef11a46c 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-05 +date: 2023-09-06 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 bed943cf01244..2fb5ef4f4d1ab 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-05 +date: 2023-09-06 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 298b26586d47f..c401fc4ae57cc 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-05 +date: 2023-09-06 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 f8e4d0340abe9..2f49e7214e438 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-05 +date: 2023-09-06 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 a9cfd49bd9006..932e071d8c4e3 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-05 +date: 2023-09-06 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 571aa579476e0..1e6a87987a4f2 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-05 +date: 2023-09-06 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 d320a6fe79159..195ca50f84803 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-05 +date: 2023-09-06 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 7a01e2db59806..56aae935b33b6 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-05 +date: 2023-09-06 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 05b8167d72a32..be3191df40254 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-05 +date: 2023-09-06 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 7fe50b1e6efa5..cbafafdf15054 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-05 +date: 2023-09-06 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 341baae0eddc6..ca5b614f31f5e 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-05 +date: 2023-09-06 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 b5bdafbe3406e..e93ae95420c38 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-05 +date: 2023-09-06 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 bd9f0e5e054b5..e700985ce82b4 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-05 +date: 2023-09-06 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 bdb21965fe310..f04034c8db728 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-05 +date: 2023-09-06 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 f8166ef3df380..221bc0e89d69b 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-05 +date: 2023-09-06 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 034c8d773754d..9304bde1efab8 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-05 +date: 2023-09-06 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 47ecb7343d741..76c8f65bf9a38 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-05 +date: 2023-09-06 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 c5369259e7b4d..c51b4524362ff 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-05 +date: 2023-09-06 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 b9d0e9b498902..ead37eb00cd9d 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-05 +date: 2023-09-06 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 2bd6c3050ac8f..5138e162e33f4 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-05 +date: 2023-09-06 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 35e91bb002744..7239a015c29f4 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-05 +date: 2023-09-06 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 c1cf40e7bc764..fa8bd59e552a6 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-05 +date: 2023-09-06 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 86fa9e7c1891f..ff4e2959c6d3e 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-05 +date: 2023-09-06 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 3c8e084113bee..4f737aa135efc 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-05 +date: 2023-09-06 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 28f32b9dc5257..96f74da39a60e 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-05 +date: 2023-09-06 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 997a796e86d22..88245cb24a015 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-05 +date: 2023-09-06 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 f470445bd947b..39f5d7cd276e7 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-05 +date: 2023-09-06 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 33873f09e4810..96fc64390daf1 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-05 +date: 2023-09-06 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 274db8e8bfa85..beb8813a7170f 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-05 +date: 2023-09-06 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 9a775023878d6..6df2460db09a5 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-05 +date: 2023-09-06 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 aed9adc9f36ba..7d9bdd1d9570d 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-05 +date: 2023-09-06 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 07c8ac15e2ccb..0f5fb94765341 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-05 +date: 2023-09-06 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 129749e6731df..6912120abed7c 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-05 +date: 2023-09-06 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 d36240ef6c53e..68926ed3daf26 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-05 +date: 2023-09-06 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 cf78e32a622ed..7e9cb4fc44597 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-05 +date: 2023-09-06 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 d3a1875b6ce61..e3919b804ff70 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-05 +date: 2023-09-06 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.devdocs.json b/api_docs/kbn_slo_schema.devdocs.json index 02eec6e3a39cb..0666cd886ffa9 100644 --- a/api_docs/kbn_slo_schema.devdocs.json +++ b/api_docs/kbn_slo_schema.devdocs.json @@ -628,6 +628,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.DeleteSLOInstancesInput", + "type": "Type", + "tags": [], + "label": "DeleteSLOInstancesInput", + "description": [], + "signature": [ + "{ list: { sloId: string; instanceId: string; }[]; }" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.DeleteSLOInstancesParams", + "type": "Type", + "tags": [], + "label": "DeleteSLOInstancesParams", + "description": [], + "signature": [ + "{ list: { sloId: string; instanceId: string; }[]; }" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/slo-schema", "id": "def-common.FetchHistoricalSummaryParams", @@ -2079,6 +2109,32 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.deleteSLOInstancesParamsSchema", + "type": "Object", + "tags": [], + "label": "deleteSLOInstancesParamsSchema", + "description": [], + "signature": [ + "TypeC", + "<{ body: ", + "TypeC", + "<{ list: ", + "ArrayC", + "<", + "TypeC", + "<{ sloId: ", + "StringC", + "; instanceId: ", + "StringC", + "; }>>; }>; }>" + ], + "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/slo-schema", "id": "def-common.deleteSLOParamsSchema", diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 0839df57edc00..a3231fcbe7b8c 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.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 | |-------------------|-----------|------------------------|-----------------| -| 132 | 0 | 129 | 0 | +| 135 | 0 | 132 | 0 | ## Common diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 407b4ab1645d0..625a1baf66680 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-05 +date: 2023-09-06 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 8a7b3d8d10eba..67f61e7309c88 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-05 +date: 2023-09-06 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 8af618fd3428f..9488d28e11bbe 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-05 +date: 2023-09-06 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 dbffcc85a47b8..837b297215919 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-05 +date: 2023-09-06 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 6b1ecb4fc1a93..163e9fad938f4 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-05 +date: 2023-09-06 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 f25b8eca3b096..9d077f5729f64 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-05 +date: 2023-09-06 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 5077de40d935f..f7448b3c6e089 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-05 +date: 2023-09-06 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 43372f3125e20..e5765ce453870 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-05 +date: 2023-09-06 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.devdocs.json b/api_docs/kbn_text_based_editor.devdocs.json index e0ba49c3e1b0e..252a6537ae639 100644 --- a/api_docs/kbn_text_based_editor.devdocs.json +++ b/api_docs/kbn_text_based_editor.devdocs.json @@ -3,6 +3,136 @@ "client": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL", + "type": "Function", + "tags": [], + "label": "fetchFieldsFromESQL", + "description": [], + "signature": [ + "(query: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + ", expressions: ", + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + }, + ", time: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined) => Promise<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + " | undefined>" + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL.$1", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + } + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL.$2", + "type": "Object", + "tags": [], + "label": "expressions", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + } + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.fetchFieldsFromESQL.$3", + "type": "Object", + "tags": [], + "label": "time", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "path": "packages/kbn-text-based-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/text-based-editor", "id": "def-public.TextBasedLanguagesEditor", @@ -272,6 +402,20 @@ "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.TextBasedLanguagesEditorProps.hideRunQueryText", + "type": "CompoundType", + "tags": [], + "label": "hideRunQueryText", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 9e04bda94e0e3..64e7ed9a883be 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 17 | 0 | 16 | 0 | +| 22 | 0 | 21 | 0 | ## Client diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 871c6c2b8e718..2e4e64028de10 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-05 +date: 2023-09-06 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 be3c8e29d5516..e8f536396cd3c 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-05 +date: 2023-09-06 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 46f8c19cf89ec..b32fffce5ce5f 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-05 +date: 2023-09-06 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 d8b53fc2d669f..6af725a802219 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-05 +date: 2023-09-06 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 a08cefa0974a5..175f75d1c9c72 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-05 +date: 2023-09-06 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 68e956c6a9fd7..cf4823a41b994 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-05 +date: 2023-09-06 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 91091dbb7a330..30d39fbab123b 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-05 +date: 2023-09-06 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 40c628ad3325c..86f54f4a13e60 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-05 +date: 2023-09-06 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 f22127f77ae44..861b929e842e1 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-05 +date: 2023-09-06 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 1e294e99efaba..931a77d995dd5 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-05 +date: 2023-09-06 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 b8c701132cb88..5fa41d11ace3c 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-05 +date: 2023-09-06 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 ed3eb341e30b8..bd6a2a9fea7ae 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-05 +date: 2023-09-06 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 fabeb02cc299a..2266479569fb7 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-05 +date: 2023-09-06 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 9e9cb5759dee2..85666acc83ea4 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-05 +date: 2023-09-06 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 7b5a3ae2edbf2..d6cf87ff8567d 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-05 +date: 2023-09-06 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 0dc5954a37433..5cc15cfbba8a8 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-05 +date: 2023-09-06 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 aa2fb5154468f..8958468bc9f2d 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-05 +date: 2023-09-06 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 9fa0c25531795..148fbff039e18 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 3133e29cbacf4..242e917a38c35 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -3726,14 +3726,6 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/helpers/saved_objects_utils/confirm_modal_promise.tsx" }, - { - "plugin": "graph", - "path": "x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx" - }, - { - "plugin": "graph", - "path": "x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/public/application.tsx" diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 72e61b9db565c..6bfcbb46328e6 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-05 +date: 2023-09-06 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 91d17d9fcde72..5163dcb316e50 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-05 +date: 2023-09-06 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 eeb74883b2962..bb869216c84f1 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-05 +date: 2023-09-06 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 7640d66033c05..b11450706ba43 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-05 +date: 2023-09-06 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 51aee902356a6..0b7294a36838d 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-05 +date: 2023-09-06 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 6d5783871cdc4..c84037bdb1fdc 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-05 +date: 2023-09-06 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 8514ee21fcd37..e210d8a6bfe13 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-05 +date: 2023-09-06 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 7d88a913416d4..3271d5e1f245c 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-05 +date: 2023-09-06 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 88da234919d93..befcc70437a54 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-05 +date: 2023-09-06 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 6a569ad488335..ffa98ecee1830 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-05 +date: 2023-09-06 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 506e3bdaa1684..b98088ff6fca4 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-05 +date: 2023-09-06 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 415d96478e799..7ccc3846ad0d1 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-05 +date: 2023-09-06 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 a76d920efbd05..0f06b54ce9df8 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-05 +date: 2023-09-06 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 87679e97ee10f..9550b03ca8ef3 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-05 +date: 2023-09-06 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 2f9c10a8d601f..9f00d4a1b3112 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-05 +date: 2023-09-06 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 1f3f4c9e84b3c..ff84af9508421 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-05 +date: 2023-09-06 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 58358d769e1c8..f1420e4cfa2f3 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-05 +date: 2023-09-06 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 5c0fda7795ffc..ea0effc9fea3a 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-05 +date: 2023-09-06 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 4b84d2688576b..859779de519dc 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-05 +date: 2023-09-06 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 844c63784a8e7..cdec51c565667 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-05 +date: 2023-09-06 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 24d66a3f94a94..009e122a6a378 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -155,9 +155,7 @@ "label": "AlertSummary", "description": [], "signature": [ - "({ alertSummaryFields }: ", - "AlertSummaryProps", - ") => JSX.Element" + "({ alertSummaryFields }: AlertSummaryProps) => JSX.Element" ], "path": "x-pack/plugins/observability/public/pages/alert_details/components/alert_summary.tsx", "deprecated": false, @@ -418,9 +416,7 @@ "label": "DatePicker", "description": [], "signature": [ - "({\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}: ", - "DatePickerProps", - ") => JSX.Element" + "({\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}: DatePickerProps) => JSX.Element" ], "path": "x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx", "deprecated": false, @@ -9231,6 +9227,34 @@ "section": "def-server.ObservabilityRouteCreateOptions", "text": "ObservabilityRouteCreateOptions" }, + "; \"POST /api/observability/slos/_delete_instances 2023-10-31\": { endpoint: \"POST /api/observability/slos/_delete_instances 2023-10-31\"; params?: ", + "TypeC", + "<{ body: ", + "TypeC", + "<{ list: ", + "ArrayC", + "<", + "TypeC", + "<{ sloId: ", + "StringC", + "; instanceId: ", + "StringC", + "; }>>; }>; }> | undefined; handler: ({}: ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteHandlerResources", + "text": "ObservabilityRouteHandlerResources" + }, + " & { params: { body: { list: { sloId: string; instanceId: string; }[]; }; }; }) => Promise; } & ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteCreateOptions", + "text": "ObservabilityRouteCreateOptions" + }, "; \"DELETE /api/observability/slos/{id} 2023-10-31\": { endpoint: \"DELETE /api/observability/slos/{id} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", @@ -10937,6 +10961,34 @@ "section": "def-server.ObservabilityRouteCreateOptions", "text": "ObservabilityRouteCreateOptions" }, + "; \"POST /api/observability/slos/_delete_instances 2023-10-31\": { endpoint: \"POST /api/observability/slos/_delete_instances 2023-10-31\"; params?: ", + "TypeC", + "<{ body: ", + "TypeC", + "<{ list: ", + "ArrayC", + "<", + "TypeC", + "<{ sloId: ", + "StringC", + "; instanceId: ", + "StringC", + "; }>>; }>; }> | undefined; handler: ({}: ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteHandlerResources", + "text": "ObservabilityRouteHandlerResources" + }, + " & { params: { body: { list: { sloId: string; instanceId: string; }[]; }; }; }) => Promise; } & ", + { + "pluginId": "observability", + "scope": "server", + "docId": "kibObservabilityPluginApi", + "section": "def-server.ObservabilityRouteCreateOptions", + "text": "ObservabilityRouteCreateOptions" + }, "; \"DELETE /api/observability/slos/{id} 2023-10-31\": { endpoint: \"DELETE /api/observability/slos/{id} 2023-10-31\"; params?: ", "TypeC", "<{ path: ", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 4f5365797c3b2..d10fd512c30be 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-05 +date: 2023-09-06 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 | 16 | +| 542 | 2 | 533 | 14 | ## Client diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 31e4264930aee..e3520b084ccac 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-05 +date: 2023-09-06 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 939e6d954a9b7..ccc3104347e34 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 040d247a44432..e544473677fd3 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index b9a92bd0e15a9..58b1aeeb72c30 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 8c9256f9f511c..f8a0a349a4ea1 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,13 +21,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 72503 | 223 | 61894 | 1513 | +| 72529 | 223 | 61920 | 1511 | ## Plugin Directory | Plugin name           | Maintaining team | Description | API Cnt | Any Cnt | Missing
comments | Missing
exports | |--------------|----------------|-----------|--------------|----------|---------------|--------| -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 267 | 0 | 261 | 30 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 269 | 0 | 263 | 30 | | | [@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/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 790 | 1 | 759 | 49 | @@ -135,7 +135,7 @@ 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 | 16 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 542 | 2 | 533 | 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) | - | 14 | 0 | 14 | 0 | @@ -170,7 +170,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 119 | 0 | 60 | 10 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 22 | 1 | 22 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 253 | 0 | 65 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 14 | 0 | 14 | 3 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 24 | 0 | 24 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 4 | 0 | 4 | 1 | | synthetics | [@elastic/uptime](https://github.com/orgs/elastic/teams/uptime) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 96 | 0 | 53 | 6 | @@ -178,12 +178,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 31 | 0 | 26 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 0 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 19 | 0 | 19 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 20 | 0 | 20 | 0 | | | [@elastic/protections-experience](https://github.com/orgs/elastic/teams/protections-experience) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 30 | 0 | 14 | 5 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 257 | 1 | 213 | 22 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [@elastic/kibana-localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 573 | 1 | 547 | 51 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 576 | 1 | 550 | 51 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 145 | 0 | 103 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Extends UI Actions plugin with more functionality | 206 | 0 | 140 | 9 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer). | 13 | 0 | 10 | 3 | @@ -526,7 +526,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) | - | 65 | 0 | 65 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 67 | 0 | 67 | 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 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 50 | 0 | 47 | 0 | @@ -594,7 +594,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 15 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 3 | 0 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 132 | 0 | 129 | 0 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 135 | 0 | 132 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 102 | 2 | 65 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 4 | 0 | 2 | 0 | @@ -603,7 +603,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 289 | 4 | 242 | 12 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 137 | 5 | 105 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 17 | 0 | 16 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 22 | 0 | 21 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 72 | 0 | 55 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 86 | 0 | 86 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 17307c56df40b..8baaad3c6c961 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-05 +date: 2023-09-06 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 c733c69c88c29..bfbb359943027 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-05 +date: 2023-09-06 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 7dfef9cbc7f5d..be115e09b2ccf 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-05 +date: 2023-09-06 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 46f7029e4c437..cfbfdbe19c2d7 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-05 +date: 2023-09-06 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 652db20d467be..6ceb583f5e701 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-05 +date: 2023-09-06 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 f05dfff64c6eb..19e06683b4eac 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-05 +date: 2023-09-06 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 04ca4e478bd01..912d13f8bbe28 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-05 +date: 2023-09-06 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 deb21fb5af459..e015e177cbba5 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-05 +date: 2023-09-06 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 a389e8c341df1..92c55394f4209 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-05 +date: 2023-09-06 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 51f2eac47f7ee..142c9ae875e69 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-05 +date: 2023-09-06 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 cc16ca5a190d2..f61d87c732506 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-05 +date: 2023-09-06 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 6e99575f34bea..b517eca82a928 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-05 +date: 2023-09-06 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 32fbb58ee3493..abc9de3307deb 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-05 +date: 2023-09-06 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 f606643f4009d..61bc012db63a9 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-05 +date: 2023-09-06 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 fffd6ea49de6f..dbb975cc061ed 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-05 +date: 2023-09-06 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 ffd1930565da5..b4bd667da42a4 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-05 +date: 2023-09-06 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 3950548c880fb..bde9ff25f6e97 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-05 +date: 2023-09-06 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 56c700c517970..ed2dae2824bab 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-05 +date: 2023-09-06 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 98f2cb7869788..d07f98a7332b0 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-05 +date: 2023-09-06 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 fe15bc4706c25..d715d1010ba65 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 0528a3c42d91c..d78f273a7755b 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index ca487148446ab..93287788f8645 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-05 +date: 2023-09-06 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 2382a958e93a4..684d74bc88e77 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-05 +date: 2023-09-06 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 0c2b0290e9db7..e1b29a4b77478 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-05 +date: 2023-09-06 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 6385220853e90..0117b9138ccee 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-05 +date: 2023-09-06 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 7d25378cd6f0e..c93a024b3b41b 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-05 +date: 2023-09-06 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 54715a2f5bf55..9f61d5283f5e5 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.devdocs.json b/api_docs/stack_alerts.devdocs.json index 65ec1191d667f..cced9a721c32e 100644 --- a/api_docs/stack_alerts.devdocs.json +++ b/api_docs/stack_alerts.devdocs.json @@ -210,9 +210,201 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.rowToDocument", + "type": "Function", + "tags": [], + "label": "rowToDocument", + "description": [], + "signature": [ + "(columns: EsqlResultColumn[], row: EsqlResultRow) => EsqlDocument" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.rowToDocument.$1", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + "EsqlResultColumn[]" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.rowToDocument.$2", + "type": "Array", + "tags": [], + "label": "row", + "description": [], + "signature": [ + "EsqlResultRow" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.toEsQueryHits", + "type": "Function", + "tags": [], + "label": "toEsQueryHits", + "description": [], + "signature": [ + "(results: ", + { + "pluginId": "stackAlerts", + "scope": "common", + "docId": "kibStackAlertsPluginApi", + "section": "def-common.EsqlTable", + "text": "EsqlTable" + }, + ") => { hits: EsqlHit[]; total: number; }" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.toEsQueryHits.$1", + "type": "Object", + "tags": [], + "label": "results", + "description": [], + "signature": [ + { + "pluginId": "stackAlerts", + "scope": "common", + "docId": "kibStackAlertsPluginApi", + "section": "def-common.EsqlTable", + "text": "EsqlTable" + } + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.transformDatatableToEsqlTable", + "type": "Function", + "tags": [], + "label": "transformDatatableToEsqlTable", + "description": [], + "signature": [ + "(results: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ") => ", + { + "pluginId": "stackAlerts", + "scope": "common", + "docId": "kibStackAlertsPluginApi", + "section": "def-common.EsqlTable", + "text": "EsqlTable" + } + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.transformDatatableToEsqlTable.$1", + "type": "Object", + "tags": [], + "label": "results", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + } + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.EsqlTable", + "type": "Interface", + "tags": [], + "label": "EsqlTable", + "description": [], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "stackAlerts", + "id": "def-common.EsqlTable.columns", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + "EsqlResultColumn[]" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "stackAlerts", + "id": "def-common.EsqlTable.values", + "type": "Array", + "tags": [], + "label": "values", + "description": [], + "signature": [ + "EsqlResultRow[]" + ], + "path": "x-pack/plugins/stack_alerts/common/esql_query_utils.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], - "interfaces": [], "enums": [], "misc": [ { diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 546ab4089308b..598ea05dd18d8 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 14 | 0 | 14 | 3 | +| 24 | 0 | 24 | 3 | ## Client @@ -44,6 +44,9 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o ### Functions +### Interfaces + + ### Consts, variables and types diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index cfe538fc4b18e..cacc8c975df10 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-05 +date: 2023-09-06 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 c110a53377d03..f3a1b5c7e0e57 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-05 +date: 2023-09-06 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 7bfe57d68a2d1..0d92ce6df2bc2 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-05 +date: 2023-09-06 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 40acb98da6933..4e74bf052b9cb 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-05 +date: 2023-09-06 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 0df30daa7aa12..5eff47d932a72 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-05 +date: 2023-09-06 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 7a11b41d310d4..384f4633571aa 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.devdocs.json b/api_docs/text_based_languages.devdocs.json index 85e21f93ca908..c44e1664a3fe1 100644 --- a/api_docs/text_based_languages.devdocs.json +++ b/api_docs/text_based_languages.devdocs.json @@ -279,6 +279,20 @@ "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "textBasedLanguages", + "id": "def-public.TextBasedLanguagesEditorProps.hideRunQueryText", + "type": "CompoundType", + "tags": [], + "label": "hideRunQueryText", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 0742546f60027..30272f75bfcf6 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 19 | 0 | 19 | 0 | +| 20 | 0 | 20 | 0 | ## Client diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index c7145498c1a5c..1d77c0df3a97c 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-05 +date: 2023-09-06 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 bbc1eb06c8e39..23ceb4fe61e6a 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-05 +date: 2023-09-06 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 e5d3181a1d8d6..bab5d6c094c68 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index 9d84568f429d3..a153daf2744a9 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -803,6 +803,47 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.getTimeOptions", + "type": "Function", + "tags": [], + "label": "getTimeOptions", + "description": [], + "signature": [ + "(unitSize: number) => { text: string; value: ", + { + "pluginId": "triggersActionsUi", + "scope": "public", + "docId": "kibTriggersActionsUiPluginApi", + "section": "def-public.TIME_UNITS", + "text": "TIME_UNITS" + }, + "; }[]" + ], + "path": "x-pack/plugins/triggers_actions_ui/public/common/lib/get_time_options.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.getTimeOptions.$1", + "type": "number", + "tags": [], + "label": "unitSize", + "description": [], + "signature": [ + "number" + ], + "path": "x-pack/plugins/triggers_actions_ui/public/common/lib/get_time_options.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "triggersActionsUi", "id": "def-public.getTimeUnitLabel", @@ -5688,6 +5729,26 @@ "path": "x-pack/plugins/triggers_actions_ui/public/application/app.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.TriggersAndActionsUiServices.expressions", + "type": "Object", + "tags": [], + "label": "expressions", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + } + ], + "path": "x-pack/plugins/triggers_actions_ui/public/application/app.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 51693988db001..5f23ec23ba53d 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 573 | 1 | 547 | 51 | +| 576 | 1 | 550 | 51 | ## Client diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index a60e9a0225c50..891ed57dca705 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-05 +date: 2023-09-06 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 8acfb4007dac3..fa0e10091834f 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-05 +date: 2023-09-06 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 603f48d60f203..39bdf05d8be5e 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-05 +date: 2023-09-06 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 7b1d9e1b20dad..8ae211ab4a1fe 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-05 +date: 2023-09-06 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 fd7beddabd867..3eea6ef3a5403 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-05 +date: 2023-09-06 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 a72a03bf4fac3..d66fa6a04e945 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-05 +date: 2023-09-06 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 62c01dfb2cc5f..3987d3bcc9316 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-05 +date: 2023-09-06 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 11d978023890f..5f956a0d5b10e 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-05 +date: 2023-09-06 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 960eb658ca681..aaf47c8abd982 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-05 +date: 2023-09-06 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 15e9fd60eafed..993e491bb3987 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-05 +date: 2023-09-06 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 59c3f306ced16..493ba55128160 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-05 +date: 2023-09-06 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 0010c70cfdbde..7ab3f9c575f7b 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-05 +date: 2023-09-06 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 6173477d3c7a5..377532248eac0 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-05 +date: 2023-09-06 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 fc76ac9c6fc64..e0318e12ac9df 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-05 +date: 2023-09-06 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 ce5bbdddd2e36..a2ad41cc88773 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-05 +date: 2023-09-06 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 c44173caff05c..c6cad2abd1b16 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-05 +date: 2023-09-06 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 d61f09f713d1b..2359fb1e3d51d 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-05 +date: 2023-09-06 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 bde589e42f805..a73a33c6af0ce 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-05 +date: 2023-09-06 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 78696e8ff2b7d..f5e16234f7811 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-05 +date: 2023-09-06 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 a98046d0fe69a..91ba1aeb857f8 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-05 +date: 2023-09-06 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 bc11233812a61..cb7ba41730b13 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-05 +date: 2023-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From e315c9c17598b983edba3cf251679598908f8d9b Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Wed, 6 Sep 2023 07:16:29 +0200 Subject: [PATCH 08/25] [Defend Workflows] Artifact Rollout Note field (#164838) This PR is a second part of Artifact Rollout Epic (https://github.com/elastic/security-team/issues/3593) and it introduces **Note** field as described in https://github.com/elastic/security-team/issues/7238 ticket. Changes: 1. Added a new SO, `policy-settings-protection-updates-note` which holds non indexable `note` field of type **text** and reference to package policy 2. Added `getPackagePolicyDeleteCallback` that cleans up SO on package policy deletion 3. Exposed an API to interact with the SO (POST, GET) with POST method accepting both creation and update if SO exists. 4. Integrated UI with API with `react-query` hooks. Flow https://github.com/elastic/kibana/assets/29123534/359d59bd-1bde-417a-9449-467d08e81809 Read only access ![Screenshot 2023-08-29 at 13 11 58](https://github.com/elastic/kibana/assets/29123534/36df0b40-6012-45a8-aa7d-c2fa0527e594) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../current_mappings.json | 16 +- .../group2/check_registered_types.test.ts | 1 + .../group3/type_registrations.test.ts | 1 + .../group5/dot_kibana_split.test.ts | 1 + .../src/security/kibana_sub_features.ts | 5 +- .../protection_updates_note_schema.ts | 23 +++ .../common/endpoint/constants.ts | 1 + .../cypress/e2e/endpoint/policy_details.cy.ts | 68 ++++++- .../cypress/tasks/endpoint_policy.ts | 12 ++ .../hooks/use_get_protection_updates_note.ts | 42 ++++ .../hooks/use_post_protection_updates_note.ts | 47 +++++ .../protection_updates_layout.tsx | 86 +++++++- .../endpoint/endpoint_app_context_services.ts | 11 +- .../saved_object_mappings.ts | 28 +++ .../server/endpoint/mocks.ts | 1 + .../protection_updates_note/handlers.test.ts | 191 ++++++++++++++++++ .../protection_updates_note/handlers.ts | 126 ++++++++++++ .../routes/protection_updates_note/index.ts | 63 ++++++ .../fleet_integration.test.ts | 25 ++- .../fleet_integration/fleet_integration.ts | 10 +- .../remove_protection_updates_note.ts | 33 +++ .../security_solution/server/plugin.ts | 3 + .../security_solution/server/saved_objects.ts | 2 + 23 files changed, 780 insertions(+), 16 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/lib/protection_updates_note/saved_object_mappings.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts create mode 100644 x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index c2e1b05850689..4e0e5a1028fa1 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -616,6 +616,10 @@ } } }, + "apm-indices": { + "dynamic": false, + "properties": {} + }, "tag": { "properties": { "name": { @@ -2987,6 +2991,14 @@ } } }, + "policy-settings-protection-updates-note": { + "properties": { + "note": { + "type": "text", + "index": false + } + } + }, "infrastructure-ui-source": { "dynamic": false, "properties": {} @@ -3031,10 +3043,6 @@ } } }, - "apm-indices": { - "dynamic": false, - "properties": {} - }, "apm-telemetry": { "dynamic": false, "properties": {} diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts index 6bea2a8d7f2e2..43890b88dbdb5 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts @@ -125,6 +125,7 @@ describe('checking migration metadata changes on all registered SO types', () => "osquery-pack": "6ab4358ca4304a12dcfc1777c8135b75cffb4397", "osquery-pack-asset": "b14101d3172c4b60eb5404696881ce5275c84152", "osquery-saved-query": "44f1161e165defe3f9b6ad643c68c542a765fcdb", + "policy-settings-protection-updates-note": "33924bb246f9e5bcb876109cc83e3c7a28308352", "query": "21cbbaa09abb679078145ce90087b1e88b7eae95", "risk-engine-configuration": "b105d4a3c6adce40708d729d12e5ef3c8fbd9508", "rules-settings": "892a2918ebaeba809a612b8d97cec0b07c800b5f", diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts index 3235c6cfa057e..61294c22a160e 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/type_registrations.test.ts @@ -96,6 +96,7 @@ const previouslyRegisteredTypes = [ 'osquery-saved-query', 'osquery-usage-metric', 'osquery-manager-usage-metric', + 'policy-settings-protection-updates-note', 'query', 'rules-settings', 'sample-data-telemetry', diff --git a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts index 32ac61f0d2711..6581541e70244 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group5/dot_kibana_split.test.ts @@ -245,6 +245,7 @@ describe('split .kibana index into multiple system indices', () => { "osquery-pack", "osquery-pack-asset", "osquery-saved-query", + "policy-settings-protection-updates-note", "query", "risk-engine-configuration", "rules-settings", diff --git a/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts b/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts index 86cbf89f26a6f..d9a090f1313f0 100644 --- a/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts +++ b/x-pack/packages/security-solution/features/src/security/kibana_sub_features.ts @@ -9,6 +9,7 @@ import { i18n } from '@kbn/i18n'; import type { SubFeatureConfig } from '@kbn/features-plugin/common'; import { EXCEPTION_LIST_NAMESPACE_AGNOSTIC } from '@kbn/securitysolution-list-constants'; import { AppFeaturesPrivilegeId, AppFeaturesPrivileges } from '../app_features_privileges'; + import { SecuritySubFeatureId } from '../app_features_keys'; import { APP_ID } from '../constants'; import type { SecurityFeatureParams } from './types'; @@ -320,7 +321,7 @@ const policyManagementSubFeature: SubFeatureConfig = { includeIn: 'none', name: 'All', savedObject: { - all: [], + all: ['policy-settings-protection-updates-note'], read: [], }, ui: ['writePolicyManagement', 'readPolicyManagement'], @@ -332,7 +333,7 @@ const policyManagementSubFeature: SubFeatureConfig = { name: 'Read', savedObject: { all: [], - read: [], + read: ['policy-settings-protection-updates-note'], }, ui: ['readPolicyManagement'], }, diff --git a/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts b/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.ts new file mode 100644 index 0000000000000..1207d3d2418fa --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/endpoint/protection_updates_note/protection_updates_note_schema.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +export const GetProtectionUpdatesNoteSchema = { + params: schema.object({ + package_policy_id: schema.string(), + }), +}; + +export const CreateUpdateProtectionUpdatesNoteSchema = { + body: schema.object({ + note: schema.string(), + }), + params: schema.object({ + package_policy_id: schema.string(), + }), +}; diff --git a/x-pack/plugins/security_solution/common/endpoint/constants.ts b/x-pack/plugins/security_solution/common/endpoint/constants.ts index 19c77f230eea5..6f2d4832e5727 100644 --- a/x-pack/plugins/security_solution/common/endpoint/constants.ts +++ b/x-pack/plugins/security_solution/common/endpoint/constants.ts @@ -63,6 +63,7 @@ export const METADATA_TRANSFORMS_STATUS_ROUTE = `${BASE_ENDPOINT_ROUTE}/metadata export const BASE_POLICY_RESPONSE_ROUTE = `${BASE_ENDPOINT_ROUTE}/policy_response`; export const BASE_POLICY_ROUTE = `${BASE_ENDPOINT_ROUTE}/policy`; export const AGENT_POLICY_SUMMARY_ROUTE = `${BASE_POLICY_ROUTE}/summaries`; +export const PROTECTION_UPDATES_NOTE_ROUTE = `${BASE_ENDPOINT_ROUTE}/protection_updates_note/{package_policy_id}`; /** Suggestions routes */ export const SUGGESTIONS_ROUTE = `${BASE_ENDPOINT_ROUTE}/suggestions/{suggestion_type}`; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts index 6e63264f63e2e..577164ff4d893 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint/policy_details.cy.ts @@ -9,7 +9,10 @@ import moment from 'moment/moment'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; import type { PolicyData } from '../../../../../common/endpoint/types'; import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../tasks/fleet'; -import { setCustomProtectionUpdatesManifestVersion } from '../../tasks/endpoint_policy'; +import { + setCustomProtectionUpdatesManifestVersion, + setCustomProtectionUpdatesNote, +} from '../../tasks/endpoint_policy'; import { login, ROLE } from '../../tasks/login'; import { disableExpandableFlyoutAdvancedSettings, loadPage } from '../../tasks/common'; @@ -17,6 +20,8 @@ describe('Policy Details', () => { describe('Protection updates', () => { const loadProtectionUpdatesUrl = (policyId: string) => loadPage(`/app/security/administration/policy/${policyId}/protectionUpdates`); + const testNote = 'test note'; + const updatedTestNote = 'updated test note'; describe('Renders and saves protection updates', () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; @@ -59,13 +64,18 @@ describe('Policy Details', () => { cy.getByTestSubj('protection-updates-version-to-deploy-picker').within(() => { cy.get('input').should('have.value', formattedToday); }); + cy.getByTestSubj('protection-updates-manifest-name-note-title'); + cy.getByTestSubj('protection-updates-manifest-note'); cy.getByTestSubj('policyDetailsSaveButton'); }); it('should successfully update the manifest version to custom date', () => { loadProtectionUpdatesUrl(policy.id); cy.getByTestSubj('protection-updates-manifest-switch').click(); + cy.getByTestSubj('protection-updates-manifest-note').type(testNote); + cy.intercept('PUT', `/api/fleet/package_policies/${policy.id}`).as('policy'); + cy.intercept('POST', `/api/endpoint/protection_updates_note/*`).as('note'); cy.getByTestSubj('policyDetailsSaveButton').click(); cy.wait('@policy').then(({ request, response }) => { expect(request.body.inputs[0].config.policy.value.global_manifest_version).to.equal( @@ -73,8 +83,15 @@ describe('Policy Details', () => { ); expect(response?.statusCode).to.equal(200); }); + + cy.wait('@note').then(({ request, response }) => { + expect(request.body.note).to.equal(testNote); + expect(response?.statusCode).to.equal(200); + }); + cy.getByTestSubj('protectionUpdatesSuccessfulMessage'); cy.getByTestSubj('protection-updates-deployed-version').contains(formattedToday); + cy.getByTestSubj('protection-updates-manifest-note').contains(testNote); }); }); @@ -122,6 +139,50 @@ describe('Policy Details', () => { }); }); + describe('Renders and saves protection updates with custom note', () => { + let indexedPolicy: IndexedFleetEndpointPolicyResponse; + let policy: PolicyData; + + const twoMonthsAgo = moment().subtract(2, 'months').format('YYYY-MM-DD'); + + beforeEach(() => { + login(); + disableExpandableFlyoutAdvancedSettings(); + }); + + before(() => { + getEndpointIntegrationVersion().then((version) => { + createAgentPolicyTask(version).then((data) => { + indexedPolicy = data; + policy = indexedPolicy.integrationPolicies[0]; + setCustomProtectionUpdatesManifestVersion(policy.id, twoMonthsAgo); + setCustomProtectionUpdatesNote(policy.id, testNote); + }); + }); + }); + + after(() => { + if (indexedPolicy) { + cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); + } + }); + + it('should update note on save', () => { + loadProtectionUpdatesUrl(policy.id); + cy.getByTestSubj('protection-updates-manifest-note').contains(testNote); + cy.getByTestSubj('protection-updates-manifest-note').clear().type(updatedTestNote); + + cy.intercept('POST', `/api/endpoint/protection_updates_note/*`).as('note_updated'); + cy.getByTestSubj('policyDetailsSaveButton').click(); + cy.wait('@note_updated').then(({ request, response }) => { + expect(request.body.note).to.equal(updatedTestNote); + expect(response?.statusCode).to.equal(200); + }); + cy.getByTestSubj('protectionUpdatesSuccessfulMessage'); + cy.getByTestSubj('protection-updates-manifest-note').contains(updatedTestNote); + }); + }); + describe('Renders read only protection updates for user without write permissions', () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; @@ -138,6 +199,7 @@ describe('Policy Details', () => { indexedPolicy = data; policy = indexedPolicy.integrationPolicies[0]; setCustomProtectionUpdatesManifestVersion(policy.id, twoMonthsAgo.format('YYYY-MM-DD')); + setCustomProtectionUpdatesNote(policy.id, testNote); }); }); }); @@ -162,6 +224,10 @@ describe('Policy Details', () => { cy.getByTestSubj('protection-updates-manifest-name-version-to-deploy-title'); cy.getByTestSubj('protection-updates-version-to-deploy-view-mode'); cy.getByTestSubj('protection-updates-version-to-deploy-picker').should('not.exist'); + + cy.getByTestSubj('protection-updates-manifest-name-note-title'); + cy.getByTestSubj('protection-updates-manifest-note').should('not.exist'); + cy.getByTestSubj('protection-updates-manifest-note-view-mode').contains(testNote); cy.getByTestSubj('policyDetailsSaveButton').should('be.disabled'); }); }); diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts index f597e9ae4e225..9353cdf9ed822 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts @@ -94,3 +94,15 @@ export const setCustomProtectionUpdatesManifestVersion = ( }); }); }; + +export const setCustomProtectionUpdatesNote = ( + endpointPolicyId: string, + note: string +): Cypress.Chainable> => { + return request<{ note: string }>({ + method: 'POST', + url: `/api/endpoint/protection_updates_note/${endpointPolicyId}`, + body: { note }, + headers: { 'Elastic-Api-Version': '2023-10-31' }, + }); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts new file mode 100644 index 0000000000000..0ac3db09b35a2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_get_protection_updates_note.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from '@tanstack/react-query'; +import { resolvePathVariables } from '../../../../../../common/utils/resolve_path_variables'; +import { PROTECTION_UPDATES_NOTE_ROUTE } from '../../../../../../../common/endpoint/constants'; +import { useKibana } from '../../../../../../common/lib/kibana'; + +export const getProtectionUpdatesNoteQueryKey = (packagePolicyId: string) => + `protection-updates-note-${packagePolicyId}`; + +interface UseProtectionUpdatesNote { + packagePolicyId: string; +} + +interface NoteResponse { + note: string; +} + +export const useGetProtectionUpdatesNote = ({ packagePolicyId }: UseProtectionUpdatesNote) => { + const { http } = useKibana().services; + + return useQuery<{ data: NoteResponse }, unknown, NoteResponse>( + [getProtectionUpdatesNoteQueryKey(packagePolicyId)], + () => + http.get( + resolvePathVariables(PROTECTION_UPDATES_NOTE_ROUTE, { package_policy_id: packagePolicyId }), + { + version: '2023-10-31', + } + ), + { + keepPreviousData: true, + enabled: !!packagePolicyId, + retry: false, + } + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts new file mode 100644 index 0000000000000..16b6ee66f07ca --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/hooks/use_post_protection_updates_note.ts @@ -0,0 +1,47 @@ +/* + * 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 { useMutation, useQueryClient } from '@tanstack/react-query'; +import { getProtectionUpdatesNoteQueryKey } from './use_get_protection_updates_note'; +import { useKibana } from '../../../../../../common/lib/kibana'; +import { resolvePathVariables } from '../../../../../../common/utils/resolve_path_variables'; +import { PROTECTION_UPDATES_NOTE_ROUTE } from '../../../../../../../common/endpoint/constants'; + +interface ProtectionUpdatesNoteParams { + packagePolicyId: string; +} + +interface NoteResponse { + note: string; +} + +export const useCreateProtectionUpdatesNote = ({ + packagePolicyId, +}: ProtectionUpdatesNoteParams) => { + const { http } = useKibana().services; + const queryClient = useQueryClient(); + + return useMutation< + { data: NoteResponse }, + { body: { error: string; message: string } }, + NoteResponse + >( + (payload) => + http.post( + resolvePathVariables(PROTECTION_UPDATES_NOTE_ROUTE, { policy_id: packagePolicyId }), + { + version: '2023-10-31', + body: JSON.stringify(payload), + } + ), + { + onSuccess: () => { + queryClient.invalidateQueries([getProtectionUpdatesNoteQueryKey(packagePolicyId)]); + }, + } + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx index 09439918dfde0..499be2cf31284 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/protection_updates/protection_updates_layout.tsx @@ -13,14 +13,16 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, + EuiIconTip, EuiPanel, EuiShowFor, EuiSpacer, EuiSwitch, EuiText, + EuiTextArea, EuiTitle, } from '@elastic/eui'; -import React, { useCallback, useContext, useState } from 'react'; +import React, { useCallback, useContext, useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; import { ThemeContext } from 'styled-components'; import { i18n } from '@kbn/i18n'; @@ -28,6 +30,8 @@ import { FormattedMessage } from '@kbn/i18n-react'; import type { Moment } from 'moment'; import moment from 'moment'; import { cloneDeep } from 'lodash'; +import { useCreateProtectionUpdatesNote } from './hooks/use_post_protection_updates_note'; +import { useGetProtectionUpdatesNote } from './hooks/use_get_protection_updates_note'; import { useUserPrivileges } from '../../../../../common/components/user_privileges'; import { useToasts } from '../../../../../common/lib/kibana'; import { useUpdateEndpointPolicy } from '../../../../hooks/policy/use_update_endpoint_policy'; @@ -67,6 +71,20 @@ export const ProtectionUpdatesLayout = React.memo( const today = moment(); const [selectedDate, setSelectedDate] = useState(today); + const { data: fetchedNote, isLoading: getNoteInProgress } = useGetProtectionUpdatesNote({ + packagePolicyId: _policy.id, + }); + const { isLoading: createNoteInProgress, mutate: createNote } = useCreateProtectionUpdatesNote({ + packagePolicyId: _policy.id, + }); + const [note, setNote] = useState(''); + + useEffect(() => { + if (fetchedNote && !getNoteInProgress) { + setNote(fetchedNote.note); + } + }, [fetchedNote, getNoteInProgress]); + const automaticUpdatesEnabled = manifestVersion === 'latest'; const internalDateFormat = 'YYYY-MM-DD'; const displayDateFormat = 'MMMM DD, YYYY'; @@ -119,8 +137,27 @@ export const ProtectionUpdatesLayout = React.memo( text: err.message, }); }); + if ((!fetchedNote && note !== '') || (fetchedNote && note !== fetchedNote.note)) { + createNote( + { note }, + { + onError: (error) => { + toasts.addDanger({ + 'data-test-subj': 'protectionUpdatesNoteUpdateFailureMessage', + title: i18n.translate( + 'xpack.securitySolution.endpoint.protectionUpdates.noteUpdateErrorTitle', + { + defaultMessage: 'Note update failed!', + } + ), + text: error.body.message, + }); + }, + } + ); + } }, - [dispatch, policy, sendPolicyUpdate, toasts] + [policy, sendPolicyUpdate, fetchedNote, note, toasts, dispatch, createNote] ); const toggleAutomaticUpdates = useCallback( @@ -260,16 +297,57 @@ export const ProtectionUpdatesLayout = React.memo( )} - + {deployedVersion === 'latest' ? 'latest' : formattedDate} + {renderVersionToDeployPicker()} + + +
+ {i18n.translate('xpack.securitySolution.endpoint.protectionUpdates.note.label', { + defaultMessage: 'Note', + })} +
+
+ + + + } + /> +
+ + {canWritePolicyManagement ? ( + setNote(e.target.value)} + fullWidth={true} + rows={3} + placeholder={i18n.translate( + 'xpack.securitySolution.endpoint.protectionUpdates.note.placeholder', + { + defaultMessage: 'Add relevant information about update here', + } + )} + data-test-subj={'protection-updates-manifest-note'} + /> + ) : ( + {note} + )} + ( {canWritePolicyManagement ? ( fleetActionsClientMock), esClient: elasticsearchClientMock.createElasticsearchClient(), appFeaturesService, + savedObjectsClient: savedObjectsClientMock.create(), }; }; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts new file mode 100644 index 0000000000000..029d652953861 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.test.ts @@ -0,0 +1,191 @@ +/* + * 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 { EndpointAppContextService } from '../../endpoint_app_context_services'; +import type { KibanaResponseFactory, SavedObjectsClientContract } from '@kbn/core/server'; + +import { + createMockEndpointAppContextServiceSetupContract, + createMockEndpointAppContextServiceStartContract, + createRouteHandlerContext, +} from '../../mocks'; +import type { ScopedClusterClientMock } from '@kbn/core/server/mocks'; +import { + elasticsearchServiceMock, + httpServerMock, + savedObjectsClientMock, +} from '@kbn/core/server/mocks'; +import { getProtectionUpdatesNoteHandler, postProtectionUpdatesNoteHandler } from './handlers'; +import { requestContextMock } from '../../../lib/detection_engine/routes/__mocks__'; + +const mockedSOSuccessfulFindResponse = { + total: 1, + saved_objects: [ + { + id: 'id', + type: 'type', + references: [ + { + id: 'id_package_policy', + name: 'package_policy', + type: 'ingest-package-policies', + }, + ], + attributes: { note: 'note' }, + score: 1, + }, + ], + page: 1, + per_page: 10, +}; + +const mockedSOSuccessfulFindResponseEmpty = { + total: 0, + saved_objects: [], + page: 1, + per_page: 10, +}; + +const createMockedSOSuccessfulCreateResponse = (note: string) => ({ + id: 'id', + type: 'type', + references: [], + attributes: { note }, +}); + +const mockedSOSuccessfulUpdateResponse = [ + 'policy-settings-protection-updates-note', + 'id', + { note: 'note2' }, + { + references: [ + { + id: 'id_package_policy', + name: 'package_policy', + type: 'ingest-package-policies', + }, + ], + refresh: 'wait_for', + }, +]; + +describe('test protection updates note handler', () => { + let endpointAppContextService: EndpointAppContextService; + let mockSavedObjectClient: jest.Mocked; + let mockResponse: jest.Mocked; + let mockScopedClient: ScopedClusterClientMock; + + describe('test protection updates note handler', () => { + beforeEach(() => { + mockScopedClient = elasticsearchServiceMock.createScopedClusterClient(); + mockSavedObjectClient = savedObjectsClientMock.create(); + mockResponse = httpServerMock.createResponseFactory(); + endpointAppContextService = new EndpointAppContextService(); + endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); + endpointAppContextService.start(createMockEndpointAppContextServiceStartContract()); + }); + + afterEach(() => endpointAppContextService.stop()); + + it('should create a new note if one does not exist', async () => { + const protectionUpdatesNoteHandler = postProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + body: { note: 'note' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponseEmpty); + + mockSavedObjectClient.create.mockResolvedValueOnce( + createMockedSOSuccessfulCreateResponse('note') + ); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.ok).toBeCalled(); + expect(mockSavedObjectClient.create).toBeCalledWith( + 'policy-settings-protection-updates-note', + { note: 'note' }, + { + references: [{ id: undefined, name: 'package_policy', type: 'ingest-package-policies' }], + refresh: 'wait_for', + } + ); + }); + + it('should update an existing note on post if one exists', async () => { + const protectionUpdatesNoteHandler = postProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + body: { note: 'note2' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponse); + + mockSavedObjectClient.update.mockResolvedValueOnce( + createMockedSOSuccessfulCreateResponse('note2') + ); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.ok).toBeCalled(); + expect(mockSavedObjectClient.update).toBeCalledWith(...mockedSOSuccessfulUpdateResponse); + }); + + it('should return the note if one exists', async () => { + const protectionUpdatesNoteHandler = getProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponse); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.ok).toBeCalled(); + const result = mockResponse.ok.mock.calls[0][0]?.body as { note: string }; + expect(result.note).toEqual('note'); + }); + + it('should return notFound if no note exists', async () => { + const protectionUpdatesNoteHandler = getProtectionUpdatesNoteHandler(); + const mockRequest = httpServerMock.createKibanaRequest({ + params: { policyId: 'id' }, + }); + + mockSavedObjectClient.find.mockResolvedValueOnce(mockedSOSuccessfulFindResponseEmpty); + + await protectionUpdatesNoteHandler( + requestContextMock.convertContext( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient) + ), + mockRequest, + mockResponse + ); + + expect(mockResponse.notFound).toBeCalled(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts new file mode 100644 index 0000000000000..e1677451ff577 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/handlers.ts @@ -0,0 +1,126 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + RequestHandler, + SavedObjectReference, + SavedObjectsClientContract, +} from '@kbn/core/server'; +import type { TypeOf } from '@kbn/config-schema'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; +import { protectionUpdatesNoteSavedObjectType } from '../../lib/protection_updates_note/saved_object_mappings'; +import type { + CreateUpdateProtectionUpdatesNoteSchema, + GetProtectionUpdatesNoteSchema, +} from '../../../../common/api/endpoint/protection_updates_note/protection_updates_note_schema'; + +const getProtectionNote = async (SOClient: SavedObjectsClientContract, packagePolicyId: string) => { + return SOClient.find<{ note: string }>({ + type: protectionUpdatesNoteSavedObjectType, + hasReference: { type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, id: packagePolicyId }, + }); +}; + +const updateProtectionNote = async ( + SOClient: SavedObjectsClientContract, + noteId: string, + note: string, + references: SavedObjectReference[] +) => { + return SOClient.update( + protectionUpdatesNoteSavedObjectType, + noteId, + { + note, + }, + { + references, + refresh: 'wait_for', + } + ); +}; + +const createProtectionNote = async ( + SOClient: SavedObjectsClientContract, + note: string, + references: SavedObjectReference[] +) => { + return SOClient.create( + protectionUpdatesNoteSavedObjectType, + { + note, + }, + { + references, + refresh: 'wait_for', + } + ); +}; + +export const postProtectionUpdatesNoteHandler = function (): RequestHandler< + TypeOf, + undefined, + TypeOf +> { + return async (context, request, response) => { + const SOClient = (await context.core).savedObjects.client; + const { package_policy_id: packagePolicyId } = request.params; + const { note } = request.body; + + const soClientResponse = await getProtectionNote(SOClient, packagePolicyId); + + if (soClientResponse.saved_objects[0]) { + const { references } = soClientResponse.saved_objects[0]; + + const updatedNoteSO = await updateProtectionNote( + SOClient, + soClientResponse.saved_objects[0].id, + note, + references + ); + + const { attributes } = updatedNoteSO; + + return response.ok({ body: attributes }); + } + + const references: SavedObjectReference[] = [ + { + id: packagePolicyId, + name: 'package_policy', + type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, + }, + ]; + + const noteSO = await createProtectionNote(SOClient, note, references); + + const { attributes } = noteSO; + + return response.ok({ body: attributes }); + }; +}; + +export const getProtectionUpdatesNoteHandler = function (): RequestHandler< + TypeOf, + undefined, + undefined +> { + return async (context, request, response) => { + const SOClient = (await context.core).savedObjects.client; + const { package_policy_id: packagePolicyId } = request.params; + + const soClientResponse = await getProtectionNote(SOClient, packagePolicyId); + + if (!soClientResponse.saved_objects[0] || !soClientResponse.saved_objects[0].attributes) { + return response.notFound({ body: { message: 'No note found for this policy' } }); + } + + const { attributes } = soClientResponse.saved_objects[0]; + + return response.ok({ body: attributes }); + }; +}; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts new file mode 100644 index 0000000000000..4d398bbe14e6e --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/protection_updates_note/index.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { IRouter } from '@kbn/core/server'; +import { getProtectionUpdatesNoteHandler, postProtectionUpdatesNoteHandler } from './handlers'; +import { + GetProtectionUpdatesNoteSchema, + CreateUpdateProtectionUpdatesNoteSchema, +} from '../../../../common/api/endpoint/protection_updates_note/protection_updates_note_schema'; +import { withEndpointAuthz } from '../with_endpoint_authz'; +import { PROTECTION_UPDATES_NOTE_ROUTE } from '../../../../common/endpoint/constants'; +import type { EndpointAppContext } from '../../types'; + +export function registerProtectionUpdatesNoteRoutes( + router: IRouter, + endpointAppContext: EndpointAppContext +) { + const logger = endpointAppContext.logFactory.get('protectionUpdatesNote'); + + router.versioned + .post({ + access: 'public', + path: PROTECTION_UPDATES_NOTE_ROUTE, + options: { authRequired: true, tags: ['access:securitySolution'] }, + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: CreateUpdateProtectionUpdatesNoteSchema, + }, + }, + withEndpointAuthz( + { all: ['canWritePolicyManagement'] }, + logger, + postProtectionUpdatesNoteHandler() + ) + ); + + router.versioned + .get({ + access: 'public', + path: PROTECTION_UPDATES_NOTE_ROUTE, + options: { authRequired: true, tags: ['access:securitySolution'] }, + }) + .addVersion( + { + version: '2023-10-31', + validate: { + request: GetProtectionUpdatesNoteSchema, + }, + }, + withEndpointAuthz( + { all: ['canReadPolicyManagement'] }, + logger, + getProtectionUpdatesNoteHandler() + ) + ); +} diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts index e2ce386337a85..43292c8436fdc 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts @@ -615,7 +615,7 @@ describe('ingest_integration tests ', () => { const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; const invokeDeleteCallback = async (): Promise => { - const callback = getPackagePolicyDeleteCallback(exceptionListClient); + const callback = getPackagePolicyDeleteCallback(exceptionListClient, soClient); await callback(deletePackagePolicyMock(), soClient, esClient); }; @@ -640,6 +640,27 @@ describe('ingest_integration tests ', () => { }); it('removes policy from artifact', async () => { + soClient.find.mockResolvedValueOnce({ + total: 1, + saved_objects: [ + { + id: 'id', + type: 'type', + references: [ + { + id: 'id_package_policy', + name: 'package_policy', + type: 'ingest-package-policies', + }, + ], + attributes: { note: 'note' }, + score: 1, + }, + ], + page: 1, + per_page: 10, + }); + await invokeDeleteCallback(); expect(exceptionListClient.findExceptionListsItem).toHaveBeenCalledWith({ @@ -660,6 +681,8 @@ describe('ingest_integration tests ', () => { osTypes: fakeArtifact.os_types, tags: [], }); + + expect(soClient.delete).toBeCalledWith('policy-settings-protection-updates-note', 'id'); }); }); }); diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts index 554417eee480d..c2775f3f4794a 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { Logger, ElasticsearchClient } from '@kbn/core/server'; +import type { Logger, ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server'; import type { ExceptionListClient } from '@kbn/lists-plugin/server'; import type { PluginStartContract as AlertsStartContract } from '@kbn/alerting-plugin/server'; import type { @@ -44,6 +44,7 @@ import type { AnyPolicyCreateConfig } from './types'; import { ENDPOINT_INTEGRATION_CONFIG_KEY } from './constants'; import { createEventFilters } from './handlers/create_event_filters'; import type { AppFeaturesService } from '../lib/app_features_service/app_features_service'; +import { removeProtectionUpdatesNote } from './handlers/remove_protection_updates_note'; const isEndpointPackagePolicy = ( packagePolicy: T @@ -280,7 +281,8 @@ export const getPackagePolicyPostCreateCallback = ( }; export const getPackagePolicyDeleteCallback = ( - exceptionsClient: ExceptionListClient | undefined + exceptionsClient: ExceptionListClient | undefined, + savedObjectsClient: SavedObjectsClientContract | undefined ): PostPackagePolicyPostDeleteCallback => { return async (deletePackagePolicy): Promise => { if (!exceptionsClient) { @@ -290,8 +292,12 @@ export const getPackagePolicyDeleteCallback = ( for (const policy of deletePackagePolicy) { if (isEndpointPackagePolicy(policy)) { policiesToRemove.push(removePolicyFromArtifacts(exceptionsClient, policy)); + if (savedObjectsClient) { + policiesToRemove.push(removeProtectionUpdatesNote(savedObjectsClient, policy)); + } } } + await Promise.all(policiesToRemove); }; }; diff --git a/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.ts new file mode 100644 index 0000000000000..9106eba06e780 --- /dev/null +++ b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_protection_updates_note.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PostPackagePolicyPostDeleteCallback } from '@kbn/fleet-plugin/server'; +import type { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; +import pMap from 'p-map'; +import { protectionUpdatesNoteSavedObjectType } from '../../endpoint/lib/protection_updates_note/saved_object_mappings'; + +export const removeProtectionUpdatesNote = async ( + soClient: SavedObjectsClientContract, + policy: Parameters[0][0] +) => { + if (policy.id) { + const foundProtectionUpdatesNotes = await soClient.find({ + type: protectionUpdatesNoteSavedObjectType, + hasReference: { + type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, + id: policy.id, + }, + }); + await pMap( + foundProtectionUpdatesNotes.saved_objects, + (protectionUpdatesNote: { id: string }) => { + soClient.delete(protectionUpdatesNoteSavedObjectType, protectionUpdatesNote.id); + } + ); + } +}; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 65d66e4fde644..8d3bef07d19e1 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -98,6 +98,7 @@ import { import { AppFeaturesService } from './lib/app_features_service/app_features_service'; import { registerRiskScoringTask } from './lib/risk_engine/tasks/risk_scoring_task'; +import { registerProtectionUpdatesNoteRoutes } from './endpoint/routes/protection_updates_note'; export type { SetupPlugins, StartPlugins, PluginSetup, PluginStart } from './plugin_contract'; @@ -317,6 +318,7 @@ export class Plugin implements ISecuritySolutionPlugin { ); registerLimitedConcurrencyRoutes(core); registerPolicyRoutes(router, this.endpointContext); + registerProtectionUpdatesNoteRoutes(router, this.endpointContext); registerActionRoutes( router, this.endpointContext, @@ -533,6 +535,7 @@ export class Plugin implements ISecuritySolutionPlugin { createFleetActionsClient, esClient: core.elasticsearch.client.asInternalUser, appFeaturesService, + savedObjectsClient, }); this.telemetryReceiver.start( diff --git a/x-pack/plugins/security_solution/server/saved_objects.ts b/x-pack/plugins/security_solution/server/saved_objects.ts index 096b46528e76f..3f91bcf149ac6 100644 --- a/x-pack/plugins/security_solution/server/saved_objects.ts +++ b/x-pack/plugins/security_solution/server/saved_objects.ts @@ -7,6 +7,7 @@ import type { CoreSetup } from '@kbn/core/server'; +import { protectionUpdatesNoteType } from './endpoint/lib/protection_updates_note/saved_object_mappings'; import { noteType, pinnedEventType, timelineType } from './lib/timeline/saved_object_mappings'; // eslint-disable-next-line no-restricted-imports import { legacyType as legacyRuleActionsType } from './lib/detection_engine/rule_actions_legacy'; @@ -24,6 +25,7 @@ const types = [ manifestType, signalsMigrationType, riskEngineConfigurationType, + protectionUpdatesNoteType, ]; export const savedObjectTypes = types.map((type) => type.name); From 4fc0369713f8abbe8686e182daee8d36a79e7844 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 6 Sep 2023 09:03:48 +0300 Subject: [PATCH 09/25] [ES|QL] Adds initial telemetry events (#165693) ## Summary Adds initial counters for ES|QL 1. When the Try ES|QL option in dataview picker is clicked 2. When a Lens chart with text based languages is rendered --- .../public/dataview_picker/change_dataview.tsx | 8 ++++++-- .../datasources/text_based/text_based_languages.tsx | 8 +++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx index 7d04fd5fa3621..4c4a81371e052 100644 --- a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx +++ b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx @@ -27,6 +27,7 @@ import { EuiButtonEmpty, EuiToolTip, } from '@elastic/eui'; +import { METRIC_TYPE } from '@kbn/analytics'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { AggregateQuery, getLanguageDisplayName } from '@kbn/es-query'; import type { DataView } from '@kbn/data-views-plugin/public'; @@ -92,7 +93,9 @@ export function ChangeDataView({ const [selectedDataViewId, setSelectedDataViewId] = useState(currentDataViewId); const kibana = useKibana(); - const { application, data, storage, dataViews, dataViewEditor } = kibana.services; + const { application, data, storage, dataViews, dataViewEditor, appName, usageCollection } = + kibana.services; + const reportUiCounter = usageCollection?.reportUiCounter.bind(usageCollection, appName); const styles = changeDataViewStyles({ fullWidth: trigger.fullWidth }); const [isTextLangTransitionModalDismissed, setIsTextLangTransitionModalDismissed] = useState(() => Boolean(storage.get(TEXT_LANG_TRANSITION_MODAL_KEY)) @@ -366,8 +369,9 @@ export function ChangeDataView({ (q: AggregateQuery) => { onTextLangQuerySubmit?.(q); setPopoverIsOpen(false); + reportUiCounter?.(METRIC_TYPE.CLICK, `esql:unified_search_clicked`); }, - [onTextLangQuerySubmit] + [onTextLangQuerySubmit, reportUiCounter] ); const cleanup = useCallback( diff --git a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx index e2dc541e77e2d..a76e2edd623b0 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { CoreStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; -import type { AggregateQuery } from '@kbn/es-query'; +import { AggregateQuery, isOfAggregateQueryType, getAggregateQueryMode } from '@kbn/es-query'; import type { SavedObjectReference } from '@kbn/core/public'; import { EuiFormRow } from '@elastic/eui'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; @@ -371,6 +371,12 @@ export function getTextBasedDatasource({ }, getRenderEventCounters(state: TextBasedPrivateState): string[] { + const context = state?.initialContext; + if (context && 'query' in context && context.query && isOfAggregateQueryType(context.query)) { + const language = getAggregateQueryMode(context.query); + // it will eventually log render_lens_esql_chart + return [`${language}_chart`]; + } return []; }, From 0f3209cc50fc624e7d1d35e3b8e13725aaf5fc85 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Wed, 6 Sep 2023 09:21:46 +0200 Subject: [PATCH 10/25] [AggConfigs] Consider root level filters buckets correctly when building other terms bucket (#165656) ## Summary Fixes #165487 This PR fixes the `Other` bucket problem when the filter is used at root level with a nested `terms` agg. This is visible when using the `Split metric by` in Lens in a table visualization. Used the `sum` to easily compare the results: Screenshot 2023-09-05 at 11 12 46 Now introducing a basic `*` Filter as `split metric by`: Screenshot 2023-09-05 at 11 12 52 And with a more complex filter (1098 + 564 = 1662): Screenshot 2023-09-05 at 11 12 36 ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Stratoula Kalafateli --- .../_terms_other_bucket_helper.test.ts | 113 ++++++++++++++++++ .../buckets/_terms_other_bucket_helper.ts | 6 +- 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts index 981ff3664fbec..b68893847ed64 100644 --- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts @@ -545,6 +545,119 @@ describe('Terms Agg Other bucket helper', () => { expect(agg).toEqual(false); }); + + test('returns true when nested filter agg has buckets', () => { + const aggConfigs = getAggConfigs([ + { + id: '0', + type: BUCKET_TYPES.FILTERS, + params: [ + { + input: { + language: 'kuery', + query: '', + }, + label: '', + }, + ], + }, + ...nestedTerm.aggs, + ]); + + const nestedTermResponseWithRootFilter = wrapResponse({ + '0': { + buckets: { + '*': { + '1': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 8325, + buckets: [ + { + '2': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 8325, + buckets: [ + { key: 'ios', doc_count: 2850 }, + { key: 'win xp', doc_count: 2830 }, + { key: '__missing__', doc_count: 1430 }, + ], + }, + key: 'US-with-dash', + doc_count: 2850, + }, + { + '2': { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 8325, + buckets: [ + { key: 'ios', doc_count: 1850 }, + { key: 'win xp', doc_count: 1830 }, + { key: '__missing__', doc_count: 130 }, + ], + }, + key: 'IN-with-dash', + doc_count: 2830, + }, + ], + }, + doc_count: 1148, + }, + }, + }, + }); + + const otherAggConfig = buildOtherBucketAgg( + aggConfigs, + aggConfigs.aggs[2] as IBucketAggConfig, + enrichResponseWithSampling(nestedTermResponseWithRootFilter) + ); + + expect(otherAggConfig).toBeDefined(); + if (otherAggConfig) { + const expectedResponse = { + 'other-filter': { + aggs: undefined, + filters: { + filters: { + [`${SEP}*${SEP}IN-with-dash`]: { + bool: { + must: [], + filter: [ + { bool: { filter: [], must: [], must_not: [], should: [] } }, + { match_phrase: { 'geo.src': 'IN-with-dash' } }, + { exists: { field: 'machine.os.raw' } }, + ], + should: [], + must_not: [ + { match_phrase: { 'machine.os.raw': 'ios' } }, + { match_phrase: { 'machine.os.raw': 'win xp' } }, + ], + }, + }, + [`${SEP}*${SEP}US-with-dash`]: { + bool: { + must: [], + filter: [ + { bool: { filter: [], must: [], must_not: [], should: [] } }, + { match_phrase: { 'geo.src': 'US-with-dash' } }, + { exists: { field: 'machine.os.raw' } }, + ], + should: [], + must_not: [ + { match_phrase: { 'machine.os.raw': 'ios' } }, + { match_phrase: { 'machine.os.raw': 'win xp' } }, + ], + }, + }, + }, + }, + }, + }; + const resp = otherAggConfig(); + const topAgg = !isSamplingEnabled(probability) ? resp : resp.sampling!.aggs; + expect(topAgg).toEqual(expectedResponse); + } + }); }); describe(`mergeOtherBucketAggResponse${getTitlePostfix()}`, () => { diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts index 9737883733266..924564744962f 100644 --- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts +++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts @@ -206,7 +206,11 @@ export const buildOtherBucketAgg = ( ) => { // make sure there are actually results for the buckets const agg = aggregations[aggId]; - if (!agg || !agg.buckets.length) { + if ( + !agg || + // buckets can be either an array or an object in case there's also a filter at the same level + (Array.isArray(agg.buckets) ? !agg.buckets.length : !Object.values(agg.buckets).length) + ) { noAggBucketResults = true; return; } From 1b0c095ad3d6bf814a928898346cfd6483777794 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 6 Sep 2023 10:44:30 +0300 Subject: [PATCH 11/25] ES|QL wrap with pipes (#165598) ## Summary Atm the wrap button is not very useful on the extended mode of the ES|QL editor. We would like to give the user the ability to wrap/unwrap based on the pipes. ![esql](https://github.com/elastic/kibana/assets/17003240/6db92dea-69b1-4344-b67e-a44759e8b2e6) ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../kbn-text-based-editor/src/helpers.test.ts | 25 ++++++++++++++++- packages/kbn-text-based-editor/src/helpers.ts | 8 ++++++ .../src/text_based_languages_editor.tsx | 27 +++++++++++++++---- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/packages/kbn-text-based-editor/src/helpers.test.ts b/packages/kbn-text-based-editor/src/helpers.test.ts index 74c2387fde2fa..5f1546ccc138e 100644 --- a/packages/kbn-text-based-editor/src/helpers.test.ts +++ b/packages/kbn-text-based-editor/src/helpers.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { parseErrors, parseWarning, getInlineEditorText } from './helpers'; +import { parseErrors, parseWarning, getInlineEditorText, getWrappedInPipesCode } from './helpers'; describe('helpers', function () { describe('parseErrors', function () { @@ -136,4 +136,27 @@ describe('helpers', function () { ); }); }); + + describe('getWrappedInPipesCode', function () { + it('should return the code wrapped', function () { + const code = getWrappedInPipesCode('FROM index1 | keep field1, field2 | order field1', false); + expect(code).toEqual('FROM index1\n| keep field1, field2\n| order field1'); + }); + + it('should return the code unwrapped', function () { + const code = getWrappedInPipesCode( + 'FROM index1 \n| keep field1, field2 \n| order field1', + true + ); + expect(code).toEqual('FROM index1 | keep field1, field2 | order field1'); + }); + + it('should return the code unwrapped and trimmed', function () { + const code = getWrappedInPipesCode( + 'FROM index1 \n| keep field1, field2 \n| order field1', + true + ); + expect(code).toEqual('FROM index1 | keep field1, field2 | order field1'); + }); + }); }); diff --git a/packages/kbn-text-based-editor/src/helpers.ts b/packages/kbn-text-based-editor/src/helpers.ts index ca5e3d2fca663..fd7c9c2f9406d 100644 --- a/packages/kbn-text-based-editor/src/helpers.ts +++ b/packages/kbn-text-based-editor/src/helpers.ts @@ -158,3 +158,11 @@ export const getDocumentationSections = async (language: string) => { export const getInlineEditorText = (queryString: string, isMultiLine: boolean) => { return isMultiLine ? queryString.replace(/\r?\n|\r/g, ' ').replace(/ +/g, ' ') : queryString; }; + +export const getWrappedInPipesCode = (code: string, isWrapped: boolean): string => { + const pipes = code?.split('|'); + const codeNoLines = pipes?.map((pipe) => { + return pipe.replaceAll('\n', '').trim(); + }); + return codeNoLines.join(isWrapped ? ' | ' : '\n| '); +}; diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx index 3aada71f81ab0..d8b8530f7cd37 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx @@ -55,6 +55,7 @@ import { getInlineEditorText, getDocumentationSections, MonacoError, + getWrappedInPipesCode, } from './helpers'; import { EditorFooter } from './editor_footer'; import { ResizableButton } from './resizable_button'; @@ -138,7 +139,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const [showLineNumbers, setShowLineNumbers] = useState(isCodeEditorExpanded); const [isCompactFocused, setIsCompactFocused] = useState(isCodeEditorExpanded); const [isCodeEditorExpandedFocused, setIsCodeEditorExpandedFocused] = useState(false); - const [isWordWrapped, setIsWordWrapped] = useState(true); + const [isWordWrapped, setIsWordWrapped] = useState(false); const [editorErrors, setEditorErrors] = useState([]); const [editorWarning, setEditorWarning] = useState([]); @@ -359,6 +360,16 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } }, [calculateVisibleCode, code, isCompactFocused, queryString]); + useEffect(() => { + if (isCodeEditorExpanded && !isWordWrapped) { + const pipes = code?.split('|'); + const pipesWithNewLine = code?.split('\n|'); + if (pipes?.length === pipesWithNewLine?.length) { + setIsWordWrapped(true); + } + } + }, [code, isCodeEditorExpanded, isWordWrapped]); + const onResize = ({ width }: { width: number }) => { calculateVisibleCode(width); if (editor1.current) { @@ -369,6 +380,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const onQueryUpdate = useCallback( (value: string) => { setCode(value); + setIsWordWrapped(false); onTextLangQueryChange({ [language]: value } as AggregateQuery); }, [language, onTextLangQueryChange] @@ -509,13 +521,13 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ ? i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel', { - defaultMessage: 'Disable word wrap', + defaultMessage: 'Disable wrap with pipes', } ) : i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel', { - defaultMessage: 'Enable word wrap', + defaultMessage: 'Wrap with pipes', } ) } @@ -529,13 +541,13 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ ? i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.disableWordWrapLabel', { - defaultMessage: 'Disable word wrap', + defaultMessage: 'Disable wrap with pipes', } ) : i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.EnableWordWrapLabel', { - defaultMessage: 'Enable word wrap', + defaultMessage: 'Wrap with pipes', } ) } @@ -545,6 +557,11 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ wordWrap: isWordWrapped ? 'off' : 'on', }); setIsWordWrapped(!isWordWrapped); + const updatedCode = getWrappedInPipesCode(code, isWordWrapped); + if (code !== updatedCode) { + setCode(updatedCode); + onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); + } }} /> From 55936a83a1ea953c25e16595342461b41986cb71 Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 6 Sep 2023 10:46:13 +0200 Subject: [PATCH 12/25] [Log Explorer] Fix broken data grid on columns update (#165679) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Closes #165558 The issue was caused by a particular condition caused by the overridden `data` service that the plugin injects in the Discover App. Reverse engineering from the blank screen when updating the columns: 1. The `DiscoverHistogramLayout` is rendered conditionally only [when a `searchSessionId` exists](https://github.com/elastic/kibana/blob/main/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.tsx#L47). 2. The `searchSessionId` is initialized with a default value and exists until [the `data.search.session.clear()` function is invoked](https://github.com/elastic/kibana/blob/main/src/plugins/discover/public/application/main/discover_main_app.tsx#L82). 3. Being this effect cleanup callback is invoked when `data.search.session` changes in its reference, the issue is caused by the [injected service](https://github.com/elastic/kibana/blob/main/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx#L52-L62). 4. The root cause is that each time a property is read from the proxied `data` service, new nested Proxies are created, triggering the useEffect cleanup function since the new Proxy has a new reference. The implemented solution adds an enhanced version of `createPropertyGetProxy` that keeps the created proxy as a singleton, storing the original value in a cache by a passed key. --------- Co-authored-by: Marco Antonio Ghiani --- .../components/log_explorer/log_explorer.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx index 10bd9039751f1..fa76cadeb727b 100644 --- a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx +++ b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx @@ -6,7 +6,7 @@ */ import { ScopedHistory } from '@kbn/core-application-browser'; -import { DataPublicPluginStart, ISearchStart, ISessionService } from '@kbn/data-plugin/public'; +import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { DiscoverStart } from '@kbn/discover-plugin/public'; import React from 'react'; import { @@ -50,13 +50,17 @@ export const createLogExplorer = ({ * are no-ops. */ const createDataServiceProxy = (data: DataPublicPluginStart) => { + const noOpEnableStorage = () => {}; + + const sessionServiceProxy = createPropertyGetProxy(data.search.session, { + enableStorage: () => noOpEnableStorage, + }); + + const searchServiceProxy = createPropertyGetProxy(data.search, { + session: () => sessionServiceProxy, + }); + return createPropertyGetProxy(data, { - search: (searchService: ISearchStart) => - createPropertyGetProxy(searchService, { - session: (sessionService: ISessionService) => - createPropertyGetProxy(sessionService, { - enableStorage: () => () => {}, - }), - }), + search: () => searchServiceProxy, }); }; From 1c7ac5d5de0f7f14c0e23bc87bd89119b5a126df Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 6 Sep 2023 12:30:29 +0200 Subject: [PATCH 13/25] [Log Explorer] Add Discover fallback link (#165464) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Closes #165220 This PR introduces a new fallback link from the Log Explorer application to Discover. To correctly retrieve the details required to correctly navigate to Discover with the used data view and filters, the LogExplorer component accepts now a new `state$` behaviour subject as a property that can be used to notify the consumers of any change from the internal state. https://github.com/elastic/kibana/assets/34506779/c8176ef2-7a3b-4c7e-860a-450ba677412a ## 🧪 Test suite ``` ↳ Observability Log Explorer ↳ Header menu ↳ should inject the app header menu on the top navbar ↳ Discover fallback link ↳ should render a button link ↳ should navigate to discover keeping the current columns/filters/query/time/data view ``` --------- Co-authored-by: Marco Antonio Ghiani Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/discover/public/index.ts | 1 + .../plugins/log_explorer/common/constants.ts | 1 + .../common/datasets/models/dataset.ts | 2 + .../components/log_explorer/log_explorer.tsx | 21 +++- .../customizations/log_explorer_profile.tsx | 44 +++++++- x-pack/plugins/log_explorer/public/index.ts | 1 + .../common/constants.ts | 8 ++ .../common/translations.ts | 7 ++ .../observability_log_explorer/kibana.jsonc | 3 +- .../observability_log_explorer.tsx | 68 +++++++----- .../components/log_explorer_top_nav_menu.tsx | 105 ++++++++++++++++++ .../public/plugin.ts | 3 +- .../public/routes/main/main_route.tsx | 25 +++-- .../public/types.ts | 2 + .../public/utils/breadcrumbs.tsx | 10 +- .../observability_log_explorer/tsconfig.json | 2 + .../observability_log_explorer/header_menu.ts | 76 +++++++++++++ .../apps/observability_log_explorer/index.ts | 1 + .../observability_log_explorer.ts | 29 +++++ .../observability_log_explorer/header_menu.ts | 76 +++++++++++++ .../observability_log_explorer/index.ts | 1 + 21 files changed, 432 insertions(+), 54 deletions(-) create mode 100644 x-pack/plugins/observability_log_explorer/common/constants.ts create mode 100644 x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx create mode 100644 x-pack/test/functional/apps/observability_log_explorer/header_menu.ts create mode 100644 x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts diff --git a/src/plugins/discover/public/index.ts b/src/plugins/discover/public/index.ts index 5af7c2bf1142a..ca3c58a4d2899 100644 --- a/src/plugins/discover/public/index.ts +++ b/src/plugins/discover/public/index.ts @@ -15,6 +15,7 @@ export function plugin(initializerContext: PluginInitializerContext) { } export type { ISearchEmbeddable, SearchInput } from './embeddable'; +export type { DiscoverAppState } from './application/main/services/discover_app_state_container'; export type { DiscoverStateContainer } from './application/main/services/discover_state'; export type { DiscoverContainerProps } from './components/discover_container'; export type { diff --git a/x-pack/plugins/log_explorer/common/constants.ts b/x-pack/plugins/log_explorer/common/constants.ts index 37f56942f332a..fc1c572ebae26 100644 --- a/x-pack/plugins/log_explorer/common/constants.ts +++ b/x-pack/plugins/log_explorer/common/constants.ts @@ -8,4 +8,5 @@ export const LOG_EXPLORER_PROFILE_ID = 'log-explorer'; // Fields constants +export const TIMESTAMP_FIELD = '@timestamp'; export const MESSAGE_FIELD = 'message'; diff --git a/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts b/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts index 68119fb6015b1..974a9fd4ca37f 100644 --- a/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts +++ b/x-pack/plugins/log_explorer/common/datasets/models/dataset.ts @@ -8,6 +8,7 @@ import { IconType } from '@elastic/eui'; import { DataViewSpec } from '@kbn/data-views-plugin/common'; import { IndexPattern } from '@kbn/io-ts-utils'; +import { TIMESTAMP_FIELD } from '../../constants'; import { DatasetId, DatasetType, IntegrationType } from '../types'; type IntegrationBase = Pick; @@ -53,6 +54,7 @@ export class Dataset { return { id: this.id, name: this.getFullTitle(), + timeFieldName: TIMESTAMP_FIELD, title: this.name as string, }; } diff --git a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx index fa76cadeb727b..6a945afa19ab2 100644 --- a/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx +++ b/x-pack/plugins/log_explorer/public/components/log_explorer/log_explorer.tsx @@ -5,22 +5,30 @@ * 2.0. */ +import React, { useMemo } from 'react'; import { ScopedHistory } from '@kbn/core-application-browser'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import { DiscoverStart } from '@kbn/discover-plugin/public'; -import React from 'react'; +import { DiscoverAppState, DiscoverStart } from '@kbn/discover-plugin/public'; +import type { BehaviorSubject } from 'rxjs'; import { createLogExplorerProfileCustomizations, CreateLogExplorerProfileCustomizationsDeps, } from '../../customizations/log_explorer_profile'; import { createPropertyGetProxy } from '../../utils/proxies'; +import { LogExplorerProfileContext } from '../../state_machines/log_explorer_profile'; export interface CreateLogExplorerArgs extends CreateLogExplorerProfileCustomizationsDeps { discover: DiscoverStart; } +export interface LogExplorerStateContainer { + appState?: DiscoverAppState; + logExplorerState?: Partial; +} + export interface LogExplorerProps { scopedHistory: ScopedHistory; + state$?: BehaviorSubject; } export const createLogExplorer = ({ @@ -28,13 +36,16 @@ export const createLogExplorer = ({ data, discover: { DiscoverContainer }, }: CreateLogExplorerArgs) => { - const logExplorerCustomizations = [createLogExplorerProfileCustomizations({ core, data })]; - const overrideServices = { data: createDataServiceProxy(data), }; - return ({ scopedHistory }: LogExplorerProps) => { + return ({ scopedHistory, state$ }: LogExplorerProps) => { + const logExplorerCustomizations = useMemo( + () => [createLogExplorerProfileCustomizations({ core, data, state$ })], + [state$] + ); + return ( import('./custom_dataset_selector')); const LazyCustomDatasetFilters = dynamic(() => import('./custom_dataset_filters')); @@ -17,10 +20,11 @@ const LazyCustomDatasetFilters = dynamic(() => import('./custom_dataset_filters' export interface CreateLogExplorerProfileCustomizationsDeps { core: CoreStart; data: DataPublicPluginStart; + state$?: BehaviorSubject; } export const createLogExplorerProfileCustomizations = - ({ core, data }: CreateLogExplorerProfileCustomizationsDeps): CustomizationCallback => + ({ core, data, state$ }: CreateLogExplorerProfileCustomizationsDeps): CustomizationCallback => async ({ customizations, stateContainer }) => { // Lazy load dependencies const datasetServiceModuleLoadable = import('../services/datasets'); @@ -38,13 +42,26 @@ export const createLogExplorerProfileCustomizations = toasts: core.notifications.toasts, }); - // /** * Wait for the machine to be fully initialized to set the restored selection * create the DataView and set it in the stateContainer from Discover */ await waitForState(logExplorerProfileStateService, 'initialized'); + /** + * Subscribe the state$ BehaviorSubject when the consumer app wants to react to state changes. + * It emits a combined state of: + * - log explorer state machine context + * - appState from the discover stateContainer + */ + let stateSubscription: Subscription; + if (state$) { + stateSubscription = createStateUpdater({ + logExplorerProfileStateService, + stateContainer, + }).subscribe(state$); + } + /** * Replace the DataViewPicker with a custom `DatasetSelector` to pick integrations streams * Prepend the search bar with custom filter control groups depending on the selected dataset @@ -76,4 +93,25 @@ export const createLogExplorerProfileCustomizations = saveItem: { disabled: true }, }, }); + + return () => { + if (stateSubscription) { + stateSubscription.unsubscribe(); + } + }; }; + +const createStateUpdater = ({ + logExplorerProfileStateService, + stateContainer, +}: { + logExplorerProfileStateService: LogExplorerProfileStateService; + stateContainer: DiscoverStateContainer; +}) => { + return combineLatest([from(logExplorerProfileStateService), stateContainer.appState.state$]).pipe( + map(([logExplorerState, appState]) => ({ + logExplorerState: logExplorerState.context, + appState, + })) + ); +}; diff --git a/x-pack/plugins/log_explorer/public/index.ts b/x-pack/plugins/log_explorer/public/index.ts index c145f6fd88864..00750926517e6 100644 --- a/x-pack/plugins/log_explorer/public/index.ts +++ b/x-pack/plugins/log_explorer/public/index.ts @@ -9,6 +9,7 @@ import type { PluginInitializerContext } from '@kbn/core/public'; import type { LogExplorerConfig } from '../common/plugin_config'; import { LogExplorerPlugin } from './plugin'; export type { LogExplorerPluginSetup, LogExplorerPluginStart } from './types'; +export type { LogExplorerStateContainer } from './components/log_explorer'; export function plugin(context: PluginInitializerContext) { return new LogExplorerPlugin(context); diff --git a/x-pack/plugins/observability_log_explorer/common/constants.ts b/x-pack/plugins/observability_log_explorer/common/constants.ts new file mode 100644 index 0000000000000..90cd311f05940 --- /dev/null +++ b/x-pack/plugins/observability_log_explorer/common/constants.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 const OBSERVABILITY_LOG_EXPLORER_APP_ID = 'observability-log-explorer'; diff --git a/x-pack/plugins/observability_log_explorer/common/translations.ts b/x-pack/plugins/observability_log_explorer/common/translations.ts index 5ec1940fa8dff..2abf660538260 100644 --- a/x-pack/plugins/observability_log_explorer/common/translations.ts +++ b/x-pack/plugins/observability_log_explorer/common/translations.ts @@ -21,3 +21,10 @@ export const betaBadgeDescription = i18n.translate( defaultMessage: 'This application is in beta and therefore subject to change.', } ); + +export const discoverLinkTitle = i18n.translate( + 'xpack.observabilityLogExplorer.discoverLinkTitle', + { + defaultMessage: 'Discover', + } +); diff --git a/x-pack/plugins/observability_log_explorer/kibana.jsonc b/x-pack/plugins/observability_log_explorer/kibana.jsonc index 35121b578c39c..529f879a56386 100644 --- a/x-pack/plugins/observability_log_explorer/kibana.jsonc +++ b/x-pack/plugins/observability_log_explorer/kibana.jsonc @@ -13,12 +13,13 @@ ], "requiredPlugins": [ "data", + "discover", "logExplorer", "observabilityShared" ], "optionalPlugins": [ "serverless" ], - "requiredBundles": [] + "requiredBundles": ["kibanaReact"] } } diff --git a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx index 7d6863e4eb45a..999ebdd3095bf 100644 --- a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx +++ b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx @@ -5,28 +5,29 @@ * 2.0. */ -import { AppMountParameters, CoreStart, ScopedHistory } from '@kbn/core/public'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { Route, Router, Routes } from '@kbn/shared-ux-router'; import React from 'react'; import ReactDOM from 'react-dom'; import { ObservablityLogExplorerMainRoute } from '../routes/main'; import { ObservabilityLogExplorerPluginStart, ObservabilityLogExplorerStartDeps } from '../types'; +import { useKibanaContextForPluginProvider } from '../utils/use_kibana'; export const renderObservabilityLogExplorer = ( core: CoreStart, pluginsStart: ObservabilityLogExplorerStartDeps, ownPluginStart: ObservabilityLogExplorerPluginStart, - { element, history }: AppMountParameters + appParams: AppMountParameters ) => { ReactDOM.render( , - element + appParams.element ); return () => { @@ -34,40 +35,51 @@ export const renderObservabilityLogExplorer = ( // observable in the search session service pluginsStart.data.search.session.clear(); - ReactDOM.unmountComponentAtNode(element); + ReactDOM.unmountComponentAtNode(appParams.element); }; }; export interface ObservabilityLogExplorerAppProps { + appParams: AppMountParameters; core: CoreStart; plugins: ObservabilityLogExplorerStartDeps; pluginStart: ObservabilityLogExplorerPluginStart; - history: ScopedHistory; } export const ObservabilityLogExplorerApp = ({ + appParams, core, - plugins: { logExplorer, observabilityShared, serverless }, + plugins, pluginStart, - history, -}: ObservabilityLogExplorerAppProps) => ( - - - - ( - { + const { logExplorer, observabilityShared, serverless } = plugins; + const KibanaContextProviderForPlugin = useKibanaContextForPluginProvider( + core, + plugins, + pluginStart + ); + + return ( + + + + + ( + + )} /> - )} - /> - - - -); + + + + + ); +}; diff --git a/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx b/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx new file mode 100644 index 0000000000000..0e8ec200da871 --- /dev/null +++ b/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx @@ -0,0 +1,105 @@ +/* + * 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 React from 'react'; +import deepEqual from 'fast-deep-equal'; +import useObservable from 'react-use/lib/useObservable'; +import { type BehaviorSubject, distinctUntilChanged } from 'rxjs'; +import { HeaderMenuPortal } from '@kbn/observability-shared-plugin/public'; +import { AppMountParameters } from '@kbn/core-application-browser'; +import { + EuiBetaBadge, + EuiHeaderLink, + EuiHeaderLinks, + EuiHeaderSection, + EuiHeaderSectionItem, + useEuiTheme, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import { LogExplorerStateContainer } from '@kbn/log-explorer-plugin/public'; +import { useKibanaContextForPlugin } from '../utils/use_kibana'; +import { betaBadgeDescription, betaBadgeTitle, discoverLinkTitle } from '../../common/translations'; + +interface LogExplorerTopNavMenuProps { + setHeaderActionMenu: AppMountParameters['setHeaderActionMenu']; + state$: BehaviorSubject; + theme$: AppMountParameters['theme$']; +} + +export const LogExplorerTopNavMenu = ({ + setHeaderActionMenu, + state$, + theme$, +}: LogExplorerTopNavMenuProps) => { + const { euiTheme } = useEuiTheme(); + + return ( + + + + + + + + + + + ); +}; + +const DiscoverLink = React.memo( + ({ state$ }: { state$: BehaviorSubject }) => { + const { + services: { discover }, + } = useKibanaContextForPlugin(); + + const { appState, logExplorerState } = useObservable( + state$.pipe( + distinctUntilChanged((prev, curr) => { + if (!prev.appState || !curr.appState) return false; + return deepEqual( + [ + prev.appState.columns, + prev.appState.filters, + prev.appState.index, + prev.appState.query, + ], + [curr.appState.columns, curr.appState.filters, curr.appState.index, curr.appState.query] + ); + }) + ), + { appState: {}, logExplorerState: {} } + ); + + const discoverLinkParams = { + columns: appState?.columns, + filters: appState?.filters, + query: appState?.query, + dataViewSpec: logExplorerState?.datasetSelection?.selection.dataset.toDataviewSpec(), + }; + + return ( + discover.locator?.navigate(discoverLinkParams)} + color="primary" + iconType="discoverApp" + data-test-subj="logExplorerDiscoverFallbackLink" + > + {discoverLinkTitle} + + ); + } +); diff --git a/x-pack/plugins/observability_log_explorer/public/plugin.ts b/x-pack/plugins/observability_log_explorer/public/plugin.ts index 6afb62235ba15..8ca79e4ec7be4 100644 --- a/x-pack/plugins/observability_log_explorer/public/plugin.ts +++ b/x-pack/plugins/observability_log_explorer/public/plugin.ts @@ -14,6 +14,7 @@ import { PluginInitializerContext, } from '@kbn/core/public'; import { type ObservabilityLogExplorerConfig } from '../common/plugin_config'; +import { OBSERVABILITY_LOG_EXPLORER_APP_ID } from '../common/constants'; import { logExplorerAppTitle } from '../common/translations'; import { renderObservabilityLogExplorer } from './applications/observability_log_explorer'; import type { @@ -37,7 +38,7 @@ export class ObservabilityLogExplorerPlugin _pluginsSetup: ObservabilityLogExplorerSetupDeps ) { core.application.register({ - id: 'observability-log-explorer', + id: OBSERVABILITY_LOG_EXPLORER_APP_ID, title: logExplorerAppTitle, category: DEFAULT_APP_CATEGORIES.observability, euiIconType: 'logoLogging', diff --git a/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx b/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx index 5e9b22fb1ad5d..7b224da830433 100644 --- a/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx +++ b/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx @@ -5,34 +5,45 @@ * 2.0. */ -import { CoreStart, ScopedHistory } from '@kbn/core/public'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; import { LogExplorerPluginStart } from '@kbn/log-explorer-plugin/public'; import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; import { ServerlessPluginStart } from '@kbn/serverless/public'; -import React from 'react'; +import React, { useState } from 'react'; +import { BehaviorSubject } from 'rxjs'; +import { LogExplorerTopNavMenu } from '../../components/log_explorer_top_nav_menu'; import { ObservabilityLogExplorerPageTemplate } from '../../components/page_template'; import { noBreadcrumbs, useBreadcrumbs } from '../../utils/breadcrumbs'; export interface ObservablityLogExplorerMainRouteProps { + appParams: AppMountParameters; core: CoreStart; - history: ScopedHistory; logExplorer: LogExplorerPluginStart; observabilityShared: ObservabilitySharedPluginStart; serverless?: ServerlessPluginStart; } export const ObservablityLogExplorerMainRoute = ({ + appParams: { history, setHeaderActionMenu, theme$ }, core, - history, logExplorer, observabilityShared, serverless, }: ObservablityLogExplorerMainRouteProps) => { useBreadcrumbs(noBreadcrumbs, core.chrome, serverless); + const [state$] = useState(() => new BehaviorSubject({})); + return ( - - - + <> + + + + + ); }; diff --git a/x-pack/plugins/observability_log_explorer/public/types.ts b/x-pack/plugins/observability_log_explorer/public/types.ts index f5e6526c502d9..e52ece9ca1624 100644 --- a/x-pack/plugins/observability_log_explorer/public/types.ts +++ b/x-pack/plugins/observability_log_explorer/public/types.ts @@ -6,6 +6,7 @@ */ import { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import { DiscoverStart } from '@kbn/discover-plugin/public'; import { LogExplorerPluginStart } from '@kbn/log-explorer-plugin/public'; import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; import { ServerlessPluginStart } from '@kbn/serverless/public'; @@ -22,6 +23,7 @@ export interface ObservabilityLogExplorerSetupDeps { export interface ObservabilityLogExplorerStartDeps { data: DataPublicPluginStart; + discover: DiscoverStart; logExplorer: LogExplorerPluginStart; observabilityShared: ObservabilitySharedPluginStart; serverless?: ServerlessPluginStart; diff --git a/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx b/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx index a8b575d5341dc..c1eaca45b7855 100644 --- a/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx +++ b/x-pack/plugins/observability_log_explorer/public/utils/breadcrumbs.tsx @@ -9,11 +9,7 @@ import { EuiBreadcrumb } from '@elastic/eui'; import type { ChromeStart } from '@kbn/core-chrome-browser'; import type { ServerlessPluginStart } from '@kbn/serverless/public'; import { useEffect } from 'react'; -import { - betaBadgeDescription, - betaBadgeTitle, - logExplorerAppTitle, -} from '../../common/translations'; +import { logExplorerAppTitle } from '../../common/translations'; export const useBreadcrumbs = ( breadcrumbs: EuiBreadcrumb[], @@ -40,10 +36,6 @@ export function setBreadcrumbs( ...breadcrumbs, ]); } - chromeService.setBadge({ - text: betaBadgeTitle, - tooltip: betaBadgeDescription, - }); } export const noBreadcrumbs: EuiBreadcrumb[] = []; diff --git a/x-pack/plugins/observability_log_explorer/tsconfig.json b/x-pack/plugins/observability_log_explorer/tsconfig.json index 5f94d15d30fea..ae9660b421359 100644 --- a/x-pack/plugins/observability_log_explorer/tsconfig.json +++ b/x-pack/plugins/observability_log_explorer/tsconfig.json @@ -22,6 +22,8 @@ "@kbn/serverless", "@kbn/core-chrome-browser", "@kbn/config-schema", + "@kbn/core-application-browser", + "@kbn/discover-plugin", ], "exclude": [ "target/**/*" diff --git a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts new file mode 100644 index 0000000000000..0831bec27b7ed --- /dev/null +++ b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts @@ -0,0 +1,76 @@ +/* + * 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 expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'timePicker']); + + describe('Header menu', () => { + before(async () => { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.load( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + await PageObjects.observabilityLogExplorer.navigateTo(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.unload( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + }); + + it('should inject the app header menu on the top navbar', async () => { + const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + expect(await headerMenu.isDisplayed()).to.be(true); + }); + + describe('Discover fallback link', () => { + it('should render a button link ', async () => { + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + expect(await discoverLink.isDisplayed()).to.be(true); + }); + + it('should navigate to discover keeping the current columns/filters/query/time/data view', async () => { + // Set timerange to specific values to match data and retrieve config + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + const timeConfig = await PageObjects.timePicker.getTimeConfig(); + + // Set query bar value + await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + discoverLink.click(); + + await PageObjects.discover.waitForDocTableLoadingComplete(); + + await retry.try(async () => { + expect(await PageObjects.discover.getCurrentlySelectedDataView()).to.eql( + 'All log datasets' + ); + }); + + await retry.try(async () => { + expect(await PageObjects.discover.getColumnHeaders()).to.eql(['@timestamp', 'message']); + }); + + await retry.try(async () => { + expect(await PageObjects.timePicker.getTimeConfig()).to.eql(timeConfig); + }); + + await retry.try(async () => { + expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + }); + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/observability_log_explorer/index.ts b/x-pack/test/functional/apps/observability_log_explorer/index.ts index 90a52663e34ce..aec38a6bb8308 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/index.ts +++ b/x-pack/test/functional/apps/observability_log_explorer/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./dataset_selection_state')); loadTestFile(require.resolve('./dataset_selector')); loadTestFile(require.resolve('./filter_controls')); + loadTestFile(require.resolve('./header_menu')); }); } diff --git a/x-pack/test/functional/page_objects/observability_log_explorer.ts b/x-pack/test/functional/page_objects/observability_log_explorer.ts index 33e85e06a16a9..7e4b83083ace0 100644 --- a/x-pack/test/functional/page_objects/observability_log_explorer.ts +++ b/x-pack/test/functional/page_objects/observability_log_explorer.ts @@ -314,5 +314,34 @@ export function ObservabilityLogExplorerPageObject({ expect(await promptTitle.getVisibleText()).to.be('No data streams found'); }, + + getHeaderMenu() { + return testSubjects.find('logExplorerHeaderMenu'); + }, + + getDiscoverFallbackLink() { + return testSubjects.find('logExplorerDiscoverFallbackLink'); + }, + + // Query Bar + getQueryBar() { + return testSubjects.find('queryInput'); + }, + + async getQueryBarValue() { + const queryBar = await testSubjects.find('queryInput'); + return queryBar.getAttribute('value'); + }, + + async typeInQueryBar(query: string) { + const queryBar = await this.getQueryBar(); + await queryBar.clearValueWithKeyboard(); + return queryBar.type(query); + }, + + async submitQuery(query: string) { + await this.typeInQueryBar(query); + await testSubjects.click('querySubmitButton'); + }, }; } diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts new file mode 100644 index 0000000000000..038e28a442c24 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts @@ -0,0 +1,76 @@ +/* + * 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 expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'timePicker']); + + describe('Header menu', () => { + before(async () => { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.load( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + await PageObjects.observabilityLogExplorer.navigateTo(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.unload( + 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + ); + }); + + it('should inject the app header menu on the top navbar', async () => { + const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + expect(await headerMenu.isDisplayed()).to.be(true); + }); + + describe('Discover fallback link', () => { + it('should render a button link ', async () => { + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + expect(await discoverLink.isDisplayed()).to.be(true); + }); + + it('should navigate to discover keeping the current columns/filters/query/time/data view', async () => { + // Set timerange to specific values to match data and retrieve config + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + const timeConfig = await PageObjects.timePicker.getTimeConfig(); + + // Set query bar value + await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + + const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + discoverLink.click(); + + await PageObjects.discover.waitForDocTableLoadingComplete(); + + await retry.try(async () => { + expect(await PageObjects.discover.getCurrentlySelectedDataView()).to.eql( + 'All log datasets' + ); + }); + + await retry.try(async () => { + expect(await PageObjects.discover.getColumnHeaders()).to.eql(['@timestamp', 'message']); + }); + + await retry.try(async () => { + expect(await PageObjects.timePicker.getTimeConfig()).to.eql(timeConfig); + }); + + await retry.try(async () => { + expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + }); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts index b0555b4447d27..77f89dad01f77 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./dataset_selection_state')); loadTestFile(require.resolve('./dataset_selector')); loadTestFile(require.resolve('./filter_controls')); + loadTestFile(require.resolve('./header_menu')); }); } From 9d5bb89b7cd3738482b9ea3247cd88077375ed3b Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Wed, 6 Sep 2023 12:52:28 +0200 Subject: [PATCH 14/25] [Logs onboarding] Adding Elastic-Api-Version to cy command (#165814) --- .../observability_onboarding/e2e/cypress/support/commands.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts b/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts index ea321f48a0bae..ddceaf3325bfa 100644 --- a/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts +++ b/x-pack/plugins/observability_onboarding/e2e/cypress/support/commands.ts @@ -119,6 +119,7 @@ Cypress.Commands.add('deleteIntegration', (integrationName: string) => { }, headers: { 'kbn-xsrf': 'e2e_test', + 'Elastic-Api-Version': '1', }, auth: { user: 'editor', pass: 'changeme' }, }); From 015b910de2e9048c63eb2c7cbaa83dcdbcddd4c4 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Wed, 6 Sep 2023 13:22:43 +0200 Subject: [PATCH 15/25] [Ops] Run kibana quality gate suites (#165346) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Sets up quality gate triggering in Kibana. The tests are mostly triggering external pipelines and relying on their results. Here's an example run: https://buildkite.com/elastic/kibana-tests/builds/28#job-018a69a6-c860-405e-ab2b-bce2aed07df3 According to [this doc](https://docs.google.com/document/d/15rx2Z-soL20An0nBUcXX0o_HHf1OU_IgrHXgz20NndI/edit) many of the quality gates are really required for the QA->Staging promotion step. Most of the tests are in the QA stage: - [fleet smoke tests](https://buildkite.com/elastic/fleet-smoke-tests) - ~~[QAF RAC load tests](https://buildkite.com/elastic/appex-qa-rac-alert-load)~~ Removed, see https://github.com/elastic/kibana/pull/165346#discussion_r1316822164 - [QAF serverless tests](https://buildkite.com/elastic/appex-qa-kibana-serverless-ftr-tests) - [control plane QA smoke tests](https://buildkite.com/elastic/ess-k8s-qa-e2e-tests-daily) - [security solution tests](.buildkite/scripts/pipelines/security_solution_quality_gate/pipeline.sh) + manual check for confirming manual tests - Manual confirmation 👍 Staging has: - [control plane staging smoke tests](https://buildkite.com/elastic/ess-k8s-staging-e2e-tests) - Manual confirmation 👍 Production has: - [control plane production smoke tests](https://buildkite.com/elastic/ess-k8s-production-e2e-tests) - Manual confirmation 👍 ### Quirks - ~~`SKIP_KIBANA_HOOKS=1` needs to be set from the triggering job~~ Split into https://github.com/elastic/kibana/pull/165597 - The pipeline can only be tested from the non-fork, `elastic/kibana` repo's branches (because buildkite doesn't see forks' branches) - Soft fails added, to not block the release pipeline in case we still need to adjust/work on some unstable tests Reference: https://docs.google.com/document/d/15rx2Z-soL20An0nBUcXX0o_HHf1OU_IgrHXgz20NndI/edit Depends on: #165009 Closes: https://github.com/elastic/kibana-operations/issues/10 --------- Co-authored-by: Tiago Costa Co-authored-by: Thomas Watson --- .../quality-gates/pipeline.kibana-tests.yaml | 2 +- .../pipeline.tests-production.yaml | 19 ++----- .../quality-gates/pipeline.tests-qa.yaml | 49 ++++++++++++------- .../quality-gates/pipeline.tests-staging.yaml | 17 ++----- 4 files changed, 40 insertions(+), 47 deletions(-) diff --git a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml index 0acdb66f8d5f2..467df501bc9ca 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.kibana-tests.yaml @@ -18,7 +18,7 @@ steps: - label: ":pipeline::grey_question::seedling: Trigger Kibana Tests for ${ENVIRONMENT}" env: QG_PIPELINE_LOCATION: ".buildkite/pipelines/quality-gates" - command: "make -C /agent run-environment-tests" + command: "make -C /agent run-environment-tests" # will trigger https://buildkite.com/elastic/kibana-tests agents: image: "docker.elastic.co/ci-agent-images/quality-gate-seedling:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml index 1c30a7f734df4..32878e2fc09cd 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml @@ -3,27 +3,18 @@ # A failure in this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Observability specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Security specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":rocket: Run cp e2e tests" - trigger: "ess-k8s-production-e2e-tests" + - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + trigger: "ess-k8s-production-e2e-tests" # https://buildkite.com/elastic/ess-k8s-production-e2e-tests build: - message: "${BUILDKITE_MESSAGE}" env: REGION_ID: aws-us-east-1 - NAME_PREFIX: ci_test_${SERVICE}-promotion_ + NAME_PREFIX: ci_test_kibana-promotion_ + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-production.yaml)" - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml index e03e986f65833..e7fbf640cf565 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml @@ -3,37 +3,48 @@ # this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::kibana::seedling: Trigger Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Kibana specific tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":pipeline::kibana::seedling: Trigger Kibana Serverless Tests for ${ENVIRONMENT}" + trigger: appex-qa-kibana-serverless-ftr-tests # https://buildkite.com/elastic/appex-qa-kibana-serverless-ftr-tests + soft_fail: true # Remove this before release or when tests stabilize + build: + env: + ENVIRONMENT: ${ENVIRONMENT} + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - - label: ":pipeline::fleet::seedling: Trigger Fleet Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Fleet specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - group: ":female-detective: Security Solution Tests" + key: "security" + steps: + - label: ":pipeline::female-detective::seedling: Trigger Security Solution quality gate script" + command: .buildkite/scripts/pipelines/security_solution_quality_gate/pipeline.sh - - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Security specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":judge::seedling: Trigger Manual Tests Phase" + command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" + env: + TEAM_CHANNEL: "#kibana-mission-control" + agents: + image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" - - label: ":pipeline::lock::seedling: Trigger Control Plane Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Control Plane specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" + - label: ":pipeline::ship::seedling: Trigger Fleet serverless smoke tests for ${ENVIRONMENT}" + trigger: fleet-smoke-tests # https://buildkite.com/elastic/fleet-smoke-tests + soft_fail: true # Remove this before release + build: + env: + ENVIRONMENT: ${ENVIRONMENT} + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - - label: ":rocket: Run cp e2e tests" - trigger: "ess-k8s-qa-e2e-tests-daily" + - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + trigger: "ess-k8s-qa-e2e-tests-daily" # https://buildkite.com/elastic/ess-k8s-qa-e2e-tests-daily build: - message: "${BUILDKITE_MESSAGE}" env: REGION_ID: aws-eu-west-1 NAME_PREFIX: ci_test_kibana-promotion_ + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-qa.yaml)" - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml index 83bfd0d27e34c..a376ff2ff1884 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-staging.yaml @@ -3,27 +3,18 @@ # this pipeline build will prevent further progression to the subsequent stage. steps: - - label: ":pipeline::fleet::seedling: Trigger Observability Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Observability specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":pipeline::lock::seedling: Trigger Security Kibana Tests for ${ENVIRONMENT}" - command: echo "replace me with Security specific Kibana tests" - agents: - image: "docker.elastic.co/ci-agent-images/basic-buildkite-agent:1688566364" - - - label: ":rocket: Run cp e2e tests" - trigger: "ess-k8s-staging-e2e-tests" + - label: ":pipeline::rocket::seedling: Trigger control-plane e2e tests" + trigger: "ess-k8s-staging-e2e-tests" # https://buildkite.com/elastic/ess-k8s-staging-e2e-tests build: - message: "${BUILDKITE_MESSAGE}" env: REGION_ID: aws-us-east-1 NAME_PREFIX: ci_test_kibana-promotion_ + message: "${BUILDKITE_MESSAGE} (triggered by pipeline.tests-staging.yaml)" - wait: ~ - label: ":judge::seedling: Trigger Manual Tests Phase" command: "make -C /agent trigger-manual-verification-phase" + if: build.branch == "main" agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.2" From a00e5e378800d0eda047b59228a48b816541e132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:29:42 +0100 Subject: [PATCH 16/25] [Profiling] fix bug when APM integration is no available (#165809) We've identified a buggy scenario when a user has a cluster prior 8.5 and wants to upgrade to >8.9. In this case, Profiling looks after the `elastic-cloud-apm` integration to see if Profiling had been enabled previously. But for the versions before 8.5 this integration did not exist under this name causing the set up to crash. I fixed the issue by catching the exception and returning that profiling is not enabled on the apm server, as it's not installed. Before: ``` Error: Saved object [ingest-package-policies/elastic-cloud-apm] not found at Function.createGenericNotFoundError (saved_objects_error_helpers.ts:258:28) at performGet (get.ts:80:36) at processTicksAndRejections (node:internal/process/task_queues:95:5) at SavedObjectsRepository.get (repository.ts:370:12) at SavedObjectsClient.get (saved_objects_client.ts:119:12) at PackagePolicyClientImpl.get (package_policy.ts:495:29) at validateProfilingInApmPackagePolicy (fleet_policies.ts:193:23) at async Promise.all (index 5) at setup.ts:99:31 at Router.handle (router.ts:212:30) at handler (router.ts:162:13) at exports.Manager.execute (/Users/caue.marcondes/elastic/other_kibana/node_modules/@hapi/hapi/lib ``` After: ``` { "has_setup": false, "has_data": false, "pre_8_9_1_data": false } ``` --------- Co-authored-by: Francesco Gualazzi --- .../server/lib/setup/fleet_policies.ts | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts b/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts index 8ffe13695cddb..ccba170b5fed9 100644 --- a/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts +++ b/x-pack/plugins/profiling/server/lib/setup/fleet_policies.ts @@ -189,17 +189,23 @@ export async function validateProfilingInApmPackagePolicy({ soClient, packagePolicyClient, }: ProfilingSetupOptions): Promise { - const apmPolicy = await getApmPolicy({ packagePolicyClient, soClient }); - - return { - policies: { - apm: { - profilingEnabled: !!( - apmPolicy && apmPolicy?.inputs[0].config?.['apm-server'].value?.profiling - ), + try { + const apmPolicy = await getApmPolicy({ packagePolicyClient, soClient }); + return { + policies: { + apm: { + profilingEnabled: !!( + apmPolicy && apmPolicy?.inputs[0].config?.['apm-server'].value?.profiling + ), + }, }, - }, - }; + }; + } catch (e) { + // In case apm integration is not available ignore the error and return as profiling is not enabled on the integration + return { + policies: { apm: { profilingEnabled: false } }, + }; + } } export async function removeProfilingFromApmPackagePolicy({ From 14876726f4f6edd57672644a322e55cd3d2afd6a Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Wed, 6 Sep 2023 13:30:51 +0200 Subject: [PATCH 17/25] [Infra UI] Normalise network and Disk rates for Hosts across time ranges (#165680) Closes #164152 ## Summary This PR normalizes the disk and network charts per second. The charts changed: Disk IOPS (read/write) diskiops Network (rx/tx) network Disk Throughput (read/write) diskth ## Testing 1. Go to hosts view and check network and disk charts (they should be normalized per second) 2. Open the host flyout and check network and disk charts (they should be normalized per second) https://github.com/elastic/kibana/assets/14139027/087cd044-b6cc-4612-8fca-391a96848365 --- .../common/visualizations/lens/formulas/host/disk_read_iops.ts | 1 + .../visualizations/lens/formulas/host/disk_read_throughput.ts | 1 + .../common/visualizations/lens/formulas/host/disk_write_iops.ts | 1 + .../visualizations/lens/formulas/host/disk_write_throughput.ts | 1 + .../infra/public/common/visualizations/lens/formulas/host/rx.ts | 1 + .../infra/public/common/visualizations/lens/formulas/host/tx.ts | 1 + 6 files changed, 6 insertions(+) diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts index 9b3f22164aacc..7af4e67339565 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts @@ -16,4 +16,5 @@ export const diskIORead: FormulaValueConfig = { decimals: 0, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts index 5043fb7f94fe1..f3f35cb54940f 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts @@ -16,4 +16,5 @@ export const diskReadThroughput: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts index 2831957ccb230..b3a8e62200c15 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts @@ -16,4 +16,5 @@ export const diskIOWrite: FormulaValueConfig = { decimals: 0, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts index 9f0f0937bff37..1ba401d011479 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts @@ -16,4 +16,5 @@ export const diskWriteThroughput: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts index 92162fad6010f..25f03ff811e76 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts @@ -17,4 +17,5 @@ export const rx: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts index 2b196103619a7..42608398e255e 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts @@ -17,4 +17,5 @@ export const tx: FormulaValueConfig = { decimals: 1, }, }, + timeScale: 's', }; From ba5a0496751c9008146dbec434212eea1a2d33f5 Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Wed, 6 Sep 2023 13:34:19 +0200 Subject: [PATCH 18/25] Fix flaky getSummarizedAlerts unit tests (#165801) Resolves: #165755, #163192, #165754, #165753, #165752, #165751, #165750, #165749, #165748, #163194, #163193, #163192 This PR fixes above flaky tests by fixing the `kibana.alert.start` filter in getExpectedQueryByTimeRange fixture --- .../alerting/server/alerts_client/alerts_client.test.ts | 4 ---- .../alerting/server/alerts_client/alerts_client_fixtures.ts | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts index 78b2e41431c22..2c0e6e0cbf03c 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts @@ -1363,10 +1363,6 @@ describe('Alerts Client', () => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/163192 - // FLAKY: https://github.com/elastic/kibana/issues/163193 - // FLAKY: https://github.com/elastic/kibana/issues/163194 - // FLAKY: https://github.com/elastic/kibana/issues/163195 describe('getSummarizedAlerts', () => { beforeEach(() => { clusterClient.search.mockReturnValue({ diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts index aa513588b83f8..4395df7217419 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client_fixtures.ts @@ -72,8 +72,8 @@ export const getParamsByTimeQuery: GetSummarizedAlertsParams = { ruleId: 'ruleId', spaceId: 'default', excludedAlertInstanceIds: [], - end: new Date(), - start: new Date(), + end: new Date('2023-09-06T00:01:00.000'), + start: new Date('2023-09-06T00:00:00.000'), }; export const getExpectedQueryByExecutionUuid = ({ @@ -258,7 +258,7 @@ export const getExpectedQueryByTimeRange = ({ { range: { 'kibana.alert.start': { - lt: end, + lt: start, }, }, }, From 782ab866b5e7eb59e0dd13419a4f92c0aab4149e Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Wed, 6 Sep 2023 07:38:44 -0400 Subject: [PATCH 19/25] [Security Solution] Unskip failing tests in Policy and Metadata (#165242) ## Summary Unskip tests that were skipped during a package release that was rolled back. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../management/cypress/e2e/mocked_data/policy_response.cy.ts | 3 +-- .../test/security_solution_endpoint_api_int/apis/metadata.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts index c8949b8c09077..cb846a62317fb 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/policy_response.cy.ts @@ -61,8 +61,7 @@ describe.skip('Endpoint Policy Response', () => { login(); }); - // TODO failing test skipped https://github.com/elastic/kibana/issues/162428 - describe.skip('from Fleet Agent Details page', () => { + describe('from Fleet Agent Details page', () => { it('should display policy response with errors', () => { navigateToFleetAgentDetails(endpointMetadata.agent.id); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts index 4eb92d2dee08b..b92a26e785127 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts @@ -44,8 +44,7 @@ export default function ({ getService }: FtrProviderContext) { const endpointTestResources = getService('endpointTestResources'); describe('test metadata apis', () => { - // FLAKY: https://github.com/elastic/kibana/issues/151854 - describe.skip('list endpoints GET route', () => { + describe('list endpoints GET route', () => { const numberOfHostsInFixture = 2; let agent1Timestamp: number; let agent2Timestamp: number; From b335c3abbcd776a5d9d6b4e042e2165478cc42ae Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Wed, 6 Sep 2023 14:33:05 +0200 Subject: [PATCH 20/25] [Search] Extract connectors to package (#165590) ## Summary This moves connectors functions to a shared package so Serverless Search and Enterprise Search can both use it. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + .i18nrc.json | 34 ++- config/serverless.es.yml | 7 +- package.json | 1 + packages/kbn-search-connectors/README.md | 3 + .../kbn-search-connectors}/connectors.ts | 53 ++-- packages/kbn-search-connectors/index.ts | 19 ++ packages/kbn-search-connectors/jest.config.js | 13 + packages/kbn-search-connectors/kibana.jsonc | 5 + .../lib/cancel_syncs.test.ts | 34 ++- .../kbn-search-connectors/lib/cancel_syncs.ts | 19 +- .../lib/create_connector.ts | 40 +++ .../lib}/create_connector_document.test.ts | 111 +------- .../lib}/create_connector_document.ts | 45 +--- .../lib}/delete_connector.test.ts | 24 +- .../lib/delete_connector.ts | 21 ++ .../lib/fetch_connector_index_names.ts | 29 ++ .../lib}/fetch_connectors.test.ts | 62 ++--- .../lib}/fetch_connectors.ts | 48 ++-- .../lib}/fetch_sync_jobs.test.ts | 26 +- .../lib}/fetch_sync_jobs.ts | 23 +- packages/kbn-search-connectors/lib/index.ts | 23 ++ .../lib/start_sync.test.ts | 242 +++++++++++++++++ .../kbn-search-connectors/lib/start_sync.ts | 91 +++++++ .../update_connector_configuration.test.ts | 26 +- .../lib}/update_connector_configuration.ts | 26 +- .../update_connector_name_and_description.ts | 21 +- .../lib}/update_connector_scheduling.test.ts | 36 ++- .../lib}/update_connector_scheduling.ts | 21 +- .../lib}/update_connector_service_type.ts | 21 +- .../lib/update_connector_status.ts | 41 +++ .../lib/update_filtering.ts | 18 +- .../lib/update_filtering_draft.ts | 18 +- .../lib/update_native.ts | 28 ++ packages/kbn-search-connectors/package.json | 6 + packages/kbn-search-connectors/tsconfig.json | 23 ++ .../types/connectors.ts | 5 +- packages/kbn-search-connectors/types/index.ts | 12 + .../types}/native_connectors.ts | 248 ++++++++---------- .../types/optimistic_concurrency.ts | 13 + .../kbn-search-connectors/types/pagination.ts | 22 ++ .../utils/fetch_with_pagination.test.ts | 125 +++++++++ .../utils/fetch_with_pagination.ts | 61 +++++ .../utils/identify_exceptions.test.ts | 82 ++++++ .../utils/identify_exceptions.ts | 50 ++++ packages/kbn-search-connectors/utils/index.ts | 9 + .../utils/is_category_entry.ts | 29 ++ .../utils/is_not_nullish.ts | 11 + tsconfig.base.json | 2 + .../common/connectors/is_category_entry.ts | 5 +- .../enterprise_search/common/constants.ts | 3 +- .../enterprise_search/common/types/crawler.ts | 2 +- .../enterprise_search/common/types/indices.ts | 3 +- .../__mocks__/pipeline.mock.ts | 2 +- .../__mocks__/search_indices.mock.ts | 7 +- .../__mocks__/sync_job.mock.ts | 8 +- .../__mocks__/view_index.mock.ts | 6 +- .../connector/fetch_sync_jobs_api_logic.ts | 3 +- .../get_default_pipeline_api_logic.ts | 2 +- ...pdate_connector_configuration_api_logic.ts | 3 +- .../update_connector_filtering_api_logic.ts | 3 +- ...ate_connector_filtering_draft_api_logic.ts | 3 +- ...onnector_name_and_description_api_logic.ts | 3 +- .../update_connector_scheduling_api_logic.ts | 3 +- .../update_default_pipeline_api_logic.ts | 2 +- .../connector/update_pipeline_api_logic.ts | 3 +- .../fetch_index_pipeline_parameters.ts | 3 +- .../components/curl_request/curl_request.tsx | 3 +- .../connector/connector_configuration.tsx | 3 +- .../connector_configuration_field.tsx | 3 +- .../connector_configuration_form_items.tsx | 2 +- .../connector_configuration_logic.test.ts | 2 +- .../connector_configuration_logic.ts | 5 +- .../connector_name_and_description_logic.ts | 3 +- .../connector/connector_scheduling.tsx | 2 +- .../connector_cron_editor.tsx | 3 +- .../connector_scheduling/full_content.tsx | 2 +- .../connector_scheduling_logic.test.ts | 2 +- .../connector/connector_scheduling_logic.ts | 3 +- .../search_index/connector/constants.ts | 2 +- .../native_connector_configuration_config.tsx | 2 +- .../sync_rules/connector_filtering_logic.tsx | 7 +- .../sync_rules/edit_sync_rules_flyout.tsx | 3 +- .../sync_rules/editable_basic_rules_table.tsx | 7 +- .../sync_rules/sync_rules_callouts.tsx | 2 +- .../search_index/connector/types.ts | 2 +- .../automatic_crawl_scheduler_logic.ts | 2 +- ...custom_settings_flyout_crawl_scheduler.tsx | 3 +- ...ustom_settings_flyout_multi_crawl_logic.ts | 3 +- .../crawler_configuration_logic.ts | 3 +- .../search_index/index_view_logic.test.ts | 2 +- .../search_index/index_view_logic.ts | 8 +- .../components/search_index/overview.logic.ts | 3 +- .../default_pipeline_item.tsx | 3 +- .../ingest_pipeline_flyout.tsx | 3 +- .../pipelines/pipeline_settings_form.tsx | 3 +- .../search_index/pipelines/pipelines_logic.ts | 3 +- .../sync_jobs/events_panel.test.tsx | 2 +- .../search_index/sync_jobs/events_panel.tsx | 3 +- .../sync_jobs/filtering_panel.test.tsx | 6 +- .../sync_jobs/filtering_panel.tsx | 2 +- .../search_index/sync_jobs/pipeline_panel.tsx | 2 +- .../sync_jobs/sync_callouts.test.tsx | 2 +- .../search_index/sync_jobs/sync_callouts.tsx | 3 +- .../sync_jobs/sync_jobs_history_table.tsx | 3 +- .../sync_jobs/sync_jobs_view_logic.test.ts | 7 +- .../sync_jobs/sync_jobs_view_logic.ts | 3 +- .../search_indices/indices_logic.test.ts | 3 +- .../search_indices/indices_table.tsx | 2 +- .../components/settings/settings_logic.ts | 3 +- .../filtering_rules_table.tsx | 6 +- .../utils/filtering_rule_helpers.ts | 2 +- .../utils/has_configured_configuration.ts | 3 +- .../utils/indices.test.ts | 3 +- .../utils/indices.ts | 3 +- .../utils/sync_status_to_text.test.ts | 2 +- .../utils/sync_status_to_text.ts | 2 +- .../enterprise_search_cron_editor.tsx | 2 +- .../server/api/connectors_service.ts | 54 ---- .../plugins/enterprise_search/server/index.ts | 6 +- .../lib/connectors/add_connector.test.ts | 234 ++++------------- .../server/lib/connectors/add_connector.ts | 87 +++--- .../server/lib/connectors/delete_connector.ts | 22 -- .../connectors/fetch_connector_index_names.ts | 28 -- .../lib/connectors/put_update_native.ts | 27 -- .../server/lib/connectors/start_sync.test.ts | 52 ++-- .../server/lib/connectors/start_sync.ts | 59 ++--- .../lib/connectors/update_connector_status.ts | 40 --- .../fetch_crawler_multiple_schedules.ts | 3 +- .../server/lib/crawler/fetch_crawlers.ts | 3 +- .../server/lib/crawler/post_connector.test.ts | 3 +- .../server/lib/crawler/post_connector.ts | 7 +- .../lib/crawler/put_html_extraction.test.ts | 3 +- .../server/lib/crawler/put_html_extraction.ts | 3 +- .../server/lib/indices/fetch_index.test.ts | 30 +-- .../server/lib/indices/fetch_index.ts | 13 +- .../lib/indices/generate_api_key.test.ts | 2 +- .../server/lib/indices/generate_api_key.ts | 4 +- .../lib/pipelines/get_default_pipeline.ts | 4 +- .../lib/pipelines/get_index_pipeline.ts | 12 +- .../lib/pipelines/revert_custom_pipeline.ts | 6 +- .../lib/pipelines/update_default_pipeline.ts | 3 +- .../server/lib/pipelines/update_pipeline.ts | 4 +- .../server/lib/stats/get_sync_jobs.ts | 9 +- .../enterprise_search/server/plugin.ts | 33 +-- .../routes/enterprise_search/connectors.ts | 67 +++-- .../enterprise_search/crawler/crawler.ts | 26 +- .../routes/enterprise_search/indices.ts | 20 +- .../server/utils/search_result_provider.ts | 6 +- .../plugins/enterprise_search/tsconfig.json | 3 +- x-pack/plugins/serverless_search/kibana.jsonc | 11 +- .../components/connectors_overview.tsx | 3 +- .../application/components/overview.tsx | 2 +- .../serverless_search/server/plugin.ts | 9 +- .../server/routes/connectors_routes.ts | 15 +- .../plugins/serverless_search/server/types.ts | 2 - .../plugins/serverless_search/tsconfig.json | 2 +- .../translations/translations/fr-FR.json | 205 +++++---------- .../translations/translations/ja-JP.json | 205 +++++---------- .../translations/translations/zh-CN.json | 205 +++++---------- yarn.lock | 4 + 161 files changed, 2016 insertions(+), 1670 deletions(-) create mode 100644 packages/kbn-search-connectors/README.md rename {x-pack/plugins/enterprise_search/common/connectors => packages/kbn-search-connectors}/connectors.ts (70%) create mode 100644 packages/kbn-search-connectors/index.ts create mode 100644 packages/kbn-search-connectors/jest.config.js create mode 100644 packages/kbn-search-connectors/kibana.jsonc rename x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts => packages/kbn-search-connectors/lib/cancel_syncs.test.ts (67%) rename x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts => packages/kbn-search-connectors/lib/cancel_syncs.ts (76%) create mode 100644 packages/kbn-search-connectors/lib/create_connector.ts rename {x-pack/plugins/enterprise_search/server/utils => packages/kbn-search-connectors/lib}/create_connector_document.test.ts (50%) rename {x-pack/plugins/enterprise_search/server/utils => packages/kbn-search-connectors/lib}/create_connector_document.ts (71%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/delete_connector.test.ts (54%) create mode 100644 packages/kbn-search-connectors/lib/delete_connector.ts create mode 100644 packages/kbn-search-connectors/lib/fetch_connector_index_names.ts rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_connectors.test.ts (70%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_connectors.ts (55%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_sync_jobs.test.ts (82%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/fetch_sync_jobs.ts (71%) create mode 100644 packages/kbn-search-connectors/lib/index.ts create mode 100644 packages/kbn-search-connectors/lib/start_sync.test.ts create mode 100644 packages/kbn-search-connectors/lib/start_sync.ts rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_configuration.test.ts (69%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_configuration.ts (71%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_name_and_description.ts (52%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_scheduling.test.ts (76%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_scheduling.ts (50%) rename {x-pack/plugins/enterprise_search/server/lib/connectors => packages/kbn-search-connectors/lib}/update_connector_service_type.ts (51%) create mode 100644 packages/kbn-search-connectors/lib/update_connector_status.ts rename x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts => packages/kbn-search-connectors/lib/update_filtering.ts (80%) rename x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts => packages/kbn-search-connectors/lib/update_filtering_draft.ts (80%) create mode 100644 packages/kbn-search-connectors/lib/update_native.ts create mode 100644 packages/kbn-search-connectors/package.json create mode 100644 packages/kbn-search-connectors/tsconfig.json rename {x-pack/plugins/enterprise_search/common => packages/kbn-search-connectors}/types/connectors.ts (97%) create mode 100644 packages/kbn-search-connectors/types/index.ts rename {x-pack/plugins/enterprise_search/common/connectors => packages/kbn-search-connectors/types}/native_connectors.ts (83%) create mode 100644 packages/kbn-search-connectors/types/optimistic_concurrency.ts create mode 100644 packages/kbn-search-connectors/types/pagination.ts create mode 100644 packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts create mode 100644 packages/kbn-search-connectors/utils/fetch_with_pagination.ts create mode 100644 packages/kbn-search-connectors/utils/identify_exceptions.test.ts create mode 100644 packages/kbn-search-connectors/utils/identify_exceptions.ts create mode 100644 packages/kbn-search-connectors/utils/index.ts create mode 100644 packages/kbn-search-connectors/utils/is_category_entry.ts create mode 100644 packages/kbn-search-connectors/utils/is_not_nullish.ts delete mode 100644 x-pack/plugins/enterprise_search/server/api/connectors_service.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts delete mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cd4fe15e8827c..b88935d43b3c1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -596,6 +596,7 @@ src/plugins/screenshot_mode @elastic/appex-sharedux x-pack/examples/screenshotting_example @elastic/appex-sharedux x-pack/plugins/screenshotting @elastic/kibana-reporting-services packages/kbn-search-api-panels @elastic/enterprise-search-frontend +packages/kbn-search-connectors @elastic/enterprise-search-frontend examples/search_examples @elastic/kibana-data-discovery packages/kbn-search-response-warnings @elastic/kibana-data-discovery x-pack/plugins/searchprofiler @elastic/platform-deployment-management diff --git a/.i18nrc.json b/.i18nrc.json index eb098a7011a15..373f28219a8cb 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -6,12 +6,17 @@ "apmOss": "src/plugins/apm_oss", "autocomplete": "packages/kbn-securitysolution-autocomplete/src", "bfetch": "src/plugins/bfetch", - "cases": ["packages/kbn-cases-components"], + "cases": [ + "packages/kbn-cases-components" + ], "cellActions": "packages/kbn-cell-actions", "charts": "src/plugins/charts", "console": "src/plugins/console", "contentManagement": "packages/content-management", - "core": ["src/core", "packages/core"], + "core": [ + "src/core", + "packages/core" + ], "customIntegrations": "src/plugins/custom_integrations", "dashboard": "src/plugins/dashboard", "domDragDrop": "packages/kbn-dom-drag-drop", @@ -21,7 +26,10 @@ "dataViews": "src/plugins/data_views", "defaultNavigation": "packages/default-nav", "devTools": "src/plugins/dev_tools", - "discover": ["src/plugins/discover", "packages/kbn-discover-utils"], + "discover": [ + "src/plugins/discover", + "packages/kbn-discover-utils" + ], "savedSearch": "src/plugins/saved_search", "embeddableApi": "src/plugins/embeddable", "embeddableExamples": "examples/embeddable_examples", @@ -89,6 +97,7 @@ "savedObjects": "src/plugins/saved_objects", "savedObjectsFinder": "src/plugins/saved_objects_finder", "savedObjectsManagement": "src/plugins/saved_objects_management", + "searchConnectors": "packages/kbn-search-connectors", "server": "src/legacy/server", "share": "src/plugins/share", "sharedUXPackages": "packages/shared-ux", @@ -100,9 +109,17 @@ "languageDocumentationPopover": "packages/kbn-language-documentation-popover/src", "textBasedLanguages": "src/plugins/text_based_languages", "statusPage": "src/legacy/core_plugins/status_page", - "telemetry": ["src/plugins/telemetry", "src/plugins/telemetry_management_section"], - "timelion": ["src/plugins/vis_types/timelion"], - "uiActions": ["src/plugins/ui_actions", "packages/kbn-ui-actions-browser"], + "telemetry": [ + "src/plugins/telemetry", + "src/plugins/telemetry_management_section" + ], + "timelion": [ + "src/plugins/vis_types/timelion" + ], + "uiActions": [ + "src/plugins/ui_actions", + "packages/kbn-ui-actions-browser" + ], "uiActionsEnhanced": "src/plugins/ui_actions_enhanced", "uiActionsExamples": "examples/ui_action_examples", "usageCollection": "src/plugins/usage_collection", @@ -122,7 +139,10 @@ "visTypeXy": "src/plugins/vis_types/xy", "visualizations": "src/plugins/visualizations", "visualizationUiComponents": "packages/kbn-visualization-ui-components", - "unifiedDocViewer": ["src/plugins/unified_doc_viewer", "packages/kbn-unified-doc-viewer"], + "unifiedDocViewer": [ + "src/plugins/unified_doc_viewer", + "packages/kbn-unified-doc-viewer" + ], "unifiedSearch": "src/plugins/unified_search", "unifiedFieldList": "packages/kbn-unified-field-list", "unifiedHistogram": "src/plugins/unified_histogram", diff --git a/config/serverless.es.yml b/config/serverless.es.yml index 7a1da782855bd..fe5575c5fee1e 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -9,12 +9,7 @@ xpack.observability.enabled: false xpack.securitySolution.enabled: false xpack.serverless.observability.enabled: false xpack.uptime.enabled: false -enterpriseSearch.enabled: true -enterpriseSearch.canDeployEntSearch: false -enterpriseSearch.hasConnectors: true -enterpriseSearch.hasNativeConnectors: false -enterpriseSearch.hasWebCrawler: false -enterpriseSearch.ui.enabled: false +enterpriseSearch.enabled: false monitoring.ui.enabled: false xpack.fleet.enabled: false diff --git a/package.json b/package.json index 80d1b5b6faf59..20507f57e6134 100644 --- a/package.json +++ b/package.json @@ -602,6 +602,7 @@ "@kbn/screenshotting-example-plugin": "link:x-pack/examples/screenshotting_example", "@kbn/screenshotting-plugin": "link:x-pack/plugins/screenshotting", "@kbn/search-api-panels": "link:packages/kbn-search-api-panels", + "@kbn/search-connectors": "link:packages/kbn-search-connectors", "@kbn/search-examples-plugin": "link:examples/search_examples", "@kbn/search-response-warnings": "link:packages/kbn-search-response-warnings", "@kbn/searchprofiler-plugin": "link:x-pack/plugins/searchprofiler", diff --git a/packages/kbn-search-connectors/README.md b/packages/kbn-search-connectors/README.md new file mode 100644 index 0000000000000..5233a782a964f --- /dev/null +++ b/packages/kbn-search-connectors/README.md @@ -0,0 +1,3 @@ +# @kbn/search-connectors + +Empty package generated by @kbn/generate diff --git a/x-pack/plugins/enterprise_search/common/connectors/connectors.ts b/packages/kbn-search-connectors/connectors.ts similarity index 70% rename from x-pack/plugins/enterprise_search/common/connectors/connectors.ts rename to packages/kbn-search-connectors/connectors.ts index 1fc6c6e7f5c77..119de69a0c5c0 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/connectors.ts +++ b/packages/kbn-search-connectors/connectors.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 { i18n } from '@kbn/i18n'; @@ -17,13 +18,17 @@ export interface ConnectorServerSideDefinition { serviceType: string; } +/* The consumer should host these icons and transform the iconPath into something usable + * Enterprise Search and Serverless Search do this right now + */ + export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ { iconPath: 'azure_blob_storage.svg', isBeta: true, isNative: true, keywords: ['cloud', 'azure', 'blob', 's3', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.azureBlob.name', { defaultMessage: 'Azure Blob Storage', }), serviceType: 'azure_blob_storage', @@ -33,7 +38,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['confluence', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.confluence.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.confluence.name', { defaultMessage: 'Confluence Cloud & Server', }), serviceType: 'confluence', @@ -44,7 +49,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['dropbox', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.dropbox.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.dropbox.name', { defaultMessage: 'Dropbox', }), serviceType: 'dropbox', @@ -54,7 +59,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['jira', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.jira.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.jira.name', { defaultMessage: 'Jira Cloud & Server', }), serviceType: 'jira', @@ -64,7 +69,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['github', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.github.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.github.name', { defaultMessage: 'GitHub & GitHub Enterprise Server', }), serviceType: 'github', @@ -74,7 +79,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['google', 'cloud', 'blob', 's3', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.googleCloud.name', { defaultMessage: 'Google Cloud Storage', }), serviceType: 'google_cloud_storage', @@ -84,7 +89,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['google', 'drive', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.googleDrive.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.googleDrive.name', { defaultMessage: 'Google Drive', }), serviceType: 'google_drive', @@ -94,7 +99,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['mongo', 'mongodb', 'database', 'nosql', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.mongodb.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.mongodb.name', { defaultMessage: 'MongoDB', }), serviceType: 'mongodb', @@ -104,7 +109,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['mysql', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.mysql.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.mysql.name', { defaultMessage: 'MySQL', }), serviceType: 'mysql', @@ -114,7 +119,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: true, keywords: ['mssql', 'microsoft', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.microsoftSQL.name', { defaultMessage: 'Microsoft SQL', }), serviceType: 'mssql', @@ -124,7 +129,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: false, isNative: true, keywords: ['network', 'drive', 'file', 'directory', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.networkDrive.name', { defaultMessage: 'Network drive', }), serviceType: 'network_drive', @@ -134,7 +139,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: true, keywords: ['postgresql', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.postgresql.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.postgresql.name', { defaultMessage: 'PostgreSQL', }), serviceType: 'postgresql', @@ -145,7 +150,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: false, keywords: ['salesforce', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.salesforce.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.salesforce.name', { defaultMessage: 'Salesforce', }), serviceType: 'salesforce', @@ -156,7 +161,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['servicenow', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.serviceNow.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.serviceNow.name', { defaultMessage: 'ServiceNow', }), serviceType: 'servicenow', @@ -167,7 +172,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: true, isTechPreview: false, keywords: ['sharepoint', 'office365', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.sharepoint_online.name', { defaultMessage: 'Sharepoint Online', }), serviceType: 'sharepoint_online', @@ -178,7 +183,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: true, keywords: ['google', 'gmail', 'connector', 'mail'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.gmail.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.gmail.name', { defaultMessage: 'Gmail', }), serviceType: 'gmail', @@ -188,7 +193,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['oracle', 'sql', 'database', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.oracle.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.oracle.name', { defaultMessage: 'Oracle', }), serviceType: 'oracle', @@ -198,7 +203,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['network', 'drive', 'file', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.oneDrive.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.oneDrive.name', { defaultMessage: 'OneDrive', }), serviceType: 'onedrive', @@ -208,7 +213,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['s3', 'cloud', 'amazon', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.s3.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.s3.name', { defaultMessage: 'S3', }), serviceType: 's3', @@ -219,7 +224,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: true, keywords: ['slack', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.slack.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.slack.name', { defaultMessage: 'Slack', }), serviceType: 'slack', @@ -230,7 +235,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isNative: false, isTechPreview: false, keywords: ['sharepoint', 'cloud', 'connector'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.sharepointServer.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.sharepointServer.name', { defaultMessage: 'Sharepoint Server', }), serviceType: 'sharepoint_server', @@ -240,7 +245,7 @@ export const CONNECTOR_DEFINITIONS: ConnectorServerSideDefinition[] = [ isBeta: true, isNative: false, keywords: ['custom', 'connector', 'code'], - name: i18n.translate('xpack.enterpriseSearch.content.nativeConnectors.customConnector.name', { + name: i18n.translate('searchConnectors.content.nativeConnectors.customConnector.name', { defaultMessage: 'Customized connector', }), serviceType: '', diff --git a/packages/kbn-search-connectors/index.ts b/packages/kbn-search-connectors/index.ts new file mode 100644 index 0000000000000..f232081031fb6 --- /dev/null +++ b/packages/kbn-search-connectors/index.ts @@ -0,0 +1,19 @@ +/* + * 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 const CONNECTORS_INDEX = '.elastic-connectors'; +export const CURRENT_CONNECTORS_INDEX = '.elastic-connectors-v1'; +export const CONNECTORS_JOBS_INDEX = '.elastic-connectors-sync-jobs'; +export const CURRENT_CONNECTORS_JOB_INDEX = '.elastic-connectors-sync-jobs-v1'; +export const CONNECTORS_VERSION = 1; +export const CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX = '.search-acl-filter-'; + +export * from './connectors'; +export * from './lib'; +export * from './types'; +export * from './utils'; diff --git a/packages/kbn-search-connectors/jest.config.js b/packages/kbn-search-connectors/jest.config.js new file mode 100644 index 0000000000000..99c132b768bfe --- /dev/null +++ b/packages/kbn-search-connectors/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-search-connectors'], +}; diff --git a/packages/kbn-search-connectors/kibana.jsonc b/packages/kbn-search-connectors/kibana.jsonc new file mode 100644 index 0000000000000..4c1162ed0300b --- /dev/null +++ b/packages/kbn-search-connectors/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/search-connectors", + "owner": "@elastic/enterprise-search-frontend" +} diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts b/packages/kbn-search-connectors/lib/cancel_syncs.test.ts similarity index 67% rename from x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts rename to packages/kbn-search-connectors/lib/cancel_syncs.test.ts index 0c528b6b8290e..05c2f5fcd529d 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.test.ts +++ b/packages/kbn-search-connectors/lib/cancel_syncs.test.ts @@ -1,24 +1,22 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '../..'; -import { SyncStatus } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '..'; +import { SyncStatus } from '../types/connectors'; -import { cancelSyncs } from './post_cancel_syncs'; +import { cancelSyncs } from './cancel_syncs'; -describe('addConnector lib function', () => { +describe('cancelSync lib function', () => { const mockClient = { - asCurrentUser: { - update: jest.fn(), - updateByQuery: jest.fn(), - }, - asInternalUser: {}, + update: jest.fn(), + updateByQuery: jest.fn(), }; beforeEach(() => { @@ -28,13 +26,13 @@ describe('addConnector lib function', () => { }); it('should call updateByQuery to cancel syncs', async () => { - mockClient.asCurrentUser.updateByQuery.mockImplementation(() => ({ _id: 'fakeId' })); + mockClient.updateByQuery.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - cancelSyncs(mockClient as unknown as IScopedClusterClient, 'connectorId') + cancelSyncs(mockClient as unknown as ElasticsearchClient, 'connectorId') ).resolves.toEqual(undefined); - expect(mockClient.asCurrentUser.updateByQuery).toHaveBeenCalledTimes(2); - expect(mockClient.asCurrentUser.updateByQuery).toHaveBeenCalledWith({ + expect(mockClient.updateByQuery).toHaveBeenCalledTimes(2); + expect(mockClient.updateByQuery).toHaveBeenCalledWith({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -60,7 +58,7 @@ ctx._source['canceled_at'] = '${new Date(Date.now()).toISOString()}'; ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - expect(mockClient.asCurrentUser.updateByQuery).toHaveBeenCalledWith({ + expect(mockClient.updateByQuery).toHaveBeenCalledWith({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -84,7 +82,7 @@ ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, ctx._source['cancelation_requested_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - await expect(mockClient.asCurrentUser.update).toHaveBeenCalledWith({ + await expect(mockClient.update).toHaveBeenCalledWith({ doc: { last_sync_status: SyncStatus.CANCELED, sync_now: false }, id: 'connectorId', index: CONNECTORS_INDEX, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts b/packages/kbn-search-connectors/lib/cancel_syncs.ts similarity index 76% rename from x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts rename to packages/kbn-search-connectors/lib/cancel_syncs.ts index ef5327d4db374..2a331e19d4cb7 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/post_cancel_syncs.ts +++ b/packages/kbn-search-connectors/lib/cancel_syncs.ts @@ -1,20 +1,21 @@ /* * 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 { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '../..'; -import { SyncStatus } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '..'; +import { SyncStatus } from '../types/connectors'; export const cancelSyncs = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string ): Promise => { - await client.asCurrentUser.updateByQuery({ + await client.updateByQuery({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -40,7 +41,7 @@ ctx._source['canceled_at'] = '${new Date(Date.now()).toISOString()}'; ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - await client.asCurrentUser.updateByQuery({ + await client.updateByQuery({ index: CONNECTORS_JOBS_INDEX, query: { bool: { @@ -64,7 +65,7 @@ ctx._source['completed_at'] = '${new Date(Date.now()).toISOString()}';`, ctx._source['cancelation_requested_at'] = '${new Date(Date.now()).toISOString()}';`, }, }); - await client.asCurrentUser.update({ + await client.update({ doc: { last_sync_status: SyncStatus.CANCELED, sync_now: false }, id: connectorId, index: CONNECTORS_INDEX, diff --git a/packages/kbn-search-connectors/lib/create_connector.ts b/packages/kbn-search-connectors/lib/create_connector.ts new file mode 100644 index 0000000000000..d4ff1230727c8 --- /dev/null +++ b/packages/kbn-search-connectors/lib/create_connector.ts @@ -0,0 +1,40 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; +import { CURRENT_CONNECTORS_INDEX } from '..'; + +import { Connector, ConnectorConfiguration, IngestPipelineParams } from '../types/connectors'; +import { createConnectorDocument } from './create_connector_document'; + +export const createConnector = async ( + client: ElasticsearchClient, + input: { + configuration?: ConnectorConfiguration; + features?: Connector['features']; + indexName: string | null; + isNative: boolean; + language: string | null; + name?: string; + pipeline: IngestPipelineParams; + serviceType?: string | null; + } +): Promise => { + const document = createConnectorDocument({ + ...input, + serviceType: input.serviceType || null, + }); + + const result = await client.index({ + document, + index: CURRENT_CONNECTORS_INDEX, + refresh: 'wait_for', + }); + + return { ...document, id: result._id }; +}; diff --git a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.test.ts b/packages/kbn-search-connectors/lib/create_connector_document.test.ts similarity index 50% rename from x-pack/plugins/enterprise_search/server/utils/create_connector_document.test.ts rename to packages/kbn-search-connectors/lib/create_connector_document.test.ts index 458d223ce24b4..aa1c54c3c90ea 100644 --- a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.test.ts +++ b/packages/kbn-search-connectors/lib/create_connector_document.test.ts @@ -1,11 +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; 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 { ConnectorStatus } from '../../common/types/connectors'; +import { ConnectorStatus } from '../types/connectors'; import { createConnectorDocument } from './create_connector_document'; @@ -16,6 +17,7 @@ describe('createConnectorDocument', () => { indexName: 'indexName', isNative: false, language: 'fr', + name: 'indexName-name', pipeline: { extract_binary_content: true, name: 'ent-search-generic-ingestion', @@ -94,108 +96,7 @@ describe('createConnectorDocument', () => { last_sync_scheduled_at: null, last_sync_status: null, last_synced: null, - name: 'indexName', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - scheduling: { - access_control: { enabled: false, interval: '0 0 0 * * ?' }, - full: { enabled: false, interval: '0 0 0 * * ?' }, - incremental: { enabled: false, interval: '0 0 0 * * ?' }, - }, - service_type: null, - status: ConnectorStatus.CREATED, - sync_now: false, - }); - }); - it('should remove search- from name', () => { - expect( - createConnectorDocument({ - indexName: 'search-indexName', - isNative: false, - language: 'fr', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - serviceType: null, - }) - ).toEqual({ - api_key_id: null, - configuration: {}, - custom_scheduling: {}, - description: null, - error: null, - features: null, - filtering: [ - { - active: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - domain: 'DEFAULT', - draft: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - }, - ], - index_name: 'search-indexName', - is_native: false, - language: 'fr', - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_incremental_sync_scheduled_at: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - name: 'indexName', + name: 'indexName-name', pipeline: { extract_binary_content: true, name: 'ent-search-generic-ingestion', diff --git a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.ts b/packages/kbn-search-connectors/lib/create_connector_document.ts similarity index 71% rename from x-pack/plugins/enterprise_search/server/utils/create_connector_document.ts rename to packages/kbn-search-connectors/lib/create_connector_document.ts index 8b3883eac5be9..c5654e9a2436a 100644 --- a/x-pack/plugins/enterprise_search/server/utils/create_connector_document.ts +++ b/packages/kbn-search-connectors/lib/create_connector_document.ts @@ -1,24 +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; 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 { NATIVE_CONNECTOR_DEFINITIONS } from '../../common/connectors/native_connectors'; -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../common/constants'; - import { + Connector, + ConnectorConfiguration, ConnectorDocument, ConnectorStatus, FilteringPolicy, FilteringRuleRule, FilteringValidationState, IngestPipelineParams, -} from '../../common/types/connectors'; -import { stripSearchPrefix } from '../../common/utils/strip_search_prefix'; +} from '../types/connectors'; export function createConnectorDocument({ + configuration, + features, indexName, isNative, name, @@ -26,6 +27,8 @@ export function createConnectorDocument({ serviceType, language, }: { + configuration?: ConnectorConfiguration; + features?: Connector['features']; indexName: string | null; isNative: boolean; language: string | null; @@ -34,35 +37,14 @@ export function createConnectorDocument({ serviceType: string | null; }): ConnectorDocument { const currentTimestamp = new Date().toISOString(); - const nativeConnector = - isNative && serviceType ? NATIVE_CONNECTOR_DEFINITIONS[serviceType] : undefined; - - if ( - isNative && - serviceType && - !nativeConnector && - serviceType !== ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE - ) { - throw new Error(`Could not find connector definition for service type ${serviceType}`); - } - - const nativeFields = nativeConnector - ? { - configuration: nativeConnector.configuration, - features: nativeConnector.features, - name: nativeConnector.name, - service_type: serviceType, - status: ConnectorStatus.NEEDS_CONFIGURATION, - } - : {}; return { api_key_id: null, - configuration: {}, + configuration: configuration || {}, custom_scheduling: {}, description: null, error: null, - features: null, + features: features || null, filtering: [ { active: { @@ -126,7 +108,7 @@ export function createConnectorDocument({ last_sync_scheduled_at: null, last_sync_status: null, last_synced: null, - name: name || stripSearchPrefix(indexName ?? ''), + name: name ?? '', pipeline, scheduling: { access_control: { enabled: false, interval: '0 0 0 * * ?' }, @@ -136,6 +118,5 @@ export function createConnectorDocument({ service_type: serviceType || null, status: ConnectorStatus.CREATED, sync_now: false, - ...nativeFields, }; } diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.test.ts b/packages/kbn-search-connectors/lib/delete_connector.test.ts similarity index 54% rename from x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.test.ts rename to packages/kbn-search-connectors/lib/delete_connector.test.ts index 0ce9e53632835..55dfdcbeae92b 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.test.ts +++ b/packages/kbn-search-connectors/lib/delete_connector.test.ts @@ -1,27 +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; 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; import { deleteConnectorById } from './delete_connector'; -jest.mock('./post_cancel_syncs', () => ({ +jest.mock('./cancel_syncs', () => ({ cancelSyncs: jest.fn(), })); -import { cancelSyncs } from './post_cancel_syncs'; +import { cancelSyncs } from './cancel_syncs'; describe('deleteConnector lib function', () => { const mockClient = { - asCurrentUser: { - delete: jest.fn(), - }, - asInternalUser: {}, + delete: jest.fn(), }; beforeEach(() => { @@ -30,11 +28,11 @@ describe('deleteConnector lib function', () => { }); it('should delete connector and cancel syncs', async () => { - mockClient.asCurrentUser.delete.mockImplementation(() => true); + mockClient.delete.mockImplementation(() => true); - await deleteConnectorById(mockClient as unknown as IScopedClusterClient, 'connectorId'); + await deleteConnectorById(mockClient as unknown as ElasticsearchClient, 'connectorId'); expect(cancelSyncs as jest.Mock).toHaveBeenCalledWith(mockClient, 'connectorId'); - expect(mockClient.asCurrentUser.delete).toHaveBeenCalledWith({ + expect(mockClient.delete).toHaveBeenCalledWith({ id: 'connectorId', index: CONNECTORS_INDEX, refresh: 'wait_for', diff --git a/packages/kbn-search-connectors/lib/delete_connector.ts b/packages/kbn-search-connectors/lib/delete_connector.ts new file mode 100644 index 0000000000000..c64edfd3d906a --- /dev/null +++ b/packages/kbn-search-connectors/lib/delete_connector.ts @@ -0,0 +1,21 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { CONNECTORS_INDEX } from '..'; +import { cancelSyncs } from './cancel_syncs'; + +export const deleteConnectorById = async (client: ElasticsearchClient, id: string) => { + // timeout function to mitigate race condition with external connector running job and recreating index + const timeout = async () => { + const promise = new Promise((resolve) => setTimeout(resolve, 500)); + return promise; + }; + await Promise.all([cancelSyncs(client, id), timeout]); + return await client.delete({ id, index: CONNECTORS_INDEX, refresh: 'wait_for' }); +}; diff --git a/packages/kbn-search-connectors/lib/fetch_connector_index_names.ts b/packages/kbn-search-connectors/lib/fetch_connector_index_names.ts new file mode 100644 index 0000000000000..bed99173c859b --- /dev/null +++ b/packages/kbn-search-connectors/lib/fetch_connector_index_names.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { ElasticsearchClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX } from '..'; +import { isIndexNotFoundException } from '../utils/identify_exceptions'; + +export async function fetchConnectorIndexNames(client: ElasticsearchClient): Promise { + try { + const result = await client.search({ + _source: false, + fields: [{ field: 'index_name' }], + index: CONNECTORS_INDEX, + size: 10000, + }); + return (result?.hits.hits ?? []).map((field) => field.fields?.index_name[0] ?? ''); + } catch (error) { + if (isIndexNotFoundException(error)) { + return []; + } + throw error; + } +} diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.test.ts b/packages/kbn-search-connectors/lib/fetch_connectors.test.ts similarity index 70% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.test.ts rename to packages/kbn-search-connectors/lib/fetch_connectors.test.ts index 4196aad469d65..e1bb872710594 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.test.ts +++ b/packages/kbn-search-connectors/lib/fetch_connectors.test.ts @@ -1,11 +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; 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 { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; import { fetchConnectorById, fetchConnectorByIndexName, fetchConnectors } from './fetch_connectors'; @@ -31,11 +32,8 @@ const otherError = { describe('fetchConnectors lib', () => { const mockClient = { - asCurrentUser: { - get: jest.fn(), - search: jest.fn(), - }, - asInternalUser: {}, + get: jest.fn(), + search: jest.fn(), }; beforeEach(() => { @@ -43,7 +41,7 @@ describe('fetchConnectors lib', () => { }); describe('fetch connector by id', () => { it('should fetch connector by id', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => + mockClient.get.mockImplementationOnce(() => Promise.resolve({ _id: 'connectorId', _primary_term: 'primaryTerm', @@ -56,23 +54,23 @@ describe('fetchConnectors lib', () => { seqNo: 5, value: { id: 'connectorId', source: 'source' }, }); - expect(mockClient.asCurrentUser.get).toHaveBeenCalledWith({ + expect(mockClient.get).toHaveBeenCalledWith({ id: 'id', index: CONNECTORS_INDEX, }); }); it('should return undefined on index not found error', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); + mockClient.get.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); await expect(fetchConnectorById(mockClient as any, 'id')).resolves.toEqual(undefined); - expect(mockClient.asCurrentUser.get).toHaveBeenCalledWith({ + expect(mockClient.get).toHaveBeenCalledWith({ id: 'id', index: CONNECTORS_INDEX, }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => Promise.reject(otherError)); + mockClient.get.mockImplementationOnce(() => Promise.reject(otherError)); await expect(fetchConnectorById(mockClient as any, 'id')).rejects.toEqual(otherError); - expect(mockClient.asCurrentUser.get).toHaveBeenCalledWith({ + expect(mockClient.get).toHaveBeenCalledWith({ id: 'id', index: CONNECTORS_INDEX, }); @@ -80,17 +78,17 @@ describe('fetchConnectors lib', () => { }); describe('fetch connector by name', () => { it('should fetch connector by index name', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.resolve({ hits: { hits: [{ _id: 'connectorId', _source: { source: 'source' } }] } }) ); - mockClient.asCurrentUser.get.mockImplementationOnce(() => + mockClient.get.mockImplementationOnce(() => Promise.resolve({ _id: 'connectorId', _source: { source: 'source' } }) ); await expect(fetchConnectorByIndexName(mockClient as any, 'id')).resolves.toEqual({ id: 'connectorId', source: 'source', }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, query: { term: { @@ -100,11 +98,9 @@ describe('fetchConnectors lib', () => { }); }); it('should return undefined on index not found error', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => - Promise.reject(indexNotFoundError) - ); + mockClient.search.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); await expect(fetchConnectorByIndexName(mockClient as any, 'id')).resolves.toEqual(undefined); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, query: { term: { @@ -114,9 +110,9 @@ describe('fetchConnectors lib', () => { }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => Promise.reject(otherError)); + mockClient.search.mockImplementationOnce(() => Promise.reject(otherError)); await expect(fetchConnectorByIndexName(mockClient as any, 'id')).rejects.toEqual(otherError); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, query: { term: { @@ -128,7 +124,7 @@ describe('fetchConnectors lib', () => { }); describe('fetch connectors', () => { it('should fetch connectors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.resolve({ hits: { hits: [{ _id: 'connectorId', _source: { source: 'source' } }] } }) ); await expect(fetchConnectors(mockClient as any)).resolves.toEqual([ @@ -137,7 +133,7 @@ describe('fetchConnectors lib', () => { source: 'source', }, ]); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, @@ -153,7 +149,7 @@ describe('fetchConnectors lib', () => { let count = 0; - mockClient.asCurrentUser.search.mockImplementation(() => { + mockClient.search.mockImplementation(() => { count += 1; if (count === 3) { return Promise.resolve({ hits: { hits: [] } }); @@ -164,20 +160,18 @@ describe('fetchConnectors lib', () => { ...resultHits, ...resultHits, ]); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, size: 1000, }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledTimes(3); + expect(mockClient.search).toHaveBeenCalledTimes(3); }); it('should return empty array on index not found error', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => - Promise.reject(indexNotFoundError) - ); + mockClient.search.mockImplementationOnce(() => Promise.reject(indexNotFoundError)); await expect(fetchConnectors(mockClient as any)).resolves.toEqual([]); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, @@ -185,9 +179,9 @@ describe('fetchConnectors lib', () => { }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => Promise.reject(otherError)); + mockClient.search.mockImplementationOnce(() => Promise.reject(otherError)); await expect(fetchConnectors(mockClient as any)).rejects.toEqual(otherError); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: CONNECTORS_INDEX, query: { match_all: {} }, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.ts b/packages/kbn-search-connectors/lib/fetch_connectors.ts similarity index 55% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.ts rename to packages/kbn-search-connectors/lib/fetch_connectors.ts index c1d8b834d0e15..7d9463228c0a9 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connectors.ts +++ b/packages/kbn-search-connectors/lib/fetch_connectors.ts @@ -1,25 +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. */ -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; -import { IScopedClusterClient } from '@kbn/core/server'; +import { QueryDslQueryContainer, SearchHit } from '@elastic/elasticsearch/lib/api/types'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector, ConnectorDocument } from '../../../common/types/connectors'; -import { OptimisticConcurrency } from '../../../common/types/util_types'; -import { isIndexNotFoundException } from '../../utils/identify_exceptions'; -import { fetchAll } from '../fetch_all'; +import { OptimisticConcurrency } from '../types/optimistic_concurrency'; +import { Connector, ConnectorDocument } from '../types/connectors'; + +import { isIndexNotFoundException } from '../utils/identify_exceptions'; +import { CONNECTORS_INDEX } from '..'; +import { isNotNullish } from '../utils/is_not_nullish'; export const fetchConnectorById = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string ): Promise | undefined> => { try { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); @@ -39,11 +41,11 @@ export const fetchConnectorById = async ( }; export const fetchConnectorByIndexName = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, indexName: string ): Promise => { try { - const connectorResult = await client.asCurrentUser.search({ + const connectorResult = await client.search({ index: CONNECTORS_INDEX, query: { term: { index_name: indexName } }, }); @@ -62,7 +64,7 @@ export const fetchConnectorByIndexName = async ( }; export const fetchConnectors = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, indexNames?: string[] ): Promise => { const query: QueryDslQueryContainer = indexNames @@ -70,7 +72,23 @@ export const fetchConnectors = async ( : { match_all: {} }; try { - return await fetchAll(client, CONNECTORS_INDEX, query); + let hits: Array> = []; + let accumulator: Array> = []; + + do { + const connectorResult = await client.search({ + from: accumulator.length, + index: CONNECTORS_INDEX, + query, + size: 1000, + }); + hits = connectorResult.hits.hits; + accumulator = accumulator.concat(hits); + } while (hits.length >= 1000); + + return accumulator + .map(({ _source, _id }) => (_source ? { ..._source, id: _id } : undefined)) + .filter(isNotNullish); } catch (error) { if (isIndexNotFoundException(error)) { return []; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.test.ts b/packages/kbn-search-connectors/lib/fetch_sync_jobs.test.ts similarity index 82% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.test.ts rename to packages/kbn-search-connectors/lib/fetch_sync_jobs.test.ts index 651849e803c41..debfedbcfeb67 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.test.ts +++ b/packages/kbn-search-connectors/lib/fetch_sync_jobs.test.ts @@ -1,19 +1,17 @@ /* * 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 { fetchSyncJobsByConnectorId } from './fetch_sync_jobs'; describe('fetchSyncJobs lib', () => { const mockClient = { - asCurrentUser: { - get: jest.fn(), - search: jest.fn(), - }, - asInternalUser: {}, + get: jest.fn(), + search: jest.fn(), }; beforeEach(() => { @@ -21,7 +19,7 @@ describe('fetchSyncJobs lib', () => { }); describe('fetch sync jobs by connector id', () => { it('should fetch sync jobs by connector id', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.resolve({ hits: { hits: ['result1', 'result2'] }, total: 2 }) ); await expect(fetchSyncJobsByConnectorId(mockClient as any, 'id', 0, 10)).resolves.toEqual({ @@ -35,7 +33,7 @@ describe('fetchSyncJobs lib', () => { }, data: [], }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: '.elastic-connectors-sync-jobs', query: { @@ -63,10 +61,10 @@ describe('fetchSyncJobs lib', () => { }, data: [], }); - expect(mockClient.asCurrentUser.search).not.toHaveBeenCalled(); + expect(mockClient.search).not.toHaveBeenCalled(); }); it('should return empty array on index not found error', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.reject({ meta: { body: { @@ -88,7 +86,7 @@ describe('fetchSyncJobs lib', () => { }, data: [], }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: '.elastic-connectors-sync-jobs', query: { @@ -105,7 +103,7 @@ describe('fetchSyncJobs lib', () => { }); }); it('should throw on other errors', async () => { - mockClient.asCurrentUser.search.mockImplementationOnce(() => + mockClient.search.mockImplementationOnce(() => Promise.reject({ meta: { body: { @@ -125,7 +123,7 @@ describe('fetchSyncJobs lib', () => { }, }, }); - expect(mockClient.asCurrentUser.search).toHaveBeenCalledWith({ + expect(mockClient.search).toHaveBeenCalledWith({ from: 0, index: '.elastic-connectors-sync-jobs', query: { diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.ts b/packages/kbn-search-connectors/lib/fetch_sync_jobs.ts similarity index 71% rename from x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.ts rename to packages/kbn-search-connectors/lib/fetch_sync_jobs.ts index 43f373712f753..1a56103702d83 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_sync_jobs.ts +++ b/packages/kbn-search-connectors/lib/fetch_sync_jobs.ts @@ -1,19 +1,20 @@ /* * 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 { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_JOBS_INDEX } from '../..'; -import { ConnectorSyncJob, SyncJobType } from '../../../common/types/connectors'; -import { Paginate } from '../../../common/types/pagination'; -import { isNotNullish } from '../../../common/utils/is_not_nullish'; +import { CONNECTORS_JOBS_INDEX } from '..'; +import { ConnectorSyncJob, SyncJobType } from '../types/connectors'; +import { Paginate } from '../types/pagination'; +import { isNotNullish } from '../utils/is_not_nullish'; -import { fetchWithPagination } from '../../utils/fetch_with_pagination'; -import { isIndexNotFoundException } from '../../utils/identify_exceptions'; +import { fetchWithPagination } from '../utils/fetch_with_pagination'; +import { isIndexNotFoundException } from '../utils/identify_exceptions'; const defaultResult: Paginate = { _meta: { @@ -28,7 +29,7 @@ const defaultResult: Paginate = { }; export const fetchSyncJobsByConnectorId = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, from: number, size: number, @@ -63,7 +64,7 @@ export const fetchSyncJobsByConnectorId = async ( }; const result = await fetchWithPagination( async () => - await client.asCurrentUser.search({ + await client.search({ from, index: CONNECTORS_JOBS_INDEX, query, diff --git a/packages/kbn-search-connectors/lib/index.ts b/packages/kbn-search-connectors/lib/index.ts new file mode 100644 index 0000000000000..4fd4706268327 --- /dev/null +++ b/packages/kbn-search-connectors/lib/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. + */ + +export * from './cancel_syncs'; +export * from './create_connector'; +export * from './create_connector_document'; +export * from './delete_connector'; +export * from './fetch_connectors'; +export * from './fetch_sync_jobs'; +export * from './update_filtering'; +export * from './update_filtering_draft'; +export * from './update_native'; +export * from './start_sync'; +export * from './update_connector_configuration'; +export * from './update_connector_name_and_description'; +export * from './update_connector_scheduling'; +export * from './update_connector_service_type'; +export * from './update_connector_status'; diff --git a/packages/kbn-search-connectors/lib/start_sync.test.ts b/packages/kbn-search-connectors/lib/start_sync.test.ts new file mode 100644 index 0000000000000..c32b82bc7ba7f --- /dev/null +++ b/packages/kbn-search-connectors/lib/start_sync.test.ts @@ -0,0 +1,242 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '..'; +import { SyncJobType, SyncStatus, TriggerMethod } from '../types/connectors'; +import { CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX } from '..'; + +import { startConnectorSync } from './start_sync'; + +describe('startSync lib function', () => { + const mockClient = { + get: jest.fn(), + index: jest.fn(), + update: jest.fn(), + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should start a full sync', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({ + _id: 'connectorId', + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + index_name: 'index_name', + language: null, + last_access_control_sync_error: null, + last_access_control_sync_scheduled_at: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + jobType: SyncJobType.FULL, + }) + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.index).toHaveBeenCalledWith({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration: {}, + filtering: null, + id: 'connectorId', + index_name: 'index_name', + language: null, + pipeline: null, + service_type: null, + }, + created_at: expect.any(String), + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: SyncJobType.FULL, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + }); + + it('should not create index if there is no connector', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({}); + }); + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + jobType: SyncJobType.FULL, + }) + ).rejects.toEqual(new Error('resource_not_found')); + expect(mockClient.index).not.toHaveBeenCalled(); + }); + + it('should start an incremental sync', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({ + _id: 'connectorId', + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + filtering: [], + index_name: 'index_name', + language: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + jobType: SyncJobType.INCREMENTAL, + }) + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.index).toHaveBeenCalledWith({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration: {}, + filtering: null, + id: 'connectorId', + index_name: 'index_name', + language: null, + pipeline: null, + service_type: null, + }, + created_at: expect.any(String), + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: SyncJobType.INCREMENTAL, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + }); + + it('should start an access control sync', async () => { + mockClient.get.mockImplementation(() => { + return Promise.resolve({ + _id: 'connectorId', + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + custom_scheduling: {}, + error: null, + index_name: 'search-index_name', + language: null, + last_access_control_sync_status: null, + last_seen: null, + last_sync_error: null, + last_sync_scheduled_at: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as ElasticsearchClient, { + connectorId: 'connectorId', + targetIndexName: '.search-acl-filter-index_name', + jobType: SyncJobType.ACCESS_CONTROL, + }) + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.index).toHaveBeenCalledWith({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration: {}, + filtering: null, + id: 'connectorId', + index_name: `${CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX}index_name`, + language: null, + pipeline: null, + service_type: null, + }, + created_at: expect.any(String), + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: SyncJobType.ACCESS_CONTROL, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + }); +}); diff --git a/packages/kbn-search-connectors/lib/start_sync.ts b/packages/kbn-search-connectors/lib/start_sync.ts new file mode 100644 index 0000000000000..878901953e6a1 --- /dev/null +++ b/packages/kbn-search-connectors/lib/start_sync.ts @@ -0,0 +1,91 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '..'; +import { + ConnectorConfiguration, + ConnectorDocument, + SyncJobType, + SyncStatus, + TriggerMethod, +} from '../types/connectors'; +import { isConfigEntry } from '../utils/is_category_entry'; + +export const startConnectorSync = async ( + client: ElasticsearchClient, + { + connectorId, + jobType, + targetIndexName, + }: { + connectorId: string; + jobType?: SyncJobType; + targetIndexName?: string; + } +) => { + const connectorResult = await client.get({ + id: connectorId, + index: CONNECTORS_INDEX, + }); + const connector = connectorResult._source; + if (connector) { + const configuration = Object.entries(connector.configuration).reduce( + (acc, [key, configEntry]) => { + if (isConfigEntry(configEntry)) { + acc[key] = configEntry; + } + return acc; + }, + {} as ConnectorConfiguration + ); + const { + filtering, + index_name: connectorIndexName, + language, + pipeline, + service_type: serviceType, + } = connector; + + const now = new Date().toISOString(); + + return await client.index({ + document: { + cancelation_requested_at: null, + canceled_at: null, + completed_at: null, + connector: { + configuration, + filtering: filtering ? filtering[0]?.active ?? null : null, + id: connectorId, + index_name: targetIndexName || connectorIndexName, + language, + pipeline: pipeline ?? null, + service_type: serviceType, + }, + created_at: now, + deleted_document_count: 0, + error: null, + indexed_document_count: 0, + indexed_document_volume: 0, + job_type: jobType, + last_seen: null, + metadata: {}, + started_at: null, + status: SyncStatus.PENDING, + total_document_count: null, + trigger_method: TriggerMethod.ON_DEMAND, + worker_hostname: null, + }, + index: CURRENT_CONNECTORS_JOB_INDEX, + }); + } else { + throw new Error('resource_not_found'); + } +}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.test.ts b/packages/kbn-search-connectors/lib/update_connector_configuration.test.ts similarity index 69% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.test.ts rename to packages/kbn-search-connectors/lib/update_connector_configuration.test.ts index 0b7e328e9ebb4..fd1e014037863 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.test.ts +++ b/packages/kbn-search-connectors/lib/update_connector_configuration.test.ts @@ -1,26 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 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 { IScopedClusterClient } from '@kbn/core/server'; - -import { CONNECTORS_INDEX } from '../..'; -import { ConnectorStatus } from '../../../common/types/connectors'; +import { ElasticsearchClient } from '@kbn/core/server'; +import { CONNECTORS_INDEX } from '..'; import { fetchConnectorById } from './fetch_connectors'; +import { ConnectorStatus } from '../types/connectors'; + import { updateConnectorConfiguration } from './update_connector_configuration'; jest.mock('./fetch_connectors', () => ({ fetchConnectorById: jest.fn() })); describe('updateConnectorConfiguration lib function', () => { const mockClient = { - asCurrentUser: { - update: jest.fn(), - }, - asInternalUser: {}, + update: jest.fn(), }; beforeEach(() => { @@ -38,11 +36,11 @@ describe('updateConnectorConfiguration lib function', () => { it('should update configuration', async () => { await expect( - updateConnectorConfiguration(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorConfiguration(mockClient as unknown as ElasticsearchClient, 'connectorId', { test: 'newValue', }) ).resolves.toEqual({ test: { label: 'haha', value: 'newValue' } }); - expect(mockClient.asCurrentUser.update).toHaveBeenCalledWith({ + expect(mockClient.update).toHaveBeenCalledWith({ doc: { configuration: { test: { label: 'haha', value: 'newValue' } }, status: ConnectorStatus.CONFIGURED, @@ -58,10 +56,10 @@ describe('updateConnectorConfiguration lib function', () => { (fetchConnectorById as jest.Mock).mockImplementation(() => undefined); await expect( - updateConnectorConfiguration(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorConfiguration(mockClient as unknown as ElasticsearchClient, 'connectorId', { test: 'newValue', }) ).rejects.toEqual(new Error('Could not find connector')); - expect(mockClient.asCurrentUser.update).not.toHaveBeenCalled(); + expect(mockClient.update).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.ts b/packages/kbn-search-connectors/lib/update_connector_configuration.ts similarity index 71% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.ts rename to packages/kbn-search-connectors/lib/update_connector_configuration.ts index 7c68a0a08dee7..dfb43af53db44 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_configuration.ts +++ b/packages/kbn-search-connectors/lib/update_connector_configuration.ts @@ -1,28 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; - -import { isConfigEntry } from '../../../common/connectors/is_category_entry'; -import { - ConnectorConfiguration, - ConnectorDocument, - ConnectorStatus, -} from '../../../common/types/connectors'; -import { isNotNullish } from '../../../common/utils/is_not_nullish'; +import { CONNECTORS_INDEX } from '..'; import { fetchConnectorById } from './fetch_connectors'; +import { ConnectorConfiguration, ConnectorDocument, ConnectorStatus } from '../types/connectors'; +import { isConfigEntry } from '../utils/is_category_entry'; +import { isNotNullish } from '../utils/is_not_nullish'; export const updateConnectorConfiguration = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, configuration: Record ) => { @@ -49,7 +45,7 @@ export const updateConnectorConfiguration = async ( const { key, ...config } = curr; return { ...prev, [curr.key]: config }; }, {}); - await client.asCurrentUser.update({ + await client.update({ doc: { configuration: updatedConfig, status }, id: connectorId, if_primary_term: connectorResult?.primaryTerm, @@ -59,7 +55,7 @@ export const updateConnectorConfiguration = async ( return updatedConfig; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.configuration.error', { + i18n.translate('searchConnectors.server.connectors.configuration.error', { defaultMessage: 'Could not find connector', }) ); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_name_and_description.ts b/packages/kbn-search-connectors/lib/update_connector_name_and_description.ts similarity index 52% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_name_and_description.ts rename to packages/kbn-search-connectors/lib/update_connector_name_and_description.ts index caca94ee2713a..6323387c4259f 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_name_and_description.ts +++ b/packages/kbn-search-connectors/lib/update_connector_name_and_description.ts @@ -1,38 +1,39 @@ /* * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; -import { Connector, ConnectorDocument } from '../../../common/types/connectors'; +import { Connector, ConnectorDocument } from '../types/connectors'; export const updateConnectorNameAndDescription = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, connectorUpdates: Partial> ) => { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); const connector = connectorResult._source; if (connector) { - const result = await client.asCurrentUser.index({ + const result = await client.index({ document: { ...connector, ...connectorUpdates }, id: connectorId, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); return result; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.serviceType.error', { + i18n.translate('searchConnectors.server.connectors.serviceType.error', { defaultMessage: 'Could not find document', }) ); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts b/packages/kbn-search-connectors/lib/update_connector_scheduling.test.ts similarity index 76% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts rename to packages/kbn-search-connectors/lib/update_connector_scheduling.test.ts index c314e101624fb..618522831118d 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts +++ b/packages/kbn-search-connectors/lib/update_connector_scheduling.test.ts @@ -1,26 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; import { updateConnectorScheduling } from './update_connector_scheduling'; describe('addConnector lib function', () => { const mockClient = { - asCurrentUser: { - get: jest.fn(), - index: jest.fn(), - indices: { - refresh: jest.fn(), - }, + get: jest.fn(), + index: jest.fn(), + indices: { + refresh: jest.fn(), }, - asInternalUser: {}, }; beforeEach(() => { @@ -28,7 +26,7 @@ describe('addConnector lib function', () => { }); it('should update connector scheduling', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.get.mockImplementationOnce(() => { return Promise.resolve({ _source: { api_key_id: null, @@ -57,10 +55,10 @@ describe('addConnector lib function', () => { index: CONNECTORS_INDEX, }); }); - mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + mockClient.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - updateConnectorScheduling(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorScheduling(mockClient as unknown as ElasticsearchClient, 'connectorId', { access_control: { enabled: false, interval: '* * * * *' }, full: { enabled: true, @@ -69,7 +67,7 @@ describe('addConnector lib function', () => { incremental: { enabled: false, interval: '* * * * *' }, }) ).resolves.toEqual({ _id: 'fakeId' }); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ + expect(mockClient.index).toHaveBeenCalledWith({ document: { api_key_id: null, configuration: {}, @@ -97,17 +95,17 @@ describe('addConnector lib function', () => { id: 'connectorId', index: CONNECTORS_INDEX, }); - expect(mockClient.asCurrentUser.indices.refresh).toHaveBeenCalledWith({ + expect(mockClient.indices.refresh).toHaveBeenCalledWith({ index: CONNECTORS_INDEX, }); }); it('should not index document if there is no connector', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.get.mockImplementationOnce(() => { return Promise.resolve({}); }); await expect( - updateConnectorScheduling(mockClient as unknown as IScopedClusterClient, 'connectorId', { + updateConnectorScheduling(mockClient as unknown as ElasticsearchClient, 'connectorId', { access_control: { enabled: false, interval: '* * * * *' }, full: { enabled: true, @@ -116,6 +114,6 @@ describe('addConnector lib function', () => { incremental: { enabled: false, interval: '* * * * *' }, }) ).rejects.toEqual(new Error('Could not find document')); - expect(mockClient.asCurrentUser.index).not.toHaveBeenCalled(); + expect(mockClient.index).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts b/packages/kbn-search-connectors/lib/update_connector_scheduling.ts similarity index 50% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts rename to packages/kbn-search-connectors/lib/update_connector_scheduling.ts index b6da7f138421d..a0693dc3cd6f6 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts +++ b/packages/kbn-search-connectors/lib/update_connector_scheduling.ts @@ -1,38 +1,39 @@ /* * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; -import { ConnectorDocument, SchedulingConfiguraton } from '../../../common/types/connectors'; +import { ConnectorDocument, SchedulingConfiguraton } from '../types/connectors'; export const updateConnectorScheduling = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, scheduling: SchedulingConfiguraton ) => { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); const connector = connectorResult._source; if (connector) { - const result = await client.asCurrentUser.index({ + const result = await client.index({ document: { ...connector, scheduling }, id: connectorId, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); return result; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.scheduling.error', { + i18n.translate('searchConnectors.server.connectors.scheduling.error', { defaultMessage: 'Could not find document', }) ); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_service_type.ts b/packages/kbn-search-connectors/lib/update_connector_service_type.ts similarity index 51% rename from x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_service_type.ts rename to packages/kbn-search-connectors/lib/update_connector_service_type.ts index a88950c48e99f..27732e17c8c2a 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_service_type.ts +++ b/packages/kbn-search-connectors/lib/update_connector_service_type.ts @@ -1,38 +1,39 @@ /* * 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 { IScopedClusterClient } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; -import { ConnectorDocument } from '../../../common/types/connectors'; +import { ConnectorDocument } from '../types/connectors'; export const updateConnectorServiceType = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, serviceType: string ) => { - const connectorResult = await client.asCurrentUser.get({ + const connectorResult = await client.get({ id: connectorId, index: CONNECTORS_INDEX, }); const connector = connectorResult._source; if (connector) { - const result = await client.asCurrentUser.index({ + const result = await client.index({ document: { ...connector, service_type: serviceType }, id: connectorId, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); return result; } else { throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.serviceType.error', { + i18n.translate('searchConnectors.server.connectors.serviceType.error', { defaultMessage: 'Could not find document', }) ); diff --git a/packages/kbn-search-connectors/lib/update_connector_status.ts b/packages/kbn-search-connectors/lib/update_connector_status.ts new file mode 100644 index 0000000000000..42ba9adb4f9e0 --- /dev/null +++ b/packages/kbn-search-connectors/lib/update_connector_status.ts @@ -0,0 +1,41 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; +import { i18n } from '@kbn/i18n'; + +import { CONNECTORS_INDEX } from '..'; + +import { ConnectorDocument, ConnectorStatus } from '../types/connectors'; + +export const updateConnectorStatus = async ( + client: ElasticsearchClient, + connectorId: string, + status: ConnectorStatus +) => { + const connectorResult = await client.get({ + id: connectorId, + index: CONNECTORS_INDEX, + }); + const connector = connectorResult._source; + if (connector) { + const result = await client.index({ + document: { ...connector, status }, + id: connectorId, + index: CONNECTORS_INDEX, + }); + await client.indices.refresh({ index: CONNECTORS_INDEX }); + return result; + } else { + throw new Error( + i18n.translate('searchConnectors.server.connectors.serviceType.error', { + defaultMessage: 'Could not find document', + }) + ); + } +}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts b/packages/kbn-search-connectors/lib/update_filtering.ts similarity index 80% rename from x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts rename to packages/kbn-search-connectors/lib/update_filtering.ts index 4c0e3c2b2e541..5d32639f23396 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering.ts +++ b/packages/kbn-search-connectors/lib/update_filtering.ts @@ -1,24 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 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 { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; +import { fetchConnectorById } from './fetch_connectors'; import { Connector, FilteringRule, FilteringRules, FilteringValidationState, -} from '../../../common/types/connectors'; - -import { fetchConnectorById } from './fetch_connectors'; +} from '../types/connectors'; export const updateFiltering = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, { advancedSnippet, @@ -55,7 +55,7 @@ export const updateFiltering = async ( }, }; - const result = await client.asCurrentUser.update({ + const result = await client.update({ doc: { ...connector, filtering: [{ ...connector.filtering[0], active, draft: active }] }, id: connectorId, if_primary_term: primaryTerm, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts b/packages/kbn-search-connectors/lib/update_filtering_draft.ts similarity index 80% rename from x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts rename to packages/kbn-search-connectors/lib/update_filtering_draft.ts index cf82d79008d09..deb6eabd66e23 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_filtering_draft.ts +++ b/packages/kbn-search-connectors/lib/update_filtering_draft.ts @@ -1,24 +1,24 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 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 { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '..'; +import { fetchConnectorById } from './fetch_connectors'; import { Connector, FilteringRule, FilteringRules, FilteringValidationState, -} from '../../../common/types/connectors'; - -import { fetchConnectorById } from './fetch_connectors'; +} from '../types/connectors'; export const updateFilteringDraft = async ( - client: IScopedClusterClient, + client: ElasticsearchClient, connectorId: string, { advancedSnippet, @@ -55,7 +55,7 @@ export const updateFilteringDraft = async ( } const { value: connector, seqNo, primaryTerm } = connectorResult; - const result = await client.asCurrentUser.update({ + const result = await client.update({ doc: { ...connector, filtering: [{ ...connector.filtering[0], draft }] }, id: connectorId, if_primary_term: primaryTerm, diff --git a/packages/kbn-search-connectors/lib/update_native.ts b/packages/kbn-search-connectors/lib/update_native.ts new file mode 100644 index 0000000000000..dff5042961088 --- /dev/null +++ b/packages/kbn-search-connectors/lib/update_native.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 { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; + +import { CONNECTORS_INDEX } from '..'; +import { Connector } from '../types/connectors'; + +export const putUpdateNative = async ( + client: ElasticsearchClient, + connectorId: string, + isNative: boolean +) => { + const result = await client.update({ + doc: { + is_native: isNative, + }, + id: connectorId, + index: CONNECTORS_INDEX, + }); + + return result; +}; diff --git a/packages/kbn-search-connectors/package.json b/packages/kbn-search-connectors/package.json new file mode 100644 index 0000000000000..d2fb29822e269 --- /dev/null +++ b/packages/kbn-search-connectors/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/search-connectors", + "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-search-connectors/tsconfig.json b/packages/kbn-search-connectors/tsconfig.json new file mode 100644 index 0000000000000..a8c8d3c9840a6 --- /dev/null +++ b/packages/kbn-search-connectors/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/i18n", + "@kbn/core", + "@kbn/core-elasticsearch-server", + ] +} diff --git a/x-pack/plugins/enterprise_search/common/types/connectors.ts b/packages/kbn-search-connectors/types/connectors.ts similarity index 97% rename from x-pack/plugins/enterprise_search/common/types/connectors.ts rename to packages/kbn-search-connectors/types/connectors.ts index 6354c058b222f..8f649c15f348f 100644 --- a/x-pack/plugins/enterprise_search/common/types/connectors.ts +++ b/packages/kbn-search-connectors/types/connectors.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. */ export interface SelectOption { diff --git a/packages/kbn-search-connectors/types/index.ts b/packages/kbn-search-connectors/types/index.ts new file mode 100644 index 0000000000000..f7ef8e3b4d941 --- /dev/null +++ b/packages/kbn-search-connectors/types/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 * from './connectors'; +export * from './native_connectors'; +export * from './optimistic_concurrency'; +export * from './pagination'; diff --git a/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts b/packages/kbn-search-connectors/types/native_connectors.ts similarity index 83% rename from x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts rename to packages/kbn-search-connectors/types/native_connectors.ts index b12c23e26351a..0e767b4bdd345 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts +++ b/packages/kbn-search-connectors/types/native_connectors.ts @@ -1,59 +1,60 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 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 { i18n } from '@kbn/i18n'; -import { DisplayType, FeatureName, FieldType, NativeConnector } from '../types/connectors'; +import { DisplayType, FeatureName, FieldType, NativeConnector } from './connectors'; -const USERNAME_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.usernameLabel', { +const USERNAME_LABEL = i18n.translate('searchConnectors.nativeConnectors.usernameLabel', { defaultMessage: 'Username', }); -const PASSWORD_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.passwordLabel', { +const PASSWORD_LABEL = i18n.translate('searchConnectors.nativeConnectors.passwordLabel', { defaultMessage: 'Password', }); -const ENABLE_SSL_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.enableSSL.label', { +const ENABLE_SSL_LABEL = i18n.translate('searchConnectors.nativeConnectors.enableSSL.label', { defaultMessage: 'Enable SSL', }); const SSL_CERTIFICATE_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.sslCertificate.label', + 'searchConnectors.nativeConnectors.sslCertificate.label', { defaultMessage: 'SSL certificate', } ); const RETRIES_PER_REQUEST_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.retriesPerRequest.label', + 'searchConnectors.nativeConnectors.retriesPerRequest.label', { defaultMessage: 'Retries per request', } ); const ADVANCED_RULES_IGNORED_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.advancedRulesIgnored.label', + 'searchConnectors.nativeConnectors.advancedRulesIgnored.label', { defaultMessage: 'This configurable field is ignored when Advanced Sync Rules are used.', } ); const MAX_CONCURRENT_DOWNLOADS_LABEL = i18n.translate( - 'xpack.enterpriseSearch.nativeConnectors.nativeConnectors.maximumConcurrentLabel', + 'searchConnectors.nativeConnectors.nativeConnectors.maximumConcurrentLabel', { defaultMessage: 'Maximum concurrent downloads', } ); -const DATABASE_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.databaseLabel', { +const DATABASE_LABEL = i18n.translate('searchConnectors.nativeConnectors.databaseLabel', { defaultMessage: 'Database', }); -const PORT_LABEL = i18n.translate('xpack.enterpriseSearch.nativeConnectors.portLabel', { +const PORT_LABEL = i18n.translate('searchConnectors.nativeConnectors.portLabel', { defaultMessage: 'Port', }); @@ -65,7 +66,7 @@ export const NATIVE_CONNECTOR_DEFINITIONS: Record { + primaryTerm: number | undefined; + seqNo: number | undefined; + value: T; +} diff --git a/packages/kbn-search-connectors/types/pagination.ts b/packages/kbn-search-connectors/types/pagination.ts new file mode 100644 index 0000000000000..65f397105013b --- /dev/null +++ b/packages/kbn-search-connectors/types/pagination.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 Page { + from: number; // current page index, 0-based + has_more_hits_than_total?: boolean; + size: number; // size per page + total: number; // total number of hits +} +export interface Meta { + page: Page; +} + +export interface Paginate { + _meta: Meta; + data: T[]; +} diff --git a/packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts b/packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts new file mode 100644 index 0000000000000..9fa0831955840 --- /dev/null +++ b/packages/kbn-search-connectors/utils/fetch_with_pagination.test.ts @@ -0,0 +1,125 @@ +/* + * 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 { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; + +import { fetchWithPagination } from './fetch_with_pagination'; + +describe('fetchWithPagination util', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('fetchWithPagination', () => { + it('should fetch mock data with pagination', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { hits: ['result1', 'result2'], total: 2 }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 10)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 2, + }, + }, + data: ['result1', 'result2'], + }); + }); + it('should return empty result if size is 0', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { hits: [], total: 0 }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 0)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 0, + }, + }, + data: [], + }); + }); + it('should handle total as an object correctly', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { + hits: [], + total: { + relation: 'lte', + value: 555, + }, + }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 10)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 555, + }, + }, + data: [], + }); + }); + + it('should handle undefined total correctly', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { + hits: [], + total: undefined, + }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 0, 10)).resolves.toEqual({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 0, + }, + }, + data: [], + }); + }); + + it('should handle has_more_hits_than_total correctly', async () => { + const mockFn = jest.fn(); + mockFn.mockImplementation(() => + Promise.resolve({ + hits: { hits: ['result1', 'result2'], total: { relation: 'gte', value: 10000 } }, + } as any as SearchResponse) + ); + await expect(fetchWithPagination(mockFn, 50, 10)).resolves.toEqual({ + _meta: { + page: { + from: 50, + has_more_hits_than_total: true, + size: 10, + total: 10000, + }, + }, + data: ['result1', 'result2'], + }); + }); + }); +}); diff --git a/packages/kbn-search-connectors/utils/fetch_with_pagination.ts b/packages/kbn-search-connectors/utils/fetch_with_pagination.ts new file mode 100644 index 0000000000000..fd6c6a5232374 --- /dev/null +++ b/packages/kbn-search-connectors/utils/fetch_with_pagination.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. + */ + +import { SearchHit, SearchResponse, SearchTotalHits } from '@elastic/elasticsearch/lib/api/types'; + +import { Paginate } from '../types/pagination'; + +const defaultResult = (data: T[]) => ({ + _meta: { + page: { + from: 0, + has_more_hits_than_total: false, + size: 10, + total: 0, + }, + }, + data, +}); + +export const fetchWithPagination = async ( + fetchFunction: () => Promise>, + from: number, + size: number +): Promise>> => { + if (size === 0) { + return defaultResult>([]); + } + const result = await fetchFunction(); + const total = totalToPaginateTotal(result.hits.total); + return { + _meta: { + page: { + from, + size, + ...total, + }, + }, + data: result.hits.hits, + }; +}; + +function totalToPaginateTotal(input: number | SearchTotalHits | undefined): { + has_more_hits_than_total: boolean; + total: number; +} { + if (typeof input === 'number') { + return { has_more_hits_than_total: false, total: input }; + } + + return input + ? { + has_more_hits_than_total: input.relation === 'gte' ? true : false, + total: input.value, + } + : { has_more_hits_than_total: false, total: 0 }; +} diff --git a/packages/kbn-search-connectors/utils/identify_exceptions.test.ts b/packages/kbn-search-connectors/utils/identify_exceptions.test.ts new file mode 100644 index 0000000000000..321b0310353bb --- /dev/null +++ b/packages/kbn-search-connectors/utils/identify_exceptions.test.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { isIndexNotFoundException, isResourceAlreadyExistsException } from './identify_exceptions'; + +describe('IdentifyExceptions', () => { + describe('IsIndexNotFoundException', () => { + it('should return true for index not found exception', () => { + const error = { + meta: { + body: { + error: { + type: 'index_not_found_exception', + }, + status: 404, + }, + name: 'ResponseError', + statusCode: 404, + }, + }; + expect(isIndexNotFoundException(error as any)).toEqual(true); + }); + it('should return false for other exception', () => { + const error = { + meta: { + body: { + error: { + type: 'other_exception', + }, + status: 404, + }, + name: 'ResponseError', + statusCode: 404, + }, + }; + expect(isIndexNotFoundException(error as any)).toEqual(false); + }); + it('should return false for other object', () => { + expect(isIndexNotFoundException({} as any)).toEqual(false); + }); + }); + describe('isResourceAlreadyExistsError', () => { + it('should return true for resource already exists exception', () => { + const error = { + meta: { + body: { + error: { + type: 'resource_already_exists_exception', + }, + status: 400, + }, + name: 'ResponseError', + statusCode: 400, + }, + }; + expect(isResourceAlreadyExistsException(error as any)).toEqual(true); + }); + it('should return false for other exception', () => { + const error = { + meta: { + body: { + error: { + type: 'other_exception', + }, + status: 404, + }, + name: 'ResponseError', + statusCode: 404, + }, + }; + expect(isResourceAlreadyExistsException(error as any)).toEqual(false); + }); + it('should return false for other object', () => { + expect(isResourceAlreadyExistsException({} as any)).toEqual(false); + }); + }); +}); diff --git a/packages/kbn-search-connectors/utils/identify_exceptions.ts b/packages/kbn-search-connectors/utils/identify_exceptions.ts new file mode 100644 index 0000000000000..0bc395710d8f5 --- /dev/null +++ b/packages/kbn-search-connectors/utils/identify_exceptions.ts @@ -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. + */ + +export interface ElasticsearchResponseError { + meta?: { + body?: { + error?: { + type: string; + }; + }; + statusCode?: number; + }; + name: 'ResponseError'; +} + +const MISSING_ALIAS_ERROR = new RegExp(/^alias \[.+\] missing/); + +export const isIndexNotFoundException = (error: ElasticsearchResponseError) => + error?.meta?.body?.error?.type === 'index_not_found_exception'; + +export const isResourceAlreadyExistsException = (error: ElasticsearchResponseError) => + error?.meta?.body?.error?.type === 'resource_already_exists_exception'; + +export const isResourceNotFoundException = (error: ElasticsearchResponseError) => + error?.meta?.body?.error?.type === 'resource_not_found_exception'; + +export const isUnauthorizedException = (error: ElasticsearchResponseError) => + error.meta?.statusCode === 403; + +export const isNotFoundException = (error: ElasticsearchResponseError) => + error.meta?.statusCode === 404; + +export const isIllegalArgumentException = (error: ElasticsearchResponseError) => + error.meta?.body?.error?.type === 'illegal_argument_exception'; + +export const isVersionConflictEngineException = (error: ElasticsearchResponseError) => + error.meta?.body?.error?.type === 'version_conflict_engine_exception'; + +export const isInvalidSearchApplicationNameException = (error: ElasticsearchResponseError) => + error.meta?.body?.error?.type === 'invalid_alias_name_exception'; + +export const isMissingAliasException = (error: ElasticsearchResponseError) => + error.meta?.statusCode === 404 && + typeof error.meta?.body?.error === 'string' && + MISSING_ALIAS_ERROR.test(error.meta?.body?.error); diff --git a/packages/kbn-search-connectors/utils/index.ts b/packages/kbn-search-connectors/utils/index.ts new file mode 100644 index 0000000000000..ae2bbe2a818aa --- /dev/null +++ b/packages/kbn-search-connectors/utils/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 * from './is_category_entry'; diff --git a/packages/kbn-search-connectors/utils/is_category_entry.ts b/packages/kbn-search-connectors/utils/is_category_entry.ts new file mode 100644 index 0000000000000..fb72db52944df --- /dev/null +++ b/packages/kbn-search-connectors/utils/is_category_entry.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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 { ConnectorConfigProperties, ConnectorConfigCategoryProperties } from '../types/connectors'; + +export function isCategoryEntry( + input: + | ConnectorConfigProperties + | ConnectorConfigCategoryProperties + | { label: string; value: boolean } + | null +): input is ConnectorConfigCategoryProperties { + return (input as ConnectorConfigCategoryProperties)?.type === 'category'; +} + +export function isConfigEntry( + input: + | ConnectorConfigProperties + | ConnectorConfigCategoryProperties + | { label: string; value: boolean } + | null +): input is ConnectorConfigProperties { + return (input as ConnectorConfigCategoryProperties).type !== 'category'; +} diff --git a/packages/kbn-search-connectors/utils/is_not_nullish.ts b/packages/kbn-search-connectors/utils/is_not_nullish.ts new file mode 100644 index 0000000000000..88b39b70d4ec8 --- /dev/null +++ b/packages/kbn-search-connectors/utils/is_not_nullish.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 function isNotNullish(value: T | null | undefined): value is T { + return value !== null && value !== undefined; +} diff --git a/tsconfig.base.json b/tsconfig.base.json index afbbdcfe7601b..e5808369793ae 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1186,6 +1186,8 @@ "@kbn/screenshotting-plugin/*": ["x-pack/plugins/screenshotting/*"], "@kbn/search-api-panels": ["packages/kbn-search-api-panels"], "@kbn/search-api-panels/*": ["packages/kbn-search-api-panels/*"], + "@kbn/search-connectors": ["packages/kbn-search-connectors"], + "@kbn/search-connectors/*": ["packages/kbn-search-connectors/*"], "@kbn/search-examples-plugin": ["examples/search_examples"], "@kbn/search-examples-plugin/*": ["examples/search_examples/*"], "@kbn/search-response-warnings": ["packages/kbn-search-response-warnings"], diff --git a/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts b/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts index 455bd6799e096..75344e1a0b912 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts +++ b/x-pack/plugins/enterprise_search/common/connectors/is_category_entry.ts @@ -5,7 +5,10 @@ * 2.0. */ -import { ConnectorConfigProperties, ConnectorConfigCategoryProperties } from '../types/connectors'; +import { + ConnectorConfigProperties, + ConnectorConfigCategoryProperties, +} from '@kbn/search-connectors'; export function isCategoryEntry( input: diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts index 8c8ace6fd434f..9bbaadc4c2b83 100644 --- a/x-pack/plugins/enterprise_search/common/constants.ts +++ b/x-pack/plugins/enterprise_search/common/constants.ts @@ -7,8 +7,9 @@ import { i18n } from '@kbn/i18n'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { ProductFeatures } from './types'; -import { IngestPipelineParams } from './types/connectors'; export const SEARCH_PRODUCT_NAME = i18n.translate('xpack.enterpriseSearch.search.productName', { defaultMessage: 'Search', diff --git a/x-pack/plugins/enterprise_search/common/types/crawler.ts b/x-pack/plugins/enterprise_search/common/types/crawler.ts index 678a99fa448d6..60043444524aa 100644 --- a/x-pack/plugins/enterprise_search/common/types/crawler.ts +++ b/x-pack/plugins/enterprise_search/common/types/crawler.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorStatus, SyncStatus } from './connectors'; +import { ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; // See SharedTogo::Crawler::Status for details on how these are generated export enum CrawlerStatus { diff --git a/x-pack/plugins/enterprise_search/common/types/indices.ts b/x-pack/plugins/enterprise_search/common/types/indices.ts index b9e822e5168fd..57807ae98248a 100644 --- a/x-pack/plugins/enterprise_search/common/types/indices.ts +++ b/x-pack/plugins/enterprise_search/common/types/indices.ts @@ -12,7 +12,8 @@ import { Uuid, } from '@elastic/elasticsearch/lib/api/types'; -import { Connector } from './connectors'; +import { Connector } from '@kbn/search-connectors'; + import { Crawler } from './crawler'; export interface AlwaysShowPattern { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts index 55b21f2e4c753..2817716873c7e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/pipeline.mock.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { IngestPipelineParams } from '../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; export const mockPipelineState: IngestPipelineParams = { extract_binary_content: true, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts index 4f92ffa6a7830..d8ebc499400f9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts @@ -5,8 +5,6 @@ * 2.0. */ -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; - import { ConnectorStatus, DisplayType, @@ -15,7 +13,10 @@ import { FilteringRuleRule, FilteringValidationState, SyncStatus, -} from '../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; + import { ElasticsearchIndexWithIngestion } from '../../../../common/types/indices'; export const indices: ElasticsearchIndexWithIngestion[] = [ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts index db4d1870fba90..d19407961e039 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/sync_job.mock.ts @@ -7,12 +7,8 @@ import moment from 'moment'; -import { - ConnectorSyncJob, - TriggerMethod, - SyncStatus, - SyncJobType, -} from '../../../../common/types/connectors'; +import { ConnectorSyncJob, TriggerMethod, SyncStatus, SyncJobType } from '@kbn/search-connectors'; + import { SyncJobView } from '../components/search_index/sync_jobs/sync_jobs_view_logic'; export const syncJob: ConnectorSyncJob = { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts index f10ca7cfba3b0..c548225ef78ac 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts @@ -5,8 +5,6 @@ * 2.0. */ -import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; - import { ConnectorStatus, DisplayType, @@ -15,7 +13,9 @@ import { FilteringRuleRule, FilteringValidationState, SyncStatus, -} from '../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; import { ApiViewIndex, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts index 7452c2b7d1600..e7485d6645ce4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/fetch_sync_jobs_api_logic.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { ConnectorSyncJob } from '../../../../../common/types/connectors'; +import { ConnectorSyncJob } from '@kbn/search-connectors'; + import { Paginate } from '../../../../../common/types/pagination'; import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts index eddc2f2ced2d5..288a9d17d179f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/get_default_pipeline_api_logic.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts index 72510ea9fc1d3..5721addbc034f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_configuration_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { ConnectorConfiguration } from '../../../../../common/types/connectors'; +import { ConnectorConfiguration } from '@kbn/search-connectors'; + import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts index 023d06b8f957b..00d300c32e058 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { FilteringRule, FilteringRules } from '../../../../../common/types/connectors'; +import { FilteringRule, FilteringRules } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts index f380af36e849e..245899192726a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_filtering_draft_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { FilteringRule, FilteringRules } from '../../../../../common/types/connectors'; +import { FilteringRule, FilteringRules } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts index 88d2c19a59eb0..2fc296d31c247 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_name_and_description_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { Connector } from '../../../../../common/types/connectors'; +import { Connector } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts index c2ffaa647614f..00dce404e322d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_connector_scheduling_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { SchedulingConfiguraton } from '../../../../../common/types/connectors'; +import { SchedulingConfiguraton } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts index 81cfeadf8e39a..61b127d7ddc11 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_default_pipeline_api_logic.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts index 496b50fce7444..f9ec661fa8df2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/update_pipeline_api_logic.ts @@ -7,7 +7,8 @@ import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts index 901a40e5c9e23..94be9aade7801 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/pipelines/fetch_index_pipeline_parameters.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { IngestPipelineParams } from '../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; import { HttpLogic } from '../../../shared/http'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx index a645a60fb67fb..3061ba03e4556 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/curl_request/curl_request.tsx @@ -9,7 +9,8 @@ import React from 'react'; import { EuiCodeBlock } from '@elastic/eui'; -import { IngestPipelineParams } from '../../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { useCloudDetails } from '../../../../../shared/cloud_details/cloud_details'; interface CurlRequestParams { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx index 0667451d8e761..90777ddfdb963 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx @@ -26,7 +26,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ConnectorStatus } from '../../../../../../common/types/connectors'; +import { ConnectorStatus } from '@kbn/search-connectors'; + import { BetaConnectorCallout } from '../../../../shared/beta/beta_connector_callout'; import { useCloudDetails } from '../../../../shared/cloud_details/cloud_details'; import { docLinks } from '../../../../shared/doc_links'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx index a5c7a5b217353..2408d58e4c5f2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx @@ -25,8 +25,9 @@ import { import { i18n } from '@kbn/i18n'; +import { DisplayType } from '@kbn/search-connectors'; + import { Status } from '../../../../../../common/types/api'; -import { DisplayType } from '../../../../../../common/types/connectors'; import { LicensingLogic } from '../../../../shared/licensing'; import { ConnectorConfigurationApiLogic } from '../../../api/connector/update_connector_configuration_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx index 68907850bd7a8..2aa2236b51e89 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form_items.tsx @@ -11,7 +11,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiIcon, EuiPanel, EuiToolTip } import { i18n } from '@kbn/i18n'; -import { DisplayType } from '../../../../../../common/types/connectors'; +import { DisplayType } from '@kbn/search-connectors'; import { ConnectorConfigurationField } from './connector_configuration_field'; import { ConfigEntryView } from './connector_configuration_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts index d38a58c8940d7..60cc58c1db395 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.test.ts @@ -8,7 +8,7 @@ import { LogicMounter } from '../../../../__mocks__/kea_logic'; import { connectorIndex } from '../../../__mocks__/view_index.mock'; -import { ConnectorStatus, DisplayType, FieldType } from '../../../../../../common/types/connectors'; +import { ConnectorStatus, DisplayType, FieldType } from '@kbn/search-connectors'; import { ConnectorConfigurationApiLogic } from '../../../api/connector/update_connector_configuration_api_logic'; import { CachedFetchIndexApiLogic } from '../../../api/index/cached_fetch_index_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts index fd13c0d55236c..9f82f4b539344 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts @@ -9,14 +9,15 @@ import { kea, MakeLogicType } from 'kea'; import { i18n } from '@kbn/i18n'; -import { isCategoryEntry } from '../../../../../../common/connectors/is_category_entry'; import { ConnectorConfigProperties, ConnectorConfiguration, ConnectorStatus, Dependency, FieldType, -} from '../../../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { isCategoryEntry } from '../../../../../../common/connectors/is_category_entry'; import { isNotNullish } from '../../../../../../common/utils/is_not_nullish'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts index a2869f5a90963..f6cc74d20eb19 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_name_and_description/connector_name_and_description_logic.ts @@ -7,7 +7,8 @@ import { kea, MakeLogicType } from 'kea'; -import { Connector } from '../../../../../../../common/types/connectors'; +import { Connector } from '@kbn/search-connectors'; + import { Actions } from '../../../../../shared/api_logic/create_api_logic'; import { ConnectorNameAndDescriptionApiLogic, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx index 927f26e195f34..5ade2c11a8b55 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx @@ -23,7 +23,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ConnectorStatus, SyncJobType } from '../../../../../../common/types/connectors'; +import { ConnectorStatus, SyncJobType } from '@kbn/search-connectors'; import { generateEncodedPath } from '../../../../shared/encode_path_params'; import { KibanaLogic } from '../../../../shared/kibana'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx index 9c38bdea220ca..c15a2ddefa5d6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/connector_cron_editor.tsx @@ -13,8 +13,9 @@ import { EuiFlexItem, EuiFlexGroup, EuiButton, EuiButtonEmpty } from '@elastic/e import { i18n } from '@kbn/i18n'; +import { ConnectorScheduling, SyncJobType } from '@kbn/search-connectors'; + import { Status } from '../../../../../../../common/types/api'; -import { ConnectorScheduling, SyncJobType } from '../../../../../../../common/types/connectors'; import { CronEditor } from '../../../../../shared/cron_editor'; import { Frequency } from '../../../../../shared/cron_editor/types'; import { UpdateConnectorSchedulingApiLogic } from '../../../../api/connector/update_connector_scheduling_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx index 3fbe4ef8859f2..2031fc1154dec 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling/full_content.tsx @@ -23,7 +23,7 @@ import { import { i18n } from '@kbn/i18n'; -import { SyncJobType } from '../../../../../../../common/types/connectors'; +import { SyncJobType } from '@kbn/search-connectors'; import { ConnectorViewIndex, CrawlerViewIndex } from '../../../../types'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts index 636035aa2ac83..c00392b24b3e3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.test.ts @@ -7,7 +7,7 @@ import { LogicMounter } from '../../../../__mocks__/kea_logic'; -import { SyncJobType } from '../../../../../../common/types/connectors'; +import { SyncJobType } from '@kbn/search-connectors'; import { ConnectorSchedulingLogic } from './connector_scheduling_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts index fdab8b7c59aef..5688b879b0d28 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling_logic.ts @@ -7,7 +7,8 @@ import { kea, MakeLogicType } from 'kea'; -import { ConnectorScheduling, SyncJobType } from '../../../../../../common/types/connectors'; +import { ConnectorScheduling, SyncJobType } from '@kbn/search-connectors'; + import { Actions } from '../../../../shared/api_logic/create_api_logic'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts index 64b4dad084d96..16ec910581086 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts @@ -7,7 +7,7 @@ import dedent from 'dedent'; -import { CONNECTOR_DEFINITIONS } from '../../../../../../common/connectors/connectors'; +import { CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; import { docLinks } from '../../../../shared/doc_links'; import { CONNECTOR_ICONS } from '../../../../shared/icons/connector_icons'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx index 53a6166ad34e5..0c4fa42a3fedb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_configuration_config.tsx @@ -11,7 +11,7 @@ import { EuiSpacer, EuiLink, EuiText, EuiFlexGroup, EuiFlexItem, EuiCallOut } fr import { i18n } from '@kbn/i18n'; -import { ConnectorStatus } from '../../../../../../../common/types/connectors'; +import { ConnectorStatus } from '@kbn/search-connectors'; import { docLinks } from '../../../../../shared/doc_links'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx index 13db854fa79e9..4dfea2cde5895 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/connector_filtering_logic.tsx @@ -9,8 +9,6 @@ import { kea, MakeLogicType } from 'kea'; import { isEqual } from 'lodash'; -import { Status } from '../../../../../../../common/types/api'; - import { FilteringConfig, FilteringPolicy, @@ -18,7 +16,10 @@ import { FilteringRuleRule, FilteringValidation, FilteringValidationState, -} from '../../../../../../../common/types/connectors'; +} from '@kbn/search-connectors'; + +import { Status } from '../../../../../../../common/types/api'; + import { Actions } from '../../../../../shared/api_logic/create_api_logic'; import { clearFlashMessages } from '../../../../../shared/flash_messages'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx index e675b7a149d3b..779c3ec9e8bee 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/edit_sync_rules_flyout.tsx @@ -23,7 +23,8 @@ import { import { i18n } from '@kbn/i18n'; -import { FilteringValidation } from '../../../../../../../common/types/connectors'; +import { FilteringValidation } from '@kbn/search-connectors'; + import { BetaCallOut } from '../../../../../shared/beta/beta_callout'; import { AdvancedSyncRules } from './advanced_sync_rules'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx index b153c6b345431..5e56d34043a04 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/editable_basic_rules_table.tsx @@ -23,11 +23,8 @@ import { import { i18n } from '@kbn/i18n'; -import { - FilteringPolicy, - FilteringRule, - FilteringRuleRule, -} from '../../../../../../../common/types/connectors'; +import { FilteringPolicy, FilteringRule, FilteringRuleRule } from '@kbn/search-connectors'; + import { docLinks } from '../../../../../shared/doc_links'; import { InlineEditableTable } from '../../../../../shared/tables/inline_editable_table/inline_editable_table'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx index fe28ea499964e..16c85e24c5a3a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/sync_rules/sync_rules_callouts.tsx @@ -11,7 +11,7 @@ import { EuiButton, EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } f import { i18n } from '@kbn/i18n'; -import { FilteringValidationState } from '../../../../../../../common/types/connectors'; +import { FilteringValidationState } from '@kbn/search-connectors'; interface FilteringStatusCalloutsProps { applyDraft: () => void; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts index a09a37ad1e93b..bab243892a146 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/types.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ConnectorServerSideDefinition } from '../../../../../../common/connectors/connectors'; +import { ConnectorServerSideDefinition } from '@kbn/search-connectors'; export interface ConnectorClientSideDefinition { docsUrl?: string; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts index 12d00d64c1056..d7e64f9ea1550 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/automatic_crawl_scheduler/automatic_crawl_scheduler_logic.ts @@ -7,7 +7,7 @@ import { kea, MakeLogicType } from 'kea'; -import { ConnectorScheduling } from '../../../../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; import { CrawlerIndex } from '../../../../../../../common/types/indices'; import { Actions } from '../../../../../shared/api_logic/create_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx index 53daad3dc6d80..7cda2cb4702e3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_crawl_scheduler.tsx @@ -22,7 +22,8 @@ import { import { i18n } from '@kbn/i18n'; -import { ConnectorScheduling } from '../../../../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; + import { CrawlerIndex } from '../../../../../../../common/types/indices'; import { EnterpriseSearchCronEditor } from '../../../../../shared/cron_editor/enterprise_search_cron_editor'; import { docLinks } from '../../../../../shared/doc_links/doc_links'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts index aa98f838a8e18..1266c143ba51f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawl_custom_settings_flyout/crawl_custom_settings_flyout_multi_crawl_logic.ts @@ -7,7 +7,8 @@ import { kea, MakeLogicType } from 'kea'; -import { ConnectorScheduling } from '../../../../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; + import { CrawlerCustomSchedulesServer } from '../../../../../../../common/types/crawler'; import { CrawlerIndex } from '../../../../../../../common/types/indices'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts index 9298ca3b32585..2bf7d4646d8d6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_configuration/crawler_configuration_logic.ts @@ -7,8 +7,9 @@ import { kea, MakeLogicType } from 'kea'; +import { Connector } from '@kbn/search-connectors'; + import { Status } from '../../../../../../../common/types/api'; -import { Connector } from '../../../../../../../common/types/connectors'; import { UpdateHtmlExtractionActions, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts index 4bdcf6270f19e..65f61fd0d48ad 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts @@ -12,11 +12,11 @@ import { } from '../../../__mocks__/kea_logic'; import { apiIndex, connectorIndex, crawlerIndex } from '../../__mocks__/view_index.mock'; +import { SyncStatus } from '@kbn/search-connectors'; import { nextTick } from '@kbn/test-jest-helpers'; import { Status } from '../../../../../common/types/api'; -import { SyncStatus } from '../../../../../common/types/connectors'; import { StartSyncApiLogic } from '../../api/connector/start_sync_api_logic'; import { CachedFetchIndexApiLogic } from '../../api/index/cached_fetch_index_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts index 7605910777dcc..f939b3b3dea63 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts @@ -9,13 +9,9 @@ import { kea, MakeLogicType } from 'kea'; import { i18n } from '@kbn/i18n'; +import { Connector, FeatureName, IngestPipelineParams, SyncStatus } from '@kbn/search-connectors'; + import { Status } from '../../../../../common/types/api'; -import { - Connector, - FeatureName, - IngestPipelineParams, - SyncStatus, -} from '../../../../../common/types/connectors'; import { Actions } from '../../../shared/api_logic/create_api_logic'; import { flashSuccessToast } from '../../../shared/flash_messages'; import { KibanaLogic } from '../../../shared/kibana'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts index dbe0610b4a855..ced2cc0d98099 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.logic.ts @@ -7,9 +7,10 @@ import { kea, MakeLogicType } from 'kea'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../../../common/constants'; import { Status } from '../../../../../common/types/api'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; import { KibanaLogic } from '../../../shared/kibana'; import { GenerateApiKeyLogic } from '../../api/generate_api_key/generate_api_key_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx index 087ceda6a8d9d..a0e9e0949bc0c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/default_pipeline_item.tsx @@ -18,7 +18,8 @@ import { import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { ElasticsearchIndexWithIngestion } from '../../../../../../../common/types/indices'; import { isApiIndex } from '../../../../utils/indices'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx index 1dcffe443855e..e5e3d2a030615 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ingest_pipelines/ingest_pipeline_flyout.tsx @@ -28,7 +28,8 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { IngestPipelineParams } from '../../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { docLinks } from '../../../../../shared/doc_links'; import { CurlRequest } from '../../components/curl_request/curl_request'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx index 96566f60972ab..140d88a6e9740 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipeline_settings_form.tsx @@ -10,7 +10,8 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { SettingsCheckableCard } from '../../shared/settings_checkable_card/settings_checkable_card'; interface PipelineSettingsFormProps { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts index bf71dc215243f..ccb86f1a7ecb2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/pipelines_logic.ts @@ -11,10 +11,11 @@ import { IngestPipeline } from '@elastic/elasticsearch/lib/api/types'; import { i18n } from '@kbn/i18n'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../../../../common/constants'; import { HttpError } from '../../../../../../common/types/api'; -import { IngestPipelineParams } from '../../../../../../common/types/connectors'; import { ElasticsearchIndexWithIngestion } from '../../../../../../common/types/indices'; import { InferencePipeline } from '../../../../../../common/types/pipelines'; import { Actions } from '../../../../shared/api_logic/create_api_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx index 85c65f78a93f6..907072a720210 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { TriggerMethod } from '../../../../../../common/types/connectors'; +import { TriggerMethod } from '@kbn/search-connectors'; import { SyncJobEventsPanel } from './events_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx index 00c67249523c3..04134c791a229 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/events_panel.tsx @@ -13,7 +13,8 @@ import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { TriggerMethod } from '../../../../../../common/types/connectors'; +import { TriggerMethod } from '@kbn/search-connectors'; + import { FormattedDateTime } from '../../../../shared/formatted_date_time'; import { FlyoutPanel } from './flyout_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx index 007a3b60b7900..14a46c8373ad9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.test.tsx @@ -9,11 +9,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { - FilteringPolicy, - FilteringRule, - FilteringRuleRule, -} from '../../../../../../common/types/connectors'; +import { FilteringPolicy, FilteringRule, FilteringRuleRule } from '@kbn/search-connectors'; import { FilteringPanel } from './filtering_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx index f5807525dbabe..8f5dee105df4e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/filtering_panel.tsx @@ -11,7 +11,7 @@ import { EuiCodeBlock, EuiPanel, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FilteringRule, FilteringRules } from '../../../../../../common/types/connectors'; +import { FilteringRule, FilteringRules } from '@kbn/search-connectors'; import { FilteringRulesTable } from '../../shared/filtering_rules_table/filtering_rules_table'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx index 191961ad0b21b..f0a3d3945df71 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/pipeline_panel.tsx @@ -11,7 +11,7 @@ import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { IngestPipelineParams } from '../../../../../../common/types/connectors'; +import { IngestPipelineParams } from '@kbn/search-connectors'; import { FlyoutPanel } from './flyout_panel'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx index 03e0e4b17e51a..f57b45dee7abc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.test.tsx @@ -11,7 +11,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { SyncStatus, TriggerMethod } from '../../../../../../common/types/connectors'; +import { SyncStatus, TriggerMethod } from '@kbn/search-connectors'; import { SyncJobCallouts } from './sync_callouts'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx index 461132980c66b..7c8a26617f2a8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_callouts.tsx @@ -13,7 +13,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { SyncStatus, TriggerMethod } from '../../../../../../common/types/connectors'; +import { SyncStatus, TriggerMethod } from '@kbn/search-connectors'; + import { FormattedDateTime } from '../../../../shared/formatted_date_time'; import { durationToText } from '../../../utils/duration_to_text'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx index 84fd9a30436d3..c659320614c6c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_history_table.tsx @@ -13,7 +13,8 @@ import { EuiBadge, EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { SyncJobType, SyncStatus } from '../../../../../../common/types/connectors'; +import { SyncJobType, SyncStatus } from '@kbn/search-connectors'; + import { FormattedDateTime } from '../../../../shared/formatted_date_time'; import { pageToPagination } from '../../../../shared/pagination/page_to_pagination'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts index d5f21cc46b273..7ccc28de37772 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.test.ts @@ -9,16 +9,11 @@ import { LogicMounter, mockFlashMessageHelpers } from '../../../../__mocks__/kea import moment from 'moment'; +import { ConnectorSyncJob, SyncJobType, SyncStatus, TriggerMethod } from '@kbn/search-connectors'; import { nextTick } from '@kbn/test-jest-helpers'; import { HttpError, Status } from '../../../../../../common/types/api'; -import { - ConnectorSyncJob, - SyncJobType, - SyncStatus, - TriggerMethod, -} from '../../../../../../common/types/connectors'; import { FetchSyncJobsApiLogic } from '../../../api/connector/fetch_sync_jobs_api_logic'; import { IndexViewLogic } from '../index_view_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts index cd17eb9a931d6..900b3a8360728 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs_view_logic.ts @@ -9,9 +9,10 @@ import { kea, MakeLogicType } from 'kea'; import moment from 'moment'; +import { ConnectorSyncJob } from '@kbn/search-connectors'; + import { Status } from '../../../../../../common/types/api'; -import { ConnectorSyncJob } from '../../../../../../common/types/connectors'; import { Page, Paginate } from '../../../../../../common/types/pagination'; import { Actions } from '../../../../shared/api_logic/create_api_logic'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts index 8455b563b4022..de14705f2b234 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts @@ -11,12 +11,11 @@ import { connectorIndex, elasticsearchViewIndices } from '../../__mocks__/view_i import moment from 'moment'; +import { ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; import { nextTick } from '@kbn/test-jest-helpers'; import { HttpError, Status } from '../../../../../common/types/api'; -import { ConnectorStatus, SyncStatus } from '../../../../../common/types/connectors'; - import { FetchIndicesAPILogic } from '../../api/index/fetch_indices_api_logic'; import { IngestionMethod, IngestionStatus } from '../../types'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx index aee36cda0b348..244e4a48eca54 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx @@ -19,7 +19,7 @@ import { import { i18n } from '@kbn/i18n'; -import { NATIVE_CONNECTOR_DEFINITIONS } from '../../../../../common/connectors/native_connectors'; +import { NATIVE_CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; import { Meta } from '../../../../../common/types/pagination'; import { healthColorsMap } from '../../../shared/constants/health_colors'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts index 240ca8e43c15b..43ccf6f47ca39 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings_logic.ts @@ -9,10 +9,11 @@ import { kea, MakeLogicType } from 'kea'; import { isDeepEqual } from 'react-use/lib/util'; +import { IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../../../common/constants'; import { Status } from '../../../../../common/types/api'; -import { IngestPipelineParams } from '../../../../../common/types/connectors'; import { Actions } from '../../../shared/api_logic/create_api_logic'; import { KibanaLogic } from '../../../shared/kibana'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx index fc31f7892261d..763664329b19c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/filtering_rules_table/filtering_rules_table.tsx @@ -11,11 +11,7 @@ import { EuiBasicTable, EuiBasicTableColumn, EuiCode } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { - FilteringRule, - FilteringPolicy, - FilteringRuleRule, -} from '../../../../../../common/types/connectors'; +import { FilteringRule, FilteringPolicy, FilteringRuleRule } from '@kbn/search-connectors'; import { filteringPolicyToText, filteringRuleToText } from '../../../utils/filtering_rule_helpers'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts index 44d832a0ef51d..b04dd1b37bf4a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/filtering_rule_helpers.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { FilteringPolicy, FilteringRuleRule } from '../../../../common/types/connectors'; +import { FilteringPolicy, FilteringRuleRule } from '@kbn/search-connectors'; const filteringRuleStringMap: Record = { [FilteringRuleRule.CONTAINS]: i18n.translate( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts index b9cadd80181b8..6b6d8a53b2c30 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/has_configured_configuration.ts @@ -5,8 +5,9 @@ * 2.0. */ +import { ConnectorConfiguration } from '@kbn/search-connectors'; + import { isConfigEntry } from '../../../../common/connectors/is_category_entry'; -import { ConnectorConfiguration } from '../../../../common/types/connectors'; export const hasConfiguredConfiguration = (configuration: ConnectorConfiguration) => { return !Object.entries(configuration).find( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts index e5e4273555b55..13e3482064ff6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts @@ -9,7 +9,8 @@ import { connectorIndex, crawlerIndex, apiIndex } from '../__mocks__/view_index. import moment from 'moment'; -import { ConnectorStatus, SyncStatus } from '../../../../common/types/connectors'; +import { ConnectorStatus, SyncStatus } from '@kbn/search-connectors'; + import { IngestionMethod, IngestionStatus } from '../types'; import { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts index e420ab0cf8dcf..2323b1b22cf5f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts @@ -9,8 +9,9 @@ import moment from 'moment'; import { i18n } from '@kbn/i18n'; +import { SyncStatus, ConnectorStatus } from '@kbn/search-connectors'; + import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; -import { SyncStatus, ConnectorStatus } from '../../../../common/types/connectors'; import { ConnectorIndex, CrawlerIndex, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts index 4272eaf11641e..5f11fabe1bc48 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { SyncStatus } from '../../../../common/types/connectors'; +import { SyncStatus } from '@kbn/search-connectors'; import { syncStatusToColor, syncStatusToText } from './sync_status_to_text'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts index 6868fba40e59f..83b3245999dfc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/sync_status_to_text.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { SyncJobType, SyncStatus } from '../../../../common/types/connectors'; +import { SyncJobType, SyncStatus } from '@kbn/search-connectors'; export function syncStatusToText(status: SyncStatus): string { switch (status) { diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx index 7b915f08c5df9..f31b26cd76e85 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/cron_editor/enterprise_search_cron_editor.tsx @@ -9,7 +9,7 @@ import React, { useState } from 'react'; import { Frequency } from '@kbn/es-ui-shared-plugin/public/components/cron_editor/types'; -import { ConnectorScheduling } from '../../../../common/types/connectors'; +import { ConnectorScheduling } from '@kbn/search-connectors'; import { CronEditor } from './cron_editor'; diff --git a/x-pack/plugins/enterprise_search/server/api/connectors_service.ts b/x-pack/plugins/enterprise_search/server/api/connectors_service.ts deleted file mode 100644 index f13f02cb50796..0000000000000 --- a/x-pack/plugins/enterprise_search/server/api/connectors_service.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IClusterClient } from '@kbn/core-elasticsearch-server'; -import { HttpServiceStart, KibanaRequest } from '@kbn/core-http-server'; - -import { CONNECTOR_DEFINITIONS } from '../../common/connectors/connectors'; - -import { Connector, IngestPipelineParams } from '../../common/types/connectors'; - -import { addConnector } from '../lib/connectors/add_connector'; -import { fetchConnectors } from '../lib/connectors/fetch_connectors'; - -export class ConnectorsService { - private readonly clusterClient: IClusterClient; - private readonly http: HttpServiceStart; - - constructor({ clusterClient, http }: { clusterClient: IClusterClient; http: HttpServiceStart }) { - this.clusterClient = clusterClient; - this.http = http; - } - - async createConnector( - request: KibanaRequest, - input: { - indexName: string | null; - isNative: boolean; - language: string | null; - pipeline?: IngestPipelineParams | null; - serviceType: string | null; - } - ): Promise { - return await addConnector(this.clusterClient.asScoped(request), input); - } - - getConnectorTypes() { - return CONNECTOR_DEFINITIONS.map((connector) => ({ - ...connector, - iconPath: connector.iconPath - ? this.http.basePath.prepend( - `/plugins/enterpriseSearch/assets/source_icons/${connector.iconPath}` - ) - : 'logoEnterpriseSearch', - })); - } - - async getConnectors(request: KibanaRequest): Promise { - return await fetchConnectors(this.clusterClient.asScoped(request)); - } -} diff --git a/x-pack/plugins/enterprise_search/server/index.ts b/x-pack/plugins/enterprise_search/server/index.ts index e7df036ada1a4..a82d6f18a3b26 100644 --- a/x-pack/plugins/enterprise_search/server/index.ts +++ b/x-pack/plugins/enterprise_search/server/index.ts @@ -52,11 +52,7 @@ export const config: PluginConfigDescriptor = { }, schema: configSchema, }; -export const CONNECTORS_INDEX = '.elastic-connectors'; -export const CURRENT_CONNECTORS_INDEX = '.elastic-connectors-v1'; -export const CONNECTORS_JOBS_INDEX = '.elastic-connectors-sync-jobs'; -export const CURRENT_CONNECTORS_JOB_INDEX = '.elastic-connectors-sync-jobs-v1'; -export const CONNECTORS_VERSION = 1; + export const CRAWLERS_INDEX = '.ent-search-actastic-crawler2_configurations_v2'; export type EnterpriseSearchPluginStart = PluginStart; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts index fe18dbccda2d8..cd15faf6b90c1 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts @@ -7,19 +7,24 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; -import { ConnectorStatus } from '../../../common/types/connectors'; +import { + createConnector, + fetchConnectorByIndexName, + deleteConnectorById, +} from '@kbn/search-connectors'; + import { ErrorCode } from '../../../common/types/error_codes'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { textAnalysisSettings } from '../indices/text_analysis'; import { addConnector } from './add_connector'; -import { deleteConnectorById } from './delete_connector'; -import { fetchConnectorByIndexName } from './fetch_connectors'; -jest.mock('./fetch_connectors', () => ({ fetchConnectorByIndexName: jest.fn() })); -jest.mock('./delete_connector', () => ({ deleteConnectorById: jest.fn() })); +jest.mock('@kbn/search-connectors', () => ({ + createConnector: jest.fn(), + deleteConnectorById: jest.fn(), + fetchConnectorByIndexName: jest.fn(), +})); jest.mock('../crawler/fetch_crawlers', () => ({ fetchCrawlerByIndexName: jest.fn() })); describe('addConnector lib function', () => { @@ -57,6 +62,10 @@ describe('addConnector lib function', () => { it('should add connector', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => undefined); @@ -69,95 +78,17 @@ describe('addConnector lib function', () => { language: 'fr', }) ).resolves.toEqual(expect.objectContaining({ id: 'fakeId', index_name: 'index_name' })); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - api_key_id: null, - configuration: {}, - custom_scheduling: {}, - description: null, - error: null, - features: null, - filtering: [ - { - active: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - domain: 'DEFAULT', - draft: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - }, - ], - index_name: 'index_name', - is_native: false, - language: 'fr', - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_incremental_sync_scheduled_at: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - name: 'index_name', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - scheduling: { - access_control: { enabled: false, interval: '0 0 0 * * ?' }, - full: { enabled: false, interval: '0 0 0 * * ?' }, - incremental: { enabled: false, interval: '0 0 0 * * ?' }, - }, - service_type: null, - status: ConnectorStatus.CREATED, - sync_now: false, + expect(createConnector).toHaveBeenCalledWith(mockClient.asCurrentUser, { + indexName: 'index_name', + isNative: false, + language: 'fr', + name: 'index_name', + pipeline: { + extract_binary_content: true, + name: 'ent-search-generic-ingestion', + reduce_whitespace: true, + run_ml_inference: false, }, - index: CURRENT_CONNECTORS_INDEX, - refresh: 'wait_for', }); expect(mockClient.asCurrentUser.indices.create).toHaveBeenCalledWith({ index: 'index_name', @@ -168,6 +99,10 @@ describe('addConnector lib function', () => { it('should reject if index already exists', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => true); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => undefined); @@ -202,6 +137,10 @@ describe('addConnector lib function', () => { it('should reject if crawler already exists', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => true); @@ -215,6 +154,7 @@ describe('addConnector lib function', () => { }) ).rejects.toEqual(new Error(ErrorCode.CRAWLER_ALREADY_EXISTS)); expect(mockClient.asCurrentUser.indices.create).not.toHaveBeenCalled(); + expect(createConnector).not.toHaveBeenCalled(); }); it('should reject with index already exists if connector and index already exist', async () => { @@ -232,10 +172,15 @@ describe('addConnector lib function', () => { }) ).rejects.toEqual(new Error(ErrorCode.INDEX_ALREADY_EXISTS)); expect(mockClient.asCurrentUser.indices.create).not.toHaveBeenCalled(); + expect(createConnector).not.toHaveBeenCalled(); }); it('should replace connector if deleteExistingConnector flag is true', async () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + (createConnector as jest.Mock).mockImplementation(() => ({ + id: 'fakeId', + index_name: 'index_name', + })); mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => ({ id: 'connectorId' })); (fetchCrawlerByIndexName as jest.Mock).mockImplementation(() => undefined); @@ -249,96 +194,19 @@ describe('addConnector lib function', () => { language: null, }) ).resolves.toEqual(expect.objectContaining({ id: 'fakeId', index_name: 'index_name' })); - expect(deleteConnectorById).toHaveBeenCalledWith(mockClient, 'connectorId'); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ - document: { - api_key_id: null, - configuration: {}, - custom_scheduling: {}, - description: null, - error: null, - features: null, - filtering: [ - { - active: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - domain: 'DEFAULT', - draft: { - advanced_snippet: { - created_at: expect.any(String), - updated_at: expect.any(String), - value: {}, - }, - rules: [ - { - created_at: expect.any(String), - field: '_', - id: 'DEFAULT', - order: 0, - policy: 'include', - rule: 'regex', - updated_at: expect.any(String), - value: '.*', - }, - ], - validation: { - errors: [], - state: 'valid', - }, - }, - }, - ], - index_name: 'index_name', - is_native: true, - language: null, - last_access_control_sync_error: null, - last_access_control_sync_scheduled_at: null, - last_access_control_sync_status: null, - last_incremental_sync_scheduled_at: null, - last_seen: null, - last_sync_error: null, - last_sync_scheduled_at: null, - last_sync_status: null, - last_synced: null, - name: 'index_name', - pipeline: { - extract_binary_content: true, - name: 'ent-search-generic-ingestion', - reduce_whitespace: true, - run_ml_inference: false, - }, - scheduling: { - access_control: { enabled: false, interval: '0 0 0 * * ?' }, - full: { enabled: false, interval: '0 0 0 * * ?' }, - incremental: { enabled: false, interval: '0 0 0 * * ?' }, - }, - service_type: null, - status: ConnectorStatus.CREATED, - sync_now: false, + expect(deleteConnectorById).toHaveBeenCalledWith(mockClient.asCurrentUser, 'connectorId'); + expect(createConnector).toHaveBeenCalledWith(mockClient.asCurrentUser, { + deleteExistingConnector: true, + indexName: 'index_name', + isNative: true, + language: null, + name: 'index_name', + pipeline: { + extract_binary_content: true, + name: 'ent-search-generic-ingestion', + reduce_whitespace: true, + run_ml_inference: false, }, - index: CURRENT_CONNECTORS_INDEX, - refresh: 'wait_for', }); expect(mockClient.asCurrentUser.indices.create).toHaveBeenCalledWith({ index: 'index_name', diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts index 891a3e14a2a62..623b2f21c2c05 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts @@ -7,30 +7,35 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; import { + createConnector, Connector, - ConnectorDocument, - IngestPipelineParams, -} from '../../../common/types/connectors'; + deleteConnectorById, + ConnectorStatus, +} from '@kbn/search-connectors'; + +import { fetchConnectorByIndexName, NATIVE_CONNECTOR_DEFINITIONS } from '@kbn/search-connectors'; + +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; + import { ErrorCode } from '../../../common/types/error_codes'; -import { createConnectorDocument } from '../../utils/create_connector_document'; +import { stripSearchPrefix } from '../../../common/utils/strip_search_prefix'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { createIndex } from '../indices/create_index'; import { getDefaultPipeline } from '../pipelines/get_default_pipeline'; -import { deleteConnectorById } from './delete_connector'; - -import { fetchConnectorByIndexName } from './fetch_connectors'; - -const createConnector = async ( - document: ConnectorDocument, +export const addConnector = async ( client: IScopedClusterClient, - language: string | null, - deleteExisting: boolean + input: { + deleteExistingConnector?: boolean; + indexName: string | null; + isNative: boolean; + language: string | null; + serviceType?: string | null; + } ): Promise => { - const index = document.index_name; + const index = input.indexName; if (index) { const indexExists = await client.asCurrentUser.indices.exists({ index }); if (indexExists) { @@ -39,10 +44,10 @@ const createConnector = async ( } } - const connector = await fetchConnectorByIndexName(client, index); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, index); if (connector) { - if (deleteExisting) { - await deleteConnectorById(client, connector.id); + if (input.deleteExistingConnector) { + await deleteConnectorById(client.asCurrentUser, connector.id); } else { throw new Error(ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS); } @@ -52,35 +57,35 @@ const createConnector = async ( if (crawler) { throw new Error(ErrorCode.CRAWLER_ALREADY_EXISTS); } - await createIndex(client, index, language, false); + await createIndex(client, index, input.language, false); } - const result = await client.asCurrentUser.index({ - document, - index: CURRENT_CONNECTORS_INDEX, - refresh: 'wait_for', - }); - return { ...document, id: result._id }; -}; + const nativeConnector = + input.isNative && input.serviceType + ? NATIVE_CONNECTOR_DEFINITIONS[input.serviceType] + : undefined; -export const addConnector = async ( - client: IScopedClusterClient, - input: { - deleteExistingConnector?: boolean; - indexName: string | null; - isNative: boolean; - language: string | null; - pipeline?: IngestPipelineParams | null; - serviceType?: string | null; + if ( + input.isNative && + input.serviceType && + !nativeConnector && + input.serviceType !== ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE + ) { + throw new Error(`Could not find connector definition for service type ${input.serviceType}`); } -): Promise => { - const pipeline = input.pipeline || (await getDefaultPipeline(client)); - const document = createConnectorDocument({ + const nativeFields = nativeConnector + ? { + configuration: nativeConnector.configuration, + features: nativeConnector.features, + status: ConnectorStatus.NEEDS_CONFIGURATION, + } + : {}; + + return await createConnector(client.asCurrentUser, { ...input, - pipeline, - serviceType: input.serviceType || null, + name: stripSearchPrefix(input.indexName || ''), + ...nativeFields, + pipeline: await getDefaultPipeline(client), }); - - return await createConnector(document, client, input.language, !!input.deleteExistingConnector); }; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts deleted file mode 100644 index cd935f32c2c15..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/delete_connector.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core/server'; - -import { CONNECTORS_INDEX } from '../..'; - -import { cancelSyncs } from './post_cancel_syncs'; - -export const deleteConnectorById = async (client: IScopedClusterClient, id: string) => { - // timeout function to mitigate race condition with external connector running job and recreating index - const timeout = async () => { - const promise = new Promise((resolve) => setTimeout(resolve, 500)); - return promise; - }; - await Promise.all([cancelSyncs(client, id), timeout]); - return await client.asCurrentUser.delete({ id, index: CONNECTORS_INDEX, refresh: 'wait_for' }); -}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts deleted file mode 100644 index 7d087f8e74c75..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/fetch_connector_index_names.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core/server'; -import { isIndexNotFoundException } from '@kbn/core-saved-objects-migration-server-internal'; - -import { CONNECTORS_INDEX } from '../..'; - -export async function fetchConnectorIndexNames(client: IScopedClusterClient): Promise { - try { - const result = await client.asCurrentUser.search({ - _source: false, - fields: [{ field: 'index_name' }], - index: CONNECTORS_INDEX, - size: 10000, - }); - return (result?.hits.hits ?? []).map((field) => field.fields?.index_name[0] ?? ''); - } catch (error) { - if (isIndexNotFoundException(error)) { - return []; - } - throw error; - } -} diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts deleted file mode 100644 index 6b3039974f8a4..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; - -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; - -export const putUpdateNative = async ( - client: IScopedClusterClient, - connectorId: string, - isNative: boolean -) => { - const result = await client.asCurrentUser.update({ - doc: { - is_native: isNative, - }, - id: connectorId, - index: CONNECTORS_INDEX, - }); - - return result; -}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts index 90d82c82aca93..6498d3f4d1a03 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts @@ -6,15 +6,19 @@ */ import { IScopedClusterClient } from '@kbn/core/server'; +import { + CONNECTORS_INDEX, + SyncJobType, + SyncStatus, + TriggerMethod, + CURRENT_CONNECTORS_JOB_INDEX, +} from '@kbn/search-connectors'; -import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '../..'; import { CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX } from '../../../common/constants'; -import { SyncJobType, SyncStatus, TriggerMethod } from '../../../common/types/connectors'; - import { ErrorCode } from '../../../common/types/error_codes'; -import { startConnectorSync } from './start_sync'; +import { startSync } from './start_sync'; describe('startSync lib function', () => { const mockClient = { @@ -31,7 +35,7 @@ describe('startSync lib function', () => { }); it('should start a full sync', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _id: 'connectorId', _source: { @@ -61,11 +65,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( - mockClient as unknown as IScopedClusterClient, - 'connectorId', - SyncJobType.FULL - ) + startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).resolves.toEqual({ _id: 'fakeId' }); expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ document: { @@ -98,8 +98,8 @@ describe('startSync lib function', () => { index: CURRENT_CONNECTORS_JOB_INDEX, }); }); - it('should start a full sync with service type, pipeline and nextSyncConfig', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + it('should start a full sync with service type, pipeline', async () => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _source: { api_key_id: null, @@ -126,12 +126,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( - mockClient as unknown as IScopedClusterClient, - 'connectorId', - SyncJobType.FULL, - 'syncConfig' - ) + startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).resolves.toEqual({ _id: 'fakeId' }); expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ document: { @@ -141,7 +136,6 @@ describe('startSync lib function', () => { connector: { configuration: { config: { label: 'label', value: 'haha' }, - nextSyncConfig: { label: 'nextSyncConfig', value: 'syncConfig' }, }, filtering: 'filtering', id: 'connectorId', @@ -169,21 +163,17 @@ describe('startSync lib function', () => { }); it('should not create index if there is no connector', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({}); }); await expect( - startConnectorSync( - mockClient as unknown as IScopedClusterClient, - 'connectorId', - SyncJobType.FULL - ) + startSync(mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL) ).rejects.toEqual(new Error(ErrorCode.RESOURCE_NOT_FOUND)); expect(mockClient.asCurrentUser.index).not.toHaveBeenCalled(); }); it('should set sync_now for crawler and not index a sync job', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _primary_term: 1, _seq_no: 10, @@ -212,7 +202,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.update.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( + startSync( mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.FULL, @@ -236,7 +226,7 @@ describe('startSync lib function', () => { }); it('should start an incremental sync', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _id: 'connectorId', _source: { @@ -265,7 +255,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( + startSync( mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.INCREMENTAL @@ -304,7 +294,7 @@ describe('startSync lib function', () => { }); it('should start an access control sync', async () => { - mockClient.asCurrentUser.get.mockImplementationOnce(() => { + mockClient.asCurrentUser.get.mockImplementation(() => { return Promise.resolve({ _id: 'connectorId', _source: { @@ -332,7 +322,7 @@ describe('startSync lib function', () => { mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); await expect( - startConnectorSync( + startSync( mockClient as unknown as IScopedClusterClient, 'connectorId', SyncJobType.ACCESS_CONTROL diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts index faac79a29c0a7..808fd2fc0d40e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts @@ -7,7 +7,14 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CURRENT_CONNECTORS_JOB_INDEX } from '../..'; +import { + ConnectorConfiguration, + ConnectorDocument, + SyncJobType, + CONNECTORS_INDEX, + startConnectorSync, +} from '@kbn/search-connectors'; + import { isConfigEntry } from '../../../common/connectors/is_category_entry'; import { @@ -15,21 +22,14 @@ import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, } from '../../../common/constants'; -import { - ConnectorConfiguration, - ConnectorDocument, - SyncJobType, - SyncStatus, - TriggerMethod, -} from '../../../common/types/connectors'; import { ErrorCode } from '../../../common/types/error_codes'; import { stripSearchPrefix } from '../../../common/utils/strip_search_prefix'; -export const startConnectorSync = async ( +export const startSync = async ( client: IScopedClusterClient, connectorId: string, jobType: SyncJobType, - nextSyncConfig?: string + nextSyncConfig?: string // only processed for elastic-crawler service types ) => { const connectorResult = await client.asCurrentUser.get({ id: connectorId, @@ -49,9 +49,7 @@ export const startConnectorSync = async ( nextSyncConfig: { label: 'nextSyncConfig', value: nextSyncConfig }, } : config; - const { filtering, index_name, language, pipeline, service_type } = connector; - - const now = new Date().toISOString(); + const { index_name } = connector; if (connector.service_type === ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE) { return await client.asCurrentUser.update({ @@ -70,37 +68,12 @@ export const startConnectorSync = async ( const targetIndexName = jobType === SyncJobType.ACCESS_CONTROL ? `${CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX}${indexNameWithoutSearchPrefix}` - : index_name; + : index_name ?? undefined; - return await client.asCurrentUser.index({ - document: { - cancelation_requested_at: null, - canceled_at: null, - completed_at: null, - connector: { - configuration, - filtering: filtering ? filtering[0]?.active ?? null : null, - id: connectorId, - index_name: targetIndexName, - language, - pipeline: pipeline ?? null, - service_type, - }, - created_at: now, - deleted_document_count: 0, - error: null, - indexed_document_count: 0, - indexed_document_volume: 0, - job_type: jobType, - last_seen: null, - metadata: {}, - started_at: null, - status: SyncStatus.PENDING, - total_document_count: null, - trigger_method: TriggerMethod.ON_DEMAND, - worker_hostname: null, - }, - index: CURRENT_CONNECTORS_JOB_INDEX, + return await startConnectorSync(client.asCurrentUser, { + connectorId, + jobType, + targetIndexName, }); } else { throw new Error(ErrorCode.RESOURCE_NOT_FOUND); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts deleted file mode 100644 index caf8bbc7c7ce9..0000000000000 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_status.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IScopedClusterClient } from '@kbn/core/server'; -import { i18n } from '@kbn/i18n'; - -import { CONNECTORS_INDEX } from '../..'; - -import { ConnectorDocument, ConnectorStatus } from '../../../common/types/connectors'; - -export const updateConnectorStatus = async ( - client: IScopedClusterClient, - connectorId: string, - status: ConnectorStatus -) => { - const connectorResult = await client.asCurrentUser.get({ - id: connectorId, - index: CONNECTORS_INDEX, - }); - const connector = connectorResult._source; - if (connector) { - const result = await client.asCurrentUser.index({ - document: { ...connector, status }, - id: connectorId, - index: CONNECTORS_INDEX, - }); - await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); - return result; - } else { - throw new Error( - i18n.translate('xpack.enterpriseSearch.server.connectors.serviceType.error', { - defaultMessage: 'Could not find document', - }) - ); - } -}; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts index 666921a950a8c..d367e02ed6ab1 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawler_multiple_schedules.ts @@ -7,8 +7,9 @@ import { IScopedClusterClient } from '@kbn/core/server'; +import { Connector } from '@kbn/search-connectors'; + import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; const CUSTOM_SCHEDULING = 'custom_scheduling'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts index 9f6890fb9b8ab..b4766cf0d9d4b 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/fetch_crawlers.ts @@ -7,9 +7,8 @@ import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { IScopedClusterClient } from '@kbn/core/server'; +import { Connector, CONNECTORS_INDEX } from '@kbn/search-connectors'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; import { Crawler, CrawlRequest } from '../../../common/types/crawler'; import { fetchAll } from '../fetch_all'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts index 8c6ad6cbb6a84..7a8f5edd80330 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.test.ts @@ -7,8 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { ConnectorStatus } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, ConnectorStatus } from '@kbn/search-connectors'; import { recreateConnectorDocument } from './post_connector'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts index 17bf6945d0d82..292e07809b7bd 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/post_connector.ts @@ -7,12 +7,10 @@ import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; +import { createConnectorDocument, CONNECTORS_INDEX, ConnectorStatus } from '@kbn/search-connectors'; import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; -import { ConnectorStatus } from '../../../common/types/connectors'; - -import { createConnectorDocument } from '../../utils/create_connector_document'; +import { stripSearchPrefix } from '../../../common/utils/strip_search_prefix'; export const recreateConnectorDocument = async ( client: IScopedClusterClient, @@ -23,6 +21,7 @@ export const recreateConnectorDocument = async ( isNative: false, // The search index has already been created so we don't need the language, which we can't retrieve anymore anyway language: '', + name: stripSearchPrefix(indexName), pipeline: null, serviceType: ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, }); diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts index 9789be5e40cb1..9e5c62a3d9464 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.test.ts @@ -7,8 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; +import { Connector, CONNECTORS_INDEX } from '@kbn/search-connectors'; import { updateHtmlExtraction } from './put_html_extraction'; diff --git a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts index 908f8c27b5a0c..f040f7af85d00 100644 --- a/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts +++ b/x-pack/plugins/enterprise_search/server/lib/crawler/put_html_extraction.ts @@ -7,8 +7,7 @@ import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; -import { CONNECTORS_INDEX } from '../..'; -import { Connector } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, Connector } from '@kbn/search-connectors'; export async function updateHtmlExtraction( client: IScopedClusterClient, diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts index de04b0bed2d47..3db722c0f58b2 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.test.ts @@ -8,15 +8,24 @@ import { ByteSizeValue } from '@kbn/config-schema'; import { IScopedClusterClient } from '@kbn/core/server'; +import { fetchConnectorByIndexName } from '@kbn/search-connectors'; + import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; -import { SyncStatus } from '../../../common/types/connectors'; -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { fetchIndex } from './fetch_index'; -jest.mock('../connectors/fetch_connectors', () => ({ +jest.mock('@kbn/search-connectors', () => ({ + SyncStatus: { + CANCELED: 'canceled', + CANCELING: 'canceling', + COMPLETED: 'completed', + ERROR: 'error', + IN_PROGRESS: 'in_progress', + PENDING: 'pending', + SUSPENDED: 'suspended', + }, fetchConnectorByIndexName: jest.fn(), })); @@ -35,10 +44,7 @@ describe('fetchIndex lib function', () => { }, search: jest.fn().mockReturnValue({ hits: { - hits: [ - { _source: { status: SyncStatus.IN_PROGRESS } }, - { _source: { status: SyncStatus.PENDING } }, - ], + hits: [{ _source: { status: 'in_progress' } }, { _source: { status: 'pending' } }], }, }), }, @@ -111,10 +117,7 @@ describe('fetchIndex lib function', () => { it('should return data and stats for index and connector if connector is present', async () => { mockClient.asCurrentUser.search.mockReturnValue({ hits: { - hits: [ - { _source: { status: SyncStatus.CANCELED } }, - { _source: { status: SyncStatus.PENDING } }, - ], + hits: [{ _source: { status: 'canceled' } }, { _source: { status: 'pending' } }], }, }); mockClient.asCurrentUser.indices.get.mockImplementation(() => @@ -169,10 +172,7 @@ describe('fetchIndex lib function', () => { mockClient.asCurrentUser.count.mockReturnValue({ count: 0 }); mockClient.asCurrentUser.search.mockReturnValue({ hits: { - hits: [ - { _source: { status: SyncStatus.IN_PROGRESS } }, - { _source: { status: SyncStatus.COMPLETED } }, - ], + hits: [{ _source: { status: 'in_progress' } }, { _source: { status: 'completed' } }], }, }); mockClient.asCurrentUser.indices.get.mockImplementation(() => diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts index 4233f8abbeff1..41875daad3717 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_index.ts @@ -7,13 +7,18 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_JOBS_INDEX } from '../..'; +import {} from '../..'; + +import { + CONNECTORS_JOBS_INDEX, + ConnectorSyncJobDocument, + fetchConnectorByIndexName, + SyncStatus, +} from '@kbn/search-connectors'; import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../common/constants'; -import { ConnectorSyncJobDocument, SyncStatus } from '../../../common/types/connectors'; import { ElasticsearchIndexWithIngestion } from '../../../common/types/indices'; import { isIndexNotFoundException } from '../../utils/identify_exceptions'; -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../crawler/fetch_crawlers'; import { mapIndexStats } from './utils/map_index_stats'; @@ -69,7 +74,7 @@ export const fetchIndex = async ( } const indexStats = indices[index]; - const connector = await fetchConnectorByIndexName(client, index); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, index); const hasInProgressSyncsResult = connector ? await hasInProgressSyncs(client, connector.id) : { inProgress: false, pending: false }; diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts index 00188b37d334a..a28450108290a 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.test.ts @@ -7,7 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; +import { CONNECTORS_INDEX } from '@kbn/search-connectors'; import { generateApiKey } from './generate_api_key'; diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts index f29dc327dfecc..d256bc6a91d88 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/generate_api_key.ts @@ -7,8 +7,8 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; -import { ConnectorDocument } from '../../../common/types/connectors'; +import { ConnectorDocument, CONNECTORS_INDEX } from '@kbn/search-connectors'; + import { toAlphanumeric } from '../../../common/utils/to_alphanumeric'; export const generateApiKey = async (client: IScopedClusterClient, indexName: string) => { diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts index c13ee2571b82b..66619b99ef96e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_default_pipeline.ts @@ -7,11 +7,11 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; +import { CURRENT_CONNECTORS_INDEX, IngestPipelineParams } from '@kbn/search-connectors'; + import { DEFAULT_PIPELINE_VALUES } from '../../../common/constants'; import { DefaultConnectorsPipelineMeta } from '../../../common/constants'; -import { IngestPipelineParams } from '../../../common/types/connectors'; import { isIndexNotFoundException } from '../../utils/identify_exceptions'; export const getDefaultPipeline = async ( diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts index 45813a109de76..54a916898740e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/get_index_pipeline.ts @@ -6,9 +6,7 @@ */ import { IScopedClusterClient } from '@kbn/core/server'; - -import { IngestPipelineParams } from '../../../common/types/connectors'; -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; +import { IngestPipelineParams, fetchConnectorByIndexName } from '@kbn/search-connectors'; import { getDefaultPipeline } from './get_default_pipeline'; @@ -20,7 +18,7 @@ export const getIndexPipelineParameters = async ( // we want to throw the error if getDefaultPipeline() fails so we're not catching it on purpose const [defaultPipeline, connector, customPipelineResp] = await Promise.all([ getDefaultPipeline(client), - fetchConnectorByIndexName(client, indexName), + fetchConnectorByIndexName(client.asCurrentUser, indexName), client.asCurrentUser.ingest .getPipeline({ id: `${indexName}`, @@ -30,11 +28,7 @@ export const getIndexPipelineParameters = async ( if (connector && connector.pipeline) { return connector.pipeline; } - let pipelineName = defaultPipeline.name; - - if (customPipelineResp && customPipelineResp[indexName]) { - pipelineName = indexName; - } + const pipelineName = customPipelineResp?.[indexName] ? indexName : defaultPipeline.name; return { ...defaultPipeline, diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts index 60a9e5cfcf97d..297456b9c00e7 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/revert_custom_pipeline.ts @@ -7,16 +7,14 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; - -import { fetchConnectorByIndexName } from '../connectors/fetch_connectors'; +import { CONNECTORS_INDEX, fetchConnectorByIndexName } from '@kbn/search-connectors'; import { deleteIndexPipelines } from './delete_pipelines'; import { getDefaultPipeline } from './get_default_pipeline'; export const revertCustomPipeline = async (client: IScopedClusterClient, indexName: string) => { - const connector = await fetchConnectorByIndexName(client, indexName); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, indexName); if (connector) { const pipeline = await getDefaultPipeline(client); await client.asCurrentUser.update({ diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts index 060c0edc88316..73e7e85f53d32 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_default_pipeline.ts @@ -7,10 +7,9 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '../..'; +import { CURRENT_CONNECTORS_INDEX, IngestPipelineParams } from '@kbn/search-connectors'; import { DefaultConnectorsPipelineMeta } from '../../../common/constants'; -import { IngestPipelineParams } from '../../../common/types/connectors'; export const updateDefaultPipeline = async ( client: IScopedClusterClient, diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts index 1acc91f7e2684..f8a9ef82453cb 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/update_pipeline.ts @@ -7,9 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX } from '../..'; - -import { IngestPipelineParams } from '../../../common/types/connectors'; +import { CONNECTORS_INDEX, IngestPipelineParams } from '@kbn/search-connectors'; export const updateConnectorPipeline = async ( client: IScopedClusterClient, diff --git a/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts b/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts index a19315507bf4c..0cf096bcd9d53 100644 --- a/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts +++ b/x-pack/plugins/enterprise_search/server/lib/stats/get_sync_jobs.ts @@ -9,10 +9,15 @@ import moment from 'moment'; import { IScopedClusterClient } from '@kbn/core/server'; -import { CONNECTORS_INDEX, CONNECTORS_JOBS_INDEX } from '../..'; +import { + CONNECTORS_INDEX, + CONNECTORS_JOBS_INDEX, + ConnectorStatus, + SyncStatus, +} from '@kbn/search-connectors'; + import { SyncJobsStats } from '../../../common/stats'; -import { ConnectorStatus, SyncStatus } from '../../../common/types/connectors'; import { isIndexNotFoundException } from '../../utils/identify_exceptions'; export const fetchSyncJobsStats = async (client: IScopedClusterClient): Promise => { diff --git a/x-pack/plugins/enterprise_search/server/plugin.ts b/x-pack/plugins/enterprise_search/server/plugin.ts index ed6ef8f3886bf..154a7192d35f0 100644 --- a/x-pack/plugins/enterprise_search/server/plugin.ts +++ b/x-pack/plugins/enterprise_search/server/plugin.ts @@ -15,8 +15,6 @@ import { IRouter, KibanaRequest, DEFAULT_APP_CATEGORIES, - IClusterClient, - CoreStart, } from '@kbn/core/server'; import { CustomIntegrationsPluginSetup } from '@kbn/custom-integrations-plugin/server'; import { DataPluginStart } from '@kbn/data-plugin/server/plugin'; @@ -51,7 +49,6 @@ import { databaseSearchGuideConfig, } from '../common/guided_onboarding/search_guide_config'; -import { ConnectorsService } from './api/connectors_service'; import { registerTelemetryUsageCollector as registerASTelemetryUsageCollector } from './collectors/app_search/telemetry'; import { registerTelemetryUsageCollector as registerESTelemetryUsageCollector } from './collectors/enterprise_search/telemetry'; import { registerTelemetryUsageCollector as registerWSTelemetryUsageCollector } from './collectors/workplace_search/telemetry'; @@ -103,10 +100,6 @@ interface PluginsStart { spaces?: SpacesPluginStart; } -export interface EnterpriseSearchPluginStart { - connectorsService: ConnectorsService; -} - export interface RouteDependencies { config: ConfigType; enterpriseSearchRequestHandler: IEnterpriseSearchRequestHandler; @@ -116,14 +109,12 @@ export interface RouteDependencies { router: IRouter; } -export class EnterpriseSearchPlugin implements Plugin { +export class EnterpriseSearchPlugin implements Plugin { private readonly config: ConfigType; private readonly logger: Logger; - private clusterClient?: IClusterClient; /** * Exposed services */ - private connectorsService?: ConnectorsService; constructor(initializerContext: PluginInitializerContext) { this.config = initializerContext.config.get(); @@ -259,7 +250,6 @@ export class EnterpriseSearchPlugin implements Plugin { - this.clusterClient = coreStart.elasticsearch.client; savedObjectsStarted = coreStart.savedObjects; if (usageCollection) { @@ -322,26 +312,7 @@ export class EnterpriseSearchPlugin implements Plugin({ - connectorsService: this.connectorsService, - }); - } + public start() {} public stop() {} } diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts index 923009c05d098..fea646d9d726e 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts @@ -6,8 +6,18 @@ */ import { schema } from '@kbn/config-schema'; - import { i18n } from '@kbn/i18n'; +import { + fetchSyncJobsByConnectorId, + putUpdateNative, + updateConnectorConfiguration, + updateConnectorNameAndDescription, + updateConnectorScheduling, + updateConnectorServiceType, + updateConnectorStatus, + updateFiltering, + updateFilteringDraft, +} from '@kbn/search-connectors'; import { ConnectorStatus, @@ -15,21 +25,12 @@ import { FilteringRule, FilteringRuleRule, SyncJobType, -} from '../../../common/types/connectors'; +} from '@kbn/search-connectors'; +import { cancelSyncs } from '@kbn/search-connectors/lib/cancel_syncs'; import { ErrorCode } from '../../../common/types/error_codes'; import { addConnector } from '../../lib/connectors/add_connector'; -import { fetchSyncJobsByConnectorId } from '../../lib/connectors/fetch_sync_jobs'; -import { cancelSyncs } from '../../lib/connectors/post_cancel_syncs'; -import { updateFiltering } from '../../lib/connectors/put_update_filtering'; -import { updateFilteringDraft } from '../../lib/connectors/put_update_filtering_draft'; -import { putUpdateNative } from '../../lib/connectors/put_update_native'; -import { startConnectorSync } from '../../lib/connectors/start_sync'; -import { updateConnectorConfiguration } from '../../lib/connectors/update_connector_configuration'; -import { updateConnectorNameAndDescription } from '../../lib/connectors/update_connector_name_and_description'; -import { updateConnectorScheduling } from '../../lib/connectors/update_connector_scheduling'; -import { updateConnectorServiceType } from '../../lib/connectors/update_connector_service_type'; -import { updateConnectorStatus } from '../../lib/connectors/update_connector_status'; +import { startSync } from '../../lib/connectors/start_sync'; import { getDefaultPipeline } from '../../lib/pipelines/get_default_pipeline'; import { updateDefaultPipeline } from '../../lib/pipelines/update_default_pipeline'; import { updateConnectorPipeline } from '../../lib/pipelines/update_pipeline'; @@ -98,7 +99,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await cancelSyncs(client, request.params.connectorId); + await cancelSyncs(client.asCurrentUser, request.params.connectorId); return response.ok(); }) ); @@ -119,7 +120,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const configuration = await updateConnectorConfiguration( - client, + client.asCurrentUser, request.params.connectorId, request.body ); @@ -143,7 +144,11 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await updateConnectorScheduling(client, request.params.connectorId, request.body); + await updateConnectorScheduling( + client.asCurrentUser, + request.params.connectorId, + request.body + ); return response.ok(); }) ); @@ -162,7 +167,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await startConnectorSync( + await startSync( client, request.params.connectorId, SyncJobType.FULL, @@ -183,7 +188,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await startConnectorSync(client, request.params.connectorId, SyncJobType.INCREMENTAL); + await startSync(client, request.params.connectorId, SyncJobType.INCREMENTAL); return response.ok(); }) ); @@ -199,7 +204,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - await startConnectorSync(client, request.params.connectorId, SyncJobType.ACCESS_CONTROL); + await startSync(client, request.params.connectorId, SyncJobType.ACCESS_CONTROL); return response.ok(); }) ); @@ -221,7 +226,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const result = await fetchSyncJobsByConnectorId( - client, + client.asCurrentUser, request.params.connectorId, request.query.from, request.query.size, @@ -298,7 +303,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const result = await updateConnectorServiceType( - client, + client.asCurrentUser, request.params.connectorId, request.body.serviceType ); @@ -319,7 +324,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const result = await updateConnectorStatus( - client, + client.asCurrentUser, request.params.connectorId, request.body.status as ConnectorStatus ); @@ -343,10 +348,14 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; const { name, description } = request.body; - const result = await updateConnectorNameAndDescription(client, request.params.connectorId, { - description, - name, - }); + const result = await updateConnectorNameAndDescription( + client.asCurrentUser, + request.params.connectorId, + { + description, + name, + } + ); return response.ok({ body: result }); }) ); @@ -383,7 +392,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { const { client } = (await context.core).elasticsearch; const { connectorId } = request.params; const { advanced_snippet, filtering_rules } = request.body; - const result = await updateFilteringDraft(client, connectorId, { + const result = await updateFilteringDraft(client.asCurrentUser, connectorId, { advancedSnippet: advanced_snippet, // Have to cast here because our API schema validator doesn't know how to deal with enums // We're relying on the schema in the validator above to flag if something goes wrong @@ -425,7 +434,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { const { client } = (await context.core).elasticsearch; const { connectorId } = request.params; const { advanced_snippet, filtering_rules } = request.body; - const result = await updateFiltering(client, connectorId, { + const result = await updateFiltering(client.asCurrentUser, connectorId, { advancedSnippet: advanced_snippet, // Have to cast here because our API schema validator doesn't know how to deal with enums // We're relying on the schema in the validator above to flag if something goes wrong @@ -450,7 +459,7 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { const { client } = (await context.core).elasticsearch; const connectorId = decodeURIComponent(request.params.connectorId); const { is_native } = request.body; - const result = await putUpdateNative(client, connectorId, is_native); + const result = await putUpdateNative(client.asCurrentUser, connectorId, is_native); return result ? response.ok({ body: result }) : response.conflict(); }) ); diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts index c5c45806e560f..18a1c5aa8bca6 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts @@ -9,12 +9,12 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; +import { deleteConnectorById, fetchConnectorByIndexName } from '@kbn/search-connectors'; + import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; import { ErrorCode } from '../../../../common/types/error_codes'; import { addConnector } from '../../../lib/connectors/add_connector'; -import { deleteConnectorById } from '../../../lib/connectors/delete_connector'; -import { fetchConnectorByIndexName } from '../../../lib/connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../../../lib/crawler/fetch_crawlers'; import { recreateConnectorDocument } from '../../../lib/crawler/post_connector'; import { updateHtmlExtraction } from '../../../lib/crawler/put_html_extraction'; @@ -83,7 +83,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { }); } - const connector = await fetchConnectorByIndexName(client, request.body.index_name); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.body.index_name + ); if (connector) { return createError({ errorCode: ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS, @@ -110,9 +113,12 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { return res; } catch (error) { // clean up connector index if it was created - const createdConnector = await fetchConnectorByIndexName(client, request.body.index_name); + const createdConnector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.body.index_name + ); if (createdConnector) { - await deleteConnectorById(client, createdConnector.id); + await deleteConnectorById(client.asCurrentUser, createdConnector.id); if (createdConnector.index_name) { await deleteIndex(client, createdConnector.index_name); } @@ -410,7 +416,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - const connector = await fetchConnectorByIndexName(client, request.params.indexName); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.params.indexName + ); if ( connector && connector.service_type === ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE @@ -444,7 +453,10 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { }, elasticsearchErrorHandler(log, async (context, request, response) => { const { client } = (await context.core).elasticsearch; - const connector = await fetchConnectorByIndexName(client, request.params.indexName); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.params.indexName + ); if (connector) { return createError({ errorCode: ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS, diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts index 25342217e5192..cc031bd3ef684 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts @@ -14,15 +14,18 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; +import { deleteConnectorById } from '@kbn/search-connectors'; +import { + fetchConnectorByIndexName, + fetchConnectors, +} from '@kbn/search-connectors/lib/fetch_connectors'; + import { DEFAULT_PIPELINE_NAME } from '../../../common/constants'; import { ErrorCode } from '../../../common/types/error_codes'; import { AlwaysShowPattern } from '../../../common/types/indices'; import type { AttachMlInferencePipelineResponse } from '../../../common/types/pipelines'; -import { deleteConnectorById } from '../../lib/connectors/delete_connector'; - -import { fetchConnectorByIndexName, fetchConnectors } from '../../lib/connectors/fetch_connectors'; import { fetchCrawlerByIndexName, fetchCrawlers } from '../../lib/crawler/fetch_crawlers'; import { createIndex } from '../../lib/indices/create_index'; @@ -113,7 +116,7 @@ export function registerIndexRoutes({ from, size ); - const connectors = await fetchConnectors(client, indexNames); + const connectors = await fetchConnectors(client.asCurrentUser, indexNames); const crawlers = await fetchCrawlers(client, indexNames); const enrichedIndices = indices.map((index) => ({ ...index, @@ -186,7 +189,7 @@ export function registerIndexRoutes({ try { const crawler = await fetchCrawlerByIndexName(client, indexName); - const connector = await fetchConnectorByIndexName(client, indexName); + const connector = await fetchConnectorByIndexName(client.asCurrentUser, indexName); if (crawler) { const crawlerRes = await enterpriseSearchRequestHandler.createRequest({ @@ -199,7 +202,7 @@ export function registerIndexRoutes({ } if (connector) { - await deleteConnectorById(client, connector.id); + await deleteConnectorById(client.asCurrentUser, connector.id); } await deleteIndexPipelines(client, indexName); @@ -575,7 +578,10 @@ export function registerIndexRoutes({ }); } - const connector = await fetchConnectorByIndexName(client, request.body.index_name); + const connector = await fetchConnectorByIndexName( + client.asCurrentUser, + request.body.index_name + ); if (connector) { return createError({ diff --git a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts index 0869a16b79dc7..3f98b5368c7d2 100644 --- a/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts +++ b/x-pack/plugins/enterprise_search/server/utils/search_result_provider.ts @@ -11,11 +11,9 @@ import { IBasePath } from '@kbn/core-http-server'; import { GlobalSearchResultProvider } from '@kbn/global-search-plugin/server'; import { i18n } from '@kbn/i18n'; +import { CONNECTOR_DEFINITIONS, ConnectorServerSideDefinition } from '@kbn/search-connectors'; + import { ConfigType } from '..'; -import { - CONNECTOR_DEFINITIONS, - ConnectorServerSideDefinition, -} from '../../common/connectors/connectors'; import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, ENTERPRISE_SEARCH_CONTENT_PLUGIN, diff --git a/x-pack/plugins/enterprise_search/tsconfig.json b/x-pack/plugins/enterprise_search/tsconfig.json index 25cc264924d47..4195acec083ff 100644 --- a/x-pack/plugins/enterprise_search/tsconfig.json +++ b/x-pack/plugins/enterprise_search/tsconfig.json @@ -11,7 +11,6 @@ "common/**/*", "public/**/*", "server/**/*", - "../../../typings/**/*", ], "kbn_references": [ "@kbn/core", @@ -61,7 +60,7 @@ "@kbn/global-search-plugin", "@kbn/logs-shared-plugin", "@kbn/share-plugin", - "@kbn/core-saved-objects-migration-server-internal", "@kbn/search-api-panels", + "@kbn/search-connectors" ] } diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc index d056148e3aa79..bcf4cc540df14 100644 --- a/x-pack/plugins/serverless_search/kibana.jsonc +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -7,14 +7,17 @@ "id": "serverlessSearch", "server": true, "browser": true, - "configPath": ["xpack", "serverless", "search"], + "configPath": [ + "xpack", + "serverless", + "search" + ], "requiredPlugins": [ "cloud", "console", "dashboard", "devTools", "discover", - "enterpriseSearch", "grokdebugger", "management", "ml", @@ -26,6 +29,8 @@ "visualizations" ], "optionalPlugins": [], - "requiredBundles": ["kibanaReact"] + "requiredBundles": [ + "kibanaReact" + ] } } diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx index 97a3b5887389f..540c78ac521ab 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx @@ -17,13 +17,12 @@ import { EuiTitle, EuiToolTip, } from '@elastic/eui'; -import { Connector } from '@kbn/enterprise-search-plugin/common/types/connectors'; +import { Connector, ConnectorServerSideDefinition } from '@kbn/search-connectors'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { useQuery } from '@tanstack/react-query'; import React from 'react'; -import { ConnectorServerSideDefinition } from '@kbn/enterprise-search-plugin/common/connectors/connectors'; import { LEARN_MORE_LABEL } from '../../../common/i18n_string'; import { PLUGIN_ID } from '../../../common'; import { useKibanaServices } from '../hooks/use_kibana'; diff --git a/x-pack/plugins/serverless_search/public/application/components/overview.tsx b/x-pack/plugins/serverless_search/public/application/components/overview.tsx index ddcc4e08cce13..a01ebdb941eda 100644 --- a/x-pack/plugins/serverless_search/public/application/components/overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/overview.tsx @@ -38,7 +38,7 @@ import type { LanguageDefinitionSnippetArguments, } from '@kbn/search-api-panels'; import { useQuery } from '@tanstack/react-query'; -import { Connector } from '@kbn/enterprise-search-plugin/common/types/connectors'; +import { Connector } from '@kbn/search-connectors'; import { docLinks } from '../../../common/doc_links'; import { PLUGIN_ID } from '../../../common'; import { useKibanaServices } from '../hooks/use_kibana'; diff --git a/x-pack/plugins/serverless_search/server/plugin.ts b/x-pack/plugins/serverless_search/server/plugin.ts index 2798a4333d35c..693cdc1e7035e 100644 --- a/x-pack/plugins/serverless_search/server/plugin.ts +++ b/x-pack/plugins/serverless_search/server/plugin.ts @@ -13,7 +13,6 @@ import type { CoreSetup, } from '@kbn/core/server'; import type { SecurityPluginStart } from '@kbn/security-plugin/server'; -import { EnterpriseSearchPluginStart } from '@kbn/enterprise-search-plugin/server'; import { registerApiKeyRoutes } from './routes/api_key_routes'; import { registerIndicesRoutes } from './routes/indices_routes'; @@ -27,9 +26,9 @@ import type { import { registerConnectorsRoutes } from './routes/connectors_routes'; export interface RouteDependencies { + http: CoreSetup['http']; logger: Logger; router: IRouter; - search: EnterpriseSearchPluginStart; security: SecurityPluginStart; } @@ -46,7 +45,6 @@ export class ServerlessSearchPlugin private readonly config: ServerlessSearchConfig; private readonly logger: Logger; private security?: SecurityPluginStart; - private enterpriseSearch?: EnterpriseSearchPluginStart; constructor(initializerContext: PluginInitializerContext) { this.config = initializerContext.config.get(); @@ -58,13 +56,12 @@ export class ServerlessSearchPlugin pluginsSetup: SetupDependencies ) { const router = http.createRouter(); - getStartServices().then(([, { enterpriseSearch, security }]) => { + getStartServices().then(([, { security }]) => { this.security = security; - this.enterpriseSearch = enterpriseSearch; const dependencies = { + http, logger: this.logger, router, - search: this.enterpriseSearch, security: this.security, }; diff --git a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts index c74c18f6d7414..766564bb9eaa7 100644 --- a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts +++ b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts @@ -5,16 +5,18 @@ * 2.0. */ +import { CONNECTOR_DEFINITIONS, fetchConnectors } from '@kbn/search-connectors'; import { RouteDependencies } from '../plugin'; -export const registerConnectorsRoutes = ({ router, search, security }: RouteDependencies) => { +export const registerConnectorsRoutes = ({ http, router }: RouteDependencies) => { router.get( { path: '/internal/serverless_search/connectors', validate: {}, }, async (context, request, response) => { - const connectors = await search.connectorsService.getConnectors(request); + const { client } = (await context.core).elasticsearch; + const connectors = await fetchConnectors(client.asCurrentUser); return response.ok({ body: { @@ -31,7 +33,14 @@ export const registerConnectorsRoutes = ({ router, search, security }: RouteDepe validate: {}, }, async (context, request, response) => { - const connectors = await search.connectorsService.getConnectorTypes(); + const connectors = CONNECTOR_DEFINITIONS.map((connector) => ({ + ...connector, + iconPath: connector.iconPath + ? http.basePath.prepend( + `/plugins/enterpriseSearch/assets/source_icons/${connector.iconPath}` + ) + : 'logoEnterpriseSearch', + })); return response.ok({ body: { diff --git a/x-pack/plugins/serverless_search/server/types.ts b/x-pack/plugins/serverless_search/server/types.ts index 38100d36f330e..8e8f7f15a8124 100644 --- a/x-pack/plugins/serverless_search/server/types.ts +++ b/x-pack/plugins/serverless_search/server/types.ts @@ -6,7 +6,6 @@ */ import type { SecurityPluginStart } from '@kbn/security-plugin/server'; -import type { EnterpriseSearchPluginStart } from '@kbn/enterprise-search-plugin/server'; import type { MlPluginSetup } from '@kbn/ml-plugin/server'; // eslint-disable-next-line @typescript-eslint/no-empty-interface @@ -15,7 +14,6 @@ export interface ServerlessSearchPluginSetup {} export interface ServerlessSearchPluginStart {} export interface StartDependencies { - enterpriseSearch: EnterpriseSearchPluginStart; security: SecurityPluginStart; } export interface SetupDependencies { diff --git a/x-pack/plugins/serverless_search/tsconfig.json b/x-pack/plugins/serverless_search/tsconfig.json index 1187c90cd1a79..c149beabd33ec 100644 --- a/x-pack/plugins/serverless_search/tsconfig.json +++ b/x-pack/plugins/serverless_search/tsconfig.json @@ -17,7 +17,6 @@ "kbn_references": [ "@kbn/core", "@kbn/config-schema", - "@kbn/enterprise-search-plugin", "@kbn/management-plugin", "@kbn/shared-ux-chrome-navigation", "@kbn/doc-links", @@ -34,5 +33,6 @@ "@kbn/search-api-panels", "@kbn/core-lifecycle-browser", "@kbn/react-kibana-context-theme", + "@kbn/search-connectors", ] } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index e320b5a24c8be..14688c6898e1f 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -2299,36 +2299,7 @@ "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "Afficher les documents alentour", "discover.documentsAriaLabel": "Documents", "discover.documentsErrorTitle": "Erreur lors de la recherche", - "unifiedDocViewer.docView.table.actions.label": "Actions", - "unifiedDocViewer.docView.table.actions.open": "Actions ouvertes", - "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "Une ou plusieurs valeurs dans ce champ sont trop longues et ne peuvent pas être recherchées ni filtrées.", - "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "Ce champ comporte une ou plusieurs valeurs mal formées qui ne peuvent pas être recherchées ni filtrées.", - "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "Une ou plusieurs valeurs dans ce champ ont été ignorées par Elasticsearch et ne peuvent pas être recherchées ni filtrées.", - "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "La valeur dans ce champ est trop longue et ne peut pas être recherchée ni filtrée.", - "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "La valeur dans ce champ est mal formée et ne peut pas être recherchée ni filtrée.", - "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "La valeur dans ce champ a été ignorée par Elasticsearch et ne peut pas être recherchée ni filtrée.", - "unifiedDocViewer.docView.table.searchPlaceHolder": "Rechercher les noms de champs", - "unifiedDocViewer.docViews.json.jsonTitle": "JSON", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "Filtrer sur le champ", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "Filtrer sur le champ", - "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "Filtrer sur la valeur", - "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "Filtrer sur la valeur", - "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "Exclure la valeur", - "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "Exclure la valeur", - "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "Contient des valeurs ignorées", - "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "Valeur ignorée", - "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "Épingler le champ", - "unifiedDocViewer.docViews.table.pinFieldLabel": "Épingler le champ", "discover.docViews.table.scoreSortWarningTooltip": "Filtrez sur _score pour pouvoir récupérer les valeurs correspondantes.", - "unifiedDocViewer.docViews.table.tableTitle": "Tableau", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "Afficher/Masquer la colonne dans le tableau", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "Afficher/Masquer la colonne dans le tableau", - "unifiedDocViewer.fieldChooser.discoverField.name": "Afficher/Masquer les détails du champ", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "Impossible de filtrer sur les champs méta", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "Impossible de filtrer sur les champs scriptés", - "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "Les champs non indexés ou les valeurs ignorées ne peuvent pas être recherchés", - "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "Désépingler le champ", - "unifiedDocViewer.docViews.table.unpinFieldLabel": "Désépingler le champ", "discover.dropZoneTableLabel": "Abandonner la zone pour ajouter un champ en tant que colonne dans la table", "discover.dscTour.stepAddFields.imageAltText": "Dans la liste Champs disponibles, cliquez sur l'icône Plus pour afficher/masquer un champ dans le tableau de documents.", "discover.dscTour.stepAddFields.title": "Ajouter des champs dans le tableau", @@ -2349,13 +2320,8 @@ "discover.embeddable.search.displayName": "rechercher", "discover.errorCalloutShowErrorMessage": "Afficher les détails", "discover.fieldChooser.availableFieldsTooltip": "Champs disponibles pour l'affichage dans le tableau.", - "unifiedDocViewer.fieldChooser.discoverField.actions": "Actions", "discover.fieldChooser.discoverField.addFieldTooltip": "Ajouter le champ en tant que colonne", - "unifiedDocViewer.fieldChooser.discoverField.multiField": "champ multiple", - "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "Les champs multiples peuvent avoir plusieurs valeurs.", - "unifiedDocViewer.fieldChooser.discoverField.name": "Champ", "discover.fieldChooser.discoverField.removeFieldTooltip": "Supprimer le champ du tableau", - "unifiedDocViewer.fieldChooser.discoverField.value": "Valeur", "discover.goToDiscoverButtonText": "Aller à Discover", "discover.grid.flyout.documentNavigation": "Navigation dans le document", "discover.grid.flyout.toastColumnAdded": "La colonne \"{columnName}\" a été ajoutée.", @@ -2371,10 +2337,8 @@ "discover.inspectorRequestDescriptionDocument": "Cette requête interroge Elasticsearch afin de récupérer les documents.", "discover.invalidFiltersWarnToast.description": "Les références d'ID de la vue de données dans certains filtres appliqués diffèrent de la vue de données actuelle.", "discover.invalidFiltersWarnToast.title": "Références d'index différentes", - "unifiedDocViewer.json.codeEditorAriaLabel": "Affichage JSON en lecture seule d’un document Elasticsearch", - "unifiedDocViewer.json.copyToClipboardLabel": "Copier dans le presse-papiers", "discover.loadingDocuments": "Chargement des documents", - "unifiedDocViewer.loadingJSON": "Chargement de JSON", + "discover.loadingResults": "Chargement des résultats", "discover.localMenu.alertsDescription": "Alertes", "discover.localMenu.fallbackReportTitle": "Recherche Discover sans titre", "discover.localMenu.inspectTitle": "Inspecter", @@ -2431,9 +2395,6 @@ "discover.serverLocatorExtension.titleFromLocatorUnknown": "Recherche inconnue", "discover.singleDocRoute.errorTitle": "Une erreur s'est produite", "discover.skipToBottomButtonLabel": "Atteindre la fin du tableau", - "unifiedDocViewer.sourceViewer.errorMessage": "Impossible de récupérer les données pour le moment. Actualisez l'onglet et réessayez.", - "unifiedDocViewer.sourceViewer.errorMessageTitle": "Une erreur s'est produite.", - "unifiedDocViewer.sourceViewer.refresh": "Actualiser", "discover.toggleSidebarAriaLabel": "Activer/Désactiver la barre latérale", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "Gérer les recherches", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "Aucune recherche correspondante trouvée.", @@ -2450,25 +2411,73 @@ "discover.viewAlert.searchSourceErrorTitle": "Erreur lors de la récupération de la source de recherche", "discover.viewModes.document.label": "Documents", "discover.viewModes.fieldStatistics.label": "Statistiques de champ", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} – Ce champ représente l'heure à laquelle les événements se sont produits.", - "unifiedDataTable.searchGenerationWithDescription": "Tableau généré par la recherche {searchTitle}", - "unifiedDataTable.searchGenerationWithDescriptionGrid": "Tableau généré par la recherche {searchTitle} ({searchDescription})", - "unifiedDataTable.selectedDocumentsNumber": "{nr} documents sélectionnés", - "unifiedDataTable.clearSelection": "Effacer la sélection", - "unifiedDataTable.controlColumnHeader": "Colonne de commande", - "unifiedDataTable.copyToClipboardJSON": "Copier les documents dans le presse-papiers (JSON)", - "unifiedDataTable.tableHeader.timeFieldIconTooltip": "Ce champ représente l'heure à laquelle les événements se sont produits.", - "unifiedDataTable.grid.copyColumnNameToClipBoardButton": "Copier le nom", - "unifiedDataTable.grid.copyColumnValuesToClipBoardButton": "Copier la colonne", - "unifiedDataTable.grid.documentHeader": "Document", - "unifiedDataTable.grid.editFieldButton": "Modifier le champ de la vue de données", - "unifiedDataTable.grid.selectDoc": "Sélectionner le document \"{rowNumber}\"", - "unifiedDataTable.loadingResults": "Chargement des résultats", - "unifiedDataTable.noResultsFound": "Résultat introuvable", - "unifiedDataTable.removeColumnLabel": "Supprimer la colonne", - "unifiedDataTable.selectColumnHeader": "Sélectionner la colonne", - "unifiedDataTable.showAllDocuments": "Afficher tous les documents", - "unifiedDataTable.showSelectedDocumentsOnly": "Afficher uniquement les documents sélectionnés", + "discover.fieldNameIcons.binaryAriaLabel": "Binaire", + "discover.fieldNameIcons.booleanAriaLabel": "Booléen", + "discover.fieldNameIcons.conflictFieldAriaLabel": "Conflit", + "discover.fieldNameIcons.counterFieldAriaLabel": "Indicateur de compteur", + "discover.fieldNameIcons.dateFieldAriaLabel": "Date", + "discover.fieldNameIcons.dateRangeFieldAriaLabel": "Plage de dates", + "discover.fieldNameIcons.denseVectorFieldAriaLabel": "Vecteur dense", + "discover.fieldNameIcons.flattenedFieldAriaLabel": "Lissé", + "discover.fieldNameIcons.gaugeFieldAriaLabel": "Indicateur de jauge", + "discover.fieldNameIcons.geoPointFieldAriaLabel": "Point géographique", + "discover.fieldNameIcons.geoShapeFieldAriaLabel": "Forme géométrique", + "discover.fieldNameIcons.histogramFieldAriaLabel": "Histogramme", + "discover.fieldNameIcons.ipAddressFieldAriaLabel": "Adresse IP", + "discover.fieldNameIcons.ipRangeFieldAriaLabel": "Plage d'IP", + "discover.fieldNameIcons.keywordFieldAriaLabel": "Mot-clé", + "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", + "discover.fieldNameIcons.nestedFieldAriaLabel": "Imbriqué", + "discover.fieldNameIcons.numberFieldAriaLabel": "Nombre", + "discover.fieldNameIcons.pointFieldAriaLabel": "Point", + "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "Fonctionnalité de rang", + "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "Fonctionnalités de rang", + "discover.fieldNameIcons.recordAriaLabel": "Enregistrements", + "discover.fieldNameIcons.shapeFieldAriaLabel": "Forme", + "discover.fieldNameIcons.sourceFieldAriaLabel": "Champ source", + "discover.fieldNameIcons.stringFieldAriaLabel": "Chaîne", + "discover.fieldNameIcons.textFieldAriaLabel": "Texte", + "discover.fieldNameIcons.unknownFieldAriaLabel": "Champ inconnu", + "discover.fieldNameIcons.versionFieldAriaLabel": "Version", + "unifiedDocViewer.docView.table.actions.label": "Actions", + "unifiedDocViewer.docView.table.actions.open": "Actions ouvertes", + "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "Une ou plusieurs valeurs dans ce champ sont trop longues et ne peuvent pas être recherchées ni filtrées.", + "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "Ce champ comporte une ou plusieurs valeurs mal formées qui ne peuvent pas être recherchées ni filtrées.", + "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "Une ou plusieurs valeurs dans ce champ ont été ignorées par Elasticsearch et ne peuvent pas être recherchées ni filtrées.", + "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "La valeur dans ce champ est trop longue et ne peut pas être recherchée ni filtrée.", + "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "La valeur dans ce champ est mal formée et ne peut pas être recherchée ni filtrée.", + "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "La valeur dans ce champ a été ignorée par Elasticsearch et ne peut pas être recherchée ni filtrée.", + "unifiedDocViewer.docView.table.searchPlaceHolder": "Rechercher les noms de champs", + "unifiedDocViewer.docViews.json.jsonTitle": "JSON", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "Filtrer sur le champ", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "Filtrer sur le champ", + "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "Filtrer sur la valeur", + "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "Filtrer sur la valeur", + "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "Exclure la valeur", + "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "Exclure la valeur", + "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "Contient des valeurs ignorées", + "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "Valeur ignorée", + "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "Épingler le champ", + "unifiedDocViewer.docViews.table.pinFieldLabel": "Épingler le champ", + "unifiedDocViewer.docViews.table.tableTitle": "Tableau", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "Afficher/Masquer la colonne dans le tableau", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "Afficher/Masquer la colonne dans le tableau", + "unifiedDocViewer.fieldChooser.discoverField.name": "Champ", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "Impossible de filtrer sur les champs méta", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "Impossible de filtrer sur les champs scriptés", + "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "Les champs non indexés ou les valeurs ignorées ne peuvent pas être recherchés", + "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "Désépingler le champ", + "unifiedDocViewer.docViews.table.unpinFieldLabel": "Désépingler le champ", + "unifiedDocViewer.fieldChooser.discoverField.actions": "Actions", + "unifiedDocViewer.fieldChooser.discoverField.multiField": "champ multiple", + "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "Les champs multiples peuvent avoir plusieurs valeurs.", + "unifiedDocViewer.fieldChooser.discoverField.value": "Valeur", + "unifiedDocViewer.json.codeEditorAriaLabel": "Affichage JSON en lecture seule d’un document Elasticsearch", + "unifiedDocViewer.json.copyToClipboardLabel": "Copier dans le presse-papiers", + "unifiedDocViewer.loadingJSON": "Chargement de JSON", + "unifiedDocViewer.sourceViewer.errorMessage": "Impossible de récupérer les données pour le moment. Actualisez l'onglet et réessayez.", + "unifiedDocViewer.sourceViewer.errorMessageTitle": "Une erreur s'est produite.", + "unifiedDocViewer.sourceViewer.refresh": "Actualiser", "domDragDrop.announce.cancelled": "Mouvement annulé. {label} revenu à sa position initiale", "domDragDrop.announce.cancelledItem": "Mouvement annulé. {label} revenu au groupe {groupLabel} à la position {position}", "domDragDrop.announce.dropped.combineCompatible": "{label} combiné dans le groupe {groupLabel} en {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", @@ -5685,34 +5694,6 @@ "unifiedFieldList.fieldNameDescription.textField": "Texte intégral tel que le corps d'un e-mail ou la description d'un produit.", "unifiedFieldList.fieldNameDescription.unknownField": "Champ inconnu", "unifiedFieldList.fieldNameDescription.versionField": "Versions des logiciels. Prend en charge les règles de priorité de la Gestion sémantique des versions.", - "discover.fieldNameIcons.binaryAriaLabel": "Binaire", - "discover.fieldNameIcons.booleanAriaLabel": "Booléen", - "discover.fieldNameIcons.conflictFieldAriaLabel": "Conflit", - "discover.fieldNameIcons.counterFieldAriaLabel": "Indicateur de compteur", - "discover.fieldNameIcons.dateFieldAriaLabel": "Date", - "discover.fieldNameIcons.dateRangeFieldAriaLabel": "Plage de dates", - "discover.fieldNameIcons.denseVectorFieldAriaLabel": "Vecteur dense", - "discover.fieldNameIcons.flattenedFieldAriaLabel": "Lissé", - "discover.fieldNameIcons.gaugeFieldAriaLabel": "Indicateur de jauge", - "discover.fieldNameIcons.geoPointFieldAriaLabel": "Point géographique", - "discover.fieldNameIcons.geoShapeFieldAriaLabel": "Forme géométrique", - "discover.fieldNameIcons.histogramFieldAriaLabel": "Histogramme", - "discover.fieldNameIcons.ipAddressFieldAriaLabel": "Adresse IP", - "discover.fieldNameIcons.ipRangeFieldAriaLabel": "Plage d'IP", - "discover.fieldNameIcons.keywordFieldAriaLabel": "Mot-clé", - "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", - "discover.fieldNameIcons.nestedFieldAriaLabel": "Imbriqué", - "discover.fieldNameIcons.numberFieldAriaLabel": "Nombre", - "discover.fieldNameIcons.pointFieldAriaLabel": "Point", - "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "Fonctionnalité de rang", - "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "Fonctionnalités de rang", - "discover.fieldNameIcons.recordAriaLabel": "Enregistrements", - "discover.fieldNameIcons.shapeFieldAriaLabel": "Forme", - "discover.fieldNameIcons.sourceFieldAriaLabel": "Champ source", - "discover.fieldNameIcons.stringFieldAriaLabel": "Chaîne", - "discover.fieldNameIcons.textFieldAriaLabel": "Texte", - "discover.fieldNameIcons.unknownFieldAriaLabel": "Champ inconnu", - "discover.fieldNameIcons.versionFieldAriaLabel": "Version", "unifiedFieldList.fieldNameSearch.filterByNameLabel": "Rechercher les noms de champs", "unifiedFieldList.fieldPopover.addExistsFilterLabel": "Filtrer sur le champ", "unifiedFieldList.fieldPopover.deleteFieldLabel": "Supprimer le champ de la vue de données", @@ -13655,19 +13636,6 @@ "xpack.enterpriseSearch.content.ml_inference.text_embedding": "Incorporation de texte vectoriel dense", "xpack.enterpriseSearch.content.ml_inference.text_expansion": "Expansion de texte ELSER", "xpack.enterpriseSearch.content.ml_inference.zero_shot_classification": "Classification de texte Zero-Shot", - "xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name": "Stockage Blob Azure", - "xpack.enterpriseSearch.content.nativeConnectors.confluence.name": "Confluence Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.customConnector.name": "Connecteur personnalisé", - "xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "xpack.enterpriseSearch.content.nativeConnectors.jira.name": "Jira Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name": "Lecteur réseau", - "xpack.enterpriseSearch.content.nativeConnectors.oracle.name": "Oracle", - "xpack.enterpriseSearch.content.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.content.nativeConnectors.s3.name": "S3", - "xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name": "SharePoint en ligne", "xpack.enterpriseSearch.content.navTitle": "Contenu", "xpack.enterpriseSearch.content.new_index.apiDescription": "Utilisez l’API pour ajouter des documents par programme à un index Elasticsearch. Commencez par créer votre index.", "xpack.enterpriseSearch.content.new_index.apiTitle": "Nouvel index de recherche", @@ -14278,40 +14246,6 @@ "xpack.enterpriseSearch.licenseDocumentationLink": "En savoir plus sur les fonctionnalités incluses dans la licence", "xpack.enterpriseSearch.licenseManagementLink": "Gérer votre licence", "xpack.enterpriseSearch.nameLabel": "Nom", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.collectionLabel": "Collection", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.directConnectionLabel": "Connexion directe", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.hostLabel": "Nom d'hôte du serveur", - "xpack.enterpriseSearch.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.hostLabel": "Hôte", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.passwordLabel": "Mot de passe", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.schemaLabel": "Schéma", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.usernameLabel": "Nom d'utilisateur", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.validateHostLabel": "Valider l’hôte", - "xpack.enterpriseSearch.nativeConnectors.mssql.name": "Microsoft SQL", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.hostLabel": "Hôte", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.passwordLabel": "Mot de passe", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.usernameLabel": "Nom d'utilisateur", - "xpack.enterpriseSearch.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.hostLabel": "Hôte", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "ID client", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "Valeur secrète", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "Liste de sites séparées par des virgules", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "Une liste de sites séparés par des virgules dont les données doivent être ingérées. Utilisez \"*\" pour inclure tous les sites disponibles.", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "ID locataire", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "Nom du locataire", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceLabel": "Utiliser un service d’extraction de texte", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceTooltip": "Nécessite un déploiement distinct du service d’extraction de données d’Elastic. Nécessite également que les paramètres de pipeline désactivent l’extraction de texte.", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.name": "SharePoint en ligne", "xpack.enterpriseSearch.nativeLabel": "Natif", "xpack.enterpriseSearch.nav.analyticsCollections.explorerTitle": "Explorer", "xpack.enterpriseSearch.nav.analyticsCollections.integrationTitle": "Intégration", @@ -14497,9 +14431,6 @@ "xpack.enterpriseSearch.searchExperiences.navTitle": "Expériences de recherche", "xpack.enterpriseSearch.searchExperiences.productDescription": "Construisez une expérience de recherche attrayante et intuitive sans perdre votre temps à tout réinventer.", "xpack.enterpriseSearch.searchExperiences.productName": "Expériences de recherche", - "xpack.enterpriseSearch.server.connectors.configuration.error": "Connecteur introuvable", - "xpack.enterpriseSearch.server.connectors.scheduling.error": "Document introuvable", - "xpack.enterpriseSearch.server.connectors.serviceType.error": "Document introuvable", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionExistsError": "Le nom de collection existe déjà. Choisissez un autre nom.", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionNotFoundErrorMessage": "Collection d'analyses introuvable", "xpack.enterpriseSearch.server.routes.addConnector.connectorExistsError": "Le connecteur ou l'index existe déjà", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 26fa98a750f8d..6849a96b4bd4a 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2314,36 +2314,7 @@ "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "周りのドキュメントを表示", "discover.documentsAriaLabel": "ドキュメント", "discover.documentsErrorTitle": "検索エラー", - "unifiedDocViewer.docView.table.actions.label": "アクション", - "unifiedDocViewer.docView.table.actions.open": "アクションを開く", - "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "このフィールドの1つ以上の値が長すぎるため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "このフィールドは、検索またはフィルタリングできない正しくない形式の値が1つ以上あります。", - "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "このフィールドの1つ以上の値がElasticsearchによって無視されたため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "このフィールドの値が長すぎるため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "このフィールドの値の形式が正しくないため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "このフィールドの値はElasticsearchによって無視されたため、検索またはフィルタリングできません。", - "unifiedDocViewer.docView.table.searchPlaceHolder": "検索フィールド名", - "unifiedDocViewer.docViews.json.jsonTitle": "JSON", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "フィールド表示のフィルター", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "フィールド表示のフィルター", - "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "値でフィルター", - "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "値でフィルター", - "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "値を除外", - "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "値を除外", - "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "無視された値を含む", - "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "無視された値", - "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "フィールドを固定", - "unifiedDocViewer.docViews.table.pinFieldLabel": "フィールドを固定", "discover.docViews.table.scoreSortWarningTooltip": "_scoreの値を取得するには、並べ替える必要があります。", - "unifiedDocViewer.docViews.table.tableTitle": "表", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "表の列を切り替える", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "表の列を切り替える", - "unifiedDocViewer.fieldChooser.discoverField.name": "フィールド詳細を切り替える", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "メタフィールドの有無でフィルタリングできません", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "スクリプトフィールドの有無でフィルタリングできません", - "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "インデックスがないフィールドまたは無視された値は検索できません", - "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "フィールドを固定解除", - "unifiedDocViewer.docViews.table.unpinFieldLabel": "フィールドを固定解除", "discover.dropZoneTableLabel": "フィールドを列として表に追加するには、ゾーンをドロップします", "discover.dscTour.stepAddFields.imageAltText": "[使用可能なフィールド]リストで、プラスアイコンをクリックし、フィールドをドキュメントテーブルに切り替えます。", "discover.dscTour.stepAddFields.title": "フィールドをテーブルに追加", @@ -2364,13 +2335,8 @@ "discover.embeddable.search.displayName": "検索", "discover.errorCalloutShowErrorMessage": "詳細を表示", "discover.fieldChooser.availableFieldsTooltip": "フィールドをテーブルに表示できます。", - "unifiedDocViewer.fieldChooser.discoverField.actions": "アクション", "discover.fieldChooser.discoverField.addFieldTooltip": "フィールドを列として追加", - "unifiedDocViewer.fieldChooser.discoverField.multiField": "複数フィールド", - "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "複数フィールドにはフィールドごとに複数の値を入力できます", - "unifiedDocViewer.fieldChooser.discoverField.name": "フィールド", "discover.fieldChooser.discoverField.removeFieldTooltip": "フィールドを表から削除", - "unifiedDocViewer.fieldChooser.discoverField.value": "値", "discover.goToDiscoverButtonText": "Discoverに移動", "discover.grid.flyout.documentNavigation": "ドキュメントナビゲーション", "discover.grid.flyout.toastColumnAdded": "列'{columnName}'が追加されました", @@ -2386,10 +2352,8 @@ "discover.inspectorRequestDescriptionDocument": "このリクエストはElasticsearchにクエリをかけ、ドキュメントを取得します。", "discover.invalidFiltersWarnToast.description": "一部の適用されたフィルターのデータビューID参照は、現在のデータビューとは異なります。", "discover.invalidFiltersWarnToast.title": "別のインデックス参照", - "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch ドキュメントの JSON ビューのみを読み込む", - "unifiedDocViewer.json.copyToClipboardLabel": "クリップボードにコピー", "discover.loadingDocuments": "ドキュメントを読み込み中", - "unifiedDocViewer.loadingJSON": "JSONを読み込んでいます", + "discover.loadingResults": "結果を読み込み中", "discover.localMenu.alertsDescription": "アラート", "discover.localMenu.fallbackReportTitle": "無題のDiscover検索", "discover.localMenu.inspectTitle": "検査", @@ -2446,9 +2410,6 @@ "discover.serverLocatorExtension.titleFromLocatorUnknown": "不明な検索", "discover.singleDocRoute.errorTitle": "エラーが発生しました", "discover.skipToBottomButtonLabel": "テーブルの最後に移動", - "unifiedDocViewer.sourceViewer.errorMessage": "現在データを取得できませんでした。タブを更新して、再試行してください。", - "unifiedDocViewer.sourceViewer.errorMessageTitle": "エラーが発生しました", - "unifiedDocViewer.sourceViewer.refresh": "更新", "discover.toggleSidebarAriaLabel": "サイドバーを切り替える", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "検索の管理", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "一致する検索が見つかりませんでした。", @@ -2465,25 +2426,73 @@ "discover.viewAlert.searchSourceErrorTitle": "検索ソースの取得エラー", "discover.viewModes.document.label": "ドキュメント", "discover.viewModes.fieldStatistics.label": "フィールド統計情報", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} - このフィールドはイベントの発生時刻を表します。", - "unifiedDataTable.searchGenerationWithDescription": "検索{searchTitle}で生成されたテーブル", - "unifiedDataTable.searchGenerationWithDescriptionGrid": "検索{searchTitle}で生成されたテーブル({searchDescription})", - "unifiedDataTable.selectedDocumentsNumber": "{nr}個のドキュメントが選択されました", - "unifiedDataTable.clearSelection": "選択した項目をクリア", - "unifiedDataTable.controlColumnHeader": "列の制御", - "unifiedDataTable.copyToClipboardJSON": "ドキュメントをクリップボードにコピー(JSON)", - "unifiedDataTable.tableHeader.timeFieldIconTooltip": "このフィールドはイベントの発生時刻を表します。", - "unifiedDataTable.grid.copyColumnNameToClipBoardButton": "名前をコピー", - "unifiedDataTable.grid.copyColumnValuesToClipBoardButton": "列をコピー", - "unifiedDataTable.grid.documentHeader": "ドキュメント", - "unifiedDataTable.grid.editFieldButton": "データビューフィールドを編集", - "unifiedDataTable.grid.selectDoc": "ドキュメント'{rowNumber}'を選択", - "unifiedDataTable.loadingResults": "結果を読み込み中", - "unifiedDataTable.noResultsFound": "結果が見つかりませんでした", - "unifiedDataTable.removeColumnLabel": "列を削除", - "unifiedDataTable.selectColumnHeader": "列を選択", - "unifiedDataTable.showAllDocuments": "すべてのドキュメントを表示", - "unifiedDataTable.showSelectedDocumentsOnly": "選択したドキュメントのみを表示", + "discover.fieldNameIcons.binaryAriaLabel": "バイナリー", + "discover.fieldNameIcons.booleanAriaLabel": "ブール", + "discover.fieldNameIcons.conflictFieldAriaLabel": "競合", + "discover.fieldNameIcons.counterFieldAriaLabel": "カウンターメトリック", + "discover.fieldNameIcons.dateFieldAriaLabel": "日付", + "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日付範囲", + "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集ベクトル", + "discover.fieldNameIcons.flattenedFieldAriaLabel": "平坦化済み", + "discover.fieldNameIcons.gaugeFieldAriaLabel": "ゲージメトリック", + "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理ポイント", + "discover.fieldNameIcons.geoShapeFieldAriaLabel": "地理情報図形", + "discover.fieldNameIcons.histogramFieldAriaLabel": "ヒストグラム", + "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP アドレス", + "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP範囲", + "discover.fieldNameIcons.keywordFieldAriaLabel": "キーワード", + "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", + "discover.fieldNameIcons.nestedFieldAriaLabel": "ネスト済み", + "discover.fieldNameIcons.numberFieldAriaLabel": "数字", + "discover.fieldNameIcons.pointFieldAriaLabel": "点", + "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "ランク特性", + "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "ランク特性", + "discover.fieldNameIcons.recordAriaLabel": "記録", + "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", + "discover.fieldNameIcons.sourceFieldAriaLabel": "ソースフィールド", + "discover.fieldNameIcons.stringFieldAriaLabel": "文字列", + "discover.fieldNameIcons.textFieldAriaLabel": "テキスト", + "discover.fieldNameIcons.unknownFieldAriaLabel": "不明なフィールド", + "discover.fieldNameIcons.versionFieldAriaLabel": "バージョン", + "unifiedDocViewer.docView.table.actions.label": "アクション", + "unifiedDocViewer.docView.table.actions.open": "アクションを開く", + "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "このフィールドの1つ以上の値が長すぎるため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "このフィールドは、検索またはフィルタリングできない正しくない形式の値が1つ以上あります。", + "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "このフィールドの1つ以上の値がElasticsearchによって無視されたため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "このフィールドの値が長すぎるため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "このフィールドの値の形式が正しくないため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "このフィールドの値はElasticsearchによって無視されたため、検索またはフィルタリングできません。", + "unifiedDocViewer.docView.table.searchPlaceHolder": "検索フィールド名", + "unifiedDocViewer.docViews.json.jsonTitle": "JSON", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "フィールド表示のフィルター", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "フィールド表示のフィルター", + "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "値でフィルター", + "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "値でフィルター", + "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "値を除外", + "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "値を除外", + "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "無視された値を含む", + "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "無視された値", + "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "フィールドを固定", + "unifiedDocViewer.docViews.table.pinFieldLabel": "フィールドを固定", + "unifiedDocViewer.docViews.table.tableTitle": "表", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "表の列を切り替える", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "表の列を切り替える", + "unifiedDocViewer.fieldChooser.discoverField.name": "フィールド", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "メタフィールドの有無でフィルタリングできません", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "スクリプトフィールドの有無でフィルタリングできません", + "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "インデックスがないフィールドまたは無視された値は検索できません", + "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "フィールドを固定解除", + "unifiedDocViewer.docViews.table.unpinFieldLabel": "フィールドを固定解除", + "unifiedDocViewer.fieldChooser.discoverField.actions": "アクション", + "unifiedDocViewer.fieldChooser.discoverField.multiField": "複数フィールド", + "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "複数フィールドにはフィールドごとに複数の値を入力できます", + "unifiedDocViewer.fieldChooser.discoverField.value": "値", + "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch ドキュメントの JSON ビューのみを読み込む", + "unifiedDocViewer.json.copyToClipboardLabel": "クリップボードにコピー", + "unifiedDocViewer.loadingJSON": "JSONを読み込んでいます", + "unifiedDocViewer.sourceViewer.errorMessage": "現在データを取得できませんでした。タブを更新して、再試行してください。", + "unifiedDocViewer.sourceViewer.errorMessageTitle": "エラーが発生しました", + "unifiedDocViewer.sourceViewer.refresh": "更新", "domDragDrop.announce.cancelled": "移動がキャンセルされました。{label}は初期位置に戻りました", "domDragDrop.announce.cancelledItem": "移動がキャンセルされました。{label}は位置{position}の{groupLabel}グループに戻りました", "domDragDrop.announce.dropped.combineCompatible": "レイヤー{dropLayerNumber}の位置{dropPosition}でグループ{dropGroupLabel}の{dropLabel}にグループ{groupLabel}の{label}を結合しました。", @@ -5701,34 +5710,6 @@ "unifiedFieldList.fieldNameDescription.textField": "電子メール本文や製品説明などの全文テキスト。", "unifiedFieldList.fieldNameDescription.unknownField": "不明なフィールド", "unifiedFieldList.fieldNameDescription.versionField": "ソフトウェアバージョン。「セマンティックバージョニング」優先度ルールをサポートします。", - "discover.fieldNameIcons.binaryAriaLabel": "バイナリー", - "discover.fieldNameIcons.booleanAriaLabel": "ブール", - "discover.fieldNameIcons.conflictFieldAriaLabel": "競合", - "discover.fieldNameIcons.counterFieldAriaLabel": "カウンターメトリック", - "discover.fieldNameIcons.dateFieldAriaLabel": "日付", - "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日付範囲", - "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集ベクトル", - "discover.fieldNameIcons.flattenedFieldAriaLabel": "平坦化済み", - "discover.fieldNameIcons.gaugeFieldAriaLabel": "ゲージメトリック", - "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理ポイント", - "discover.fieldNameIcons.geoShapeFieldAriaLabel": "地理情報図形", - "discover.fieldNameIcons.histogramFieldAriaLabel": "ヒストグラム", - "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP アドレス", - "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP範囲", - "discover.fieldNameIcons.keywordFieldAriaLabel": "キーワード", - "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", - "discover.fieldNameIcons.nestedFieldAriaLabel": "ネスト済み", - "discover.fieldNameIcons.numberFieldAriaLabel": "数字", - "discover.fieldNameIcons.pointFieldAriaLabel": "点", - "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "ランク特性", - "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "ランク特性", - "discover.fieldNameIcons.recordAriaLabel": "記録", - "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", - "discover.fieldNameIcons.sourceFieldAriaLabel": "ソースフィールド", - "discover.fieldNameIcons.stringFieldAriaLabel": "文字列", - "discover.fieldNameIcons.textFieldAriaLabel": "テキスト", - "discover.fieldNameIcons.unknownFieldAriaLabel": "不明なフィールド", - "discover.fieldNameIcons.versionFieldAriaLabel": "バージョン", "unifiedFieldList.fieldNameSearch.filterByNameLabel": "検索フィールド名", "unifiedFieldList.fieldPopover.addExistsFilterLabel": "フィールド表示のフィルター", "unifiedFieldList.fieldPopover.deleteFieldLabel": "データビューフィールドを削除", @@ -13669,19 +13650,6 @@ "xpack.enterpriseSearch.content.ml_inference.text_embedding": "密ベクトルテキスト埋め込み", "xpack.enterpriseSearch.content.ml_inference.text_expansion": "ELSERテキスト拡張", "xpack.enterpriseSearch.content.ml_inference.zero_shot_classification": "ゼロショットテキスト分類", - "xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name": "Azure Blob Storage", - "xpack.enterpriseSearch.content.nativeConnectors.confluence.name": "Confluence Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.customConnector.name": "カスタマイズされたコネクター", - "xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "xpack.enterpriseSearch.content.nativeConnectors.jira.name": "Jira Cloud & Server", - "xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name": "ネットワークドライブ", - "xpack.enterpriseSearch.content.nativeConnectors.oracle.name": "Oracle", - "xpack.enterpriseSearch.content.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.content.nativeConnectors.s3.name": "S3", - "xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name": "Sharepoint Online", "xpack.enterpriseSearch.content.navTitle": "コンテンツ", "xpack.enterpriseSearch.content.new_index.apiDescription": "プログラム的にElasticsearchインデックスにドキュメントを追加するにはAPIを使用します。パイプラインを作成して開始", "xpack.enterpriseSearch.content.new_index.apiTitle": "新しい検索インデックス", @@ -14292,40 +14260,6 @@ "xpack.enterpriseSearch.licenseDocumentationLink": "ライセンス機能の詳細", "xpack.enterpriseSearch.licenseManagementLink": "ライセンスを更新", "xpack.enterpriseSearch.nameLabel": "名前", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.collectionLabel": "収集", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.directConnectionLabel": "直接接続", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.hostLabel": "サーバーホスト名", - "xpack.enterpriseSearch.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.hostLabel": "ホスト", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.passwordLabel": "パスワード", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.retriesLabel": "リクエストごとの再試行回数", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.rowsFetchedLabel": "リクエストごとに取得された行数", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.schemaLabel": "スキーマ", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.tablesLabel": "カンマ区切りのテーブルのリスト", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.usernameLabel": "ユーザー名", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.validateHostLabel": "ホストを検証", - "xpack.enterpriseSearch.nativeConnectors.mssql.name": "Microsoft SQL", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.hostLabel": "ホスト", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.passwordLabel": "パスワード", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.retriesLabel": "リクエストごとの再試行回数", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.rowsFetchedLabel": "リクエストごとに取得された行数", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.tablesLabel": "カンマ区切りのテーブルのリスト", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.usernameLabel": "ユーザー名", - "xpack.enterpriseSearch.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.hostLabel": "ホスト", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.retriesLabel": "リクエストごとの再試行回数", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "リクエストごとに取得された行数", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.tablesLabel": "カンマ区切りのテーブルのリスト", - "xpack.enterpriseSearch.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "クライアントID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "シークレット値", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "カンマ区切りのサイトのリスト", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "データのインジェスト元のサイトのリスト(カンマ区切り)。すべての使用可能なサイトを含めるには、*を使用します。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "テナントID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "テナント名", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceLabel": "テキスト抽出サービスを使用", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceTooltip": "Elastic Data Extraction Serviceを別途デプロイする必要があります。また、パイプラインの設定でテキスト抽出を無効にする必要があります。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.name": "Sharepoint Online", "xpack.enterpriseSearch.nativeLabel": "ネイティブ", "xpack.enterpriseSearch.nav.analyticsCollections.explorerTitle": "エクスプローラー", "xpack.enterpriseSearch.nav.analyticsCollections.integrationTitle": "統合", @@ -14511,9 +14445,6 @@ "xpack.enterpriseSearch.searchExperiences.navTitle": "検索エクスペリエンス", "xpack.enterpriseSearch.searchExperiences.productDescription": "直感的で、魅力的な検索エクスペリエンスを簡単に構築できます。", "xpack.enterpriseSearch.searchExperiences.productName": "検索エクスペリエンス", - "xpack.enterpriseSearch.server.connectors.configuration.error": "コネクターが見つかりませんでした", - "xpack.enterpriseSearch.server.connectors.scheduling.error": "ドキュメントが見つかりませんでした", - "xpack.enterpriseSearch.server.connectors.serviceType.error": "ドキュメントが見つかりませんでした", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionExistsError": "コレクション名はすでに存在します。別の名前を選択してください。", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionNotFoundErrorMessage": "分析コレクションが見つかりません", "xpack.enterpriseSearch.server.routes.addConnector.connectorExistsError": "コネクターまたはインデックスはすでに存在します", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index e96481d694485..9e1a41ddaea15 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2314,36 +2314,7 @@ "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "查看周围文档", "discover.documentsAriaLabel": "文档", "discover.documentsErrorTitle": "搜索错误", - "unifiedDocViewer.docView.table.actions.label": "操作", - "unifiedDocViewer.docView.table.actions.open": "打开操作", - "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "此字段中的一个或多个值过长,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "此字段包含一个或多个格式错误的值,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "此字段中的一个或多个值被 Elasticsearch 忽略,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "此字段中的值过长,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "此字段中的值格式错误,无法搜索或筛选。", - "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "此字段中的值被 Elasticsearch 忽略,无法搜索或筛选。", - "unifiedDocViewer.docView.table.searchPlaceHolder": "搜索字段名称", - "unifiedDocViewer.docViews.json.jsonTitle": "JSON", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "筛留存在的字段", - "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "字段是否存在筛选", - "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "筛留值", - "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "筛留值", - "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "筛除值", - "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "筛除值", - "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "包含被忽略的值", - "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "被忽略的值", - "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "固定字段", - "unifiedDocViewer.docViews.table.pinFieldLabel": "固定字段", "discover.docViews.table.scoreSortWarningTooltip": "要检索 _score 的值,必须按其筛选。", - "unifiedDocViewer.docViews.table.tableTitle": "表", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "在表中切换列", - "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "在表中切换列", - "unifiedDocViewer.fieldChooser.discoverField.name": "切换字段详细信息", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "无法筛选元数据字段是否存在", - "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "无法筛选脚本字段是否存在", - "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "无法搜索未编入索引的字段或被忽略的值", - "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "取消固定字段", - "unifiedDocViewer.docViews.table.unpinFieldLabel": "取消固定字段", "discover.dropZoneTableLabel": "放置区域以将字段作为列添加到表中", "discover.dscTour.stepAddFields.imageAltText": "在可用字段列表中,单击加号图标将字段切换为文档表。", "discover.dscTour.stepAddFields.title": "将字段添加到表中", @@ -2364,13 +2335,8 @@ "discover.embeddable.search.displayName": "搜索", "discover.errorCalloutShowErrorMessage": "显示详情", "discover.fieldChooser.availableFieldsTooltip": "适用于在表中显示的字段。", - "unifiedDocViewer.fieldChooser.discoverField.actions": "操作", "discover.fieldChooser.discoverField.addFieldTooltip": "将字段添加为列", - "unifiedDocViewer.fieldChooser.discoverField.multiField": "多字段", - "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "多字段的每个字段可以有多个值", - "unifiedDocViewer.fieldChooser.discoverField.name": "字段", "discover.fieldChooser.discoverField.removeFieldTooltip": "从表中移除字段", - "unifiedDocViewer.fieldChooser.discoverField.value": "值", "discover.goToDiscoverButtonText": "前往 Discover", "discover.grid.flyout.documentNavigation": "文档导航", "discover.grid.flyout.toastColumnAdded": "已添加列“{columnName}”", @@ -2386,10 +2352,8 @@ "discover.inspectorRequestDescriptionDocument": "此请求将查询 Elasticsearch 以获取文档。", "discover.invalidFiltersWarnToast.description": "某些应用的筛选中的数据视图 ID 引用与当前数据视图不同。", "discover.invalidFiltersWarnToast.title": "不同的索引引用", - "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch 文档的只读 JSON 视图", - "unifiedDocViewer.json.copyToClipboardLabel": "复制到剪贴板", "discover.loadingDocuments": "正在加载文档", - "unifiedDocViewer.loadingJSON": "正在加载 JSON", + "discover.loadingResults": "正在加载结果", "discover.localMenu.alertsDescription": "告警", "discover.localMenu.fallbackReportTitle": "未命名 Discover 搜索", "discover.localMenu.inspectTitle": "检查", @@ -2446,9 +2410,6 @@ "discover.serverLocatorExtension.titleFromLocatorUnknown": "未知搜索", "discover.singleDocRoute.errorTitle": "发生错误", "discover.skipToBottomButtonLabel": "转到表尾", - "unifiedDocViewer.sourceViewer.errorMessage": "当前无法获取数据。请刷新选项卡以重试。", - "unifiedDocViewer.sourceViewer.errorMessageTitle": "发生错误", - "unifiedDocViewer.sourceViewer.refresh": "刷新", "discover.toggleSidebarAriaLabel": "切换侧边栏", "discover.topNav.openSearchPanel.manageSearchesButtonLabel": "管理搜索", "discover.topNav.openSearchPanel.noSearchesFoundDescription": "未找到匹配的搜索。", @@ -2465,25 +2426,73 @@ "discover.viewAlert.searchSourceErrorTitle": "提取搜索源时出错", "discover.viewModes.document.label": "文档", "discover.viewModes.fieldStatistics.label": "字段统计信息", - "unifiedDataTable.tableHeader.timeFieldIconTooltipAriaLabel": "{timeFieldName} - 此字段表示事件发生的时间。", - "unifiedDataTable.searchGenerationWithDescription": "搜索 {searchTitle} 生成的表", - "unifiedDataTable.searchGenerationWithDescriptionGrid": "搜索 {searchTitle} 生成的表({searchDescription})", - "unifiedDataTable.selectedDocumentsNumber": "{nr} 个文档已选择", - "unifiedDataTable.clearSelection": "清除所选内容", - "unifiedDataTable.controlColumnHeader": "控制列", - "unifiedDataTable.copyToClipboardJSON": "将文档复制到剪贴板 (JSON)", - "unifiedDataTable.tableHeader.timeFieldIconTooltip": "此字段表示事件发生的时间。", - "unifiedDataTable.grid.copyColumnNameToClipBoardButton": "复制名称", - "unifiedDataTable.grid.copyColumnValuesToClipBoardButton": "复制列", - "unifiedDataTable.grid.documentHeader": "文档", - "unifiedDataTable.grid.editFieldButton": "编辑数据视图字段", - "unifiedDataTable.grid.selectDoc": "选择文档“{rowNumber}”", - "unifiedDataTable.loadingResults": "正在加载结果", - "unifiedDataTable.noResultsFound": "找不到结果", - "unifiedDataTable.removeColumnLabel": "移除列", - "unifiedDataTable.selectColumnHeader": "选择列", - "unifiedDataTable.showAllDocuments": "显示所有文档", - "unifiedDataTable.showSelectedDocumentsOnly": "仅显示选定的文档", + "discover.fieldNameIcons.binaryAriaLabel": "二进制", + "discover.fieldNameIcons.booleanAriaLabel": "布尔型", + "discover.fieldNameIcons.conflictFieldAriaLabel": "冲突", + "discover.fieldNameIcons.counterFieldAriaLabel": "计数器指标", + "discover.fieldNameIcons.dateFieldAriaLabel": "日期", + "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日期范围", + "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集向量", + "discover.fieldNameIcons.flattenedFieldAriaLabel": "扁平", + "discover.fieldNameIcons.gaugeFieldAriaLabel": "仪表盘指标", + "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理点", + "discover.fieldNameIcons.geoShapeFieldAriaLabel": "几何形状", + "discover.fieldNameIcons.histogramFieldAriaLabel": "直方图", + "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP 地址", + "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP 范围", + "discover.fieldNameIcons.keywordFieldAriaLabel": "关键字", + "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", + "discover.fieldNameIcons.nestedFieldAriaLabel": "嵌套", + "discover.fieldNameIcons.numberFieldAriaLabel": "数字", + "discover.fieldNameIcons.pointFieldAriaLabel": "点", + "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "排名特征", + "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "排名特征", + "discover.fieldNameIcons.recordAriaLabel": "记录", + "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", + "discover.fieldNameIcons.sourceFieldAriaLabel": "源字段", + "discover.fieldNameIcons.stringFieldAriaLabel": "字符串", + "discover.fieldNameIcons.textFieldAriaLabel": "文本", + "discover.fieldNameIcons.unknownFieldAriaLabel": "未知字段", + "discover.fieldNameIcons.versionFieldAriaLabel": "版本", + "unifiedDocViewer.docView.table.actions.label": "操作", + "unifiedDocViewer.docView.table.actions.open": "打开操作", + "unifiedDocViewer.docView.table.ignored.multiAboveTooltip": "此字段中的一个或多个值过长,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.multiMalformedTooltip": "此字段包含一个或多个格式错误的值,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.multiUnknownTooltip": "此字段中的一个或多个值被 Elasticsearch 忽略,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.singleAboveTooltip": "此字段中的值过长,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.singleMalformedTooltip": "此字段中的值格式错误,无法搜索或筛选。", + "unifiedDocViewer.docView.table.ignored.singleUnknownTooltip": "此字段中的值被 Elasticsearch 忽略,无法搜索或筛选。", + "unifiedDocViewer.docView.table.searchPlaceHolder": "搜索字段名称", + "unifiedDocViewer.docViews.json.jsonTitle": "JSON", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel": "筛留存在的字段", + "unifiedDocViewer.docViews.table.filterForFieldPresentButtonTooltip": "字段是否存在筛选", + "unifiedDocViewer.docViews.table.filterForValueButtonAriaLabel": "筛留值", + "unifiedDocViewer.docViews.table.filterForValueButtonTooltip": "筛留值", + "unifiedDocViewer.docViews.table.filterOutValueButtonAriaLabel": "筛除值", + "unifiedDocViewer.docViews.table.filterOutValueButtonTooltip": "筛除值", + "unifiedDocViewer.docViews.table.ignored.multiValueLabel": "包含被忽略的值", + "unifiedDocViewer.docViews.table.ignored.singleValueLabel": "被忽略的值", + "unifiedDocViewer.docViews.table.pinFieldAriaLabel": "固定字段", + "unifiedDocViewer.docViews.table.pinFieldLabel": "固定字段", + "unifiedDocViewer.docViews.table.tableTitle": "表", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonAriaLabel": "在表中切换列", + "unifiedDocViewer.docViews.table.toggleColumnInTableButtonTooltip": "在表中切换列", + "unifiedDocViewer.fieldChooser.discoverField.name": "字段", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfMetaFieldsTooltip": "无法筛选元数据字段是否存在", + "unifiedDocViewer.docViews.table.unableToFilterForPresenceOfScriptedFieldsTooltip": "无法筛选脚本字段是否存在", + "unifiedDocViewer.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "无法搜索未编入索引的字段或被忽略的值", + "unifiedDocViewer.docViews.table.unpinFieldAriaLabel": "取消固定字段", + "unifiedDocViewer.docViews.table.unpinFieldLabel": "取消固定字段", + "unifiedDocViewer.fieldChooser.discoverField.actions": "操作", + "unifiedDocViewer.fieldChooser.discoverField.multiField": "多字段", + "unifiedDocViewer.fieldChooser.discoverField.multiFieldTooltipContent": "多字段的每个字段可以有多个值", + "unifiedDocViewer.fieldChooser.discoverField.value": "值", + "unifiedDocViewer.json.codeEditorAriaLabel": "Elasticsearch 文档的只读 JSON 视图", + "unifiedDocViewer.json.copyToClipboardLabel": "复制到剪贴板", + "unifiedDocViewer.loadingJSON": "正在加载 JSON", + "unifiedDocViewer.sourceViewer.errorMessage": "当前无法获取数据。请刷新选项卡以重试。", + "unifiedDocViewer.sourceViewer.errorMessageTitle": "发生错误", + "unifiedDocViewer.sourceViewer.refresh": "刷新", "domDragDrop.announce.cancelled": "移动已取消。{label} 已返回至其初始位置", "domDragDrop.announce.cancelledItem": "移动已取消。{label} 返回至 {groupLabel} 组中的位置 {position}", "domDragDrop.announce.dropped.combineCompatible": "已将组 {groupLabel} 中的 {label} 组合到图层 {dropLayerNumber} 的组 {dropGroupLabel} 中的位置 {dropPosition} 上的 {dropLabel}", @@ -5700,34 +5709,6 @@ "unifiedFieldList.fieldNameDescription.textField": "全文本,如电子邮件正文或产品描述。", "unifiedFieldList.fieldNameDescription.unknownField": "未知字段", "unifiedFieldList.fieldNameDescription.versionField": "软件版本。支持“语义版本控制”优先规则。", - "discover.fieldNameIcons.binaryAriaLabel": "二进制", - "discover.fieldNameIcons.booleanAriaLabel": "布尔型", - "discover.fieldNameIcons.conflictFieldAriaLabel": "冲突", - "discover.fieldNameIcons.counterFieldAriaLabel": "计数器指标", - "discover.fieldNameIcons.dateFieldAriaLabel": "日期", - "discover.fieldNameIcons.dateRangeFieldAriaLabel": "日期范围", - "discover.fieldNameIcons.denseVectorFieldAriaLabel": "密集向量", - "discover.fieldNameIcons.flattenedFieldAriaLabel": "扁平", - "discover.fieldNameIcons.gaugeFieldAriaLabel": "仪表盘指标", - "discover.fieldNameIcons.geoPointFieldAriaLabel": "地理点", - "discover.fieldNameIcons.geoShapeFieldAriaLabel": "几何形状", - "discover.fieldNameIcons.histogramFieldAriaLabel": "直方图", - "discover.fieldNameIcons.ipAddressFieldAriaLabel": "IP 地址", - "discover.fieldNameIcons.ipRangeFieldAriaLabel": "IP 范围", - "discover.fieldNameIcons.keywordFieldAriaLabel": "关键字", - "discover.fieldNameIcons.murmur3FieldAriaLabel": "Murmur3", - "discover.fieldNameIcons.nestedFieldAriaLabel": "嵌套", - "discover.fieldNameIcons.numberFieldAriaLabel": "数字", - "discover.fieldNameIcons.pointFieldAriaLabel": "点", - "discover.fieldNameIcons.rankFeatureFieldAriaLabel": "排名特征", - "discover.fieldNameIcons.rankFeaturesFieldAriaLabel": "排名特征", - "discover.fieldNameIcons.recordAriaLabel": "记录", - "discover.fieldNameIcons.shapeFieldAriaLabel": "形状", - "discover.fieldNameIcons.sourceFieldAriaLabel": "源字段", - "discover.fieldNameIcons.stringFieldAriaLabel": "字符串", - "discover.fieldNameIcons.textFieldAriaLabel": "文本", - "discover.fieldNameIcons.unknownFieldAriaLabel": "未知字段", - "discover.fieldNameIcons.versionFieldAriaLabel": "版本", "unifiedFieldList.fieldNameSearch.filterByNameLabel": "搜索字段名称", "unifiedFieldList.fieldPopover.addExistsFilterLabel": "筛留存在的字段", "unifiedFieldList.fieldPopover.deleteFieldLabel": "删除数据视图字段", @@ -13669,19 +13650,6 @@ "xpack.enterpriseSearch.content.ml_inference.text_embedding": "密集向量文本嵌入", "xpack.enterpriseSearch.content.ml_inference.text_expansion": "ELSER 文本扩展", "xpack.enterpriseSearch.content.ml_inference.zero_shot_classification": "Zero-Shot 文本分类", - "xpack.enterpriseSearch.content.nativeConnectors.azureBlob.name": "Azure Blob 存储", - "xpack.enterpriseSearch.content.nativeConnectors.confluence.name": "Confluence Cloud 和 Confluence Server", - "xpack.enterpriseSearch.content.nativeConnectors.customConnector.name": "定制连接器", - "xpack.enterpriseSearch.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "xpack.enterpriseSearch.content.nativeConnectors.jira.name": "Jira Cloud 和 Jira Server", - "xpack.enterpriseSearch.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "xpack.enterpriseSearch.content.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.content.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.content.nativeConnectors.networkDrive.name": "网络驱动器", - "xpack.enterpriseSearch.content.nativeConnectors.oracle.name": "Oracle", - "xpack.enterpriseSearch.content.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.content.nativeConnectors.s3.name": "S3", - "xpack.enterpriseSearch.content.nativeConnectors.sharepoint_online.name": "Sharepoint", "xpack.enterpriseSearch.content.navTitle": "内容", "xpack.enterpriseSearch.content.new_index.apiDescription": "使用 API 以编程方式将文档添加到 Elasticsearch 索引。首先创建索引。", "xpack.enterpriseSearch.content.new_index.apiTitle": "新搜索索引", @@ -14292,40 +14260,6 @@ "xpack.enterpriseSearch.licenseDocumentationLink": "详细了解许可证功能", "xpack.enterpriseSearch.licenseManagementLink": "管理您的许可", "xpack.enterpriseSearch.nameLabel": "名称", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.collectionLabel": "集合", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.directConnectionLabel": "直接连接", - "xpack.enterpriseSearch.nativeConnectors.mongodb.configuration.hostLabel": "服务器主机名", - "xpack.enterpriseSearch.nativeConnectors.mongodb.name": "MongoDB", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.hostLabel": "主机", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.passwordLabel": "密码", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.retriesLabel": "根据请求重试", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.rowsFetchedLabel": "根据请求提取的行", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.schemaLabel": "架构", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.tablesLabel": "表的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.usernameLabel": "用户名", - "xpack.enterpriseSearch.nativeConnectors.mssql.configuration.validateHostLabel": "验证主机", - "xpack.enterpriseSearch.nativeConnectors.mssql.name": "Microsoft SQL", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.hostLabel": "主机", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.passwordLabel": "密码", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.retriesLabel": "根据请求重试", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.rowsFetchedLabel": "根据请求提取的行", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.tablesLabel": "表的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.mysql.configuration.usernameLabel": "用户名", - "xpack.enterpriseSearch.nativeConnectors.mysql.name": "MySQL", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.hostLabel": "主机", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.retriesLabel": "根据请求重试", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "根据请求提取的行", - "xpack.enterpriseSearch.nativeConnectors.postgresql.configuration.tablesLabel": "表的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.postgresql.name": "PostgreSQL", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "客户端 ID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "机密值", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "网站的逗号分隔列表", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "要从中采集数据的网站的逗号分隔列表。使用 * 以包括所有可用网站。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "租户 ID", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "租户名称", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceLabel": "使用文本提取服务", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.configuration.textExtractionServiceTooltip": "需要独立部署的 Elastic 数据提取服务。还需要管道设置禁用文本提取。", - "xpack.enterpriseSearch.nativeConnectors.sharepoint_online.name": "Sharepoint", "xpack.enterpriseSearch.nativeLabel": "原生", "xpack.enterpriseSearch.nav.analyticsCollections.explorerTitle": "浏览器", "xpack.enterpriseSearch.nav.analyticsCollections.integrationTitle": "集成", @@ -14511,9 +14445,6 @@ "xpack.enterpriseSearch.searchExperiences.navTitle": "搜索体验", "xpack.enterpriseSearch.searchExperiences.productDescription": "构建直观、具有吸引力的搜索体验,而无需浪费时间进行重复工作。", "xpack.enterpriseSearch.searchExperiences.productName": "搜索体验", - "xpack.enterpriseSearch.server.connectors.configuration.error": "找不到连接器", - "xpack.enterpriseSearch.server.connectors.scheduling.error": "无法找到文档", - "xpack.enterpriseSearch.server.connectors.serviceType.error": "无法找到文档", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionExistsError": "集合名称已存在。请选择其他名称。", "xpack.enterpriseSearch.server.routes.addAnalyticsCollection.analyticsCollectionNotFoundErrorMessage": "未找到分析集合", "xpack.enterpriseSearch.server.routes.addConnector.connectorExistsError": "连接器或索引已存在", diff --git a/yarn.lock b/yarn.lock index 3ff002d5dfe50..69e5329560e94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5315,6 +5315,10 @@ version "0.0.0" uid "" +"@kbn/search-connectors@link:packages/kbn-search-connectors": + version "0.0.0" + uid "" + "@kbn/search-examples-plugin@link:examples/search_examples": version "0.0.0" uid "" From e8699cedaffaa3b88ada47c5e0867cf9693cb9dc Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Wed, 6 Sep 2023 09:07:10 -0400 Subject: [PATCH 21/25] feat(slo): add public access (#165698) --- .../plugins/observability/server/routes/slo/route.ts | 12 ++++++++++++ x-pack/plugins/observability/server/routes/types.ts | 1 + 2 files changed, 13 insertions(+) diff --git a/x-pack/plugins/observability/server/routes/slo/route.ts b/x-pack/plugins/observability/server/routes/slo/route.ts index 99eec0b54ee5a..2dfdcb2308ee3 100644 --- a/x-pack/plugins/observability/server/routes/slo/route.ts +++ b/x-pack/plugins/observability/server/routes/slo/route.ts @@ -74,6 +74,7 @@ const createSLORoute = createObservabilityServerRoute({ endpoint: 'POST /api/observability/slos 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: createSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -95,6 +96,7 @@ const updateSLORoute = createObservabilityServerRoute({ endpoint: 'PUT /api/observability/slos/{id} 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: updateSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -117,6 +119,7 @@ const deleteSLORoute = createObservabilityServerRoute({ endpoint: 'DELETE /api/observability/slos/{id} 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: deleteSLOParamsSchema, handler: async ({ @@ -145,6 +148,7 @@ const getSLORoute = createObservabilityServerRoute({ endpoint: 'GET /api/observability/slos/{id} 2023-10-31', options: { tags: ['access:slo_read'], + access: 'public', }, params: getSLOParamsSchema, handler: async ({ context, params }) => { @@ -166,6 +170,7 @@ const enableSLORoute = createObservabilityServerRoute({ endpoint: 'POST /api/observability/slos/{id}/enable 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: manageSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -188,6 +193,7 @@ const disableSLORoute = createObservabilityServerRoute({ endpoint: 'POST /api/observability/slos/{id}/disable 2023-10-31', options: { tags: ['access:slo_write'], + access: 'public', }, params: manageSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -210,6 +216,7 @@ const findSLORoute = createObservabilityServerRoute({ endpoint: 'GET /api/observability/slos 2023-10-31', options: { tags: ['access:slo_read'], + access: 'public', }, params: findSLOParamsSchema, handler: async ({ context, params, logger }) => { @@ -247,6 +254,7 @@ const findSloDefinitionsRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/_definitions', options: { tags: ['access:slo_read'], + access: 'internal', }, params: findSloDefinitionsParamsSchema, handler: async ({ context, params }) => { @@ -288,6 +296,7 @@ const getSLOInstancesRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/{id}/_instances', options: { tags: ['access:slo_read'], + access: 'internal', }, params: getSLOInstancesParamsSchema, handler: async ({ context, params }) => { @@ -309,6 +318,7 @@ const getDiagnosisRoute = createObservabilityServerRoute({ endpoint: 'GET /internal/observability/slos/_diagnosis', options: { tags: [], + access: 'internal', }, params: undefined, handler: async ({ context }) => { @@ -331,6 +341,7 @@ const getSloBurnRates = createObservabilityServerRoute({ endpoint: 'POST /internal/observability/slos/{id}/_burn_rates', options: { tags: ['access:slo_read'], + access: 'internal', }, params: getSLOBurnRatesParamsSchema, handler: async ({ context, params }) => { @@ -355,6 +366,7 @@ const getPreviewData = createObservabilityServerRoute({ endpoint: 'POST /internal/observability/slos/_preview', options: { tags: ['access:slo_read'], + access: 'internal', }, params: getPreviewDataParamsSchema, handler: async ({ context, params }) => { diff --git a/x-pack/plugins/observability/server/routes/types.ts b/x-pack/plugins/observability/server/routes/types.ts index 866bd3c79c1d1..a0ef6ee6c0c74 100644 --- a/x-pack/plugins/observability/server/routes/types.ts +++ b/x-pack/plugins/observability/server/routes/types.ts @@ -25,6 +25,7 @@ export interface ObservabilityRouteHandlerResources { export interface ObservabilityRouteCreateOptions { options: { tags: string[]; + access?: 'public' | 'internal'; }; } From b48dc8409977e2cae5363756a772fc4ed1104593 Mon Sep 17 00:00:00 2001 From: Julien Lind Date: Wed, 6 Sep 2023 15:16:39 +0200 Subject: [PATCH 22/25] [Fleet] Add Fleet Settings link to the output section (#165678) ## Summary Update the fleet output page and add links for users. Update the fleet ES output page and add link for the custom yaml box Co-authored-by: julienlind --- packages/kbn-doc-links/src/get_doc_links.ts | 1 + packages/kbn-doc-links/src/types.ts | 1 + .../components/edit_output_flyout/index.tsx | 10 +++++++--- .../components/settings_page/output_section.tsx | 15 +++++++++------ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 147b26fc6e03a..014bd64bbb68a 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -728,6 +728,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { settings: `${FLEET_DOCS}fleet-settings.html`, kafkaSettings: `${FLEET_DOCS}kafka-output-settings.html`, logstashSettings: `${FLEET_DOCS}ls-output-settings.html`, + esSettings: `${FLEET_DOCS}es-output-settings.html`, settingsFleetServerHostSettings: `${FLEET_DOCS}fleet-settings.html#fleet-server-hosts-setting`, settingsFleetServerProxySettings: `${KIBANA_DOCS}fleet-settings-kb.html#fleet-data-visualizer-settings`, troubleshooting: `${FLEET_DOCS}fleet-troubleshooting.html`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 428ef86267dd1..b576a38239e2e 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -489,6 +489,7 @@ export interface DocLinks { guide: string; fleetServer: string; fleetServerAddFleetServer: string; + esSettings: string; settings: string; logstashSettings: string; kafkaSettings: string; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx index 3270facd176b9..0e9ca6725a1a9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx @@ -424,9 +424,13 @@ export const EditOutputFlyout: React.FunctionComponent = /> + {i18n.translate('xpack.fleet.settings.editOutputFlyout.yamlConfigInputLabel', { + defaultMessage: 'Advanced YAML configuration', + })} + + } {...inputs.additionalYamlConfigInput.formRowProps} fullWidth > diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx index 6f053316ac58b..dd65df3e41c8f 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/settings_page/output_section.tsx @@ -6,10 +6,10 @@ */ import React from 'react'; -import { EuiTitle, EuiText, EuiSpacer, EuiButtonEmpty } from '@elastic/eui'; +import { EuiTitle, EuiText, EuiSpacer, EuiButtonEmpty, EuiLink } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useLink } from '../../../../hooks'; +import { useLink, useStartServices } from '../../../../hooks'; import type { Output } from '../../../../types'; import { OutputsTable } from '../outputs_table'; @@ -23,6 +23,7 @@ export const OutputSection: React.FunctionComponent = ({ deleteOutput, }) => { const { getHref } = useLink(); + const { docLinks } = useStartServices(); return ( <> @@ -33,10 +34,12 @@ export const OutputSection: React.FunctionComponent = ({ - + + + From d6a2bd77788c318a9f74247a52a1b6da05779b4b Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Wed, 6 Sep 2023 07:38:39 -0600 Subject: [PATCH 23/25] [Actions] Adjust axios payload for APIs that do not want `data` sent (#165756) --- x-pack/plugins/actions/server/lib/axios_utils.test.ts | 3 --- x-pack/plugins/actions/server/lib/axios_utils.ts | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/x-pack/plugins/actions/server/lib/axios_utils.test.ts b/x-pack/plugins/actions/server/lib/axios_utils.test.ts index 1f94e610f60bf..7423042e68228 100644 --- a/x-pack/plugins/actions/server/lib/axios_utils.test.ts +++ b/x-pack/plugins/actions/server/lib/axios_utils.test.ts @@ -66,7 +66,6 @@ describe('request', () => { expect(axiosMock).toHaveBeenCalledWith('/test', { method: 'get', - data: {}, httpAgent: undefined, httpsAgent: expect.any(HttpsAgent), proxy: false, @@ -100,7 +99,6 @@ describe('request', () => { expect(axiosMock).toHaveBeenCalledWith(TestUrl, { method: 'get', - data: {}, httpAgent, httpsAgent, proxy: false, @@ -132,7 +130,6 @@ describe('request', () => { expect(axiosMock).toHaveBeenCalledWith('https://testProxy', { method: 'get', - data: {}, httpAgent: undefined, httpsAgent: expect.any(HttpsAgent), proxy: false, diff --git a/x-pack/plugins/actions/server/lib/axios_utils.ts b/x-pack/plugins/actions/server/lib/axios_utils.ts index 181893db15f0c..163eac3eada2b 100644 --- a/x-pack/plugins/actions/server/lib/axios_utils.ts +++ b/x-pack/plugins/actions/server/lib/axios_utils.ts @@ -51,7 +51,7 @@ export const request = async ({ ...config, method, headers, - data: data ?? {}, + ...(data ? { data } : {}), // use httpAgent and httpsAgent and set axios proxy: false, to be able to handle fail on invalid certs httpAgent, httpsAgent, From 8c39735fcf45d19b68339d646a8b1defb108ff10 Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 6 Sep 2023 15:44:48 +0200 Subject: [PATCH 24/25] [Logs Onboarding] Implement Observability Onboarding locator (#165805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary In preparation for #165486 where we'll implement a call to action to bring into the logs onboarding, this PR implement the onboarding locator for the `observability_onboarding` plugin. The locator is both returned in the plugin contract and registered in the central registry so that we'll be able to consume it without creating circular dependencies between `observability_onboarding` and `observability_log_explorer` plugins. With this first iteration, the locator allows to navigate to the landing page or to specify a log source to onboard: ```ts // Navigate to onboarding landing page: /app/observabilityOnboarding plugins.share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR).navigate() // Navigate to system logs onboarding: /app/observabilityOnboarding/systemLogs plugins.share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR).navigate({source: 'systemLogs'}) // Navigate to custom logs onboarding: /app/observabilityOnboarding/customLogs plugins.share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR).navigate({source: 'customLogs'}) ``` --------- Co-authored-by: Marco Antonio Ghiani Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Yngrid Coello --- .../observability_onboarding/kibana.jsonc | 2 +- .../observability_onboarding/public/index.ts | 2 ++ .../public/locators/index.ts | 12 +++++++ .../onboarding_locator/get_location.ts | 21 ++++++++++++ .../locator_definition.test.ts | 32 +++++++++++++++++++ .../onboarding_locator/locator_definition.ts | 25 +++++++++++++++ .../locators/onboarding_locator/types.ts | 18 +++++++++++ .../observability_onboarding/public/plugin.ts | 27 ++++++++++++++-- .../observability_onboarding/tsconfig.json | 2 ++ 9 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/observability_onboarding/public/locators/index.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts create mode 100644 x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts diff --git a/x-pack/plugins/observability_onboarding/kibana.jsonc b/x-pack/plugins/observability_onboarding/kibana.jsonc index 97689407aff41..0379aec27b496 100644 --- a/x-pack/plugins/observability_onboarding/kibana.jsonc +++ b/x-pack/plugins/observability_onboarding/kibana.jsonc @@ -7,7 +7,7 @@ "server": true, "browser": true, "configPath": ["xpack", "observability_onboarding"], - "requiredPlugins": ["data", "observability", "observabilityShared", "discover"], + "requiredPlugins": ["data", "observability", "observabilityShared", "discover", "share"], "optionalPlugins": ["cloud", "usageCollection"], "requiredBundles": ["kibanaReact"], "extraPublicDirs": ["common"] diff --git a/x-pack/plugins/observability_onboarding/public/index.ts b/x-pack/plugins/observability_onboarding/public/index.ts index 9454626e80dc8..d4a667b9e7269 100644 --- a/x-pack/plugins/observability_onboarding/public/index.ts +++ b/x-pack/plugins/observability_onboarding/public/index.ts @@ -17,6 +17,8 @@ import { ObservabilityOnboardingPluginStart, } from './plugin'; +export { OBSERVABILITY_ONBOARDING_LOCATOR } from './locators/onboarding_locator/locator_definition'; + export interface ConfigSchema { ui: { enabled: boolean; diff --git a/x-pack/plugins/observability_onboarding/public/locators/index.ts b/x-pack/plugins/observability_onboarding/public/locators/index.ts new file mode 100644 index 0000000000000..5f82c40181259 --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ObservabilityOnboardingLocator } from './onboarding_locator/types'; + +export interface ObservabilityOnboardingPluginLocators { + onboarding: ObservabilityOnboardingLocator; +} diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts new file mode 100644 index 0000000000000..93bb3861740cd --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/get_location.ts @@ -0,0 +1,21 @@ +/* + * 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 { ObservabilityOnboardingLocatorParams } from './types'; +import { PLUGIN_ID } from '../../../common'; + +export function getLocation(params: ObservabilityOnboardingLocatorParams) { + const { source } = params; + + const path = ['/', source].filter(Boolean).join(''); + + return { + app: PLUGIN_ID, + path, + state: {}, + }; +} diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.ts new file mode 100644 index 0000000000000..6caf9222a239f --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ObservabilityOnboardingLocatorDefinition } from './locator_definition'; + +describe('Observability onboarding locator', () => { + test('should create a link to the overview page', async () => { + const locator = new ObservabilityOnboardingLocatorDefinition(); + const location = await locator.getLocation(); + + expect(location).toMatchObject({ + app: 'observabilityOnboarding', + path: '/', + state: {}, + }); + }); + + test('should create a link to specified log source onboarding', async () => { + const locator = new ObservabilityOnboardingLocatorDefinition(); + const systemLocation = await locator.getLocation({ source: 'systemLogs' }); + + expect(systemLocation).toMatchObject({ + app: 'observabilityOnboarding', + path: '/systemLogs', + state: {}, + }); + }); +}); diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts new file mode 100644 index 0000000000000..0c18e06cb92f5 --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { LocatorDefinition } from '@kbn/share-plugin/public'; +import type { ObservabilityOnboardingLocatorParams } from './types'; + +export const OBSERVABILITY_ONBOARDING_LOCATOR = + 'OBSERVABILITY_ONBOARDING_LOCATOR' as const; + +export class ObservabilityOnboardingLocatorDefinition + implements LocatorDefinition +{ + public readonly id = OBSERVABILITY_ONBOARDING_LOCATOR; + + public readonly getLocation = async ( + params: ObservabilityOnboardingLocatorParams = {} + ) => { + const { getLocation } = await import('./get_location'); + return getLocation(params); + }; +} diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts new file mode 100644 index 0000000000000..b8709f6af361d --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { LocatorPublic } from '@kbn/share-plugin/public'; +import { SerializableRecord } from '@kbn/utility-types'; + +export interface ObservabilityOnboardingLocatorParams + extends SerializableRecord { + /** If given, it will load the given map else will load the create a new map page. */ + source?: 'customLogs' | 'systemLogs'; +} + +export type ObservabilityOnboardingLocator = + LocatorPublic; diff --git a/x-pack/plugins/observability_onboarding/public/plugin.ts b/x-pack/plugins/observability_onboarding/public/plugin.ts index 8769991169090..45fa8a640c02f 100644 --- a/x-pack/plugins/observability_onboarding/public/plugin.ts +++ b/x-pack/plugins/observability_onboarding/public/plugin.ts @@ -24,15 +24,20 @@ import { DataPublicPluginStart, } from '@kbn/data-plugin/public'; import type { DiscoverSetup } from '@kbn/discover-plugin/public'; +import { SharePluginSetup } from '@kbn/share-plugin/public'; import type { ObservabilityOnboardingConfig } from '../server'; +import { PLUGIN_ID } from '../common'; +import { ObservabilityOnboardingLocatorDefinition } from './locators/onboarding_locator/locator_definition'; +import { ObservabilityOnboardingPluginLocators } from './locators'; export type ObservabilityOnboardingPluginSetup = void; export type ObservabilityOnboardingPluginStart = void; export interface ObservabilityOnboardingPluginSetupDeps { data: DataPublicPluginSetup; - observability: ObservabilityPublicSetup; discover: DiscoverSetup; + observability: ObservabilityPublicSetup; + share: SharePluginSetup; } export interface ObservabilityOnboardingPluginStartDeps { @@ -48,6 +53,8 @@ export class ObservabilityOnboardingPlugin ObservabilityOnboardingPluginStart > { + private locators?: ObservabilityOnboardingPluginLocators; + constructor(private ctx: PluginInitializerContext) {} public setup( @@ -69,7 +76,7 @@ export class ObservabilityOnboardingPlugin navLinkStatus: isServerlessEnabled ? AppNavLinkStatus.visible : AppNavLinkStatus.hidden, - id: 'observabilityOnboarding', + id: PLUGIN_ID, title: 'Observability Onboarding', order: 8500, euiIconType: 'logoObservability', @@ -98,9 +105,23 @@ export class ObservabilityOnboardingPlugin }, }); } + + this.locators = { + onboarding: plugins.share.url.locators.create( + new ObservabilityOnboardingLocatorDefinition() + ), + }; + + return { + locators: this.locators, + }; } public start( core: CoreStart, plugins: ObservabilityOnboardingPluginStartDeps - ) {} + ) { + return { + locators: this.locators, + }; + } } diff --git a/x-pack/plugins/observability_onboarding/tsconfig.json b/x-pack/plugins/observability_onboarding/tsconfig.json index 2119563923cb9..d2b4d9a223a2b 100644 --- a/x-pack/plugins/observability_onboarding/tsconfig.json +++ b/x-pack/plugins/observability_onboarding/tsconfig.json @@ -33,6 +33,8 @@ "@kbn/data-views-plugin", "@kbn/es-query", "@kbn/use-tracked-promise", + "@kbn/share-plugin", + "@kbn/utility-types", ], "exclude": [ "target/**/*", From 630a95bc10ace25c4d2db09928e6dacb77267109 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Wed, 6 Sep 2023 15:47:47 +0200 Subject: [PATCH 25/25] [Defend Workflows] Adjust headers in fleet api (#165823) --- .../pipelines/pull_request/pipeline.ts | 1 + x-pack/plugins/fleet/common/index.ts | 2 ++ .../details_page/hooks/use_agent_status.tsx | 3 +++ .../use_package_policies_with_agent_policy.ts | 3 +++ .../public/hooks/use_request/use_request.ts | 1 + .../scripts/create_agents/create_agents.ts | 2 ++ .../osquery/cypress/tasks/api_fixtures.ts | 6 ++++++ .../osquery/cypress/tasks/integrations.ts | 5 +++-- .../data_loaders/index_fleet_agent.ts | 3 ++- .../index_fleet_endpoint_policy.ts | 18 +++++++++++++++- .../data_loaders/setup_fleet_for_endpoint.ts | 14 ++++++++++++- .../common/endpoint/utils/package.ts | 3 ++- .../cypress/tasks/endpoint_policy.ts | 16 ++++++++++++-- .../public/management/cypress/tasks/fleet.ts | 13 ++++++++++++ .../policy/use_fetch_endpoint_policy.test.ts | 2 ++ .../hooks/policy/use_fetch_endpoint_policy.ts | 5 +++-- ...etch_endpoint_policy_agent_summary.test.ts | 3 ++- ...use_fetch_endpoint_policy_agent_summary.ts | 3 ++- .../policy/use_update_endpoint_policy.test.ts | 3 ++- .../policy/use_update_endpoint_policy.ts | 3 ++- .../policy_settings_layout.test.tsx | 3 ++- .../services/policies/ingest.test.ts | 11 +++++++--- .../management/services/policies/ingest.ts | 14 ++++++++++--- .../services/policies/policies.test.ts | 4 +++- .../management/services/policies/policies.ts | 3 ++- .../scripts/endpoint/common/fleet_services.ts | 17 +++++++++++++++ .../endpoint_agent_runner/fleet_server.ts | 21 ++++++++++++++++++- x-pack/test/osquery_cypress/utils.ts | 16 ++++++++++++-- 28 files changed, 172 insertions(+), 26 deletions(-) diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index 6fe1bb1b251e1..80d1312af6e64 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -141,6 +141,7 @@ const uploadPipeline = (pipelineContent: string | object) => { ) { pipeline.push(getPipeline('.buildkite/pipelines/pull_request/fleet_cypress.yml')); pipeline.push(getPipeline('.buildkite/pipelines/pull_request/defend_workflows.yml')); + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/osquery_cypress.yml')); } if ( diff --git a/x-pack/plugins/fleet/common/index.ts b/x-pack/plugins/fleet/common/index.ts index df9ecae76bea5..9ac36d753c4e8 100644 --- a/x-pack/plugins/fleet/common/index.ts +++ b/x-pack/plugins/fleet/common/index.ts @@ -59,6 +59,8 @@ export { // dashboards ids DASHBOARD_LOCATORS_IDS, FLEET_ENROLLMENT_API_PREFIX, + API_VERSIONS, + APP_API_ROUTES, } from './constants'; export { // Route services diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx index 4a92e44436fcd..c31140aca3a96 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/hooks/use_agent_status.tsx @@ -7,6 +7,8 @@ import React from 'react'; +import { API_VERSIONS } from '../../../../../../../common/constants'; + import type { UseRequestConfig } from '../../../../hooks'; import { useRequest } from '../../../../hooks'; import type { GetAgentStatusResponse } from '../../../../types'; @@ -21,6 +23,7 @@ export function useGetAgentStatus(policyId?: string, options?: RequestOptions) { policyId, }, method: 'get', + version: API_VERSIONS.public.v1, ...options, }); diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts index 399016ebf2042..a7ecbf95d25c1 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts @@ -7,6 +7,8 @@ import { useEffect, useMemo, useState } from 'react'; +import { API_VERSIONS } from '../../../../../../../../common/constants'; + import type { PackagePolicy, GetAgentPoliciesResponse, @@ -75,6 +77,7 @@ export const usePackagePoliciesWithAgentPolicy = ( full: true, ignoreMissing: true, }, + version: API_VERSIONS.public.v1, shouldSendRequest: agentPoliciesIds.length > 0, } as SendConditionalRequestConfig); diff --git a/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts b/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts index 9bd7d482e7e4a..69bf82061d89c 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/use_request.ts @@ -109,6 +109,7 @@ export const useConditionalRequest = ( path: config.path, query: config.query, body: config.body, + version: config.version, }); if (res.error) { throw res.error; diff --git a/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts b/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts index 206d30cabbb79..52723d0450351 100644 --- a/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts +++ b/x-pack/plugins/fleet/scripts/create_agents/create_agents.ts @@ -201,6 +201,7 @@ async function getAgentPolicy(id: string) { 'Content-Type': 'application/json', 'kbn-xsrf': 'kibana', 'x-elastic-product-origin': 'fleet', + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, }); const data = await res.json(); @@ -346,6 +347,7 @@ async function bumpAgentPolicyRevision(id: string, policy: any) { 'Content-Type': 'application/json', 'kbn-xsrf': 'kibana', 'x-elastic-product-origin': 'fleet', + 'Elastic-Api-Version': PUBLIC_VERSION_V1, }, }); diff --git a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts index 9a139eadf9adf..d7b9f7d43ce43 100644 --- a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts +++ b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts @@ -294,6 +294,9 @@ export const loadAgentPolicy = () => monitoring_enabled: ['logs', 'metrics'], inactivity_timeout: 1209600, }, + headers: { + 'Elastic-Api-Version': API_VERSIONS.public.v1, + }, url: '/api/fleet/agent_policies', }).then((response) => response.body.item); @@ -301,5 +304,8 @@ export const cleanupAgentPolicy = (agentPolicyId: string) => request({ method: 'POST', body: { agentPolicyId }, + headers: { + 'Elastic-Api-Version': API_VERSIONS.public.v1, + }, url: '/api/fleet/agent_policies/delete', }); diff --git a/x-pack/plugins/osquery/cypress/tasks/integrations.ts b/x-pack/plugins/osquery/cypress/tasks/integrations.ts index 09948eca70538..c8bb688dac0f5 100644 --- a/x-pack/plugins/osquery/cypress/tasks/integrations.ts +++ b/x-pack/plugins/osquery/cypress/tasks/integrations.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { API_VERSIONS } from '../../common/constants'; import { DEFAULT_POLICY } from '../screens/fleet'; import { ADD_POLICY_BTN, @@ -125,7 +126,7 @@ export const deleteIntegrations = async (integrationName: string) => { .then(() => { cy.request({ url: `/api/fleet/package_policies/delete`, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': API_VERSIONS.public.v1 }, body: `{ "packagePolicyIds": ${JSON.stringify(ids)} }`, method: 'POST', }); @@ -135,7 +136,7 @@ export const deleteIntegrations = async (integrationName: string) => { export const installPackageWithVersion = (integration: string, version: string) => { cy.request({ url: `/api/fleet/epm/packages/${integration}-${version}`, - headers: { 'kbn-xsrf': 'cypress' }, + headers: { 'kbn-xsrf': 'cypress', 'Elastic-Api-Version': API_VERSIONS.public.v1 }, body: '{ "force": true }', method: 'POST', }); diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts index 0b988d831c923..781d6243384e9 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts @@ -10,7 +10,7 @@ import type { AxiosResponse } from 'axios'; import type { DeleteByQueryResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { KbnClient } from '@kbn/test'; import type { Agent, FleetServerAgent, GetOneAgentResponse } from '@kbn/fleet-plugin/common'; -import { AGENT_API_ROUTES } from '@kbn/fleet-plugin/common'; +import { AGENT_API_ROUTES, API_VERSIONS } from '@kbn/fleet-plugin/common'; import type { HostMetadata } from '../types'; import { FleetAgentGenerator } from '../data_generators/fleet_agent_generator'; import { wrapErrorAndRejectPromise } from './utils'; @@ -90,6 +90,7 @@ const fetchFleetAgent = async (kbnClient: KbnClient, agentId: string): Promise
).data.item; diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts index 0730eba99306c..fda862d247bae 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_endpoint_policy.ts @@ -16,7 +16,11 @@ import type { DeleteAgentPolicyResponse, PostDeletePackagePoliciesResponse, } from '@kbn/fleet-plugin/common'; -import { AGENT_POLICY_API_ROUTES, PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common'; +import { + AGENT_POLICY_API_ROUTES, + PACKAGE_POLICY_API_ROUTES, + API_VERSIONS, +} from '@kbn/fleet-plugin/common'; import { memoize } from 'lodash'; import { getEndpointPackageInfo } from '../utils/package'; import type { PolicyData } from '../types'; @@ -61,6 +65,9 @@ export const indexFleetEndpointPolicy = async ( agentPolicy = (await kbnClient .request({ path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, method: 'POST', body: newAgentPolicyData, }) @@ -101,6 +108,9 @@ export const indexFleetEndpointPolicy = async ( path: PACKAGE_POLICY_API_ROUTES.CREATE_PATTERN, method: 'POST', body: newPackagePolicyData, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; @@ -135,6 +145,9 @@ export const deleteIndexedFleetEndpointPolicies = async ( (await kbnClient .request({ path: PACKAGE_POLICY_API_ROUTES.DELETE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, method: 'POST', body: { packagePolicyIds: indexData.integrationPolicies.map((policy) => policy.id), @@ -153,6 +166,9 @@ export const deleteIndexedFleetEndpointPolicies = async ( (await kbnClient .request({ path: AGENT_POLICY_API_ROUTES.DELETE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, method: 'POST', body: { agentPolicyId: agentPolicy.id, diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts index 177dccce73714..6c84cd6e5738f 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts @@ -13,7 +13,12 @@ import type { IBulkInstallPackageHTTPError, PostFleetSetupResponse, } from '@kbn/fleet-plugin/common'; -import { AGENTS_SETUP_API_ROUTES, EPM_API_ROUTES, SETUP_API_ROUTE } from '@kbn/fleet-plugin/common'; +import { + AGENTS_SETUP_API_ROUTES, + EPM_API_ROUTES, + SETUP_API_ROUTE, + API_VERSIONS, +} from '@kbn/fleet-plugin/common'; import { ToolingLog } from '@kbn/tooling-log'; import { UsageTracker } from './usage_tracker'; import { EndpointDataLoadingError, retryOnError, wrapErrorAndRejectPromise } from './utils'; @@ -43,6 +48,7 @@ export const setupFleetForEndpoint = async ( const setupResponse = (await kbnClient .request({ path: SETUP_API_ROUTE, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, method: 'POST', }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; @@ -64,6 +70,9 @@ export const setupFleetForEndpoint = async ( .request({ path: AGENTS_SETUP_API_ROUTES.CREATE_PATTERN, method: 'POST', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; @@ -118,6 +127,9 @@ export const installOrUpgradeEndpointFleetPackage = async ( query: { prerelease: true, }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(wrapErrorAndRejectPromise)) as AxiosResponse; diff --git a/x-pack/plugins/security_solution/common/endpoint/utils/package.ts b/x-pack/plugins/security_solution/common/endpoint/utils/package.ts index c45c44fa9c561..599fcabe24c9c 100644 --- a/x-pack/plugins/security_solution/common/endpoint/utils/package.ts +++ b/x-pack/plugins/security_solution/common/endpoint/utils/package.ts @@ -9,7 +9,7 @@ import type { AxiosResponse } from 'axios'; import type { KbnClient } from '@kbn/test'; import type { GetInfoResponse } from '@kbn/fleet-plugin/common'; -import { epmRouteService } from '@kbn/fleet-plugin/common'; +import { API_VERSIONS, epmRouteService } from '@kbn/fleet-plugin/common'; export const getEndpointPackageInfo = async ( kbnClient: KbnClient @@ -18,6 +18,7 @@ export const getEndpointPackageInfo = async ( const endpointPackage = ( (await kbnClient.request({ path, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, method: 'GET', })) as AxiosResponse ).data.item; diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts index 9353cdf9ed822..a1b5972758742 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/endpoint_policy.ts @@ -10,7 +10,7 @@ import type { UpdatePackagePolicy, UpdatePackagePolicyResponse, } from '@kbn/fleet-plugin/common'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { request } from './common'; import { ProtectionModes } from '../../../../common/endpoint/types'; @@ -24,6 +24,9 @@ export const enableAllPolicyProtections = ( return request({ method: 'GET', url: packagePolicyRouteService.getInfoPath(endpointPolicyId), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then(({ body: { item: endpointPolicy } }) => { const { created_by: _createdBy, @@ -58,6 +61,9 @@ export const enableAllPolicyProtections = ( method: 'PUT', url: packagePolicyRouteService.getUpdatePath(endpointPolicyId), body: updatedEndpointPolicy, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); }); }; @@ -69,6 +75,9 @@ export const setCustomProtectionUpdatesManifestVersion = ( return request({ method: 'GET', url: packagePolicyRouteService.getInfoPath(endpointPolicyId), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then(({ body: { item: endpointPolicy } }) => { const { created_by: _createdBy, @@ -91,6 +100,9 @@ export const setCustomProtectionUpdatesManifestVersion = ( method: 'PUT', url: packagePolicyRouteService.getUpdatePath(endpointPolicyId), body: updatedEndpointPolicy, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); }); }; @@ -103,6 +115,6 @@ export const setCustomProtectionUpdatesNote = ( method: 'POST', url: `/api/endpoint/protection_updates_note/${endpointPolicyId}`, body: { note }, - headers: { 'Elastic-Api-Version': '2023-10-31' }, + headers: { 'Elastic-Api-Version': API_VERSIONS.public.v1 }, }); }; diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts index 775baa7409f0a..bd6edbea158ce 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/fleet.ts @@ -15,6 +15,7 @@ import { agentRouteService, epmRouteService, packagePolicyRouteService, + API_VERSIONS, } from '@kbn/fleet-plugin/common'; import type { PutAgentReassignResponse } from '@kbn/fleet-plugin/common/types'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; @@ -24,6 +25,9 @@ export const getEndpointIntegrationVersion = (): Cypress.Chainable => request({ url: epmRouteService.getInfoPath('endpoint'), method: 'GET', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then((response) => response.body.item.version); export const getAgentByHostName = (hostname: string): Cypress.Chainable => @@ -33,6 +37,9 @@ export const getAgentByHostName = (hostname: string): Cypress.Chainable = qs: { kuery: `local_metadata.host.hostname: "${hostname}"`, }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then((response) => response.body.items[0]); export const reassignAgentPolicy = ( @@ -45,6 +52,9 @@ export const reassignAgentPolicy = ( body: { policy_id: agentPolicyId, }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); export const yieldEndpointPolicyRevision = (): Cypress.Chainable => @@ -54,6 +64,9 @@ export const yieldEndpointPolicyRevision = (): Cypress.Chainable => qs: { kuery: 'ingest-package-policies.package.name: endpoint', }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }).then(({ body }) => { return body.items?.[0]?.revision ?? -1; }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts index 78cb1282f94a8..85647202a755c 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.test.ts @@ -17,6 +17,7 @@ import { DefaultPolicyRuleNotificationMessage, } from '../../../../common/endpoint/models/policy_config'; import { set } from 'lodash'; +import { API_VERSIONS } from '@kbn/fleet-plugin/common'; const useQueryMock = _useQuery as jest.Mock; @@ -60,6 +61,7 @@ describe('When using the `useGetFileInfo()` hook', () => { expect(apiMocks.responseProvider.endpointPackagePolicy).toHaveBeenCalledWith({ path: `/api/fleet/package_policies/${policy.id}`, + version: API_VERSIONS.public.v1, }); }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts index 35d8a0f2ea255..bb8033ae012bb 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy.ts @@ -8,7 +8,7 @@ import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import { useQuery } from '@tanstack/react-query'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { DefaultPolicyNotificationMessage, DefaultPolicyRuleNotificationMessage, @@ -45,7 +45,8 @@ export const useFetchEndpointPolicy = ( ...options, queryFn: async () => { const apiResponse = await http.get( - packagePolicyRouteService.getInfoPath(policyId) + packagePolicyRouteService.getInfoPath(policyId), + { version: API_VERSIONS.public.v1 } ); applyDefaultsToPolicyIfNeeded(apiResponse.item); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts index 0513fee664dc1..80fd6d41dfd6e 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.test.ts @@ -12,7 +12,7 @@ import type { PolicyData } from '../../../../common/endpoint/types'; import { allFleetHttpMocks } from '../../mocks'; import { FleetPackagePolicyGenerator } from '../../../../common/endpoint/data_generators/fleet_package_policy_generator'; import { useFetchAgentByAgentPolicySummary } from './use_fetch_endpoint_policy_agent_summary'; -import { agentRouteService } from '@kbn/fleet-plugin/common'; +import { agentRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; const useQueryMock = _useQuery as jest.Mock; @@ -57,6 +57,7 @@ describe('When using the `useFetchEndpointPolicyAgentSummary()` hook', () => { expect(apiMocks.responseProvider.agentStatus).toHaveBeenCalledWith({ path: agentRouteService.getStatusPath(), query: { policyId: policy.policy_id }, + version: API_VERSIONS.public.v1, }); expect(data).toEqual({ total: 50, diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts index cbe69a321d1f5..82cebb6263f96 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_fetch_endpoint_policy_agent_summary.ts @@ -9,7 +9,7 @@ import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import type { GetAgentStatusResponse } from '@kbn/fleet-plugin/common'; import { useQuery } from '@tanstack/react-query'; -import { agentRouteService } from '@kbn/fleet-plugin/common'; +import { agentRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { useHttp } from '../../../common/lib/kibana'; type EndpointPolicyAgentSummary = GetAgentStatusResponse['results']; @@ -30,6 +30,7 @@ export const useFetchAgentByAgentPolicySummary = ( return ( await http.get(agentRouteService.getStatusPath(), { query: { policyId: agentPolicyId }, + version: API_VERSIONS.public.v1, }) ).results; }, diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts index 1f9dc8e300f05..8b6be08b41b46 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.test.ts @@ -17,7 +17,7 @@ import type { RenderHookResult } from '@testing-library/react-hooks/src/types'; import { useUpdateEndpointPolicy } from './use_update_endpoint_policy'; import type { PolicyData } from '../../../../common/endpoint/types'; import { FleetPackagePolicyGenerator } from '../../../../common/endpoint/data_generators/fleet_package_policy_generator'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { API_VERSIONS, packagePolicyRouteService } from '@kbn/fleet-plugin/common'; import { getPolicyDataForUpdate } from '../../../../common/endpoint/service/policy'; const useMutationMock = _useMutation as jest.Mock; @@ -64,6 +64,7 @@ describe('When using the `useFetchEndpointPolicyAgentSummary()` hook', () => { expect(apiMocks.responseProvider.updateEndpointPolicy).toHaveBeenCalledWith({ path: packagePolicyRouteService.getUpdatePath(policy.id), body: JSON.stringify(getPolicyDataForUpdate(policy)), + version: API_VERSIONS.public.v1, }); expect(result).toEqual({ item: expect.any(Object) }); diff --git a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts index 2e7f8b83ac19b..5e078ad563481 100644 --- a/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts +++ b/x-pack/plugins/security_solution/public/management/hooks/policy/use_update_endpoint_policy.ts @@ -8,7 +8,7 @@ import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query'; import type { IHttpFetchError } from '@kbn/core-http-browser'; import { useMutation } from '@tanstack/react-query'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { getPolicyDataForUpdate } from '../../../../common/endpoint/service/policy'; import { useHttp } from '../../../common/lib/kibana'; import type { PolicyData } from '../../../../common/endpoint/types'; @@ -39,6 +39,7 @@ export const useUpdateEndpointPolicy = ( return http.put(packagePolicyRouteService.getUpdatePath(policy.id), { body: JSON.stringify(update), + version: API_VERSIONS.public.v1, }); }, options); }; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx index 64188ce296c6e..0c5a98281eec6 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_settings_layout/policy_settings_layout.test.tsx @@ -20,7 +20,7 @@ import { expectIsViewOnly, getPolicySettingsFormTestSubjects } from '../policy_s import { cloneDeep, set } from 'lodash'; import { ProtectionModes } from '../../../../../../common/endpoint/types'; import { waitFor, cleanup } from '@testing-library/react'; -import { packagePolicyRouteService } from '@kbn/fleet-plugin/common'; +import { packagePolicyRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { getPolicyDataForUpdate } from '../../../../../../common/endpoint/service/policy'; import { getDeferred } from '../../../../mocks/utils'; @@ -133,6 +133,7 @@ describe('When rendering PolicySettingsLayout', () => { expect(apiMocks.responseProvider.updateEndpointPolicy).toHaveBeenCalledWith({ path: packagePolicyRouteService.getUpdatePath(policyData.id), body: JSON.stringify(getPolicyDataForUpdate(expectedUpdatedPolicy)), + version: API_VERSIONS.public.v1, }); }); diff --git a/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts b/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts index a3644ce691478..d498f32bb1cab 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/ingest.test.ts @@ -7,7 +7,7 @@ import { sendGetPackagePolicy, sendGetEndpointSecurityPackage } from './ingest'; import { httpServiceMock } from '@kbn/core/public/mocks'; -import { PACKAGE_POLICY_API_ROOT, epmRouteService } from '@kbn/fleet-plugin/common'; +import { PACKAGE_POLICY_API_ROOT, epmRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { policyListApiPathHandlers } from '../../pages/policy/store/test_mock_utils'; describe('ingest service', () => { @@ -20,7 +20,9 @@ describe('ingest service', () => { describe('sendGetPackagePolicy()', () => { it('builds correct API path', async () => { await sendGetPackagePolicy(http, '123'); - expect(http.get).toHaveBeenCalledWith(`${PACKAGE_POLICY_API_ROOT}/123`, undefined); + expect(http.get).toHaveBeenCalledWith(`${PACKAGE_POLICY_API_ROOT}/123`, { + version: API_VERSIONS.public.v1, + }); }); it('supports http options', async () => { await sendGetPackagePolicy(http, '123', { query: { page: 1 } }); @@ -28,6 +30,7 @@ describe('ingest service', () => { query: { page: 1, }, + version: API_VERSIONS.public.v1, }); }); }); @@ -37,7 +40,9 @@ describe('ingest service', () => { const path = epmRouteService.getInfoPath('endpoint'); http.get.mockReturnValue(Promise.resolve(policyListApiPathHandlers()[path]())); await sendGetEndpointSecurityPackage(http); - expect(http.get).toHaveBeenCalledWith(path); + expect(http.get).toHaveBeenCalledWith(path, { + version: API_VERSIONS.public.v1, + }); }); it('should throw if package is not found', async () => { diff --git a/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts b/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts index e5347449d4dbe..4a2690a112e24 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/ingest.ts @@ -11,7 +11,7 @@ import type { GetPackagePoliciesResponse, GetInfoResponse, } from '@kbn/fleet-plugin/common'; -import { epmRouteService } from '@kbn/fleet-plugin/common'; +import { epmRouteService, API_VERSIONS } from '@kbn/fleet-plugin/common'; import type { NewPolicyData } from '../../../../common/endpoint/types'; import type { GetPolicyResponse, UpdatePolicyResponse } from '../../pages/policy/types'; @@ -34,7 +34,10 @@ export const sendGetPackagePolicy = ( packagePolicyId: string, options?: HttpFetchOptions ) => { - return http.get(`${INGEST_API_PACKAGE_POLICIES}/${packagePolicyId}`, options); + return http.get(`${INGEST_API_PACKAGE_POLICIES}/${packagePolicyId}`, { + ...options, + version: API_VERSIONS.public.v1, + }); }; /** @@ -50,6 +53,7 @@ export const sendBulkGetPackagePolicies = ( ) => { return http.post(`${INGEST_API_PACKAGE_POLICIES}/_bulk_get`, { ...options, + version: API_VERSIONS.public.v1, body: JSON.stringify({ ids: packagePolicyIds, ignoreMissing: true, @@ -73,6 +77,7 @@ export const sendPutPackagePolicy = ( ): Promise => { return http.put(`${INGEST_API_PACKAGE_POLICIES}/${packagePolicyId}`, { ...options, + version: API_VERSIONS.public.v1, body: JSON.stringify(packagePolicy), }); }; @@ -92,6 +97,7 @@ export const sendGetFleetAgentStatusForPolicy = ( ): Promise => { return http.get(INGEST_API_FLEET_AGENT_STATUS, { ...options, + version: API_VERSIONS.public.v1, query: { policyId, }, @@ -105,7 +111,9 @@ export const sendGetEndpointSecurityPackage = async ( http: HttpStart ): Promise => { const path = epmRouteService.getInfoPath('endpoint'); - const endpointPackageResponse = await http.get(path); + const endpointPackageResponse = await http.get(path, { + version: API_VERSIONS.public.v1, + }); const endpointPackageInfo = endpointPackageResponse.item; if (!endpointPackageInfo) { throw new Error('Endpoint package was not found.'); diff --git a/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts b/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts index 86715ebff3f75..a523f94d489c5 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/policies.test.ts @@ -7,7 +7,7 @@ import { httpServiceMock } from '@kbn/core/public/mocks'; import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; -import { PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common/constants/routes'; +import { API_VERSIONS, PACKAGE_POLICY_API_ROUTES } from '@kbn/fleet-plugin/common/constants'; import { sendGetEndpointSpecificPackagePolicies } from './policies'; describe('ingest service', () => { @@ -24,6 +24,7 @@ describe('ingest service', () => { query: { kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`, }, + version: API_VERSIONS.public.v1, }); }); it('supports additional KQL to be defined on input for query params', async () => { @@ -36,6 +37,7 @@ describe('ingest service', () => { perPage: 10, page: 1, }, + version: API_VERSIONS.public.v1, }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/services/policies/policies.ts b/x-pack/plugins/security_solution/public/management/services/policies/policies.ts index de700e20e8c40..a7a45f832b56d 100644 --- a/x-pack/plugins/security_solution/public/management/services/policies/policies.ts +++ b/x-pack/plugins/security_solution/public/management/services/policies/policies.ts @@ -7,7 +7,7 @@ import type { HttpFetchOptions, HttpStart } from '@kbn/core/public'; import type { GetPackagePoliciesRequest } from '@kbn/fleet-plugin/common'; -import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE, API_VERSIONS } from '@kbn/fleet-plugin/common'; import type { GetPolicyListResponse } from '../../pages/policy/types'; import { INGEST_API_PACKAGE_POLICIES } from './ingest'; @@ -29,5 +29,6 @@ export const sendGetEndpointSpecificPackagePolicies = ( options?.query?.kuery ? `${options.query.kuery} and ` : '' }${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`, }, + version: API_VERSIONS.public.v1, }); }; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts index 0eca2cbf03501..95f000fd00355 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts @@ -19,6 +19,7 @@ import { agentPolicyRouteService, agentRouteService, AGENTS_INDEX, + API_VERSIONS, } from '@kbn/fleet-plugin/common'; import { ToolingLog } from '@kbn/tooling-log'; import type { KbnClient } from '@kbn/test'; @@ -106,6 +107,9 @@ export const fetchFleetAgents = async ( .request({ method: 'GET', path: AGENT_API_ROUTES.LIST_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: options, }) .catch(catchAxiosErrorFormatAndThrow) @@ -160,6 +164,9 @@ export const fetchFleetServerUrl = async (kbnClient: KbnClient): Promise({ method: 'GET', path: fleetServerHostsRoutesService.getListPath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: { perPage: 100, }, @@ -197,6 +204,9 @@ export const fetchAgentPolicyEnrollmentKey = async ( .request({ method: 'GET', path: enrollmentAPIKeyRouteService.getListPath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: { kuery: `policy_id: "${agentPolicyId}"` }, }) .catch(catchAxiosErrorFormatAndThrow) @@ -222,6 +232,9 @@ export const fetchAgentPolicyList = async ( .request({ method: 'GET', path: agentPolicyRouteService.getListPath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: options, }) .catch(catchAxiosErrorFormatAndThrow) @@ -323,6 +336,7 @@ export const getAgentDownloadUrl = async ( * Given a stack version number, function will return the closest Agent download version available * for download. THis could be the actual version passed in or lower. * @param version + * @param log */ export const getLatestAgentDownloadVersion = async ( version: string, @@ -386,6 +400,9 @@ export const unEnrollFleetAgent = async ( method: 'POST', path: agentRouteService.getUnenrollPath(agentId), body: { revoke: force }, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, }) .catch(catchAxiosErrorFormatAndThrow); diff --git a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts index f9d88382d81c7..60471c5c46864 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/endpoint_agent_runner/fleet_server.ts @@ -17,8 +17,9 @@ import { FLEET_SERVER_PACKAGE, PACKAGE_POLICY_API_ROUTES, PACKAGE_POLICY_SAVED_OBJECT_TYPE, + API_VERSIONS, + APP_API_ROUTES, } from '@kbn/fleet-plugin/common'; -import { APP_API_ROUTES } from '@kbn/fleet-plugin/common/constants'; import type { FleetServerHost, GenerateServiceTokenResponse, @@ -87,6 +88,9 @@ const getFleetServerPackagePolicy = async (): Promise .request({ method: 'GET', path: PACKAGE_POLICY_API_ROUTES.LIST_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, query: { perPage: 1, kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: "${FLEET_SERVER_PACKAGE}"`, @@ -121,6 +125,9 @@ const getOrCreateFleetServerAgentPolicyId = async (): Promise => { .request({ method: 'POST', path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: { name: `Fleet Server policy (${Math.random().toString(32).substring(2)})`, description: `Created by CLI Tool via: ${__filename}`, @@ -150,6 +157,9 @@ const generateFleetServiceToken = async (): Promise => { .request({ method: 'POST', path: APP_API_ROUTES.GENERATE_SERVICE_TOKEN_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: {}, }) .then((response) => response.data.value); @@ -279,6 +289,9 @@ const configureFleetIfNeeded = async () => { const fleetOutputs = await kbnClient .request({ method: 'GET', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, path: outputRoutesService.getListPath(), }) .then((response) => response.data); @@ -318,6 +331,9 @@ const configureFleetIfNeeded = async () => { await kbnClient .request({ method: 'PUT', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, path: outputRoutesService.getUpdatePath(id), body: update, }) @@ -356,6 +372,9 @@ const addFleetServerHostToFleetSettings = async ( .request({ method: 'POST', path: fleetServerHostsRoutesService.getCreatePath(), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: newFleetHostEntry, }) .catch(catchAxiosErrorFormatAndThrow) diff --git a/x-pack/test/osquery_cypress/utils.ts b/x-pack/test/osquery_cypress/utils.ts index 572170e0ec301..a852cfd8bed99 100644 --- a/x-pack/test/osquery_cypress/utils.ts +++ b/x-pack/test/osquery_cypress/utils.ts @@ -8,7 +8,7 @@ import axios from 'axios'; import semver from 'semver'; import { map } from 'lodash'; -import { PackagePolicy, CreatePackagePolicyResponse } from '@kbn/fleet-plugin/common'; +import { PackagePolicy, CreatePackagePolicyResponse, API_VERSIONS } from '@kbn/fleet-plugin/common'; import { KbnClient } from '@kbn/test'; import { GetEnrollmentAPIKeysResponse, @@ -26,7 +26,10 @@ export const getInstalledIntegration = async (kbnClient: KbnClient, integrationN } = await kbnClient.request<{ item: PackagePolicy }>({ method: 'GET', path: `/api/fleet/epm/packages/${integrationName}`, - headers: DEFAULT_HEADERS, + headers: { + ...DEFAULT_HEADERS, + 'elastic-api-version': API_VERSIONS.public.v1, + }, }); return item; @@ -46,6 +49,9 @@ export const createAgentPolicy = async ( } = await kbnClient.request({ method: 'POST', path: `/api/fleet/agent_policies?sys_monitoring=true`, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: { name: agentPolicyName, description: '', @@ -62,6 +68,9 @@ export const createAgentPolicy = async ( log.info('Getting agent enrollment key'); const { data: apiKeys } = await kbnClient.request({ method: 'GET', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, path: '/api/fleet/enrollment_api_keys', }); @@ -79,6 +88,9 @@ export const addIntegrationToAgentPolicy = async ( return kbnClient.request({ method: 'POST', path: '/api/fleet/package_policies', + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, body: { policy_id: agentPolicyId, package: {