From 0bbb17690fc1f839da1c9bf1f92dd76b979eb4cf Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Tue, 12 Apr 2022 22:10:45 -0700 Subject: [PATCH] `typescript@4.7` readiness (refine generic typings via `extends`) (#4382) * Install typescript@4.7.0-beta and fix one of the TS errors * Resolve remaining TS errors * Fix ambiguous typings * Revert TS version back to latest * Add changeset --- .changeset/slow-singers-pull.md | 21 ++ packages/delegate/src/Transformer.ts | 4 +- .../src/checkResultAndHandleErrors.ts | 2 +- packages/delegate/src/delegateToSchema.ts | 20 +- packages/delegate/src/resolveExternalValue.ts | 8 +- packages/links/src/linkToExecutor.ts | 4 +- packages/loaders/git/src/parse.ts | 4 +- packages/loaders/url/src/defaultAsyncFetch.ts | 2 +- packages/loaders/url/src/index.ts | 6 +- packages/loaders/url/tests/url-loader.spec.ts | 217 ++++++++++-------- .../stitch/src/createMergedTypeResolver.ts | 2 +- packages/stitch/src/stitchSchemas.ts | 2 +- packages/stitch/src/stitchingInfo.ts | 4 +- packages/stitch/src/typeCandidates.ts | 2 +- packages/stitch/tests/dataloader.test.ts | 2 +- packages/utils/src/executor.ts | 6 +- .../wrap/src/generateProxyingResolvers.ts | 6 +- packages/wrap/src/transforms/WrapFields.ts | 4 +- packages/wrap/src/transforms/WrapType.ts | 2 +- packages/wrap/src/wrapSchema.ts | 2 +- 20 files changed, 184 insertions(+), 136 deletions(-) create mode 100644 .changeset/slow-singers-pull.md diff --git a/.changeset/slow-singers-pull.md b/.changeset/slow-singers-pull.md new file mode 100644 index 00000000000..47b30bee9ae --- /dev/null +++ b/.changeset/slow-singers-pull.md @@ -0,0 +1,21 @@ +--- +'@graphql-tools/delegate': patch +'@graphql-tools/links': patch +'@graphql-tools/git-loader': patch +'@graphql-tools/url-loader': patch +'@graphql-tools/stitch': patch +'@graphql-tools/utils': patch +'@graphql-tools/wrap': patch +--- + +Refine generic typings using `extends X` when appropriate + +Typescript 4.7 has stricter requirements around generics +which is explained well in the related PR: +https://github.com/microsoft/TypeScript/pull/48366 + +These changes resolve the errors that these packages will +face when attempting to upgrade to TS 4.7 (still in beta +at the time of writing this). Landing these changes now +will allow other TS libraries which depend on these +packages to experiment with TS 4.7 in the meantime. diff --git a/packages/delegate/src/Transformer.ts b/packages/delegate/src/Transformer.ts index 7a6eb8831a3..9da8bba803a 100644 --- a/packages/delegate/src/Transformer.ts +++ b/packages/delegate/src/Transformer.ts @@ -11,7 +11,7 @@ interface Transformation { context: Record; } -export class Transformer> { +export class Transformer = Record> { private transformations: Array> = []; private delegationContext: DelegationContext; @@ -51,7 +51,7 @@ export class Transformer> { public transformResult(originalResult: ExecutionResult) { let result = originalResult; - // from rigth to left + // from right to left for (let i = this.transformations.length - 1; i >= 0; i--) { const transformation = this.transformations[i]; if (transformation.transform.transformResult) { diff --git a/packages/delegate/src/checkResultAndHandleErrors.ts b/packages/delegate/src/checkResultAndHandleErrors.ts index f6d4521728c..5fe2910566a 100644 --- a/packages/delegate/src/checkResultAndHandleErrors.ts +++ b/packages/delegate/src/checkResultAndHandleErrors.ts @@ -5,7 +5,7 @@ import { AggregateError, getResponseKeyFromInfo, ExecutionResult, relocatedError import { DelegationContext } from './types'; import { resolveExternalValue } from './resolveExternalValue'; -export function checkResultAndHandleErrors( +export function checkResultAndHandleErrors>( result: ExecutionResult, delegationContext: DelegationContext ): any { diff --git a/packages/delegate/src/delegateToSchema.ts b/packages/delegate/src/delegateToSchema.ts index a5ba5e341df..d696c87b6a9 100644 --- a/packages/delegate/src/delegateToSchema.ts +++ b/packages/delegate/src/delegateToSchema.ts @@ -38,9 +38,10 @@ import { Subschema } from './Subschema'; import { createRequest, getDelegatingOperation } from './createRequest'; import { Transformer } from './Transformer'; -export function delegateToSchema, TArgs = any>( - options: IDelegateToSchemaOptions -): any { +export function delegateToSchema< + TContext extends Record = Record, + TArgs extends Record = any +>(options: IDelegateToSchemaOptions): any { const { info, schema, @@ -85,9 +86,10 @@ function getDelegationReturnType( return rootType.getFields()[fieldName].type; } -export function delegateRequest, TArgs = any>( - options: IDelegateRequestOptions -) { +export function delegateRequest< + TContext extends Record = Record, + TArgs extends Record = any +>(options: IDelegateRequestOptions) { const delegationContext = getDelegationContext(options); const transformer = new Transformer(delegationContext); @@ -112,7 +114,7 @@ export function delegateRequest, TArgs = any>( .resolve(); } -function getDelegationContext({ +function getDelegationContext>({ request, schema, fieldName, @@ -193,7 +195,9 @@ function validateRequest(delegationContext: DelegationContext, document: Do const GLOBAL_CONTEXT = {}; -function getExecutor(delegationContext: DelegationContext): Executor { +function getExecutor>( + delegationContext: DelegationContext +): Executor { const { subschemaConfig, targetSchema, context } = delegationContext; let executor: Executor = subschemaConfig?.executor || createDefaultExecutor(targetSchema); diff --git a/packages/delegate/src/resolveExternalValue.ts b/packages/delegate/src/resolveExternalValue.ts index c763bbe5d8e..f7dd21b3810 100644 --- a/packages/delegate/src/resolveExternalValue.ts +++ b/packages/delegate/src/resolveExternalValue.ts @@ -19,7 +19,7 @@ import { StitchingInfo, SubschemaConfig } from './types'; import { annotateExternalObject, isExternalObject, mergeFields } from './mergeFields'; import { Subschema } from './Subschema'; -export function resolveExternalValue( +export function resolveExternalValue>( result: any, unpathedErrors: Array, subschema: GraphQLSchema | SubschemaConfig, @@ -47,7 +47,7 @@ export function resolveExternalValue( } } -function resolveExternalObject( +function resolveExternalObject>( type: GraphQLCompositeType, object: any, unpathedErrors: Array, @@ -91,7 +91,7 @@ function resolveExternalObject( return mergeFields(mergedTypeInfo, object, subschema as Subschema, context, info); } -function resolveExternalList( +function resolveExternalList>( type: GraphQLList, list: Array, unpathedErrors: Array, @@ -113,7 +113,7 @@ function resolveExternalList( ); } -function resolveExternalListMember( +function resolveExternalListMember>( type: GraphQLType, listMember: any, unpathedErrors: Array, diff --git a/packages/links/src/linkToExecutor.ts b/packages/links/src/linkToExecutor.ts index 422d95cbcd6..4aedcd27ff9 100644 --- a/packages/links/src/linkToExecutor.ts +++ b/packages/links/src/linkToExecutor.ts @@ -11,7 +11,9 @@ import { } from '@graphql-tools/utils'; export function linkToExecutor(link: ApolloLink): Executor { - return function executorFromLink(request: ExecutionRequest) { + return function executorFromLink, TContext>( + request: ExecutionRequest + ) { const observable = execute(link, { query: request.document, operationName: request.operationName, diff --git a/packages/loaders/git/src/parse.ts b/packages/loaders/git/src/parse.ts index 682a5aee3f6..77412df79bd 100644 --- a/packages/loaders/git/src/parse.ts +++ b/packages/loaders/git/src/parse.ts @@ -1,9 +1,9 @@ -import { parseGraphQLSDL, parseGraphQLJSON, Source } from '@graphql-tools/utils'; +import { parseGraphQLSDL, parseGraphQLJSON, Source, GraphQLParseOptions } from '@graphql-tools/utils'; /** * @internal */ -export function parse({ +export function parse({ path, pointer, content, diff --git a/packages/loaders/url/src/defaultAsyncFetch.ts b/packages/loaders/url/src/defaultAsyncFetch.ts index a03b3afb6e9..ab178920866 100644 --- a/packages/loaders/url/src/defaultAsyncFetch.ts +++ b/packages/loaders/url/src/defaultAsyncFetch.ts @@ -1,6 +1,6 @@ import { fetch } from 'cross-undici-fetch'; export type AsyncFetchFn = typeof fetch; -export const defaultAsyncFetch: AsyncFetchFn = async (input: RequestInfo, init?: RequestInit): Promise => { +export const defaultAsyncFetch: AsyncFetchFn = async (input, init) => { return fetch(input, init); }; diff --git a/packages/loaders/url/src/index.ts b/packages/loaders/url/src/index.ts index 3811f5c5126..3e0928fdd19 100644 --- a/packages/loaders/url/src/index.ts +++ b/packages/loaders/url/src/index.ts @@ -505,7 +505,11 @@ export class UrlLoader implements Loader { webSocketImpl ); - return ({ document, variables, operationName }: ExecutionRequest) => { + return >({ + document, + variables, + operationName, + }: ExecutionRequest) => { return observableToAsyncIterable( subscriptionClient.request({ query: document, diff --git a/packages/loaders/url/tests/url-loader.spec.ts b/packages/loaders/url/tests/url-loader.spec.ts index 5f348a9f8ae..041e7c459c0 100644 --- a/packages/loaders/url/tests/url-loader.spec.ts +++ b/packages/loaders/url/tests/url-loader.spec.ts @@ -22,7 +22,7 @@ import { createHandler } from 'graphql-sse'; import { Server as WSServer } from 'ws'; import http from 'http'; import { SubscriptionServer } from 'subscriptions-transport-ws'; -import { defaultAsyncFetch } from '../src/defaultAsyncFetch'; +import { AsyncFetchFn, defaultAsyncFetch } from '../src/defaultAsyncFetch'; import { Response, File, Headers } from 'cross-undici-fetch'; import express from 'express'; import { graphqlHTTP } from 'express-graphql'; @@ -145,16 +145,17 @@ input TestInput { it('Should pass default headers', async () => { let headers: HeadersInit = {}; + const customFetch: AsyncFetchFn = async (_, opts) => { + headers = opts?.headers || {}; + return new Response( + JSON.stringify({ + data: introspectionFromSchema(testSchema), + }) + ); + }; const [source] = await loader.load(testUrl, { - customFetch: async (_, opts) => { - headers = opts?.headers || {}; - return new Response( - JSON.stringify({ - data: introspectionFromSchema(testSchema), - }) - ); - }, + customFetch, }); expect(source).toBeDefined(); @@ -169,17 +170,18 @@ input TestInput { it('Should pass extra headers when they are specified as object', async () => { let headers: HeadersInit = {}; + const customFetch: AsyncFetchFn = async (_, opts) => { + headers = opts?.headers || {}; + return new Response( + JSON.stringify({ + data: introspectionFromSchema(testSchema), + }) + ); + }; const [source] = await loader.load(testUrl, { headers: { auth: '1' }, - customFetch: async (_, opts) => { - headers = opts?.headers || {}; - return new Response( - JSON.stringify({ - data: introspectionFromSchema(testSchema), - }) - ); - }, + customFetch, }); expect(source).toBeDefined(); @@ -197,23 +199,25 @@ input TestInput { const introspectionOptions = { descriptions: false, }; + const customFetch: AsyncFetchFn = async (_, opts) => { + const receivedBody = JSON.parse(opts?.body?.toString() || '{}'); + const receivedAST = parse(receivedBody.query, { + noLocation: true, + }); + const expectedAST = parse(getIntrospectionQuery(introspectionOptions), { + noLocation: true, + }); + expect(receivedAST).toMatchObject(expectedAST); + return new Response( + JSON.stringify({ + data: introspectionFromSchema(testSchema, introspectionOptions), + }) + ); + }; + const [source] = await loader.load(testUrl, { ...introspectionOptions, - customFetch: async (_, opts) => { - const receivedBody = JSON.parse(opts?.body?.toString() || '{}'); - const receivedAST = parse(receivedBody.query, { - noLocation: true, - }); - const expectedAST = parse(getIntrospectionQuery(introspectionOptions), { - noLocation: true, - }); - expect(receivedAST).toMatchObject(expectedAST); - return new Response( - JSON.stringify({ - data: introspectionFromSchema(testSchema, introspectionOptions), - }) - ); - }, + customFetch, }); expect(source).toBeDefined(); @@ -222,30 +226,32 @@ input TestInput { }); it('should handle useGETForQueries correctly', async () => { + const customFetch: AsyncFetchFn = async (url, opts) => { + expect(opts?.method).toBe('GET'); + const { searchParams } = new URL(url.toString()); + const receivedQuery = searchParams.get('query')!; + const receivedAST = parse(receivedQuery, { + noLocation: true, + }); + const receivedOperationName = searchParams.get('operationName'); + const receivedVariables = JSON.parse(searchParams.get('variables') || '{}'); + const operationAST = getOperationAST(receivedAST, receivedOperationName); + expect(operationAST?.operation).toBe('query'); + const responseBody = JSON.stringify( + await execute({ + schema: testSchema, + document: receivedAST, + operationName: receivedOperationName, + variableValues: receivedVariables, + }) + ); + return new Response(responseBody); + }; + const [source] = await loader.load(testUrl, { descriptions: false, useGETForQueries: true, - customFetch: async (url, opts) => { - expect(opts?.method).toBe('GET'); - const { searchParams } = new URL(url.toString()); - const receivedQuery = searchParams.get('query')!; - const receivedAST = parse(receivedQuery, { - noLocation: true, - }); - const receivedOperationName = searchParams.get('operationName'); - const receivedVariables = JSON.parse(searchParams.get('variables') || '{}'); - const operationAST = getOperationAST(receivedAST, receivedOperationName); - expect(operationAST?.operation).toBe('query'); - const responseBody = JSON.stringify( - await execute({ - schema: testSchema, - document: receivedAST, - operationName: receivedOperationName, - variableValues: receivedVariables, - }) - ); - return new Response(responseBody); - }, + customFetch, }); const testVariableValue = 'A'; @@ -272,16 +278,18 @@ input TestInput { }); it('should respect dynamic values given in extensions', async () => { + const customFetch: AsyncFetchFn = async (info, init) => { + expect(info.toString()).toBe('DYNAMIC_ENDPOINT'); + expect(new Headers(init?.headers).get('TEST_HEADER')).toBe('TEST_HEADER_VALUE'); + return new Response( + JSON.stringify({ + data: introspectionFromSchema(testSchema), + }) + ); + }; + const executor = loader.getExecutorAsync('SOME_ENDPOINT', { - customFetch: async (info, init) => { - expect(info.toString()).toBe('DYNAMIC_ENDPOINT'); - expect(new Headers(init?.headers).get('TEST_HEADER')).toBe('TEST_HEADER_VALUE'); - return new Response( - JSON.stringify({ - data: introspectionFromSchema(testSchema), - }) - ); - }, + customFetch, }); await executor({ document: parse(getIntrospectionQuery()), @@ -301,15 +309,17 @@ input TestInput { path: '/graphql', }; const url = address.host + address.path; + const customFetch: AsyncFetchFn = async url => { + expect(url.toString()).toBe(address.host + address.path); + return new Response( + JSON.stringify({ + data: introspectionFromSchema(testSchema), + }) + ); + }; + await loader.load(url, { - customFetch: async url => { - expect(url.toString()).toBe(address.host + address.path); - return new Response( - JSON.stringify({ - data: introspectionFromSchema(testSchema), - }) - ); - }, + customFetch, }); expect.assertions(1); }); @@ -320,15 +330,17 @@ input TestInput { path: '/graphql', }; const url = address.host + address.path; + const customFetch: AsyncFetchFn = async url => { + expect(url.toString()).toBe('http://foo:8080/graphql'); + return new Response( + JSON.stringify({ + data: introspectionFromSchema(testSchema), + }) + ); + }; + await loader.load(url, { - customFetch: async url => { - expect(url.toString()).toBe('http://foo:8080/graphql'); - return new Response( - JSON.stringify({ - data: introspectionFromSchema(testSchema), - }) - ); - }, + customFetch, }); expect.assertions(1); }); @@ -339,15 +351,17 @@ input TestInput { path: '/graphql', }; const url = address.host + address.path; + const customFetch: AsyncFetchFn = async url => { + expect(url.toString()).toBe('https://foo:8080/graphql'); + return new Response( + JSON.stringify({ + data: introspectionFromSchema(testSchema), + }) + ); + }; + await loader.load(url, { - customFetch: async url => { - expect(url.toString()).toBe('https://foo:8080/graphql'); - return new Response( - JSON.stringify({ - data: introspectionFromSchema(testSchema), - }) - ); - }, + customFetch, }); expect.assertions(1); }); @@ -523,23 +537,24 @@ input TestInput { }); it('should handle subscriptions - graphql-sse', async () => { const testUrl = 'http://localhost:8081/graphql'; + const customFetch: AsyncFetchFn = async (url, options) => { + if (String(options?.body).includes('IntrospectionQuery')) { + return new Response( + JSON.stringify({ + data: introspectionFromSchema(testSchema), + }), + { + headers: { + 'content-type': 'application/json', + }, + } + ); + } + return defaultAsyncFetch(url, options); + }; const [{ schema }] = await loader.load(testUrl, { - customFetch: async (url, options) => { - if (String(options?.body).includes('IntrospectionQuery')) { - return new Response( - JSON.stringify({ - data: introspectionFromSchema(testSchema), - }), - { - headers: { - 'content-type': 'application/json', - }, - } - ); - } - return defaultAsyncFetch(url, options); - }, + customFetch, subscriptionsProtocol: SubscriptionProtocol.GRAPHQL_SSE, }); diff --git a/packages/stitch/src/createMergedTypeResolver.ts b/packages/stitch/src/createMergedTypeResolver.ts index 8334d0116fb..351934fb5ab 100644 --- a/packages/stitch/src/createMergedTypeResolver.ts +++ b/packages/stitch/src/createMergedTypeResolver.ts @@ -2,7 +2,7 @@ import { getNamedType, GraphQLList, GraphQLOutputType, OperationTypeNode } from import { delegateToSchema, MergedTypeResolver, MergedTypeResolverOptions } from '@graphql-tools/delegate'; import { batchDelegateToSchema } from '@graphql-tools/batch-delegate'; -export function createMergedTypeResolver( +export function createMergedTypeResolver = any>( mergedTypeResolverOptions: MergedTypeResolverOptions ): MergedTypeResolver | undefined { const { fieldName, argsFromKeys, valuesFromResults, args } = mergedTypeResolverOptions; diff --git a/packages/stitch/src/stitchSchemas.ts b/packages/stitch/src/stitchSchemas.ts index ed02dd37c5d..665d370fe3e 100644 --- a/packages/stitch/src/stitchSchemas.ts +++ b/packages/stitch/src/stitchSchemas.ts @@ -24,7 +24,7 @@ import { } from './subschemaConfigTransforms'; import { applyExtensions, mergeExtensions, mergeResolvers } from '@graphql-tools/merge'; -export function stitchSchemas>({ +export function stitchSchemas = Record>({ subschemas = [], types = [], typeDefs, diff --git a/packages/stitch/src/stitchingInfo.ts b/packages/stitch/src/stitchingInfo.ts index 89f8d4ef2e8..d62c4bf01bf 100644 --- a/packages/stitch/src/stitchingInfo.ts +++ b/packages/stitch/src/stitchingInfo.ts @@ -25,7 +25,7 @@ import { createMergedTypeResolver } from './createMergedTypeResolver'; import { createDelegationPlanBuilder } from './createDelegationPlanBuilder'; import { ValueOrPromise } from 'value-or-promise'; -export function createStitchingInfo>( +export function createStitchingInfo = Record>( subschemaMap: Map, Subschema>, typeCandidates: Record>>, mergeTypes?: boolean | Array | MergeTypeFilter @@ -41,7 +41,7 @@ export function createStitchingInfo>( }; } -function createMergedTypes>( +function createMergedTypes = Record>( typeCandidates: Record>>, mergeTypes?: boolean | Array | MergeTypeFilter ): Record> { diff --git a/packages/stitch/src/typeCandidates.ts b/packages/stitch/src/typeCandidates.ts index b18152b93ef..8b10e2445e3 100644 --- a/packages/stitch/src/typeCandidates.ts +++ b/packages/stitch/src/typeCandidates.ts @@ -34,7 +34,7 @@ type CandidateSelector> = ( candidates: Array> ) => MergeTypeCandidate; -export function buildTypeCandidates>({ +export function buildTypeCandidates = Record>({ subschemas, originalSubschemaMap, types, diff --git a/packages/stitch/tests/dataloader.test.ts b/packages/stitch/tests/dataloader.test.ts index 47cbc4f35aa..29175e40ed5 100644 --- a/packages/stitch/tests/dataloader.test.ts +++ b/packages/stitch/tests/dataloader.test.ts @@ -74,7 +74,7 @@ describe('dataloader', () => { args: { ids: keys.map((k: { id: any }) => k.id), }, - context: null, + context: undefined, info: keys[0].info, returnType: new GraphQLList(keys[0].info.returnType), }); diff --git a/packages/utils/src/executor.ts b/packages/utils/src/executor.ts index f008ad37aee..46493f634b9 100644 --- a/packages/utils/src/executor.ts +++ b/packages/utils/src/executor.ts @@ -5,7 +5,7 @@ type MaybeAsyncIterable = AsyncIterable | T; export type AsyncExecutor, TBaseExtensions = Record> = < TReturn = any, - TArgs = Record, + TArgs extends Record = Record, TContext extends TBaseContext = TBaseContext, TRoot = any, TExtensions extends TBaseExtensions = TBaseExtensions @@ -15,7 +15,7 @@ export type AsyncExecutor, TBaseExtensions = export type SyncExecutor, TBaseExtensions = Record> = < TReturn = any, - TArgs = Record, + TArgs extends Record = Record, TContext extends TBaseContext = TBaseContext, TRoot = any, TExtensions extends TBaseExtensions = TBaseExtensions @@ -25,7 +25,7 @@ export type SyncExecutor, TBaseExtensions = R export type Executor, TBaseExtensions = Record> = < TReturn = any, - TArgs = Record, + TArgs extends Record = Record, TContext extends TBaseContext = TBaseContext, TRoot = any, TExtensions extends TBaseExtensions = TBaseExtensions diff --git a/packages/wrap/src/generateProxyingResolvers.ts b/packages/wrap/src/generateProxyingResolvers.ts index cc121d8662b..d44e099c877 100644 --- a/packages/wrap/src/generateProxyingResolvers.ts +++ b/packages/wrap/src/generateProxyingResolvers.ts @@ -12,7 +12,7 @@ import { getUnpathedErrors, } from '@graphql-tools/delegate'; -export function generateProxyingResolvers( +export function generateProxyingResolvers>( subschemaConfig: SubschemaConfig ): Record>> { const targetSchema = subschemaConfig.schema; @@ -58,7 +58,7 @@ function identical(value: T): T { return value; } -function createPossiblyNestedProxyingResolver( +function createPossiblyNestedProxyingResolver>( subschemaConfig: SubschemaConfig, proxyingResolver: GraphQLFieldResolver ): GraphQLFieldResolver { @@ -84,7 +84,7 @@ function createPossiblyNestedProxyingResolver( }; } -export function defaultCreateProxyingResolver({ +export function defaultCreateProxyingResolver>({ subschemaConfig, operation, transformedSchema, diff --git a/packages/wrap/src/transforms/WrapFields.ts b/packages/wrap/src/transforms/WrapFields.ts index e5a04014353..156249aa427 100644 --- a/packages/wrap/src/transforms/WrapFields.ts +++ b/packages/wrap/src/transforms/WrapFields.ts @@ -31,7 +31,9 @@ interface WrapFieldsTransformationContext { paths: Record; alias: string }>; } -export default class WrapFields implements Transform { +export default class WrapFields> + implements Transform +{ private readonly outerTypeName: string; private readonly wrappingFieldNames: Array; private readonly wrappingTypeNames: Array; diff --git a/packages/wrap/src/transforms/WrapType.ts b/packages/wrap/src/transforms/WrapType.ts index a05db9c4fc8..ed6bc85d54f 100644 --- a/packages/wrap/src/transforms/WrapType.ts +++ b/packages/wrap/src/transforms/WrapType.ts @@ -8,7 +8,7 @@ import WrapFields from './WrapFields'; interface WrapTypeTransformationContext extends Record {} -export default class WrapType> +export default class WrapType = Record> implements Transform { private readonly transformer: WrapFields; diff --git a/packages/wrap/src/wrapSchema.ts b/packages/wrap/src/wrapSchema.ts index 2532cd8611c..39edb49b3ea 100644 --- a/packages/wrap/src/wrapSchema.ts +++ b/packages/wrap/src/wrapSchema.ts @@ -11,7 +11,7 @@ import { MapperKind, mapSchema } from '@graphql-tools/utils'; import { SubschemaConfig, defaultMergedResolver, applySchemaTransforms } from '@graphql-tools/delegate'; import { generateProxyingResolvers } from './generateProxyingResolvers'; -export function wrapSchema>( +export function wrapSchema = Record>( subschemaConfig: SubschemaConfig ): GraphQLSchema { const targetSchema = subschemaConfig.schema;