graphql-advanced-projection

    1.1.0 • Public • Published

    graphql-advanced-projection

    npm npm GitHub last commit GitHub code size in bytes license

    Travis Coveralls Greenkeeper badge Badges

    Fully customizable Mongoose/MongoDB projection generator.

    Why

    We already have graphql-projection, graphql-mongodb-projection, and graphql-db-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' }. Simply gqlField: 'mongoField'.
    • We create resolvers. gqlField: (parent) => parent.mongoField can be automatically generated, even complicated ones like first: (parent) => parent.items.data[0].value.
    • Fully supports interfaces, fragments, and inline fragments. Write typeProj: 'type' and switch (parent.type) in __resolveType.

    Installation

    $ yarn add graphql-advanced-projection

    Usage

    For a complete working demo, see the examples folder.

    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

    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

    Install

    npm i graphql-advanced-projection

    DownloadsWeekly Downloads

    249

    Version

    1.1.0

    License

    MIT

    Unpacked Size

    98.5 kB

    Total Files

    54

    Last publish

    Collaborators

    • avatar