From 4dc1a7821fce2e0a50e3093536c9aa0071037171 Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Mon, 28 Oct 2024 19:53:41 -0400 Subject: [PATCH] improve: remove interface conecpt from anyware (#1237) --- package.json | 2 +- .../5_request/{types.ts => Transport.ts} | 6 ----- src/layers/5_request/core.ts | 24 +++--------------- src/layers/5_request/hooks.ts | 21 ++-------------- src/layers/6_client/Settings/Config.ts | 2 +- src/layers/6_client/Settings/InputToConfig.ts | 2 +- .../inputIncrementable/inputIncrementable.ts | 2 +- .../6_client/client.transport-http.test.ts | 2 +- .../6_client/client.transport-memory.test.ts | 2 +- src/layers/6_client/gql/gql.ts | 3 --- src/layers/6_client/handleOutput.ts | 2 +- .../6_client/requestMethods/document.test.ts | 2 +- .../6_client/requestMethods/requestMethods.ts | 25 +++++++++++-------- 13 files changed, 27 insertions(+), 68 deletions(-) rename src/layers/5_request/{types.ts => Transport.ts} (65%) diff --git a/package.json b/package.json index 8c53fdb41..eef75eed9 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "clean": "tsc --build --clean && rm -rf build", "test:unit": "vitest --exclude tests/examples --exclude tests/e2e", "test:examples": "vitest --config vitest.examples.config.ts --dir tests/examples", - "test:e2e": "vitest --dir tests/e2e --testTimeout 10000", + "test:e2e": "vitest --dir tests/e2e --testTimeout 20000", "test": "vitest", "test:web": "vitest --environment jsdom", "test:types": "vitest --typecheck --dir src --testNamePattern .*.test-d.ts", diff --git a/src/layers/5_request/types.ts b/src/layers/5_request/Transport.ts similarity index 65% rename from src/layers/5_request/types.ts rename to src/layers/5_request/Transport.ts index 6b7085273..19d4fb9fe 100644 --- a/src/layers/5_request/types.ts +++ b/src/layers/5_request/Transport.ts @@ -8,9 +8,3 @@ export const Transport = { memory: `memory`, http: `http`, } as const - -export type Interface = InterfaceRaw | InterfaceTyped - -export type InterfaceRaw = 'raw' - -export type InterfaceTyped = 'typed' diff --git a/src/layers/5_request/core.ts b/src/layers/5_request/core.ts index 35a80b4b5..c20c3d08f 100644 --- a/src/layers/5_request/core.ts +++ b/src/layers/5_request/core.ts @@ -1,4 +1,4 @@ -import { SelectionSetGraphqlMapper } from '../../documentBuilder/SelectGraphQLMapper/__.js' +import type { SelectionSetGraphqlMapper } from '../../documentBuilder/SelectGraphQLMapper/__.js' import { Anyware } from '../../lib/anyware/__.js' import type { Grafaid } from '../../lib/grafaid/__.js' import { getOperationDefinition, OperationTypeToAccessKind, print } from '../../lib/grafaid/document.js' @@ -22,7 +22,7 @@ import { hookNamesOrderedBySequence, type HookSequence, } from './hooks.js' -import { Transport } from './types.js' +import { Transport } from './Transport.js' export const graffleMappedResultToRequest = ( { document, operationsVariables }: SelectionSetGraphqlMapper.Encoded, @@ -62,25 +62,7 @@ export const anyware = Anyware.create { - let request: Grafaid.RequestAnalyzedInput - - if (input.interfaceType === `raw`) { - request = input.request - } else { - request = graffleMappedResultToRequest( - SelectionSetGraphqlMapper.toGraphQL(input.request.document, { - sddm: input.state.config.schemaMap, - // todo test that when custom scalars are used they are mapped correctly - scalars: input.state.scalars.map, - }), - input.request.operationName, - ) - } - - return { - ...input, - request, - } + return input }, pack: { slots: { diff --git a/src/layers/5_request/hooks.ts b/src/layers/5_request/hooks.ts index 60417a2be..8777b7140 100644 --- a/src/layers/5_request/hooks.ts +++ b/src/layers/5_request/hooks.ts @@ -1,25 +1,16 @@ import type { FormattedExecutionResult, GraphQLSchema } from 'graphql' -import type { Select } from '../../documentBuilder/Select/__.js' import type { Grafaid } from '../../lib/grafaid/__.js' import type { getRequestEncodeSearchParameters, postRequestEncodeBody } from '../../lib/grafaid/http/http.js' import type { httpMethodGet, httpMethodPost } from '../../lib/http.js' import type { ClientContext } from '../6_client/fluent.js' import type { Config } from '../6_client/Settings/Config.js' import type { MethodModeGetReads, MethodModePost } from '../6_client/transportHttp/request.js' -import type { InterfaceRaw, InterfaceTyped, TransportHttp, TransportMemory } from './types.js' +import type { TransportHttp, TransportMemory } from './Transport.js' interface HookInputBase { state: ClientContext } -type InterfaceInput = - | ({ - interfaceType: InterfaceTyped - } & TypedProperties) - | ({ - interfaceType: InterfaceRaw - } & RawProperties) - // dprint-ignore type TransportInput<$Config extends Config, $HttpProperties = {}, $MemoryProperties = {}> = @@ -44,19 +35,14 @@ type TransportInput<$Config extends Config, $HttpProperties = {}, $MemoryPropert export type HookDefEncode<$Config extends Config> = { input: + & { request: Grafaid.RequestAnalyzedInput } & HookInputBase - & InterfaceInput< - { request: { document: Select.Document.DocumentNormalized; operationName?: string } }, - // { request: Grafaid.RequestInput } - { request: Grafaid.RequestAnalyzedInput } - > & TransportInput<$Config> } export type HookDefPack<$Config extends Config> = { input: & HookInputBase - & InterfaceInput & TransportInput< $Config, // todo why is headers here but not other http request properties? @@ -81,7 +67,6 @@ export type HookDefExchange<$Config extends Config> = { } input: & HookInputBase - & InterfaceInput & TransportInput< $Config, { request: CoreExchangePostRequest | CoreExchangeGetRequest; headers?: HeadersInit }, @@ -92,7 +77,6 @@ export type HookDefExchange<$Config extends Config> = { export type HookDefUnpack<$Config extends Config> = { input: & HookInputBase - & InterfaceInput & TransportInput< $Config, { response: Response }, @@ -103,7 +87,6 @@ export type HookDefUnpack<$Config extends Config> = { export type HookDefDecode<$Config extends Config> = { input: & HookInputBase - & InterfaceInput & TransportInput< $Config, { response: Response } diff --git a/src/layers/6_client/Settings/Config.ts b/src/layers/6_client/Settings/Config.ts index 879960a8b..3a06622c1 100644 --- a/src/layers/6_client/Settings/Config.ts +++ b/src/layers/6_client/Settings/Config.ts @@ -2,7 +2,7 @@ import type { GraphQLSchema } from 'graphql' import type { RequireProperties } from '../../../lib/prelude.js' import type { GlobalRegistry } from '../../../types/GlobalRegistry/GlobalRegistry.js' import type { SchemaDrivenDataMap } from '../../../types/SchemaDrivenDataMap/__.js' -import type { TransportHttp, TransportMemory } from '../../5_request/types.js' +import type { TransportHttp, TransportMemory } from '../../5_request/Transport.js' import type { Extension } from '../extension/extension.js' import type { TransportHttpInput } from '../transportHttp/request.js' import type { InputStatic } from './Input.js' diff --git a/src/layers/6_client/Settings/InputToConfig.ts b/src/layers/6_client/Settings/InputToConfig.ts index 8f4371783..08feb45b0 100644 --- a/src/layers/6_client/Settings/InputToConfig.ts +++ b/src/layers/6_client/Settings/InputToConfig.ts @@ -1,7 +1,7 @@ import type { IsUnknown } from 'type-fest' import type { ConfigManager } from '../../../lib/config-manager/__.js' import type { GlobalRegistry } from '../../../types/GlobalRegistry/GlobalRegistry.js' -import { Transport } from '../../5_request/types.js' +import { Transport } from '../../5_request/Transport.js' import { defaultMethodMode } from '../transportHttp/request.js' import { outputConfigDefault, type TransportConfigHttp, type TransportConfigMemory } from './Config.js' import type { InputOutputEnvelopeLonghand, InputStatic, URLInput } from './Input.js' diff --git a/src/layers/6_client/Settings/inputIncrementable/inputIncrementable.ts b/src/layers/6_client/Settings/inputIncrementable/inputIncrementable.ts index fb28aa156..3cfcec9fc 100644 --- a/src/layers/6_client/Settings/inputIncrementable/inputIncrementable.ts +++ b/src/layers/6_client/Settings/inputIncrementable/inputIncrementable.ts @@ -1,5 +1,5 @@ import type { GlobalRegistry } from '../../../../types/GlobalRegistry/GlobalRegistry.js' -import type { Transport, TransportMemory } from '../../../5_request/types.js' +import type { Transport, TransportMemory } from '../../../5_request/Transport.js' import type { TransportHttpInput } from '../../transportHttp/request.js' import type { Config } from '../Config.js' import type { NormalizeInput } from '../InputToConfig.js' diff --git a/src/layers/6_client/client.transport-http.test.ts b/src/layers/6_client/client.transport-http.test.ts index 8cc730ee3..9397ce8c8 100644 --- a/src/layers/6_client/client.transport-http.test.ts +++ b/src/layers/6_client/client.transport-http.test.ts @@ -4,7 +4,7 @@ import { serveSchema } from '../../../tests/_/lib/serveSchema.js' import { Graffle as Pokemon } from '../../../tests/_/schemas/pokemon/graffle/__.js' import { Graffle } from '../../entrypoints/main.js' import { ACCEPT_REC, CONTENT_TYPE_REC } from '../../lib/grafaid/http/http.js' -import { Transport } from '../5_request/types.js' +import { Transport } from '../5_request/Transport.js' const schema = new URL(`https://foo.io/api/graphql`) diff --git a/src/layers/6_client/client.transport-memory.test.ts b/src/layers/6_client/client.transport-memory.test.ts index b52a5aa13..a495f942b 100644 --- a/src/layers/6_client/client.transport-memory.test.ts +++ b/src/layers/6_client/client.transport-memory.test.ts @@ -2,7 +2,7 @@ import { expectTypeOf } from 'vitest' import { test } from '../../../tests/_/helpers.js' import { schema } from '../../../tests/_/schemas/kitchen-sink/schema.js' import { Graffle } from '../../entrypoints/main.js' -import { Transport } from '../5_request/types.js' +import { Transport } from '../5_request/Transport.js' test(`anyware hooks are typed to memory transport`, () => { Graffle.create({ schema }).anyware(async ({ encode }) => { diff --git a/src/layers/6_client/gql/gql.ts b/src/layers/6_client/gql/gql.ts index 258fab0cc..63d848585 100644 --- a/src/layers/6_client/gql/gql.ts +++ b/src/layers/6_client/gql/gql.ts @@ -7,7 +7,6 @@ import { type TemplateStringsArguments, } from '../../../lib/template-string.js' import { RequestCore } from '../../5_request/__.js' // todo -import type { InterfaceRaw } from '../../5_request/types.js' import { type ClientContext, defineTerminus } from '../fluent.js' import { handleOutput } from '../handleOutput.js' import type { Config } from '../Settings/Config.js' @@ -37,7 +36,6 @@ export const gqlProperties = defineTerminus((state) => { return { gql: (...args: gqlArguments) => { const { document: query } = resolveGqlArguments(args) - const interfaceType: InterfaceRaw = `raw` const transportType = state.config.transport.type const url = state.config.transport.type === `http` ? state.config.transport.url : undefined const schema = state.config.transport.type === `http` ? undefined : state.config.transport.schema @@ -61,7 +59,6 @@ export const gqlProperties = defineTerminus((state) => { } const initialInput = { - interfaceType, transportType, state, url, diff --git a/src/layers/6_client/handleOutput.ts b/src/layers/6_client/handleOutput.ts index 17b2ffafc..630a8173f 100644 --- a/src/layers/6_client/handleOutput.ts +++ b/src/layers/6_client/handleOutput.ts @@ -11,7 +11,7 @@ import { type Values, } from '../../lib/prelude.js' import type { GlobalRegistry } from '../../types/GlobalRegistry/GlobalRegistry.js' -import type { TransportHttp } from '../5_request/types.js' +import type { TransportHttp } from '../5_request/Transport.js' import type { RunTypeHookOnRequestResult } from './extension/extension.js' import type { ClientContext } from './fluent.js' import { diff --git a/src/layers/6_client/requestMethods/document.test.ts b/src/layers/6_client/requestMethods/document.test.ts index d67c85ed3..fbf5d8f2c 100644 --- a/src/layers/6_client/requestMethods/document.test.ts +++ b/src/layers/6_client/requestMethods/document.test.ts @@ -47,7 +47,7 @@ describe(`document with two queries`, () => { const { run } = withTwo // @ts-expect-error const error = await run(`boo`).catch((e: unknown) => e) as Errors.ContextualAggregateError - expect(error.cause?.message).toEqual(`Unknown operation named "boo".`) + expect(error.message).toEqual(`Unknown operation named "boo".`) }) test(`error if no operations provided`, () => { expect(() => { diff --git a/src/layers/6_client/requestMethods/requestMethods.ts b/src/layers/6_client/requestMethods/requestMethods.ts index 0a683596f..09aee3efa 100644 --- a/src/layers/6_client/requestMethods/requestMethods.ts +++ b/src/layers/6_client/requestMethods/requestMethods.ts @@ -1,11 +1,12 @@ import { OperationTypeNode } from 'graphql' import { Select } from '../../../documentBuilder/Select/__.js' +import { SelectionSetGraphqlMapper } from '../../../documentBuilder/SelectGraphQLMapper/__.js' import type { TypeFunction } from '../../../entrypoints/utilities-for-generated.js' import type { Fluent } from '../../../lib/fluent/__.js' -import type { Grafaid } from '../../../lib/grafaid/__.js' import { isSymbol } from '../../../lib/prelude.js' import type { GlobalRegistry } from '../../../types/GlobalRegistry/GlobalRegistry.js' import { RequestCore } from '../../5_request/__.js' +import { graffleMappedResultToRequest } from '../../5_request/core.js' import { type ClientContext, defineTerminus } from '../fluent.js' import { handleOutput } from '../handleOutput.js' import type { Config } from '../Settings/Config.js' @@ -47,7 +48,7 @@ export const requestMethodsProperties = defineTerminus((state) => { } }) -export const createMethodDocument = (state: ClientContext) => (document: Select.Document.DocumentObject) => { +const createMethodDocument = (state: ClientContext) => (document: Select.Document.DocumentObject) => { const documentNormalized = Select.Document.normalizeOrThrow(document) return { run: async (maybeOperationName?: string) => { @@ -105,28 +106,30 @@ const executeOperation = async ( ) } -export const executeDocument = async ( +const executeDocument = async ( state: ClientContext, document: Select.Document.DocumentNormalized, operationName?: string, - variables?: Grafaid.Variables, ) => { const transportType = state.config.transport.type - const interfaceType = `typed` const url = state.config.transport.type === `http` ? state.config.transport.url : undefined const schema = state.config.transport.type === `http` ? undefined : state.config.transport.schema + const request = graffleMappedResultToRequest( + SelectionSetGraphqlMapper.toGraphQL(document, { + sddm: state.config.schemaMap, + // todo test that when custom scalars are used they are mapped correctly + scalars: state.scalars.map, + }), + operationName, + ) + const initialInput = { state, - interfaceType, transportType, url, schema, - request: { - document, - operationName, - variables, - }, + request, } as RequestCore.Hooks.HookDefEncode['input'] const result = await RequestCore.anyware.run({