[Fleet] Add lint rule/fix for import order groups (#93300)

## Problem
Blocks of 10-15 `import`s are common in the plugin and there a few places which have ~50 lines of `import`s. It makes it more difficult to understand the where/why of what's being imported.

We've had instances while files import from the same module in different lines. i.e.

```ts
import { a } from './file';
... 5-10 lines later
import { b } from './file';
```

## Proposed solution
Add a lint rule to enforce a convention on the module `import` order. This can help in the same way Prettier & ESLint help to format type signatures or other code. It makes it easier to understand or notice any changes in the code. It's also able to be fixed automatically (`node scripts/eslint.js --fix` or any existing "format on save" in an editor).

## This PR
replaces #92980 (based on https://github.com/elastic/kibana/pull/92980#pullrequestreview-601070556)

### Lint rule
f9be98d Add eslint rule to enforce/autofix import group order. Use the same rule as a few other plugins. Groups `import` statements by type as shown in the [lint rule docs](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/order.md#importorder-enforce-a-convention-in-module-import-order
). The order is:

  1. node "builtin" modules
  2. "external" modules
  3. "internal" modules
  4. modules from a "parent" directory
  5. "sibling" modules from the same or a sibling's directory, "index" of the current directory, everything else

e.g.

```typescript
import fs from 'fs';
import path from 'path';

import _ from 'lodash';
import chalk from 'chalk';

import foo from 'src/foo';

import foo from '../foo';
import qux from '../../foo/qux';

import bar from './bar';
import baz from './bar/baz';
import main from './';
```
The [lint rule](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/order.md#importorder-enforce-a-convention-in-module-import-order) is relatively light handed. It only ensures  the `imports` are groups together in the given order. It doesn't alphabetize or otherwise sort the order of the files.


e.g. imports aren't rewritten to be in alphabetical order. This is fine

```ts
import from './c';
import from './a';
import from './b';
```

The [docs show other options](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/order.md#options) and 2831f02bc7/.eslintrc.js (L1138-L1168) uses many of them

### Newlines option
The newlines settings means a change from something like

```typescript
import fs from 'fs';
import path from 'path';
import _ from 'lodash';
import chalk from 'chalk';
import foo from 'src/foo';
import foo from '../foo';
import qux from '../../foo/qux';
import bar from './bar';
import baz from './bar/baz';
import main from './';
```

to 

```typescript
import fs from 'fs';
import path from 'path';

import _ from 'lodash';
import chalk from 'chalk';

import foo from 'src/foo';

import foo from '../foo';
import qux from '../../foo/qux';

import bar from './bar';
import baz from './bar/baz';
import main from './';
```



Added it as a separate commit 2831f02 in case we want to avoid it, but I believe it's an improvement overall. Especially on the files with 25+ lines of imports. Even the "worst case" of something like this isn't bad (IMO). Especially since it's an automatic reformat like anything else in prettier


```typescript
import fs from 'fs';

import _ from 'lodash';

import foo from '../foo';

import main from './';
```
This commit is contained in:
John Schulz 2021-03-03 13:58:20 -05:00 committed by GitHub
parent 9dd395b452
commit b5522ed30c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
298 changed files with 664 additions and 182 deletions

View file

@ -789,6 +789,22 @@ module.exports = {
},
},
/**
* Fleet overrides
*/
{
files: ['x-pack/plugins/fleet/**/*.{js,mjs,ts,tsx}'],
rules: {
'import/order': [
'warn',
{
groups: ['builtin', 'external', 'internal', 'parent'],
'newlines-between': 'always-and-inside-groups',
},
],
},
},
/**
* Security Solution overrides
*/

View file

@ -5,9 +5,10 @@
* 2.0.
*/
import { defaultPackages } from './epm';
import type { AgentPolicy } from '../types';
import { defaultPackages } from './epm';
export const AGENT_POLICY_SAVED_OBJECT_TYPE = 'ingest-agent-policies';
export const AGENT_POLICY_INDEX = '.fleet-policies';
export const agentPolicyStatuses = {

View file

@ -6,6 +6,7 @@
*/
import { safeDump } from 'js-yaml';
import type { FullAgentPolicy } from '../types';
const POLICY_KEYS_ORDER = [

View file

@ -5,9 +5,10 @@
* 2.0.
*/
import { isAgentUpgradeable } from './is_agent_upgradeable';
import type { Agent } from '../types/models/agent';
import { isAgentUpgradeable } from './is_agent_upgradeable';
const getAgent = ({
version,
upgradeable = false,

View file

@ -7,6 +7,7 @@
import semverCoerce from 'semver/functions/coerce';
import semverLt from 'semver/functions/lt';
import type { Agent } from '../types';
export function isAgentUpgradeable(agent: Agent, kibanaVersion: string) {

View file

@ -6,6 +6,7 @@
*/
import { Observable, Subscription } from 'rxjs';
import type { ILicense } from '../../../licensing/common/types';
// Generic license service class that works with the license observable

View file

@ -6,6 +6,7 @@
*/
import type { PackagePolicy, PackagePolicyInput } from '../types';
import { storedPackagePoliciesToAgentInputs } from './package_policies_to_agent_inputs';
describe('Fleet - storedPackagePoliciesToAgentInputs', () => {

View file

@ -6,6 +6,7 @@
*/
import type { PackageInfo } from '../types';
import { packageToPackagePolicy, packageToPackagePolicyInputs } from './package_to_package_policy';
describe('Fleet - packageToPackagePolicy', () => {

View file

@ -5,9 +5,10 @@
* 2.0.
*/
import type { FullAgentPolicy } from './agent_policy';
import { AGENT_TYPE_EPHEMERAL, AGENT_TYPE_PERMANENT, AGENT_TYPE_TEMPORARY } from '../../constants';
import type { FullAgentPolicy } from './agent_policy';
export type AgentType =
| typeof AGENT_TYPE_EPHEMERAL
| typeof AGENT_TYPE_PERMANENT

View file

@ -7,6 +7,7 @@
import { agentPolicyStatuses } from '../../constants';
import type { DataType, ValueOf } from '../../types';
import type { PackagePolicy, PackagePolicyPackage } from './package_policy';
import type { Output } from './output';

View file

@ -8,6 +8,7 @@
// Follow pattern from https://github.com/elastic/kibana/pull/52447
// TODO: Update when https://github.com/elastic/kibana/issues/53021 is closed
import type { SavedObject, SavedObjectAttributes, SavedObjectReference } from 'src/core/public';
import {
ASSETS_SAVED_OBJECT_TYPE,
agentAssetTypes,
@ -17,6 +18,7 @@ import {
requiredPackages,
} from '../../constants';
import type { ValueOf } from '../../types';
import type { PackageSpecManifest, PackageSpecScreenshot } from './package_spec';
export type InstallationStatus = typeof installationStatuses;

View file

@ -6,6 +6,7 @@
*/
import type { AgentPolicy, NewAgentPolicy, FullAgentPolicy } from '../models';
import type { ListWithKuery } from './common';
export interface GetAgentPoliciesRequest {

View file

@ -14,6 +14,11 @@ import { FormattedMessage } from '@kbn/i18n/react';
import { i18n } from '@kbn/i18n';
import styled from 'styled-components';
import useObservable from 'react-use/lib/useObservable';
import { FleetConfigType, FleetStartServices } from '../../plugin';
import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public';
import { EuiThemeProvider } from '../../../../../../src/plugins/kibana_react/common';
import {
ConfigContext,
FleetStatusProvider,
@ -34,10 +39,7 @@ import { DataStreamApp } from './sections/data_stream';
import { FleetApp } from './sections/agents';
import { IngestManagerOverview } from './sections/overview';
import { ProtectedRoute } from './index';
import { FleetConfigType, FleetStartServices } from '../../plugin';
import { UIExtensionsStorage } from './types';
import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public';
import { EuiThemeProvider } from '../../../../../../src/plugins/kibana_react/common';
import { UIExtensionsContext } from './hooks/use_ui_extension';
const ErrorLayout = ({ children }: { children: JSX.Element }) => (

View file

@ -9,6 +9,7 @@ import React, { useState } from 'react';
import styled from 'styled-components';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiText, EuiLink } from '@elastic/eui';
import { AlphaFlyout } from './alpha_flyout';
const Message = styled(EuiText).attrs((props) => ({

View file

@ -9,6 +9,7 @@ import React from 'react';
import styled from 'styled-components';
import { EuiText, EuiSpacer, EuiLink, EuiTitle, EuiCodeBlock } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';
import { EnrollmentAPIKey } from '../../../types';
interface Props {

View file

@ -7,6 +7,7 @@
import React, { memo, ReactNode, Suspense } from 'react';
import { EuiErrorBoundary } from '@elastic/eui';
import { Loading } from './loading';
export const ExtensionWrapper = memo<{ children: ReactNode }>(({ children }) => {

View file

@ -9,8 +9,10 @@ import React, { memo, useState, useEffect } from 'react';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiButtonEmpty } from '@elastic/eui';
import type { TutorialDirectoryHeaderLinkComponent } from 'src/plugins/home/public';
import { RedirectAppLinks } from '../../../../../../../../src/plugins/kibana_react/public';
import { useLink, useCapabilities, useStartServices } from '../../hooks';
import { tutorialDirectoryNoticeState$ } from './tutorial_directory_notice';
const TutorialDirectoryHeaderLink: TutorialDirectoryHeaderLinkComponent = memo(() => {

View file

@ -19,6 +19,7 @@ import {
EuiSpacer,
} from '@elastic/eui';
import type { TutorialDirectoryNoticeComponent } from 'src/plugins/home/public';
import { RedirectAppLinks } from '../../../../../../../../src/plugins/kibana_react/public';
import {
sendPutSettings,

View file

@ -9,6 +9,7 @@ import React, { memo } from 'react';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiText, EuiLink, EuiSpacer } from '@elastic/eui';
import { TutorialModuleNoticeComponent } from 'src/plugins/home/public';
import { useGetPackages, useLink, useCapabilities } from '../../hooks';
import { pkgKeyFromPackageInfo } from '../../services/pkg_key_from_package_info';

View file

@ -7,6 +7,7 @@
import React, { memo } from 'react';
import { EuiLink, EuiLinkAnchorProps } from '@elastic/eui';
import { useLink } from '../hooks';
import { AGENT_SAVED_OBJECT_TYPE } from '../constants';

View file

@ -7,6 +7,7 @@
import React from 'react';
import { EuiIcon, EuiIconProps } from '@elastic/eui';
import { usePackageIconType, UsePackageIconType } from '../hooks';
export const PackageIcon: React.FunctionComponent<

View file

@ -6,6 +6,7 @@
*/
import React, { useState, useEffect, useMemo } from 'react';
import {
QueryStringInput,
IFieldType,

View file

@ -27,6 +27,7 @@ import {
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiText } from '@elastic/eui';
import { safeLoad } from 'js-yaml';
import {
useComboInput,
useStartServices,

View file

@ -7,7 +7,9 @@
import { i18n } from '@kbn/i18n';
import { ChromeBreadcrumb } from 'src/core/public';
import { BASE_PATH, Page, DynamicPagePathValues, pagePathGetters } from '../constants';
import { useStartServices } from './use_core';
const BASE_BREADCRUMB: ChromeBreadcrumb = {

View file

@ -6,6 +6,7 @@
*/
import React, { useContext } from 'react';
import type { FleetConfigType } from '../../../plugin';
export const ConfigContext = React.createContext<FleetConfigType | null>(null);

View file

@ -6,9 +6,11 @@
*/
import React, { useState, useContext, useEffect } from 'react';
import { GetFleetStatusResponse } from '../types';
import { useConfig } from './use_config';
import { sendGetFleetStatus } from './use_request';
import { GetFleetStatusResponse } from '../types';
interface FleetStatusState {
enabled: boolean;

View file

@ -8,6 +8,7 @@
import React, { memo, useContext, useMemo } from 'react';
import { AppMountParameters } from 'kibana/public';
import { useLocation } from 'react-router-dom';
import { AnyIntraAppRouteState } from '../types';
interface IntraAppState<S extends AnyIntraAppRouteState = AnyIntraAppRouteState> {

View file

@ -7,6 +7,7 @@
import { BASE_PATH, pagePathGetters } from '../constants';
import type { StaticPage, DynamicPage, DynamicPagePathValues } from '../constants';
import { useStartServices } from './';
const getPath = (page: StaticPage | DynamicPage, values: DynamicPagePathValues = {}): string => {

View file

@ -7,8 +7,10 @@
import { useEffect, useState } from 'react';
import { ICON_TYPES } from '@elastic/eui';
import type { PackageInfo, PackageListItem } from '../types';
import { useLinks } from '../sections/epm/hooks';
import { sendGetPackageInfoByKey } from './index';
type Package = PackageInfo | PackageListItem;

View file

@ -5,9 +5,8 @@
* 2.0.
*/
import { useRequest, sendRequest, useConditionalRequest } from './use_request';
import type { SendConditionalRequestConfig } from './use_request';
import { agentPolicyRouteService } from '../../services';
import type {
GetAgentPoliciesRequest,
GetAgentPoliciesResponse,
@ -23,6 +22,9 @@ import type {
DeleteAgentPolicyResponse,
} from '../../types';
import { useRequest, sendRequest, useConditionalRequest } from './use_request';
import type { SendConditionalRequestConfig } from './use_request';
export const useGetAgentPolicies = (query?: GetAgentPoliciesRequest['query']) => {
return useRequest<GetAgentPoliciesResponse>({
path: agentPolicyRouteService.getListPath(),

View file

@ -5,9 +5,8 @@
* 2.0.
*/
import { useRequest, sendRequest } from './use_request';
import type { UseRequestConfig } from './use_request';
import { agentRouteService } from '../../services';
import type {
GetOneAgentResponse,
GetOneAgentEventsResponse,
@ -32,6 +31,9 @@ import type {
PostNewAgentActionResponse,
} from '../../types';
import { useRequest, sendRequest } from './use_request';
import type { UseRequestConfig } from './use_request';
type RequestOptions = Pick<Partial<UseRequestConfig>, 'pollIntervalMs'>;
export function useGetOneAgent(agentId: string, options?: RequestOptions) {

View file

@ -5,10 +5,11 @@
* 2.0.
*/
import { sendRequest } from './use_request';
import { appRoutesService } from '../../services';
import type { CheckPermissionsResponse } from '../../types';
import { sendRequest } from './use_request';
export const sendGetPermissionsCheck = () => {
return sendRequest<CheckPermissionsResponse>({
path: appRoutesService.getCheckPermissionsPath(),

View file

@ -5,10 +5,11 @@
* 2.0.
*/
import { useRequest } from './use_request';
import { dataStreamRouteService } from '../../services';
import type { GetDataStreamsResponse } from '../../types';
import { useRequest } from './use_request';
export const useGetDataStreams = () => {
return useRequest<GetDataStreamsResponse>({
path: dataStreamRouteService.getListPath(),

View file

@ -5,15 +5,17 @@
* 2.0.
*/
import { useRequest, sendRequest, useConditionalRequest } from './use_request';
import type { UseRequestConfig, SendConditionalRequestConfig } from './use_request';
import { enrollmentAPIKeyRouteService } from '../../services';
import type {
GetOneEnrollmentAPIKeyResponse,
GetEnrollmentAPIKeysResponse,
GetEnrollmentAPIKeysRequest,
} from '../../types';
import { useRequest, sendRequest, useConditionalRequest } from './use_request';
import type { UseRequestConfig, SendConditionalRequestConfig } from './use_request';
type RequestOptions = Pick<Partial<UseRequestConfig>, 'pollIntervalMs'>;
export function useGetOneEnrollmentAPIKey(keyId: string | undefined) {

View file

@ -5,7 +5,6 @@
* 2.0.
*/
import { useRequest, sendRequest } from './use_request';
import { epmRouteService } from '../../services';
import type {
GetCategoriesRequest,
@ -19,6 +18,8 @@ import type {
} from '../../types';
import type { GetStatsResponse } from '../../../../../common';
import { useRequest, sendRequest } from './use_request';
export const useGetCategories = (query: GetCategoriesRequest['query'] = {}) => {
return useRequest<GetCategoriesResponse>({
path: epmRouteService.getCategoriesPath(),

View file

@ -5,10 +5,11 @@
* 2.0.
*/
import { sendRequest, useRequest } from './use_request';
import { outputRoutesService } from '../../services';
import type { PutOutputRequest, GetOutputsResponse } from '../../types';
import { sendRequest, useRequest } from './use_request';
export function useGetOutputs() {
return useRequest<GetOutputsResponse>({
method: 'get',

View file

@ -5,7 +5,6 @@
* 2.0.
*/
import { sendRequest, useRequest } from './use_request';
import { packagePolicyRouteService } from '../../services';
import type {
CreatePackagePolicyRequest,
@ -21,6 +20,8 @@ import type {
GetOnePackagePolicyResponse,
} from '../../../../../common/types/rest_spec';
import { sendRequest, useRequest } from './use_request';
export const sendCreatePackagePolicy = (body: CreatePackagePolicyRequest['body']) => {
return sendRequest<CreatePackagePolicyResponse>({
path: packagePolicyRouteService.getCreatePath(),

View file

@ -5,10 +5,11 @@
* 2.0.
*/
import { sendRequest, useRequest } from './use_request';
import { settingsRoutesService } from '../../services';
import type { PutSettingsResponse, PutSettingsRequest, GetSettingsResponse } from '../../types';
import { sendRequest, useRequest } from './use_request';
export function useGetSettings() {
return useRequest<GetSettingsResponse>({
method: 'get',

View file

@ -5,10 +5,11 @@
* 2.0.
*/
import { sendRequest } from './use_request';
import { setupRouteService, fleetSetupRouteService } from '../../services';
import type { GetFleetStatusResponse } from '../../types';
import { sendRequest } from './use_request';
export const sendSetup = () => {
return sendRequest({
path: setupRouteService.getSetupPath(),

View file

@ -7,6 +7,7 @@
import { useState, useEffect } from 'react';
import type { HttpSetup } from 'src/core/public';
import {
UseRequestConfig as _UseRequestConfig,
sendRequest as _sendRequest,

View file

@ -6,6 +6,7 @@
*/
import React, { useContext } from 'react';
import type { UIExtensionPoint, UIExtensionsStorage } from '../types';
export const UIExtensionsContext = React.createContext<UIExtensionsStorage>({});

View file

@ -7,6 +7,7 @@
import { useCallback, useEffect, useMemo } from 'react';
import { useHistory, useLocation } from 'react-router-dom';
import { useUrlParams } from './use_url_params';
import { PAGE_SIZE_OPTIONS, usePagination } from './use_pagination';
import type { Pagination } from './use_pagination';

View file

@ -9,7 +9,9 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { Redirect, Route, RouteProps } from 'react-router-dom';
import { CoreStart, AppMountParameters } from 'src/core/public';
import { FleetConfigType, FleetStartServices } from '../../plugin';
import { licenseService } from './hooks';
import { UIExtensionsStorage } from './types';
import { AppRoutes, FleetAppContext, WithPermissionsAndSetup } from './app';

View file

@ -9,6 +9,7 @@ import React from 'react';
import styled from 'styled-components';
import { EuiTabs, EuiTab, EuiFlexGroup, EuiFlexItem, EuiButtonEmpty } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';
import { Section } from '../sections';
import { AlphaMessaging, SettingFlyout } from '../components';
import { useLink, useConfig } from '../hooks';

View file

@ -7,7 +7,9 @@
import React, { Fragment } from 'react';
import { EuiPageBody, EuiSpacer } from '@elastic/eui';
import { Header, HeaderProps } from '../components';
import { Page, ContentWrapper } from './without_header';
export interface WithHeaderLayoutProps extends HeaderProps {

View file

@ -8,11 +8,13 @@
import { createMemoryHistory, History, createHashHistory } from 'history';
import React, { memo } from 'react';
import { render as reactRender, RenderOptions, RenderResult, act } from '@testing-library/react';
import { ScopedHistory } from '../../../../../../../src/core/public';
import { FleetAppContext } from '../app';
import { FleetConfigType } from '../../../plugin';
import { createConfigurationMock } from './plugin_configuration';
import { UIExtensionsStorage } from '../types';
import { createConfigurationMock } from './plugin_configuration';
import { createStartMock } from './plugin_interfaces';
import { createStartServices } from './fleet_start_services';
import { MockedFleetStart, MockedFleetStartServices } from './types';

View file

@ -8,10 +8,12 @@
import React from 'react';
import { I18nProvider } from '@kbn/i18n/react';
import { MockedKeys } from '@kbn/utility-types/jest';
import { coreMock } from '../../../../../../../src/core/public/mocks';
import { createStartDepsMock } from './plugin_dependencies';
import { IStorage, Storage } from '../../../../../../../src/plugins/kibana_utils/public';
import { setHttpClient } from '../hooks/use_request';
import { createStartDepsMock } from './plugin_dependencies';
import { MockedFleetStartServices } from './types';
// Taken from core. See: src/plugins/kibana_utils/public/storage/storage.test.ts

View file

@ -8,6 +8,7 @@
import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks';
import { licensingMock } from '../../../../../licensing/public/mocks';
import { homePluginMock } from '../../../../../../../src/plugins/home/public/mocks';
import type { MockedFleetSetupDeps, MockedFleetStartDeps } from './types';
export const createSetupDepsMock = (): MockedFleetSetupDeps => {

View file

@ -7,6 +7,7 @@
import type { UIExtensionsStorage } from '../types';
import { createExtensionRegistrationCallback } from '../services/ui_extensions';
import type { MockedFleetStart } from './types';
export const createStartMock = (extensionsStorage: UIExtensionsStorage = {}): MockedFleetStart => {

View file

@ -6,6 +6,7 @@
*/
import type { MockedKeys } from '@kbn/utility-types/jest';
import type {
FleetSetupDeps,
FleetStart,

View file

@ -8,10 +8,12 @@
import React, { memo, useState, useMemo } from 'react';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiContextMenuItem, EuiPortal } from '@elastic/eui';
import { AgentPolicy } from '../../../types';
import { useCapabilities } from '../../../hooks';
import { ContextMenuActions } from '../../../components';
import { AgentEnrollmentFlyout } from '../../agents/components';
import { AgentPolicyYamlFlyout } from './agent_policy_yaml_flyout';
import { AgentPolicyCopyProvider } from './agent_policy_copy_provider';

View file

@ -9,6 +9,7 @@ import React, { Fragment, useRef, useState } from 'react';
import { EuiConfirmModal, EuiFormRow, EuiFieldText } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { AgentPolicy } from '../../../types';
import { sendCopyAgentPolicy, useStartServices } from '../../../hooks';

View file

@ -9,6 +9,7 @@ import React, { Fragment, useRef, useState } from 'react';
import { EuiConfirmModal, EuiCallOut } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { AGENT_SAVED_OBJECT_TYPE } from '../../../constants';
import { sendDeleteAgentPolicy, useStartServices, useConfig, sendRequest } from '../../../hooks';

View file

@ -24,9 +24,11 @@ import {
import { FormattedMessage } from '@kbn/i18n/react';
import { i18n } from '@kbn/i18n';
import styled from 'styled-components';
import { dataTypes } from '../../../../../../common';
import { NewAgentPolicy, AgentPolicy } from '../../../types';
import { isValidNamespace } from '../../../services';
import { AgentPolicyDeleteProvider } from './agent_policy_delete_provider';
interface ValidationResults {

View file

@ -21,6 +21,7 @@ import {
EuiButton,
EuiCallOut,
} from '@elastic/eui';
import { useGetOneAgentPolicyFull, useGetOneAgentPolicy, useStartServices } from '../../../hooks';
import { Loading } from '../../../components';
import { fullAgentPolicyToYaml, agentPolicyRouteService } from '../../../services';

View file

@ -9,6 +9,7 @@ import React from 'react';
import { EuiCallOut, EuiConfirmModal, EuiSpacer } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';
import { i18n } from '@kbn/i18n';
import { AgentPolicy } from '../../../types';
export const ConfirmDeployAgentPolicyModal: React.FunctionComponent<{

View file

@ -9,6 +9,7 @@ import React, { Fragment, useMemo, useRef, useState } from 'react';
import { EuiCallOut, EuiConfirmModal, EuiSpacer } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { useStartServices, sendRequest, sendDeletePackagePolicy, useConfig } from '../../../hooks';
import { AGENT_API_ROUTES, AGENT_SAVED_OBJECT_TYPE } from '../../../constants';
import { AgentPolicy } from '../../../types';

View file

@ -17,6 +17,7 @@ import {
EuiButtonEmpty,
EuiSpacer,
} from '@elastic/eui';
import { WithHeaderLayout } from '../../../../layouts';
import { AgentPolicy, PackageInfo } from '../../../../types';
import { PackageIcon } from '../../../../components/package_icon';

View file

@ -16,12 +16,14 @@ import {
EuiSpacer,
EuiButtonEmpty,
} from '@elastic/eui';
import { NewPackagePolicyInput, RegistryVarsEntry } from '../../../../types';
import {
isAdvancedVar,
PackagePolicyConfigValidationResults,
validationHasErrors,
} from '../services';
import { PackagePolicyInputVarField } from './package_policy_input_var_field';
const FlexItemWithMaxWidth = styled(EuiFlexItem)`

View file

@ -18,6 +18,7 @@ import {
EuiHorizontalRule,
EuiSpacer,
} from '@elastic/eui';
import {
NewPackagePolicyInput,
PackagePolicyInputStream,
@ -29,6 +30,7 @@ import {
hasInvalidButRequiredVar,
countValidationErrors,
} from '../services';
import { PackagePolicyInputConfig } from './package_policy_input_config';
import { PackagePolicyInputStreamConfig } from './package_policy_input_stream';

View file

@ -18,12 +18,14 @@ import {
EuiSpacer,
EuiButtonEmpty,
} from '@elastic/eui';
import { NewPackagePolicyInputStream, RegistryStream, RegistryVarsEntry } from '../../../../types';
import {
isAdvancedVar,
PackagePolicyConfigValidationResults,
validationHasErrors,
} from '../services';
import { PackagePolicyInputVarField } from './package_policy_input_var_field';
const FlexItemWithMaxWidth = styled(EuiFlexItem)`

View file

@ -16,6 +16,7 @@ import {
EuiText,
EuiCodeEditor,
} from '@elastic/eui';
import { RegistryVarsEntry } from '../../../../types';
import 'brace/mode/yaml';

View file

@ -5,13 +5,15 @@
* 2.0.
*/
import { Route } from 'react-router-dom';
import React from 'react';
import { act } from 'react-test-renderer';
import { createTestRendererMock, MockedFleetStartServices, TestRenderer } from '../../../mock';
import { PAGE_ROUTING_PATHS, pagePathGetters, PLUGIN_ID } from '../../../constants';
import { Route } from 'react-router-dom';
import { CreatePackagePolicyPage } from './index';
import React from 'react';
import { CreatePackagePolicyRouteState } from '../../../types';
import { act } from 'react-test-renderer';
import { CreatePackagePolicyPage } from './index';
describe('when on the package policy create page', () => {
const createPageUrlPath = pagePathGetters.add_integration_to_policy({ pkgkey: 'nginx-0.3.7' });

View file

@ -21,6 +21,7 @@ import {
} from '@elastic/eui';
import { EuiStepProps } from '@elastic/eui/src/components/steps/step';
import { ApplicationStart } from 'kibana/public';
import {
AgentPolicy,
PackageInfo,
@ -37,6 +38,13 @@ import {
} from '../../../hooks';
import { Loading } from '../../../components';
import { ConfirmDeployAgentPolicyModal } from '../components';
import { useIntraAppState } from '../../../hooks/use_intra_app_state';
import { useUIExtension } from '../../../hooks/use_ui_extension';
import { ExtensionWrapper } from '../../../components/extension_wrapper';
import { PackagePolicyEditExtensionComponentProps } from '../../../types';
import { PLUGIN_ID } from '../../../../../../common/constants';
import { pkgKeyFromPackageInfo } from '../../../services/pkg_key_from_package_info';
import { CreatePackagePolicyPageLayout } from './components';
import { CreatePackagePolicyFrom, PackagePolicyFormState } from './types';
import {
@ -48,12 +56,6 @@ import { StepSelectPackage } from './step_select_package';
import { StepSelectAgentPolicy } from './step_select_agent_policy';
import { StepConfigurePackagePolicy } from './step_configure_package';
import { StepDefinePackagePolicy } from './step_define_package_policy';
import { useIntraAppState } from '../../../hooks/use_intra_app_state';
import { useUIExtension } from '../../../hooks/use_ui_extension';
import { ExtensionWrapper } from '../../../components/extension_wrapper';
import { PackagePolicyEditExtensionComponentProps } from '../../../types';
import { PLUGIN_ID } from '../../../../../../common/constants';
import { pkgKeyFromPackageInfo } from '../../../services/pkg_key_from_package_info';
const StepsWithLessPadding = styled(EuiSteps)`
.euiStep__content {

View file

@ -6,6 +6,7 @@
*/
import type { PackagePolicyConfigRecord, RegistryVarsEntry } from '../../../../types';
import { validatePackagePolicyConfig } from './';
export const hasInvalidButRequiredVar = (

View file

@ -7,6 +7,7 @@
import { installationStatuses } from '../../../../../../../common/constants';
import type { PackageInfo, NewPackagePolicy, RegistryPolicyTemplate } from '../../../../types';
import { validatePackagePolicy, validationHasErrors } from './validate_package_policy';
describe('Fleet - validatePackagePolicy()', () => {

View file

@ -7,6 +7,7 @@
import { i18n } from '@kbn/i18n';
import { safeLoad } from 'js-yaml';
import { getFlattenedObject, isValidNamespace } from '../../../../services';
import type {
NewPackagePolicy,

View file

@ -14,6 +14,7 @@ import {
EuiText,
} from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';
import {
PackageInfo,
RegistryStream,
@ -21,6 +22,7 @@ import {
NewPackagePolicyInput,
} from '../../../types';
import { Loading } from '../../../components';
import { PackagePolicyValidationResults } from './services';
import { PackagePolicyInputPanel } from './components';
import { CreatePackagePolicyFrom } from './types';

View file

@ -18,12 +18,14 @@ import {
EuiFlexGroup,
EuiFlexItem,
} from '@elastic/eui';
import { AgentPolicy, PackageInfo, PackagePolicy, NewPackagePolicy } from '../../../types';
import { packageToPackagePolicyInputs } from '../../../services';
import { Loading } from '../../../components';
import { PackagePolicyValidationResults } from './services';
import { pkgKeyFromPackageInfo } from '../../../services/pkg_key_from_package_info';
import { PackagePolicyValidationResults } from './services';
export const StepDefinePackagePolicy: React.FunctionComponent<{
agentPolicy: AgentPolicy;
packageInfo: PackageInfo;

View file

@ -19,6 +19,7 @@ import {
EuiFormRow,
EuiLink,
} from '@elastic/eui';
import { Error } from '../../../components';
import { AgentPolicy, PackageInfo, GetAgentPoliciesResponseItem } from '../../../types';
import { isPackageLimited, doesAgentPolicyAlreadyIncludePackage } from '../../../services';

View file

@ -9,6 +9,7 @@ import React, { useEffect, useState, Fragment } from 'react';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiFlexGroup, EuiFlexItem, EuiSelectable, EuiSpacer } from '@elastic/eui';
import { Error } from '../../../components';
import { AgentPolicy, PackageInfo, PackagePolicy, GetPackagesResponse } from '../../../types';
import {

View file

@ -6,7 +6,9 @@
*/
import React, { memo } from 'react';
import { AgentPolicy, PackagePolicy } from '../../../../../types';
import { NoPackagePolicies } from './no_package_policies';
import { PackagePoliciesTable } from './package_policies_table';

View file

@ -8,6 +8,7 @@
import React, { memo } from 'react';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiButton, EuiEmptyPrompt } from '@elastic/eui';
import { useCapabilities, useLink } from '../../../../../hooks';
export const NoPackagePolicies = memo<{ policyId: string }>(({ policyId }) => {

View file

@ -17,6 +17,7 @@ import {
EuiFlexGroup,
EuiFlexItem,
} from '@elastic/eui';
import { AgentPolicy, PackagePolicy } from '../../../../../types';
import { PackageIcon, ContextMenuActions } from '../../../../../components';
import { PackagePolicyDeleteProvider, DangerEuiContextMenuItem } from '../../../components';

View file

@ -11,6 +11,7 @@ import styled from 'styled-components';
import { EuiBottomBar, EuiFlexGroup, EuiFlexItem, EuiButtonEmpty, EuiButton } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { AgentPolicy } from '../../../../../types';
import {
useLink,

View file

@ -6,6 +6,7 @@
*/
import React from 'react';
import { useRequest } from '../../../../hooks';
import { GetAgentStatusResponse } from '../../../../types';
import { agentRouteService } from '../../../../services';

View file

@ -22,6 +22,7 @@ import {
} from '@elastic/eui';
import { Props as EuiTabProps } from '@elastic/eui/src/components/tabs/tab';
import styled from 'styled-components';
import { AgentPolicy, AgentPolicyDetailsDeployAgentAction } from '../../../types';
import { PAGE_ROUTING_PATHS } from '../../../constants';
import {
@ -33,11 +34,12 @@ import {
} from '../../../hooks';
import { Loading, Error } from '../../../components';
import { WithHeaderLayout } from '../../../layouts';
import { AgentPolicyRefreshContext, useGetAgentStatus, AgentStatusRefreshContext } from './hooks';
import { LinkedAgentCount, AgentPolicyActionMenu } from '../components';
import { PackagePoliciesView, SettingsView } from './components';
import { useIntraAppState } from '../../../hooks/use_intra_app_state';
import { AgentPolicyRefreshContext, useGetAgentStatus, AgentStatusRefreshContext } from './hooks';
import { PackagePoliciesView, SettingsView } from './components';
const Divider = styled.div`
width: 0;
height: 100%;

View file

@ -17,6 +17,7 @@ import {
EuiFlexItem,
EuiSpacer,
} from '@elastic/eui';
import { AgentPolicy, PackageInfo, UpdatePackagePolicy } from '../../../types';
import {
useLink,

View file

@ -7,8 +7,10 @@
import React from 'react';
import { HashRouter as Router, Switch, Route } from 'react-router-dom';
import { PAGE_ROUTING_PATHS } from '../../constants';
import { useBreadcrumbs } from '../../hooks';
import { AgentPolicyListPage } from './list_page';
import { AgentPolicyDetailsPage } from './details_page';
import { CreatePackagePolicyPage } from './create_package_policy_page';

View file

@ -23,6 +23,7 @@ import {
EuiFlyoutProps,
EuiSpacer,
} from '@elastic/eui';
import { dataTypes } from '../../../../../../../common';
import { NewAgentPolicy, AgentPolicy } from '../../../../types';
import { useCapabilities, useStartServices, sendCreateAgentPolicy } from '../../../../hooks';

View file

@ -23,6 +23,7 @@ import { CriteriaWithPagination } from '@elastic/eui/src/components/basic_table/
import { i18n } from '@kbn/i18n';
import { FormattedMessage, FormattedDate } from '@kbn/i18n/react';
import { useHistory } from 'react-router-dom';
import { AgentPolicy } from '../../../types';
import { AGENT_POLICY_SAVED_OBJECT_TYPE } from '../../../constants';
import { WithHeaderLayout } from '../../../layouts';
@ -38,6 +39,7 @@ import {
} from '../../../hooks';
import { LinkAndRevision, SearchBar } from '../../../components';
import { LinkedAgentCount, AgentPolicyActionMenu } from '../components';
import { CreateAgentPolicyFlyout } from './components';
const AgentPolicyListPageLayout: React.FunctionComponent = ({ children }) => (

View file

@ -8,6 +8,7 @@
import React, { memo, useState, useMemo } from 'react';
import { EuiPortal, EuiContextMenuItem } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';
import { Agent } from '../../../../types';
import { useCapabilities, useKibanaVersion } from '../../../../hooks';
import { ContextMenuActions } from '../../../../components';

View file

@ -20,9 +20,11 @@ import {
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import styled from 'styled-components';
import { Agent, AgentPolicy, PackagePolicy, PackagePolicyInput } from '../../../../../types';
import { useLink } from '../../../../../hooks';
import { PackageIcon } from '../../../../../components';
import { displayInputType, getLogsQueryByInputType } from './input_type_utils';
const StyledEuiAccordion = styled(EuiAccordion)`

View file

@ -19,6 +19,7 @@ import {
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { Agent, AgentPolicy } from '../../../../../types';
import { useKibanaVersion, useLink } from '../../../../../hooks';
import { isAgentUpgradeable } from '../../../../../services';

View file

@ -9,7 +9,9 @@ import React, { memo } from 'react';
import styled from 'styled-components';
import { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiSpacer } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';
import { Agent, AgentPolicy } from '../../../../../types';
import { AgentDetailsOverviewSection } from './agent_details_overview';
import { AgentDetailsIntegrationsSection } from './agent_details_integrations';

View file

@ -6,6 +6,7 @@
*/
import { i18n } from '@kbn/i18n';
import {
STATE_DATASET_FIELD,
AGENT_DATASET_FILEBEAT,

View file

@ -5,9 +5,10 @@
* 2.0.
*/
import url from 'url';
import React, { memo, useMemo, useState, useCallback, useEffect } from 'react';
import styled from 'styled-components';
import url from 'url';
import { encode } from 'rison-node';
import { stringify } from 'query-string';
import {
@ -24,12 +25,14 @@ import useMeasure from 'react-use/lib/useMeasure';
import { FormattedMessage } from '@kbn/i18n/react';
import semverGte from 'semver/functions/gte';
import semverCoerce from 'semver/functions/coerce';
import { createStateContainerReactHelpers } from '../../../../../../../../../../../src/plugins/kibana_utils/public';
import { RedirectAppLinks } from '../../../../../../../../../../../src/plugins/kibana_react/public';
import { TimeRange, esKuery } from '../../../../../../../../../../../src/plugins/data/public';
import { LogStream } from '../../../../../../../../../infra/public';
import { Agent } from '../../../../../types';
import { useStartServices } from '../../../../../hooks';
import { DEFAULT_DATE_RANGE } from './constants';
import { DatasetFilter } from './filter_dataset';
import { LogLevelFilter } from './filter_log_level';

View file

@ -8,7 +8,9 @@
import React, { memo, useState, useEffect } from 'react';
import { EuiPopover, EuiFilterButton, EuiFilterSelectItem } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { useStartServices } from '../../../../../hooks';
import { AGENT_LOG_INDEX_PATTERN, DATASET_FIELD, AGENT_DATASET } from './constants';
export const DatasetFilter: React.FunctionComponent<{

View file

@ -8,9 +8,11 @@
import React, { memo, useState, useEffect } from 'react';
import { EuiPopover, EuiFilterButton, EuiFilterSelectItem } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { ORDERED_FILTER_LOG_LEVELS, AGENT_LOG_INDEX_PATTERN, LOG_LEVEL_FIELD } from './constants';
import { useStartServices } from '../../../../../hooks';
import { ORDERED_FILTER_LOG_LEVELS, AGENT_LOG_INDEX_PATTERN, LOG_LEVEL_FIELD } from './constants';
function sortLogLevels(levels: string[]): string[] {
return [
...new Set([

View file

@ -6,6 +6,7 @@
*/
import React, { memo, useEffect, useState, useMemo } from 'react';
import {
createStateContainer,
syncState,
@ -14,6 +15,7 @@ import {
PureTransition,
getStateFromKbnUrl,
} from '../../../../../../../../../../../src/plugins/kibana_utils/public';
import { DEFAULT_LOGS_STATE, STATE_STORAGE_KEY } from './constants';
import { AgentLogsUI, AgentLogsProps, AgentLogsState, AgentLogsUrlStateHelper } from './agent_logs';

View file

@ -7,11 +7,13 @@
import React, { memo, useState, useEffect } from 'react';
import { i18n } from '@kbn/i18n';
import {
QueryStringInput,
IFieldType,
} from '../../../../../../../../../../../src/plugins/data/public';
import { useStartServices } from '../../../../../hooks';
import {
AGENT_LOG_INDEX_PATTERN,
AGENT_ID_FIELD,

View file

@ -9,8 +9,10 @@ import React, { memo, useState, useCallback } from 'react';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiSelect, EuiFormLabel, EuiButtonEmpty, EuiFlexItem, EuiFlexGroup } from '@elastic/eui';
import { Agent } from '../../../../../types';
import { sendPostAgentAction, useStartServices } from '../../../../../hooks';
import { AGENT_LOG_LEVELS, DEFAULT_LOG_LEVEL } from './constants';
const LEVEL_VALUES = Object.values(AGENT_LOG_LEVELS);

View file

@ -21,6 +21,7 @@ import { Props as EuiTabProps } from '@elastic/eui/src/components/tabs/tab';
import { FormattedMessage, FormattedRelative } from '@kbn/i18n/react';
import { i18n } from '@kbn/i18n';
import { EuiIconTip } from '@elastic/eui';
import { Agent, AgentPolicy, AgentDetailsReassignPolicyAction } from '../../../types';
import { PAGE_ROUTING_PATHS } from '../../../constants';
import { Loading, Error } from '../../../components';
@ -34,11 +35,12 @@ import {
} from '../../../hooks';
import { WithHeaderLayout } from '../../../layouts';
import { AgentHealth } from '../components';
import { AgentRefreshContext } from './hooks';
import { AgentLogs, AgentDetailsActionMenu, AgentDetailsContent } from './components';
import { useIntraAppState } from '../../../hooks/use_intra_app_state';
import { isAgentUpgradeable } from '../../../services';
import { AgentRefreshContext } from './hooks';
import { AgentLogs, AgentDetailsActionMenu, AgentDetailsContent } from './components';
export const AgentDetailsPage: React.FunctionComponent = () => {
const {
params: { agentId, tabId = '' },

View file

@ -18,6 +18,7 @@ import {
EuiPortal,
} from '@elastic/eui';
import { FormattedMessage, FormattedNumber } from '@kbn/i18n/react';
import { SO_SEARCH_LIMIT } from '../../../../constants';
import { Agent } from '../../../../types';
import {

View file

@ -16,6 +16,7 @@ import {
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { AgentPolicy } from '../../../../types';
import { SearchBar } from '../../../../components';
import { AGENTS_INDEX, AGENT_SAVED_OBJECT_TYPE } from '../../../../constants';

View file

@ -7,6 +7,7 @@
import { EuiFlexGroup, EuiHealth, EuiNotificationBadge, EuiFlexItem } from '@elastic/eui';
import React, { memo, useMemo } from 'react';
import {
AGENT_STATUSES,
getColorForAgentStatus,

View file

@ -8,6 +8,7 @@
import styled from 'styled-components';
import { EuiColorPaletteDisplay } from '@elastic/eui';
import React, { useMemo } from 'react';
import { AGENT_STATUSES, getColorForAgentStatus } from '../../services/agent_status';
import { SimplifiedAgentStatus } from '../../../../types';

View file

@ -7,6 +7,7 @@
import React from 'react';
import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui';
import { Agent, SimplifiedAgentStatus } from '../../../../types';
import { AgentStatusBar } from './status_bar';

View file

@ -21,6 +21,7 @@ import {
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage, FormattedRelative } from '@kbn/i18n/react';
import { AgentEnrollmentFlyout } from '../components';
import { Agent, AgentPolicy, SimplifiedAgentStatus } from '../../../types';
import {
@ -45,6 +46,7 @@ import {
AgentUnenrollAgentModal,
AgentUpgradeAgentModal,
} from '../components';
import { AgentTableHeader } from './components/table_header';
import { SelectionMode } from './components/bulk_actions';
import { SearchAndFilterBar } from './components/search_and_filter_bar';

View file

@ -9,6 +9,7 @@ import React, { useState, useEffect } from 'react';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiSelect, EuiSpacer, EuiText, EuiButtonEmpty } from '@elastic/eui';
import { SO_SEARCH_LIMIT } from '../../../../constants';
import { AgentPolicy, GetEnrollmentAPIKeysResponse } from '../../../../types';
import { sendGetEnrollmentAPIKeys, useStartServices } from '../../../../hooks';

Some files were not shown because too many files have changed in this diff Show more