dynamic-plugin-api.module.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { DynamicModule } from '@nestjs/common';
  2. import { Type } from '@vendure/common/lib/shared-types';
  3. import { notNullOrUndefined } from '@vendure/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 } = getModuleMetadata(pluginModule);
  21. return {
  22. module: dynamicApiModuleClassMap[className],
  23. imports: [pluginModule, ...imports],
  24. providers: [...resolvers],
  25. };
  26. }
  27. })
  28. .filter(notNullOrUndefined);
  29. }
  30. function dynamicClassName(module: Type<any>, apiType: 'shop' | 'admin'): string {
  31. return module.name + 'Dynamic' + (apiType === 'shop' ? 'Shop' : 'Admin') + 'Module';
  32. }