From 5201dd6ca0ca729b0aff2a11979ace16da29d56f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 13 Sep 2024 13:32:12 +0200 Subject: [PATCH] global type definition --- .../extension-registry/conditions/types.ts | 38 ++++++++++++++++--- .../models/collection-action.model.ts | 5 ++- .../models/collection-view.model.ts | 3 +- .../models/collection.models.ts | 5 ++- .../models/current-user-action.model.ts | 3 +- .../models/dashboard.model.ts | 3 +- 6 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts index 2c4296cae0..72219b0bb7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts @@ -12,11 +12,6 @@ import type { import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api'; import type { UmbDocumentUserPermissionConditionConfig } from '@umbraco-cms/backoffice/document'; -/* TODO: in theory should't the core package import from other packages. -Are there any other way we can do this? -Niels: Sadly I don't see any other solutions currently. But are very open for ideas :-) now that I think about it maybe there is some ability to extend a global type, similar to the 'declare global' trick we use on Elements. -*/ - // temp location to avoid circular dependencies export type BlockWorkspaceHasSettingsConditionConfig = UmbConditionConfigBase<'Umb.Condition.BlockWorkspaceHasSettings'>; @@ -38,3 +33,36 @@ export type ConditionTypes = | WorkspaceAliasConditionConfig | WorkspaceContentTypeAliasConditionConfig | WorkspaceEntityTypeConditionConfig; + +type UnionOfProperties = T extends object ? T[keyof T] : never; + +declare global { + /** + * This global type allows to declare condition types from its own module. + * @example + ```js + declare global { + interface UmbExtensionConditionMap { + My_UNIQUE_CONDITION_NAME: MyExtensionConditionType; + } + } + ``` + If you have multiple types, you can declare them in this way: + ```js + declare global { + interface UmbExtensionConditionMap { + My_UNIQUE_CONDITION_NAME: MyExtensionConditionTypeA | MyExtensionConditionTypeB; + } + } + ``` + */ + interface UmbExtensionConditionMap { + UMB_CORE: ConditionTypes; + } + + /** + * This global type provides a union of all declared manifest types. + * If this is a local package that declares additional Manifest Types, then these will also be included in this union. + */ + type UmbExtensionCondition = UnionOfProperties; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection-action.model.ts index af178c67bd..edc76284d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection-action.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection-action.model.ts @@ -1,4 +1,3 @@ -import type { ConditionTypes } from '../conditions/types.js'; import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; /** @@ -6,7 +5,9 @@ import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbr * For example for content you may wish to create a new document etc */ // TODO: create interface for API -export interface ManifestCollectionAction extends ManifestElementAndApi, ManifestWithDynamicConditions { +export interface ManifestCollectionAction + extends ManifestElementAndApi, + ManifestWithDynamicConditions { type: 'collectionAction'; meta: MetaCollectionAction; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection-view.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection-view.model.ts index 5f1e3d3ba3..6298377e55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection-view.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection-view.model.ts @@ -1,7 +1,6 @@ -import type { ConditionTypes } from '../conditions/types.js'; import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; -export interface ManifestCollectionView extends ManifestElement, ManifestWithDynamicConditions { +export interface ManifestCollectionView extends ManifestElement, ManifestWithDynamicConditions { type: 'collectionView'; meta: MetaCollectionView; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection.models.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection.models.ts index c3a5b4e16b..d5e2bc4cec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection.models.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/collection.models.ts @@ -1,7 +1,8 @@ -import type { ConditionTypes } from '../conditions/types.js'; import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; -export interface ManifestCollection extends ManifestElementAndApi, ManifestWithDynamicConditions { +export interface ManifestCollection + extends ManifestElementAndApi, + ManifestWithDynamicConditions { type: 'collection'; meta: MetaCollection; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/current-user-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/current-user-action.model.ts index 5366cb251e..90ad56e9dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/current-user-action.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/current-user-action.model.ts @@ -1,4 +1,3 @@ -import type { ConditionTypes } from '../conditions/types.js'; import type { UmbAction } from '../../action/action.interface.js'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; @@ -24,7 +23,7 @@ export interface UmbCurrentUserAction extends UmbAction extends ManifestElementAndApi>, - ManifestWithDynamicConditions { + ManifestWithDynamicConditions { type: 'currentUserAction'; meta: MetaType; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/dashboard.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/dashboard.model.ts index 95d78dcafb..c800737f0c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/dashboard.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/dashboard.model.ts @@ -1,10 +1,9 @@ -import type { ConditionTypes } from '../conditions/types.js'; import type { UmbDashboardElement } from '../interfaces/index.js'; import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; export interface ManifestDashboard extends ManifestElement, - ManifestWithDynamicConditions { + ManifestWithDynamicConditions { type: 'dashboard'; meta: MetaDashboard; }