From 33007738c5b07734c4e5c790a34cc0ba3ba84aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 28 Aug 2023 14:53:39 +0200 Subject: [PATCH] UmbServerExtensionRegistrator --- .../.vscode/settings.json | 1 + .../src/apps/backoffice/backoffice.element.ts | 10 +++++-- ...erver-extension-registrator.controller.ts} | 30 +++---------------- .../bundle-extension-initializer.ts | 7 +++-- 4 files changed, 16 insertions(+), 32 deletions(-) rename src/Umbraco.Web.UI.Client/src/apps/backoffice/{extension-initializer.controller.ts => server-extension-registrator.controller.ts} (77%) diff --git a/src/Umbraco.Web.UI.Client/.vscode/settings.json b/src/Umbraco.Web.UI.Client/.vscode/settings.json index ff2e1d51f3..15492763ab 100644 --- a/src/Umbraco.Web.UI.Client/.vscode/settings.json +++ b/src/Umbraco.Web.UI.Client/.vscode/settings.json @@ -8,6 +8,7 @@ "invariantable", "Niels", "pickable", + "Registrator", "templating", "tinymce", "umbraco", diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts index b3c052fa4b..132bdd81d5 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts @@ -1,5 +1,5 @@ import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context.js'; -import { UmbExtensionInitializer } from './extension-initializer.controller.js'; +import { UmbServerExtensionRegistrator } from './server-extension-registrator.controller.js'; import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -43,9 +43,13 @@ export class UmbBackofficeElement extends UmbLitElement { this.provideContext(UMB_BACKOFFICE_CONTEXT_TOKEN, new UmbBackofficeContext(this)); new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry); + new UmbServerExtensionRegistrator(this, umbExtensionsRegistry); - const extensionInitializer = new UmbExtensionInitializer(this, umbExtensionsRegistry); - extensionInitializer.setLocalPackages(CORE_PACKAGES); + // So far local packages are this simple to registerer, so no need for a manager to do that: + CORE_PACKAGES.forEach(async (packageImport) => { + const packageModule = await packageImport; + umbExtensionsRegistry.registerMany(packageModule.extensions); + }); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/extension-initializer.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts similarity index 77% rename from src/Umbraco.Web.UI.Client/src/apps/backoffice/extension-initializer.controller.ts rename to src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts index 4c846ebe4c..fc56c583c0 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/extension-initializer.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/server-extension-registrator.controller.ts @@ -1,44 +1,22 @@ -import { Subject } from '@umbraco-cms/backoffice/external/rxjs'; import { PackageResource, OpenAPI } from '@umbraco-cms/backoffice/backend-api'; import { UmbBaseController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { ManifestBase, isManifestJSType } from '@umbraco-cms/backoffice/extension-api'; -// TODO: consider if this can be replaced by the new extension controllers. +// TODO: consider if this can be replaced by the new extension controllers // TODO: move local part out of this, and name something with server. -export class UmbExtensionInitializer extends UmbBaseController { +export class UmbServerExtensionRegistrator extends UmbBaseController { #extensionRegistry: UmbBackofficeExtensionRegistry; - #unobserve = new Subject(); - #localPackages: Array> = []; #apiBaseUrl = OpenAPI.BASE; constructor(host: UmbControllerHost, extensionRegistry: UmbBackofficeExtensionRegistry) { - super(host, UmbExtensionInitializer.name); + super(host, UmbServerExtensionRegistrator.name); this.#extensionRegistry = extensionRegistry; - } - - setLocalPackages(localPackages: Array>) { - this.#localPackages = localPackages; - this.#loadLocalPackages(); - } - - hostConnected(): void { + // TODO: This was before in hostConnected(), but I don't see the reason to wait. lets just do it right away. this.#loadServerPackages(); } - hostDisconnected(): void { - this.#unobserve.next(); - this.#unobserve.complete(); - } - - async #loadLocalPackages() { - this.#localPackages.forEach(async (packageImport) => { - const packageModule = await packageImport; - this.#extensionRegistry.registerMany(packageModule.extensions); - }); - } - async #loadServerPackages() { /* TODO: we need a new endpoint here, to remove the dependency on the package repository, to get the modules available for the backoffice scope / we will need a similar endpoint for the login, installer etc at some point. diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/bundle-extension-initializer.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/bundle-extension-initializer.ts index 72350d2002..f35a77972d 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/bundle-extension-initializer.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/bundle-extension-initializer.ts @@ -1,15 +1,16 @@ import type { ManifestBase, ManifestBundle } from './types.js'; import { loadExtension } from './load-extension.function.js'; import { UmbExtensionRegistry } from './registry/extension.registry.js'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBaseController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -export class UmbBundleExtensionInitializer { +export class UmbBundleExtensionInitializer extends UmbBaseController { #extensionRegistry; #bundleMap = new Map(); constructor(host: UmbControllerHostElement, extensionRegistry: UmbExtensionRegistry) { + super(host); this.#extensionRegistry = extensionRegistry; - extensionRegistry.extensionsOfType('bundle').subscribe((bundles) => { + this.observe(extensionRegistry.extensionsOfType('bundle'), (bundles) => { // Unregister removed bundles: this.#bundleMap.forEach((existingBundle) => { if (!bundles.find((b) => b.alias === existingBundle.alias)) {