From f01165ac154f74d90594b6383bee7442d6bd2b3d Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Thu, 30 Jan 2020 13:23:05 -0800 Subject: [PATCH] [DOCS] Adds breaking changes for 7.6 (#56437) * adding api changes for 7.6 * [DOCS] Adds breaking changes for 7.6 * [DOCS] Incorporates review comments Co-authored-by: Tim Schnell --- docs/images/breaking_changes_save_query.png | Bin 0 -> 37587 bytes ...breaking_changes_save_query_management.png | Bin 0 -> 21256 bytes docs/migration.asciidoc | 6 +- docs/migration/migrate_7_6.asciidoc | 1897 +++++++++++++++++ 4 files changed, 1901 insertions(+), 2 deletions(-) create mode 100644 docs/images/breaking_changes_save_query.png create mode 100644 docs/images/breaking_changes_save_query_management.png create mode 100644 docs/migration/migrate_7_6.asciidoc diff --git a/docs/images/breaking_changes_save_query.png b/docs/images/breaking_changes_save_query.png new file mode 100644 index 0000000000000000000000000000000000000000..da65e166ed4983c2136103eef02e057aad763029 GIT binary patch literal 37587 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 _vZ7ogj1@Jr{7@?(^aisrUszy^J*KCmDM5D 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 literal 0 HcmV?d00001 diff --git a/docs/images/breaking_changes_save_query_management.png b/docs/images/breaking_changes_save_query_management.png new file mode 100644 index 0000000000000000000000000000000000000000..aba2aa53e2d7c510fcdf42cafb602e26d861ae16 GIT binary patch literal 21256 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 S1}y#n0000> * <> * <> * <> @@ -13,12 +14,13 @@ your application from one version of Kibana to another. * <> * <> -See also <> and <>. +See also <> and <>. -- +include::migration/migrate_7_6.asciidoc[] include::migration/migrate_7_5.asciidoc[] include::migration/migrate_7_4.asciidoc[] include::migration/migrate_7_3.asciidoc[] include::migration/migrate_7_2.asciidoc[] include::migration/migrate_7_1.asciidoc[] -include::migration/migrate_7_0.asciidoc[] \ No newline at end of file +include::migration/migrate_7_0.asciidoc[] diff --git a/docs/migration/migrate_7_6.asciidoc b/docs/migration/migrate_7_6.asciidoc new file mode 100644 index 0000000000000..779e674a780ff --- /dev/null +++ b/docs/migration/migrate_7_6.asciidoc @@ -0,0 +1,1897 @@ +[[breaking-changes-7.6]] +== Breaking changes in 7.6 +++++ +7.6 +++++ + +This page discusses the breaking changes that you need to be aware of when migrating +your application to Kibana 7.6. + +* <> +* <> + + +[float] +[[general-plugin-API-changes]] +=== General plugin API changes + +[float] +==== {kib} no longer crashes when a plugin version does not match the server +{pull}54404[#54404] + +{kib} no longer crashes when a plugin is used against an incompatible {kib} version. +A warning is now displayed in the console instead of throwing and crashing. + +[float] +==== Generate legacy vars when rendering all applications +{pull}54768[#54768] + +Rendering any type of application, even ones for the new platform, +should still generate legacy vars injected into the page metadata. +This ensures these vars are injected for HTTP route rendering as well. + +[float] +==== `uiSettings` image upload field config +{pull}54522[#54522] + +In `uiSettings`, the image upload field required specifying `maxSize` +via the `options` field. This was in conflict with the stated use and +type of `options`, which is a `string[]` used to populate select fields. +`uiOptions` has been provided instead, accepting `Record` values. + +[float] +==== Replaced `map.manifestServiceUrl` setting in kibana.yml with `map.emsTileApiUrl` and `map.emsFileApiUrl` +{pull}54399[#54399] + +The undocumented `map.manifestServiceUrl` setting in kibana.yml has been replaced +by `map.emsTileApiUrl` and `map.emsFileApiUrl`. These settings configure the +base URL for the tile basemap manifest and vector file manifests used in +Elastic Maps and the region map and coordinate map.visualizations. + +[float] +==== Don't expose {es} client as Observable +{pull}53824[#53824] + +{es} clients aren't exposed via the Observable interface anymore. +{es} client provides a static API that handles all {es} config updates under the hood, +transparent to the end-user. + +```js + +const client = core.elasticsearch.dataClient; + +const data = await client.callAsInternalUser('endpoint'); + +``` + +[float] +==== Reduce license plugin API +{pull}53489[#53489] + +License method `isOneOf` was superseded by `hasAtLeast`, which checks +the current license is not less than passes minimal required license. + +```js + +//before + +license.isOneOf(['platinum', 'enterprise', 'trial']) + +// after + +license.hasAtLeast('platinum') + +``` + +[float] +==== State containers +{pull}52384[#52384] + +State containers have now been rewritten and to create state container you +use `createStateContainer` instead of previous `createStore`. +https://github.com/streamich/kibana/blob/state-containers/src/plugins/kibana_utils/docs/state_containers/README.md[See full documentation]. + + +```ts + +import { createStateContainer } from 'src/plugins/kibana_utils'; + +const container = createStateContainer(0, { + + increment: (cnt: number) => (by: number) => cnt + by, + + double: (cnt: number) => () => cnt * 2, + +}); + +container.transitions.increment(5); + +container.transitions.double(); + +console.log(container.get()); // 10 + +``` + + + +[float] +==== Add pre-response HTTP interceptor +{pull}52366[#52366] + +HttpService provides `onPreResponse` interceptor. Interceptor supports extending a response with custom headers. + +```js + + this.registerOnPreResponse((request, preResponseInfo, t) => { + + if(preResponseInfo.statusCode < 300){ + + return t.next({ + + headers: { + + 'x-foo-header': 'bar' + + } + + }); + + } + + return t.next() + +}); + +``` + +[float] +==== Add server rendering service to enable standalone route rendering +{pull}52161[#52161] + +Render a bootstrapped HTML page from a route handler using the `RenderingService` from your server plugin: + +```ts + +const router = createRouter(); + +router.get( + + { path: '/', validate: false }, + + (context, request, response) => + + response.ok({ + + headers: { + + 'content-security-policy': context.core.http.csp.header, + + }, + + body: await context.core.rendering.render(), + + }) + +); + +``` + +[float] +==== Disabled actions +{pull}51975[#51975] + +Embeddable input now has `disabledActions` property. Actions with ID listed +in `disabledActions` will not be rendered by embeddable panel in drop down context menu and badge list. + +```ts + +const embeddable = await embeddableFactory.createFromState( + + state, + + { + + // ... + + disabledActions: ['CUSTOM_TIME_RANGE', 'CUSTOM_TIME_RANGE_BADGE'], + + }, + + // ... + +); + +``` + +[float] +==== Allow chromeless applications to render via non-/app routes +{pull}51527[#51527] + +Allow applications to routable from paths that do not start with `/app`. +This is first enabled via the `appRoute` flag during UI application registration. + +```ts + +export class MyPlugin implements Plugin { + + setup({ application }) { + + application.register({ + + id: 'my-app', + + // App can be accessed via the /my-app route + + appRoute: '/my-app', + + async mount(context, params) { + + const { renderApp } = await import('./application'); + + return renderApp(context, params); + + }, + + }); + + } + +} + +``` + +[float] +==== Add compatibility wrapper for Boom errors thrown from route handler +{pull}51157[#51157] + +Added a new `handleLegacyErrors` method to core `HttpService` router. The method wraps a `RequestHandler` to intercept any thrown `Boom` errors and converts them into proper NP error response. + +```ts + +// plugins/myplugin/server/plugin.ts + +import { schema } from '@kbn/config-schema'; + +import { CoreSetup } from 'src/core/server'; + +export interface DemoPluginsSetup {}; + +class Plugin { + + public setup(core: CoreSetup, pluginSetup: DemoPluginSetup) { + + const router = core.http.createRouter(); + + router.post( + + { + + path: '/api/myplugin/endpoint', + + validate: false, + + }, + + router.wrapErrors((context, req, res) => { + + throw Boom.notFound('not there'); // will be converted into properly interpreted error + + }) + + ) + + } + +} + +``` + +[float] +==== Move SavedQuery to New Platform +{pull}51024[#51024] + +**Saved Query Service** + +Saved query service is now available on the data plugin's `query` start contract. + +```ts + +class MyPlugin { + + public start(core: CoreStart, { data }: MyPluginDependencies) { + + const allSavedQueries = data.query.savedQueries.getAllSavedQueries() + + } + +} + + + +``` + +**Saved Query UI Components** + +The Saved Query management UI components can be imported from `data` plugin directly. + +```ts + + import { SavedQueryManagementComponent, SaveQueryForm } from '../../plugins/data/public'; + +``` + +Saved query Management component + +[role="screenshot"] +image::images/breaking_changes_save_query_management.png[Saved Query Management Component] + +Save query form + +[role="screenshot"] +image::images/breaking_changes_save_query.png[Save Query Form] + +[float] +==== Kibana app migration: Remove old APIs +{pull}50881[#50881] + + +The following undocumented APIs for scroll search and index document count have been removed: + +* `POST /api/kibana/legacy_scroll_continue` + +* `POST /api/kibana/legacy_scroll_start` + +* `POST /api/kibana/{id}/_count` + +[float] +==== ChromeHelpExtension +{pull}50736[#50736] + +The `chrome.helpExtension` has been updated to where it no longer just accepts a function to spit out any content. Now, the extension looks like: + +```tsx + +export interface ChromeHelpExtension { + + appName: string; + + links?: HeaderHelpMenuUIExtraLink[]; + + // You can still pass custom content via the `content` key + + content?: (element: HTMLDivElement) => () => void; + +} + +``` + +[float] +==== Allows plugins to define validation schema for "enabled" flag +{pull}50286[#50286] + +If you want your plugin to be disabled by default you can specify it via config: + +```js + +export const config = { + + schema: schema.object({ enabled: schema.boolean({ defaultValue: true }) }) + +} + +``` + +[float] +==== Add getStartServices API +{pull}50231[#50231] + +Context is being deprecated on the front-end and replaced by the `core.getStartServices()` API. + +```ts + +class Plugin { + + setup(core, plugins) { + + core.application.register({ + + id: 'myApp', + + title: 'My App', + + // `mount` functions with just one argument will only receive `params` + + async mount(params) { + + const [coreStart, depsStart] = await core.getStartServices(); + + const { renderApp } = await import('./application'); + + return renderApp(coreStart, depsStart, params); + + } + + }); + + } + +} + +``` + +[float] +==== Relocated `@kbn/es-query` package to `data` plugin +{pull}50182[#50182] + +The `@kbn/es-query` package has been moved to `src/plugins/data` and is available under the `esQuery` namespace on both the client and the server. + +```ts + +// old + +import { + + buildEsQuery, + + EsQueryConfig, + + buildQueryFromFilters, + + luceneStringToDsl, + + decorateQuery, + + getEsQueryConfig, + +} from '@kbn/es-query'; + +// new + +import { esQuery } from 'src/plugins/data/public'; // or `src/plugins/data/server` + +esQuery.buildEsQuery(...); + +``` + + +[float] +==== Migrate share registry +{pull}50137[#50137] + +The `ui/share` registry is removed in favor of the `share` plugin which exposes a `register` method in the setup contract. The interface of share menu providers does not change except for the removal of angular dependency injection. The function to render the menu also moves into a function exposed by the `share` plugin in the start phase instead of a function which has to be called with the menu item providers. The following items have also been renamed: + +- `ShowProps` -> `ShowShareMenuOptions` + +- `ShareMenuItemProps` -> `ShareContext` + +- `showShareContextMenu` -> `toggleShareContextMenu` + +[float] +==== Ensure chromeless applications hide left navbar link +{pull}50060[#50060] + +Chromeless applications no longer display a navigation link in the left application menu. + +[float] +==== Allow registered applications to hide Kibana chrome +{pull}49795[#49795] + +When registering an application, you can now use the `chromeless` option to hide the Kibana chrome UI when the application is mounted. + +```ts + +application.register({ + + id: 'my-app', + + chromeless: true, + + async mount(context, params) { + + /* ... */ + + }, + +}); + +``` + +[float] +==== Remove react references from core `Notifications` APIs +{pull}49573[#49573] + +The core `NotificationService` and `ToastsApi` methods are now framework agnostic +and no longer accept react components as input. Please use `kibana_react`'s`toMountPoint` +utility to convert a react node to a mountPoint. + +[float] +==== Shim dev tools +{pull}49349[#49349] + +The `ui/registry/dev_tools` is removed in favor of the `DevTools` plugin, +which exposes a `register` method in the setup contract. +Registering app works mostly the same as registering apps in `core.application.register`. +Routing will be handled by the id of the dev tool - your dev tool will be mounted when the URL matches `/app/kibana#/dev_tools/`. This API doesn't support angular, for registering angular dev tools, bootstrap a local module on mount into the given HTML element. + +[float] +==== Kibana app migration: Shim dashboard +{pull}48913[#48913] + +The route flag `requireDefaultIndex` making sure there are index patterns +and the `defaultIndex` advanced setting is set was removed. + +The same functionality can be achieved by using the +helper function `ensureDefaultIndexPattern` from `ui/legacy_compat` within the `resolve` object of a route. + +[float] +==== Remove react references from core `OverlayService` apis +{pull}48431[#48431] + +The core `OverlayService` methods are now framework agnostic and no longer accept react components as input. +Please use `kibana_react`'s`toMountPoint` utility to convert a react component to a mountPoint. + +For exemple: + +```typescript + +core.overlays.openModal() + +``` + +Becomes: + +```typescript + +core.overlays.openModal(toMountPoint()) + +``` + +[float] +==== Supply deprecated req and res properties on IHttpFetchError for legacy compatibility +{pull}48430[#48430] + +Expose deprecated `req: Request` and `res: Response` properties on `IHttpFetchError`s +to help plugins migrated faster by removing an additional migration burden. + +[float] +==== Timelion server API +{pull}47813[#47813] + +The server side AOU of Timelion `/api/timelion/run` used to +accept datemath strings (like `now`) for the `time.from` and `time.to` properties. +This PR removes support for datemath, from now on only ISO8601 encoded strings are supported. + +[float] +==== Pass along request object to all HTTP interceptors +{pull}47258[#47258] + +Make the `Request` instance available to all HTTP interceptors, which is now in a read-only state. +You may now also under-specify the object returned from HTTP response interceptors +to only overwrite specific properties. + +[float] +[[move-to-new-platform-changes]] +=== Plugin API migrations to New Platform + +[float] +==== Expose whitelisted config values to client-side plugin +{pull}50641[#50641] + +New Platform plugins with both a server and client parts can now expose configuration properties to the client-side plugin. + +The properties to expose must be whitelisted in the config declaration. + +```typescript + +// my_plugin/server/index.ts + +const configSchema = schema.object({ + + secret: schema.string({ defaultValue: 'Not really a secret :/' }), + + uiProp: schema.string({ defaultValue: 'Accessible from client' }), + +}); + +type ConfigType = TypeOf; + +export const config: PluginConfigDescriptor = { + + exposeToBrowser: { + + uiProp: true, + + }, + + schema: configSchema, + +}; + +``` + +And can then be accessed in the client-side plugin using the `PluginInitializerContext`: + +```typescript + +// my_plugin/public/index.ts + +interface ClientConfigType { + + uiProp: string; + +} + +export class Plugin implements Plugin { + + constructor(private readonly initializerContext: PluginInitializerContext) {} + + public async setup(core: CoreSetup, deps: {}) { + + const config = this.initializerContext.config.get(); + + // ... + + } + +``` + +[float] +==== Allow registering per-app navigation items +{pull}53136[#53136] + +Allow registering per-app TopNavMenuItems—have a plugin register menu items into another application. + +*New platform plugin* + +```tsx + +class MyPlugin { + + public setup(core: CoreSetup, { navigation }: MyPluginSetupDependencies) { + + const customDiscoverExtension = { + + id: 'registered-discover-prop', + + label: 'Registered Discover Button', + + description: 'Registered Discover Demo', + + run() {}, + + testId: 'demoDiscoverRegisteredNewButton', + + appName: 'discover', + + }; + + navigation.registerMenuItem(customDiscoverExtension); + + } + +} +``` + +*Legacy plugin* + +```tsx + +const customDiscoverExtension = { + + id: 'registered-discover-prop', + + label: 'Registered Discover Button', + + description: 'Registered Discover Demo', + + run() {}, + + testId: 'demoDiscoverRegisteredNewButton', + + appName: 'discover', + +}; + +npSetup.plugins.navigation.registerMenuItem(customDiscoverExtension); +``` + +[float] +==== Management API for Kibana Platform +{pull}52579[#52579] + +Management API for Kibana Platform implemented. +Demonstration code available at `test/plugin_functional/plugins/management_test_plugin/public/plugin.tsx` + + +[float] +==== New platform applications can now prompt user with a message +{pull}54221[#54221] + +New platform applications can now prompt a message when users are trying to +leave the app, allowing to notify them if some changes are unsaved. + +```typescript + + core.application.register({ + + id: 'my-app', + + title: 'MyApp', + + mount: (context, { appBasePath, element, onAppLeave }) => { + + onAppLeave(actions => { + + if(someUnsavedChanges) { + + return actions.confirm( + + 'Some changes are unsaved and will be lost. Are you sure you want to leave MyApp?', + + 'Leaving application' + + ); + + } + + return actions.default(); + + }); + + const div = document.createElement('div'); + + div.innerHTML = '.....'; + + element.appendChild(div); + + return () => div.remove(); + + }, + + }); + +``` + +[float] +==== [NP] Add lifecycle timeout +{pull}54129[#54129] + +{kib} platform deprecates async lifecycles by `v8` release. +{kib} supports async lifecycles for BWC, but limits their time duration to 30 sec. + + +[float] +==== Migrate config deprecations and `ShieldUser` functionality to the New Platform +{pull}53768[#53768] + +In the Security Plugin, the +Legacy `ShieldUser` angular service has been removed and replaced with +the dedicated method on the {kib} platform plugin `setup` contract: + +**Before**: + +```typescript + +const currentUser = await $injector.get('ShieldUser').getCurrent().$promise; + +``` + +**Now**: + +Legacy plugin: + +```typescript + +import { npSetup } from 'ui/new_platform'; + +const currentUser = await npSetup.plugins.security.authc.getCurrentUser(); + +``` + +Kibana platform plugin: + +```json + +// manifest.json + +.... + +[optional]requiredPlugins: ["security"], + +.... + +``` + +```typescript + +// my_plugin/public/plugin.ts + +public setup(core: CoreSetup, { security }: PluginSetupDependencies) { + + const currentUser = await security.authc.getCurrentUser(); + +} + +``` + +[float] +==== NP Migration: Move doc views registry and existing doc views into discover plugin +{pull}53465[#53465] + +The `ui/registry/doc_views` registry is removed in favor of the same +functionality exposed through the setup contract of the `discover` plugin in `core_plugins/kibana`. + +Old way of registering a doc view: + +```ts + +import { addDocView } from 'ui/registry/doc_views'; + +addDocView({ + + title: '', + + order: 10, + + component: MyComponent, + +}); + +``` + +New way of registering a doc view: + +```ts + +import { setup } from '../src/legacy/core_plugins/kibana/public/discover'; + +setup.addDocView({ + + title: '', + + order: 10, + + component: MyComponent, + +}); + +``` + + +[float] +==== bfetch +{pull}52888[#52888] + +`ajax_stream` has been ported to the New Platform. Use `fetchStreaming()` method of `bfetch` plugin instead. + +```js + +import { npStart } from 'ui/new_platform'; + +const { stream, promise } = npStart.plugins.bfetch.fetchStreaming({ url: 'http://elastic.co' }); + +``` + +[float] +==== Move CSP options to New Platform +{pull}52698[#52698] + +The default options used for managing Kibana's Content Security Policy have been moved into core for the new platform. Relevant items exposed from `src/core/server` include: + +- `CspConfig`: TypeScript class for generating CSP configuration. Will generate default configuration for any properties not specified in initialization. + +- `CspConfig.DEFAULT`: Default CSP configuration. + +- `ICspConfig`: Interface representing CSP configuration. + + +[float] +==== Implements config deprecation in New Platform +{pull}52251[#52251] + + +New platform plugin's configuration now supports deprecation. Use the `deprecations` key of a plugin's config descriptor to register them. + +```typescript + + // my_plugin/server/index.ts + + import { schema, TypeOf } from '@kbn/config-schema'; + + import { PluginConfigDescriptor } from 'kibana/server'; + + + + const configSchema = schema.object({ + + someNewKey: schema.string({ defaultValue: 'a string' }), + + }); + + + + type ConfigType = TypeOf; + + + + export const config: PluginConfigDescriptor = { + + schema: configSchema, + + deprecations: ({ rename, unused }) => [ + + rename('someOldKey', 'someNewKey'), + + unused('deprecatedProperty'), + + ], + + }; + +``` + + +[float] +==== [Telemetry] Migrate ui_metric plugin to NP under usageCollection +{pull}51972[#51972] + +Migrates `ui_metrics` to NP under `usageCollection`. + +[float] +==== NP licensing plugin improvements +{pull}51818[#51818] + + +Licensing plugin retrieves license data from {es} and +becomes a source of license data for all {kib} plugins on server-side and client-side. + +*Server-side API* + +The licensing plugin retrieves license data from {es} at regular configurable intervals. + +- `license$: Observable` Provides a steam of license data ILicense. +Plugin emits new value whenever it detects changes in license info. +If the plugin cannot retrieve a license from **Elasticsearch**, it will emit `an empty license` object. + +- `refresh: () => Promise` allows a plugin to enforce license retrieval. + +*Client-side API* + +The licensing plugin retrieves license data from licensing Kibana plugin +and does not communicate with Elasticsearch directly. + +- `license$: Observable` Provides a steam of license data ILicense. +Plugin emits new value whenever it detects changes in license info. If the plugin cannot retrieve a +license from **Kibana**, it will emit `an empty license` object. + +- `refresh: () => Promise` allows a plugin to enforce license retrieval. + + + +[float] +==== [Cloud] move cloud plugin to New Platform +{pull}51789[#51789] + +Fully migrates `cloud` plugin over to NP. To use the NP contract exposed by +the cloud plugin (ex `cloudId` or `isCloudEnabled`) follow this quick guide below. +Note that all the plugins are already migrated to use the NP plugin in this very same PR. + +```json + +// plugin/kibana.json + +{ + + "id": "...", + + "optionalPlugins": ["cloud"] + +} + +``` + +*Server side:* Check for cloud plugin in the `setup` function. + +```ts + +// server/plugin.ts + +import { get } from 'lodash'; + +class Plugin { + + setup(core, plugins) { + + const { cloud } = plugins; + + // use `lodash.get` as cloud might not be available if set as an optional plugin. + + const isCloudEnabled = get(cloud, 'isCloudEnabled', false); + + // ... + + } + +} + +``` + +*Client side:* Both `cloudId` and `isCloudEnabled` are exposed for the the plugins to consume +in the plugins. Until fully transitioned to new platform, your plugins can use `npSetup` to access the cloud plugin. + +```ts + +import { npSetup } from 'ui/new_platform'; + +import { get } from 'lodash'; + +// ... + +const { cloud } = npSetup.plugins; + +const isCloudEnabled = get(cloud, 'isCloudEnabled', false); + +``` + +[float] +==== [Telemetry] Migrate Usage Collector Set to the new Kibana Platform +{pull}51618[#51618] + +Fully migrate (`server.usage.collectorSet`) to New Platform under (`UsageCollection`) plugin. +To use the `UsageCollector` plugin to collect server side stats with the NP follow the quick guide below (Note that all the plugins are already migrated to use this new plugin in this very same PR): + +Make sure `usageCollection` is in your optional Plugins: + +```json + +// plugin/kibana.json + +{ + + "id": "...", + + "optionalPlugins": ["usageCollection"] + +} + +``` + +Register Usage collector in the `setup` function: + +```ts + +// server/plugin.ts + +class Plugin { + + setup(core, plugins) { + + registerMyPluginUsageCollector(plugins.usageCollection); + + } + +} + +``` + +Create and register a Usage Collector. Ideally collectors would be defined in a separate directory `server/collectors/register.ts`. + +```ts + +// server/collectors/register.ts + +import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; + +import { CallCluster } from 'src/legacy/core_plugins/elasticsearch'; + +export function registerMyPluginUsageCollector(usageCollection?: UsageCollectionSetup): void { + + // usageCollection is an optional dependency, so make sure to return if it is not registered. + + if (!usageCollection) { + + return; + + } + + // create usage collector + + const myCollector = usageCollection.makeUsageCollector({ + + type: MY_USAGE_TYPE, + + fetch: async (callCluster: CallCluster) => { + + // query ES and get some data + + // summarize the data into a model + + // return the modeled object that includes whatever you want to track + + return { + + my_objects: { + + total: SOME_NUMBER + + } + + }; + + }, + + }); + + // register usage collector + + usageCollection.registerCollector(myCollector); + +} + +``` + +[float] +==== Move SearchBar to NP +{pull}51028[#51028] + +The SearchBar component is now available by importing from the data plugin. + +```tsx + +import { SearchBar } from '../../../plugins/data/public'; + +``` + +There is also a stateful version available, that requires much fewer dependencies + +```tsx + +export class MyPublicPlugin { + + public start( + + core: CoreStart, + + { data }: MyPublicPluginDependencies + + ) { + + const { SearchBar } = data.ui; + + ... + + return + + } + +} + +``` + +[float] +==== Move QueryBarInput to New Platform +{pull}51023[#51023] + + +* `QueryBarInput` was renamed to `QueryStringInput` and moved to `src/plugins/data/public` + +* The `typeahead` UI component can now be used independently of `QueryStringInput`. It can be imported from `src/plugins/data/public`. + +```ts + + import { QueryStringInput, SuggestionsComponent } from '../../plugins\data\public' + +``` + +[float] +==== Move ApplyFiltersPopover to New Platform +{pull}51022[#51022] + +The `ApplyFiltersPopover` component is no longer exported. + +If you wish to open the filter selection popover, +use the Actions API from within an `embeddable`: + +```ts + + await uiActions.executeTriggerActions(APPLY_FILTER_TRIGGER, { + + embeddable: this, + + filters, + + }); + +``` + +[float] +==== Deprecated the `filter-bar` directive +{pull}51020[#51020] + +If you need to render a filter bar from `angular`, +use the `kbn-top-nav` directive with the following configuration: + +```ts + + + + + +``` + +*Move `FilterBar` React component to New Platform* + +The `FilterBar` component is now available by importing from the `data` plugin. + +```ts + +import { FilterBar } from '../../../plugins/data/public'; + +``` +*Move filter related utilities to New Platform* + + * `IDataPluginServices` ⇒ import from `data` + + * `getDisplayValueFromFilter` ⇒ `data.utils` + + * `buildCustomFilter` ⇒ `esFilters.buildCustomFilter` + + * `buildFilter` ⇒ `esFilters.buildFilter` + + * `getFilterParams` ⇒ `esFilters.getFilterParams` + + * `getIndexPatternFromFilter` ⇒ `utils.getIndexPatternFromFilter` + + * `getQueryDslFromFilter` ⇒ replaced with `esFilters.cleanFIlter` + + * `isFilterable` ⇒ import from `data` + + +[float] +==== NP Kibana plugin home feature catalogue +{pull}50838[#50838] + +The `ui/registries/feature_catalogue` module has been deprecated for removal in 8.0. + +Plugins wishing to migrate may remove their usage of `ui/registries/feature_catalogue` and rely on either: + +```ts + +// For legacy plugins + +import { npSetup } from 'ui/new_platform'; + +npSetup.plugins.home.featureCatalogue.register(/* same details here */); + +// For new plugins: first add 'home` to the list of `optionalPlugins` + +// in your kibana.json file. Then access the plugin directly in `setup`: + +class MyPlugin { + + setup(core, plugins) { + + if (plugins.home) { + + plugins.home.featureCatalogue.register(/* same details here. */); + + } + + } + +} + +``` + +Note that the old module supported providing a Angular DI function to receive Angular dependencies. This is no longer supported as we migrate away from Angular. + + +[float] +==== [NP Kibana Migrations ] Kibana plugin home +{pull}50444[#50444] + +The API to register new tutorials was moved to the new platform. You are now able to add new tutorials by creating a plugin in the new platform, adding a dependency to `home` in its `kibana.json` and using the `tutorials.registerTutorial` method in the setup lifecycle: + +```ts + +class MyPlugin { + + setup(core: CoreSetup, plugins: { home: HomeServerPluginSetup }) { + + home.tutorials.registerTutorial(() => ({ /* tutorial definition */ })); + + } + +} + +``` + +It is still possible to register tutorials from within the legacy platform by calling the same method exposed on the server object: + +```js + +server.newPlatform.setup.plugins.home.tutorials.registerTutorial(() => ({ /* tutorial definition */ })); + +``` + +[float] +==== Expressions fully migrated to the New Platform +{pull}50294[#50294] + +The Expressions service has been moved to the New Platform. Moving forward, any expressions-related code should be consumed via the new plugin's contracts (`src/plugins/expressions`). + +Use it in your New Platform plugin: + +```ts + +class MyPlugin { + + setup (core, { expressions }) { + + expressions.registerFunction(myFunction); + + // ... + + } + + start (core, { expressions }) { + + expressions.execute(myExpression); + + // ... + + } + +} + +``` + +Or, in your legacy platform plugin, consume it through the `ui/new_platform` module: + +```ts + +import { npSetup, npStart } from 'ui/new_platform'; + +npSetup.plugins.expressions.registerFunction(myFunction); + +npStart.plugins.expressions.execute(myExpression); + +// ... + +``` + +[float] +==== Move generateFilters to NP +{pull}50118[#50118] + +Filter generator is now available as a utility function in the `data` plugin. + +```ts + +import { generateFilters } from '../plugins/data/public'; + +const { filterManager } = plugins.data.query; + +const filters = generateFilters(filterManager, field, values, negate, indexString); + +``` + +[float] +==== Move Query type to NP +{pull}49636[#49636] + +Moved the data `Query` type, used to represent a query string in a specific querying language to `src/plugins/data`. + +```ts + +// previously + +import { Query } from `src/legacy/core_plugins/data/public`; + +// now + +import { Query } from `src/plugins/data/public`; + +``` + +[float] +==== Move Timefilter service to NP +{pull}49491[#49491] + +Moved the `timefilter` service to New Platform. + +**Usage in Old Platform**: + +```ts + +import { TimeRange } from 'src/plugins/data/public'; + +import { npSetup, npStart } from 'ui/new_platform'; + +const { timefilter } = npStart.data.timefilter; + +const timeRange: TimeRange = timefilter.getTime(); + +const refreshInterval: RefreshInterval = timefilter.getRefreshInterval() + +``` + +**Usage in New Platform**: + +```ts + +class MyPlugin { + + public setup(core: CoreSetup, { data }: MyPluginSetupDependencies) { + + const timeRange: TimeRange = data.timefilter.timefilter.getTime(); + + } + + public start(core: CoreStart, { data }: MyPluginStartDependencies) { + + const newTimeRange = { from: getYesterday(), to: getNow() } + + data.timefilter.timefilter.setTime(newTimeRange); + + } + +} + +``` + +[float] +==== Move Storage to New Platform +{pull}49448[#49448] + +Move `Storage` to `kibana_utils`. + + - Move `Storage` class to NP, and introduce the interface `IStorageWrapper` for when we only pass storage around. + + - Rename places where `storage` was called `store` + + - Load the Storage directives only where applicable (not in autoload) + +[float] +==== Licensing plugin +{pull}49345[#49345] + +Add x-pack plugin for new platform public licensing information. This will eventually replace the licensing information consumed via `xpack_main`. Upon setup, this plugin exposes an observable API for inspecting and making checks against the license information. + +```ts + +license$.subscribe(license => { + + console.log(license.uid); + + console.log(license.isActive); + + console.log(license.type); + + const { state } = license.check('my-plugin', LICENSE_TYPE.gold); + + if (state !== LICENSE_STATUS.Valid) { + + disableSomething(); + + } + +}); + +``` + +[float] +==== Migrate ui/registry/feature_catalogue to New Platform plugin +{pull}48818[#48818] + +The `ui/registries/feature_catalogue` module has been deprecated for removal in 8.0. + +Plugins wishing to migrate may remove their usage of `ui/registries/feature_catalogue` and rely on either: + +```ts + +// For legacy plugins + +import { npSetup } from 'ui/new_platform'; + +npSetup.plugins.feature_catalogue.register(/* same details here */); + +// For new plugins: first add 'feature_catalogue` to the list of `optionalPlugins` + +// in your kibana.json file. Then access the plugin directly in `setup`: + +class MyPlugin { + + setup(core, plugins) { + + if (plugins.feature_catalogue) { + + plugins.feature_catalogue.register(/* same details here. */); + + } + + } + +} + +``` + +Note that the old module supported providing a Angular DI function to receive Angular dependencies. This is no longer supported as we migrate away from Angular. + +[float] +==== Migrate necessary ui/autoload functionality to NP +{pull}48689[#48689] + +The `ui/autoload/styles` and `ui/autoload/settings` modules have been removed and are no longer necessary to import in your plugin code. Remove these imports starting in 7.6. + +If you still require font awesome, you should import it manually from the npm module: + +```ts + +import 'font-awesome/less/font-awesome'; + +``` + +[float] +==== Provide uiSettings service in NP +{pull}48413[#48413] + +New platform plugins can register custom uiSettings via the `uiSettings.register` method. + +```js + +// src/plugins/my-plugin/server/plugin.ts + +setup(core: CoreSetup){ + + core.uiSettings.register({ + + 'my-plugin:my-setting': { + + name: 'just-work', + + value: true, + + description: 'make it work', + + category: ['my-category'], + + }, + + }) + +} + +``` + +**Access UiSettings client** + +- Via RequestHandlerContext on server-side: + +```js + +(context, req, res) { + + const uiSettingsClient = context.core.uiSettings.client; + + const value = await uiSettings.get('myPlugin:key'); + + // ... + +} + +``` + +- Via core interface in setup/start lifecycles on the client-side: + +```js + +public start({ uiSettings }) { + + const value = uiSettings.get('myPlugin:key'); + +``` + +[float] +==== Move FilterManager to New Platform +{pull}48391[#48391] + +Moved Filter Manager to New Platform. + +**Usage in Old Platform** + +```ts + +import { npSetup, npStart } from 'ui/new_platform'; + +npStart.data.query.filterManager.getFilters() + +... + +``` + +**Usage in New platform** + +```ts + +class MyPlugin { + + public setup(core: CoreSetup, { data }: MyPluginSetupDependencies) { + + data.query.filterManager.getFilters(); + + } + + public start(core: CoreStart, { data }: MyPluginStartDependencies) { + + data.query.filterManager.getFilters(); + + } + +} + +``` + +[float] +==== Migrate ui/doc_title to New platform +{pull}48121[#48121] + +Migrate `chrome.docTitle` to new platform. Plugins can now change the page title using this API. + +```ts + +coreStart.docTitle.change('My Title'); + +``` + +[float] +==== Use NP registry instead of ui/registry/field_formats +{pull}48108[#48108] + +The `FieldFormats` service has been moved to the `data` plugin in the New Platform. +If your plugin has any imports from `ui/registry/field_formats`, you'll need to update your imports as follows: + +Use it in your New Platform plugin: + +```ts + +class MyPlugin { + + setup (core, { data }) { + + data.fieldFormats.register(myFieldFormat); + + // ... + + } + + start (core, { data }) { + + data.fieldFormats.getType(myFieldFormatId); + + // ... + + } + +} + +``` + +Or, in your legacy platform plugin, consume it through the `ui/new_platform` module: + +```ts + +import { npSetup, npStart } from 'ui/new_platform'; + +npSetup.plugins.data.fieldFormats.register(myFieldFormat); + +npStart.plugins.data.fieldFormats.getType(myFieldFormatId); + +// ... + +``` + +[float] +==== ui/management to New Platform +{pull}45747[#45747] + +The following interfaces were previously available under `ui/management` +and are now available via `import { setup as managementSetup }`` +from `'${correct path to top dir}src/legacy/core_plugins/management/public/legacy';` + +* `ui/management/saved_objects_management` + +* `ui/management/index_pattern_creation` + +* `ui/management/index_pattern_list` + +[float] +==== `ui/public` cleanup +{pull}43511[#43511] + +**Removed / moved modules** + +In preparation for Kibana's upcoming new platform, we are in the process +of migrating awayfrom the `ui/public` directory. +Over time, the contents of this directory will be either deprecated or +housed inside a parent plugin. + +If your plugin imports the listed items from the following `ui/public` modules, +you will need to either update your import statements as indicated below, +so that you are pulling these modules from their new locations, +or copy the relevant code into your plugin. + +[float] +**`ui/state_management`** +{pull}51835[#51835] +{pull}52172[#52172] +{pull}52280[#52280] +{pull}53582[#53582] + +The `hashUrl` and `unhashUrl` functions no longer rely on states being provided as an argument, therefore `getUnhashableStates`/`getUnhashableStatesProvider` have been removed. + +```ts +// old + +import { + + hashUrl, + + unhashUrl, + + getUnhashableStatesProvider, // deprecated + +} from 'ui/state_management/state_hashing'; + +const getUnhashableStates = Private(getUnhashableStatesProvider); + +unhashUrl(window.location.href, getUnhashableStates()); + +hashUrl([new AppState(), globalState], myRedirectUrl); + +// new + +import { hashUrl, unhashUrl } from '../../plugins/kibana_utils/public' + +hashUrl(window.location.href); + +unhashUrl(myRedirectUrl); + +``` + +HashedItemStore was also moved to the `kibana_utils` plugin. + +```ts +// old + +import { HashedItemStoreSingleton } from 'ui/state_management/state_storage' + +// new + +import { hashedItemStore } from '../../plugins/kibana_utils/public' + +``` + +Created new state syncing utilities for syncing state between state containers and different type of state storage (e.g. query params in URL or session storage). + +Example app: `examples/state_containers_examples` + +This should become a replacement for `AppState` and `GlobalState` in NP. + +**`ui/public/utils` cleanup** + +- `base_object` and `find_by_param` utilities have been removed {pull}52500[#52500] + +- `decode_geo_hash` and `zoom_to_precision` utilities have been moved to `ui/vis/map`{pull}52615[#52615] + +- `range` utility has beed moved to `ui/vis/editors/default` {pull}52615[#52615] + +- `cidr_mask`, `date_range`, `geo_utils`, `ip_range`, `ordinal_suffix` utilities have been moved to `ui/agg_types` {pull}52744[#52744] + +- `case_conversion` {pull}53819[#53819] + + - `keysToSnakeCaseShallow` moved to `src/legacy/server/status/lib` + + - `keysToCamelCaseShallow` moved to `src/legacy/core_plugins/kibana/public/management` + +- `collection` {pull}53819[#53819] + + - `organizeBy moved to `src/legacy/ui/public/indexed_array` + + - `pushAll` was removed + +- `diff_object moved to `ui/state_management` {pull}53819[#53819] + +- `function` was removed {pull}53819[#53819] + +- `key_map` moved to `ui/directives` {pull}53819[#53819] + +- `math` moved to `ui/vis` {pull}53819[#53819] + +- `numeric` moved to `src/legacy/core_plugins/kibana/public/management` {pull}53819[#53819] + +- `parse_interval` moved to`src/legacy/core_plugins/data/common` {pull}53819[#53819] + +- `sort_prefix_first` moved to `x-pack/legacy/plugins/kuery_autocomplete` {pull}53819[#53819] + +- `supports` moved to `src/legacy/core_plugins/tile_map/public` {pull}53819[#53819] + +[float] +==== Index Patterns moved to New Platform +{pull}43438[#43438] + +The `indexPatterns` service is now available from the data plugin. + +```ts + +class MyPlugin { + + start(core, data) { + + const indexPatterns = data.indexPatterns.get(indexPatternId); + + ... + + } + +} +``` + +[float] +**Type Definitions** + + * The `IndexPattern` type replaces the legacy `StaticIndexPattern` type + * `IndexPattern` was moved to the new plugin. + * `FieldList` was moved to the new plugin and the `IFieldList` type was added. + * `Field` was moved to the new plugin, along side the `IFieldType` type. +```ts + + import { IIndexPattern, IFieldType } from 'src/plugins/data/public'; + + const indexPattern: IIndexPattern = data.indexPatterns.find(indexPatternId); + + const field: IFieldType[] = indexPattern.fields; + +``` + +**Helper functions** + +```ts + + import { indexPatterns as indexPatternsUtils } from 'src/plugins/data/public'; + + const indexPattern: IIndexPattern = indexPatterns.getFromSavedObject(savedObject) + + const isValid = indexPatterns.validateIndexPattern(indexPatternString) + +``` + +**Deletions** + + * `IndexPatternAlreadyExists` + + * `NoDefaultIndexPattern` + + * `NoDefinedIndexPatterns`