add a new type appEntryPoint and a corresponding initializer and load them up in the app element

This commit is contained in:
Jacob Overgaard
2024-04-18 14:33:37 +02:00
parent 448a03b12a
commit b6e64d4acd
5 changed files with 48 additions and 3 deletions

View File

@@ -14,8 +14,8 @@ import { pathWithoutBasePath } from '@umbraco-cms/backoffice/router';
import { OpenAPI, RuntimeLevelModel } from '@umbraco-cms/backoffice/external/backend-api';
import { UmbContextDebugController } from '@umbraco-cms/backoffice/debug';
import {
UmbAppEntryPointExtensionInitializer,
UmbBundleExtensionInitializer,
UmbEntryPointExtensionInitializer,
UmbServerExtensionRegistrator,
} from '@umbraco-cms/backoffice/extension-api';
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
@@ -85,8 +85,7 @@ export class UmbAppElement extends UmbLitElement {
new UmbBundleExtensionInitializer(this, umbExtensionsRegistry);
// Initialise any entryPoints that export the 'beforeInit' function
new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry, 'beforeInit');
new UmbAppEntryPointExtensionInitializer(this, umbExtensionsRegistry);
new UmbIconRegistry().attach(this);
new UUIIconRegistryEssential().attach(this);

View File

@@ -0,0 +1,34 @@
import type { ManifestAppEntryPoint } from '../types/index.js';
import { hasInitExport, loadManifestPlainJs } from '../functions/index.js';
import type { UmbExtensionRegistry } from '../registry/extension.registry.js';
import { UmbExtensionInitializerBase } from './extension-initializer-base.js';
import type { UmbElement } from '@umbraco-cms/backoffice/element-api';
/**
* Extension initializer for the `appEntryPoint` extension type
*/
export class UmbAppEntryPointExtensionInitializer extends UmbExtensionInitializerBase<
'appEntryPoint',
ManifestAppEntryPoint
> {
constructor(host: UmbElement, extensionRegistry: UmbExtensionRegistry<ManifestAppEntryPoint>) {
super(host, extensionRegistry, 'appEntryPoint');
}
async instantiateExtension(manifest: ManifestAppEntryPoint) {
if (manifest.js) {
const js = await loadManifestPlainJs(manifest.js);
// If the extension has known exports, be sure to run those
if (hasInitExport(js)) {
js.onInit(this.host, this.extensionRegistry);
}
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
unloadExtension(_manifest: ManifestAppEntryPoint): void {
// No-op
// Entry points are not unloaded, but if they were, this is where you would do it.
}
}

View File

@@ -1,3 +1,4 @@
export * from './app-entry-point-extension-initializer.js';
export * from './bundle-extension-initializer.js';
export * from './entry-point-extension-initializer.js';
export * from './extension-initializer-base.js';

View File

@@ -1,5 +1,6 @@
export * from './base.types.js';
export * from './condition.types.js';
export * from './manifest-app-entrypoint.interface.js';
export * from './manifest-base.interface.js';
export * from './manifest-bundle.interface.js';
export * from './manifest-condition.interface.js';

View File

@@ -0,0 +1,10 @@
import type { UmbEntryPointModule } from '../models/index.js';
import type { ManifestPlainJs } from './base.types.js';
/**
* This type of extension gives full control and will simply load the specified JS file
* You could have custom logic to decide which extensions to load/register by using extensionRegistry
*/
export interface ManifestAppEntryPoint extends ManifestPlainJs<UmbEntryPointModule> {
type: 'appEntryPoint';
}