dynamic-plugin-api.module.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { DynamicModule } from '@nestjs/common';
  2. import { Type } from '../../../common/lib/shared-types';
  3. import { notNullOrUndefined } from '../../../common/lib/shared-utils';
  4. import { getConfig } from '../config/config-helpers';
  5. import { getModuleMetadata, graphQLResolversFor, isDynamicModule } from './plugin-metadata';
  6. const dynamicApiModuleClassMap: { [name: string]: Type<any> } = {};
  7. /**
  8. * This function dynamically creates a Nest module to house any GraphQL resolvers defined by
  9. * any configured plugins.
  10. */
  11. export function createDynamicGraphQlModulesForPlugins(apiType: 'shop' | 'admin'): DynamicModule[] {
  12. return getConfig()
  13. .plugins.map(plugin => {
  14. const pluginModule = isDynamicModule(plugin) ? plugin.module : plugin;
  15. const resolvers = graphQLResolversFor(plugin, apiType) || [];
  16. if (resolvers.length) {
  17. const className = dynamicClassName(pluginModule, apiType);
  18. dynamicApiModuleClassMap[className] = class {};
  19. Object.defineProperty(dynamicApiModuleClassMap[className], 'name', { value: className });
  20. const { imports, providers } = getModuleMetadata(pluginModule);
  21. return {
  22. module: dynamicApiModuleClassMap[className],
  23. imports,
  24. providers: [...providers, ...resolvers],
  25. };
  26. }
  27. })
  28. .filter(notNullOrUndefined);
  29. }
  30. /**
  31. * This function retrieves any dynamic modules which were created with createDynamicGraphQlModulesForPlugins.
  32. */
  33. export function getDynamicGraphQlModulesForPlugins(apiType: 'shop' | 'admin'): Array<Type<any>> {
  34. return getConfig()
  35. .plugins.map(plugin => {
  36. const pluginModule = isDynamicModule(plugin) ? plugin.module : plugin;
  37. const resolvers = graphQLResolversFor(plugin, apiType) || [];
  38. const className = dynamicClassName(pluginModule, apiType);
  39. return dynamicApiModuleClassMap[className];
  40. })
  41. .filter(notNullOrUndefined);
  42. }
  43. function dynamicClassName(module: Type<any>, apiType: 'shop' | 'admin'): string {
  44. return module.name + `Dynamic` + (apiType === 'shop' ? 'Shop' : 'Admin') + 'Module';
  45. }