From 611d65ff41a44218ad2966fec3b0395ec881d853 Mon Sep 17 00:00:00 2001
From: nodkz <pavel.chertorogov@gmail.com>
Date: Mon, 14 Sep 2020 19:49:11 +0600
Subject: [PATCH] fix: refactor `pagination` & `connection` resolvers. Now they
 are using `count` & `findMany` resolver instances instead of getting them by
 `string`-name. Move them from `peerDependencies` to `dependencies`.

---
 package.json                               | 14 ++--
 src/resolvers/__tests__/connection-test.ts |  9 ---
 src/resolvers/connection.ts                | 77 +++++++---------------
 src/resolvers/pagination.ts                | 50 ++++++--------
 yarn.lock                                  | 42 ++++++------
 5 files changed, 69 insertions(+), 123 deletions(-)

diff --git a/package.json b/package.json
index 4e5d3d21..97b0f442 100644
--- a/package.json
+++ b/package.json
@@ -24,11 +24,9 @@
   },
   "homepage": "https://github.com/graphql-compose/graphql-compose-mongoose",
   "dependencies": {
-    "dataloader": "^2.0.0"
-  },
-  "optionalDependencies": {
-    "graphql-compose-connection": "^7.0.0",
-    "graphql-compose-pagination": "^7.0.0"
+    "dataloader": "^2.0.0",
+    "graphql-compose-connection": "8.0.1",
+    "graphql-compose-pagination": "8.0.1"
   },
   "peerDependencies": {
     "graphql-compose": "^7.21.1",
@@ -40,17 +38,15 @@
     "@types/mongoose": "5.7.36",
     "@typescript-eslint/eslint-plugin": "4.1.0",
     "@typescript-eslint/parser": "4.1.0",
-    "eslint": "7.8.1",
+    "eslint": "7.9.0",
     "eslint-config-airbnb-base": "14.2.0",
     "eslint-config-prettier": "6.11.0",
     "eslint-plugin-import": "2.22.0",
     "eslint-plugin-prettier": "3.1.4",
     "graphql": "15.3.0",
     "graphql-compose": "7.21.1",
-    "graphql-compose-connection": "^7.0.0",
-    "graphql-compose-pagination": "^7.0.0",
     "jest": "26.4.2",
-    "mongodb-memory-server": "6.7.4",
+    "mongodb-memory-server": "6.7.5",
     "mongoose": "5.10.5",
     "prettier": "2.1.1",
     "request": "2.88.2",
diff --git a/src/resolvers/__tests__/connection-test.ts b/src/resolvers/__tests__/connection-test.ts
index 523df7c9..9f0d59ad 100644
--- a/src/resolvers/__tests__/connection-test.ts
+++ b/src/resolvers/__tests__/connection-test.ts
@@ -148,15 +148,6 @@ describe('connection() resolver', () => {
       expect(resolver.getNestedName()).toEqual('connection');
     });
 
-    it('should return Resolver object with custom name', () => {
-      const resolver = connection(UserModel, UserTC, {
-        connectionResolverName: 'customConnection',
-      } as any);
-      if (!resolver) throw new Error('Connection resolver is undefined');
-      expect(resolver).toBeInstanceOf(Resolver);
-      expect(resolver.getNestedName()).toEqual('customConnection');
-    });
-
     it('Resolver object should have `filter` arg', () => {
       const resolver = connection(UserModel, UserTC);
       if (!resolver) throw new Error('Connection resolver is undefined');
diff --git a/src/resolvers/connection.ts b/src/resolvers/connection.ts
index b05ca1c4..2650ba97 100644
--- a/src/resolvers/connection.ts
+++ b/src/resolvers/connection.ts
@@ -1,48 +1,27 @@
 import type { Document, Model } from 'mongoose';
-import type { ConnectionSortMapOpts as _ConnectionSortMapOpts } from 'graphql-compose-connection';
-import type {
-  Resolver,
-  ObjectTypeComposer,
-  ObjectTypeComposerFieldConfigMap,
-} from 'graphql-compose';
+import {
+  prepareConnectionResolver,
+  ConnectionResolverOpts as _ConnectionResolverOpts,
+  ConnectionTArgs,
+} from 'graphql-compose-connection';
+import type { Resolver, ObjectTypeComposer } from 'graphql-compose';
+import { CountResolverOpts, count } from './count';
+import { FindManyResolverOpts, findMany } from './findMany';
 import { getUniqueIndexes, extendByReversedIndexes, IndexT } from '../utils/getIndexesFromModel';
 
-export type ConnectionResolverOpts<TContext = any> = _ConnectionSortMapOpts & {
-  edgeFields?: ObjectTypeComposerFieldConfigMap<any, TContext>;
-  connectionResolverName?: string;
-  findResolverName?: string;
-  countResolverName?: string;
-  edgeTypeName?: string;
-};
-
-type TArgs = {
-  first?: number;
-  after?: string;
-  last?: number;
-  before?: string;
-  filter?: any;
-  sort?: Record<string, any>;
+export type ConnectionResolverOpts<TContext = any> = Omit<
+  _ConnectionResolverOpts<TContext>,
+  'countResolver' | 'findManyResolver'
+> & {
+  countOpts?: CountResolverOpts;
+  findManyOpts?: FindManyResolverOpts;
 };
 
 export function connection<TSource = any, TContext = any, TDoc extends Document = any>(
   model: Model<TDoc>,
   tc: ObjectTypeComposer<TDoc, TContext>,
   opts?: ConnectionResolverOpts<TContext>
-): Resolver<TSource, TContext, TArgs, TDoc> | undefined {
-  try {
-    require.resolve('graphql-compose-connection');
-  } catch (e) {
-    return undefined;
-  }
-  // eslint-disable-next-line @typescript-eslint/no-var-requires
-  const prepareConnectionResolver = require('graphql-compose-connection').prepareConnectionResolver;
-
-  if (!prepareConnectionResolver) {
-    throw new Error(
-      'You should update `graphql-compose-connection` package till 3.2.0 version or above'
-    );
-  }
-
+): Resolver<TSource, TContext, ConnectionTArgs, TDoc> | undefined {
   const uniqueIndexes = extendByReversedIndexes(getUniqueIndexes(model), {
     reversedFirst: true,
   });
@@ -69,24 +48,14 @@ export function connection<TSource = any, TContext = any, TDoc extends Document
       },
     };
   });
-  const {
-    connectionResolverName = 'connection',
-    findResolverName = 'findMany',
-    countResolverName = 'count',
-    edgeFields,
-    edgeTypeName,
-    ...sortOptions
-  } = opts || {};
-  return prepareConnectionResolver(tc, {
-    connectionResolverName,
-    findResolverName,
-    countResolverName,
-    sort: {
-      ...sortConfigs,
-      ...sortOptions,
-    },
-    edgeFields,
-    edgeTypeName,
+
+  const { findManyOpts, countOpts, ...restOpts } = opts || {};
+
+  return prepareConnectionResolver<any, any>(tc, {
+    findManyResolver: findMany(model, tc, findManyOpts),
+    countResolver: count(model, tc, countOpts),
+    sort: sortConfigs,
+    ...restOpts,
   });
 }
 
diff --git a/src/resolvers/pagination.ts b/src/resolvers/pagination.ts
index 5743f112..54fdac95 100644
--- a/src/resolvers/pagination.ts
+++ b/src/resolvers/pagination.ts
@@ -1,41 +1,31 @@
 import type { Resolver, ObjectTypeComposer } from 'graphql-compose';
 import type { Model, Document } from 'mongoose';
+import {
+  preparePaginationResolver,
+  PaginationTArgs,
+  PaginationResolverOpts as _PaginationResolverOpts,
+} from 'graphql-compose-pagination';
+import { CountResolverOpts, count } from './count';
+import { FindManyResolverOpts, findMany } from './findMany';
 
-export type PaginationResolverOpts = {
-  perPage?: number;
-};
-
-type TArgs = {
-  page?: number;
-  perPage?: number;
-  filter?: any;
-  sort?: Record<string, any>;
+export type PaginationResolverOpts = Omit<
+  _PaginationResolverOpts,
+  'countResolver' | 'findManyResolver'
+> & {
+  countOpts?: CountResolverOpts;
+  findManyOpts?: FindManyResolverOpts;
 };
 
 export function pagination<TSource = any, TContext = any, TDoc extends Document = any>(
-  _model: Model<TDoc>,
+  model: Model<TDoc>,
   tc: ObjectTypeComposer<TDoc, TContext>,
   opts?: PaginationResolverOpts
-): Resolver<TSource, TContext, TArgs, TDoc> | undefined {
-  try {
-    require.resolve('graphql-compose-pagination');
-  } catch (e) {
-    return undefined;
-  }
-  // eslint-disable-next-line @typescript-eslint/no-var-requires
-  const preparePaginationResolver = require('graphql-compose-pagination').preparePaginationResolver;
-
-  if (!preparePaginationResolver) {
-    throw new Error(
-      'You should update `graphql-compose-pagination` package till 3.3.0 version or above'
-    );
-  }
-
-  const resolver = preparePaginationResolver(tc, {
-    findResolverName: 'findMany',
-    countResolverName: 'count',
-    ...opts,
+): Resolver<TSource, TContext, PaginationTArgs, TDoc> {
+  const { countOpts, findManyOpts, ...restOpts } = opts || {};
+  const resolver = preparePaginationResolver<any, any>(tc, {
+    findManyResolver: findMany(model, tc, findManyOpts),
+    countResolver: count(model, tc, countOpts),
+    ...restOpts,
   });
-
   return resolver;
 }
diff --git a/yarn.lock b/yarn.lock
index 0cab565a..3f7e79dd 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2513,10 +2513,10 @@ eslint-visitor-keys@^2.0.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
   integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
 
-eslint@7.8.1:
-  version "7.8.1"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.8.1.tgz#e59de3573fb6a5be8ff526c791571646d124a8fa"
-  integrity sha512-/2rX2pfhyUG0y+A123d0ccXtMm7DV7sH1m3lk9nk2DZ2LReq39FXHueR9xZwshE5MdfSf0xunSaMWRqyIA6M1w==
+eslint@7.9.0:
+  version "7.9.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337"
+  integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==
   dependencies:
     "@babel/code-frame" "^7.0.0"
     "@eslint/eslintrc" "^0.1.3"
@@ -3169,15 +3169,15 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
   integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
 
-graphql-compose-connection@^7.0.0:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/graphql-compose-connection/-/graphql-compose-connection-7.0.1.tgz#fd7be1e4dfa0b42e8aa22335bef4d9679d87a6fb"
-  integrity sha512-RYk1MkH5KisSWJCjk7AClI1y8qvkTYvEC5QnZdgduku0uqiEkwDSXz4lgGVfua6v/y/h/SHtxnna/nu/ZocyTg==
+graphql-compose-connection@8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/graphql-compose-connection/-/graphql-compose-connection-8.0.1.tgz#6416ead781108a6628c542908f43cf89d3200222"
+  integrity sha512-VBEdtzEp862TlV/uf7GDVYI0wwfTQAQlDXIZVl9IlYO5BcDD94kaPcrTuzQ/j991G09vx2ebqLu2zRI3uLZ7kg==
 
-graphql-compose-pagination@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/graphql-compose-pagination/-/graphql-compose-pagination-7.0.0.tgz#81edf2327416d10f237a3f1ff67990899a37b017"
-  integrity sha512-Rak7Dmkb5U4Kio+FgWSucVFho2xxRyCI+kNcZWhxJRVfZusw+VuhjkvxPUiKTiFEb+DtTrXUeetWT24plcC0fg==
+graphql-compose-pagination@8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/graphql-compose-pagination/-/graphql-compose-pagination-8.0.1.tgz#785c4c83dec5c81dee7ce5baee71cdf5b7a55240"
+  integrity sha512-DxFVSFS9fuDdVOCUz6sr8r1wwwFytUUQ6a2ihQAEdXx7a7p3ZC797RWHdprnnKtLPrioHIIWPCbIoyn4c4kVgQ==
 
 graphql-compose@7.21.1:
   version "7.21.1"
@@ -5038,10 +5038,10 @@ modify-values@^1.0.0:
   resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
   integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==
 
-mongodb-memory-server-core@6.7.4:
-  version "6.7.4"
-  resolved "https://registry.yarnpkg.com/mongodb-memory-server-core/-/mongodb-memory-server-core-6.7.4.tgz#5870e92451433d5d47ed4510e97dca8b7507786b"
-  integrity sha512-jvlx5+OUpJOagSyQXHHH/HhT63cJtdN5yruvSrjQ5Ivfq1lITI7fq6vTxZe4USlGoygqQiJN+MX8b1JYX2sLnw==
+mongodb-memory-server-core@6.7.5:
+  version "6.7.5"
+  resolved "https://registry.yarnpkg.com/mongodb-memory-server-core/-/mongodb-memory-server-core-6.7.5.tgz#f3fd1e517e8f798af8a93bb1d37a6cd0b04e7427"
+  integrity sha512-G4Wv1MAQg5B/aXpRwD5jy6Ubspcd7w4LsFl+rYJHhUgj8VMZGa4hX1pcEW26ghaw7gm24YsyXwDezHZPtxijKA==
   dependencies:
     "@types/tmp" "^0.2.0"
     camelcase "^6.0.0"
@@ -5062,12 +5062,12 @@ mongodb-memory-server-core@6.7.4:
   optionalDependencies:
     mongodb "3.6.2"
 
-mongodb-memory-server@6.7.4:
-  version "6.7.4"
-  resolved "https://registry.yarnpkg.com/mongodb-memory-server/-/mongodb-memory-server-6.7.4.tgz#d34edbbd0fc8c9728260d4ae9d5178feab5f30df"
-  integrity sha512-VucLjrv6PBzmz36KlReBv62uPg4JkAywHvDHUXO/LXtAroWcH7HjECbCSTlwJIhGwpWcoeuZstlsrgu2btsn7A==
+mongodb-memory-server@6.7.5:
+  version "6.7.5"
+  resolved "https://registry.yarnpkg.com/mongodb-memory-server/-/mongodb-memory-server-6.7.5.tgz#3eb4033bba56bd1822b73f581e0badc12af05401"
+  integrity sha512-Ws4IRrFqCEoD27jzFHfST9lXyrgDddpLXcoQ7B0S4Sc5v3N5tpchmvueuZ0BMj4bwwBJlWl64nXNgCoooYvupw==
   dependencies:
-    mongodb-memory-server-core "6.7.4"
+    mongodb-memory-server-core "6.7.5"
 
 mongodb@3.6.2:
   version "3.6.2"