**What** - transform remote query object back to string array - get all fields and fields from given relations from a GraphQL schema Co-authored-by: Carlos R. L. Rodrigues <37986729+carlos-r-l-rodrigues@users.noreply.github.com>
38 lines
916 B
TypeScript
38 lines
916 B
TypeScript
import { GraphQLNamedType, GraphQLObjectType, isObjectType } from "graphql"
|
|
|
|
export function getFieldsAndRelations(
|
|
schemaTypeMap: { [key: string]: GraphQLNamedType },
|
|
typeName: string,
|
|
relations: string[] = []
|
|
) {
|
|
const result: string[] = []
|
|
|
|
function traverseFields(typeName, prefix) {
|
|
const type = schemaTypeMap[typeName]
|
|
|
|
if (!(type instanceof GraphQLObjectType)) {
|
|
return
|
|
}
|
|
|
|
const fields = type.getFields()
|
|
|
|
for (const fieldName in fields) {
|
|
const field = fields[fieldName]
|
|
let fieldType = field.type as any
|
|
|
|
while (fieldType.ofType) {
|
|
fieldType = fieldType.ofType
|
|
}
|
|
|
|
if (!isObjectType(fieldType)) {
|
|
result.push(`${prefix}${fieldName}`)
|
|
} else if (relations.includes(prefix + fieldName)) {
|
|
traverseFields(fieldType.name, `${prefix}${fieldName}.`)
|
|
}
|
|
}
|
|
}
|
|
|
|
traverseFields(typeName, "")
|
|
return result
|
|
}
|