2.0.0 • Published 3 years ago
graphql-advanced-projection v2.0.0
graphql-advanced-projection
Fully customizable Mongoose/MongoDB projection generator.
Why
We already have graphql-projection, graphql-mongodb-projection, graphql-db-projection, and graphql-fields-projection.
But graphql-advanced-projection is different from all of them above in the following ways:
- Separete graphql schema and mongodb projection config. This helps you decouple schema and mongodb into two parts, each of them may change independently. Write graphql in
.graphql, write config in javascript or.json. - Easy customization. No more
gqlField: { type: new GraphQLNonNull(GraphQLInt), projection: 'mongoField' }. SimplygqlField: 'mongoField'. - We create resolvers.
gqlField: (parent) => parent.mongoFieldcan be automatically generated, even complicated ones likefirst: (parent) => parent.items.data[0].value. - Fully supports interfaces, fragments, and inline fragments. Write
typeProj: 'type'andswitch (parent.type)in__resolveType.
Installation
$ npm i graphql-advanced-projectionUsage
For a complete working demo, see the
examplesfolder.
Setup mongoose
const UserSchema = new mongoose.Schema({
_id: String,
mongoA: String,
});
const User = mongoose.model('users', UserSchema);Setup graphql
type Query {
user(id: ID!): User
}
type User {
userId: ID
field1: String
field2: String
}Setup graphql-advanced-projection
const { project, resolvers } = gqlProjection({
User: {
proj: {
userId: '_id',
field1: 'mongoA',
field2: null,
},
},
});Combine everything together
const { makeExecutableSchema } = require('@graphql-tools/schema');
/* ... */
module.exports = makeExecutableSchema({
typeDefs,
resolvers: _.merge(resolvers, {
Query: {
async user(parent, args, context, info) {
const proj = project(info);
const result = await User.findById(args.id, proj);
return result.toObject();
},
},
User: {
field2: () => 'Hello World',
},
}),
resolverValidationOptions: { requireResolversForResolveType: false },
});Run
query {
user(id: $id) {
field1
field2
}
}proj = {
_id: 0,
mongoA: 1,
}License
MIT