diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 08646c809b807..67f6e74e71f76 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -392,7 +392,6 @@ src/platform/packages/private/kbn-transpose-utils @elastic/kibana-visualizations src/platform/packages/private/kbn-ui-shared-deps-npm @elastic/kibana-operations src/platform/packages/private/kbn-ui-shared-deps-src @elastic/kibana-operations src/platform/packages/private/kbn-unsaved-changes-badge @elastic/kibana-data-discovery -src/platform/packages/private/serverless/project_switcher @elastic/appex-sharedux src/platform/packages/private/serverless/settings/common @elastic/appex-sharedux @elastic/kibana-management src/platform/packages/private/serverless/types @elastic/appex-sharedux src/platform/packages/private/shared-ux/page/analytics_no_data/impl @elastic/appex-sharedux diff --git a/config/serverless.es.yml b/config/serverless.es.yml index 1eb34682103a4..f5959322df1ad 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -76,9 +76,6 @@ xpack.serverless.search.enabled: true ## Set the home route uiSettings.overrides.defaultRoute: /app/elasticsearch -## Set the dev project switcher current type -xpack.serverless.plugin.developer.projectSwitcher.currentType: 'search' - # Specify in telemetry the project type telemetry.labels.serverless: search diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index 4dcfe969a4418..4186ec52e1617 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -138,9 +138,6 @@ uiSettings.overrides.defaultRoute: /app/observability/landing # Customize empty page state for analytics apps no_data_page.analyticsNoDataPageFlavor: 'serverless_observability' -## Set the dev project switch current type -xpack.serverless.plugin.developer.projectSwitcher.currentType: 'observability' - ## Disable adding the component template `.fleet_agent_id_verification-1` to every index template for each datastream for each integration xpack.fleet.agentIdVerificationEnabled: false diff --git a/config/serverless.security.yml b/config/serverless.security.yml index 494c108e9629c..9a3a426930dec 100644 --- a/config/serverless.security.yml +++ b/config/serverless.security.yml @@ -108,9 +108,6 @@ newsfeed.enabled: true ## Set the home route uiSettings.overrides.defaultRoute: /app/security/get_started -## Set the dev project switcher current type -xpack.serverless.plugin.developer.projectSwitcher.currentType: 'security' - # Specify in telemetry the project type telemetry.labels.serverless: security diff --git a/package.json b/package.json index fa4439d645f7e..0a71d27703867 100644 --- a/package.json +++ b/package.json @@ -869,7 +869,6 @@ "@kbn/serverless-common-settings": "link:src/platform/packages/private/serverless/settings/common", "@kbn/serverless-observability": "link:x-pack/solutions/observability/plugins/serverless_observability", "@kbn/serverless-observability-settings": "link:src/platform/packages/shared/serverless/settings/observability_project", - "@kbn/serverless-project-switcher": "link:src/platform/packages/private/serverless/project_switcher", "@kbn/serverless-search": "link:x-pack/solutions/search/plugins/serverless_search", "@kbn/serverless-search-settings": "link:src/platform/packages/shared/serverless/settings/search_project", "@kbn/serverless-security-settings": "link:src/platform/packages/shared/serverless/settings/security_project", diff --git a/src/cli/serve/compile_config_stack.js b/src/cli/serve/compile_config_stack.js index 085a21ce954cd..14e88630c71b7 100644 --- a/src/cli/serve/compile_config_stack.js +++ b/src/cli/serve/compile_config_stack.js @@ -9,7 +9,7 @@ import _ from 'lodash'; -import { readFileSync, writeFileSync, statSync, existsSync } from 'fs'; +import { statSync } from 'fs'; import { resolve } from 'path'; import { getConfigPath, getConfigDirectory } from '@kbn/utils'; import { getConfigFromFiles } from '@kbn/config'; @@ -37,11 +37,6 @@ export function compileConfigStack({ configOverrides, devConfig, dev, serverless configs.push(resolveConfig('kibana.dev.yml')); } - if (dev && serverless) { - writeProjectSwitcherConfig('serverless.recent.dev.yml', serverless); - configs.push(resolveConfig('serverless.recent.dev.yml')); - } - // Filter out all config paths that didn't exist configs = configs.filter(isNotNull); @@ -82,27 +77,6 @@ function resolveConfig(fileName) { } } -/** - * @param {string} fileName - * @param {object} opts - */ -function writeProjectSwitcherConfig(fileName, serverlessOption) { - const path = resolve(getConfigDirectory(), fileName); - const configAlreadyExists = existsSync(path); - - const preserveExistingConfig = serverlessOption === true; - const serverlessMode = validateServerlessMode(serverlessOption) || 'es'; - - if (configAlreadyExists && preserveExistingConfig) { - return; - } else { - const content = `xpack.serverless.plugin.developer.projectSwitcher.enabled: true\nserverless: ${serverlessMode}\n`; - if (!configAlreadyExists || readFileSync(path).toString() !== content) { - writeFileSync(path, content); - } - } -} - /** * @param {string} filePath Path to the config file * @returns {boolean} Whether the file exists @@ -143,7 +117,6 @@ function validateServerlessMode(serverlessMode) { } if (serverlessMode === true) { - // Defaulting to read the project-switcher's settings in `serverless.recent.dev.yml` return null; } diff --git a/src/cli/serve/compile_config_stack.test.js b/src/cli/serve/compile_config_stack.test.js index 99f38b12a51a3..0ce307b9ae30a 100644 --- a/src/cli/serve/compile_config_stack.test.js +++ b/src/cli/serve/compile_config_stack.test.js @@ -15,7 +15,7 @@ jest.mock('@kbn/repo-info', () => ({ })); jest.mock('@kbn/config'); -import { statSync, existsSync, writeFileSync } from 'fs'; +import { statSync } from 'fs'; import { getConfigFromFiles } from '@kbn/config'; import { compileConfigStack } from './compile_config_stack'; @@ -69,20 +69,12 @@ describe('compileConfigStack', () => { 'serverless.security.yml', 'kibana.yml', 'kibana.dev.yml', - 'serverless.recent.dev.yml', 'serverless.dev.yml', 'serverless.security.dev.yml', ]); }); it('defaults to "es" if --serverless and --dev are there', async () => { - existsSync.mockImplementationOnce((filename) => { - if (Path.basename(filename) === 'serverless.recent.dev.yml') { - return false; - } else { - return true; - } - }); getConfigFromFiles.mockImplementationOnce(() => { return { serverless: 'es', @@ -94,55 +86,15 @@ describe('compileConfigStack', () => { serverless: true, }).map(toFileNames); - expect(existsSync).toHaveBeenCalledWith( - '/some/imaginary/path/config/serverless.recent.dev.yml' - ); - expect(writeFileSync).toHaveBeenCalledWith( - '/some/imaginary/path/config/serverless.recent.dev.yml', - expect.stringContaining('serverless: es') - ); expect(configList).toEqual([ 'serverless.yml', 'serverless.es.yml', 'kibana.yml', 'kibana.dev.yml', - 'serverless.recent.dev.yml', 'serverless.dev.yml', 'serverless.es.dev.yml', ]); }); - - it('respects persisted project-switcher decision when --serverless && --dev true', async () => { - existsSync.mockImplementationOnce((filename) => { - if (Path.basename(filename) === 'serverless.recent.dev.yml') { - return true; - } - }); - getConfigFromFiles.mockImplementationOnce(() => { - return { - serverless: 'oblt', - }; - }); - - const configList = compileConfigStack({ - dev: true, - serverless: true, - }).map(toFileNames); - - expect(existsSync).toHaveBeenCalledWith( - '/some/imaginary/path/config/serverless.recent.dev.yml' - ); - expect(writeFileSync).not.toHaveBeenCalled(); - expect(configList).toEqual([ - 'serverless.yml', - 'serverless.oblt.yml', - 'kibana.yml', - 'kibana.dev.yml', - 'serverless.recent.dev.yml', - 'serverless.dev.yml', - 'serverless.oblt.dev.yml', - ]); - }); }); function toFileNames(path) { diff --git a/src/cli/serve/integration_tests/serverless_config_flag.test.ts b/src/cli/serve/integration_tests/serverless_config_flag.test.ts index 9ec6f441c6c9b..faaeb293489c6 100644 --- a/src/cli/serve/integration_tests/serverless_config_flag.test.ts +++ b/src/cli/serve/integration_tests/serverless_config_flag.test.ts @@ -9,12 +9,9 @@ import { spawn, spawnSync, ChildProcessWithoutNullStreams } from 'child_process'; import type { Readable } from 'stream'; -import { readFileSync } from 'fs'; -import { resolve } from 'path'; import { filter, firstValueFrom, from, concatMap } from 'rxjs'; import { REPO_ROOT } from '@kbn/repo-info'; -import { getConfigDirectory } from '@kbn/utils'; // Failing: See https://github.com/elastic/kibana/issues/163257 // Failing: See https://github.com/elastic/kibana/issues/163258 @@ -63,24 +60,6 @@ describe.skip('cli serverless project type', () => { 20 * 1000 ); - it.each(['es', 'oblt', 'security'])( - 'writes the serverless project type %s in config/serverless.recent.dev.yml', - async (mode) => { - // Making sure `--serverless` translates into the `serverless` config entry, and validates against the accepted values - child = spawn(process.execPath, ['scripts/kibana', '--dev', `--serverless=${mode}`], { - cwd: REPO_ROOT, - }); - - // Wait until Kibana starts bootstrapping (at that point the file should be present) - const found = await waitForMessage(child.stdout, 'Kibana process configured with roles'); - expect(found).not.toContain('FATAL'); - - expect( - readFileSync(resolve(getConfigDirectory(), 'serverless.recent.dev.yml'), 'utf-8') - ).toContain(`serverless: ${mode}\n`); - } - ); - it.each(['es', 'oblt', 'security'])( 'Kibana does not crash when running project type %s', async (mode) => { diff --git a/src/platform/packages/private/serverless/project_switcher/README.mdx b/src/platform/packages/private/serverless/project_switcher/README.mdx deleted file mode 100644 index 240988346458c..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/README.mdx +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: serverless/components/ProjectSwitcher -slug: /serverless/components/project-switcher -title: Project Switcher -description: A popup which allows a developer to switch between project types on their dev server. -tags: ['serverless', 'component'] -date: 2023-04-23 ---- - -When working on Serverless instances of Kibana, developers likely want to switch between different project types to test changes. This Project Switcher is intended to be placed into the header bar by the Serverless plugin when the server is in development mode to allow "quick switching" between configurations. - -The connected component uses `http` to post a selection to a given API endpoint, intended to alter the YML configuration and trigger Watcher to restart the server. To that end, it will post its message to a given API endpoint and replace the content of `document.body`. The remainder of the process is left to the Serverless plugin. diff --git a/src/platform/packages/private/serverless/project_switcher/index.ts b/src/platform/packages/private/serverless/project_switcher/index.ts deleted file mode 100644 index ac07a62f5c284..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -export type { ProjectSwitcherProps, KibanaDependencies } from './src'; - -export { ProjectSwitcher, ProjectSwitcherKibanaProvider, ProjectSwitcherProvider } from './src'; diff --git a/src/platform/packages/private/serverless/project_switcher/jest.config.js b/src/platform/packages/private/serverless/project_switcher/jest.config.js deleted file mode 100644 index 17c8a482cb94b..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/jest.config.js +++ /dev/null @@ -1,14 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -module.exports = { - preset: '@kbn/test', - rootDir: '../../../../../..', - roots: ['/src/platform/packages/private/serverless/project_switcher'], -}; diff --git a/src/platform/packages/private/serverless/project_switcher/kibana.jsonc b/src/platform/packages/private/serverless/project_switcher/kibana.jsonc deleted file mode 100644 index a0722bf662a4e..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/kibana.jsonc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "shared-common", - "id": "@kbn/serverless-project-switcher", - "owner": [ - "@elastic/appex-sharedux" - ], - "group": "platform", - "visibility": "private" -} \ No newline at end of file diff --git a/src/platform/packages/private/serverless/project_switcher/mocks/jest.mock.ts b/src/platform/packages/private/serverless/project_switcher/mocks/jest.mock.ts deleted file mode 100644 index acfacd676e639..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/mocks/jest.mock.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { Services, KibanaDependencies } from '../src/types'; - -export const getProjectSwitcherServicesMock: () => jest.Mocked = () => ({ - setProjectType: jest.fn(), -}); - -export const getProjectSwitcherKibanaDependenciesMock: () => jest.Mocked = - () => ({ - coreStart: { - http: { - post: jest.fn(() => Promise.resolve({ data: {} })), - }, - }, - projectChangeAPIUrl: 'serverless/change_project', - }); diff --git a/src/platform/packages/private/serverless/project_switcher/mocks/storybook.mock.ts b/src/platform/packages/private/serverless/project_switcher/mocks/storybook.mock.ts deleted file mode 100644 index 903897b6e9ef9..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/mocks/storybook.mock.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { action } from '@storybook/addon-actions'; -import { AbstractStorybookMock } from '@kbn/shared-ux-storybook-mock'; - -import type { ProjectSwitcherProps, Services } from '../src/types'; - -type PropArguments = Pick; - -/** - * Storybook parameters provided from the controls addon. - */ -export type ProjectSwitcherStorybookParams = Record; - -/** - * Storybook mocks for the `NoDataCard` component. - */ -export class ProjectSwitcherStorybookMock extends AbstractStorybookMock< - ProjectSwitcherProps, - Services, - PropArguments, - {} -> { - propArguments = { - currentProjectType: { - control: { type: 'radio' }, - options: ['observability', 'security', 'search'], - defaultValue: 'observability', - }, - }; - serviceArguments = {}; - dependencies = []; - - getProps(params?: ProjectSwitcherStorybookParams): ProjectSwitcherProps { - return { - currentProjectType: this.getArgumentValue('currentProjectType', params), - }; - } - - getServices(_params: ProjectSwitcherStorybookParams): Services { - return { - setProjectType: action('setProjectType'), - }; - } -} diff --git a/src/platform/packages/private/serverless/project_switcher/package.json b/src/platform/packages/private/serverless/project_switcher/package.json deleted file mode 100644 index 63edd8eb28746..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@kbn/serverless-project-switcher", - "private": true, - "version": "1.0.0", - "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0", - "sideEffects": false -} \ No newline at end of file diff --git a/src/platform/packages/private/serverless/project_switcher/src/constants.ts b/src/platform/packages/private/serverless/project_switcher/src/constants.ts deleted file mode 100644 index a31b3e6909197..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/constants.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import type { IconType } from '@elastic/eui'; -import type { ProjectType } from '@kbn/serverless-types'; - -export const icons: Record = { - observability: 'logoObservability', - security: 'logoSecurity', - search: 'logoEnterpriseSearch', -} as const; - -export const labels: Record = { - observability: 'Observability', - security: 'Security', - search: 'Enterprise Search', -} as const; - -export const projectTypes: ProjectType[] = ['security', 'observability', 'search']; diff --git a/src/platform/packages/private/serverless/project_switcher/src/header_button.tsx b/src/platform/packages/private/serverless/project_switcher/src/header_button.tsx deleted file mode 100644 index 3f3cb66635392..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/header_button.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React, { MouseEventHandler } from 'react'; -import { EuiHeaderSectionItemButton, EuiIcon } from '@elastic/eui'; - -import { ProjectType } from '@kbn/serverless-types'; - -import { icons } from './constants'; - -export const TEST_ID = 'projectSwitcherButton'; - -export interface Props { - onClick: MouseEventHandler; - currentProjectType: ProjectType; -} - -export const HeaderButton = ({ onClick, currentProjectType }: Props) => ( - - - -); diff --git a/src/platform/packages/private/serverless/project_switcher/src/index.ts b/src/platform/packages/private/serverless/project_switcher/src/index.ts deleted file mode 100644 index 8cdb5d8909b33..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -export type { KibanaDependencies, ProjectSwitcherProps } from './types'; - -export { ProjectSwitcher } from './switcher'; -export { ProjectSwitcherKibanaProvider, ProjectSwitcherProvider } from './services'; diff --git a/src/platform/packages/private/serverless/project_switcher/src/item.tsx b/src/platform/packages/private/serverless/project_switcher/src/item.tsx deleted file mode 100644 index e83089bee3cd4..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/item.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; -import { EuiIcon, EuiKeyPadMenuItem, type EuiIconProps } from '@elastic/eui'; -import { ProjectType } from '@kbn/serverless-types'; - -import { labels, icons } from './constants'; - -type OnChangeType = (id: string, value?: any) => void; - -interface ItemProps extends Pick { - type: ProjectType; - onChange: (type: ProjectType) => void; - isSelected: boolean; -} - -export const SwitcherItem = ({ type: id, onChange, isSelected }: ItemProps) => ( - - - -); diff --git a/src/platform/packages/private/serverless/project_switcher/src/loader.tsx b/src/platform/packages/private/serverless/project_switcher/src/loader.tsx deleted file mode 100644 index 5f3e513dc4b37..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/loader.tsx +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; - -import { Logo, type Props } from './logo'; - -export const Loader = (props: Props) => ( -
-
- -
Loading Project
-
-
-
-); diff --git a/src/platform/packages/private/serverless/project_switcher/src/logo.tsx b/src/platform/packages/private/serverless/project_switcher/src/logo.tsx deleted file mode 100644 index 815c7fe784694..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/logo.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; -import { EuiIcon } from '@elastic/eui'; -import type { ProjectType } from '@kbn/serverless-types'; - -export interface Props { - project: ProjectType; -} - -export const Logo = ({ project }: Props) => { - let type = 'logoElastic'; - switch (project) { - case 'search': - type = 'logoElasticsearch'; - break; - case 'security': - type = 'logoSecurity'; - break; - case 'observability': - type = 'logoObservability'; - break; - } - - return ; -}; diff --git a/src/platform/packages/private/serverless/project_switcher/src/services.tsx b/src/platform/packages/private/serverless/project_switcher/src/services.tsx deleted file mode 100644 index b78b9b16207e9..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/services.tsx +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React, { FC, PropsWithChildren, useContext } from 'react'; -import ReactDOM from 'react-dom'; -import { Loader } from './loader'; - -import type { Services, KibanaDependencies } from './types'; - -const Context = React.createContext(null); - -/** - * A Context Provider that provides services to the component and its dependencies. - */ -export const ProjectSwitcherProvider: FC> = ({ - children, - ...services -}) => { - return {children}; -}; - -/** - * Kibana-specific Provider that maps dependencies to services. - */ -export const ProjectSwitcherKibanaProvider: FC> = ({ - children, - coreStart, - projectChangeAPIUrl, -}) => { - const value: Services = { - setProjectType: (projectType) => { - coreStart.http - .post(projectChangeAPIUrl, { body: JSON.stringify({ id: projectType }) }) - .then(() => { - ReactDOM.render(, document.body); - - // Give the watcher a couple of seconds to see the file change. - setTimeout(() => { - window.location.href = '/'; - }, 2000); - }); - }, - }; - - return {children}; -}; - -/** - * React hook for accessing pre-wired services. - */ -export function useServices() { - const context = useContext(Context); - - if (!context) { - throw new Error( - 'ProjectSwitcher Context is missing. Ensure your component or React root is wrapped with ProjectSwitcherContext.' - ); - } - - return context; -} diff --git a/src/platform/packages/private/serverless/project_switcher/src/switcher.component.tsx b/src/platform/packages/private/serverless/project_switcher/src/switcher.component.tsx deleted file mode 100644 index d11314d551a61..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/switcher.component.tsx +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React, { useState } from 'react'; -import { css } from '@emotion/react'; -import { EuiPopover, useGeneratedHtmlId, EuiPopoverTitle, EuiKeyPadMenu } from '@elastic/eui'; - -import { ProjectType } from '@kbn/serverless-types'; - -import { SwitcherItem } from './item'; -import type { ProjectSwitcherComponentProps } from './types'; -import { HeaderButton } from './header_button'; -import { projectTypes } from './constants'; - -export { TEST_ID as TEST_ID_BUTTON } from './header_button'; -export const TEST_ID_ITEM_GROUP = 'projectSwitcherItemGroup'; - -const switcherCSS = css` - min-width: 240px; -`; - -export const ProjectSwitcher = ({ - currentProjectType, - onProjectChange, -}: ProjectSwitcherComponentProps) => { - const [isOpen, setIsOpen] = useState(false); - const id = useGeneratedHtmlId({ - prefix: 'switcherPopover', - }); - - const closePopover = () => { - setIsOpen(false); - }; - - const onButtonClick = () => { - setIsOpen(!isOpen); - }; - - const onChange = (projectType: ProjectType) => { - closePopover(); - onProjectChange(projectType); - return false; - }; - - const items = projectTypes.map((type) => ( - - )); - - const button = ; - - return ( - - Switch Project Type - - {items} - - - ); -}; diff --git a/src/platform/packages/private/serverless/project_switcher/src/switcher.stories.tsx b/src/platform/packages/private/serverless/project_switcher/src/switcher.stories.tsx deleted file mode 100644 index 36e782f9fc01b..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/switcher.stories.tsx +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; - -import { - ProjectSwitcherStorybookMock, - type ProjectSwitcherStorybookParams, -} from '../mocks/storybook.mock'; - -import { ProjectSwitcher as Component } from './switcher'; -import { ProjectSwitcherProvider as Provider } from './services'; - -import mdx from '../README.mdx'; - -export default { - title: 'Developer/Project Switcher', - description: '', - parameters: { - docs: { - page: mdx, - }, - }, -}; - -const mock = new ProjectSwitcherStorybookMock(); -const argTypes = mock.getArgumentTypes(); - -export const ProjectSwitcher = (params: ProjectSwitcherStorybookParams) => { - return ( - - - - ); -}; - -ProjectSwitcher.argTypes = argTypes; diff --git a/src/platform/packages/private/serverless/project_switcher/src/switcher.test.tsx b/src/platform/packages/private/serverless/project_switcher/src/switcher.test.tsx deleted file mode 100644 index c227e0c2e7c9d..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/switcher.test.tsx +++ /dev/null @@ -1,152 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; -import { render, RenderResult, screen, within, cleanup } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; - -import { ProjectType } from '@kbn/serverless-types'; - -import { ProjectSwitcherKibanaProvider, ProjectSwitcherProvider } from './services'; -import { - getProjectSwitcherKibanaDependenciesMock, - getProjectSwitcherServicesMock, -} from '../mocks/jest.mock'; -import { ProjectSwitcher } from './switcher'; -import { - ProjectSwitcher as ProjectSwitcherComponent, - TEST_ID_BUTTON, - TEST_ID_ITEM_GROUP, -} from './switcher.component'; -import { KibanaDependencies, Services } from './types'; - -const renderKibanaProjectSwitcher = ( - currentProjectType: ProjectType = 'observability' -): [RenderResult, jest.Mocked] => { - const mock = getProjectSwitcherKibanaDependenciesMock(); - return [ - render( - - - - ), - mock, - ]; -}; - -const renderProjectSwitcher = ( - currentProjectType: ProjectType = 'observability' -): [RenderResult, jest.Mocked] => { - const mock = getProjectSwitcherServicesMock(); - return [ - render( - - - - ), - mock, - ]; -}; - -describe('ProjectSwitcher', () => { - describe('Component', () => { - test('is rendered', () => { - expect(() => - render( - - ) - ).not.toThrowError(); - }); - }); - - describe('Connected Component', () => { - beforeEach(() => { - jest.spyOn(console, 'error').mockImplementation(() => {}); - }); - - test("doesn't render if the Provider is missing", () => { - expect(() => render()).toThrowError(); - }); - - describe('with Services', () => { - test('is rendered', () => { - renderProjectSwitcher(); - const button = screen.queryByTestId(TEST_ID_BUTTON); - expect(button).not.toBeNull(); - }); - - test('opens', async () => { - renderProjectSwitcher(); - - let group = screen.queryByTestId(TEST_ID_ITEM_GROUP); - expect(group).toBeNull(); - - const button = screen.getByTestId(TEST_ID_BUTTON); - await userEvent.click(button); - - group = screen.queryByTestId(TEST_ID_ITEM_GROUP); - expect(group).not.toBeNull(); - }); - - test('calls setProjectType when clicked', async () => { - const [_, mock] = renderProjectSwitcher(); - - const button = screen.getByTestId(TEST_ID_BUTTON); - await userEvent.click(button); - - const group = screen.getByTestId(TEST_ID_ITEM_GROUP); - const project = await within(group).findByLabelText('Security'); - await userEvent.click(project); - - expect(mock.setProjectType).toHaveBeenCalled(); - }); - }); - }); - - describe('with Kibana Dependencies', () => { - beforeEach(() => { - cleanup(); - }); - - test('is rendered', () => { - renderKibanaProjectSwitcher(); - const button = screen.queryByTestId(TEST_ID_BUTTON); - expect(button).not.toBeNull(); - }); - - test('opens', async () => { - renderKibanaProjectSwitcher(); - - let group = screen.queryByTestId(TEST_ID_ITEM_GROUP); - expect(group).toBeNull(); - - const button = screen.getByTestId(TEST_ID_BUTTON); - await userEvent.click(button); - - group = screen.queryByTestId(TEST_ID_ITEM_GROUP); - expect(group).not.toBeNull(); - }); - - test('posts message to change project', async () => { - const [_, mock] = renderKibanaProjectSwitcher(); - - const button = screen.getByTestId(TEST_ID_BUTTON); - await userEvent.click(button); - - const group = screen.getByTestId(TEST_ID_ITEM_GROUP); - const project = await within(group).findByLabelText('Security'); - await userEvent.click(project); - - expect(mock.coreStart.http.post).toHaveBeenCalled(); - }); - }); -}); diff --git a/src/platform/packages/private/serverless/project_switcher/src/switcher.tsx b/src/platform/packages/private/serverless/project_switcher/src/switcher.tsx deleted file mode 100644 index 1ca458d5ec398..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/switcher.tsx +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import React from 'react'; -import { ProjectType } from '@kbn/serverless-types'; -import { ProjectSwitcher as Component } from './switcher.component'; - -import { useServices } from './services'; -import type { ProjectSwitcherProps } from './types'; - -export const ProjectSwitcher = (props: ProjectSwitcherProps) => { - const { setProjectType } = useServices(); - const onProjectChange = (projectType: ProjectType) => setProjectType(projectType); - - return ; -}; diff --git a/src/platform/packages/private/serverless/project_switcher/src/types.ts b/src/platform/packages/private/serverless/project_switcher/src/types.ts deleted file mode 100644 index 9e598d3dda19f..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/src/types.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ProjectType } from '@kbn/serverless-types'; - -/** - * A list of services that are consumed by this component. - */ -export interface Services { - setProjectType: (projectType: ProjectType) => void; -} - -/** - * An interface containing a collection of Kibana plugins and services required to - * render this component. - */ -export interface KibanaDependencies { - coreStart: { - http: { - post: (path: string, options: { body: string }) => Promise; - }; - }; - projectChangeAPIUrl: string; -} - -/** - * Props for the `ProjectSwitcher` pure component. - */ -export interface ProjectSwitcherComponentProps { - onProjectChange: (projectType: ProjectType) => void; - currentProjectType: ProjectType; -} - -export type ProjectSwitcherProps = Pick; diff --git a/src/platform/packages/private/serverless/project_switcher/tsconfig.json b/src/platform/packages/private/serverless/project_switcher/tsconfig.json deleted file mode 100644 index d477303d65059..0000000000000 --- a/src/platform/packages/private/serverless/project_switcher/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "../../../../../../tsconfig.base.json", - "compilerOptions": { - "outDir": "target/types", - "types": [ - "jest", - "node", - "react", - "@kbn/ambient-ui-types" - ] - }, - "include": [ - "**/*.ts", - "**/*.tsx", - ], - "exclude": [ - "target/**/*" - ], - "kbn_references": [ - "@kbn/shared-ux-storybook-mock", - "@kbn/serverless-types", - ] -} diff --git a/tsconfig.base.json b/tsconfig.base.json index de8fd8fb948d7..f5ef65eab03bd 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1726,8 +1726,6 @@ "@kbn/serverless-observability/*": ["x-pack/solutions/observability/plugins/serverless_observability/*"], "@kbn/serverless-observability-settings": ["src/platform/packages/shared/serverless/settings/observability_project"], "@kbn/serverless-observability-settings/*": ["src/platform/packages/shared/serverless/settings/observability_project/*"], - "@kbn/serverless-project-switcher": ["src/platform/packages/private/serverless/project_switcher"], - "@kbn/serverless-project-switcher/*": ["src/platform/packages/private/serverless/project_switcher/*"], "@kbn/serverless-search": ["x-pack/solutions/search/plugins/serverless_search"], "@kbn/serverless-search/*": ["x-pack/solutions/search/plugins/serverless_search/*"], "@kbn/serverless-search-settings": ["src/platform/packages/shared/serverless/settings/search_project"], diff --git a/x-pack/platform/plugins/shared/serverless/common/index.ts b/x-pack/platform/plugins/shared/serverless/common/index.ts index dacf50415f2a7..f28f6aa0c3623 100644 --- a/x-pack/platform/plugins/shared/serverless/common/index.ts +++ b/x-pack/platform/plugins/shared/serverless/common/index.ts @@ -7,6 +7,3 @@ export const PLUGIN_ID = 'serverless'; export const PLUGIN_NAME = 'serverless'; - -/** Internal API route responsible for switching between project configurations. */ -export const API_SWITCH_PROJECT = '/internal/serverless/switch_project'; diff --git a/x-pack/platform/plugins/shared/serverless/public/index.ts b/x-pack/platform/plugins/shared/serverless/public/index.ts index 7f841ef25be2f..d47e125a14ab6 100644 --- a/x-pack/platform/plugins/shared/serverless/public/index.ts +++ b/x-pack/platform/plugins/shared/serverless/public/index.ts @@ -5,11 +5,10 @@ * 2.0. */ -import { PluginInitializerContext } from '@kbn/core/public'; import { ServerlessPlugin } from './plugin'; -export function plugin(initializerContext: PluginInitializerContext) { - return new ServerlessPlugin(initializerContext); +export function plugin() { + return new ServerlessPlugin(); } export type { ServerlessPluginSetup, ServerlessPluginStart } from './types'; diff --git a/x-pack/platform/plugins/shared/serverless/public/plugin.tsx b/x-pack/platform/plugins/shared/serverless/public/plugin.tsx index a488658e9bb94..139bce182318d 100644 --- a/x-pack/platform/plugins/shared/serverless/public/plugin.tsx +++ b/x-pack/platform/plugins/shared/serverless/public/plugin.tsx @@ -7,16 +7,11 @@ import { EuiButton } from '@elastic/eui'; import { InternalChromeStart } from '@kbn/core-chrome-browser-internal'; -import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/public'; +import { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { toMountPoint } from '@kbn/react-kibana-mount'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; -import { ProjectSwitcher, ProjectSwitcherKibanaProvider } from '@kbn/serverless-project-switcher'; -import { ProjectType } from '@kbn/serverless-types'; import React from 'react'; -import ReactDOM from 'react-dom'; -import { API_SWITCH_PROJECT as projectChangeAPIUrl } from '../common'; -import { ServerlessConfig } from './config'; import { generateManageOrgMembersNavCard, manageOrgMembersNavCardName, @@ -38,11 +33,7 @@ export class ServerlessPlugin ServerlessPluginStartDependencies > { - private readonly config: ServerlessConfig; - - constructor(private readonly initializerContext: PluginInitializerContext) { - this.config = this.initializerContext.config.get(); - } + constructor() {} public setup( _core: CoreSetup, @@ -55,17 +46,6 @@ export class ServerlessPlugin core: CoreStart, dependencies: ServerlessPluginStartDependencies ): ServerlessPluginStart { - const { developer } = this.config; - - if (developer && developer.projectSwitcher && developer.projectSwitcher.enabled) { - const { currentType } = developer.projectSwitcher; - - core.chrome.navControls.registerRight({ - order: 5000, - mount: (target) => this.mountProjectSwitcher(target, core, currentType), - }); - } - core.chrome.setChromeStyle('project'); // Casting the "chrome.projects" service to an "internal" type: this is intentional to obscure the property from Typescript. @@ -136,21 +116,4 @@ export class ServerlessPlugin } public stop() {} - - private mountProjectSwitcher( - targetDomElement: HTMLElement, - coreStart: CoreStart, - currentProjectType: ProjectType - ) { - ReactDOM.render( - - - - - , - targetDomElement - ); - - return () => ReactDOM.unmountComponentAtNode(targetDomElement); - } } diff --git a/x-pack/platform/plugins/shared/serverless/server/config.ts b/x-pack/platform/plugins/shared/serverless/server/config.ts index 96c4816bd40f0..fe042c9cbf29a 100644 --- a/x-pack/platform/plugins/shared/serverless/server/config.ts +++ b/x-pack/platform/plugins/shared/serverless/server/config.ts @@ -17,7 +17,7 @@ const configSchema = schema.object({ // Config namespace for developer-specific settings. developer: schema.maybe( schema.object({ - // Settings for the project switcher. + // Settings for the project switcher. This is now deprecated. projectSwitcher: schema.maybe( schema.object({ // Should the switcher be enabled? @@ -53,6 +53,12 @@ export const config: PluginConfigDescriptor = { exposeToBrowser: { developer: true, }, + deprecations: ({ unused }) => [ + unused('developer', { level: 'critical' }), + unused('developer.projectSwitcher', { level: 'critical' }), + unused('developer.projectSwitcher.enabled', { level: 'critical' }), + unused('developer.projectSwitcher.currentType', { level: 'critical' }), + ], }; export type ServerlessConfig = TypeOf; diff --git a/x-pack/platform/plugins/shared/serverless/server/index.ts b/x-pack/platform/plugins/shared/serverless/server/index.ts index b873dda868231..ed4222519f55c 100644 --- a/x-pack/platform/plugins/shared/serverless/server/index.ts +++ b/x-pack/platform/plugins/shared/serverless/server/index.ts @@ -5,12 +5,11 @@ * 2.0. */ -import { PluginInitializerContext } from '@kbn/core/server'; export { config } from './config'; -export const plugin = async (initializerContext: PluginInitializerContext) => { +export const plugin = async () => { const { ServerlessPlugin } = await import('./plugin'); - return new ServerlessPlugin(initializerContext); + return new ServerlessPlugin(); }; export type { diff --git a/x-pack/platform/plugins/shared/serverless/server/plugin.test.ts b/x-pack/platform/plugins/shared/serverless/server/plugin.test.ts index d002325368be6..34c456a048e78 100644 --- a/x-pack/platform/plugins/shared/serverless/server/plugin.test.ts +++ b/x-pack/platform/plugins/shared/serverless/server/plugin.test.ts @@ -6,7 +6,6 @@ */ import { coreMock } from '@kbn/core/server/mocks'; -import { config } from './config'; import { ServerlessPlugin } from './plugin'; describe('Serverless Plugin', () => { @@ -14,13 +13,7 @@ describe('Serverless Plugin', () => { let mockCoreSetup: ReturnType; let mockCoreStart: ReturnType; beforeEach(() => { - plugin = new ServerlessPlugin( - coreMock.createPluginInitializerContext( - config.schema.validate({ - enabled: true, - }) - ) - ); + plugin = new ServerlessPlugin(); mockCoreSetup = coreMock.createSetup({ pluginStartContract: {}, diff --git a/x-pack/platform/plugins/shared/serverless/server/plugin.ts b/x-pack/platform/plugins/shared/serverless/server/plugin.ts index 31a815a4327ed..782a21fb124c3 100644 --- a/x-pack/platform/plugins/shared/serverless/server/plugin.ts +++ b/x-pack/platform/plugins/shared/serverless/server/plugin.ts @@ -5,13 +5,7 @@ * 2.0. */ -import { writeFileSync } from 'fs'; -import { resolve } from 'path'; - -import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '@kbn/core/server'; -import { schema, TypeOf } from '@kbn/config-schema'; -import { getConfigDirectory } from '@kbn/utils'; -import { ProjectType } from '@kbn/serverless-types'; +import { CoreSetup, CoreStart, Plugin } from '@kbn/core/server'; import { ALL_COMMON_SETTINGS } from '@kbn/serverless-common-settings'; import type { @@ -20,24 +14,6 @@ import type { ServerlessServerSetupDependencies, ServerlessServerStartDependencies, } from './types'; -import { ServerlessConfig } from './config'; -import { API_SWITCH_PROJECT } from '../common'; - -const switchBodySchema = schema.object({ - id: schema.oneOf([ - schema.literal('observability'), - schema.literal('security'), - schema.literal('search'), - ]), -}); - -type SwitchReqBody = TypeOf; - -const typeToIdMap: Record = { - observability: 'oblt', - security: 'security', - search: 'es', -}; export class ServerlessPlugin implements @@ -48,7 +24,6 @@ export class ServerlessPlugin ServerlessServerStartDependencies > { - private readonly config: ServerlessConfig; private projectSettingsAdded: boolean = false; private setupProjectSettings(core: CoreSetup, keys: string[]): void { @@ -57,52 +32,9 @@ export class ServerlessPlugin this.projectSettingsAdded = true; } - constructor(private readonly context: PluginInitializerContext) { - this.config = this.context.config.get(); - } + constructor() {} public setup(core: CoreSetup) { - const router = core.http.createRouter(); - const { developer } = this.config; - - // If we're in development mode, and the switcher is enabled, register the - // API endpoint responsible for switching projects. - if (process.env.NODE_ENV !== 'production' && developer?.projectSwitcher?.enabled) { - router.post( - { - path: API_SWITCH_PROJECT, - security: { - authz: { - enabled: false, - reason: - 'This route is opted out from authorization, because it is only used in development', - }, - }, - validate: { - body: switchBodySchema, - }, - }, - async (_context, request, response) => { - const { id } = request.body; - const selectedProjectType = typeToIdMap[id]; - - try { - // The switcher is not enabled by default, in cases where one has started Serverless - // with a specific config. So in this case, to ensure the switcher remains enabled, - // write the selected config to `recent` and tack on the setting to enable the switcher. - writeFileSync( - resolve(getConfigDirectory(), 'serverless.recent.dev.yml'), - `xpack.serverless.plugin.developer.projectSwitcher.enabled: true\nserverless: ${selectedProjectType}\n` - ); - - return response.ok({ body: id }); - } catch (e) { - return response.badRequest({ body: e }); - } - } - ); - } - return { setupProjectSettings: (keys: string[]) => this.setupProjectSettings(core, keys), }; diff --git a/x-pack/platform/plugins/shared/serverless/tsconfig.json b/x-pack/platform/plugins/shared/serverless/tsconfig.json index 988e3f7a693aa..c43975de8a54f 100644 --- a/x-pack/platform/plugins/shared/serverless/tsconfig.json +++ b/x-pack/platform/plugins/shared/serverless/tsconfig.json @@ -16,9 +16,6 @@ "kbn_references": [ "@kbn/config-schema", "@kbn/core", - "@kbn/serverless-project-switcher", - "@kbn/serverless-types", - "@kbn/utils", "@kbn/core-chrome-browser", "@kbn/core-chrome-browser-internal", "@kbn/cloud-plugin", diff --git a/yarn.lock b/yarn.lock index 5cfc912d1cb51..19c92560ecfc4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7308,10 +7308,6 @@ version "0.0.0" uid "" -"@kbn/serverless-project-switcher@link:src/platform/packages/private/serverless/project_switcher": - version "0.0.0" - uid "" - "@kbn/serverless-search-settings@link:src/platform/packages/shared/serverless/settings/search_project": version "0.0.0" uid ""