-
Notifications
You must be signed in to change notification settings - Fork 29
Expand file tree
/
Copy pathextension.initialization.provider.ts
More file actions
36 lines (28 loc) · 1.21 KB
/
extension.initialization.provider.ts
File metadata and controls
36 lines (28 loc) · 1.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { APP_INITIALIZER, Provider } from '@angular/core';
import { ExtensionRegistry } from '@core/services/extension-registry.service';
import { FileActionExtension } from '@osf/shared/tokens/file-action-extensions.token';
import { ExtensionConfig, extensionConfig } from '../../extensions.config';
type FactoryFunction = (config?: unknown) => FileActionExtension[];
async function loadExtensions(registry: ExtensionRegistry): Promise<void> {
for (const ext of extensionConfig) {
if (!ext.enabled) continue;
await loadExtension(ext, registry);
}
}
async function loadExtension(extConfig: ExtensionConfig, registry: ExtensionRegistry): Promise<void> {
const module = await extConfig.load();
const factory = (module as Record<string, FactoryFunction>)[extConfig.factory];
if (typeof factory !== 'function') {
throw new Error(`Extension factory "${extConfig.factory}" not found in module`);
}
const extensions = factory(extConfig.config);
registry.register(extensions);
}
export const EXTENSION_INITIALIZATION_PROVIDER: Provider = {
provide: APP_INITIALIZER,
useFactory: (registry: ExtensionRegistry) => {
return () => loadExtensions(registry);
},
deps: [ExtensionRegistry],
multi: true,
};