From 46e3b56f08b2079b6ea4d0cfe3b9f134366a0b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Sun, 3 Mar 2024 18:57:37 +0100 Subject: [PATCH] implement createExtensionElementWithApi --- .../base-extension-initializer.controller.ts | 1 - ...-element-and-api-initializer.controller.ts | 20 ++++++++----------- ...ate-extension-element-with-api.function.ts | 6 +++--- .../libs/extension-api/types/base.types.ts | 7 +++++-- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts index 6e6a9cebed..af136815ff 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/base-extension-initializer.controller.ts @@ -317,6 +317,5 @@ export abstract class UmbBaseExtensionInitializer< this.#onPermissionChanged = undefined; (this.#extensionRegistry as any) = undefined; super.destroy(); - // Destroy the conditions controllers, they are begin destroyed cause they are controllers... } } diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-and-api-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-and-api-initializer.controller.ts index 8d5d680a67..484c759352 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-and-api-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/extension-element-and-api-initializer.controller.ts @@ -1,10 +1,9 @@ -import { createExtensionApi } from '../functions/create-extension-api.function.js'; -import { createExtensionElement } from '../functions/create-extension-element.function.js'; +import { createExtensionElementWithApi } from '../functions/create-extension-element-with-api.function.js'; import type { UmbApi } from '../models/api.interface.js'; import type { UmbExtensionRegistry } from '../registry/extension.registry.js'; import type { ManifestElementAndApi, ManifestCondition, ManifestWithDynamicConditions } from '../types/index.js'; import { UmbBaseExtensionInitializer } from './base-extension-initializer.controller.js'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbControllerHost, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; /** * This Controller manages a single Extension initializing its Element and API. @@ -21,8 +20,8 @@ export class UmbExtensionElementAndApiInitializer< ManifestType extends ManifestWithDynamicConditions = ManifestWithDynamicConditions, ControllerType extends UmbExtensionElementAndApiInitializer = any, ExtensionInterface extends ManifestElementAndApi = ManifestType extends ManifestElementAndApi ? ManifestType : never, - ExtensionElementInterface extends HTMLElement | undefined = ExtensionInterface['ELEMENT_TYPE'], - ExtensionApiInterface extends UmbApi | undefined = ExtensionInterface['API_TYPE'], + ExtensionElementInterface extends UmbControllerHostElement = NonNullable, + ExtensionApiInterface extends UmbApi = NonNullable, > extends UmbBaseExtensionInitializer { #defaultElement?: string; #component?: ExtensionElementInterface; @@ -97,13 +96,10 @@ export class UmbExtensionElementAndApiInitializer< protected async _conditionsAreGood() { const manifest = this.manifest!; // In this case we are sure its not undefined. - const promises = await Promise.all([ - createExtensionApi(manifest, this.#constructorArguments), - createExtensionElement(manifest, this.#defaultElement), - ]); - - const newApi = promises[0] as ExtensionApiInterface; - const newComponent = promises[1] as ExtensionElementInterface; + const { element: newComponent, api: newApi } = await createExtensionElementWithApi< + ExtensionElementInterface, + ExtensionApiInterface + >(manifest, this.#defaultElement, this.#constructorArguments); if (!this._isConditionsPositive) { newApi?.destroy?.(); diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element-with-api.function.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element-with-api.function.ts index 0bda2fd66b..903234f7b9 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element-with-api.function.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/create-extension-element-with-api.function.ts @@ -12,14 +12,14 @@ export async function createExtensionElementWithApi< manifest: ManifestElementAndApi, fallbackElement?: string, constructorArgs?: unknown[], -): Promise<{ element: ElementType; api: ApiType } | undefined> { +): Promise<{ element?: ElementType; api?: ApiType }> { const apiPropValue = manifest.api ?? manifest.js; if (!apiPropValue) { console.error( `-- Extension of alias "${manifest.alias}" did not succeed creating an api class instance, missing a JavaScript file via the 'api' or 'js' property, using either a 'api' or 'default'(not supported on the JS property) export`, manifest, ); - return undefined; + return {}; } const apiPromise = loadManifestApi(apiPropValue); let apiConstructor: ClassConstructor | undefined; @@ -62,5 +62,5 @@ export async function createExtensionElementWithApi< `-- Extension of alias "${manifest.alias}" did not succeed creating an element with api, missing one or two JavaScript files via the 'element' and 'api' or the 'js' property or with just 'api' and the Element Name in 'elementName' in the manifest.`, manifest, ); - return undefined; + return {}; } diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/base.types.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/base.types.ts index 017f59aea0..1874e60ebc 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/base.types.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/base.types.ts @@ -7,6 +7,7 @@ import type { ElementLoaderProperty, JsLoaderProperty, } from './utils.js'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export interface ManifestWithView extends ManifestElement { meta: MetaManifestWithView; @@ -93,8 +94,10 @@ export interface ManifestElement meta?: unknown; } -export interface ManifestElementAndApi - extends ManifestBase { +export interface ManifestElementAndApi< + ElementType extends UmbControllerHostElement = UmbControllerHostElement, + ApiType extends UmbApi = UmbApi, +> extends ManifestBase { /** * @TJS-ignore */