UNPKG

graphql-fields-projection-v2

Version:

- [Why using this?](#why-using-this) - [Install](#install) - [How to](#how-to) - [Example 1: simplest usecase](#example-1-simplest-usecase) - [Example 2: Get more fields](#example-2-get-more-fields) - [Example 3: Get child path](#example-3-get-child

56 lines (49 loc) 2.14 kB
const _ = require('lodash'); const graphqlFields = require('graphql-fields'); const { removePathCollision } = require('./utils'); /** * Create selected fields from graphql info * * @param {Object} queryInfo query info * @param {Object} options options * @param {[String]} [options.additionalFields=[]] additional fields to get * @param {String} [options.path=''] child path of query * @param {String} [options.returnType='string'] must be either: string, array, or object. Default: string * @returns */ function createSelectedFields(queryInfo, options = {}) { const { additionalFields = [], path = '', returnType = 'string' } = options; const parsedFields = path ? graphqlFields(queryInfo)[path] : graphqlFields(queryInfo); const selectedFields = _.chain(parsedFields) .keys() .filter(item => !['__typename'].includes(item)) .value(); const finalFields = _.union(additionalFields, selectedFields); return removePathCollision(finalFields, returnType); } /** * Create merged selected fields. Useful for dataloader batch function * * @param {[String]} batchingKeys dataloader batching keys. Each element must be a JSON string * @param {Object} options options * @param {[String]} [options.additionalFields=[]] additional fields to get * @param {String} [options.returnType='string'] must be either: string, array, or object. Default: string * @returns */ function createMergedSelectedFields(batchingKeys, options = {}) { const { additionalFields = [], returnType = 'string' } = options; let mergeSelectedFields = []; const ids = _.map(batchingKeys, key => { const { id, selectedFields: selectedFieldsTmp } = JSON.parse(key); const selectedFields = typeof (selectedFieldsTmp) === 'string' ? selectedFieldsTmp.split(' ') : selectedFieldsTmp; mergeSelectedFields = _.union(mergeSelectedFields, selectedFields); return id; }); const finalFields = _.union(additionalFields, mergeSelectedFields); const selectedFields = removePathCollision(finalFields, returnType); return { ids, selectedFields }; } module.exports = { createSelectedFields, createMergedSelectedFields, };