extensionsOfType using AliasManifestTypeMap

This commit is contained in:
Niels Lyngsø
2023-01-05 13:15:49 +01:00
parent 6d820c0ef7
commit 46950cea1c

View File

@@ -25,6 +25,8 @@ import type {
import { hasDefaultExport } from '../has-default-export.function';
import { loadExtension } from '../load-extension.function';
type SpecificManifestTypeOrManifestBase<T extends keyof AliasManifestTypeMap | string> = T extends keyof AliasManifestTypeMap ? AliasManifestTypeMap[T] : ManifestBase;
export class UmbExtensionRegistry {
private _extensions = new BehaviorSubject<Array<ManifestBase>>([]);
public readonly extensions = this._extensions.asObservable();
@@ -78,36 +80,16 @@ export class UmbExtensionRegistry {
}
getByTypeAndAlias<Key extends keyof AliasManifestTypeMap>(type: Key, alias: string) {
return this.extensionsOfType<AliasManifestTypeMap[Key]>(type).pipe(map((extensions) => extensions.find((extension) => extension.alias === alias) || null));
return this.extensionsOfType(type).pipe(map((extensions) => extensions.find((extension) => extension.alias === alias) || null));
}
// TODO: implement unregister of extension
// Typings concept, need to put all core types to get a good array return type for the provided type...
extensionsOfType(type: 'headerApp'): Observable<Array<ManifestHeaderApp>>;
extensionsOfType(type: 'section'): Observable<Array<ManifestSection>>;
extensionsOfType(type: 'sectionView'): Observable<Array<ManifestSectionView>>;
extensionsOfType<T = ManifestTree>(type: 'tree'): Observable<Array<T>>;
extensionsOfType(type: 'workspace'): Observable<Array<ManifestWorkspace>>;
extensionsOfType(type: 'treeItemAction'): Observable<Array<ManifestTreeItemAction>>;
extensionsOfType(type: 'dashboard'): Observable<Array<ManifestDashboard>>;
extensionsOfType(type: 'dashboardCollection'): Observable<Array<ManifestDashboard>>;
extensionsOfType(type: 'workspaceView'): Observable<Array<ManifestWorkspaceView>>;
extensionsOfType(type: 'workspaceAction'): Observable<Array<ManifestWorkspaceAction>>;
extensionsOfType(type: 'propertyEditorUI'): Observable<Array<ManifestPropertyEditorUI>>;
extensionsOfType(type: 'propertyEditorModel'): Observable<Array<ManifestPropertyEditorModel>>;
extensionsOfType(type: 'propertyAction'): Observable<Array<ManifestPropertyAction>>;
extensionsOfType(type: 'packageView'): Observable<Array<ManifestPackageView>>;
extensionsOfType(type: 'entrypoint'): Observable<Array<ManifestEntrypoint>>;
extensionsOfType(type: 'custom'): Observable<Array<ManifestCustom>>;
extensionsOfType(type: 'externalLoginProvider'): Observable<Array<ManifestExternalLoginProvider>>;
extensionsOfType(type: 'collectionView'): Observable<Array<ManifestCollectionView>>;
extensionsOfType(type: 'collectionBulkAction'): Observable<Array<ManifestCollectionBulkAction>>;
extensionsOfType<T extends ManifestTypes>(type: string): Observable<Array<T>>;
extensionsOfType(type: string): Observable<Array<ManifestBase>> {
extensionsOfType<Key extends keyof AliasManifestTypeMap | string, T = SpecificManifestTypeOrManifestBase<Key>>(type: Key) {
return this.extensions.pipe(
map((exts) => exts.filter((ext) => ext.type === type).sort((a, b) => (b.weight || 0) - (a.weight || 0)))
);
) as Observable<Array<T>>;
}
extensionsOfTypes<ExtensionType = ManifestBase>(types: string[]): Observable<Array<ExtensionType>> {
@@ -115,4 +97,4 @@ export class UmbExtensionRegistry {
map((exts) => exts.filter((ext) => (types.indexOf(ext.type) !== -1)).sort((a, b) => (b.weight || 0) - (a.weight || 0)))
) as Observable<Array<ExtensionType>>;
}
}
}