plugin-metadata.ts 3.0 KB

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