in src/schemaModelValidator.js [256:328]
function inferGraphDatabaseDirectives(schemaModel) {
var currentType = '';
let referencedType = '';
let edgeName = '';
schemaModel.definitions.forEach(def => {
if (def.kind == 'ObjectTypeDefinition') {
if (!(def.name.value == 'Query' || def.name.value == 'Mutation')) {
currentType = def.name.value;
// Only add _id field to the object type if it doesn't have an ID field already
if (!getIdField(def)) {
def.fields.unshift(createIdField());
}
addNode(def);
const edgesTypeToAdd = [];
// add relationships
def.fields.forEach(field => {
if (field.type.type !== undefined) {
if (field.type.type.kind === 'NamedType' && field.type.type.name.value !== 'ID')
{
try {
if (field.type.kind === 'ListType')
addFilterOptionsArguments(field);
}
catch {}
try {
referencedType = field.type.type.name.value;
edgeName = referencedType + 'Edge';
loggerInfo("Infer graph database directive in type: " + yellow(currentType) + " field: " + yellow(field.name.value) + " referenced type: " + yellow(referencedType) + " graph relationship: " + yellow(edgeName));
addRelationshipDirective(field, edgeName, 'OUT');
addEdge(currentType, referencedType, edgeName);
if (!edgesTypeToAdd.includes(edgeName)) edgesTypeToAdd.push(edgeName);
}
catch {}
}
} else if (field.type.name.value !== 'String' &&
field.type.name.value !== 'Int' &&
field.type.name.value !== 'Float' &&
field.type.name.value !== 'Boolean') {
referencedType = field.type.name.value;
edgeName = referencedType + 'Edge';
loggerInfo("Infer graph database directive in type: " + yellow(currentType) + " field: " + yellow(field.name.value) + " referenced type: " + yellow(referencedType) + " graph relationship: " + yellow(edgeName));
addRelationshipDirective(field, edgeName, 'OUT');
addEdge(currentType, referencedType, edgeName);
if (!edgesTypeToAdd.includes(edgeName)) edgesTypeToAdd.push(edgeName);
}
});
// add edges
edgesTypeToAdd.forEach(edgeName => {
def.fields.push({
kind: "FieldDefinition",
name: { kind: "Name", value: lowercaseFirstCharacter(edgeName) },
arguments: [],
type: { kind: "NamedType", name: { kind: "Name", value: edgeName } },
directives: []
});
});
}
}
});
typesToAdd.push(`input Options {\n limit: Int\n}\n`);
return injectChanges(schemaModel);
}