import { DynamicModule } from '@nestjs/common'; import { METADATA } from '@nestjs/common/constants'; import { Type } from '@vendure/common/lib/shared-types'; import { notNullOrUndefined } from '../../../common/lib/shared-utils'; import { APIExtensionDefinition, PluginConfigurationFn, PluginLifecycleMethods } from './vendure-plugin'; export const PLUGIN_METADATA = { CONFIGURATION: 'configuration', SHOP_API_EXTENSIONS: 'shopApiExtensions', ADMIN_API_EXTENSIONS: 'adminApiExtensions', WORKERS: 'workers', ENTITIES: 'entities', }; export function getEntitiesFromPlugins(plugins?: Array | DynamicModule>): Array> { if (!plugins) { return []; } return plugins .map(p => reflectMetadata(p, PLUGIN_METADATA.ENTITIES)) .reduce((all, entities) => [...all, ...(entities || [])], []); } export function getModuleMetadata(module: Type) { return { controllers: Reflect.getMetadata(METADATA.CONTROLLERS, module) || [], providers: Reflect.getMetadata(METADATA.PROVIDERS, module) || [], imports: Reflect.getMetadata(METADATA.IMPORTS, module) || [], exports: Reflect.getMetadata(METADATA.EXPORTS, module) || [], }; } export function getPluginAPIExtensions( plugins: Array | DynamicModule>, apiType: 'shop' | 'admin', ): APIExtensionDefinition[] { const extensions = apiType === 'shop' ? plugins.map(p => reflectMetadata(p, PLUGIN_METADATA.SHOP_API_EXTENSIONS)) : plugins.map(p => reflectMetadata(p, PLUGIN_METADATA.ADMIN_API_EXTENSIONS)); return extensions.filter(notNullOrUndefined); } export function getPluginModules(plugins: Array | DynamicModule>): Array> { return plugins.map(p => (isDynamicModule(p) ? p.module : p)); } export function hasLifecycleMethod( plugin: any, lifecycleMethod: M, ): plugin is { [key in M]: PluginLifecycleMethods[M] } { return typeof (plugin as any)[lifecycleMethod] === 'function'; } export function getWorkerControllers(plugin: Type | DynamicModule) { return reflectMetadata(plugin, PLUGIN_METADATA.WORKERS); } export function getConfigurationFunction( plugin: Type | DynamicModule, ): PluginConfigurationFn | undefined { return reflectMetadata(plugin, PLUGIN_METADATA.CONFIGURATION); } export function graphQLResolversFor( plugin: Type | DynamicModule, apiType: 'shop' | 'admin', ): Array> { const apiExtensions = apiType === 'shop' ? reflectMetadata(plugin, PLUGIN_METADATA.SHOP_API_EXTENSIONS) : reflectMetadata(plugin, PLUGIN_METADATA.ADMIN_API_EXTENSIONS); return apiExtensions ? apiExtensions.resolvers : []; } function reflectMetadata(metatype: Type | DynamicModule, metadataKey: string) { if (isDynamicModule(metatype)) { return Reflect.getMetadata(metadataKey, metatype.module); } else { return Reflect.getMetadata(metadataKey, metatype); } } export function isDynamicModule(input: Type | DynamicModule): input is DynamicModule { return !!(input as DynamicModule).module; }