implement createExtensionElementWithApi

This commit is contained in:
Niels Lyngsø
2024-03-03 18:57:37 +01:00
parent 08b0321ee3
commit 46e3b56f08
4 changed files with 16 additions and 18 deletions

View File

@@ -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...
}
}

View File

@@ -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<ManifestType, any> = 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<ExtensionInterface['ELEMENT_TYPE']>,
ExtensionApiInterface extends UmbApi = NonNullable<ExtensionInterface['API_TYPE']>,
> extends UmbBaseExtensionInitializer<ManifestType, ControllerType> {
#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?.();

View File

@@ -12,14 +12,14 @@ export async function createExtensionElementWithApi<
manifest: ManifestElementAndApi<ElementType, ApiType>,
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<ApiType>(apiPropValue);
let apiConstructor: ClassConstructor<ApiType> | 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 {};
}

View File

@@ -7,6 +7,7 @@ import type {
ElementLoaderProperty,
JsLoaderProperty,
} from './utils.js';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
export interface ManifestWithView<ElementType extends HTMLElement = HTMLElement> extends ManifestElement<ElementType> {
meta: MetaManifestWithView;
@@ -93,8 +94,10 @@ export interface ManifestElement<ElementType extends HTMLElement = HTMLElement>
meta?: unknown;
}
export interface ManifestElementAndApi<ElementType extends HTMLElement = HTMLElement, ApiType extends UmbApi = UmbApi>
extends ManifestBase {
export interface ManifestElementAndApi<
ElementType extends UmbControllerHostElement = UmbControllerHostElement,
ApiType extends UmbApi = UmbApi,
> extends ManifestBase {
/**
* @TJS-ignore
*/