mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 01:38:56 -04:00
Upgrade Typescript to 4.3.5 (#104470)
Co-authored-by: Mikhail Shustov <restrry@gmail.com> Co-authored-by: Dario Gieselaar <dario.gieselaar@elastic.co> Co-authored-by: CJ Cenizal <cj@cenizal.com> Co-authored-by: Justin Kambic <justin.kambic@elastic.co> Co-authored-by: Stratoula Kalafateli <efstratia.kalafateli@elastic.co> Co-authored-by: Jean-Louis Leysens <jloleysens@gmail.com> Co-authored-by: Kyle Pollich <kpollich1@gmail.com> Co-authored-by: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Co-authored-by: Kevin Qualters <kevin.qualters@elastic.co> Co-authored-by: Candace Park <candace.park@elastic.co> Co-authored-by: Brian Seeders <brian.seeders@elastic.co> Co-authored-by: spalger <spencer@elastic.co>
This commit is contained in:
parent
964f0929fc
commit
92a8636f0f
159 changed files with 4100 additions and 5956 deletions
|
@ -9,13 +9,13 @@ Constructs a new instance of the `ScopedHistory` class
|
|||
<b>Signature:</b>
|
||||
|
||||
```typescript
|
||||
constructor(parentHistory: History, basePath: string);
|
||||
constructor(parentHistory: History<HistoryLocationState>, basePath: string);
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| parentHistory | History | |
|
||||
| parentHistory | History<HistoryLocationState> | |
|
||||
| basePath | string | |
|
||||
|
||||
|
|
|
@ -9,5 +9,5 @@ Add a block prompt requesting user confirmation when navigating away from the cu
|
|||
<b>Signature:</b>
|
||||
|
||||
```typescript
|
||||
block: (prompt?: string | boolean | History.TransitionPromptHook<HistoryLocationState> | undefined) => UnregisterCallback;
|
||||
block: (prompt?: string | boolean | TransitionPromptHook<HistoryLocationState> | undefined) => UnregisterCallback;
|
||||
```
|
||||
|
|
|
@ -9,5 +9,5 @@ Creates a `ScopedHistory` for a subpath of this `ScopedHistory`<!-- -->. Useful
|
|||
<b>Signature:</b>
|
||||
|
||||
```typescript
|
||||
createSubHistory: <SubHistoryLocationState = unknown>(basePath: string) => ScopedHistory<SubHistoryLocationState>;
|
||||
createSubHistory: (basePath: string) => ScopedHistory<HistoryLocationState>;
|
||||
```
|
||||
|
|
|
@ -28,9 +28,9 @@ export declare class ScopedHistory<HistoryLocationState = unknown> implements Hi
|
|||
| Property | Modifiers | Type | Description |
|
||||
| --- | --- | --- | --- |
|
||||
| [action](./kibana-plugin-core-public.scopedhistory.action.md) | | Action | The last action dispatched on the history stack. |
|
||||
| [block](./kibana-plugin-core-public.scopedhistory.block.md) | | (prompt?: string \| boolean \| History.TransitionPromptHook<HistoryLocationState> \| undefined) => UnregisterCallback | Add a block prompt requesting user confirmation when navigating away from the current page. |
|
||||
| [block](./kibana-plugin-core-public.scopedhistory.block.md) | | (prompt?: string \| boolean \| TransitionPromptHook<HistoryLocationState> \| undefined) => UnregisterCallback | Add a block prompt requesting user confirmation when navigating away from the current page. |
|
||||
| [createHref](./kibana-plugin-core-public.scopedhistory.createhref.md) | | (location: LocationDescriptorObject<HistoryLocationState>, { prependBasePath }?: { prependBasePath?: boolean \| undefined; }) => Href | Creates an href (string) to the location. If <code>prependBasePath</code> is true (default), it will prepend the location's path with the scoped history basePath. |
|
||||
| [createSubHistory](./kibana-plugin-core-public.scopedhistory.createsubhistory.md) | | <SubHistoryLocationState = unknown>(basePath: string) => ScopedHistory<SubHistoryLocationState> | Creates a <code>ScopedHistory</code> for a subpath of this <code>ScopedHistory</code>. Useful for applications that may have sub-apps that do not need access to the containing application's history. |
|
||||
| [createSubHistory](./kibana-plugin-core-public.scopedhistory.createsubhistory.md) | | (basePath: string) => ScopedHistory<HistoryLocationState> | Creates a <code>ScopedHistory</code> for a subpath of this <code>ScopedHistory</code>. Useful for applications that may have sub-apps that do not need access to the containing application's history. |
|
||||
| [go](./kibana-plugin-core-public.scopedhistory.go.md) | | (n: number) => void | Send the user forward or backwards in the history stack. |
|
||||
| [goBack](./kibana-plugin-core-public.scopedhistory.goback.md) | | () => void | Send the user one location back in the history stack. Equivalent to calling [ScopedHistory.go(-1)](./kibana-plugin-core-public.scopedhistory.go.md)<!-- -->. If no more entries are available backwards, this is a no-op. |
|
||||
| [goForward](./kibana-plugin-core-public.scopedhistory.goforward.md) | | () => void | Send the user one location forward in the history stack. Equivalent to calling [ScopedHistory.go(1)](./kibana-plugin-core-public.scopedhistory.go.md)<!-- -->. If no more entries are available forwards, this is a no-op. |
|
||||
|
|
|
@ -12,14 +12,32 @@ Set of helpers used to create `KibanaResponse` to form HTTP response on an incom
|
|||
kibanaResponseFactory: {
|
||||
custom: <T extends string | Record<string, any> | Error | Buffer | Stream | {
|
||||
message: string | Error;
|
||||
attributes?: Record<string, any> | undefined;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
} | undefined>(options: CustomHttpResponseOptions<T>) => KibanaResponse<T>;
|
||||
badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
customError: (options: CustomHttpResponseOptions<ResponseError>) => KibanaResponse<ResponseError>;
|
||||
badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
customError: (options: CustomHttpResponseOptions<ResponseError>) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
redirected: (options: RedirectResponseOptions) => KibanaResponse<string | Record<string, any> | Buffer | Stream>;
|
||||
ok: (options?: HttpResponseOptions) => KibanaResponse<string | Record<string, any> | Buffer | Stream>;
|
||||
accepted: (options?: HttpResponseOptions) => KibanaResponse<string | Record<string, any> | Buffer | Stream>;
|
||||
|
|
10
package.json
10
package.json
|
@ -88,9 +88,9 @@
|
|||
"**/react-syntax-highlighter": "^15.3.1",
|
||||
"**/react-syntax-highlighter/**/highlight.js": "^10.4.1",
|
||||
"**/trim": "1.0.1",
|
||||
"**/typescript": "4.1.3",
|
||||
"**/typescript": "4.3.5",
|
||||
"**/underscore": "^1.13.1",
|
||||
"globby/fast-glob": "3.2.5"
|
||||
"globby/fast-glob": "3.2.7"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.16.3",
|
||||
|
@ -538,7 +538,7 @@
|
|||
"@types/hapi__inert": "^5.2.3",
|
||||
"@types/has-ansi": "^3.0.0",
|
||||
"@types/he": "^1.1.1",
|
||||
"@types/history": "^4.7.3",
|
||||
"@types/history": "^4.7.9",
|
||||
"@types/hjson": "^2.4.2",
|
||||
"@types/http-proxy": "^1.17.4",
|
||||
"@types/http-proxy-agent": "^2.0.2",
|
||||
|
@ -823,9 +823,9 @@
|
|||
"terser-webpack-plugin": "^4.2.3",
|
||||
"tough-cookie": "^4.0.0",
|
||||
"ts-loader": "^7.0.5",
|
||||
"ts-morph": "^9.1.0",
|
||||
"ts-morph": "^11.0.0",
|
||||
"tsd": "^0.13.1",
|
||||
"typescript": "4.1.3",
|
||||
"typescript": "4.3.5",
|
||||
"unlazy-loader": "^0.1.3",
|
||||
"url-loader": "^2.2.0",
|
||||
"val-loader": "^1.1.1",
|
||||
|
|
|
@ -34,13 +34,11 @@ RUNTIME_DEPS = [
|
|||
"@npm//@elastic/eui",
|
||||
"@npm//enzyme",
|
||||
"@npm//react",
|
||||
"@npm//resize-observer-polyfill",
|
||||
]
|
||||
|
||||
TYPES_DEPS = [
|
||||
"//packages/kbn-i18n:npm_module_types",
|
||||
"@npm//@elastic/eui",
|
||||
"@npm//resize-observer-polyfill",
|
||||
"@npm//tslib",
|
||||
"@npm//@types/enzyme",
|
||||
"@npm//@types/jest",
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
"rootDir": "src",
|
||||
"sourceMap": true,
|
||||
"sourceRoot": "../../../../packages/kbn-alerts/src",
|
||||
"types": ["jest", "node", "resize-observer-polyfill"]
|
||||
"types": ["jest", "node"]
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
}
|
||||
|
|
|
@ -114,7 +114,8 @@ it('Function inside interface has a label', () => {
|
|||
expect(fn?.type).toBe(TypeKind.FunctionKind);
|
||||
});
|
||||
|
||||
it('Test ReactElement signature', () => {
|
||||
// FAILING: https://github.com/elastic/kibana/issues/120125
|
||||
it.skip('Test ReactElement signature', () => {
|
||||
const node = nodes.find((n) => getNodeName(n) === 'AReactElementFn');
|
||||
expect(node).toBeDefined();
|
||||
const def = buildApiDeclarationTopNode(node!, {
|
||||
|
|
|
@ -48,7 +48,7 @@ export function buildBasicApiDeclaration(node: Node, opts: BuildApiDecOpts): Api
|
|||
signature: getSignature(node, opts.plugins, opts.log),
|
||||
path: getSourceForNode(node),
|
||||
deprecated,
|
||||
removeBy: removeByTag ? removeByTag.getComment() : undefined,
|
||||
removeBy: removeByTag ? removeByTag.getCommentText() : undefined,
|
||||
};
|
||||
return {
|
||||
...apiDec,
|
||||
|
|
|
@ -43,14 +43,14 @@ export function getJSDocs(node: Node): JSDoc[] | undefined {
|
|||
export function getJSDocReturnTagComment(node: Node | JSDoc[]): TextWithLinks {
|
||||
const tags = getJSDocTags(node);
|
||||
const returnTag = tags.find((tag) => Node.isJSDocReturnTag(tag));
|
||||
if (returnTag) return getTextWithLinks(returnTag.getComment());
|
||||
if (returnTag) return getTextWithLinks(returnTag.getCommentText());
|
||||
return [];
|
||||
}
|
||||
|
||||
export function getJSDocParamComment(node: Node | JSDoc[], name: string): TextWithLinks {
|
||||
const tags = getJSDocTags(node);
|
||||
const paramTag = tags.find((tag) => Node.isJSDocParameterTag(tag) && tag.getName() === name);
|
||||
if (paramTag) return getTextWithLinks(paramTag.getComment());
|
||||
if (paramTag) return getTextWithLinks(paramTag.getCommentText());
|
||||
return [];
|
||||
}
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ ${
|
|||
|
||||
**Code health stats**
|
||||
|
||||
| Public API count | Any count | Items lacking comments | Missing exports |
|
||||
| Public API count | Any count | Items lacking comments | Missing exports |
|
||||
|-------------------|-----------|------------------------|-----------------|
|
||||
| ${pluginStats.apiCount} | ${pluginStats.isAnyType.length} | ${
|
||||
pluginStats.missingComments.length
|
||||
|
|
|
@ -330,7 +330,7 @@ describe('Types', () => {
|
|||
"section": "def-public.MyProps",
|
||||
"text": "MyProps",
|
||||
},
|
||||
">",
|
||||
", string | React.JSXElementConstructor<any>>",
|
||||
]
|
||||
`);
|
||||
});
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
"label": "component",
|
||||
"description": [],
|
||||
"signature": [
|
||||
"React.ComponentClass<{}, any> | React.FunctionComponent<{}> | undefined"
|
||||
"React.ComponentType<{}> | undefined"
|
||||
],
|
||||
"path": "packages/kbn-docs-utils/src/api_docs/tests/__fixtures__/src/plugin_a/public/classes.ts",
|
||||
"deprecated": false
|
||||
|
@ -1241,7 +1241,7 @@
|
|||
"section": "def-public.MyProps",
|
||||
"text": "MyProps"
|
||||
},
|
||||
">"
|
||||
", string | React.JSXElementConstructor<any>>"
|
||||
],
|
||||
"path": "packages/kbn-docs-utils/src/api_docs/tests/__fixtures__/src/plugin_a/public/types.ts",
|
||||
"deprecated": false,
|
||||
|
@ -2356,7 +2356,7 @@
|
|||
"deprecated": false,
|
||||
"children": [],
|
||||
"returnComment": [
|
||||
"The currently selected {@link SearchLanguage}"
|
||||
"The currently selected {@link SearchLanguage }"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
|
@ -16,7 +16,7 @@ Contact Kibana Core for questions regarding this plugin.
|
|||
|
||||
**Code health stats**
|
||||
|
||||
| Public API count | Any count | Items lacking comments | Missing exports |
|
||||
| Public API count | Any count | Items lacking comments | Missing exports |
|
||||
|-------------------|-----------|------------------------|-----------------|
|
||||
| 131 | 1 | 71 | 2 |
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ Contact Kibana Core for questions regarding this plugin.
|
|||
|
||||
**Code health stats**
|
||||
|
||||
| Public API count | Any count | Items lacking comments | Missing exports |
|
||||
| Public API count | Any count | Items lacking comments | Missing exports |
|
||||
|-------------------|-----------|------------------------|-----------------|
|
||||
| 131 | 1 | 71 | 2 |
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ Contact Kibana Core for questions regarding this plugin.
|
|||
|
||||
**Code health stats**
|
||||
|
||||
| Public API count | Any count | Items lacking comments | Missing exports |
|
||||
| Public API count | Any count | Items lacking comments | Missing exports |
|
||||
|-------------------|-----------|------------------------|-----------------|
|
||||
| 2 | 0 | 2 | 0 |
|
||||
|
||||
|
|
|
@ -38,7 +38,6 @@ TYPES_DEPS = [
|
|||
"@npm//@types/node",
|
||||
"@npm//@types/node-forge",
|
||||
"@npm//@types/testing-library__jest-dom",
|
||||
"@npm//resize-observer-polyfill",
|
||||
"@npm//@emotion/react",
|
||||
"@npm//jest-styled-components",
|
||||
]
|
||||
|
|
|
@ -51,7 +51,6 @@ RUNTIME_DEPS = [
|
|||
"@npm//node-sass",
|
||||
"@npm//normalize-path",
|
||||
"@npm//pirates",
|
||||
"@npm//resize-observer-polyfill",
|
||||
"@npm//rxjs",
|
||||
"@npm//source-map-support",
|
||||
"@npm//watchpack",
|
||||
|
@ -77,7 +76,6 @@ TYPES_DEPS = [
|
|||
"@npm//jest-diff",
|
||||
"@npm//lmdb-store",
|
||||
"@npm//pirates",
|
||||
"@npm//resize-observer-polyfill",
|
||||
"@npm//rxjs",
|
||||
"@npm//zlib",
|
||||
"@npm//@types/compression-webpack-plugin",
|
||||
|
|
8646
packages/kbn-pm/dist/index.js
vendored
8646
packages/kbn-pm/dist/index.js
vendored
File diff suppressed because one or more lines are too long
|
@ -49,7 +49,6 @@ TYPES_DEPS = [
|
|||
"@npm//@types/classnames",
|
||||
"@npm//@types/react",
|
||||
"@npm//@elastic/eui",
|
||||
"@npm//resize-observer-polyfill",
|
||||
]
|
||||
|
||||
jsts_transpiler(
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
"types": [
|
||||
"jest",
|
||||
"node",
|
||||
"resize-observer-polyfill"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
|
|
|
@ -42,7 +42,6 @@ RUNTIME_DEPS = [
|
|||
"@npm//enzyme",
|
||||
"@npm//moment",
|
||||
"@npm//react",
|
||||
"@npm//resize-observer-polyfill",
|
||||
]
|
||||
|
||||
TYPES_DEPS = [
|
||||
|
@ -55,7 +54,6 @@ TYPES_DEPS = [
|
|||
"@npm//@testing-library/react",
|
||||
"@npm//@testing-library/react-hooks",
|
||||
"@npm//moment",
|
||||
"@npm//resize-observer-polyfill",
|
||||
"@npm//@types/enzyme",
|
||||
"@npm//@types/jest",
|
||||
"@npm//@types/node",
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
"sourceMap": true,
|
||||
"sourceRoot": "../../../../packages/kbn-securitysolution-autocomplete/src",
|
||||
"rootDir": "src",
|
||||
"types": ["jest", "node", "resize-observer-polyfill"]
|
||||
"types": ["jest", "node"]
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
}
|
||||
|
|
|
@ -32,9 +32,11 @@ function isHtmlPlugin(plugin: any): plugin is { options: { template: string } }
|
|||
return !!(typeof plugin.options?.template === 'string');
|
||||
}
|
||||
|
||||
function isBabelLoaderRule(rule: webpack.RuleSetRule): rule is webpack.RuleSetRule & {
|
||||
interface BabelLoaderRule extends webpack.RuleSetRule {
|
||||
use: webpack.RuleSetLoader[];
|
||||
} {
|
||||
}
|
||||
|
||||
function isBabelLoaderRule(rule: webpack.RuleSetRule): rule is BabelLoaderRule {
|
||||
return !!(
|
||||
rule.use &&
|
||||
Array.isArray(rule.use) &&
|
||||
|
|
|
@ -36,8 +36,7 @@ declare global {
|
|||
interface Global {}
|
||||
interface InspectOptions {}
|
||||
|
||||
interface ConsoleConstructor
|
||||
extends console.ConsoleConstructor {}
|
||||
interface ConsoleConstructor extends console.ConsoleConstructor {}
|
||||
}
|
||||
}
|
||||
/* eslint-enable */
|
||||
|
@ -59,7 +58,7 @@ export function runJest(configName = 'jest.config.js') {
|
|||
const cwd: string = process.env.INIT_CWD || process.cwd();
|
||||
|
||||
if (!argv.config) {
|
||||
testFiles = argv._.splice(2).map((p) => resolve(cwd, p));
|
||||
testFiles = argv._.splice(2).map((p) => resolve(cwd, p.toString()));
|
||||
const commonTestFiles = commonBasePath(testFiles);
|
||||
const testFilesProvided = testFiles.length > 0;
|
||||
|
||||
|
|
|
@ -41,6 +41,7 @@ TYPES_DEPS = [
|
|||
"@npm//query-string",
|
||||
"@npm//utility-types",
|
||||
"@npm//@types/jest",
|
||||
"@npm//@types/history",
|
||||
"@npm//@types/node",
|
||||
"@npm//@types/react-router-config",
|
||||
"@npm//@types/react-router-dom",
|
||||
|
|
|
@ -267,6 +267,7 @@ describe('createRouter', () => {
|
|||
|
||||
const matches = router.matchRoutes('/', history.location);
|
||||
|
||||
// @ts-expect-error 4.3.5 upgrade - router doesn't seem able to merge properly when two routes match
|
||||
expect(matches[1]?.match.params).toEqual({
|
||||
query: {
|
||||
rangeFrom: 'now-30m',
|
||||
|
@ -285,6 +286,7 @@ describe('createRouter', () => {
|
|||
|
||||
expect(matchedRoutes.length).toEqual(4);
|
||||
|
||||
// @ts-expect-error 4.3.5 upgrade - router doesn't seem able to merge properly when two routes match
|
||||
expect(matchedRoutes[matchedRoutes.length - 1].match).toEqual({
|
||||
isExact: true,
|
||||
params: {
|
||||
|
|
|
@ -23,7 +23,7 @@ function toReactRouterPath(path: string) {
|
|||
return path.replace(/(?:{([^\/]+)})/g, ':$1');
|
||||
}
|
||||
|
||||
export function createRouter<TRoutes extends Route[]>(routes: TRoutes): Router<TRoutes> {
|
||||
export function createRouter<TRoute extends Route>(routes: TRoute[]): Router<TRoute[]> {
|
||||
const routesByReactRouterConfig = new Map<ReactRouterConfig, Route>();
|
||||
const reactRouterConfigsByRoute = new Map<Route, ReactRouterConfig>();
|
||||
|
||||
|
@ -181,10 +181,8 @@ export function createRouter<TRoutes extends Route[]>(routes: TRoutes): Router<T
|
|||
);
|
||||
};
|
||||
|
||||
return {
|
||||
link: (path, ...args) => {
|
||||
return link(path, ...args);
|
||||
},
|
||||
const router = {
|
||||
link,
|
||||
getParams: (...args: any[]) => {
|
||||
const matches = matchRoutes(...args);
|
||||
return matches.length
|
||||
|
@ -197,11 +195,13 @@ export function createRouter<TRoutes extends Route[]>(routes: TRoutes): Router<T
|
|||
matchRoutes: (...args: any[]) => {
|
||||
return matchRoutes(...args) as any;
|
||||
},
|
||||
getRoutePath: (route) => {
|
||||
getRoutePath: (route: Route) => {
|
||||
return reactRouterConfigsByRoute.get(route)!.path as string;
|
||||
},
|
||||
getRoutesToMatch: (path: string) => {
|
||||
return getRoutesToMatch(path) as unknown as FlattenRoutesOf<TRoutes>;
|
||||
return getRoutesToMatch(path) as unknown as FlattenRoutesOf<typeof routes>;
|
||||
},
|
||||
};
|
||||
|
||||
return router;
|
||||
}
|
||||
|
|
|
@ -115,7 +115,7 @@ export interface RouteMatch<TRoute extends Route = Route> {
|
|||
params: t.Type<any>;
|
||||
}
|
||||
? t.TypeOf<TRoute['params']>
|
||||
: {};
|
||||
: AnyObj;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -160,10 +160,11 @@ interface ReadonlyPlainRoute {
|
|||
}
|
||||
|
||||
export type Route = PlainRoute | ReadonlyPlainRoute;
|
||||
type AnyObj = Record<string, any>;
|
||||
|
||||
interface DefaultOutput {
|
||||
path: {};
|
||||
query: {};
|
||||
path: AnyObj;
|
||||
query: AnyObj;
|
||||
}
|
||||
|
||||
type OutputOfRouteMatch<TRouteMatch extends RouteMatch> = TRouteMatch extends {
|
||||
|
@ -190,20 +191,21 @@ type TypeOfRouteMatch<TRouteMatch extends RouteMatch> = TRouteMatch extends {
|
|||
route: { params: t.Type<any> };
|
||||
}
|
||||
? t.TypeOf<TRouteMatch['route']['params']>
|
||||
: {};
|
||||
: AnyObj;
|
||||
|
||||
type TypeOfMatches<TRouteMatches extends RouteMatch[]> = TRouteMatches extends [RouteMatch]
|
||||
? TypeOfRouteMatch<TRouteMatches[0]>
|
||||
: TRouteMatches extends [RouteMatch, ...infer TNextRouteMatches]
|
||||
? TypeOfRouteMatch<TRouteMatches[0]> &
|
||||
(TNextRouteMatches extends RouteMatch[] ? TypeOfMatches<TNextRouteMatches> : {})
|
||||
: {};
|
||||
(TNextRouteMatches extends RouteMatch[] ? TypeOfMatches<TNextRouteMatches> : AnyObj)
|
||||
: AnyObj;
|
||||
|
||||
export type TypeOf<
|
||||
TRoutes extends Route[],
|
||||
TPath extends PathsOf<TRoutes>,
|
||||
TWithDefaultOutput extends boolean = true
|
||||
> = TypeOfMatches<Match<TRoutes, TPath>> & (TWithDefaultOutput extends true ? DefaultOutput : {});
|
||||
> = TypeOfMatches<Match<TRoutes, TPath>> &
|
||||
(TWithDefaultOutput extends true ? DefaultOutput : AnyObj);
|
||||
|
||||
export type TypeAsArgs<TObject> = keyof TObject extends never
|
||||
? []
|
||||
|
@ -276,7 +278,7 @@ type MapRoute<TRoute extends Route, TParents extends Route[] = []> = MaybeUnion<
|
|||
>;
|
||||
}
|
||||
>
|
||||
: {}
|
||||
: AnyObj
|
||||
>;
|
||||
|
||||
type MapRoutes<TRoutes, TParents extends Route[] = []> = TRoutes extends [Route]
|
||||
|
@ -341,7 +343,7 @@ type MapRoutes<TRoutes, TParents extends Route[] = []> = TRoutes extends [Route]
|
|||
MapRoute<TRoutes[8], TParents> &
|
||||
MapRoute<TRoutes[7], TParents> &
|
||||
MapRoute<TRoutes[9], TParents>
|
||||
: {};
|
||||
: AnyObj;
|
||||
|
||||
// const element = null as any;
|
||||
|
||||
|
|
|
@ -53,7 +53,6 @@ RUNTIME_DEPS = [
|
|||
"@npm//react-router",
|
||||
"@npm//react",
|
||||
"@npm//regenerator-runtime",
|
||||
"@npm//resize-observer-polyfill",
|
||||
"@npm//rison-node",
|
||||
"@npm//rxjs",
|
||||
"@npm//styled-components",
|
||||
|
@ -90,7 +89,6 @@ TYPES_DEPS = [
|
|||
"@npm//react-router",
|
||||
"@npm//react-router-dom",
|
||||
"@npm//regenerator-runtime",
|
||||
"@npm//resize-observer-polyfill",
|
||||
"@npm//rison-node",
|
||||
"@npm//rxjs",
|
||||
"@npm//styled-components",
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
"sourceRoot": "../../../../packages/kbn-ui-shared-deps-npm/src",
|
||||
"types": [
|
||||
"node",
|
||||
"resize-observer-polyfill"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
"sourceRoot": "../../../../packages/kbn-ui-shared-deps-src/src",
|
||||
"types": [
|
||||
"node",
|
||||
"resize-observer-polyfill"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
|
|
|
@ -57,7 +57,10 @@ export class ScopedHistory<HistoryLocationState = unknown>
|
|||
*/
|
||||
private blockUnregisterCallbacks: Set<UnregisterCallback> = new Set();
|
||||
|
||||
constructor(private readonly parentHistory: History, private readonly basePath: string) {
|
||||
constructor(
|
||||
private readonly parentHistory: History<HistoryLocationState>,
|
||||
private readonly basePath: string
|
||||
) {
|
||||
const parentPath = this.parentHistory.location.pathname;
|
||||
if (!parentPath.startsWith(basePath)) {
|
||||
throw new Error(
|
||||
|
@ -75,10 +78,8 @@ export class ScopedHistory<HistoryLocationState = unknown>
|
|||
*
|
||||
* @param basePath the URL path scope for the sub history
|
||||
*/
|
||||
public createSubHistory = <SubHistoryLocationState = unknown>(
|
||||
basePath: string
|
||||
): ScopedHistory<SubHistoryLocationState> => {
|
||||
return new ScopedHistory<SubHistoryLocationState>(this, basePath);
|
||||
public createSubHistory = (basePath: string) => {
|
||||
return new ScopedHistory<HistoryLocationState>(this, basePath);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -43,7 +43,7 @@ interface ConstructorParams {
|
|||
kibanaVersion: string;
|
||||
}
|
||||
|
||||
interface StartDeps {
|
||||
export interface StartDeps {
|
||||
application: InternalApplicationStart;
|
||||
docLinks: DocLinksStart;
|
||||
http: HttpStart;
|
||||
|
|
|
@ -26,14 +26,14 @@ import {
|
|||
import { renderApp as renderStatusApp } from './status';
|
||||
import { DocLinksStart } from '../doc_links';
|
||||
|
||||
interface SetupDeps {
|
||||
export interface SetupDeps {
|
||||
application: InternalApplicationSetup;
|
||||
http: HttpSetup;
|
||||
injectedMetadata: InjectedMetadataSetup;
|
||||
notifications: NotificationsSetup;
|
||||
}
|
||||
|
||||
interface StartDeps {
|
||||
export interface StartDeps {
|
||||
application: InternalApplicationStart;
|
||||
docLinks: DocLinksStart;
|
||||
http: HttpStart;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
import { deepFreeze } from '@kbn/std';
|
||||
import { InjectedMetadataSetup } from '../injected_metadata';
|
||||
|
||||
interface StartDeps {
|
||||
export interface StartDeps {
|
||||
injectedMetadata: InjectedMetadataSetup;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ import { InjectedMetadataSetup } from '../injected_metadata';
|
|||
import { FatalErrorsScreen } from './fatal_errors_screen';
|
||||
import { FatalErrorInfo, getErrorInfo } from './get_error_info';
|
||||
|
||||
interface Deps {
|
||||
export interface Deps {
|
||||
i18n: I18nStart;
|
||||
injectedMetadata: InjectedMetadataSetup;
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ import { CoreService } from '../../types';
|
|||
import { MomentService } from './moment';
|
||||
import { StylesService } from './styles';
|
||||
|
||||
interface Deps {
|
||||
export interface Deps {
|
||||
uiSettings: IUiSettingsClient;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,11 +15,11 @@ import { ToastsService, ToastsSetup, ToastsStart } from './toasts';
|
|||
import { IUiSettingsClient } from '../ui_settings';
|
||||
import { OverlayStart } from '../overlays';
|
||||
|
||||
interface SetupDeps {
|
||||
export interface SetupDeps {
|
||||
uiSettings: IUiSettingsClient;
|
||||
}
|
||||
|
||||
interface StartDeps {
|
||||
export interface StartDeps {
|
||||
i18n: I18nStart;
|
||||
overlays: OverlayStart;
|
||||
theme: ThemeServiceStart;
|
||||
|
|
|
@ -42,6 +42,7 @@ import { Request as Request_2 } from '@hapi/hapi';
|
|||
import * as Rx from 'rxjs';
|
||||
import { SchemaTypeError } from '@kbn/config-schema';
|
||||
import type { ThemeVersion } from '@kbn/ui-shared-deps-npm';
|
||||
import { TransitionPromptHook } from 'history';
|
||||
import type { TransportRequestOptions } from '@elastic/elasticsearch';
|
||||
import type { TransportRequestParams } from '@elastic/elasticsearch';
|
||||
import type { TransportResult } from '@elastic/elasticsearch';
|
||||
|
@ -1680,13 +1681,13 @@ export interface SavedObjectsUpdateOptions<Attributes = unknown> {
|
|||
|
||||
// @public
|
||||
export class ScopedHistory<HistoryLocationState = unknown> implements History_2<HistoryLocationState> {
|
||||
constructor(parentHistory: History_2, basePath: string);
|
||||
constructor(parentHistory: History_2<HistoryLocationState>, basePath: string);
|
||||
get action(): Action;
|
||||
block: (prompt?: string | boolean | History_2.TransitionPromptHook<HistoryLocationState> | undefined) => UnregisterCallback;
|
||||
block: (prompt?: string | boolean | TransitionPromptHook<HistoryLocationState> | undefined) => UnregisterCallback;
|
||||
createHref: (location: LocationDescriptorObject<HistoryLocationState>, { prependBasePath }?: {
|
||||
prependBasePath?: boolean | undefined;
|
||||
}) => Href;
|
||||
createSubHistory: <SubHistoryLocationState = unknown>(basePath: string) => ScopedHistory<SubHistoryLocationState>;
|
||||
createSubHistory: (basePath: string) => ScopedHistory<HistoryLocationState>;
|
||||
go: (n: number) => void;
|
||||
goBack: () => void;
|
||||
goForward: () => void;
|
||||
|
|
|
@ -18,7 +18,7 @@ import type { I18nStart } from '../i18n';
|
|||
import { CoreContextProvider } from '../utils';
|
||||
import { AppWrapper } from './app_containers';
|
||||
|
||||
interface StartDeps {
|
||||
export interface StartDeps {
|
||||
application: InternalApplicationStart;
|
||||
chrome: InternalChromeStart;
|
||||
overlays: OverlayStart;
|
||||
|
|
|
@ -11,7 +11,7 @@ import { shareReplay, takeUntil } from 'rxjs/operators';
|
|||
import { InjectedMetadataSetup } from '../injected_metadata';
|
||||
import type { CoreTheme, ThemeServiceSetup, ThemeServiceStart } from './types';
|
||||
|
||||
interface SetupDeps {
|
||||
export interface SetupDeps {
|
||||
injectedMetadata: InjectedMetadataSetup;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ import { UiSettingsApi } from './ui_settings_api';
|
|||
import { UiSettingsClient } from './ui_settings_client';
|
||||
import { IUiSettingsClient } from './types';
|
||||
|
||||
interface UiSettingsServiceDeps {
|
||||
export interface UiSettingsServiceDeps {
|
||||
http: HttpSetup;
|
||||
injectedMetadata: InjectedMetadataSetup;
|
||||
}
|
||||
|
|
|
@ -12,7 +12,6 @@ export type ContextContainerMock = jest.Mocked<IContextContainer>;
|
|||
|
||||
const createContextMock = (mockContext: any = {}) => {
|
||||
const contextMock: ContextContainerMock = {
|
||||
// @ts-expect-error since ContextContainerMock cannot infer ContextName and fallsback to never
|
||||
registerContext: jest.fn(),
|
||||
createHandler: jest.fn(),
|
||||
};
|
||||
|
|
|
@ -12,7 +12,7 @@ import { CoreContext } from '../core_context';
|
|||
|
||||
type PrebootDeps = SetupDeps;
|
||||
|
||||
interface SetupDeps {
|
||||
export interface SetupDeps {
|
||||
pluginDependencies: ReadonlyMap<PluginOpaqueId, PluginOpaqueId[]>;
|
||||
}
|
||||
|
||||
|
|
|
@ -81,7 +81,6 @@ const createAuthMock = () => {
|
|||
const createInternalPrebootContractMock = () => {
|
||||
const mock: InternalHttpServicePrebootMock = {
|
||||
registerRoutes: jest.fn(),
|
||||
// @ts-expect-error tsc cannot infer ContextName and uses never
|
||||
registerRouteHandlerContext: jest.fn(),
|
||||
registerStaticDir: jest.fn(),
|
||||
basePath: createBasePathMock(),
|
||||
|
@ -89,6 +88,15 @@ const createInternalPrebootContractMock = () => {
|
|||
externalUrl: ExternalUrlConfig.DEFAULT,
|
||||
auth: createAuthMock(),
|
||||
getServerInfo: jest.fn(),
|
||||
server: {
|
||||
name: 'http-preboot-server-test',
|
||||
version: 'kibana',
|
||||
route: jest.fn(),
|
||||
start: jest.fn(),
|
||||
stop: jest.fn(),
|
||||
config: jest.fn().mockReturnValue(configMock.create()),
|
||||
// @ts-expect-error somehow it thinks that `Server` isn't a `Construtable`
|
||||
} as unknown as jest.MockedClass<Server>,
|
||||
};
|
||||
return mock;
|
||||
};
|
||||
|
@ -122,7 +130,6 @@ const createInternalSetupContractMock = () => {
|
|||
registerOnPreAuth: jest.fn(),
|
||||
registerAuth: jest.fn(),
|
||||
registerOnPostAuth: jest.fn(),
|
||||
// @ts-expect-error tsc cannot infer ContextName and uses never
|
||||
registerRouteHandlerContext: jest.fn(),
|
||||
registerOnPreResponse: jest.fn(),
|
||||
createRouter: jest.fn().mockImplementation(() => mockRouter.create({})),
|
||||
|
@ -134,6 +141,7 @@ const createInternalSetupContractMock = () => {
|
|||
getAuthHeaders: jest.fn(),
|
||||
getServerInfo: jest.fn(),
|
||||
registerPrebootRoutes: jest.fn(),
|
||||
registerRouterAfterListening: jest.fn(),
|
||||
};
|
||||
mock.createCookieSessionStorageFactory.mockResolvedValue(sessionStorageMock.createFactory());
|
||||
mock.createRouter.mockImplementation(() => mockRouter.create());
|
||||
|
@ -160,7 +168,6 @@ const createSetupContractMock = () => {
|
|||
basePath: internalMock.basePath,
|
||||
csp: CspConfig.DEFAULT,
|
||||
createRouter: jest.fn(),
|
||||
// @ts-expect-error tsc cannot infer ContextName and uses never
|
||||
registerRouteHandlerContext: jest.fn(),
|
||||
auth: {
|
||||
get: internalMock.auth.get,
|
||||
|
|
|
@ -40,11 +40,11 @@ import {
|
|||
ExternalUrlConfig,
|
||||
} from '../external_url';
|
||||
|
||||
interface PrebootDeps {
|
||||
export interface PrebootDeps {
|
||||
context: InternalContextPreboot;
|
||||
}
|
||||
|
||||
interface SetupDeps {
|
||||
export interface SetupDeps {
|
||||
context: ContextSetup;
|
||||
executionContext: InternalExecutionContextSetup;
|
||||
}
|
||||
|
|
|
@ -9,6 +9,16 @@
|
|||
import { IncomingHttpHeaders } from 'http';
|
||||
import { pick } from '@kbn/std';
|
||||
|
||||
/**
|
||||
* Converts an object type to a new object type where each string
|
||||
* key is copied to the values of the object, and non string keys are
|
||||
* given a `never` value. This allows us to map over the values and
|
||||
* get the list of all string keys on a type in `KnownKeys<T>`
|
||||
*/
|
||||
type StringKeysAsVals<T> = {
|
||||
[K in keyof T]: string extends K ? never : number extends K ? never : K;
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a Union type of all known keys of a given interface.
|
||||
* @example
|
||||
|
@ -21,11 +31,7 @@ import { pick } from '@kbn/std';
|
|||
* type PersonKnownKeys = KnownKeys<Person>; // "age" | "name"
|
||||
* ```
|
||||
*/
|
||||
type KnownKeys<T> = {
|
||||
[K in keyof T]: string extends K ? never : number extends K ? never : K;
|
||||
} extends { [_ in keyof T]: infer U }
|
||||
? U
|
||||
: never;
|
||||
type KnownKeys<T> = StringKeysAsVals<T> extends { [_ in keyof T]: infer U } ? U : never;
|
||||
|
||||
/**
|
||||
* Set of well-known HTTP headers.
|
||||
|
|
|
@ -16,12 +16,12 @@ import { getKibanaTranslationFiles } from './get_kibana_translation_files';
|
|||
import { initTranslations } from './init_translations';
|
||||
import { registerRoutes } from './routes';
|
||||
|
||||
interface PrebootDeps {
|
||||
export interface PrebootDeps {
|
||||
http: InternalHttpServicePreboot;
|
||||
pluginPaths: string[];
|
||||
}
|
||||
|
||||
interface SetupDeps {
|
||||
export interface SetupDeps {
|
||||
http: InternalHttpServiceSetup;
|
||||
pluginPaths: string[];
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ export interface InternalLoggingServicePreboot {
|
|||
/** @internal */
|
||||
export type InternalLoggingServiceSetup = InternalLoggingServicePreboot;
|
||||
|
||||
interface PrebootDeps {
|
||||
export interface PrebootDeps {
|
||||
loggingSystem: ILoggingSystem;
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ import { OpsMetricsCollector } from './ops_metrics_collector';
|
|||
import { opsConfig, OpsConfigType } from './ops_config';
|
||||
import { getEcsOpsMetricsLog } from './logging';
|
||||
|
||||
interface MetricsServiceSetupDeps {
|
||||
export interface MetricsServiceSetupDeps {
|
||||
http: InternalHttpServiceSetup;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,7 +33,6 @@ import type { KibanaClient } from '@elastic/elasticsearch/lib/api/kibana';
|
|||
import { Logger } from '@kbn/logging';
|
||||
import { LoggerFactory } from '@kbn/logging';
|
||||
import { LogLevel as LogLevel_2 } from '@kbn/logging';
|
||||
import { LogLevelId } from '@kbn/logging';
|
||||
import { LogMeta } from '@kbn/logging';
|
||||
import { LogRecord } from '@kbn/logging';
|
||||
import type { MaybePromise } from '@kbn/utility-types';
|
||||
|
@ -1372,14 +1371,32 @@ export type KibanaResponseFactory = typeof kibanaResponseFactory;
|
|||
export const kibanaResponseFactory: {
|
||||
custom: <T extends string | Record<string, any> | Error | Buffer | Stream | {
|
||||
message: string | Error;
|
||||
attributes?: Record<string, any> | undefined;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
} | undefined>(options: CustomHttpResponseOptions<T>) => KibanaResponse<T>;
|
||||
badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse<ResponseError>;
|
||||
customError: (options: CustomHttpResponseOptions<ResponseError>) => KibanaResponse<ResponseError>;
|
||||
badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
customError: (options: CustomHttpResponseOptions<ResponseError>) => KibanaResponse<string | Error | {
|
||||
message: string | Error;
|
||||
attributes?: ResponseErrorAttributes | undefined;
|
||||
}>;
|
||||
redirected: (options: RedirectResponseOptions) => KibanaResponse<string | Record<string, any> | Buffer | Stream>;
|
||||
ok: (options?: HttpResponseOptions) => KibanaResponse<string | Record<string, any> | Buffer | Stream>;
|
||||
accepted: (options?: HttpResponseOptions) => KibanaResponse<string | Record<string, any> | Buffer | Stream>;
|
||||
|
|
|
@ -32,7 +32,7 @@ interface StatusLogMeta extends LogMeta {
|
|||
kibana: { status: ServiceStatus };
|
||||
}
|
||||
|
||||
interface SetupDeps {
|
||||
export interface SetupDeps {
|
||||
elasticsearch: Pick<InternalElasticsearchServiceSetup, 'status$'>;
|
||||
environment: InternalEnvironmentServiceSetup;
|
||||
pluginDependencies: ReadonlyMap<PluginName, PluginName[]>;
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { ValuesType } from 'utility-types';
|
||||
import { ValuesType, UnionToIntersection } from 'utility-types';
|
||||
import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
|
||||
|
||||
type InvalidAggregationRequest = unknown;
|
||||
|
@ -21,11 +21,15 @@ type KeyOfSource<T> = Record<
|
|||
(T extends Record<string, { terms: { missing_bucket: true } }> ? null : never) | string | number
|
||||
>;
|
||||
|
||||
type KeysOfSources<T extends any[]> = T extends [infer U, ...infer V]
|
||||
? KeyOfSource<U> & KeysOfSources<V>
|
||||
: T extends Array<infer U>
|
||||
? KeyOfSource<U>
|
||||
: {};
|
||||
type KeysOfSources<T extends any[]> = T extends [any]
|
||||
? KeyOfSource<T[0]>
|
||||
: T extends [any, any]
|
||||
? KeyOfSource<T[0]> & KeyOfSource<T[1]>
|
||||
: T extends [any, any, any]
|
||||
? KeyOfSource<T[0]> & KeyOfSource<T[1]> & KeyOfSource<T[2]>
|
||||
: T extends [any, any, any, any]
|
||||
? KeyOfSource<T[0]> & KeyOfSource<T[1]> & KeyOfSource<T[2]> & KeyOfSource<T[3]>
|
||||
: Record<string, null | string | number>;
|
||||
|
||||
type CompositeKeysOf<TAggregationContainer extends estypes.AggregationsAggregationContainer> =
|
||||
TAggregationContainer extends {
|
||||
|
@ -36,6 +40,13 @@ type CompositeKeysOf<TAggregationContainer extends estypes.AggregationsAggregati
|
|||
|
||||
type Source = estypes.SearchSourceFilter | boolean | estypes.Fields;
|
||||
|
||||
type TopMetricKeysOf<TAggregationContainer extends estypes.AggregationsAggregationContainer> =
|
||||
TAggregationContainer extends { top_metrics: { metrics: { field: infer TField } } }
|
||||
? TField
|
||||
: TAggregationContainer extends { top_metrics: { metrics: Array<{ field: infer TField }> } }
|
||||
? TField
|
||||
: string;
|
||||
|
||||
type ValueTypeOfField<T> = T extends Record<string, string | number>
|
||||
? ValuesType<T>
|
||||
: T extends Array<infer U>
|
||||
|
@ -532,12 +543,7 @@ export type AggregateOf<
|
|||
top_metrics: {
|
||||
top: Array<{
|
||||
sort: number[] | string[];
|
||||
metrics: Record<
|
||||
TAggregationContainer extends Record<string, { metrics: Array<{ field: infer TKeys }> }>
|
||||
? TKeys
|
||||
: string,
|
||||
string | number | null
|
||||
>;
|
||||
metrics: Record<TopMetricKeysOf<TAggregationContainer>, string | number | null>;
|
||||
}>;
|
||||
};
|
||||
weighted_avg: { value: number | null };
|
||||
|
@ -547,8 +553,8 @@ export type AggregateOf<
|
|||
// t_test: {} not defined
|
||||
})[ValidAggregationKeysOf<TAggregationContainer> & AggregationTypeName];
|
||||
|
||||
type AggregateOfMap<TAggregationMap extends AggregationMap, TDocument> = {
|
||||
[TAggregationName in keyof TAggregationMap]: TAggregationMap[TAggregationName] extends estypes.AggregationsAggregationContainer
|
||||
type AggregateOfMap<TAggregationMap extends AggregationMap | undefined, TDocument> = {
|
||||
[TAggregationName in keyof TAggregationMap]: Required<TAggregationMap>[TAggregationName] extends estypes.AggregationsAggregationContainer
|
||||
? AggregateOf<TAggregationMap[TAggregationName], TDocument>
|
||||
: never; // using never means we effectively ignore optional keys, using {} creates a union type of { ... } | {}
|
||||
};
|
||||
|
@ -567,7 +573,7 @@ type SearchResponseOf<
|
|||
> = SubAggregateOf<TAggregationRequest, TDocument>;
|
||||
|
||||
// if aggregation response cannot be inferred, fall back to unknown
|
||||
type WrapAggregationResponse<T> = keyof T extends never
|
||||
type WrapAggregationResponse<T> = keyof UnionToIntersection<T> extends never
|
||||
? { aggregations?: unknown }
|
||||
: { aggregations?: T };
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
import { ToolingLog } from '@kbn/dev-utils';
|
||||
|
||||
import { Config, createRunner } from './lib';
|
||||
import { Config, createRunner, Task, GlobalTask } from './lib';
|
||||
import * as Tasks from './tasks';
|
||||
|
||||
export interface BuildOptions {
|
||||
|
@ -32,12 +32,12 @@ export interface BuildOptions {
|
|||
createExamplePlugins: boolean;
|
||||
}
|
||||
|
||||
export async function buildDistributables(log: ToolingLog, options: BuildOptions) {
|
||||
export async function buildDistributables(log: ToolingLog, options: BuildOptions): Promise<void> {
|
||||
log.verbose('building distributables with options:', options);
|
||||
|
||||
const config = await Config.create(options);
|
||||
const config: Config = await Config.create(options);
|
||||
|
||||
const run = createRunner({
|
||||
const run: (task: Task | GlobalTask) => Promise<void> = createRunner({
|
||||
config,
|
||||
log,
|
||||
});
|
||||
|
|
|
@ -97,6 +97,7 @@ export const IGNORE_DIRECTORY_GLOBS = [
|
|||
'packages/kbn-pm/src/utils/__fixtures__/*',
|
||||
'x-pack/dev-tools',
|
||||
'packages/kbn-optimizer/src/__fixtures__/mock_repo/x-pack',
|
||||
'typings/*',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
@ -75,7 +75,7 @@ export async function runTypeCheckCli() {
|
|||
[
|
||||
'--max-old-space-size=5120',
|
||||
require.resolve('typescript/bin/tsc'),
|
||||
...['--project', p.tsConfigPath, ...(flags.verbose ? ['--verbose'] : [])],
|
||||
...['--project', p.tsConfigPath],
|
||||
...tscArgs,
|
||||
],
|
||||
{
|
||||
|
|
|
@ -492,7 +492,9 @@ export class SenseEditor {
|
|||
return result.join('\n');
|
||||
};
|
||||
|
||||
updateActionsBar = () => this.coreEditor.legacyUpdateUI(this.currentReqRange);
|
||||
updateActionsBar = () => {
|
||||
return this.coreEditor.legacyUpdateUI(this.currentReqRange);
|
||||
};
|
||||
|
||||
getCoreEditor() {
|
||||
return this.coreEditor;
|
||||
|
|
|
@ -17,7 +17,7 @@ import classNames from 'classnames';
|
|||
import _ from 'lodash';
|
||||
import React from 'react';
|
||||
import { Subscription } from 'rxjs';
|
||||
import ReactGridLayout, { Layout } from 'react-grid-layout';
|
||||
import ReactGridLayout, { Layout, ReactGridLayoutProps } from 'react-grid-layout';
|
||||
import { GridData } from '../../../../common';
|
||||
import { ViewMode } from '../../../services/embeddable';
|
||||
import { DASHBOARD_GRID_COLUMN_COUNT, DASHBOARD_GRID_HEIGHT } from '../dashboard_constants';
|
||||
|
@ -54,9 +54,9 @@ function ResponsiveGrid({
|
|||
size: { width: number };
|
||||
isViewMode: boolean;
|
||||
layout: Layout[];
|
||||
onLayoutChange: () => void;
|
||||
onLayoutChange: ReactGridLayoutProps['onLayoutChange'];
|
||||
children: JSX.Element[];
|
||||
maximizedPanelId: string;
|
||||
maximizedPanelId?: string;
|
||||
useMargins: boolean;
|
||||
}) {
|
||||
// This is to prevent a bug where view mode changes when the panel is expanded. View mode changes will trigger
|
||||
|
|
|
@ -383,7 +383,7 @@ export class SearchInterceptor {
|
|||
|
||||
private showTimeoutErrorMemoized = memoize(
|
||||
this.showTimeoutErrorToast,
|
||||
(_: SearchTimeoutError, sessionId: string) => {
|
||||
(_: SearchTimeoutError, sessionId?: string) => {
|
||||
return sessionId;
|
||||
}
|
||||
);
|
||||
|
@ -400,12 +400,7 @@ export class SearchInterceptor {
|
|||
);
|
||||
};
|
||||
|
||||
private showRestoreWarning = memoize(
|
||||
this.showRestoreWarningToast,
|
||||
(_: SearchTimeoutError, sessionId: string) => {
|
||||
return sessionId;
|
||||
}
|
||||
);
|
||||
private showRestoreWarning = memoize(this.showRestoreWarningToast);
|
||||
|
||||
/**
|
||||
* Show one error notification per session.
|
||||
|
|
|
@ -25,7 +25,7 @@ import { FilterBar } from '../filter_bar/filter_bar';
|
|||
import { SavedQueryMeta, SaveQueryForm } from '../saved_query_form';
|
||||
import { SavedQueryManagementComponent } from '../saved_query_management';
|
||||
|
||||
interface SearchBarInjectedDeps {
|
||||
export interface SearchBarInjectedDeps {
|
||||
kibana: KibanaReactContextValue<IDataPluginServices>;
|
||||
intl: InjectedIntl;
|
||||
timeHistory: TimeHistoryContract;
|
||||
|
|
|
@ -62,15 +62,15 @@ export function usageProvider(core: CoreSetup): SearchUsage {
|
|||
{ maxWait: 5000 }
|
||||
);
|
||||
|
||||
const trackSuccess = (duration: number) => {
|
||||
const trackSuccess = async (duration: number) => {
|
||||
collectedUsage.successCount++;
|
||||
collectedUsage.totalDuration += duration;
|
||||
return updateSearchUsage();
|
||||
return await updateSearchUsage();
|
||||
};
|
||||
|
||||
const trackError = () => {
|
||||
const trackError = async () => {
|
||||
collectedUsage.errorCount++;
|
||||
return updateSearchUsage();
|
||||
return await updateSearchUsage();
|
||||
};
|
||||
|
||||
return { trackSuccess, trackError };
|
||||
|
|
|
@ -26,7 +26,7 @@ export class NumberFormatEditor extends DefaultFormatEditor<NumberFormatEditorPa
|
|||
static contextType = contextType;
|
||||
static formatId = formatId;
|
||||
|
||||
context!: React.ContextType<typeof contextType>;
|
||||
declare context: React.ContextType<typeof contextType>;
|
||||
state = {
|
||||
...defaultState,
|
||||
sampleInputs: [10000, 12.345678, -1, -999, 0.52],
|
||||
|
|
|
@ -51,7 +51,7 @@ interface TestScriptState {
|
|||
export class TestScript extends Component<TestScriptProps, TestScriptState> {
|
||||
static contextType = contextType;
|
||||
|
||||
public readonly context!: IndexPatternManagmentContextValue;
|
||||
public declare readonly context: IndexPatternManagmentContextValue;
|
||||
|
||||
defaultProps = {
|
||||
name: 'myScriptedField',
|
||||
|
|
|
@ -125,7 +125,7 @@ export interface FieldEdiorProps {
|
|||
export class FieldEditor extends PureComponent<FieldEdiorProps, FieldEditorState> {
|
||||
static contextType = contextType;
|
||||
|
||||
public readonly context!: IndexPatternManagmentContextValue;
|
||||
public declare readonly context: IndexPatternManagmentContextValue;
|
||||
|
||||
supportedLangs: estypes.ScriptLanguage[] = [];
|
||||
deprecatedLangs: estypes.ScriptLanguage[] = [];
|
||||
|
|
|
@ -31,8 +31,10 @@ export class DiscoverSearchSessionManager {
|
|||
* skips if `searchSessionId` matches current search session id
|
||||
*/
|
||||
readonly newSearchSessionIdFromURL$: Rx.Observable<string | null>;
|
||||
private readonly deps: DiscoverSearchSessionManagerDeps;
|
||||
|
||||
constructor(private readonly deps: DiscoverSearchSessionManagerDeps) {
|
||||
constructor(deps: DiscoverSearchSessionManagerDeps) {
|
||||
this.deps = deps;
|
||||
this.newSearchSessionIdFromURL$ = createQueryParamObservable<string>(
|
||||
this.deps.history,
|
||||
SEARCH_SESSION_ID_QUERY_PARAM
|
||||
|
|
|
@ -40,6 +40,10 @@ import { EmbeddableStart } from '../../embeddable/public';
|
|||
|
||||
import type { SpacesApi } from '../../../../x-pack/plugins/spaces/public';
|
||||
|
||||
export interface HistoryLocationState {
|
||||
referrer: string;
|
||||
}
|
||||
|
||||
export interface DiscoverServices {
|
||||
addBasePath: (path: string) => string;
|
||||
capabilities: Capabilities;
|
||||
|
@ -48,7 +52,7 @@ export interface DiscoverServices {
|
|||
data: DataPublicPluginStart;
|
||||
docLinks: DocLinksStart;
|
||||
embeddable: EmbeddableStart;
|
||||
history: () => History;
|
||||
history: () => History<HistoryLocationState>;
|
||||
theme: ChartsPluginStart['theme'];
|
||||
filterManager: FilterManager;
|
||||
fieldFormats: FieldFormatsStart;
|
||||
|
|
|
@ -10,7 +10,7 @@ import { once } from 'lodash';
|
|||
import { createHashHistory } from 'history';
|
||||
import type { ScopedHistory, AppMountParameters } from 'kibana/public';
|
||||
import type { UiActionsStart } from 'src/plugins/ui_actions/public';
|
||||
import { DiscoverServices } from './build_services';
|
||||
import { DiscoverServices, HistoryLocationState } from './build_services';
|
||||
import { createGetterSetter } from '../../kibana_utils/public';
|
||||
import { DocViewsRegistry } from './services/doc_views/doc_views_registry';
|
||||
|
||||
|
@ -46,7 +46,7 @@ export const [getDocViewsRegistry, setDocViewsRegistry] =
|
|||
* Makes sure discover and context are using one instance of history.
|
||||
*/
|
||||
export const getHistory = once(() => {
|
||||
const history = createHashHistory();
|
||||
const history = createHashHistory<HistoryLocationState>();
|
||||
history.listen(() => {
|
||||
// keep at least one listener so that `history.location` always in sync
|
||||
});
|
||||
|
|
|
@ -94,7 +94,7 @@ export class AttributeService<
|
|||
? await this.options.unwrapMethod(input.savedObjectId)
|
||||
: await this.defaultUnwrapMethod(input);
|
||||
}
|
||||
return { attributes: input[ATTRIBUTE_SERVICE_KEY] };
|
||||
return { attributes: (input as ValType)[ATTRIBUTE_SERVICE_KEY] };
|
||||
}
|
||||
|
||||
public async wrapAttributes(
|
||||
|
@ -141,7 +141,7 @@ export class AttributeService<
|
|||
|
||||
getInputAsValueType = async (input: ValType | RefType): Promise<ValType> => {
|
||||
if (!this.inputIsRefType(input)) {
|
||||
return input;
|
||||
return input as ValType;
|
||||
}
|
||||
const { attributes } = await this.unwrapAttributes(input);
|
||||
const { savedObjectId, ...originalInputToPropagate } = input;
|
||||
|
@ -162,7 +162,7 @@ export class AttributeService<
|
|||
const onSave = async (props: OnSaveProps): Promise<SaveResult> => {
|
||||
await this.options.checkForDuplicateTitle(props);
|
||||
try {
|
||||
const newAttributes = { ...input[ATTRIBUTE_SERVICE_KEY] };
|
||||
const newAttributes = { ...(input as ValType)[ATTRIBUTE_SERVICE_KEY] };
|
||||
newAttributes.title = props.newTitle;
|
||||
const wrappedInput = (await this.wrapAttributes(newAttributes, true)) as RefType;
|
||||
|
||||
|
@ -182,7 +182,11 @@ export class AttributeService<
|
|||
<SavedObjectSaveModal
|
||||
onSave={onSave}
|
||||
onClose={() => reject()}
|
||||
title={get(saveOptions, 'saveModalTitle', input[ATTRIBUTE_SERVICE_KEY].title)}
|
||||
title={get(
|
||||
saveOptions,
|
||||
'saveModalTitle',
|
||||
(input as ValType)[ATTRIBUTE_SERVICE_KEY].title
|
||||
)}
|
||||
showCopyOnSave={false}
|
||||
objectType={this.type}
|
||||
showDescription={false}
|
||||
|
|
|
@ -29,15 +29,17 @@ export const EMBEDDABLE_STATE_TRANSFER_STORAGE_KEY = 'EMBEDDABLE_STATE_TRANSFER'
|
|||
export class EmbeddableStateTransfer {
|
||||
public isTransferInProgress: boolean;
|
||||
private storage: Storage;
|
||||
private appList: ReadonlyMap<string, PublicAppInfo> | undefined;
|
||||
|
||||
constructor(
|
||||
private navigateToApp: ApplicationStart['navigateToApp'],
|
||||
currentAppId$: ApplicationStart['currentAppId$'],
|
||||
private appList?: ReadonlyMap<string, PublicAppInfo> | undefined,
|
||||
appList?: ReadonlyMap<string, PublicAppInfo> | undefined,
|
||||
customStorage?: Storage
|
||||
) {
|
||||
this.storage = customStorage ? customStorage : new Storage(sessionStorage);
|
||||
this.isTransferInProgress = false;
|
||||
this.appList = appList;
|
||||
currentAppId$.subscribe(() => {
|
||||
this.isTransferInProgress = false;
|
||||
});
|
||||
|
|
|
@ -24,7 +24,11 @@ export class ExecutionContract<Input = unknown, Output = unknown, InspectorAdapt
|
|||
return !finished;
|
||||
}
|
||||
|
||||
constructor(protected readonly execution: Execution<Input, Output, InspectorAdapters>) {}
|
||||
protected readonly execution: Execution<Input, Output, InspectorAdapters>;
|
||||
|
||||
constructor(execution: Execution<Input, Output, InspectorAdapters>) {
|
||||
this.execution = execution;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel the execution of the expression. This will set abort signal
|
||||
|
|
|
@ -30,8 +30,9 @@ export class ExpressionType {
|
|||
*/
|
||||
serialize?: (value: Serializable) => unknown;
|
||||
deserialize?: (serialized: unknown[]) => Serializable;
|
||||
private readonly definition: AnyExpressionTypeDefinition;
|
||||
|
||||
constructor(private readonly definition: AnyExpressionTypeDefinition) {
|
||||
constructor(definition: AnyExpressionTypeDefinition) {
|
||||
const { name, help, deserialize, serialize, validate } = definition;
|
||||
|
||||
this.name = name;
|
||||
|
@ -43,6 +44,7 @@ export class ExpressionType {
|
|||
|
||||
this.serialize = serialize;
|
||||
this.deserialize = deserialize;
|
||||
this.definition = definition;
|
||||
}
|
||||
|
||||
getToFn = (
|
||||
|
|
|
@ -177,7 +177,7 @@ export class FieldFormatsRegistry {
|
|||
|
||||
return new ConcreteFieldFormat(params, this.getConfig);
|
||||
},
|
||||
(formatId: FieldFormatId, params: FieldFormatParams) =>
|
||||
(formatId: FieldFormatId, params?: FieldFormatParams) =>
|
||||
JSON.stringify({
|
||||
formatId,
|
||||
...params,
|
||||
|
@ -212,10 +212,10 @@ export class FieldFormatsRegistry {
|
|||
* https://lodash.com/docs#memoize
|
||||
*
|
||||
* @param {KBN_FIELD_TYPES} fieldType
|
||||
* @param {ES_FIELD_TYPES[]} esTypes
|
||||
* @param {ES_FIELD_TYPES[] | undefined} esTypes
|
||||
* @return {String}
|
||||
*/
|
||||
getDefaultInstanceCacheResolver(fieldType: KBN_FIELD_TYPES, esTypes: ES_FIELD_TYPES[]): string {
|
||||
getDefaultInstanceCacheResolver(fieldType: KBN_FIELD_TYPES, esTypes?: ES_FIELD_TYPES[]): string {
|
||||
// @ts-ignore
|
||||
return Array.isArray(esTypes) && esTypes.indexOf(fieldType) === -1
|
||||
? [fieldType, ...esTypes].join('-')
|
||||
|
|
|
@ -25,6 +25,10 @@ function isRangeControl(control: RangeControl | ListControl): control is RangeCo
|
|||
return control.type === CONTROL_TYPES.RANGE;
|
||||
}
|
||||
|
||||
interface UnknownControl {
|
||||
type: string;
|
||||
}
|
||||
|
||||
interface InputControlVisProps {
|
||||
stageFilter: (controlIndex: number, newValue: any) => void;
|
||||
submitFilters: () => void;
|
||||
|
@ -90,7 +94,7 @@ export class InputControlVis extends Component<InputControlVisProps> {
|
|||
/>
|
||||
);
|
||||
} else {
|
||||
throw new Error(`Unhandled control type ${control!.type}`);
|
||||
throw new Error(`Unhandled control type ${(control as UnknownControl)!.type}`);
|
||||
}
|
||||
|
||||
return (
|
||||
|
|
|
@ -12,7 +12,10 @@ import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiTitle } from '
|
|||
import { FormattedMessage } from '@kbn/i18n-react';
|
||||
import { CoreStart } from 'kibana/public';
|
||||
import { RedirectAppLinks, useKibana } from '../../../../../../src/plugins/kibana_react/public';
|
||||
import { FeatureCatalogueEntry } from '../../../../../../src/plugins/home/public';
|
||||
import {
|
||||
FeatureCatalogueEntry,
|
||||
FeatureCatalogueCategory,
|
||||
} from '../../../../../../src/plugins/home/public';
|
||||
// @ts-expect-error untyped component
|
||||
import { Synopsis } from '../synopsis';
|
||||
import { METRIC_TYPE, trackUiMetric } from '../../lib/ui_metric';
|
||||
|
@ -94,8 +97,8 @@ AddData.propTypes = {
|
|||
icon: PropTypes.string.isRequired,
|
||||
path: PropTypes.string.isRequired,
|
||||
showOnHomePage: PropTypes.bool.isRequired,
|
||||
category: PropTypes.string.isRequired,
|
||||
order: PropTypes.number,
|
||||
})
|
||||
),
|
||||
category: PropTypes.oneOf(Object.values(FeatureCatalogueCategory)).isRequired,
|
||||
order: PropTypes.number as PropTypes.Validator<number | undefined>,
|
||||
}).isRequired
|
||||
).isRequired,
|
||||
};
|
||||
|
|
|
@ -12,7 +12,10 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiSpacer, EuiTitle } fro
|
|||
import { FormattedMessage } from '@kbn/i18n-react';
|
||||
import { CoreStart } from 'kibana/public';
|
||||
import { RedirectAppLinks, useKibana } from '../../../../../../src/plugins/kibana_react/public';
|
||||
import { FeatureCatalogueEntry } from '../../../../../../src/plugins/home/public';
|
||||
import {
|
||||
FeatureCatalogueEntry,
|
||||
FeatureCatalogueCategory,
|
||||
} from '../../../../../../src/plugins/home/public';
|
||||
// @ts-expect-error untyped component
|
||||
import { Synopsis } from '../synopsis';
|
||||
import { METRIC_TYPE, trackUiMetric } from '../../lib/ui_metric';
|
||||
|
@ -81,8 +84,8 @@ ManageData.propTypes = {
|
|||
icon: PropTypes.string.isRequired,
|
||||
path: PropTypes.string.isRequired,
|
||||
showOnHomePage: PropTypes.bool.isRequired,
|
||||
category: PropTypes.string.isRequired,
|
||||
order: PropTypes.number,
|
||||
})
|
||||
),
|
||||
category: PropTypes.oneOf(Object.values(FeatureCatalogueCategory)).isRequired,
|
||||
order: PropTypes.number as PropTypes.Validator<number | undefined>,
|
||||
}).isRequired
|
||||
).isRequired,
|
||||
};
|
||||
|
|
|
@ -26,7 +26,6 @@ import {
|
|||
export class ControlGroupContainerFactory implements EmbeddableFactoryDefinition {
|
||||
public readonly isContainerType = true;
|
||||
public readonly type = CONTROL_GROUP_TYPE;
|
||||
|
||||
public inject: EmbeddablePersistableStateService['inject'];
|
||||
public extract: EmbeddablePersistableStateService['extract'];
|
||||
|
||||
|
|
|
@ -253,7 +253,7 @@ describe('useEditorUpdates', () => {
|
|||
|
||||
describe('handle linked search changes', () => {
|
||||
test('should update saved search id in saved instance', () => {
|
||||
// @ts-expect-error
|
||||
// @ts-expect-error 4.3.5 upgrade
|
||||
savedVisInstance.savedSearch = {
|
||||
id: 'saved_search_id',
|
||||
};
|
||||
|
@ -287,7 +287,8 @@ describe('useEditorUpdates', () => {
|
|||
savedVisInstance.savedVis = {
|
||||
savedSearchId: 'saved_search_id',
|
||||
};
|
||||
// @ts-expect-error
|
||||
|
||||
// @ts-expect-error 4.3.5 upgrade
|
||||
savedVisInstance.savedSearch = {
|
||||
id: 'saved_search_id',
|
||||
};
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
"emitDeclarationOnly": true,
|
||||
"declaration": true,
|
||||
"declarationMap": true,
|
||||
"types": ["node", "resize-observer-polyfill", "@emotion/react/types/css-prop"]
|
||||
"types": ["node", "@emotion/react/types/css-prop"]
|
||||
},
|
||||
"include": [
|
||||
"**/*",
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
"@emotion/core": [
|
||||
"typings/@emotion"
|
||||
],
|
||||
"resize-observer-polyfill": [
|
||||
"typings/resize-observer-polyfill"
|
||||
]
|
||||
},
|
||||
// Support .tsx files and transform JSX into calls to React.createElement
|
||||
"jsx": "react",
|
||||
|
@ -68,7 +71,6 @@
|
|||
"flot",
|
||||
"jest-styled-components",
|
||||
"@testing-library/jest-dom",
|
||||
"resize-observer-polyfill",
|
||||
"@emotion/react/types/css-prop"
|
||||
]
|
||||
}
|
||||
|
|
10
typings/resize-observer-polyfill/index.d.ts
vendored
Normal file
10
typings/resize-observer-polyfill/index.d.ts
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line import/no-default-export
|
||||
export default ResizeObserver;
|
|
@ -33,7 +33,9 @@ export interface Params {
|
|||
export class DashboardToDiscoverDrilldown
|
||||
implements Drilldown<Config, ApplyGlobalFilterActionContext>
|
||||
{
|
||||
constructor(protected readonly params: Params) {}
|
||||
constructor(protected readonly params: Params) {
|
||||
this.ReactCollectConfig = (props) => <CollectConfigContainer {...props} params={this.params} />;
|
||||
}
|
||||
|
||||
public readonly id = SAMPLE_DASHBOARD_TO_DISCOVER_DRILLDOWN;
|
||||
|
||||
|
@ -47,9 +49,7 @@ export class DashboardToDiscoverDrilldown
|
|||
return [APPLY_FILTER_TRIGGER];
|
||||
}
|
||||
|
||||
private readonly ReactCollectConfig: React.FC<CollectConfigProps> = (props) => (
|
||||
<CollectConfigContainer {...props} params={this.params} />
|
||||
);
|
||||
private readonly ReactCollectConfig!: React.FC<CollectConfigProps>;
|
||||
|
||||
public readonly CollectConfig = reactToUiComponent(this.ReactCollectConfig);
|
||||
|
||||
|
|
|
@ -22,14 +22,14 @@
|
|||
"actions",
|
||||
"alerting",
|
||||
"cloud",
|
||||
"fleet",
|
||||
"home",
|
||||
"maps",
|
||||
"ml",
|
||||
"security",
|
||||
"spaces",
|
||||
"taskManager",
|
||||
"usageCollection",
|
||||
"fleet"
|
||||
"usageCollection"
|
||||
],
|
||||
"server": true,
|
||||
"ui": true,
|
||||
|
|
|
@ -130,6 +130,7 @@ export function UXAppRoot({
|
|||
services={{ ...core, ...plugins, embeddable, data }}
|
||||
>
|
||||
<i18nCore.Context>
|
||||
{/* @ts-expect-error Type instantiation is excessively deep */}
|
||||
<RouterProvider history={history} router={uxRouter}>
|
||||
<InspectorContextProvider>
|
||||
<UrlParamsProvider>
|
||||
|
|
|
@ -46,7 +46,9 @@ function useServicesFetcher() {
|
|||
|
||||
const {
|
||||
query: { rangeFrom, rangeTo, environment, kuery },
|
||||
} = useApmParams('/services/{serviceName}', '/services');
|
||||
} =
|
||||
// @ts-ignore 4.3.5 upgrade - Type instantiation is excessively deep and possibly infinite.
|
||||
useApmParams('/services/{serviceName}', '/services');
|
||||
|
||||
const { start, end } = useTimeRange({ rangeFrom, rangeTo });
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@ export function BackendContents({
|
|||
start,
|
||||
end,
|
||||
}: ContentsProps) {
|
||||
// @ts-ignore 4.3.5 upgrade - Type instantiation is excessively deep and possibly infinite.
|
||||
const { query } = useApmParams(
|
||||
'/service-map',
|
||||
'/services/{serviceName}/service-map'
|
||||
|
|
|
@ -138,6 +138,7 @@ function UnoptimizedManagedTable<T>(props: Props<T>) {
|
|||
}, [isLoading, noItemsMessage]);
|
||||
|
||||
return (
|
||||
// @ts-expect-error TS thinks pagination should be non-nullable, but it's not
|
||||
<EuiBasicTable
|
||||
loading={isLoading}
|
||||
error={
|
||||
|
|
|
@ -121,6 +121,7 @@ export function TimeComparison() {
|
|||
const { isSmall } = useBreakpoints();
|
||||
const {
|
||||
query: { rangeFrom, rangeTo },
|
||||
// @ts-expect-error Type instantiation is excessively deep and possibly infinite.
|
||||
} = useApmParams('/services', '/backends/*', '/services/{serviceName}');
|
||||
|
||||
const { exactStart, exactEnd } = useTimeRange({
|
||||
|
|
|
@ -13,9 +13,7 @@ export function useApmRouter() {
|
|||
const router = useRouter();
|
||||
const { core } = useApmPluginContext();
|
||||
|
||||
const link = (...args: any[]) => {
|
||||
// a little too much effort needed to satisfy TS here
|
||||
// @ts-ignore
|
||||
const link = (...args: [any]) => {
|
||||
return core.http.basePath.prepend('/app/apm' + router.link(...args));
|
||||
};
|
||||
|
||||
|
|
|
@ -11,9 +11,9 @@ import {
|
|||
} from '../../../../../../../../src/core/server/mocks';
|
||||
import { createHttpServer } from 'src/core/server/test_utils';
|
||||
import supertest from 'supertest';
|
||||
import { createApmEventClient } from '.';
|
||||
import { APMEventClient } from '.';
|
||||
|
||||
describe('createApmEventClient', () => {
|
||||
describe('APMEventClient', () => {
|
||||
let server: ReturnType<typeof createHttpServer>;
|
||||
|
||||
beforeEach(() => {
|
||||
|
@ -38,7 +38,7 @@ describe('createApmEventClient', () => {
|
|||
router.get(
|
||||
{ path: '/', validate: false },
|
||||
async (context, request, res) => {
|
||||
const eventClient = createApmEventClient({
|
||||
const eventClient = new APMEventClient({
|
||||
esClient: {
|
||||
search: async (
|
||||
params: any,
|
||||
|
|
|
@ -57,26 +57,13 @@ type TypeOfProcessorEvent<T extends ProcessorEvent> = {
|
|||
profile: Profile;
|
||||
}[T];
|
||||
|
||||
type ESSearchRequestOf<TParams extends APMEventESSearchRequest> = Omit<
|
||||
TParams,
|
||||
'apm'
|
||||
> & { index: string[] | string };
|
||||
|
||||
type TypedSearchResponse<TParams extends APMEventESSearchRequest> =
|
||||
InferSearchResponseOf<
|
||||
TypeOfProcessorEvent<ValuesType<TParams['apm']['events']>>,
|
||||
ESSearchRequestOf<TParams>
|
||||
TParams
|
||||
>;
|
||||
|
||||
export type APMEventClient = ReturnType<typeof createApmEventClient>;
|
||||
|
||||
export function createApmEventClient({
|
||||
esClient,
|
||||
debug,
|
||||
request,
|
||||
indices,
|
||||
options: { includeFrozen } = { includeFrozen: false },
|
||||
}: {
|
||||
export interface APMEventClientConfig {
|
||||
esClient: ElasticsearchClient;
|
||||
debug: boolean;
|
||||
request: KibanaRequest;
|
||||
|
@ -84,102 +71,119 @@ export function createApmEventClient({
|
|||
options: {
|
||||
includeFrozen: boolean;
|
||||
};
|
||||
}) {
|
||||
return {
|
||||
async search<TParams extends APMEventESSearchRequest>(
|
||||
operationName: string,
|
||||
params: TParams
|
||||
): Promise<TypedSearchResponse<TParams>> {
|
||||
const withProcessorEventFilter = unpackProcessorEvents(params, indices);
|
||||
|
||||
const { includeLegacyData = false } = params.apm;
|
||||
|
||||
const withPossibleLegacyDataFilter = !includeLegacyData
|
||||
? addFilterToExcludeLegacyData(withProcessorEventFilter)
|
||||
: withProcessorEventFilter;
|
||||
|
||||
const searchParams = {
|
||||
...withPossibleLegacyDataFilter,
|
||||
...(includeFrozen ? { ignore_throttled: false } : {}),
|
||||
ignore_unavailable: true,
|
||||
preference: 'any',
|
||||
};
|
||||
|
||||
// only "search" operation is currently supported
|
||||
const requestType = 'search';
|
||||
|
||||
return callAsyncWithDebug({
|
||||
cb: () => {
|
||||
const searchPromise = withApmSpan(operationName, () => {
|
||||
const controller = new AbortController();
|
||||
return cancelEsRequestOnAbort(
|
||||
esClient.search(searchParams, { signal: controller.signal }),
|
||||
request,
|
||||
controller
|
||||
);
|
||||
});
|
||||
|
||||
return unwrapEsResponse(searchPromise);
|
||||
},
|
||||
getDebugMessage: () => ({
|
||||
body: getDebugBody({
|
||||
params: searchParams,
|
||||
requestType,
|
||||
operationName,
|
||||
}),
|
||||
title: getDebugTitle(request),
|
||||
}),
|
||||
isCalledWithInternalUser: false,
|
||||
debug,
|
||||
request,
|
||||
requestType,
|
||||
operationName,
|
||||
requestParams: searchParams,
|
||||
});
|
||||
},
|
||||
|
||||
async termsEnum(
|
||||
operationName: string,
|
||||
params: APMEventESTermsEnumRequest
|
||||
): Promise<TermsEnumResponse> {
|
||||
const requestType = 'terms_enum';
|
||||
const { index } = unpackProcessorEvents(params, indices);
|
||||
|
||||
return callAsyncWithDebug({
|
||||
cb: () => {
|
||||
const { apm, ...rest } = params;
|
||||
const termsEnumPromise = withApmSpan(operationName, () => {
|
||||
const controller = new AbortController();
|
||||
return cancelEsRequestOnAbort(
|
||||
esClient.termsEnum(
|
||||
{
|
||||
index: Array.isArray(index) ? index.join(',') : index,
|
||||
...rest,
|
||||
},
|
||||
{ signal: controller.signal }
|
||||
),
|
||||
request,
|
||||
controller
|
||||
);
|
||||
});
|
||||
|
||||
return unwrapEsResponse(termsEnumPromise);
|
||||
},
|
||||
getDebugMessage: () => ({
|
||||
body: getDebugBody({
|
||||
params,
|
||||
requestType,
|
||||
operationName,
|
||||
}),
|
||||
title: getDebugTitle(request),
|
||||
}),
|
||||
isCalledWithInternalUser: false,
|
||||
debug,
|
||||
request,
|
||||
requestType,
|
||||
operationName,
|
||||
requestParams: params,
|
||||
});
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export class APMEventClient {
|
||||
private readonly esClient: ElasticsearchClient;
|
||||
private readonly debug: boolean;
|
||||
private readonly request: KibanaRequest;
|
||||
private readonly indices: ApmIndicesConfig;
|
||||
private readonly includeFrozen: boolean;
|
||||
|
||||
constructor(config: APMEventClientConfig) {
|
||||
this.esClient = config.esClient;
|
||||
this.debug = config.debug;
|
||||
this.request = config.request;
|
||||
this.indices = config.indices;
|
||||
this.includeFrozen = config.options.includeFrozen;
|
||||
}
|
||||
|
||||
async search<TParams extends APMEventESSearchRequest>(
|
||||
operationName: string,
|
||||
params: TParams
|
||||
): Promise<TypedSearchResponse<TParams>> {
|
||||
const withProcessorEventFilter = unpackProcessorEvents(
|
||||
params,
|
||||
this.indices
|
||||
);
|
||||
|
||||
const { includeLegacyData = false } = params.apm;
|
||||
|
||||
const withPossibleLegacyDataFilter = !includeLegacyData
|
||||
? addFilterToExcludeLegacyData(withProcessorEventFilter)
|
||||
: withProcessorEventFilter;
|
||||
|
||||
const searchParams = {
|
||||
...withPossibleLegacyDataFilter,
|
||||
...(this.includeFrozen ? { ignore_throttled: false } : {}),
|
||||
ignore_unavailable: true,
|
||||
preference: 'any',
|
||||
};
|
||||
|
||||
// only "search" operation is currently supported
|
||||
const requestType = 'search';
|
||||
|
||||
return callAsyncWithDebug({
|
||||
cb: () => {
|
||||
const searchPromise = withApmSpan(operationName, () => {
|
||||
const controller = new AbortController();
|
||||
return cancelEsRequestOnAbort(
|
||||
this.esClient.search(searchParams, { signal: controller.signal }),
|
||||
this.request,
|
||||
controller
|
||||
);
|
||||
});
|
||||
|
||||
return unwrapEsResponse(searchPromise);
|
||||
},
|
||||
getDebugMessage: () => ({
|
||||
body: getDebugBody({
|
||||
params: searchParams,
|
||||
requestType,
|
||||
operationName,
|
||||
}),
|
||||
title: getDebugTitle(this.request),
|
||||
}),
|
||||
isCalledWithInternalUser: false,
|
||||
debug: this.debug,
|
||||
request: this.request,
|
||||
requestType,
|
||||
operationName,
|
||||
requestParams: searchParams,
|
||||
});
|
||||
}
|
||||
|
||||
async termsEnum(
|
||||
operationName: string,
|
||||
params: APMEventESTermsEnumRequest
|
||||
): Promise<TermsEnumResponse> {
|
||||
const requestType = 'terms_enum';
|
||||
const { index } = unpackProcessorEvents(params, this.indices);
|
||||
|
||||
return callAsyncWithDebug({
|
||||
cb: () => {
|
||||
const { apm, ...rest } = params;
|
||||
const termsEnumPromise = withApmSpan(operationName, () => {
|
||||
const controller = new AbortController();
|
||||
return cancelEsRequestOnAbort(
|
||||
this.esClient.termsEnum(
|
||||
{
|
||||
index: Array.isArray(index) ? index.join(',') : index,
|
||||
...rest,
|
||||
},
|
||||
{ signal: controller.signal }
|
||||
),
|
||||
this.request,
|
||||
controller
|
||||
);
|
||||
});
|
||||
|
||||
return unwrapEsResponse(termsEnumPromise);
|
||||
},
|
||||
getDebugMessage: () => ({
|
||||
body: getDebugBody({
|
||||
params,
|
||||
requestType,
|
||||
operationName,
|
||||
}),
|
||||
title: getDebugTitle(this.request),
|
||||
}),
|
||||
isCalledWithInternalUser: false,
|
||||
debug: this.debug,
|
||||
request: this.request,
|
||||
requestType,
|
||||
operationName,
|
||||
requestParams: params,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,10 +14,7 @@ import {
|
|||
ApmIndicesConfig,
|
||||
getApmIndices,
|
||||
} from '../../routes/settings/apm_indices/get_apm_indices';
|
||||
import {
|
||||
APMEventClient,
|
||||
createApmEventClient,
|
||||
} from './create_es_client/create_apm_event_client';
|
||||
import { APMEventClient } from './create_es_client/create_apm_event_client';
|
||||
import {
|
||||
APMInternalClient,
|
||||
createInternalESClient,
|
||||
|
@ -58,7 +55,7 @@ export async function setupRequest({
|
|||
|
||||
return {
|
||||
indices,
|
||||
apmEventClient: createApmEventClient({
|
||||
apmEventClient: new APMEventClient({
|
||||
esClient: context.core.elasticsearch.client.asCurrentUser,
|
||||
debug: query._inspect,
|
||||
request,
|
||||
|
|
|
@ -8,8 +8,10 @@
|
|||
import { merge } from 'lodash';
|
||||
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
|
||||
import {
|
||||
TRANSACTION_TYPE,
|
||||
AGENT_NAME,
|
||||
TRANSACTION_TYPE,
|
||||
TRANSACTION_NAME,
|
||||
SERVICE_NAME,
|
||||
} from '../../../common/elasticsearch_fieldnames';
|
||||
import { arrayUnionToCallable } from '../../../common/utils/array_union_to_callable';
|
||||
import { TransactionGroupRequestBase, TransactionGroupSetup } from './fetcher';
|
||||
|
@ -21,7 +23,7 @@ interface MetricParams {
|
|||
searchAggregatedTransactions: boolean;
|
||||
}
|
||||
|
||||
type BucketKey = Record<string, string>;
|
||||
type BucketKey = Record<typeof TRANSACTION_NAME | typeof SERVICE_NAME, string>;
|
||||
|
||||
function mergeRequestWithAggs<
|
||||
TRequestBase extends TransactionGroupRequestBase,
|
||||
|
|
|
@ -23,7 +23,7 @@ import { APM_FEATURE, registerFeaturesUsage } from './feature';
|
|||
import { registerApmAlerts } from './routes/alerts/register_apm_alerts';
|
||||
import { registerFleetPolicyCallbacks } from './routes/fleet/register_fleet_policy_callbacks';
|
||||
import { createApmTelemetry } from './lib/apm_telemetry';
|
||||
import { createApmEventClient } from './lib/helpers/create_es_client/create_apm_event_client';
|
||||
import { APMEventClient } from './lib/helpers/create_es_client/create_apm_event_client';
|
||||
import { getInternalSavedObjectsClient } from './lib/helpers/get_internal_saved_objects_client';
|
||||
import { createApmAgentConfigurationIndex } from './routes/settings/agent_configuration/create_agent_config_index';
|
||||
import { getApmIndices } from './routes/settings/apm_indices/get_apm_indices';
|
||||
|
@ -66,7 +66,7 @@ export class APMPlugin
|
|||
|
||||
public setup(
|
||||
core: CoreSetup<APMPluginStartDependencies>,
|
||||
plugins: Omit<APMPluginSetupDependencies, 'core'>
|
||||
plugins: APMPluginSetupDependencies
|
||||
) {
|
||||
this.logger = this.initContext.logger.get();
|
||||
const config$ = this.initContext.config.create<APMConfig>();
|
||||
|
@ -224,7 +224,7 @@ export class APMPlugin
|
|||
|
||||
const esClient = context.core.elasticsearch.client.asCurrentUser;
|
||||
|
||||
return createApmEventClient({
|
||||
return new APMEventClient({
|
||||
debug: debug ?? false,
|
||||
esClient,
|
||||
request,
|
||||
|
|
|
@ -171,27 +171,29 @@ export function registerTransactionErrorRateAlertType({
|
|||
return {};
|
||||
}
|
||||
|
||||
const results = response.aggregations.series.buckets
|
||||
.map((bucket) => {
|
||||
const [serviceName, environment, transactionType] = bucket.key;
|
||||
const results = [];
|
||||
for (const bucket of response.aggregations.series.buckets) {
|
||||
const [serviceName, environment, transactionType] = bucket.key;
|
||||
|
||||
const failed =
|
||||
bucket.outcomes.buckets.find(
|
||||
(outcomeBucket) => outcomeBucket.key === EventOutcome.failure
|
||||
)?.doc_count ?? 0;
|
||||
const succesful =
|
||||
bucket.outcomes.buckets.find(
|
||||
(outcomeBucket) => outcomeBucket.key === EventOutcome.success
|
||||
)?.doc_count ?? 0;
|
||||
const failed =
|
||||
bucket.outcomes.buckets.find(
|
||||
(outcomeBucket) => outcomeBucket.key === EventOutcome.failure
|
||||
)?.doc_count ?? 0;
|
||||
const succesful =
|
||||
bucket.outcomes.buckets.find(
|
||||
(outcomeBucket) => outcomeBucket.key === EventOutcome.success
|
||||
)?.doc_count ?? 0;
|
||||
const errorRate = (failed / (failed + succesful)) * 100;
|
||||
|
||||
return {
|
||||
if (errorRate >= alertParams.threshold) {
|
||||
results.push({
|
||||
serviceName,
|
||||
environment,
|
||||
transactionType,
|
||||
errorRate: (failed / (failed + succesful)) * 100,
|
||||
};
|
||||
})
|
||||
.filter((result) => result.errorRate >= alertParams.threshold);
|
||||
errorRate,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
results.forEach((result) => {
|
||||
const { serviceName, environment, transactionType, errorRate } =
|
||||
|
|
|
@ -22,12 +22,13 @@ const staticDataViewRoute = createApmServerRoute({
|
|||
config,
|
||||
} = resources;
|
||||
|
||||
const [setup, savedObjectsClient] = await Promise.all([
|
||||
setupRequest(resources),
|
||||
core
|
||||
.start()
|
||||
.then((coreStart) => coreStart.savedObjects.createInternalRepository()),
|
||||
]);
|
||||
const setupPromise = setupRequest(resources);
|
||||
const clientPromise = core
|
||||
.start()
|
||||
.then((coreStart) => coreStart.savedObjects.createInternalRepository());
|
||||
|
||||
const setup = await setupPromise;
|
||||
const savedObjectsClient = await clientPromise;
|
||||
|
||||
const spaceId = spaces?.setup.spacesService.getSpaceId(request);
|
||||
|
||||
|
|
|
@ -110,6 +110,7 @@ export async function getErrorGroupMainStatistics({
|
|||
);
|
||||
|
||||
return (
|
||||
// @ts-ignore 4.3.5 upgrade - Expression produces a union type that is too complex to represent. ts(2590)
|
||||
response.aggregations?.error_groups.buckets.map((bucket) => ({
|
||||
groupId: bucket.key as string,
|
||||
name: getErrorName(bucket.sample.hits.hits[0]._source),
|
||||
|
|
|
@ -120,6 +120,7 @@ export async function getServiceAnomalies({
|
|||
const relevantBuckets = uniqBy(
|
||||
sortBy(
|
||||
// make sure we only return data for jobs that are available in this space
|
||||
// @ts-ignore 4.3.5 upgrade
|
||||
typedAnomalyResponse.aggregations?.services.buckets.filter((bucket) =>
|
||||
jobIds.includes(bucket.key.jobId as string)
|
||||
) ?? [],
|
||||
|
|
|
@ -168,6 +168,7 @@ export async function getServiceInstancesTransactionStatistics<
|
|||
const { timeseries } = serviceNodeBucket;
|
||||
return {
|
||||
serviceNodeName,
|
||||
// @ts-ignore 4.3.5 upgrade - Expression produces a union type that is too complex to represent.
|
||||
errorRate: timeseries.buckets.map((dateBucket) => ({
|
||||
x: dateBucket.key,
|
||||
y: dateBucket.failures.doc_count / dateBucket.doc_count,
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue