Skip to content

Commit

Permalink
More
Browse files Browse the repository at this point in the history
  • Loading branch information
ardatan committed Jul 7, 2022
1 parent cbf1512 commit 312ad00
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 39 deletions.
2 changes: 2 additions & 0 deletions .changeset/chilly-rats-marry.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@
New `setResult` helper is available in `onRequestParseDone` hook to set `ExecutionResult` before any GraphQL specific process.

You can check `@graphql-yoga/plugin-response-cache`'s implementation to see how it can be useful.

Also now `onResultProcess` and `useResultProcessor` hooks use generics to get more type-safety.
11 changes: 6 additions & 5 deletions packages/common/src/plugins/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,17 @@ export type ResultProcessorInput = PromiseOrValue<
ExecutionResult | AsyncIterable<ExecutionResult | ExecutionPatchResult>
>

export type ResultProcessor = (
result: ResultProcessorInput,
fetchAPI: FetchAPI,
) => PromiseOrValue<Response>
export type ResultProcessor<
TResult extends ResultProcessorInput = ResultProcessorInput,
> = (result: TResult, fetchAPI: FetchAPI) => PromiseOrValue<Response>

export interface OnResultProcessEventPayload {
request: Request
result: ResultProcessorInput
resultProcessor?: ResultProcessor
setResultProcessor(resultProcessor: ResultProcessor): void
setResultProcessor<TResult extends ResultProcessorInput>(
resultProcessor: ResultProcessor<TResult>,
): void
}

export type OnResponseHook<TServerContext> = (
Expand Down
18 changes: 10 additions & 8 deletions packages/common/src/plugins/useResultProcessor.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import { Plugin, ResultProcessor, ResultProcessorInput } from './types.js'

export interface ResultProcessorPluginOptions {
processResult: ResultProcessor
match?(request: Request, result: ResultProcessorInput): boolean
export interface ResultProcessorPluginOptions<
TResult extends ResultProcessorInput,
> {
processResult: ResultProcessor<TResult>
match?(request: Request, result: ResultProcessorInput): result is TResult
}

export function useResultProcessor(
options: ResultProcessorPluginOptions,
): Plugin {
const isMatch = options.match || (() => true)
export function useResultProcessor<
TResult extends ResultProcessorInput = ResultProcessorInput,
>(options: ResultProcessorPluginOptions<TResult>): Plugin {
const matchFn = options.match || (() => true)
return {
onResultProcess({ request, result, setResultProcessor }) {
if (isMatch(request, result)) {
if (matchFn(request, result)) {
setResultProcessor(options.processResult)
}
},
Expand Down
2 changes: 1 addition & 1 deletion packages/common/src/processRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export async function processResult({
*/
onResultProcessHooks: OnResultProcess[]
}) {
let resultProcessor: ResultProcessor | undefined
let resultProcessor: ResultProcessor<any> | undefined

for (const onResultProcessHook of onResultProcessHooks) {
await onResultProcessHook({
Expand Down
6 changes: 3 additions & 3 deletions packages/common/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -374,15 +374,15 @@ export class YogaServer<
// Middlewares after the GraphQL execution
useResultProcessor({
match: isRegularResult,
processResult: processRegularResult as ResultProcessor,
processResult: processRegularResult,
}),
useResultProcessor({
match: isPushResult,
processResult: processPushResult as ResultProcessor,
processResult: processPushResult,
}),
useResultProcessor({
match: isMultipartResult,
processResult: processMultipartResult as ResultProcessor,
processResult: processMultipartResult,
}),
...(options?.plugins ?? []),

Expand Down
10 changes: 2 additions & 8 deletions packages/common/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
import type {
DocumentNode,
ExecutionResult,
GraphQLError,
OperationDefinitionNode,
} from 'graphql'
import type { DocumentNode, GraphQLError } from 'graphql'
import type { TypedDocumentNode } from '@graphql-typed-document-node/core'
import { GetEnvelopedFn, PromiseOrValue } from '@envelop/core'
import { OnResultProcess } from './plugins/types.js'
import { PromiseOrValue } from '@envelop/core'

export interface ExecutionPatchResult<
TData = { [key: string]: any },
Expand Down
14 changes: 0 additions & 14 deletions packages/plugins/response-cache/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,6 @@
"default": "./dist/esm/index.js"
}
},
"./*": {
"require": {
"types": "./dist/typings/*.d.ts",
"default": "./dist/cjs/*.js"
},
"import": {
"types": "./dist/typings/*.d.ts",
"default": "./dist/esm/*.js"
},
"default": {
"types": "./dist/typings/*.d.ts",
"default": "./dist/esm/*.js"
}
},
"./package.json": "./package.json"
},
"typings": "dist/typings/index.d.ts",
Expand Down

0 comments on commit 312ad00

Please sign in to comment.