42 lines
1.1 KiB
JavaScript

'use strict';
const { unionType } = require('nexus');
const { prop } = require('lodash/fp');
module.exports = ({ strapi, registry }) => {
const { naming } = strapi.plugin('graphql').service('utils');
const { KINDS, GENERIC_MORPH_TYPENAME } = strapi.plugin('graphql').service('constants');
return {
buildGenericMorphDefinition() {
return unionType({
name: GENERIC_MORPH_TYPENAME,
resolveType(obj) {
const contentType = strapi.getModel(obj.__type);
if (!contentType) {
return null;
}
if (contentType.modelType === 'component') {
return naming.getComponentName(contentType);
}
return naming.getTypeName(contentType);
},
definition(t) {
const members = registry
// Resolve every content-type or component
.where(({ config }) => [KINDS.type, KINDS.component].includes(config.kind))
// Only keep their name (the type's id)
.map(prop('name'));
t.members(...members);
},
});
},
};
};