UNPKG

4.43 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
7const core = require('@apollo/client/link/core');
8const apolloUploadClient = require('apollo-upload-client');
9const FormData = _interopDefault(require('form-data'));
10const crossFetch = require('cross-fetch');
11const utilities = require('@apollo/client/utilities');
12const core$1 = require('@apollo/client/core');
13const utils = require('@graphql-tools/utils');
14const graphql = require('graphql');
15const isPromise = _interopDefault(require('is-promise'));
16
17function getFinalPromise(object) {
18 return Promise.resolve(object).then(resolvedObject => {
19 if (resolvedObject == null) {
20 return resolvedObject;
21 }
22 if (Array.isArray(resolvedObject)) {
23 return Promise.all(resolvedObject.map(o => getFinalPromise(o)));
24 }
25 else if (typeof resolvedObject === 'object') {
26 const keys = Object.keys(resolvedObject);
27 return Promise.all(keys.map(key => getFinalPromise(resolvedObject[key]))).then(awaitedValues => {
28 for (let i = 0; i < keys.length; i++) {
29 resolvedObject[keys[i]] = awaitedValues[i];
30 }
31 return resolvedObject;
32 });
33 }
34 return resolvedObject;
35 });
36}
37class AwaitVariablesLink extends core.ApolloLink {
38 request(operation, forward) {
39 return new utilities.Observable(observer => {
40 let subscription;
41 getFinalPromise(operation.variables)
42 .then(resolvedVariables => {
43 operation.variables = resolvedVariables;
44 subscription = forward(operation).subscribe({
45 next: observer.next.bind(observer),
46 error: observer.error.bind(observer),
47 complete: observer.complete.bind(observer),
48 });
49 })
50 .catch(observer.error.bind(observer));
51 return () => {
52 if (subscription != null) {
53 subscription.unsubscribe();
54 }
55 };
56 });
57 }
58}
59
60const createServerHttpLink = (options) => core.concat(new AwaitVariablesLink(), apolloUploadClient.createUploadLink({
61 ...options,
62 fetch: crossFetch.fetch,
63 FormData,
64 isExtractableFile: (value) => apolloUploadClient.isExtractableFile(value) || (value === null || value === void 0 ? void 0 : value.createReadStream),
65 formDataAppendFile: (form, index, file) => {
66 if (file.createReadStream != null) {
67 form.append(index, file.createReadStream(), {
68 filename: file.filename,
69 contentType: file.mimetype,
70 });
71 }
72 else {
73 apolloUploadClient.formDataAppendFile(form, index, file);
74 }
75 },
76}));
77
78const linkToExecutor = (link) => async (params) => {
79 const { document, variables, extensions, context, operationType, operationName, info } = params;
80 const observable = core.execute(link, {
81 query: document,
82 variables,
83 context: {
84 graphqlContext: context,
85 graphqlResolveInfo: info,
86 clientAwareness: {},
87 },
88 extensions,
89 operationName,
90 });
91 if (operationType === 'subscription') {
92 return utils.observableToAsyncIterable(observable)[Symbol.asyncIterator]();
93 }
94 return core$1.toPromise(observable);
95};
96
97const GraphQLUpload = new graphql.GraphQLScalarType({
98 name: 'Upload',
99 description: 'The `Upload` scalar type represents a file upload.',
100 parseValue: value => {
101 if (value != null && isPromise(value.promise)) {
102 // graphql-upload v10
103 return value.promise;
104 }
105 else if (isPromise(value)) {
106 // graphql-upload v9
107 return value;
108 }
109 throw new graphql.GraphQLError('Upload value invalid.');
110 },
111 // serialization requires to support schema stitching
112 serialize: value => value,
113 parseLiteral: ast => {
114 throw new graphql.GraphQLError('Upload literal unsupported.', ast);
115 },
116});
117
118exports.AwaitVariablesLink = AwaitVariablesLink;
119exports.GraphQLUpload = GraphQLUpload;
120exports.createServerHttpLink = createServerHttpLink;
121exports.linkToExecutor = linkToExecutor;