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

52.63% Statements 10/19
0% Branches 0/4
100% Functions 1/1
62.5% Lines 10/16
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                                              
const { _rdfsSubClassOf, rdfsResource } = require('../constants');
const isNil = require('../utils/isNil');
const castArrayShape = require('../utils/castArrayShape');
const { walkmap } = require('../graph/traversal');
const getGraphqlObjectType = require('./getGraphqlObjectType');
 
function getGraphqlTypeResolver(g, iri) {
 
  // We look for all sub-classes of this rdfs:Class
  const classes = [...walkmap(g, iri, _rdfsSubClassOf)];
  const l = classes.length - 1;
 
  return (source, info) => Promise.resolve(g.resolvers.resolveSourceTypes(source, info))
  .then(types => {
    // Everything is a rdfs:Resource, hence the fallback
    if (isNil(types)) return getGraphqlObjectType(g, rdfsResource);
 
    const typesArray = castArrayShape(types);
 
    // From last to first to return the most restrictive class
    for (let i = l; i >= 0; i--) {
      const classIri = classes[i];
 
      if (typesArray.includes(classIri)) return getGraphqlObjectType(g, classIri);
    }
 
    // This is the case when iri === rdfsResource
    return getGraphqlObjectType(g, typesArray[0]);
  });
}
 
module.exports = getGraphqlTypeResolver;