plugin-metadata.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { DynamicModule } from '@nestjs/common';
  2. import { METADATA } from '@nestjs/common/constants';
  3. import { Type } from '@vendure/common/lib/shared-types';
  4. import { notNullOrUndefined } from '../../../common/lib/shared-utils';
  5. import { APIExtensionDefinition, PluginConfigurationFn, PluginLifecycleMethods } from './vendure-plugin';
  6. export const PLUGIN_METADATA = {
  7. CONFIGURATION: 'configuration',
  8. SHOP_API_EXTENSIONS: 'shopApiExtensions',
  9. ADMIN_API_EXTENSIONS: 'adminApiExtensions',
  10. WORKERS: 'workers',
  11. ENTITIES: 'entities',
  12. };
  13. export function getEntitiesFromPlugins(plugins?: Array<Type<any> | DynamicModule>): Array<Type<any>> {
  14. if (!plugins) {
  15. return [];
  16. }
  17. return plugins
  18. .map(p => reflectMetadata(p, PLUGIN_METADATA.ENTITIES))
  19. .reduce((all, entities) => [...all, ...(entities || [])], []);
  20. }
  21. export function getModuleMetadata(module: Type<any>) {
  22. return {
  23. controllers: Reflect.getMetadata(METADATA.CONTROLLERS, module) || [],
  24. providers: Reflect.getMetadata(METADATA.PROVIDERS, module) || [],
  25. imports: Reflect.getMetadata(METADATA.IMPORTS, module) || [],
  26. exports: Reflect.getMetadata(METADATA.EXPORTS, module) || [],
  27. };
  28. }
  29. export function getPluginAPIExtensions(
  30. plugins: Array<Type<any> | DynamicModule>,
  31. apiType: 'shop' | 'admin',
  32. ): APIExtensionDefinition[] {
  33. const extensions =
  34. apiType === 'shop'
  35. ? plugins.map(p => reflectMetadata(p, PLUGIN_METADATA.SHOP_API_EXTENSIONS))
  36. : plugins.map(p => reflectMetadata(p, PLUGIN_METADATA.ADMIN_API_EXTENSIONS));
  37. return extensions.filter(notNullOrUndefined);
  38. }
  39. export function getPluginModules(plugins: Array<Type<any> | DynamicModule>): Array<Type<any>> {
  40. return plugins.map(p => (isDynamicModule(p) ? p.module : p));
  41. }
  42. export function hasLifecycleMethod<M extends keyof PluginLifecycleMethods>(
  43. plugin: any,
  44. lifecycleMethod: M,
  45. ): plugin is { [key in M]: PluginLifecycleMethods[M] } {
  46. return typeof (plugin as any)[lifecycleMethod] === 'function';
  47. }
  48. export function getWorkerControllers(plugin: Type<any> | DynamicModule) {
  49. return reflectMetadata(plugin, PLUGIN_METADATA.WORKERS);
  50. }
  51. export function getConfigurationFunction(
  52. plugin: Type<any> | DynamicModule,
  53. ): PluginConfigurationFn | undefined {
  54. return reflectMetadata(plugin, PLUGIN_METADATA.CONFIGURATION);
  55. }
  56. export function graphQLResolversFor(
  57. plugin: Type<any> | DynamicModule,
  58. apiType: 'shop' | 'admin',
  59. ): Array<Type<any>> {
  60. const apiExtensions =
  61. apiType === 'shop'
  62. ? reflectMetadata(plugin, PLUGIN_METADATA.SHOP_API_EXTENSIONS)
  63. : reflectMetadata(plugin, PLUGIN_METADATA.ADMIN_API_EXTENSIONS);
  64. return apiExtensions ? apiExtensions.resolvers : [];
  65. }
  66. function reflectMetadata(metatype: Type<any> | DynamicModule, metadataKey: string) {
  67. if (isDynamicModule(metatype)) {
  68. return Reflect.getMetadata(metadataKey, metatype.module);
  69. } else {
  70. return Reflect.getMetadata(metadataKey, metatype);
  71. }
  72. }
  73. export function isDynamicModule(input: Type<any> | DynamicModule): input is DynamicModule {
  74. return !!(input as DynamicModule).module;
  75. }