Expose fatalErrors API from the Start contract (#55300)

* Expose FatalErrors from the Start contract.

This API is intended to be used for runtime as well.

* update docs

* update data plugin snapshot to fix tests

* address comments

Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
This commit is contained in:
Mikhail Shustov 2020-01-21 12:58:40 +01:00 committed by GitHub
parent 4ca2fbdb11
commit 4971a2c772
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 123 additions and 35 deletions

View file

@ -1,30 +1,30 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. --> <!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-public](./kibana-plugin-public.md) &gt; [ChromeNavLinks](./kibana-plugin-public.chromenavlinks.md) &gt; [update](./kibana-plugin-public.chromenavlinks.update.md) [Home](./index.md) &gt; [kibana-plugin-public](./kibana-plugin-public.md) &gt; [ChromeNavLinks](./kibana-plugin-public.chromenavlinks.md) &gt; [update](./kibana-plugin-public.chromenavlinks.update.md)
## ChromeNavLinks.update() method ## ChromeNavLinks.update() method
> Warning: This API is now obsolete. > 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. > 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. Update the navlink for the given id with the updated attributes. Returns the updated navlink or `undefined` if it does not exist.
<b>Signature:</b> <b>Signature:</b>
```typescript ```typescript
update(id: string, values: ChromeNavLinkUpdateableFields): ChromeNavLink | undefined; update(id: string, values: ChromeNavLinkUpdateableFields): ChromeNavLink | undefined;
``` ```
## Parameters ## Parameters
| Parameter | Type | Description | | Parameter | Type | Description |
| --- | --- | --- | | --- | --- | --- |
| id | <code>string</code> | | | id | <code>string</code> | |
| values | <code>ChromeNavLinkUpdateableFields</code> | | | values | <code>ChromeNavLinkUpdateableFields</code> | |
<b>Returns:</b> <b>Returns:</b>
`ChromeNavLink | undefined` `ChromeNavLink | undefined`

View file

@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-public](./kibana-plugin-public.md) &gt; [CoreStart](./kibana-plugin-public.corestart.md) &gt; [fatalErrors](./kibana-plugin-public.corestart.fatalerrors.md)
## CoreStart.fatalErrors property
[FatalErrorsStart](./kibana-plugin-public.fatalerrorsstart.md)
<b>Signature:</b>
```typescript
fatalErrors: FatalErrorsStart;
```

View file

@ -19,6 +19,7 @@ export interface CoreStart
| [application](./kibana-plugin-public.corestart.application.md) | <code>ApplicationStart</code> | [ApplicationStart](./kibana-plugin-public.applicationstart.md) | | [application](./kibana-plugin-public.corestart.application.md) | <code>ApplicationStart</code> | [ApplicationStart](./kibana-plugin-public.applicationstart.md) |
| [chrome](./kibana-plugin-public.corestart.chrome.md) | <code>ChromeStart</code> | [ChromeStart](./kibana-plugin-public.chromestart.md) | | [chrome](./kibana-plugin-public.corestart.chrome.md) | <code>ChromeStart</code> | [ChromeStart](./kibana-plugin-public.chromestart.md) |
| [docLinks](./kibana-plugin-public.corestart.doclinks.md) | <code>DocLinksStart</code> | [DocLinksStart](./kibana-plugin-public.doclinksstart.md) | | [docLinks](./kibana-plugin-public.corestart.doclinks.md) | <code>DocLinksStart</code> | [DocLinksStart](./kibana-plugin-public.doclinksstart.md) |
| [fatalErrors](./kibana-plugin-public.corestart.fatalerrors.md) | <code>FatalErrorsStart</code> | [FatalErrorsStart](./kibana-plugin-public.fatalerrorsstart.md) |
| [http](./kibana-plugin-public.corestart.http.md) | <code>HttpStart</code> | [HttpStart](./kibana-plugin-public.httpstart.md) | | [http](./kibana-plugin-public.corestart.http.md) | <code>HttpStart</code> | [HttpStart](./kibana-plugin-public.httpstart.md) |
| [i18n](./kibana-plugin-public.corestart.i18n.md) | <code>I18nStart</code> | [I18nStart](./kibana-plugin-public.i18nstart.md) | | [i18n](./kibana-plugin-public.corestart.i18n.md) | <code>I18nStart</code> | [I18nStart](./kibana-plugin-public.i18nstart.md) |
| [injectedMetadata](./kibana-plugin-public.corestart.injectedmetadata.md) | <code>{</code><br/><code> getInjectedVar: (name: string, defaultValue?: any) =&gt; unknown;</code><br/><code> }</code> | 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. | | [injectedMetadata](./kibana-plugin-public.corestart.injectedmetadata.md) | <code>{</code><br/><code> getInjectedVar: (name: string, defaultValue?: any) =&gt; unknown;</code><br/><code> }</code> | 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. |

View file

@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-public](./kibana-plugin-public.md) &gt; [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.
<b>Signature:</b>
```typescript
export declare type FatalErrorsStart = FatalErrorsSetup;
```

View file

@ -129,6 +129,7 @@ The plugin integrates with the core system via lifecycle events: `setup`<!-- -->
| [ChromeHelpExtensionMenuGitHubLink](./kibana-plugin-public.chromehelpextensionmenugithublink.md) | | | [ChromeHelpExtensionMenuGitHubLink](./kibana-plugin-public.chromehelpextensionmenugithublink.md) | |
| [ChromeHelpExtensionMenuLink](./kibana-plugin-public.chromehelpextensionmenulink.md) | | | [ChromeHelpExtensionMenuLink](./kibana-plugin-public.chromehelpextensionmenulink.md) | |
| [ChromeNavLinkUpdateableFields](./kibana-plugin-public.chromenavlinkupdateablefields.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. | | [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) | | [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)<!-- -->. | | [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)<!-- -->. |

View file

@ -214,6 +214,7 @@ export class CoreSystem {
const http = await this.http.start({ injectedMetadata, fatalErrors: this.fatalErrorsSetup! }); const http = await this.http.start({ injectedMetadata, fatalErrors: this.fatalErrorsSetup! });
const savedObjects = await this.savedObjects.start({ http }); const savedObjects = await this.savedObjects.start({ http });
const i18n = await this.i18n.start(); const i18n = await this.i18n.start();
const fatalErrors = await this.fatalErrors.start();
await this.integrations.start({ uiSettings }); await this.integrations.start({ uiSettings });
const coreUiTargetDomElement = document.createElement('div'); const coreUiTargetDomElement = document.createElement('div');
@ -271,6 +272,7 @@ export class CoreSystem {
notifications, notifications,
overlays, overlays,
uiSettings, uiSettings,
fatalErrors,
}; };
const plugins = await this.plugins.start(core); const plugins = await this.plugins.start(core);

View file

@ -26,18 +26,22 @@ const createSetupContractMock = () => {
return setupContract; return setupContract;
}; };
const createStartContractMock = createSetupContractMock;
type FatalErrorsServiceContract = PublicMethodsOf<FatalErrorsService>; type FatalErrorsServiceContract = PublicMethodsOf<FatalErrorsService>;
const createMock = () => { const createMock = () => {
const mocked: jest.Mocked<FatalErrorsServiceContract> = { const mocked: jest.Mocked<FatalErrorsServiceContract> = {
setup: jest.fn(), setup: jest.fn(),
start: jest.fn(),
}; };
mocked.setup.mockReturnValue(createSetupContractMock()); mocked.setup.mockReturnValue(createSetupContractMock());
mocked.start.mockReturnValue(createStartContractMock());
return mocked; return mocked;
}; };
export const fatalErrorsServiceMock = { export const fatalErrorsServiceMock = {
create: createMock, create: createMock,
createSetupContract: createSetupContractMock, createSetupContract: createSetupContractMock,
createStartContract: createStartContractMock,
}; };

View file

@ -54,9 +54,18 @@ export interface FatalErrorsSetup {
get$: () => Rx.Observable<FatalErrorInfo>; get$: () => Rx.Observable<FatalErrorInfo>;
} }
/**
* 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 */ /** @interal */
export class FatalErrorsService { export class FatalErrorsService {
private readonly errorInfo$ = new Rx.ReplaySubject<FatalErrorInfo>(); private readonly errorInfo$ = new Rx.ReplaySubject<FatalErrorInfo>();
private fatalErrors?: FatalErrorsSetup;
/** /**
* *
@ -82,7 +91,7 @@ export class FatalErrorsService {
}, },
}); });
const fatalErrorsSetup: FatalErrorsSetup = { this.fatalErrors = {
add: (error, source?) => { add: (error, source?) => {
const errorInfo = getErrorInfo(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) { private renderError(injectedMetadata: InjectedMetadataSetup, i18n: I18nStart) {

View file

@ -17,5 +17,5 @@
* under the License. * under the License.
*/ */
export { FatalErrorsSetup, FatalErrorsService } from './fatal_errors_service'; export { FatalErrorsSetup, FatalErrorsStart, FatalErrorsService } from './fatal_errors_service';
export { FatalErrorInfo } from './get_error_info'; export { FatalErrorInfo } from './get_error_info';

View file

@ -55,7 +55,7 @@ import {
ChromeRecentlyAccessed, ChromeRecentlyAccessed,
ChromeRecentlyAccessedHistoryItem, ChromeRecentlyAccessedHistoryItem,
} from './chrome'; } from './chrome';
import { FatalErrorsSetup, FatalErrorInfo } from './fatal_errors'; import { FatalErrorsSetup, FatalErrorsStart, FatalErrorInfo } from './fatal_errors';
import { HttpSetup, HttpStart } from './http'; import { HttpSetup, HttpStart } from './http';
import { I18nStart } from './i18n'; import { I18nStart } from './i18n';
import { InjectedMetadataSetup, InjectedMetadataStart, LegacyNavLink } from './injected_metadata'; import { InjectedMetadataSetup, InjectedMetadataStart, LegacyNavLink } from './injected_metadata';
@ -232,6 +232,8 @@ export interface CoreStart {
overlays: OverlayStart; overlays: OverlayStart;
/** {@link IUiSettingsClient} */ /** {@link IUiSettingsClient} */
uiSettings: IUiSettingsClient; uiSettings: IUiSettingsClient;
/** {@link FatalErrorsStart} */
fatalErrors: FatalErrorsStart;
/** /**
* exposed temporarily until https://github.com/elastic/kibana/issues/41990 done * 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 * use *only* to retrieve config values. There is no way to set injected values
@ -302,6 +304,7 @@ export {
DocLinksStart, DocLinksStart,
FatalErrorInfo, FatalErrorInfo,
FatalErrorsSetup, FatalErrorsSetup,
FatalErrorsStart,
HttpSetup, HttpSetup,
HttpStart, HttpStart,
I18nStart, I18nStart,

View file

@ -98,6 +98,7 @@ const notificationsStart = notificationServiceMock.createStartContract();
const overlayStart = overlayServiceMock.createStartContract(); const overlayStart = overlayServiceMock.createStartContract();
const uiSettingsStart = uiSettingsServiceMock.createStartContract(); const uiSettingsStart = uiSettingsServiceMock.createStartContract();
const savedObjectsStart = savedObjectsMock.createStartContract(); const savedObjectsStart = savedObjectsMock.createStartContract();
const fatalErrorsStart = fatalErrorsServiceMock.createStartContract();
const mockStorage = { getItem: jest.fn() } as any; const mockStorage = { getItem: jest.fn() } as any;
const defaultStartDeps = { const defaultStartDeps = {
@ -112,6 +113,7 @@ const defaultStartDeps = {
overlays: overlayStart, overlays: overlayStart,
uiSettings: uiSettingsStart, uiSettings: uiSettingsStart,
savedObjects: savedObjectsStart, savedObjects: savedObjectsStart,
fatalErrors: fatalErrorsStart,
}, },
lastSubUrlStorage: mockStorage, lastSubUrlStorage: mockStorage,
targetDomElement: document.createElement('div'), targetDomElement: document.createElement('div'),

View file

@ -74,6 +74,7 @@ function createCoreStartMock({ basePath = '' } = {}) {
injectedMetadata: { injectedMetadata: {
getInjectedVar: injectedMetadataServiceMock.createStartContract().getInjectedVar, getInjectedVar: injectedMetadataServiceMock.createStartContract().getInjectedVar,
}, },
fatalErrors: fatalErrorsServiceMock.createStartContract(),
}; };
return mock; return mock;

View file

@ -151,5 +151,6 @@ export function createPluginStartContext<
injectedMetadata: { injectedMetadata: {
getInjectedVar: deps.injectedMetadata.getInjectedVar, getInjectedVar: deps.injectedMetadata.getInjectedVar,
}, },
fatalErrors: deps.fatalErrors,
}; };
} }

View file

@ -111,6 +111,7 @@ describe('PluginsService', () => {
overlays: overlayServiceMock.createStartContract(), overlays: overlayServiceMock.createStartContract(),
uiSettings: uiSettingsServiceMock.createStartContract(), uiSettings: uiSettingsServiceMock.createStartContract(),
savedObjects: savedObjectsMock.createStartContract(), savedObjects: savedObjectsMock.createStartContract(),
fatalErrors: fatalErrorsServiceMock.createStartContract(),
}; };
mockStartContext = { mockStartContext = {
...mockStartDeps, ...mockStartDeps,

View file

@ -377,6 +377,8 @@ export interface CoreStart {
// (undocumented) // (undocumented)
docLinks: DocLinksStart; docLinks: DocLinksStart;
// (undocumented) // (undocumented)
fatalErrors: FatalErrorsStart;
// (undocumented)
http: HttpStart; http: HttpStart;
// (undocumented) // (undocumented)
i18n: I18nStart; i18n: I18nStart;
@ -532,6 +534,9 @@ export interface FatalErrorsSetup {
get$: () => Rx.Observable<FatalErrorInfo>; get$: () => Rx.Observable<FatalErrorInfo>;
} }
// @public
export type FatalErrorsStart = FatalErrorsSetup;
// @public // @public
export type HandlerContextType<T extends HandlerFunction<any>> = T extends HandlerFunction<infer U> ? U : never; export type HandlerContextType<T extends HandlerFunction<any>> = T extends HandlerFunction<infer U> ? U : never;

View file

@ -304,6 +304,10 @@ exports[`QueryStringInput Should disable autoFocus on EuiFieldText when disableA
}, },
}, },
}, },
"fatalErrors": Object {
"add": [MockFunction],
"get$": [MockFunction],
},
"http": Object { "http": Object {
"addLoadingCountSource": [MockFunction], "addLoadingCountSource": [MockFunction],
"anonymousPaths": Object { "anonymousPaths": Object {
@ -930,6 +934,10 @@ exports[`QueryStringInput Should disable autoFocus on EuiFieldText when disableA
}, },
}, },
}, },
"fatalErrors": Object {
"add": [MockFunction],
"get$": [MockFunction],
},
"http": Object { "http": Object {
"addLoadingCountSource": [MockFunction], "addLoadingCountSource": [MockFunction],
"anonymousPaths": Object { "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 { "http": Object {
"addLoadingCountSource": [MockFunction], "addLoadingCountSource": [MockFunction],
"anonymousPaths": Object { "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 { "http": Object {
"addLoadingCountSource": [MockFunction], "addLoadingCountSource": [MockFunction],
"anonymousPaths": Object { "anonymousPaths": Object {
@ -2769,6 +2785,10 @@ exports[`QueryStringInput Should render the given query 1`] = `
}, },
}, },
}, },
"fatalErrors": Object {
"add": [MockFunction],
"get$": [MockFunction],
},
"http": Object { "http": Object {
"addLoadingCountSource": [MockFunction], "addLoadingCountSource": [MockFunction],
"anonymousPaths": Object { "anonymousPaths": Object {
@ -3392,6 +3412,10 @@ exports[`QueryStringInput Should render the given query 1`] = `
}, },
}, },
}, },
"fatalErrors": Object {
"add": [MockFunction],
"get$": [MockFunction],
},
"http": Object { "http": Object {
"addLoadingCountSource": [MockFunction], "addLoadingCountSource": [MockFunction],
"anonymousPaths": Object { "anonymousPaths": Object {