Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/b1f6c1c4/graphql-advanced-projection
Fully customizable Mongoose/MongoDB projection generator.
https://github.com/b1f6c1c4/graphql-advanced-projection
apollo apollo-server graphql graphql-advanced-projection graphql-projection javascript mongodb mongoose projection
Last synced: about 6 hours ago
JSON representation
Fully customizable Mongoose/MongoDB projection generator.
- Host: GitHub
- URL: https://github.com/b1f6c1c4/graphql-advanced-projection
- Owner: b1f6c1c4
- License: mit
- Created: 2018-03-10T07:26:42.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2024-08-26T10:35:47.000Z (5 months ago)
- Last Synced: 2025-01-14T09:10:07.707Z (8 days ago)
- Topics: apollo, apollo-server, graphql, graphql-advanced-projection, graphql-projection, javascript, mongodb, mongoose, projection
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/graphql-advanced-projection
- Size: 1.32 MB
- Stars: 46
- Watchers: 6
- Forks: 5
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# graphql-advanced-projection
[![npm](https://img.shields.io/npm/v/graphql-advanced-projection.svg?style=flat-square)](https://www.npmjs.com/package/graphql-advanced-projection)
[![npm](https://img.shields.io/npm/dt/graphql-advanced-projection.svg?style=flat-square)](https://www.npmjs.com/package/graphql-advanced-projection)
[![GitHub last commit](https://img.shields.io/github/last-commit/b1f6c1c4/graphql-advanced-projection.svg?style=flat-square)](https://github.com/b1f6c1c4/graphql-advanced-projection)
[![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/b1f6c1c4/graphql-advanced-projection.svg?style=flat-square)](https://github.com/b1f6c1c4/graphql-advanced-projection)
[![license](https://img.shields.io/github/license/b1f6c1c4/graphql-advanced-projection.svg?style=flat-square)](https://github.com/b1f6c1c4/graphql-advanced-projection/blob/master/LICENSE.md)[![Appveyor Build](https://img.shields.io/appveyor/build/b1f6c1c4/graphql-advanced-projection?style=flat-square)](https://ci.appveyor.com/project/b1f6c1c4/graphql-advanced-projection)
[![Coveralls](https://img.shields.io/coveralls/github/b1f6c1c4/graphql-advanced-projection.svg?style=flat-square)](https://coveralls.io/github/b1f6c1c4/graphql-advanced-projection)> Fully customizable Mongoose/MongoDB projection generator.
## Why
We already have [graphql-projection](https://github.com/bharley/graphql-projection), [graphql-mongodb-projection](https://github.com/du5rte/graphql-mongodb-projection), [graphql-db-projection](https://github.com/markshapiro/graphql-db-projection), and [graphql-fields-projection](https://github.com/Impact-Technical-Resources/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' }`. 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
```sh
$ npm i graphql-advanced-projection
```
## Usage> For a complete working demo, see the `examples` folder.
### Setup `mongoose`
```js
const UserSchema = new mongoose.Schema({
_id: String,
mongoA: String,
});
const User = mongoose.model('users', UserSchema);
```### Setup `graphql`
```graphql
type Query {
user(id: ID!): User
}
type User {
userId: ID
field1: String
field2: String
}
```### Setup `graphql-advanced-projection`
```js
const { project, resolvers } = gqlProjection({
User: {
proj: {
userId: '_id',
field1: 'mongoA',
field2: null,
},
},
});
```### Combine everything together
```js
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
```graphql
query {
user(id: $id) {
field1
field2
}
}
```
```js
proj = {
_id: 0,
mongoA: 1,
}
```## License
MIT