function inferGraphDatabaseDirectives()

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);
}