From f35545e254500e3dd65d02e56d7b270d173b2b4a Mon Sep 17 00:00:00 2001 From: Alisson Suzigan Date: Wed, 6 May 2020 03:02:42 -0300 Subject: [PATCH] chore(gatsby): Convert pagination to TypeScript (#23717) * Convert pagination schema type to typescript * Update getPagination import in schema file * PR suggested improvements --- packages/gatsby/src/schema/schema.js | 2 +- .../gatsby/src/schema/types/pagination.js | 101 -------------- .../gatsby/src/schema/types/pagination.ts | 131 ++++++++++++++++++ 3 files changed, 132 insertions(+), 102 deletions(-) delete mode 100644 packages/gatsby/src/schema/types/pagination.js create mode 100644 packages/gatsby/src/schema/types/pagination.ts diff --git a/packages/gatsby/src/schema/schema.js b/packages/gatsby/src/schema/schema.js index f2afc075ff57e..01e49a0961224 100644 --- a/packages/gatsby/src/schema/schema.js +++ b/packages/gatsby/src/schema/schema.js @@ -28,7 +28,7 @@ const { processFieldExtensions, internalExtensionNames, } = require(`./extensions`) -const { getPagination } = require(`./types/pagination`) +import { getPagination } from "./types/pagination" const { getSortInput, SORTABLE_ENUM } = require(`./types/sort`) const { getFilterInput, SEARCHABLE_ENUM } = require(`./types/filter`) const { isGatsbyType, GatsbyGraphQLTypeKind } = require(`./types/type-builders`) diff --git a/packages/gatsby/src/schema/types/pagination.js b/packages/gatsby/src/schema/types/pagination.js deleted file mode 100644 index fc781f443a897..0000000000000 --- a/packages/gatsby/src/schema/types/pagination.js +++ /dev/null @@ -1,101 +0,0 @@ -const { getFieldsEnum } = require(`./sort`) -const { addDerivedType } = require(`./derived-types`) -const { distinct, group } = require(`../resolvers`) - -const getPageInfo = ({ schemaComposer }) => - schemaComposer.getOrCreateOTC(`PageInfo`, tc => { - tc.addFields({ - currentPage: `Int!`, - hasPreviousPage: `Boolean!`, - hasNextPage: `Boolean!`, - itemCount: `Int!`, - pageCount: `Int!`, - perPage: `Int`, - }) - }) - -const getEdge = ({ schemaComposer, typeComposer }) => { - const typeName = typeComposer.getTypeName() + `Edge` - addDerivedType({ typeComposer, derivedTypeName: typeName }) - return schemaComposer.getOrCreateOTC(typeName, tc => { - tc.addFields({ - next: typeComposer, - node: typeComposer.getTypeNonNull(), - previous: typeComposer, - }) - }) -} - -const createPagination = ({ - schemaComposer, - typeComposer, - fields, - typeName, -}) => { - const paginationTypeComposer = schemaComposer.getOrCreateOTC(typeName, tc => { - tc.addFields({ - totalCount: `Int!`, - edges: [getEdge({ schemaComposer, typeComposer }).getTypeNonNull()], - nodes: [typeComposer.getTypeNonNull()], - pageInfo: getPageInfo({ schemaComposer }).getTypeNonNull(), - ...fields, - }) - }) - paginationTypeComposer.makeFieldNonNull(`edges`) - paginationTypeComposer.makeFieldNonNull(`nodes`) - addDerivedType({ typeComposer, derivedTypeName: typeName }) - return paginationTypeComposer -} - -const getGroup = ({ schemaComposer, typeComposer }) => { - const typeName = typeComposer.getTypeName() + `GroupConnection` - const fields = { - field: `String!`, - fieldValue: `String`, - } - return createPagination({ schemaComposer, typeComposer, fields, typeName }) -} - -const getPagination = ({ schemaComposer, typeComposer }) => { - const inputTypeComposer = typeComposer.getInputTypeComposer() - const typeName = typeComposer.getTypeName() + `Connection` - const fieldsEnumTC = getFieldsEnum({ - schemaComposer, - typeComposer, - inputTypeComposer, - }) - const fields = { - distinct: { - type: [`String!`], - args: { - field: fieldsEnumTC.getTypeNonNull(), - }, - resolve: distinct, - }, - group: { - type: [getGroup({ schemaComposer, typeComposer }).getTypeNonNull()], - args: { - skip: `Int`, - limit: `Int`, - field: fieldsEnumTC.getTypeNonNull(), - }, - resolve: group, - }, - } - const paginationTypeComposer = createPagination({ - schemaComposer, - typeComposer, - fields, - typeName, - }) - paginationTypeComposer.makeFieldNonNull(`distinct`) - paginationTypeComposer.makeFieldNonNull(`group`) - return paginationTypeComposer -} - -module.exports = { - getPageInfo, - getEdge, - getGroup, - getPagination, -} diff --git a/packages/gatsby/src/schema/types/pagination.ts b/packages/gatsby/src/schema/types/pagination.ts new file mode 100644 index 0000000000000..6b69020a64d20 --- /dev/null +++ b/packages/gatsby/src/schema/types/pagination.ts @@ -0,0 +1,131 @@ +import { + SchemaComposer, + ObjectTypeComposer, + InputTypeComposer, + InterfaceTypeComposer, + ComposeFieldConfigMap, +} from "graphql-compose" +import { getFieldsEnum } from "./sort" +import { addDerivedType } from "./derived-types" +import { distinct, group } from "../resolvers" + +export const getPageInfo = ({ + schemaComposer, +}: { + schemaComposer: SchemaComposer +}): ObjectTypeComposer => + schemaComposer.getOrCreateOTC(`PageInfo`, tc => { + tc.addFields({ + currentPage: `Int!`, + hasPreviousPage: `Boolean!`, + hasNextPage: `Boolean!`, + itemCount: `Int!`, + pageCount: `Int!`, + perPage: `Int`, + }) + }) + +export const getEdge = ({ + schemaComposer, + typeComposer, +}: { + schemaComposer: SchemaComposer + typeComposer: ObjectTypeComposer | InterfaceTypeComposer +}): ObjectTypeComposer => { + const typeName = `${typeComposer.getTypeName()}Edge` + addDerivedType({ typeComposer, derivedTypeName: typeName }) + return schemaComposer.getOrCreateOTC(typeName, tc => { + tc.addFields({ + next: typeComposer, + node: typeComposer.getTypeNonNull(), + previous: typeComposer, + }) + }) +} + +const createPagination = ({ + schemaComposer, + typeComposer, + fields, + typeName, +}: { + schemaComposer: SchemaComposer + typeComposer: ObjectTypeComposer | InterfaceTypeComposer + fields: ComposeFieldConfigMap + typeName: string +}): ObjectTypeComposer => { + const paginationTypeComposer: ObjectTypeComposer = schemaComposer.getOrCreateOTC( + typeName, + tc => { + tc.addFields({ + totalCount: `Int!`, + edges: [getEdge({ schemaComposer, typeComposer }).getTypeNonNull()], + nodes: [typeComposer.getTypeNonNull()], + pageInfo: getPageInfo({ schemaComposer }).getTypeNonNull(), + ...fields, + }) + } + ) + paginationTypeComposer.makeFieldNonNull(`edges`) + paginationTypeComposer.makeFieldNonNull(`nodes`) + addDerivedType({ typeComposer, derivedTypeName: typeName }) + return paginationTypeComposer +} + +export const getGroup = ({ + schemaComposer, + typeComposer, +}: { + schemaComposer: SchemaComposer + typeComposer: ObjectTypeComposer | InterfaceTypeComposer +}): ObjectTypeComposer => { + const typeName = `${typeComposer.getTypeName()}GroupConnection` + const fields = { + field: `String!`, + fieldValue: `String`, + } + return createPagination({ schemaComposer, typeComposer, fields, typeName }) +} + +export const getPagination = ({ + schemaComposer, + typeComposer, +}: { + schemaComposer: SchemaComposer + typeComposer: ObjectTypeComposer | InterfaceTypeComposer +}): ObjectTypeComposer => { + const inputTypeComposer: InputTypeComposer = typeComposer.getInputTypeComposer() + const typeName = `${typeComposer.getTypeName()}Connection` + const fieldsEnumTC = getFieldsEnum({ + schemaComposer, + typeComposer, + inputTypeComposer, + }) + const fields = { + distinct: { + type: [`String!`], + args: { + field: fieldsEnumTC.getTypeNonNull(), + }, + resolve: distinct, + }, + group: { + type: [getGroup({ schemaComposer, typeComposer }).getTypeNonNull()], + args: { + skip: `Int`, + limit: `Int`, + field: fieldsEnumTC.getTypeNonNull(), + }, + resolve: group, + }, + } + const paginationTypeComposer: ObjectTypeComposer = createPagination({ + schemaComposer, + typeComposer, + fields, + typeName, + }) + paginationTypeComposer.makeFieldNonNull(`distinct`) + paginationTypeComposer.makeFieldNonNull(`group`) + return paginationTypeComposer +}