reiso
Version:
163 lines • 11.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const apollo_link_1 = require("apollo-link");
const apollo_link_http_common_1 = require("apollo-link-http-common");
function collectFiles(formData, object) {
let hasFile = false;
for (let [name, node] of Object.entries(object)) {
if (node instanceof File) {
hasFile = true;
const id = Math.random().toString(36);
formData.append(id, node, node.name);
object[name] = id;
}
else if (node instanceof Object) {
hasFile = collectFiles(formData, node) ? true : hasFile;
}
}
return hasFile;
}
class UploadLink extends apollo_link_1.ApolloLink {
constructor() {
super();
}
request(operation, forward) {
const formData = new FormData();
let hasFiles = false;
if (collectFiles(formData, operation.variables)) {
hasFiles = true;
}
if (hasFiles) {
if (typeof FormData === 'undefined') {
throw new Error('Environment must support FormData to upload files.');
}
let body = formData;
body.append('operations', JSON.stringify(operation));
// files.forEach(({ path, file }) => options.body.append(path, file));
// return options;
operation.setContext(({ headers }) => ({
method: 'POST',
body,
headers: Object.assign({}, headers, {
// Accept: '*/*'
'content-type': 'multipart/form-data' })
}));
}
// operation.setContext(({ headers }) => ({
// method: 'POST',
// headers: {
// 'content-type': 'application/graphql'
// }
// }));
return forward(operation);
}
}
exports.UploadLink = UploadLink;
// export function createLinkNetwork(opts: FetchOptions = {}) {
// return new BatchHttpLink({
// fetch: createApolloFetchUpload(opts)
// });
// };
// function createApolloFetchUpload(params: FetchOptions = {}): ApolloFetch {
// return createApolloFetch({
// ...params,
// constructOptions: constructUploadOptions,
// });
// }
// function constructUploadOptions(
// requestOrRequests: GraphQLRequest | GraphQLRequest[],
// options: RequestInit,
// ): RequestInit {
// const formData = new FormData();
// let hasFiles = false;
// if (Array.isArray(requestOrRequests)) {
// for (let request of requestOrRequests) {
// if (collectFiles(formData, request.variables)) {
// hasFiles = true;
// }
// }
// } else {
// if (collectFiles(formData, requestOrRequests.variables)) {
// hasFiles = true;
// }
// }
// if (hasFiles) {
// if (typeof FormData === 'undefined') {
// throw new Error('Environment must support FormData to upload files.');
// }
// options.method = 'POST';
// options.body = formData;
// options.body.append('operations', JSON.stringify(requestOrRequests));
// // files.forEach(({ path, file }) => options.body.append(path, file));
// return options;
// }
// return constructDefaultOptions(requestOrRequests, options);
// }
exports.createUploadLink = ({ uri: fetchUri = '/graphql', fetch: linkFetch = fetch, } = {}) => {
const linkConfig = {
http: { includeExtensions: null },
options: null,
credentials: null,
headers: null
};
return new apollo_link_1.ApolloLink(operation => {
const uri = apollo_link_http_common_1.selectURI(operation, fetchUri);
const context = operation.getContext();
const contextConfig = {
http: context.http,
options: context.fetchOptions,
credentials: context.credentials,
headers: context.headers
};
const { options, body } = apollo_link_http_common_1.selectHttpOptionsAndBody(operation, apollo_link_http_common_1.fallbackHttpConfig, linkConfig, contextConfig);
const formData = new FormData();
let hasFiles = false;
if (collectFiles(formData, body.variables)) {
hasFiles = true;
}
const payload = apollo_link_http_common_1.serializeFetchParameter(body, 'Payload');
if (hasFiles) {
// Automatically set by fetch when the body is a FormData instance.
delete options.headers['content-type'];
// GraphQL multipart request spec:
// https://github.com/jaydenseric/graphql-multipart-request-spec
options.body = formData;
options.body.append('operations', payload);
}
else
options.body = payload;
return new apollo_link_1.Observable(observer => {
// Allow aborting fetch, if supported.
const { controller, signal } = apollo_link_http_common_1.createSignalIfSupported();
if (controller)
options.signal = signal;
linkFetch(uri, options)
.then(response => {
// Forward the response on the context.
operation.setContext({ response });
return response;
})
.then(apollo_link_http_common_1.parseAndCheckHttpResponse(operation))
.then(result => {
observer.next(result);
observer.complete();
})
.catch(error => {
if (error.name === 'AbortError')
// Fetch was aborted.
return;
if (error.result && error.result.errors && error.result.data)
// There is a GraphQL result to forward.
observer.next(error.result);
observer.error(error);
});
// Cleanup function.
return () => {
// Abort fetch.
if (controller)
controller.abort();
};
});
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBsb2FkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NsaWVudC9VcGxvYWQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsNkNBQXVGO0FBQ3ZGLHFFQU9nQztBQVVoQyxzQkFBc0IsUUFBa0IsRUFBRSxNQUFjO0lBQ3RELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVwQixLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUMvQyxJQUFJLElBQUksWUFBWSxJQUFJLEVBQUU7WUFDeEIsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ25CO2FBQU0sSUFBSSxJQUFJLFlBQVksTUFBTSxFQUFFO1lBQ2pDLE9BQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztTQUN6RDtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELGdCQUF3QixTQUFRLHdCQUFVO0lBQ3hDO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRUQsT0FBTyxDQUFDLFNBQW9CLEVBQUUsT0FBa0I7UUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNoQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFckIsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxTQUFTLENB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