@medusajs/utils
Version:
Medusa utilities functions shared by Medusa core and Modules
86 lines • 2.05 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.graphqlSchemaToFields = graphqlSchemaToFields;
const graphql_1 = require("graphql");
/**
* From graphql schema get all the fields for the requested type and relations
*
* @param schemaTypeMap
* @param typeName
* @param relations
*
* @example
*
* const userModule = `
* type User {
* id: ID!
* name: String!
* blabla: WHATEVER
* }
*
* type Post {
* author: User!
* }
* `
*
* const postModule = `
* type Post {
* id: ID!
* title: String!
* date: String
* }
*
* type User {
* posts: [Post!]!
* }
*
* type WHATEVER {
* random_field: String
* post: Post
* }
* `
*
* const mergedSchema = mergeTypeDefs([userModule, postModule])
* const schema = makeExecutableSchema({
* typeDefs: mergedSchema,
* })
*
* const fields = graphqlSchemaToFields(types, "User", ["posts"])
*
* console.log(fields)
*
* // [
* // "id",
* // "name",
* // "posts.id",
* // "posts.title",
* // "posts.date",
* // ]
*/
function graphqlSchemaToFields(schemaTypeMap, typeName, relations = []) {
const result = [];
function traverseFields(typeName, parent = "") {
const type = schemaTypeMap[typeName];
if (!(type instanceof graphql_1.GraphQLObjectType)) {
return;
}
const fields = type.getFields();
for (const fieldName in fields) {
const field = fields[fieldName];
let fieldType = field.type;
while (fieldType.ofType) {
fieldType = fieldType.ofType;
}
const composedField = parent ? `${parent}.${fieldName}` : fieldName;
if (!(0, graphql_1.isObjectType)(fieldType)) {
result.push(composedField);
}
else if (relations.includes(composedField)) {
traverseFields(fieldType.name, composedField);
}
}
}
traverseFields(typeName);
return result;
}
//# sourceMappingURL=graphql-to-fields.js.map
;