diff --git a/src/platform/plugins/shared/kql/moon.yml b/src/platform/plugins/shared/kql/moon.yml index 0b8323cd8dd29..e7c11541bc5a7 100644 --- a/src/platform/plugins/shared/kql/moon.yml +++ b/src/platform/plugins/shared/kql/moon.yml @@ -33,6 +33,7 @@ dependsOn: - '@kbn/utility-types-jest' - '@kbn/config-schema' - '@kbn/css-utils' + - '@kbn/config' tags: - plugin - prod diff --git a/src/platform/plugins/shared/kql/server/config_deprecations.test.ts b/src/platform/plugins/shared/kql/server/config_deprecations.test.ts new file mode 100644 index 0000000000000..e8010d5055fd6 --- /dev/null +++ b/src/platform/plugins/shared/kql/server/config_deprecations.test.ts @@ -0,0 +1,138 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { cloneDeep } from 'lodash'; + +import { applyDeprecations, configDeprecationFactory } from '@kbn/config'; +import { configDeprecationsMock } from '@kbn/core/server/mocks'; + +import { autocompleteConfigDeprecationProvider } from './config_deprecations'; + +const deprecationContext = configDeprecationsMock.createContext(); + +const applyConfigDeprecations = (settings: Record = {}) => { + const deprecations = autocompleteConfigDeprecationProvider(configDeprecationFactory); + const deprecationMessages: string[] = []; + const migrated = applyDeprecations( + settings, + deprecations.map((deprecation) => ({ + deprecation, + path: '', + context: deprecationContext, + })), + () => + ({ message }) => + deprecationMessages.push(message) + ); + return { + messages: deprecationMessages, + migrated: migrated.config, + }; +}; + +describe('Config Deprecations', () => { + it('does not report deprecations for default configurationc', () => { + const configFirstStep = { data: { autocomplete: { valueSuggestions: {} } } }; + const { messages, migrated } = applyConfigDeprecations(cloneDeep(configFirstStep)); + expect(migrated).toEqual(configFirstStep); + expect(messages).toHaveLength(0); + }); + + it('renames kibana.autocompleteTerminateAfter to unifiedSearch.autocomplete.valueSuggestions.terminateAfter', () => { + const config = { + kibana: { + autocompleteTerminateAfter: 123, + }, + }; + const { messages, migrated } = applyConfigDeprecations(cloneDeep(config)); + expect(migrated.kibana?.autocompleteTerminateAfter).not.toBeDefined(); + expect(migrated.unifiedSearch.autocomplete.valueSuggestions.terminateAfter).toEqual(123); + expect(messages).toMatchInlineSnapshot(` + Array [ + "Setting \\"kibana.autocompleteTerminateAfter\\" has been replaced by \\"unifiedSearch.autocomplete.valueSuggestions.terminateAfter\\"", + ] + `); + }); + + it('renames kibana.autocompleteTimeout to unifiedSearch.autocomplete.valueSuggestions.timeout', () => { + const config = { + kibana: { + autocompleteTimeout: 123, + }, + }; + const { messages, migrated } = applyConfigDeprecations(cloneDeep(config)); + expect(migrated.kibana?.autocompleteTimeout).not.toBeDefined(); + expect(migrated.unifiedSearch.autocomplete.valueSuggestions.timeout).toEqual(123); + expect(messages).toMatchInlineSnapshot(` + Array [ + "Setting \\"kibana.autocompleteTimeout\\" has been replaced by \\"unifiedSearch.autocomplete.valueSuggestions.timeout\\"", + ] + `); + }); + + it('renames data.autocomplete.querySuggestions.enabled to unifiedSearch.autocomplete.querySuggestions.enabled', () => { + const config = { + data: { + autocomplete: { + querySuggestions: { + enabled: false, + }, + }, + }, + }; + const { messages, migrated } = applyConfigDeprecations(cloneDeep(config)); + expect(migrated.data?.autocomplete.querySuggestions.enabled).not.toBeDefined(); + expect(migrated.unifiedSearch.autocomplete.querySuggestions.enabled).toEqual(false); + expect(messages).toMatchInlineSnapshot(` + Array [ + "Setting \\"data.autocomplete.querySuggestions.enabled\\" has been replaced by \\"unifiedSearch.autocomplete.querySuggestions.enabled\\"", + ] + `); + }); + + it('renames data.autocomplete.valueSuggestions.enabled to unifiedSearch.autocomplete.valueSuggestions.enabled', () => { + const config = { + data: { + autocomplete: { + valueSuggestions: { + enabled: false, + }, + }, + }, + }; + const { messages, migrated } = applyConfigDeprecations(cloneDeep(config)); + expect(migrated.data?.autocomplete.valueSuggestions.enabled).not.toBeDefined(); + expect(migrated.unifiedSearch.autocomplete.valueSuggestions.enabled).toEqual(false); + expect(messages).toMatchInlineSnapshot(` + Array [ + "Setting \\"data.autocomplete.valueSuggestions.enabled\\" has been replaced by \\"unifiedSearch.autocomplete.valueSuggestions.enabled\\"", + ] + `); + }); + + it('renames data.autocomplete.valueSuggestions.tiers to unifiedSearch.autocomplete.valueSuggestions.tiers', () => { + const config = { + data: { + autocomplete: { + valueSuggestions: { + tiers: [], + }, + }, + }, + }; + const { messages, migrated } = applyConfigDeprecations(cloneDeep(config)); + expect(migrated.data?.autocomplete.valueSuggestions.tiers).not.toBeDefined(); + expect(migrated.unifiedSearch.autocomplete.valueSuggestions.tiers).toEqual([]); + expect(messages).toMatchInlineSnapshot(` + Array [ + "Setting \\"data.autocomplete.valueSuggestions.tiers\\" has been replaced by \\"unifiedSearch.autocomplete.valueSuggestions.tiers\\"", + ] + `); + }); +}); diff --git a/src/platform/plugins/shared/kql/server/config_deprecations.ts b/src/platform/plugins/shared/kql/server/config_deprecations.ts new file mode 100644 index 0000000000000..d5cab66712076 --- /dev/null +++ b/src/platform/plugins/shared/kql/server/config_deprecations.ts @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { ConfigDeprecationProvider } from '@kbn/core/server'; + +export const autocompleteConfigDeprecationProvider: ConfigDeprecationProvider = ({ + renameFromRoot, +}) => [ + renameFromRoot( + 'data.autocomplete.valueSuggestions.terminateAfter', + 'unifiedSearch.autocomplete.valueSuggestions.terminateAfter', + { level: 'warning' } + ), + renameFromRoot( + 'kibana.autocompleteTerminateAfter', + 'unifiedSearch.autocomplete.valueSuggestions.terminateAfter', + { level: 'warning' } + ), + renameFromRoot( + 'data.autocomplete.valueSuggestions.timeout', + 'unifiedSearch.autocomplete.valueSuggestions.timeout', + { + level: 'warning', + } + ), + renameFromRoot( + 'kibana.autocompleteTimeout', + 'unifiedSearch.autocomplete.valueSuggestions.timeout', + { + level: 'warning', + } + ), + renameFromRoot( + 'data.autocomplete.querySuggestions.enabled', + 'unifiedSearch.autocomplete.querySuggestions.enabled', + { + level: 'warning', + } + ), + renameFromRoot( + 'data.autocomplete.valueSuggestions.enabled', + 'unifiedSearch.autocomplete.valueSuggestions.enabled', + { + level: 'warning', + } + ), + renameFromRoot( + 'data.autocomplete.valueSuggestions.tiers', + 'unifiedSearch.autocomplete.valueSuggestions.tiers', + { + level: 'warning', + } + ), +]; diff --git a/src/platform/plugins/shared/kql/server/index.ts b/src/platform/plugins/shared/kql/server/index.ts index 9f42b31e4205c..563fff8826aaf 100644 --- a/src/platform/plugins/shared/kql/server/index.ts +++ b/src/platform/plugins/shared/kql/server/index.ts @@ -11,6 +11,7 @@ import type { PluginConfigDescriptor, PluginInitializerContext } from '@kbn/core import type { ConfigSchema } from './config'; import { configSchema } from './config'; import type { KQLServerPlugin, KQLServerPluginSetup, KQLServerPluginStart } from './plugin'; +import { autocompleteConfigDeprecationProvider } from './config_deprecations'; /** * Static code to be shared externally @@ -30,4 +31,5 @@ export const config: PluginConfigDescriptor = { autocomplete: true, }, schema: configSchema, + deprecations: autocompleteConfigDeprecationProvider, }; diff --git a/src/platform/plugins/shared/kql/tsconfig.json b/src/platform/plugins/shared/kql/tsconfig.json index 89627ea7ccb59..a5802a326d7da 100644 --- a/src/platform/plugins/shared/kql/tsconfig.json +++ b/src/platform/plugins/shared/kql/tsconfig.json @@ -26,6 +26,7 @@ "@kbn/utility-types-jest", "@kbn/config-schema", "@kbn/css-utils", + "@kbn/config", ], "exclude": [ "target/**/*",