From b6e64d4acd6fddc450f5115bdf07d701dc852058 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 18 Apr 2024 14:33:37 +0200 Subject: [PATCH] add a new type `appEntryPoint` and a corresponding initializer and load them up in the app element --- .../src/apps/app/app.element.ts | 5 ++- .../app-entry-point-extension-initializer.ts | 34 +++++++++++++++++++ .../libs/extension-api/initializers/index.ts | 1 + .../src/libs/extension-api/types/index.ts | 1 + .../manifest-app-entrypoint.interface.ts | 10 ++++++ 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/app-entry-point-extension-initializer.ts create mode 100644 src/Umbraco.Web.UI.Client/src/libs/extension-api/types/manifest-app-entrypoint.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index e38042a8b6..3ced70e5a4 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -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); diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/app-entry-point-extension-initializer.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/app-entry-point-extension-initializer.ts new file mode 100644 index 0000000000..9167e1c8bd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/app-entry-point-extension-initializer.ts @@ -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) { + 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. + } +} diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/index.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/index.ts index b89ddacc4c..38b630c03a 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/index.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/initializers/index.ts @@ -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'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/index.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/index.ts index 4bb9e60d1c..6577a9fccc 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/index.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/index.ts @@ -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'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/manifest-app-entrypoint.interface.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/manifest-app-entrypoint.interface.ts new file mode 100644 index 0000000000..72bf874044 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types/manifest-app-entrypoint.interface.ts @@ -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 { + type: 'appEntryPoint'; +}