plugin-metadata.ts 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { DynamicModule } from '@nestjs/common';
  2. import { MODULE_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(MODULE_METADATA.CONTROLLERS, module) || [],
  24. providers: Reflect.getMetadata(MODULE_METADATA.PROVIDERS, module) || [],
  25. imports: Reflect.getMetadata(MODULE_METADATA.IMPORTS, module) || [],
  26. exports: Reflect.getMetadata(MODULE_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: APIExtensionDefinition =
  61. apiType === 'shop'
  62. ? reflectMetadata(plugin, PLUGIN_METADATA.SHOP_API_EXTENSIONS)
  63. : reflectMetadata(plugin, PLUGIN_METADATA.ADMIN_API_EXTENSIONS);
  64. return apiExtensions
  65. ? typeof apiExtensions.resolvers === 'function'
  66. ? apiExtensions.resolvers()
  67. : apiExtensions.resolvers
  68. : [];
  69. }
  70. function reflectMetadata(metatype: Type<any> | DynamicModule, metadataKey: string) {
  71. if (isDynamicModule(metatype)) {
  72. return Reflect.getMetadata(metadataKey, metatype.module);
  73. } else {
  74. return Reflect.getMetadata(metadataKey, metatype);
  75. }
  76. }
  77. export function isDynamicModule(input: Type<any> | DynamicModule): input is DynamicModule {
  78. return !!(input as DynamicModule).module;
  79. }