From f30705fc23121030aa875f11b2d0bf12c04cf795 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 31 Jul 2024 14:00:06 +0200 Subject: [PATCH] chore: some more exploration Signed-off-by: blam --- packages/app-next/src/App.tsx | 4 +- .../src/extensions/createPageExtension.tsx | 2 +- .../src/wiring/createExtension.ts | 94 ++++++++++++++++++- plugins/home/src/alpha.tsx | 4 - 4 files changed, 95 insertions(+), 9 deletions(-) diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index 25d1aacf8f..a33b2de8dc 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -115,8 +115,8 @@ TODO: // }); const homePageExtension = extensions.homePage.override({ - factory() { - return { children: homePage, title: 'just a title' }; + factory(origi) { + return origi(); }, }); diff --git a/packages/frontend-plugin-api/src/extensions/createPageExtension.tsx b/packages/frontend-plugin-api/src/extensions/createPageExtension.tsx index b10901f1bd..efe6ab54d9 100644 --- a/packages/frontend-plugin-api/src/extensions/createPageExtension.tsx +++ b/packages/frontend-plugin-api/src/extensions/createPageExtension.tsx @@ -127,7 +127,7 @@ export function createNewPageExtension< inputs: Expand>; }) => Promise; }, -): ExtensionDefinition { +) { const configSchema = 'configSchema' in options ? options.configSchema diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.ts b/packages/frontend-plugin-api/src/wiring/createExtension.ts index 2a29fe1ab4..6684323b51 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.ts @@ -20,6 +20,7 @@ import { Expand } from '../types'; import { AnyExtensionDataRef, ExtensionDataRef, + ExtensionDataRefToValue, ExtensionDataValue, } from './createExtensionDataRef'; import { ExtensionInput, LegacyExtensionInput } from './createExtensionInput'; @@ -234,6 +235,79 @@ export interface ExtensionDefinition { readonly configSchema?: PortableSchema; } +export type OverrideExtensionOptions< + UOutput extends AnyExtensionDataRef, + TInputs extends { + [inputName in string]: ExtensionInput< + AnyExtensionDataRef, + { optional: boolean; singleton: boolean } + >; + }, + TConfig, + TConfigInput, + TConfigSchema extends { [key: string]: (zImpl: typeof z) => z.ZodType }, + UFactoryOutput extends ExtensionDataValue, +> = { + kind?: string; + namespace?: string; + name?: string; + attachTo?: { id: string; input: string }; + disabled?: boolean; + inputs?: TInputs; + output: Array; + /** @deprecated - use `config.schema` instead */ + configSchema?: PortableSchema; + config?: { + schema: TConfigSchema; + }; + factory?( + originalFactory: (context?: { + config?: { + [key in keyof TConfigSchema]: z.infer>; + }; + inputs?: Expand>; + }) => Iterable>, + context: { + node: AppNode; + config: TConfig & + (string extends keyof TConfigSchema + ? {} + : { + [key in keyof TConfigSchema]: z.infer< + ReturnType + >; + }); + inputs: Expand>; + }, + ): Iterable; +} & VerifyExtensionFactoryOutput; + +/** @public */ +export type OverridableExtension< + UOutput extends AnyExtensionDataRef, + TInputs extends { + [inputName in string]: ExtensionInput< + AnyExtensionDataRef, + { optional: boolean; singleton: boolean } + >; + }, + TConfig, + TConfigInput, + TConfigSchema extends { [key: string]: (zImpl: typeof z) => z.ZodType }, + UFactoryOutput extends ExtensionDataValue, +> = { + override( + options: OverrideExtensionOptions< + UOutput, + TInputs, + TConfig, + TConfigInput, + TConfigSchema, + UFactoryOutput + >, + ): ExtensionDefinition; +}; + /** @internal */ export type InternalExtensionDefinition = ExtensionDefinition & @@ -329,7 +403,15 @@ export function createExtension< [key in keyof TConfigSchema]: ReturnType; }> >) ->; +> & + OverridableExtension< + UOutput, + TInputs, + TConfig, + TConfigInput, + TConfigSchema, + UFactoryOutput + >; /** * @public * @deprecated - use the array format of `output` instead, see TODO-doc-link @@ -409,7 +491,15 @@ export function createExtension< [key in keyof TConfigSchema]: ReturnType; }> >) -> { +> & + OverridableExtension< + UOutput, + TInputs, + TConfig, + TConfigInput, + TConfigSchema, + UFactoryOutput + > { const newConfigSchema = options.config?.schema; if (newConfigSchema && options.configSchema) { throw new Error(`Cannot provide both configSchema and config.schema`); diff --git a/plugins/home/src/alpha.tsx b/plugins/home/src/alpha.tsx index 109eea333e..31851726e5 100644 --- a/plugins/home/src/alpha.tsx +++ b/plugins/home/src/alpha.tsx @@ -66,10 +66,6 @@ const homePage = createNewPageExtension({ ), }); -homePage.override({ - factory() {}, -}); - // const homePage2 = PageExtensionBlueprint.make({ // inputs: { // props: createExtensionInput(