Skip to content

Commit

Permalink
make sure that registerMany registers all extensions at the same time…
Browse files Browse the repository at this point in the history
… in order not to call next() a million times
  • Loading branch information
iOvergaard committed Aug 11, 2023
1 parent 0e19883 commit 8f56085
Showing 1 changed file with 32 additions and 22 deletions.
54 changes: 32 additions & 22 deletions src/libs/extension-api/registry/extension.registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,34 +111,17 @@ export class UmbExtensionRegistry<
}

register(manifest: ManifestTypes | ManifestKind<ManifestTypes>): void {
if (!manifest.type) {
console.error(`Extension is missing type`, manifest);
const isValid = this.checkExtension(manifest);
if (!isValid) {
return;
}

if (!manifest.alias) {
console.error(`Extension is missing alias`, manifest);
return;
}

if (manifest.type === 'kind') {
this.defineKind(manifest as ManifestKind<ManifestTypes>);
return;
}

const extensionsValues = this._extensions.getValue();
const extension = extensionsValues.find((extension) => extension.alias === (manifest as ManifestTypes).alias);

if (extension) {
console.error(`Extension with alias ${(manifest as ManifestTypes).alias} is already registered`);
return;
}

this._extensions.next([...extensionsValues, manifest as ManifestTypes]);
this._extensions.next([...this._extensions.getValue(), manifest as ManifestTypes]);
}

registerMany(manifests: Array<ManifestTypes | ManifestKind<ManifestTypes>>): void {
manifests.forEach((manifest) => this.register(manifest));
const validManifests = manifests.filter(this.checkExtension.bind(this));
this._extensions.next([...this._extensions.getValue(), ...(validManifests as Array<ManifestTypes>)]);
}

unregisterMany(aliases: Array<string>): void {
Expand Down Expand Up @@ -172,6 +155,33 @@ export class UmbExtensionRegistry<
}
*/

private checkExtension(manifest: ManifestTypes | ManifestKind<ManifestTypes>): boolean {
if (!manifest.type) {
console.error(`Extension is missing type`, manifest);
return false;
}

if (!manifest.alias) {
console.error(`Extension is missing alias`, manifest);
return false;
}

if (manifest.type === 'kind') {
this.defineKind(manifest as ManifestKind<ManifestTypes>);
return false;
}

const extensionsValues = this._extensions.getValue();
const extension = extensionsValues.find((extension) => extension.alias === (manifest as ManifestTypes).alias);

if (extension) {
console.error(`Extension with alias ${(manifest as ManifestTypes).alias} is already registered`);
return false;
}

return true;
}

private _kindsOfType<Key extends keyof ManifestTypeMap<ManifestTypes> | string>(type: Key) {
return this.kinds.pipe(
map((kinds) => kinds.filter((kind) => kind.matchType === type)),
Expand Down

0 comments on commit 8f56085

Please sign in to comment.