Skip to content

Commit 08bf4b4

Browse files
eokoneyoAlan-Cha
authored andcommitted
allow modification to default configuration for form data object used for file uploads
Signed-off-by: Eyo Okon Eyo <[email protected]>
1 parent 0a04db3 commit 08bf4b4

File tree

4 files changed

+38
-4
lines changed

4 files changed

+38
-4
lines changed

packages/openapi-to-graphql/src/index.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ import {
3636
InternalOptions,
3737
Report,
3838
ConnectOptions,
39-
RequestOptions
39+
RequestOptions,
40+
FileUploadOptions
4041
} from './types/options'
4142
import { Oas3 } from './types/oas3'
4243
import { Oas2 } from './types/oas2'
@@ -112,6 +113,7 @@ const DEFAULT_OPTIONS: InternalOptions<any, any, any> = {
112113
requestOptions: {},
113114
customResolvers: {},
114115
customSubscriptionResolvers: {},
116+
fileUploadOptions: {},
115117

116118
// Authentication options
117119
viewer: true,
@@ -193,6 +195,7 @@ export function translateOpenAPIToGraphQL<TSource, TContext, TArgs>(
193195
headers,
194196
qs,
195197
requestOptions,
198+
fileUploadOptions,
196199
connectOptions,
197200
baseUrl,
198201
customResolvers,
@@ -234,6 +237,7 @@ export function translateOpenAPIToGraphQL<TSource, TContext, TArgs>(
234237
headers,
235238
qs,
236239
requestOptions,
240+
fileUploadOptions,
237241
connectOptions,
238242
baseUrl,
239243
customResolvers,
@@ -477,6 +481,7 @@ function addQueryFields<TSource, TContext, TArgs>({
477481
singularNames,
478482
baseUrl,
479483
requestOptions,
484+
fileUploadOptions,
480485
connectOptions,
481486
fetch
482487
} = options
@@ -486,6 +491,7 @@ function addQueryFields<TSource, TContext, TArgs>({
486491
baseUrl,
487492
data,
488493
requestOptions,
494+
fileUploadOptions,
489495
connectOptions,
490496
fetch
491497
)
@@ -654,6 +660,7 @@ function addMutationFields<TSource, TContext, TArgs>({
654660
singularNames,
655661
baseUrl,
656662
requestOptions,
663+
fileUploadOptions,
657664
connectOptions,
658665
fetch
659666
} = options
@@ -663,6 +670,7 @@ function addMutationFields<TSource, TContext, TArgs>({
663670
baseUrl,
664671
data,
665672
requestOptions,
673+
fileUploadOptions,
666674
connectOptions,
667675
fetch
668676
)
@@ -802,13 +810,14 @@ function addSubscriptionFields<TSource, TContext, TArgs>({
802810
options: InternalOptions<TSource, TContext, TArgs>
803811
data: PreprocessingData<TSource, TContext, TArgs>
804812
}) {
805-
const { baseUrl, requestOptions, connectOptions, fetch } = options
813+
const { baseUrl, requestOptions, connectOptions, fetch, fileUploadOptions } = options
806814

807815
const field = getFieldForOperation(
808816
operation,
809817
baseUrl,
810818
data,
811819
requestOptions,
820+
fileUploadOptions,
812821
connectOptions,
813822
fetch
814823
)
@@ -912,6 +921,7 @@ function getFieldForOperation<TSource, TContext, TArgs>(
912921
baseUrl: string,
913922
data: PreprocessingData<TSource, TContext, TArgs>,
914923
requestOptions: Partial<RequestOptions<TSource, TContext, TArgs>>,
924+
fileUploadOptions: FileUploadOptions,
915925
connectOptions: ConnectOptions,
916926
fetch: typeof crossFetch
917927
): GraphQLFieldConfig<TSource, TContext | SubscriptionContext, TArgs> {
@@ -978,6 +988,7 @@ function getFieldForOperation<TSource, TContext, TArgs>(
978988
data,
979989
baseUrl,
980990
requestOptions,
991+
fileUploadOptions,
981992
fetch
982993
})
983994

packages/openapi-to-graphql/src/resolver_builder.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { ConnectOptions } from './types/options'
1313
import { TargetGraphQLType, Operation } from './types/operation'
1414
import { SubscriptionContext } from './types/graphql'
1515
import { PreprocessingData } from './types/preprocessing_data'
16-
import { RequestOptions } from './types/options'
16+
import { RequestOptions, FileUploadOptions } from './types/options'
1717
import crossFetch from 'cross-fetch'
1818
import { FileUpload } from 'graphql-upload'
1919

@@ -61,6 +61,7 @@ type GetResolverParams<TSource, TContext, TArgs> = {
6161
data: PreprocessingData<TSource, TContext, TArgs>
6262
baseUrl?: string
6363
requestOptions?: Partial<RequestOptions<TSource, TContext, TArgs>>
64+
fileUploadOptions?: FileUploadOptions
6465
fetch: typeof crossFetch
6566
}
6667

@@ -334,6 +335,7 @@ export function getResolver<TSource, TContext, TArgs> ({
334335
data,
335336
baseUrl,
336337
requestOptions,
338+
fileUploadOptions,
337339
fetch
338340
}: GetResolverParams<TSource, TContext, TArgs>): GraphQLFieldResolver<
339341
TSource & OpenAPIToGraphQLSource<TSource, TContext, TArgs>,
@@ -578,7 +580,7 @@ export function getResolver<TSource, TContext, TArgs> ({
578580
Oas3Tools.desanitizeObjectKeys(args[sanePayloadName], data.saneMap)
579581
)
580582
} else if (operation.payloadContentType === 'multipart/form-data') {
581-
form = new FormData()
583+
form = new FormData(fileUploadOptions)
582584

583585
const formFieldsPayloadEntries = Object.entries(args[sanePayloadName]);
584586

packages/openapi-to-graphql/src/schema_builder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,7 @@ function createFields<TSource, TContext, TArgs>({
785785
data,
786786
baseUrl: data.options.baseUrl,
787787
requestOptions: data.options.requestOptions,
788+
fileUploadOptions: data.options.fileUploadOptions,
788789
fetch
789790
})
790791

packages/openapi-to-graphql/src/types/options.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import { GraphQLOperationType, SubscriptionContext } from './graphql'
88
import { GraphQLFieldResolver, GraphQLResolveInfo } from 'graphql'
99
import crossFetch from 'cross-fetch'
10+
import FormData from 'form-data'
1011

1112
/**
1213
* Type definition of the options that users can pass to OpenAPI-to-GraphQL.
@@ -76,6 +77,17 @@ export type RequestOptions<TSource, TContext, TArgs> = Omit<
7677
qs?: Record<string, string>
7778
}
7879

80+
/**
81+
* We use the form-data library to prepare multipart requests within the resolver API calls,
82+
* also it provides support for handling file as streams this way the file upload has a minimal memory footprint,
83+
* unlike the situation where the entire file in memory initially.
84+
*
85+
* Provides accommodation to allow overrides or add options for how the form data representation for multipart requests is generated
86+
*
87+
* Based on: https://github.com/form-data/form-data#custom-options
88+
*/
89+
export type FileUploadOptions = ConstructorParameters<typeof FormData>[0]
90+
7991
export type Options<TSource, TContext, TArgs> = Partial<
8092
InternalOptions<TSource, TContext, TArgs>
8193
>
@@ -275,6 +287,14 @@ export type InternalOptions<TSource, TContext, TArgs> = {
275287
resolve: GraphQLFieldResolver<TSource, TContext, TArgs>
276288
}>
277289

290+
/**
291+
* Allows one to define config for the form data that will be used in streaming
292+
* the uploaded file from the client to the intending endpoint
293+
*
294+
* Based on https://github.com/form-data/form-data#custom-options
295+
*/
296+
fileUploadOptions?: FileUploadOptions
297+
278298
// Authentication options
279299

280300
/**

0 commit comments

Comments
 (0)