From 4c39af89021284494227c9b03fd982241c54ea2c Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 14 Aug 2024 14:44:13 +0200 Subject: [PATCH] feat: small refactor for the search package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: blam --- plugins/catalog-react/api-report-alpha.md | 120 +++++- plugins/catalog/api-report-alpha.md | 365 +++++++++++++++++- plugins/search-react/api-report-alpha.md | 52 ++- plugins/search-react/package.json | 4 +- .../SearchResultListItemBlueprint.test.tsx | 0 .../SearchResultListItemBlueprint.tsx | 7 +- .../src/{ => alpha}/blueprints/index.ts | 0 .../src/{ => alpha}/blueprints/types.ts | 0 .../extensions.test.tsx} | 6 +- .../src/{alpha.tsx => alpha/extensions.tsx} | 11 +- plugins/search-react/src/alpha/index.ts | 17 + 11 files changed, 561 insertions(+), 21 deletions(-) rename plugins/search-react/src/{ => alpha}/blueprints/SearchResultListItemBlueprint.test.tsx (100%) rename plugins/search-react/src/{ => alpha}/blueprints/SearchResultListItemBlueprint.tsx (96%) rename plugins/search-react/src/{ => alpha}/blueprints/index.ts (100%) rename plugins/search-react/src/{ => alpha}/blueprints/types.ts (100%) rename plugins/search-react/src/{alpha.test.tsx => alpha/extensions.test.tsx} (97%) rename plugins/search-react/src/{alpha.tsx => alpha/extensions.tsx} (93%) create mode 100644 plugins/search-react/src/alpha/index.ts diff --git a/plugins/catalog-react/api-report-alpha.md b/plugins/catalog-react/api-report-alpha.md index edfa183903..f3d251dd0e 100644 --- a/plugins/catalog-react/api-report-alpha.md +++ b/plugins/catalog-react/api-report-alpha.md @@ -6,16 +6,19 @@ /// import { AnyExtensionInputMap } from '@backstage/frontend-plugin-api'; +import { AnyRouteRefParams } from '@backstage/frontend-plugin-api'; import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; import { Entity } from '@backstage/catalog-model'; +import { ExtensionBlueprint } from '@backstage/frontend-plugin-api'; import { ExtensionDefinition } from '@backstage/frontend-plugin-api'; import { PortableSchema } from '@backstage/frontend-plugin-api'; +import { default as React_2 } from 'react'; import { ResolvedExtensionInputs } from '@backstage/frontend-plugin-api'; import { ResourcePermission } from '@backstage/plugin-permission-common'; import { RouteRef } from '@backstage/frontend-plugin-api'; import { TranslationRef } from '@backstage/core-plugin-api/alpha'; -// @alpha (undocumented) +// @alpha @deprecated (undocumented) export const catalogExtensionData: { entityContentTitle: ConfigurableExtensionDataRef< string, @@ -92,7 +95,7 @@ export const catalogReactTranslationRef: TranslationRef< } >; -// @alpha (undocumented) +// @alpha @deprecated (undocumented) export function createEntityCardExtension< TConfig extends { filter?: string; @@ -125,7 +128,7 @@ export function createEntityCardExtension< string | undefined >; -// @alpha (undocumented) +// @alpha @deprecated (undocumented) export function createEntityContentExtension< TInputs extends AnyExtensionInputMap, >(options: { @@ -164,6 +167,117 @@ export function createEntityContentExtension< string | undefined >; +// @alpha +export const EntityCardBlueprint: ExtensionBlueprint< + 'entity-card', + undefined, + undefined, + { + loader: () => Promise; + filter?: string | ((entity: Entity) => boolean) | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + { + filterFunction: ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + {} + >; + filterExpression: ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + {} + >; + } +>; + +// @alpha +export const EntityContentBlueprint: ExtensionBlueprint< + 'entity-content', + undefined, + undefined, + { + loader: () => Promise; + defaultPath: string; + defaultTitle: string; + routeRef?: RouteRef | undefined; + filter?: string | ((entity: Entity) => boolean) | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + RouteRef, + 'core.routing.ref', + RouteRef & { + optional: true; + } + > + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + { + path: string | undefined; + title: string | undefined; + filter: string | undefined; + }, + { + filter?: string | undefined; + title?: string | undefined; + path?: string | undefined; + }, + { + title: ConfigurableExtensionDataRef< + string, + 'catalog.entity-content-title', + {} + >; + filterFunction: ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + {} + >; + filterExpression: ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + {} + >; + } +>; + // @alpha export function isOwnerOf(owner: Entity, entity: Entity): boolean; diff --git a/plugins/catalog/api-report-alpha.md b/plugins/catalog/api-report-alpha.md index 5019fc25ea..7c2f490939 100644 --- a/plugins/catalog/api-report-alpha.md +++ b/plugins/catalog/api-report-alpha.md @@ -6,13 +6,35 @@ /// import { AnyExtensionInputMap } from '@backstage/frontend-plugin-api'; +import { AnyRouteRefParams } from '@backstage/frontend-plugin-api'; import { BackstagePlugin } from '@backstage/frontend-plugin-api'; +import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { Entity } from '@backstage/catalog-model'; +import { ExtensionBlueprint } from '@backstage/frontend-plugin-api'; import { ExtensionDefinition } from '@backstage/frontend-plugin-api'; +import { ExtensionInput } from '@backstage/frontend-plugin-api'; import { ExternalRouteRef } from '@backstage/frontend-plugin-api'; +import { JSX as JSX_2 } from 'react'; import { PortableSchema } from '@backstage/frontend-plugin-api'; +import { default as React_2 } from 'react'; import { RouteRef } from '@backstage/frontend-plugin-api'; import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +// @alpha +export const CatalogFilterBlueprint: ExtensionBlueprint< + 'catalog-filter', + undefined, + undefined, + { + loader: () => Promise; + }, + ConfigurableExtensionDataRef, + {}, + {}, + {}, + never +>; + // @alpha (undocumented) export const catalogTranslationRef: TranslationRef< 'catalog', @@ -98,7 +120,9 @@ export const catalogTranslationRef: TranslationRef< } >; -// @alpha (undocumented) +// Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/plugin-catalog" does not have an export "CatalogFilterExtensionBlueprint" +// +// @alpha @deprecated (undocumented) export function createCatalogFilterExtension< TInputs extends AnyExtensionInputMap, TConfig, @@ -141,7 +165,344 @@ const _default: BackstagePlugin< }>; unregisterRedirect: ExternalRouteRef; }, - {} + { + 'entity-card:catalog/about': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'about' + >; + 'entity-card:catalog/links': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'links' + >; + 'entity-card:catalog/labels': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'labels' + >; + 'entity-card:catalog/depends-on-components': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'depends-on-components' + >; + 'entity-card:catalog/depends-on-resources': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'depends-on-resources' + >; + 'entity-card:catalog/has-components': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'has-components' + >; + 'entity-card:catalog/has-resources': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'has-resources' + >; + 'entity-card:catalog/has-subcomponents': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'has-subcomponents' + >; + 'entity-card:catalog/has-subdomains': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'has-subdomains' + >; + 'entity-card:catalog/has-systems': ExtensionDefinition< + { + filter: string | undefined; + }, + { + filter?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + {}, + 'entity-card', + undefined, + 'has-systems' + >; + 'entity-content:catalog/overview': ExtensionDefinition< + { + [x: string]: any; + } & { + path: string | undefined; + title: string | undefined; + filter: string | undefined; + }, + { + [x: string]: any; + } & { + filter?: string | undefined; + title?: string | undefined; + path?: string | undefined; + }, + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + RouteRef, + 'core.routing.ref', + RouteRef & { + optional: true; + } + > + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + { + cards: ExtensionInput< + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + ((entity: Entity) => boolean) & { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + string & { + optional: true; + } + >, + { + singleton: false; + optional: false; + } + >; + }, + 'entity-content', + undefined, + 'overview' + >; + } >; export default _default; diff --git a/plugins/search-react/api-report-alpha.md b/plugins/search-react/api-report-alpha.md index 4bcdbb3f78..0126fdc590 100644 --- a/plugins/search-react/api-report-alpha.md +++ b/plugins/search-react/api-report-alpha.md @@ -6,6 +6,7 @@ /// import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { ExtensionBlueprint } from '@backstage/frontend-plugin-api'; import { ExtensionDefinition } from '@backstage/frontend-plugin-api'; import { ListItemProps } from '@material-ui/core/ListItem'; import { PortableSchema } from '@backstage/frontend-plugin-api'; @@ -18,7 +19,7 @@ export type BaseSearchResultListItemProps = T & { result?: SearchDocument; } & Omit; -// @alpha (undocumented) +// @alpha @deprecated export function createSearchResultListItemExtension< TConfig extends { noTrack?: boolean; @@ -35,9 +36,9 @@ export function createSearchResultListItemExtension< string | undefined >; -// @alpha (undocumented) +// @alpha @deprecated (undocumented) export namespace createSearchResultListItemExtension { - const // (undocumented) + const // @deprecated (undocumented) itemDataRef: ConfigurableExtensionDataRef< { predicate?: SearchResultItemExtensionPredicate | undefined; @@ -55,7 +56,7 @@ export type SearchResultItemExtensionComponent = < props: P, ) => JSX.Element | null; -// @alpha (undocumented) +// @alpha @deprecated (undocumented) export type SearchResultItemExtensionOptions< TConfig extends { noTrack?: boolean; @@ -79,5 +80,48 @@ export type SearchResultItemExtensionPredicate = ( result: SearchResult, ) => boolean; +// @alpha +export const SearchResultListItemBlueprint: ExtensionBlueprint< + 'search-result-list-item', + undefined, + undefined, + SearchResultListItemBlueprintParams, + ConfigurableExtensionDataRef< + { + predicate?: SearchResultItemExtensionPredicate | undefined; + component: SearchResultItemExtensionComponent; + }, + 'search.search-result-list-item.item', + {} + >, + {}, + { + noTrack: boolean; + }, + { + noTrack?: boolean | undefined; + }, + { + item: ConfigurableExtensionDataRef< + { + predicate?: SearchResultItemExtensionPredicate | undefined; + component: SearchResultItemExtensionComponent; + }, + 'search.search-result-list-item.item', + {} + >; + } +>; + +// @alpha (undocumented) +export interface SearchResultListItemBlueprintParams { + component: (options: { + config: { + noTrack?: boolean; + }; + }) => Promise; + predicate?: SearchResultItemExtensionPredicate; +} + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index e16430c55b..887b41cb83 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -28,7 +28,7 @@ "sideEffects": false, "exports": { ".": "./src/index.ts", - "./alpha": "./src/alpha.tsx", + "./alpha": "./src/alpha/index.ts", "./package.json": "./package.json" }, "main": "src/index.ts", @@ -36,7 +36,7 @@ "typesVersions": { "*": { "alpha": [ - "src/alpha.tsx" + "src/alpha/index.ts" ], "package.json": [ "package.json" diff --git a/plugins/search-react/src/blueprints/SearchResultListItemBlueprint.test.tsx b/plugins/search-react/src/alpha/blueprints/SearchResultListItemBlueprint.test.tsx similarity index 100% rename from plugins/search-react/src/blueprints/SearchResultListItemBlueprint.test.tsx rename to plugins/search-react/src/alpha/blueprints/SearchResultListItemBlueprint.test.tsx diff --git a/plugins/search-react/src/blueprints/SearchResultListItemBlueprint.tsx b/plugins/search-react/src/alpha/blueprints/SearchResultListItemBlueprint.tsx similarity index 96% rename from plugins/search-react/src/blueprints/SearchResultListItemBlueprint.tsx rename to plugins/search-react/src/alpha/blueprints/SearchResultListItemBlueprint.tsx index bea52b7f45..b9a7b71719 100644 --- a/plugins/search-react/src/blueprints/SearchResultListItemBlueprint.tsx +++ b/plugins/search-react/src/alpha/blueprints/SearchResultListItemBlueprint.tsx @@ -27,8 +27,9 @@ import { import { SearchResultListItemExtension, SearchResultListItemExtensionProps, -} from '../extensions'; +} from '../../extensions'; +/** @alpha */ export interface SearchResultListItemBlueprintParams { /** * The extension component. @@ -43,6 +44,10 @@ export interface SearchResultListItemBlueprintParams { predicate?: SearchResultItemExtensionPredicate; } +/** + * @alpha + * Creates SearchResultListItem extensions + */ export const SearchResultListItemBlueprint = createExtensionBlueprint({ kind: 'search-result-list-item', attachTo: { diff --git a/plugins/search-react/src/blueprints/index.ts b/plugins/search-react/src/alpha/blueprints/index.ts similarity index 100% rename from plugins/search-react/src/blueprints/index.ts rename to plugins/search-react/src/alpha/blueprints/index.ts diff --git a/plugins/search-react/src/blueprints/types.ts b/plugins/search-react/src/alpha/blueprints/types.ts similarity index 100% rename from plugins/search-react/src/blueprints/types.ts rename to plugins/search-react/src/alpha/blueprints/types.ts diff --git a/plugins/search-react/src/alpha.test.tsx b/plugins/search-react/src/alpha/extensions.test.tsx similarity index 97% rename from plugins/search-react/src/alpha.test.tsx rename to plugins/search-react/src/alpha/extensions.test.tsx index 6d77b5af97..5194fadd1c 100644 --- a/plugins/search-react/src/alpha.test.tsx +++ b/plugins/search-react/src/alpha/extensions.test.tsx @@ -23,10 +23,8 @@ import { createExtensionTester } from '@backstage/frontend-test-utils'; import { SearchResult } from '@backstage/plugin-search-common'; import { screen } from '@testing-library/react'; import React from 'react'; -import { - BaseSearchResultListItemProps, - createSearchResultListItemExtension, -} from './alpha'; +import { createSearchResultListItemExtension } from './extensions'; +import { BaseSearchResultListItemProps } from './blueprints'; describe('createSearchResultListItemExtension', () => { it('Should use the correct result component', async () => { diff --git a/plugins/search-react/src/alpha.tsx b/plugins/search-react/src/alpha/extensions.tsx similarity index 93% rename from plugins/search-react/src/alpha.tsx rename to plugins/search-react/src/alpha/extensions.tsx index 53bf76f775..db09510a1e 100644 --- a/plugins/search-react/src/alpha.tsx +++ b/plugins/search-react/src/alpha/extensions.tsx @@ -21,14 +21,12 @@ import { createExtension, createSchemaFromZod, } from '@backstage/frontend-plugin-api'; -import { SearchResultListItemExtension } from './extensions'; import { SearchResultItemExtensionComponent, SearchResultItemExtensionPredicate, - searchResultListItemDataRef, -} from './blueprints/types'; - -export * from './blueprints'; +} from './blueprints'; +import { SearchResultListItemExtension } from '../extensions'; +import { searchResultListItemDataRef } from './blueprints/types'; /** * @alpha @@ -128,5 +126,8 @@ export function createSearchResultListItemExtension< * @deprecated Use {@link SearchResultListItemBlueprint} instead */ export namespace createSearchResultListItemExtension { + /** + * @deprecated Use {@link SearchResultListItemBlueprint#dataRefs.item} instead + */ export const itemDataRef = searchResultListItemDataRef; } diff --git a/plugins/search-react/src/alpha/index.ts b/plugins/search-react/src/alpha/index.ts new file mode 100644 index 0000000000..04026d629d --- /dev/null +++ b/plugins/search-react/src/alpha/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './extensions'; +export * from './blueprints';