all files / semantic-graphql/src/graphql/ getGraphqlFieldConfigMap.js

90% Statements 27/30
66.67% Branches 8/12
100% Functions 1/1
92.86% Lines 26/28
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56                 16×                             16×   16×   16×   16×          
const { GraphQLID } = require('graphql');
const { rdfsSubClassOf, rdfsResource, _rdfsDomain, _rdfsSubPropertyOf } = require('../constants');
const getIriLocalName = require('../utils/getIriLocalName');
const warn = require('../utils/warn');
const memorize = require('../graph/memorize');
const { walkmap } = require('../graph/traversal');
const requireGraphqlRelay = require('../requireGraphqlRelay');
const getGraphqlFieldConfig = require('./getGraphqlFieldConfig');
const getGraphqlName = require('./getGraphqlName');
 
function getGraphqlFieldConfigMap(g, iri) {
  const properties = new Set();
 
  // Find super-classes of the class and their super-classes
  walkmap(g, iri, rdfsSubClassOf)
  // Everything is a Resource, plus many universal properties
  // like label and comment, have rdfs:Resource in their domain
  .add(rdfsResource)
  // For each class, find properties on their domain
  .forEach(classIri => g[classIri][_rdfsDomain] &&
    // For each property, add the property to the list and find its subProperties and their subProperties
    g[classIri][_rdfsDomain].forEach(property => walkmap(g, property, _rdfsSubPropertyOf, properties)));
 
  const fieldConfigMap = {};
  const fieldConfigExtensionMap = g[iri].graphqlFieldConfigExtensions || {}; // From userland
 
  // Add id field
  Eif (!g.config.preventIdField) {
    Iif (g.config.relay) {
      fieldConfigMap.id = requireGraphqlRelay().globalIdField(getGraphqlName(g, iri), g.resolvers.resolveSourceId);
    }
    else {
      fieldConfigMap.id = {
        type: GraphQLID,
        description: 'A unique identifier for the resource.',
        resolve: (source, args, context, info) => g.resolvers.resolveSourceId(source, context, info),
      };
    }
  }
 
  // Add other fields
  properties.forEach(propertyIri => {
    const localName = getIriLocalName(propertyIri);
 
    Iif (fieldConfigMap[localName]) return warn(`Duplicate localName with ${propertyIri} on fieldConfigMap of ${iri}`);
 
    const fieldConfig = getGraphqlFieldConfig(g, propertyIri);
 
    Eif (fieldConfig) fieldConfigMap[localName] = Object.assign(fieldConfig, fieldConfigExtensionMap[propertyIri]);
  });
 
  return fieldConfigMap;
}
 
module.exports = memorize(getGraphqlFieldConfigMap, 'graphqlFieldConfigMap');