diff --git a/packages/frontend-plugin-api/api-report.md b/packages/frontend-plugin-api/api-report.md index e83d963348..85bb6aa996 100644 --- a/packages/frontend-plugin-api/api-report.md +++ b/packages/frontend-plugin-api/api-report.md @@ -17,7 +17,9 @@ import { ZodSchema } from 'zod'; import { ZodTypeDef } from 'zod'; // @public (undocumented) -export type AnyExtensionDataMap = Record>; +export type AnyExtensionDataMap = { + [name in string]: ExtensionDataRef; +}; // @public (undocumented) export interface BackstagePlugin { @@ -29,12 +31,48 @@ export interface BackstagePlugin { id: string; } +// @public (undocumented) +export interface ConfigurableExtensionDataRef< + TData, + TConfig extends { + optional: boolean; + }, +> extends ExtensionDataRef { + // (undocumented) + optional(): ConfigurableExtensionDataRef< + TData, + TData & { + optional: true; + } + >; +} + // @public (undocumented) export const coreExtensionData: { - reactComponent: ExtensionDataRef>; - routePath: ExtensionDataRef; - apiFactory: ExtensionDataRef; - routeRef: ExtensionDataRef>; + reactComponent: ConfigurableExtensionDataRef< + ComponentType<{}>, + { + optional: false; + } + >; + routePath: ConfigurableExtensionDataRef< + string, + { + optional: false; + } + >; + apiFactory: ConfigurableExtensionDataRef< + AnyApiFactory, + { + optional: false; + } + >; + routeRef: ConfigurableExtensionDataRef< + RouteRef, + { + optional: false; + } + >; }; // @public (undocumented) @@ -52,11 +90,7 @@ export function createApiExtension< api: AnyApiRef; factory: (options: { config: TConfig; - inputs: { - [pointName in keyof TInputs]: ExtensionDataValue< - TInputs[pointName]['extensionData'] - >[]; - }; + inputs: ExtensionDataInputValues; }) => AnyApiFactory; } | { @@ -70,23 +104,32 @@ export function createApiExtension< // @public (undocumented) export function createExtension< - TData extends AnyExtensionDataMap, - TPoint extends Record< + TOutput extends AnyExtensionDataMap, + TInputs extends Record< string, { extensionData: AnyExtensionDataMap; } >, TConfig = never, ->(options: CreateExtensionOptions): Extension; +>( + options: CreateExtensionOptions, +): Extension; // @public (undocumented) -export function createExtensionDataRef(id: string): ExtensionDataRef; +export function createExtensionDataRef( + id: string, +): ConfigurableExtensionDataRef< + TData, + { + optional: false; + } +>; // @public (undocumented) export interface CreateExtensionOptions< - TData extends AnyExtensionDataMap, - TPoint extends Record< + TOutput extends AnyExtensionDataMap, + TInputs extends Record< string, { extensionData: AnyExtensionDataMap; @@ -103,20 +146,16 @@ export interface CreateExtensionOptions< // (undocumented) factory(options: { source?: BackstagePlugin; - bind: ExtensionDataBind; + bind: ExtensionDataBind; config: TConfig; - inputs: { - [pointName in keyof TPoint]: ExtensionDataValue< - TPoint[pointName]['extensionData'] - >[]; - }; + inputs: ExtensionDataInputValues; }): void; // (undocumented) id: string; // (undocumented) - inputs?: TPoint; + inputs?: TInputs; // (undocumented) - output: TData; + output: TOutput; } // @public @@ -146,11 +185,7 @@ export function createPageExtension< routeRef?: RouteRef; component: (props: { config: TConfig; - inputs: { - [pointName in keyof TInputs]: ExtensionDataValue< - TInputs[pointName]['extensionData'] - >[]; - }; + inputs: ExtensionDataInputValues; }) => Promise; }, ): Extension; @@ -207,22 +242,62 @@ export interface ExtensionBoundaryProps { } // @public (undocumented) -export type ExtensionDataBind = { - [K in keyof TData]: (value: TData[K]['T']) => void; +export type ExtensionDataBind = ( + values: { + [DataName in keyof TMap as TMap[DataName]['config'] extends { + optional: false; + } + ? DataName + : never]: TMap[DataName]['T']; + } & { + [DataName in keyof TMap as TMap[DataName]['config'] extends { + optional: true; + } + ? DataName + : never]?: TMap[DataName]['T']; + }, +) => void; + +// @public (undocumented) +export type ExtensionDataInputValues< + TInputs extends { + [name in string]: { + extensionData: AnyExtensionDataMap; + }; + }, +> = { + [InputName in keyof TInputs]: Array< + { + [DataName in keyof TInputs[InputName]['extensionData'] as TInputs[InputName]['extensionData'][DataName]['config'] extends { + optional: true; + } + ? DataName + : never]?: TInputs[InputName]['extensionData'][DataName]['T']; + } & { + [DataName in keyof TInputs[InputName]['extensionData'] as TInputs[InputName]['extensionData'][DataName]['config'] extends { + optional: false; + } + ? DataName + : never]: TInputs[InputName]['extensionData'][DataName]['T']; + } + >; }; // @public (undocumented) -export type ExtensionDataRef = { +export type ExtensionDataRef< + TData, + TConfig extends { + optional: boolean; + } = { + optional: false; + }, +> = { id: string; - T: T; + T: TData; + config: TConfig; $$type: 'extension-data'; }; -// @public (undocumented) -export type ExtensionDataValue = { - [K in keyof TData]: TData[K]['T']; -}; - // @public (undocumented) export interface PluginOptions { // (undocumented) diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts b/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts index 95e8bdeb95..0a3cfa5951 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts @@ -33,8 +33,8 @@ export interface ConfigurableExtensionDataRef< optional(): ConfigurableExtensionDataRef; } -/** @public */ // TODO: change to options object with ID. +/** @public */ export function createExtensionDataRef( id: string, ): ConfigurableExtensionDataRef { diff --git a/packages/frontend-plugin-api/src/wiring/index.ts b/packages/frontend-plugin-api/src/wiring/index.ts index 4830d7dd88..175200cf0c 100644 --- a/packages/frontend-plugin-api/src/wiring/index.ts +++ b/packages/frontend-plugin-api/src/wiring/index.ts @@ -24,6 +24,7 @@ export { export { createExtensionDataRef, type ExtensionDataRef, + type ConfigurableExtensionDataRef, } from './createExtensionDataRef'; export { createPlugin,