diff --git a/.changeset/stale-frogs-wonder.md b/.changeset/stale-frogs-wonder.md new file mode 100644 index 0000000000..9618849a82 --- /dev/null +++ b/.changeset/stale-frogs-wonder.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-plugin-api': patch +--- + +The extensions map for plugins created with `createFrontendPlugin` is now sorted alphabetically by ID in the TypeScript type. diff --git a/packages/frontend-plugin-api/report.api.md b/packages/frontend-plugin-api/report.api.md index 5de595b6a9..c931ee120b 100644 --- a/packages/frontend-plugin-api/report.api.md +++ b/packages/frontend-plugin-api/report.api.md @@ -744,12 +744,7 @@ export function createFrontendPlugin< ): FrontendPlugin< TRoutes, TExternalRoutes, - { - [KExtension in TExtensions[number] as ResolveExtensionId< - KExtension, - TId - >]: KExtension; - } + MakeSortedExtensionsMap >; // @public diff --git a/packages/frontend-plugin-api/src/wiring/MakeSortedExtensionsMap.ts b/packages/frontend-plugin-api/src/wiring/MakeSortedExtensionsMap.ts new file mode 100644 index 0000000000..596d7a402c --- /dev/null +++ b/packages/frontend-plugin-api/src/wiring/MakeSortedExtensionsMap.ts @@ -0,0 +1,131 @@ +/* + * Copyright 2025 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. + */ + +import { ExtensionDefinition } from './createExtension'; +import { ResolveExtensionId } from './resolveExtensionDefinition'; + +// NOTE: Do not export any utilities in this file. If you want to use them, make a copy and keep them contained. + +type CompareChars = [A, B] extends [ + `${infer IAHead}${infer IARest}`, + `${infer IBHead}${infer IBRest}`, +] + ? IAHead extends IBHead + ? IBRest extends '' + ? IARest extends '' + ? 'eq' + : 'gt' + : IARest extends '' + ? 'lt' + : CompareChars + : `0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz` extends `${string}${IAHead}${string}${IBHead}${string}` + ? 'lt' + : 'gt' + : 'eq'; + +type CompareStrings< + A extends string | undefined, + B extends string | undefined, +> = A extends B + ? 'eq' + : A extends undefined + ? 'lt' + : B extends undefined + ? 'gt' + : CompareChars; + +type CompareExtensions< + A extends ExtensionDefinition, + B extends ExtensionDefinition, +> = CompareStrings extends 'eq' + ? CompareStrings + : CompareStrings; + +type SortExtensionsInner< + TPivot extends ExtensionDefinition, + TRest extends readonly ExtensionDefinition[], + TLow extends readonly ExtensionDefinition[], + THigh extends readonly ExtensionDefinition[], +> = TRest extends [ + infer IHead extends ExtensionDefinition, + ...infer IRest extends readonly ExtensionDefinition[], +] + ? CompareExtensions extends 'lt' + ? SortExtensionsInner + : SortExtensionsInner + : [low: TLow, high: THigh]; + +type SortExtensions = T extends [ + infer IPivot extends ExtensionDefinition, + ...infer IRest extends readonly ExtensionDefinition[], +] + ? SortExtensionsInner extends [ + low: infer ILow extends readonly ExtensionDefinition[], + high: infer IHigh extends readonly ExtensionDefinition[], + ] + ? [...SortExtensions, IPivot, ...SortExtensions] + : 'invalid SortExtensionsInner' + : []; + +type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( + k: infer I, +) => void + ? I + : never; + +type PopUnion = UnionToIntersection< + U extends any ? () => U : never +> extends () => infer R + ? [next: R, rest: Exclude] + : undefined; + +type UnionToArray = PopUnion extends [ + next: infer INext extends T, + rest: infer IRest extends T, +] + ? UnionToArray + : TResult; + +type ExtensionArrayToMap< + T extends ExtensionDefinition[], + TId extends string, + TOut extends { [KId in string]: ExtensionDefinition } = {}, +> = T extends [ + infer IHead extends ExtensionDefinition, + ...infer IRest extends ExtensionDefinition[], +] + ? ExtensionArrayToMap< + IRest, + TId, + TOut & { [K in ResolveExtensionId]: IHead } + > + : TOut extends infer O + ? { [K in keyof O]: O[K] } + : never; + +// This was added to stability API reports. Before this was added the extensions +// listed in API reports would be reordered fairly arbitrarily on changes in +// unrelated packages, which made for a confusing contribution experience. This +// also makes it slightly easier to find extensions that you're looking for in +// the API reports. +// +// If this causes any type of trouble there is no risk in removing it from a +// correctness or API stability point of view. +/** @ignore */ +export type MakeSortedExtensionsMap< + UExtensions extends ExtensionDefinition, + TId extends string, +> = ExtensionArrayToMap>, TId>; diff --git a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts index 1ab7dc8e83..09ff96a4e6 100644 --- a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts +++ b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts @@ -21,10 +21,10 @@ import { import { ExtensionDefinition } from './createExtension'; import { Extension, - ResolveExtensionId, resolveExtensionDefinition, } from './resolveExtensionDefinition'; import { AnyExternalRoutes, AnyRoutes, FeatureFlagConfig } from './types'; +import { MakeSortedExtensionsMap } from './MakeSortedExtensionsMap'; /** @public */ export interface FrontendPlugin< @@ -69,12 +69,7 @@ export function createFrontendPlugin< ): FrontendPlugin< TRoutes, TExternalRoutes, - { - [KExtension in TExtensions[number] as ResolveExtensionId< - KExtension, - TId - >]: KExtension; - } + MakeSortedExtensionsMap > { const extensions = new Array>(); const extensionDefinitionsById = new Map< diff --git a/plugins/api-docs/report-alpha.api.md b/plugins/api-docs/report-alpha.api.md index 3c475e597e..78e8b9442b 100644 --- a/plugins/api-docs/report-alpha.api.md +++ b/plugins/api-docs/report-alpha.api.md @@ -26,27 +26,6 @@ const _default: FrontendPlugin< registerApi: ExternalRouteRef; }, { - 'nav-item:api-docs': ExtensionDefinition<{ - kind: 'nav-item'; - name: undefined; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - { - title: string; - icon: IconComponent; - routeRef: RouteRef; - }, - 'core.nav-item.target', - {} - >; - inputs: {}; - params: { - title: string; - icon: IconComponent; - routeRef: RouteRef; - }; - }>; 'api:api-docs/config': ExtensionDefinition<{ kind: 'api'; name: 'config'; @@ -62,138 +41,6 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'page:api-docs': ExtensionDefinition<{ - config: { - initiallySelectedFilter: 'all' | 'owned' | 'starred' | undefined; - } & { - path: string | undefined; - }; - configInput: { - initiallySelectedFilter?: 'all' | 'owned' | 'starred' | undefined; - } & { - path?: string | undefined; - }; - output: - | ConfigurableExtensionDataRef< - React_2.JSX.Element, - 'core.reactElement', - {} - > - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef< - RouteRef, - 'core.routing.ref', - { - optional: true; - } - >; - inputs: { - [x: string]: ExtensionInput< - AnyExtensionDataRef, - { - optional: boolean; - singleton: boolean; - } - >; - }; - kind: 'page'; - name: undefined; - params: { - defaultPath: string; - loader: () => Promise; - routeRef?: RouteRef | undefined; - }; - }>; - 'entity-card:api-docs/has-apis': ExtensionDefinition<{ - kind: 'entity-card'; - name: 'has-apis'; - config: { - filter: string | undefined; - type: 'full' | 'info' | 'peek' | undefined; - }; - configInput: { - filter?: string | undefined; - type?: 'full' | 'info' | 'peek' | undefined; - }; - output: - | ConfigurableExtensionDataRef< - React_2.JSX.Element, - 'core.reactElement', - {} - > - | ConfigurableExtensionDataRef< - (entity: Entity) => boolean, - 'catalog.entity-filter-function', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - string, - 'catalog.entity-filter-expression', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - EntityCardType, - 'catalog.entity-card-type', - { - optional: true; - } - >; - inputs: {}; - params: { - loader: () => Promise; - filter?: string | ((entity: Entity) => boolean) | undefined; - type?: EntityCardType | undefined; - }; - }>; - 'entity-card:api-docs/definition': ExtensionDefinition<{ - kind: 'entity-card'; - name: 'definition'; - config: { - filter: string | undefined; - type: 'full' | 'info' | 'peek' | undefined; - }; - configInput: { - filter?: string | undefined; - type?: 'full' | 'info' | 'peek' | undefined; - }; - output: - | ConfigurableExtensionDataRef< - React_2.JSX.Element, - 'core.reactElement', - {} - > - | ConfigurableExtensionDataRef< - (entity: Entity) => boolean, - 'catalog.entity-filter-function', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - string, - 'catalog.entity-filter-expression', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - EntityCardType, - 'catalog.entity-card-type', - { - optional: true; - } - >; - inputs: {}; - params: { - loader: () => Promise; - filter?: string | ((entity: Entity) => boolean) | undefined; - type?: EntityCardType | undefined; - }; - }>; 'entity-card:api-docs/consumed-apis': ExtensionDefinition<{ kind: 'entity-card'; name: 'consumed-apis'; @@ -239,51 +86,6 @@ const _default: FrontendPlugin< type?: EntityCardType | undefined; }; }>; - 'entity-card:api-docs/provided-apis': ExtensionDefinition<{ - kind: 'entity-card'; - name: 'provided-apis'; - config: { - filter: string | undefined; - type: 'full' | 'info' | 'peek' | undefined; - }; - configInput: { - filter?: string | undefined; - type?: 'full' | 'info' | 'peek' | undefined; - }; - output: - | ConfigurableExtensionDataRef< - React_2.JSX.Element, - 'core.reactElement', - {} - > - | ConfigurableExtensionDataRef< - (entity: Entity) => boolean, - 'catalog.entity-filter-function', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - string, - 'catalog.entity-filter-expression', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - EntityCardType, - 'catalog.entity-card-type', - { - optional: true; - } - >; - inputs: {}; - params: { - loader: () => Promise; - filter?: string | ((entity: Entity) => boolean) | undefined; - type?: EntityCardType | undefined; - }; - }>; 'entity-card:api-docs/consuming-components': ExtensionDefinition<{ kind: 'entity-card'; name: 'consuming-components'; @@ -329,6 +131,141 @@ const _default: FrontendPlugin< type?: EntityCardType | undefined; }; }>; + 'entity-card:api-docs/definition': ExtensionDefinition<{ + kind: 'entity-card'; + name: 'definition'; + config: { + filter: string | undefined; + type: 'full' | 'info' | 'peek' | undefined; + }; + configInput: { + filter?: string | undefined; + type?: 'full' | 'info' | 'peek' | undefined; + }; + output: + | ConfigurableExtensionDataRef< + React_2.JSX.Element, + 'core.reactElement', + {} + > + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + EntityCardType, + 'catalog.entity-card-type', + { + optional: true; + } + >; + inputs: {}; + params: { + loader: () => Promise; + filter?: string | ((entity: Entity) => boolean) | undefined; + type?: EntityCardType | undefined; + }; + }>; + 'entity-card:api-docs/has-apis': ExtensionDefinition<{ + kind: 'entity-card'; + name: 'has-apis'; + config: { + filter: string | undefined; + type: 'full' | 'info' | 'peek' | undefined; + }; + configInput: { + filter?: string | undefined; + type?: 'full' | 'info' | 'peek' | undefined; + }; + output: + | ConfigurableExtensionDataRef< + React_2.JSX.Element, + 'core.reactElement', + {} + > + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + EntityCardType, + 'catalog.entity-card-type', + { + optional: true; + } + >; + inputs: {}; + params: { + loader: () => Promise; + filter?: string | ((entity: Entity) => boolean) | undefined; + type?: EntityCardType | undefined; + }; + }>; + 'entity-card:api-docs/provided-apis': ExtensionDefinition<{ + kind: 'entity-card'; + name: 'provided-apis'; + config: { + filter: string | undefined; + type: 'full' | 'info' | 'peek' | undefined; + }; + configInput: { + filter?: string | undefined; + type?: 'full' | 'info' | 'peek' | undefined; + }; + output: + | ConfigurableExtensionDataRef< + React_2.JSX.Element, + 'core.reactElement', + {} + > + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + EntityCardType, + 'catalog.entity-card-type', + { + optional: true; + } + >; + inputs: {}; + params: { + loader: () => Promise; + filter?: string | ((entity: Entity) => boolean) | undefined; + type?: EntityCardType | undefined; + }; + }>; 'entity-card:api-docs/providing-components': ExtensionDefinition<{ kind: 'entity-card'; name: 'providing-components'; @@ -374,77 +311,6 @@ const _default: FrontendPlugin< type?: EntityCardType | undefined; }; }>; - 'entity-content:api-docs/definition': ExtensionDefinition<{ - kind: 'entity-content'; - name: 'definition'; - config: { - path: string | undefined; - title: string | undefined; - filter: string | undefined; - group: string | false | undefined; - }; - configInput: { - filter?: string | undefined; - title?: string | undefined; - path?: string | undefined; - group?: string | false | undefined; - }; - output: - | ConfigurableExtensionDataRef< - React_2.JSX.Element, - 'core.reactElement', - {} - > - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef< - RouteRef, - 'core.routing.ref', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - string, - 'catalog.entity-content-title', - {} - > - | ConfigurableExtensionDataRef< - (entity: Entity) => boolean, - 'catalog.entity-filter-function', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - string, - 'catalog.entity-filter-expression', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - string, - 'catalog.entity-content-group', - { - optional: true; - } - >; - inputs: {}; - params: { - loader: () => Promise; - defaultPath: string; - defaultTitle: string; - defaultGroup?: - | (string & {}) - | 'documentation' - | 'development' - | 'deployment' - | 'observability' - | undefined; - routeRef?: RouteRef | undefined; - filter?: string | ((entity: Entity) => boolean) | undefined; - }; - }>; 'entity-content:api-docs/apis': ExtensionDefinition<{ kind: 'entity-content'; name: 'apis'; @@ -516,6 +382,140 @@ const _default: FrontendPlugin< filter?: string | ((entity: Entity) => boolean) | undefined; }; }>; + 'entity-content:api-docs/definition': ExtensionDefinition<{ + kind: 'entity-content'; + name: 'definition'; + config: { + path: string | undefined; + title: string | undefined; + filter: string | undefined; + group: string | false | undefined; + }; + configInput: { + filter?: string | undefined; + title?: string | undefined; + path?: string | undefined; + group?: string | false | undefined; + }; + output: + | ConfigurableExtensionDataRef< + React_2.JSX.Element, + 'core.reactElement', + {} + > + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + RouteRef, + 'core.routing.ref', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-content-title', + {} + > + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-content-group', + { + optional: true; + } + >; + inputs: {}; + params: { + loader: () => Promise; + defaultPath: string; + defaultTitle: string; + defaultGroup?: + | (string & {}) + | 'documentation' + | 'development' + | 'deployment' + | 'observability' + | undefined; + routeRef?: RouteRef | undefined; + filter?: string | ((entity: Entity) => boolean) | undefined; + }; + }>; + 'nav-item:api-docs': ExtensionDefinition<{ + kind: 'nav-item'; + name: undefined; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + { + title: string; + icon: IconComponent; + routeRef: RouteRef; + }, + 'core.nav-item.target', + {} + >; + inputs: {}; + params: { + title: string; + icon: IconComponent; + routeRef: RouteRef; + }; + }>; + 'page:api-docs': ExtensionDefinition<{ + config: { + initiallySelectedFilter: 'all' | 'owned' | 'starred' | undefined; + } & { + path: string | undefined; + }; + configInput: { + initiallySelectedFilter?: 'all' | 'owned' | 'starred' | undefined; + } & { + path?: string | undefined; + }; + output: + | ConfigurableExtensionDataRef< + React_2.JSX.Element, + 'core.reactElement', + {} + > + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + RouteRef, + 'core.routing.ref', + { + optional: true; + } + >; + inputs: { + [x: string]: ExtensionInput< + AnyExtensionDataRef, + { + optional: boolean; + singleton: boolean; + } + >; + }; + kind: 'page'; + name: undefined; + params: { + defaultPath: string; + loader: () => Promise; + routeRef?: RouteRef | undefined; + }; + }>; } >; export default _default; diff --git a/plugins/app/report.api.md b/plugins/app/report.api.md index afd1afe500..3c6fba3776 100644 --- a/plugins/app/report.api.md +++ b/plugins/app/report.api.md @@ -29,21 +29,6 @@ const appPlugin: FrontendPlugin< {}, {}, { - 'sign-in-page:app': ExtensionDefinition<{ - kind: 'sign-in-page'; - name: undefined; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - ComponentType, - 'core.sign-in-page.component', - {} - >; - inputs: {}; - params: { - loader: () => Promise>; - }; - }>; app: ExtensionDefinition<{ config: {}; configInput: {}; @@ -65,21 +50,6 @@ const appPlugin: FrontendPlugin< kind: undefined; name: undefined; }>; - 'api:app/app-language': ExtensionDefinition<{ - kind: 'api'; - name: 'app-language'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; 'app/layout': ExtensionDefinition<{ config: {}; configInput: {}; @@ -245,226 +215,6 @@ const appPlugin: FrontendPlugin< kind: undefined; name: 'routes'; }>; - 'api:app/app-theme': ExtensionDefinition<{ - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: { - themes: ExtensionInput< - ConfigurableExtensionDataRef, - { - singleton: false; - optional: false; - } - >; - }; - kind: 'api'; - name: 'app-theme'; - params: { - factory: AnyApiFactory; - }; - }>; - 'theme:app/light': ExtensionDefinition<{ - kind: 'theme'; - name: 'light'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef; - inputs: {}; - params: { - theme: AppTheme; - }; - }>; - 'theme:app/dark': ExtensionDefinition<{ - kind: 'theme'; - name: 'dark'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef; - inputs: {}; - params: { - theme: AppTheme; - }; - }>; - 'api:app/components': ExtensionDefinition<{ - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: { - components: ExtensionInput< - ConfigurableExtensionDataRef< - { - ref: ComponentRef; - impl: ComponentType; - }, - 'core.component.component', - {} - >, - { - singleton: false; - optional: false; - } - >; - }; - kind: 'api'; - name: 'components'; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/icons': ExtensionDefinition<{ - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: { - icons: ExtensionInput< - ConfigurableExtensionDataRef< - { - [x: string]: IconComponent_2; - }, - 'core.icons', - {} - >, - { - singleton: false; - optional: false; - } - >; - }; - kind: 'api'; - name: 'icons'; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/feature-flags': ExtensionDefinition<{ - kind: 'api'; - name: 'feature-flags'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/translations': ExtensionDefinition<{ - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: { - translations: ExtensionInput< - ConfigurableExtensionDataRef< - | TranslationResource - | TranslationMessages< - string, - { - [x: string]: string; - }, - boolean - >, - 'core.translation.translation', - {} - >, - { - singleton: false; - optional: false; - } - >; - }; - kind: 'api'; - name: 'translations'; - params: { - factory: AnyApiFactory; - }; - }>; - 'app-root-element:app/oauth-request-dialog': ExtensionDefinition<{ - kind: 'app-root-element'; - name: 'oauth-request-dialog'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', - {} - >; - inputs: {}; - params: { - element: JSX.Element | (() => JSX.Element); - }; - }>; - 'app-root-element:app/alert-display': ExtensionDefinition<{ - config: { - transientTimeoutMs: number; - anchorOrigin: { - horizontal: 'center' | 'left' | 'right'; - vertical: 'top' | 'bottom'; - }; - }; - configInput: { - anchorOrigin?: - | { - horizontal?: 'center' | 'left' | 'right' | undefined; - vertical?: 'top' | 'bottom' | undefined; - } - | undefined; - transientTimeoutMs?: number | undefined; - }; - output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', - {} - >; - inputs: { - [x: string]: ExtensionInput< - AnyExtensionDataRef, - { - optional: boolean; - singleton: boolean; - } - >; - }; - kind: 'app-root-element'; - name: 'alert-display'; - params: { - element: JSX.Element | (() => JSX.Element); - }; - }>; - 'api:app/discovery': ExtensionDefinition<{ - kind: 'api'; - name: 'discovery'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; 'api:app/alert': ExtensionDefinition<{ kind: 'api'; name: 'alert'; @@ -495,9 +245,9 @@ const appPlugin: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'api:app/error': ExtensionDefinition<{ + 'api:app/app-language': ExtensionDefinition<{ kind: 'api'; - name: 'error'; + name: 'app-language'; config: {}; configInput: {}; output: ConfigurableExtensionDataRef< @@ -510,9 +260,7 @@ const appPlugin: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'api:app/storage': ExtensionDefinition<{ - kind: 'api'; - name: 'storage'; + 'api:app/app-theme': ExtensionDefinition<{ config: {}; configInput: {}; output: ConfigurableExtensionDataRef< @@ -520,119 +268,24 @@ const appPlugin: FrontendPlugin< 'core.api.factory', {} >; - inputs: {}; + inputs: { + themes: ExtensionInput< + ConfigurableExtensionDataRef, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'app-theme'; params: { factory: AnyApiFactory; }; }>; - 'api:app/fetch': ExtensionDefinition<{ + 'api:app/atlassian-auth': ExtensionDefinition<{ kind: 'api'; - name: 'fetch'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/oauth-request': ExtensionDefinition<{ - kind: 'api'; - name: 'oauth-request'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/google-auth': ExtensionDefinition<{ - kind: 'api'; - name: 'google-auth'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/microsoft-auth': ExtensionDefinition<{ - kind: 'api'; - name: 'microsoft-auth'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/github-auth': ExtensionDefinition<{ - kind: 'api'; - name: 'github-auth'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/okta-auth': ExtensionDefinition<{ - kind: 'api'; - name: 'okta-auth'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/gitlab-auth': ExtensionDefinition<{ - kind: 'api'; - name: 'gitlab-auth'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; - 'api:app/onelogin-auth': ExtensionDefinition<{ - kind: 'api'; - name: 'onelogin-auth'; + name: 'atlassian-auth'; config: {}; configInput: {}; output: ConfigurableExtensionDataRef< @@ -675,9 +328,39 @@ const appPlugin: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'api:app/atlassian-auth': ExtensionDefinition<{ + 'api:app/components': ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: { + components: ExtensionInput< + ConfigurableExtensionDataRef< + { + ref: ComponentRef; + impl: ComponentType; + }, + 'core.component.component', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; kind: 'api'; - name: 'atlassian-auth'; + name: 'components'; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/discovery': ExtensionDefinition<{ + kind: 'api'; + name: 'discovery'; config: {}; configInput: {}; output: ConfigurableExtensionDataRef< @@ -690,9 +373,173 @@ const appPlugin: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'api:app/vmware-cloud-auth': ExtensionDefinition<{ + 'api:app/error': ExtensionDefinition<{ kind: 'api'; - name: 'vmware-cloud-auth'; + name: 'error'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/feature-flags': ExtensionDefinition<{ + kind: 'api'; + name: 'feature-flags'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/fetch': ExtensionDefinition<{ + kind: 'api'; + name: 'fetch'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/github-auth': ExtensionDefinition<{ + kind: 'api'; + name: 'github-auth'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/gitlab-auth': ExtensionDefinition<{ + kind: 'api'; + name: 'gitlab-auth'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/google-auth': ExtensionDefinition<{ + kind: 'api'; + name: 'google-auth'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/icons': ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: { + icons: ExtensionInput< + ConfigurableExtensionDataRef< + { + [x: string]: IconComponent_2; + }, + 'core.icons', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'icons'; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/microsoft-auth': ExtensionDefinition<{ + kind: 'api'; + name: 'microsoft-auth'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/oauth-request': ExtensionDefinition<{ + kind: 'api'; + name: 'oauth-request'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/okta-auth': ExtensionDefinition<{ + kind: 'api'; + name: 'okta-auth'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/onelogin-auth': ExtensionDefinition<{ + kind: 'api'; + name: 'onelogin-auth'; config: {}; configInput: {}; output: ConfigurableExtensionDataRef< @@ -750,6 +597,159 @@ const appPlugin: FrontendPlugin< factory: AnyApiFactory; }; }>; + 'api:app/storage': ExtensionDefinition<{ + kind: 'api'; + name: 'storage'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/translations': ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: { + translations: ExtensionInput< + ConfigurableExtensionDataRef< + | TranslationResource + | TranslationMessages< + string, + { + [x: string]: string; + }, + boolean + >, + 'core.translation.translation', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'translations'; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:app/vmware-cloud-auth': ExtensionDefinition<{ + kind: 'api'; + name: 'vmware-cloud-auth'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'app-root-element:app/alert-display': ExtensionDefinition<{ + config: { + transientTimeoutMs: number; + anchorOrigin: { + horizontal: 'center' | 'left' | 'right'; + vertical: 'top' | 'bottom'; + }; + }; + configInput: { + anchorOrigin?: + | { + horizontal?: 'center' | 'left' | 'right' | undefined; + vertical?: 'top' | 'bottom' | undefined; + } + | undefined; + transientTimeoutMs?: number | undefined; + }; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: { + [x: string]: ExtensionInput< + AnyExtensionDataRef, + { + optional: boolean; + singleton: boolean; + } + >; + }; + kind: 'app-root-element'; + name: 'alert-display'; + params: { + element: JSX.Element | (() => JSX.Element); + }; + }>; + 'app-root-element:app/oauth-request-dialog': ExtensionDefinition<{ + kind: 'app-root-element'; + name: 'oauth-request-dialog'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: {}; + params: { + element: JSX.Element | (() => JSX.Element); + }; + }>; + 'sign-in-page:app': ExtensionDefinition<{ + kind: 'sign-in-page'; + name: undefined; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + ComponentType, + 'core.sign-in-page.component', + {} + >; + inputs: {}; + params: { + loader: () => Promise>; + }; + }>; + 'theme:app/dark': ExtensionDefinition<{ + kind: 'theme'; + name: 'dark'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef; + inputs: {}; + params: { + theme: AppTheme; + }; + }>; + 'theme:app/light': ExtensionDefinition<{ + kind: 'theme'; + name: 'light'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef; + inputs: {}; + params: { + theme: AppTheme; + }; + }>; } >; export default appPlugin; diff --git a/plugins/catalog-unprocessed-entities/report-alpha.api.md b/plugins/catalog-unprocessed-entities/report-alpha.api.md index 6b9a3a7713..b50a992370 100644 --- a/plugins/catalog-unprocessed-entities/report-alpha.api.md +++ b/plugins/catalog-unprocessed-entities/report-alpha.api.md @@ -19,6 +19,21 @@ const _default: FrontendPlugin< }, {}, { + 'api:catalog-unprocessed-entities': ExtensionDefinition<{ + kind: 'api'; + name: undefined; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; 'nav-item:catalog-unprocessed-entities': ExtensionDefinition<{ kind: 'nav-item'; name: undefined; @@ -40,21 +55,6 @@ const _default: FrontendPlugin< routeRef: RouteRef; }; }>; - 'api:catalog-unprocessed-entities': ExtensionDefinition<{ - kind: 'api'; - name: undefined; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; 'page:catalog-unprocessed-entities': ExtensionDefinition<{ kind: 'page'; name: undefined; diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md index 19b1260b2d..4961e2e9fb 100644 --- a/plugins/catalog/report-alpha.api.md +++ b/plugins/catalog/report-alpha.api.md @@ -148,27 +148,6 @@ const _default: FrontendPlugin< unregisterRedirect: ExternalRouteRef; }, { - 'nav-item:catalog': ExtensionDefinition<{ - kind: 'nav-item'; - name: undefined; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - { - title: string; - icon: IconComponent; - routeRef: RouteRef; - }, - 'core.nav-item.target', - {} - >; - inputs: {}; - params: { - title: string; - icon: IconComponent; - routeRef: RouteRef; - }; - }>; 'api:catalog': ExtensionDefinition<{ kind: 'api'; name: undefined; @@ -184,21 +163,6 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'api:catalog/starred-entities': ExtensionDefinition<{ - kind: 'api'; - name: 'starred-entities'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; 'api:catalog/entity-presentation': ExtensionDefinition<{ kind: 'api'; name: 'entity-presentation'; @@ -214,6 +178,177 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; + 'api:catalog/starred-entities': ExtensionDefinition<{ + kind: 'api'; + name: 'starred-entities'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'catalog-filter:catalog/kind': ExtensionDefinition<{ + config: { + initialFilter: string; + }; + configInput: { + initialFilter?: string | undefined; + }; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: { + [x: string]: ExtensionInput< + AnyExtensionDataRef, + { + optional: boolean; + singleton: boolean; + } + >; + }; + kind: 'catalog-filter'; + name: 'kind'; + params: { + loader: () => Promise; + }; + }>; + 'catalog-filter:catalog/lifecycle': ExtensionDefinition<{ + kind: 'catalog-filter'; + name: 'lifecycle'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: {}; + params: { + loader: () => Promise; + }; + }>; + 'catalog-filter:catalog/list': ExtensionDefinition<{ + config: { + initialFilter: 'all' | 'owned' | 'starred'; + }; + configInput: { + initialFilter?: 'all' | 'owned' | 'starred' | undefined; + }; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: { + [x: string]: ExtensionInput< + AnyExtensionDataRef, + { + optional: boolean; + singleton: boolean; + } + >; + }; + kind: 'catalog-filter'; + name: 'list'; + params: { + loader: () => Promise; + }; + }>; + 'catalog-filter:catalog/mode': ExtensionDefinition<{ + config: { + mode: 'all' | 'owners-only' | undefined; + }; + configInput: { + mode?: 'all' | 'owners-only' | undefined; + }; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: { + [x: string]: ExtensionInput< + AnyExtensionDataRef, + { + optional: boolean; + singleton: boolean; + } + >; + }; + kind: 'catalog-filter'; + name: 'mode'; + params: { + loader: () => Promise; + }; + }>; + 'catalog-filter:catalog/namespace': ExtensionDefinition<{ + kind: 'catalog-filter'; + name: 'namespace'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: {}; + params: { + loader: () => Promise; + }; + }>; + 'catalog-filter:catalog/processing-status': ExtensionDefinition<{ + kind: 'catalog-filter'; + name: 'processing-status'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: {}; + params: { + loader: () => Promise; + }; + }>; + 'catalog-filter:catalog/tag': ExtensionDefinition<{ + kind: 'catalog-filter'; + name: 'tag'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: {}; + params: { + loader: () => Promise; + }; + }>; + 'catalog-filter:catalog/type': ExtensionDefinition<{ + kind: 'catalog-filter'; + name: 'type'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + JSX_2.Element, + 'core.reactElement', + {} + >; + inputs: {}; + params: { + loader: () => Promise; + }; + }>; 'entity-card:catalog/about': ExtensionDefinition<{ kind: 'entity-card'; name: 'about'; @@ -255,88 +390,6 @@ const _default: FrontendPlugin< type?: EntityCardType | undefined; }; }>; - 'entity-card:catalog/links': ExtensionDefinition<{ - kind: 'entity-card'; - name: 'links'; - config: { - filter: string | undefined; - type: 'full' | 'info' | 'peek' | undefined; - }; - configInput: { - filter?: string | undefined; - type?: 'full' | 'info' | 'peek' | undefined; - }; - output: - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef< - (entity: Entity) => boolean, - 'catalog.entity-filter-function', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - string, - 'catalog.entity-filter-expression', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - EntityCardType, - 'catalog.entity-card-type', - { - optional: true; - } - >; - inputs: {}; - params: { - loader: () => Promise; - filter?: string | ((entity: Entity) => boolean) | undefined; - type?: EntityCardType | undefined; - }; - }>; - 'entity-card:catalog/labels': ExtensionDefinition<{ - kind: 'entity-card'; - name: 'labels'; - config: { - filter: string | undefined; - type: 'full' | 'info' | 'peek' | undefined; - }; - configInput: { - filter?: string | undefined; - type?: 'full' | 'info' | 'peek' | undefined; - }; - output: - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef< - (entity: Entity) => boolean, - 'catalog.entity-filter-function', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - string, - 'catalog.entity-filter-expression', - { - optional: true; - } - > - | ConfigurableExtensionDataRef< - EntityCardType, - 'catalog.entity-card-type', - { - optional: true; - } - >; - inputs: {}; - params: { - loader: () => Promise; - filter?: string | ((entity: Entity) => boolean) | undefined; - type?: EntityCardType | undefined; - }; - }>; 'entity-card:catalog/depends-on-components': ExtensionDefinition<{ kind: 'entity-card'; name: 'depends-on-components'; @@ -624,6 +677,88 @@ const _default: FrontendPlugin< type?: EntityCardType | undefined; }; }>; + 'entity-card:catalog/labels': ExtensionDefinition<{ + kind: 'entity-card'; + name: 'labels'; + config: { + filter: string | undefined; + type: 'full' | 'info' | 'peek' | undefined; + }; + configInput: { + filter?: string | undefined; + type?: 'full' | 'info' | 'peek' | undefined; + }; + output: + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + EntityCardType, + 'catalog.entity-card-type', + { + optional: true; + } + >; + inputs: {}; + params: { + loader: () => Promise; + filter?: string | ((entity: Entity) => boolean) | undefined; + type?: EntityCardType | undefined; + }; + }>; + 'entity-card:catalog/links': ExtensionDefinition<{ + kind: 'entity-card'; + name: 'links'; + config: { + filter: string | undefined; + type: 'full' | 'info' | 'peek' | undefined; + }; + configInput: { + filter?: string | undefined; + type?: 'full' | 'info' | 'peek' | undefined; + }; + output: + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + (entity: Entity) => boolean, + 'catalog.entity-filter-function', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + string, + 'catalog.entity-filter-expression', + { + optional: true; + } + > + | ConfigurableExtensionDataRef< + EntityCardType, + 'catalog.entity-card-type', + { + optional: true; + } + >; + inputs: {}; + params: { + loader: () => Promise; + filter?: string | ((entity: Entity) => boolean) | undefined; + type?: EntityCardType | undefined; + }; + }>; 'entity-content:catalog/overview': ExtensionDefinition<{ config: { path: string | undefined; @@ -745,160 +880,25 @@ const _default: FrontendPlugin< filter?: string | ((entity: Entity) => boolean) | undefined; }; }>; - 'catalog-filter:catalog/tag': ExtensionDefinition<{ - kind: 'catalog-filter'; - name: 'tag'; + 'nav-item:catalog': ExtensionDefinition<{ + kind: 'nav-item'; + name: undefined; config: {}; configInput: {}; output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', + { + title: string; + icon: IconComponent; + routeRef: RouteRef; + }, + 'core.nav-item.target', {} >; inputs: {}; params: { - loader: () => Promise; - }; - }>; - 'catalog-filter:catalog/kind': ExtensionDefinition<{ - config: { - initialFilter: string; - }; - configInput: { - initialFilter?: string | undefined; - }; - output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', - {} - >; - inputs: { - [x: string]: ExtensionInput< - AnyExtensionDataRef, - { - optional: boolean; - singleton: boolean; - } - >; - }; - kind: 'catalog-filter'; - name: 'kind'; - params: { - loader: () => Promise; - }; - }>; - 'catalog-filter:catalog/type': ExtensionDefinition<{ - kind: 'catalog-filter'; - name: 'type'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', - {} - >; - inputs: {}; - params: { - loader: () => Promise; - }; - }>; - 'catalog-filter:catalog/mode': ExtensionDefinition<{ - config: { - mode: 'all' | 'owners-only' | undefined; - }; - configInput: { - mode?: 'all' | 'owners-only' | undefined; - }; - output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', - {} - >; - inputs: { - [x: string]: ExtensionInput< - AnyExtensionDataRef, - { - optional: boolean; - singleton: boolean; - } - >; - }; - kind: 'catalog-filter'; - name: 'mode'; - params: { - loader: () => Promise; - }; - }>; - 'catalog-filter:catalog/namespace': ExtensionDefinition<{ - kind: 'catalog-filter'; - name: 'namespace'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', - {} - >; - inputs: {}; - params: { - loader: () => Promise; - }; - }>; - 'catalog-filter:catalog/lifecycle': ExtensionDefinition<{ - kind: 'catalog-filter'; - name: 'lifecycle'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', - {} - >; - inputs: {}; - params: { - loader: () => Promise; - }; - }>; - 'catalog-filter:catalog/processing-status': ExtensionDefinition<{ - kind: 'catalog-filter'; - name: 'processing-status'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', - {} - >; - inputs: {}; - params: { - loader: () => Promise; - }; - }>; - 'catalog-filter:catalog/list': ExtensionDefinition<{ - config: { - initialFilter: 'all' | 'owned' | 'starred'; - }; - configInput: { - initialFilter?: 'all' | 'owned' | 'starred' | undefined; - }; - output: ConfigurableExtensionDataRef< - JSX_2.Element, - 'core.reactElement', - {} - >; - inputs: { - [x: string]: ExtensionInput< - AnyExtensionDataRef, - { - optional: boolean; - singleton: boolean; - } - >; - }; - kind: 'catalog-filter'; - name: 'list'; - params: { - loader: () => Promise; + title: string; + icon: IconComponent; + routeRef: RouteRef; }; }>; 'page:catalog': ExtensionDefinition<{ diff --git a/plugins/devtools/report-alpha.api.md b/plugins/devtools/report-alpha.api.md index abef9dc11f..d76ac7c54f 100644 --- a/plugins/devtools/report-alpha.api.md +++ b/plugins/devtools/report-alpha.api.md @@ -19,6 +19,21 @@ const _default: FrontendPlugin< }, {}, { + 'api:devtools': ExtensionDefinition<{ + kind: 'api'; + name: undefined; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; 'nav-item:devtools': ExtensionDefinition<{ kind: 'nav-item'; name: undefined; @@ -40,21 +55,6 @@ const _default: FrontendPlugin< routeRef: RouteRef; }; }>; - 'api:devtools': ExtensionDefinition<{ - kind: 'api'; - name: undefined; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; 'page:devtools': ExtensionDefinition<{ kind: 'page'; name: undefined; diff --git a/plugins/kubernetes/report-alpha.api.md b/plugins/kubernetes/report-alpha.api.md index dd53fb5e73..ef824bc435 100644 --- a/plugins/kubernetes/report-alpha.api.md +++ b/plugins/kubernetes/report-alpha.api.md @@ -37,30 +37,49 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'page:kubernetes': ExtensionDefinition<{ - kind: 'page'; - name: undefined; - config: { - path: string | undefined; - }; - configInput: { - path?: string | undefined; - }; - output: - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef< - RouteRef, - 'core.routing.ref', - { - optional: true; - } - >; + 'api:kubernetes/auth-providers': ExtensionDefinition<{ + kind: 'api'; + name: 'auth-providers'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; inputs: {}; params: { - defaultPath: string; - loader: () => Promise; - routeRef?: RouteRef | undefined; + factory: AnyApiFactory; + }; + }>; + 'api:kubernetes/cluster-link-formatter': ExtensionDefinition<{ + kind: 'api'; + name: 'cluster-link-formatter'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; + 'api:kubernetes/proxy': ExtensionDefinition<{ + kind: 'api'; + name: 'proxy'; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; }; }>; 'entity-content:kubernetes/kubernetes': ExtensionDefinition<{ @@ -130,49 +149,30 @@ const _default: FrontendPlugin< filter?: string | ((entity: Entity) => boolean) | undefined; }; }>; - 'api:kubernetes/proxy': ExtensionDefinition<{ - kind: 'api'; - name: 'proxy'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; + 'page:kubernetes': ExtensionDefinition<{ + kind: 'page'; + name: undefined; + config: { + path: string | undefined; }; - }>; - 'api:kubernetes/auth-providers': ExtensionDefinition<{ - kind: 'api'; - name: 'auth-providers'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; + configInput: { + path?: string | undefined; }; - }>; - 'api:kubernetes/cluster-link-formatter': ExtensionDefinition<{ - kind: 'api'; - name: 'cluster-link-formatter'; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; + output: + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + RouteRef, + 'core.routing.ref', + { + optional: true; + } + >; inputs: {}; params: { - factory: AnyApiFactory; + defaultPath: string; + loader: () => Promise; + routeRef?: RouteRef | undefined; }; }>; } diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index 74a6ae276a..e5b370f2e2 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -53,7 +53,9 @@ const _default: FrontendPlugin< }>; }, { - 'api:scaffolder/form-fields': ExtensionDefinition<{ + 'api:scaffolder': ExtensionDefinition<{ + kind: 'api'; + name: undefined; config: {}; configInput: {}; output: ConfigurableExtensionDataRef< @@ -61,21 +63,7 @@ const _default: FrontendPlugin< 'core.api.factory', {} >; - inputs: { - formFields: ExtensionInput< - ConfigurableExtensionDataRef< - () => Promise, - 'scaffolder.form-field-loader', - {} - >, - { - singleton: false; - optional: false; - } - >; - }; - kind: 'api'; - name: 'form-fields'; + inputs: {}; params: { factory: AnyApiFactory; }; @@ -107,6 +95,54 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; + 'api:scaffolder/form-fields': ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: { + formFields: ExtensionInput< + ConfigurableExtensionDataRef< + () => Promise, + 'scaffolder.form-field-loader', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'form-fields'; + params: { + factory: AnyApiFactory; + }; + }>; + 'nav-item:scaffolder': ExtensionDefinition<{ + kind: 'nav-item'; + name: undefined; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + { + title: string; + icon: IconComponent; + routeRef: RouteRef; + }, + 'core.nav-item.target', + {} + >; + inputs: {}; + params: { + title: string; + icon: IconComponent; + routeRef: RouteRef; + }; + }>; 'page:scaffolder': ExtensionDefinition<{ config: { path: string | undefined; @@ -145,27 +181,6 @@ const _default: FrontendPlugin< routeRef?: RouteRef | undefined; }; }>; - 'nav-item:scaffolder': ExtensionDefinition<{ - kind: 'nav-item'; - name: undefined; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - { - title: string; - icon: IconComponent; - routeRef: RouteRef; - }, - 'core.nav-item.target', - {} - >; - inputs: {}; - params: { - title: string; - icon: IconComponent; - routeRef: RouteRef; - }; - }>; 'scaffolder-form-field:scaffolder/repo-url-picker': ExtensionDefinition<{ kind: 'scaffolder-form-field'; name: 'repo-url-picker'; @@ -181,21 +196,6 @@ const _default: FrontendPlugin< field: () => Promise; }; }>; - 'api:scaffolder': ExtensionDefinition<{ - kind: 'api'; - name: undefined; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; } >; export default _default; diff --git a/plugins/search/report-alpha.api.md b/plugins/search/report-alpha.api.md index 7581e1c25f..ad9b86c244 100644 --- a/plugins/search/report-alpha.api.md +++ b/plugins/search/report-alpha.api.md @@ -23,6 +23,21 @@ const _default: FrontendPlugin< }, {}, { + 'api:search': ExtensionDefinition<{ + kind: 'api'; + name: undefined; + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: {}; + params: { + factory: AnyApiFactory; + }; + }>; 'nav-item:search': ExtensionDefinition<{ kind: 'nav-item'; name: undefined; @@ -44,21 +59,6 @@ const _default: FrontendPlugin< routeRef: RouteRef; }; }>; - 'api:search': ExtensionDefinition<{ - kind: 'api'; - name: undefined; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - AnyApiFactory, - 'core.api.factory', - {} - >; - inputs: {}; - params: { - factory: AnyApiFactory; - }; - }>; 'page:search': ExtensionDefinition<{ config: { noTrack: boolean; diff --git a/plugins/techdocs/report-alpha.api.md b/plugins/techdocs/report-alpha.api.md index 136cf6f4a7..681961a33e 100644 --- a/plugins/techdocs/report-alpha.api.md +++ b/plugins/techdocs/report-alpha.api.md @@ -32,27 +32,6 @@ const _default: FrontendPlugin< }, {}, { - 'nav-item:techdocs': ExtensionDefinition<{ - kind: 'nav-item'; - name: undefined; - config: {}; - configInput: {}; - output: ConfigurableExtensionDataRef< - { - title: string; - icon: IconComponent; - routeRef: RouteRef; - }, - 'core.nav-item.target', - {} - >; - inputs: {}; - params: { - title: string; - icon: IconComponent; - routeRef: RouteRef; - }; - }>; 'api:techdocs': ExtensionDefinition<{ kind: 'api'; name: undefined; @@ -83,60 +62,15 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; - 'page:techdocs': ExtensionDefinition<{ - kind: 'page'; - name: undefined; - config: { - path: string | undefined; - }; - configInput: { - path?: string | undefined; - }; - output: - | ConfigurableExtensionDataRef< - React_2.JSX.Element, - 'core.reactElement', - {} - > - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef< - RouteRef, - 'core.routing.ref', - { - optional: true; - } - >; - inputs: {}; - params: { - defaultPath: string; - loader: () => Promise; - routeRef?: RouteRef | undefined; - }; - }>; - 'search-result-list-item:techdocs': ExtensionDefinition<{ - config: { - title: string | undefined; - lineClamp: number; - asLink: boolean; - asListItem: boolean; - } & { - noTrack: boolean; - }; - configInput: { - title?: string | undefined; - lineClamp?: number | undefined; - asListItem?: boolean | undefined; - asLink?: boolean | undefined; - } & { - noTrack?: boolean | undefined; - }; + 'empty-state:techdocs/entity-content': ExtensionDefinition<{ + config: {}; + configInput: {}; output: ConfigurableExtensionDataRef< + React_2.JSX.Element, + 'core.reactElement', { - predicate?: SearchResultItemExtensionPredicate | undefined; - component: SearchResultItemExtensionComponent; - }, - 'search.search-result-list-item.item', - {} + optional: true; + } >; inputs: { [x: string]: ExtensionInput< @@ -147,51 +81,9 @@ const _default: FrontendPlugin< } >; }; - kind: 'search-result-list-item'; - name: undefined; - params: SearchResultListItemBlueprintParams; - }>; - 'page:techdocs/reader': ExtensionDefinition<{ - config: { - path: string | undefined; - }; - configInput: { - path?: string | undefined; - }; - output: - | ConfigurableExtensionDataRef< - React_2.JSX.Element, - 'core.reactElement', - {} - > - | ConfigurableExtensionDataRef - | ConfigurableExtensionDataRef< - RouteRef, - 'core.routing.ref', - { - optional: true; - } - >; - inputs: { - addons: ExtensionInput< - ConfigurableExtensionDataRef< - TechDocsAddonOptions, - 'techdocs.addon', - {} - >, - { - singleton: false; - optional: false; - } - >; - }; - kind: 'page'; - name: 'reader'; - params: { - defaultPath: string; - loader: () => Promise; - routeRef?: RouteRef | undefined; - }; + params: never; + kind: 'empty-state'; + name: 'entity-content'; }>; 'entity-content:techdocs': ExtensionDefinition<{ config: { @@ -289,15 +181,123 @@ const _default: FrontendPlugin< filter?: string | ((entity: Entity) => boolean) | undefined; }; }>; - 'empty-state:techdocs/entity-content': ExtensionDefinition<{ + 'nav-item:techdocs': ExtensionDefinition<{ + kind: 'nav-item'; + name: undefined; config: {}; configInput: {}; output: ConfigurableExtensionDataRef< - React_2.JSX.Element, - 'core.reactElement', { - optional: true; - } + title: string; + icon: IconComponent; + routeRef: RouteRef; + }, + 'core.nav-item.target', + {} + >; + inputs: {}; + params: { + title: string; + icon: IconComponent; + routeRef: RouteRef; + }; + }>; + 'page:techdocs': ExtensionDefinition<{ + kind: 'page'; + name: undefined; + config: { + path: string | undefined; + }; + configInput: { + path?: string | undefined; + }; + output: + | ConfigurableExtensionDataRef< + React_2.JSX.Element, + 'core.reactElement', + {} + > + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + RouteRef, + 'core.routing.ref', + { + optional: true; + } + >; + inputs: {}; + params: { + defaultPath: string; + loader: () => Promise; + routeRef?: RouteRef | undefined; + }; + }>; + 'page:techdocs/reader': ExtensionDefinition<{ + config: { + path: string | undefined; + }; + configInput: { + path?: string | undefined; + }; + output: + | ConfigurableExtensionDataRef< + React_2.JSX.Element, + 'core.reactElement', + {} + > + | ConfigurableExtensionDataRef + | ConfigurableExtensionDataRef< + RouteRef, + 'core.routing.ref', + { + optional: true; + } + >; + inputs: { + addons: ExtensionInput< + ConfigurableExtensionDataRef< + TechDocsAddonOptions, + 'techdocs.addon', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'page'; + name: 'reader'; + params: { + defaultPath: string; + loader: () => Promise; + routeRef?: RouteRef | undefined; + }; + }>; + 'search-result-list-item:techdocs': ExtensionDefinition<{ + config: { + title: string | undefined; + lineClamp: number; + asLink: boolean; + asListItem: boolean; + } & { + noTrack: boolean; + }; + configInput: { + title?: string | undefined; + lineClamp?: number | undefined; + asListItem?: boolean | undefined; + asLink?: boolean | undefined; + } & { + noTrack?: boolean | undefined; + }; + output: ConfigurableExtensionDataRef< + { + predicate?: SearchResultItemExtensionPredicate | undefined; + component: SearchResultItemExtensionComponent; + }, + 'search.search-result-list-item.item', + {} >; inputs: { [x: string]: ExtensionInput< @@ -308,9 +308,9 @@ const _default: FrontendPlugin< } >; }; - params: never; - kind: 'empty-state'; - name: 'entity-content'; + kind: 'search-result-list-item'; + name: undefined; + params: SearchResultListItemBlueprintParams; }>; } >;