extensions.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { mergeDeep } from '@graphql-tools/utils';
  2. export { extractExtensionsFromSchema } from '@graphql-tools/utils';
  3. export function mergeExtensions(extensions) {
  4. return mergeDeep(extensions, false, true);
  5. }
  6. function applyExtensionObject(obj, extensions) {
  7. if (!obj) {
  8. return;
  9. }
  10. obj.extensions = mergeDeep([obj.extensions || {}, extensions || {}], false, true);
  11. }
  12. export function applyExtensions(schema, extensions) {
  13. applyExtensionObject(schema, extensions.schemaExtensions);
  14. for (const [typeName, data] of Object.entries(extensions.types || {})) {
  15. const type = schema.getType(typeName);
  16. if (type) {
  17. applyExtensionObject(type, data.extensions);
  18. if (data.type === 'object' || data.type === 'interface') {
  19. for (const [fieldName, fieldData] of Object.entries(data.fields)) {
  20. const field = type.getFields()[fieldName];
  21. if (field) {
  22. applyExtensionObject(field, fieldData.extensions);
  23. for (const [arg, argData] of Object.entries(fieldData.arguments)) {
  24. applyExtensionObject(field.args.find(a => a.name === arg), argData);
  25. }
  26. }
  27. }
  28. }
  29. else if (data.type === 'input') {
  30. for (const [fieldName, fieldData] of Object.entries(data.fields)) {
  31. const field = type.getFields()[fieldName];
  32. applyExtensionObject(field, fieldData.extensions);
  33. }
  34. }
  35. else if (data.type === 'enum') {
  36. for (const [valueName, valueData] of Object.entries(data.values)) {
  37. const value = type.getValue(valueName);
  38. applyExtensionObject(value, valueData);
  39. }
  40. }
  41. }
  42. }
  43. return schema;
  44. }