diff --git a/docs/development/core/public/kibana-plugin-public.chromenavlinks.update.md b/docs/development/core/public/kibana-plugin-public.chromenavlinks.update.md
index d1cd2d3b04950..155d149f334a1 100644
--- a/docs/development/core/public/kibana-plugin-public.chromenavlinks.update.md
+++ b/docs/development/core/public/kibana-plugin-public.chromenavlinks.update.md
@@ -1,30 +1,30 @@
-
-
-[Home](./index.md) > [kibana-plugin-public](./kibana-plugin-public.md) > [ChromeNavLinks](./kibana-plugin-public.chromenavlinks.md) > [update](./kibana-plugin-public.chromenavlinks.update.md)
-
-## ChromeNavLinks.update() method
-
-> Warning: This API is now obsolete.
->
-> Uses the [AppBase.updater$](./kibana-plugin-public.appbase.updater_.md) property when registering your application with [ApplicationSetup.register()](./kibana-plugin-public.applicationsetup.register.md) instead.
->
-
-Update the navlink for the given id with the updated attributes. Returns the updated navlink or `undefined` if it does not exist.
-
-Signature:
-
-```typescript
-update(id: string, values: ChromeNavLinkUpdateableFields): ChromeNavLink | undefined;
-```
-
-## Parameters
-
-| Parameter | Type | Description |
-| --- | --- | --- |
-| id | string
| |
-| values | ChromeNavLinkUpdateableFields
| |
-
-Returns:
-
-`ChromeNavLink | undefined`
-
+
+
+[Home](./index.md) > [kibana-plugin-public](./kibana-plugin-public.md) > [ChromeNavLinks](./kibana-plugin-public.chromenavlinks.md) > [update](./kibana-plugin-public.chromenavlinks.update.md)
+
+## ChromeNavLinks.update() method
+
+> Warning: This API is now obsolete.
+>
+> Uses the [AppBase.updater$](./kibana-plugin-public.appbase.updater_.md) property when registering your application with [ApplicationSetup.register()](./kibana-plugin-public.applicationsetup.register.md) instead.
+>
+
+Update the navlink for the given id with the updated attributes. Returns the updated navlink or `undefined` if it does not exist.
+
+Signature:
+
+```typescript
+update(id: string, values: ChromeNavLinkUpdateableFields): ChromeNavLink | undefined;
+```
+
+## Parameters
+
+| Parameter | Type | Description |
+| --- | --- | --- |
+| id | string
| |
+| values | ChromeNavLinkUpdateableFields
| |
+
+Returns:
+
+`ChromeNavLink | undefined`
+
diff --git a/docs/development/core/public/kibana-plugin-public.corestart.fatalerrors.md b/docs/development/core/public/kibana-plugin-public.corestart.fatalerrors.md
new file mode 100644
index 0000000000000..540b17b5a6f0b
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-public.corestart.fatalerrors.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-public](./kibana-plugin-public.md) > [CoreStart](./kibana-plugin-public.corestart.md) > [fatalErrors](./kibana-plugin-public.corestart.fatalerrors.md)
+
+## CoreStart.fatalErrors property
+
+[FatalErrorsStart](./kibana-plugin-public.fatalerrorsstart.md)
+
+Signature:
+
+```typescript
+fatalErrors: FatalErrorsStart;
+```
diff --git a/docs/development/core/public/kibana-plugin-public.corestart.md b/docs/development/core/public/kibana-plugin-public.corestart.md
index e561ee313f100..83af82d590c36 100644
--- a/docs/development/core/public/kibana-plugin-public.corestart.md
+++ b/docs/development/core/public/kibana-plugin-public.corestart.md
@@ -19,6 +19,7 @@ export interface CoreStart
| [application](./kibana-plugin-public.corestart.application.md) | ApplicationStart
| [ApplicationStart](./kibana-plugin-public.applicationstart.md) |
| [chrome](./kibana-plugin-public.corestart.chrome.md) | ChromeStart
| [ChromeStart](./kibana-plugin-public.chromestart.md) |
| [docLinks](./kibana-plugin-public.corestart.doclinks.md) | DocLinksStart
| [DocLinksStart](./kibana-plugin-public.doclinksstart.md) |
+| [fatalErrors](./kibana-plugin-public.corestart.fatalerrors.md) | FatalErrorsStart
| [FatalErrorsStart](./kibana-plugin-public.fatalerrorsstart.md) |
| [http](./kibana-plugin-public.corestart.http.md) | HttpStart
| [HttpStart](./kibana-plugin-public.httpstart.md) |
| [i18n](./kibana-plugin-public.corestart.i18n.md) | I18nStart
| [I18nStart](./kibana-plugin-public.i18nstart.md) |
| [injectedMetadata](./kibana-plugin-public.corestart.injectedmetadata.md) | {
getInjectedVar: (name: string, defaultValue?: any) => unknown;
}
| exposed temporarily until https://github.com/elastic/kibana/issues/41990 done use \*only\* to retrieve config values. There is no way to set injected values in the new platform. Use the legacy platform API instead. |
diff --git a/docs/development/core/public/kibana-plugin-public.fatalerrorsstart.md b/docs/development/core/public/kibana-plugin-public.fatalerrorsstart.md
new file mode 100644
index 0000000000000..a8ece7dcb7e02
--- /dev/null
+++ b/docs/development/core/public/kibana-plugin-public.fatalerrorsstart.md
@@ -0,0 +1,13 @@
+
+
+[Home](./index.md) > [kibana-plugin-public](./kibana-plugin-public.md) > [FatalErrorsStart](./kibana-plugin-public.fatalerrorsstart.md)
+
+## FatalErrorsStart type
+
+FatalErrors stop the Kibana Public Core and displays a fatal error screen with details about the Kibana build and the error.
+
+Signature:
+
+```typescript
+export declare type FatalErrorsStart = FatalErrorsSetup;
+```
diff --git a/docs/development/core/public/kibana-plugin-public.md b/docs/development/core/public/kibana-plugin-public.md
index 27ca9f2d9fd57..27037d46926c1 100644
--- a/docs/development/core/public/kibana-plugin-public.md
+++ b/docs/development/core/public/kibana-plugin-public.md
@@ -129,6 +129,7 @@ The plugin integrates with the core system via lifecycle events: `setup`
| [ChromeHelpExtensionMenuGitHubLink](./kibana-plugin-public.chromehelpextensionmenugithublink.md) | |
| [ChromeHelpExtensionMenuLink](./kibana-plugin-public.chromehelpextensionmenulink.md) | |
| [ChromeNavLinkUpdateableFields](./kibana-plugin-public.chromenavlinkupdateablefields.md) | |
+| [FatalErrorsStart](./kibana-plugin-public.fatalerrorsstart.md) | FatalErrors stop the Kibana Public Core and displays a fatal error screen with details about the Kibana build and the error. |
| [HandlerContextType](./kibana-plugin-public.handlercontexttype.md) | Extracts the type of the first argument of a [HandlerFunction](./kibana-plugin-public.handlerfunction.md) to represent the type of the context. |
| [HandlerFunction](./kibana-plugin-public.handlerfunction.md) | A function that accepts a context object and an optional number of additional arguments. Used for the generic types in [IContextContainer](./kibana-plugin-public.icontextcontainer.md) |
| [HandlerParameters](./kibana-plugin-public.handlerparameters.md) | Extracts the types of the additional arguments of a [HandlerFunction](./kibana-plugin-public.handlerfunction.md), excluding the [HandlerContextType](./kibana-plugin-public.handlercontexttype.md). |
diff --git a/src/core/public/core_system.ts b/src/core/public/core_system.ts
index 5b31c740518e4..97bd49416f705 100644
--- a/src/core/public/core_system.ts
+++ b/src/core/public/core_system.ts
@@ -214,6 +214,7 @@ export class CoreSystem {
const http = await this.http.start({ injectedMetadata, fatalErrors: this.fatalErrorsSetup! });
const savedObjects = await this.savedObjects.start({ http });
const i18n = await this.i18n.start();
+ const fatalErrors = await this.fatalErrors.start();
await this.integrations.start({ uiSettings });
const coreUiTargetDomElement = document.createElement('div');
@@ -271,6 +272,7 @@ export class CoreSystem {
notifications,
overlays,
uiSettings,
+ fatalErrors,
};
const plugins = await this.plugins.start(core);
diff --git a/src/core/public/fatal_errors/fatal_errors_service.mock.ts b/src/core/public/fatal_errors/fatal_errors_service.mock.ts
index dd7702a7ee7dd..6d9876f787fa9 100644
--- a/src/core/public/fatal_errors/fatal_errors_service.mock.ts
+++ b/src/core/public/fatal_errors/fatal_errors_service.mock.ts
@@ -26,18 +26,22 @@ const createSetupContractMock = () => {
return setupContract;
};
+const createStartContractMock = createSetupContractMock;
type FatalErrorsServiceContract = PublicMethodsOf;
const createMock = () => {
const mocked: jest.Mocked = {
setup: jest.fn(),
+ start: jest.fn(),
};
mocked.setup.mockReturnValue(createSetupContractMock());
+ mocked.start.mockReturnValue(createStartContractMock());
return mocked;
};
export const fatalErrorsServiceMock = {
create: createMock,
createSetupContract: createSetupContractMock,
+ createStartContract: createStartContractMock,
};
diff --git a/src/core/public/fatal_errors/fatal_errors_service.tsx b/src/core/public/fatal_errors/fatal_errors_service.tsx
index 5c6a7bb322ae1..309f07859ef26 100644
--- a/src/core/public/fatal_errors/fatal_errors_service.tsx
+++ b/src/core/public/fatal_errors/fatal_errors_service.tsx
@@ -54,9 +54,18 @@ export interface FatalErrorsSetup {
get$: () => Rx.Observable;
}
+/**
+ * FatalErrors stop the Kibana Public Core and displays a fatal error screen
+ * with details about the Kibana build and the error.
+ *
+ * @public
+ */
+export type FatalErrorsStart = FatalErrorsSetup;
+
/** @interal */
export class FatalErrorsService {
private readonly errorInfo$ = new Rx.ReplaySubject();
+ private fatalErrors?: FatalErrorsSetup;
/**
*
@@ -82,7 +91,7 @@ export class FatalErrorsService {
},
});
- const fatalErrorsSetup: FatalErrorsSetup = {
+ this.fatalErrors = {
add: (error, source?) => {
const errorInfo = getErrorInfo(error, source);
@@ -101,9 +110,17 @@ export class FatalErrorsService {
},
};
- this.setupGlobalErrorHandlers(fatalErrorsSetup);
+ this.setupGlobalErrorHandlers(this.fatalErrors!);
- return fatalErrorsSetup;
+ return this.fatalErrors!;
+ }
+
+ public start() {
+ const { fatalErrors } = this;
+ if (!fatalErrors) {
+ throw new Error('FatalErrorsService#setup() must be invoked before start.');
+ }
+ return fatalErrors;
}
private renderError(injectedMetadata: InjectedMetadataSetup, i18n: I18nStart) {
diff --git a/src/core/public/fatal_errors/index.ts b/src/core/public/fatal_errors/index.ts
index e37a36152cf91..c8ea1c0bccd22 100644
--- a/src/core/public/fatal_errors/index.ts
+++ b/src/core/public/fatal_errors/index.ts
@@ -17,5 +17,5 @@
* under the License.
*/
-export { FatalErrorsSetup, FatalErrorsService } from './fatal_errors_service';
+export { FatalErrorsSetup, FatalErrorsStart, FatalErrorsService } from './fatal_errors_service';
export { FatalErrorInfo } from './get_error_info';
diff --git a/src/core/public/index.ts b/src/core/public/index.ts
index 5b17eccc37f8b..5e732dd05e616 100644
--- a/src/core/public/index.ts
+++ b/src/core/public/index.ts
@@ -55,7 +55,7 @@ import {
ChromeRecentlyAccessed,
ChromeRecentlyAccessedHistoryItem,
} from './chrome';
-import { FatalErrorsSetup, FatalErrorInfo } from './fatal_errors';
+import { FatalErrorsSetup, FatalErrorsStart, FatalErrorInfo } from './fatal_errors';
import { HttpSetup, HttpStart } from './http';
import { I18nStart } from './i18n';
import { InjectedMetadataSetup, InjectedMetadataStart, LegacyNavLink } from './injected_metadata';
@@ -232,6 +232,8 @@ export interface CoreStart {
overlays: OverlayStart;
/** {@link IUiSettingsClient} */
uiSettings: IUiSettingsClient;
+ /** {@link FatalErrorsStart} */
+ fatalErrors: FatalErrorsStart;
/**
* exposed temporarily until https://github.com/elastic/kibana/issues/41990 done
* use *only* to retrieve config values. There is no way to set injected values
@@ -302,6 +304,7 @@ export {
DocLinksStart,
FatalErrorInfo,
FatalErrorsSetup,
+ FatalErrorsStart,
HttpSetup,
HttpStart,
I18nStart,
diff --git a/src/core/public/legacy/legacy_service.test.ts b/src/core/public/legacy/legacy_service.test.ts
index 9dd24f9e4a7a3..d08c8b52e39c9 100644
--- a/src/core/public/legacy/legacy_service.test.ts
+++ b/src/core/public/legacy/legacy_service.test.ts
@@ -98,6 +98,7 @@ const notificationsStart = notificationServiceMock.createStartContract();
const overlayStart = overlayServiceMock.createStartContract();
const uiSettingsStart = uiSettingsServiceMock.createStartContract();
const savedObjectsStart = savedObjectsMock.createStartContract();
+const fatalErrorsStart = fatalErrorsServiceMock.createStartContract();
const mockStorage = { getItem: jest.fn() } as any;
const defaultStartDeps = {
@@ -112,6 +113,7 @@ const defaultStartDeps = {
overlays: overlayStart,
uiSettings: uiSettingsStart,
savedObjects: savedObjectsStart,
+ fatalErrors: fatalErrorsStart,
},
lastSubUrlStorage: mockStorage,
targetDomElement: document.createElement('div'),
diff --git a/src/core/public/mocks.ts b/src/core/public/mocks.ts
index 43c8aa6f1d6b9..ce90d49065ad4 100644
--- a/src/core/public/mocks.ts
+++ b/src/core/public/mocks.ts
@@ -74,6 +74,7 @@ function createCoreStartMock({ basePath = '' } = {}) {
injectedMetadata: {
getInjectedVar: injectedMetadataServiceMock.createStartContract().getInjectedVar,
},
+ fatalErrors: fatalErrorsServiceMock.createStartContract(),
};
return mock;
diff --git a/src/core/public/plugins/plugin_context.ts b/src/core/public/plugins/plugin_context.ts
index f146c2452868b..48100cba4f26e 100644
--- a/src/core/public/plugins/plugin_context.ts
+++ b/src/core/public/plugins/plugin_context.ts
@@ -151,5 +151,6 @@ export function createPluginStartContext<
injectedMetadata: {
getInjectedVar: deps.injectedMetadata.getInjectedVar,
},
+ fatalErrors: deps.fatalErrors,
};
}
diff --git a/src/core/public/plugins/plugins_service.test.ts b/src/core/public/plugins/plugins_service.test.ts
index cafc7e5887e38..dbbcda8d60e12 100644
--- a/src/core/public/plugins/plugins_service.test.ts
+++ b/src/core/public/plugins/plugins_service.test.ts
@@ -111,6 +111,7 @@ describe('PluginsService', () => {
overlays: overlayServiceMock.createStartContract(),
uiSettings: uiSettingsServiceMock.createStartContract(),
savedObjects: savedObjectsMock.createStartContract(),
+ fatalErrors: fatalErrorsServiceMock.createStartContract(),
};
mockStartContext = {
...mockStartDeps,
diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md
index abd39e864bd30..f7b260c68ee96 100644
--- a/src/core/public/public.api.md
+++ b/src/core/public/public.api.md
@@ -377,6 +377,8 @@ export interface CoreStart {
// (undocumented)
docLinks: DocLinksStart;
// (undocumented)
+ fatalErrors: FatalErrorsStart;
+ // (undocumented)
http: HttpStart;
// (undocumented)
i18n: I18nStart;
@@ -532,6 +534,9 @@ export interface FatalErrorsSetup {
get$: () => Rx.Observable;
}
+// @public
+export type FatalErrorsStart = FatalErrorsSetup;
+
// @public
export type HandlerContextType> = T extends HandlerFunction ? U : never;
diff --git a/src/plugins/data/public/ui/query_string_input/__snapshots__/query_string_input.test.tsx.snap b/src/plugins/data/public/ui/query_string_input/__snapshots__/query_string_input.test.tsx.snap
index bc08c87304fca..d8db53d4c6020 100644
--- a/src/plugins/data/public/ui/query_string_input/__snapshots__/query_string_input.test.tsx.snap
+++ b/src/plugins/data/public/ui/query_string_input/__snapshots__/query_string_input.test.tsx.snap
@@ -304,6 +304,10 @@ exports[`QueryStringInput Should disable autoFocus on EuiFieldText when disableA
},
},
},
+ "fatalErrors": Object {
+ "add": [MockFunction],
+ "get$": [MockFunction],
+ },
"http": Object {
"addLoadingCountSource": [MockFunction],
"anonymousPaths": Object {
@@ -930,6 +934,10 @@ exports[`QueryStringInput Should disable autoFocus on EuiFieldText when disableA
},
},
},
+ "fatalErrors": Object {
+ "add": [MockFunction],
+ "get$": [MockFunction],
+ },
"http": Object {
"addLoadingCountSource": [MockFunction],
"anonymousPaths": Object {
@@ -1538,6 +1546,10 @@ exports[`QueryStringInput Should pass the query language to the language switche
},
},
},
+ "fatalErrors": Object {
+ "add": [MockFunction],
+ "get$": [MockFunction],
+ },
"http": Object {
"addLoadingCountSource": [MockFunction],
"anonymousPaths": Object {
@@ -2161,6 +2173,10 @@ exports[`QueryStringInput Should pass the query language to the language switche
},
},
},
+ "fatalErrors": Object {
+ "add": [MockFunction],
+ "get$": [MockFunction],
+ },
"http": Object {
"addLoadingCountSource": [MockFunction],
"anonymousPaths": Object {
@@ -2769,6 +2785,10 @@ exports[`QueryStringInput Should render the given query 1`] = `
},
},
},
+ "fatalErrors": Object {
+ "add": [MockFunction],
+ "get$": [MockFunction],
+ },
"http": Object {
"addLoadingCountSource": [MockFunction],
"anonymousPaths": Object {
@@ -3392,6 +3412,10 @@ exports[`QueryStringInput Should render the given query 1`] = `
},
},
},
+ "fatalErrors": Object {
+ "add": [MockFunction],
+ "get$": [MockFunction],
+ },
"http": Object {
"addLoadingCountSource": [MockFunction],
"anonymousPaths": Object {