apollo-fetch
Version:
Lightweight implementation of fetch for GraphQL requests
196 lines (191 loc) • 6.56 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('cross-fetch/polyfill')) :
typeof define === 'function' && define.amd ? define(['exports', 'cross-fetch/polyfill'], factory) :
(factory((global.apolloFetch = {})));
}(this, (function (exports) { 'use strict';
var __assign = (undefined && undefined.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
function buildWareStack(funcs, modifiedObject, resolve) {
var _this = this;
var next = function () {
if (funcs.length > 0) {
var f = funcs.shift();
if (f) {
f.apply(_this, [modifiedObject, next]);
}
}
else {
resolve(modifiedObject);
}
};
next();
}
function constructDefaultOptions(requestOrRequests, options) {
var body;
try {
body = JSON.stringify(requestOrRequests);
}
catch (e) {
throw new Error("Network request failed. Payload is not serializable: " + e.message);
}
return __assign({ body: body, method: 'POST' }, options, { headers: __assign({ Accept: '*/*', 'Content-Type': 'application/json' }, options.headers || []) });
}
function throwHttpError(response, error) {
var httpError;
if (response && response.status >= 300) {
httpError = new Error("Network request failed with status " + response.status + " - \"" + response.statusText + "\"");
}
else {
httpError = new Error("Network request failed to return valid JSON");
}
httpError.response = response;
httpError.parseError = error;
throw httpError;
}
function throwBatchError(response) {
var httpError = new Error("A batched Operation of responses for ");
httpError.response = response;
throw httpError;
}
function createApolloFetch(params) {
if (params === void 0) { params = {}; }
var constructOptions = params.constructOptions, customFetch = params.customFetch;
var _uri = params.uri || '/graphql';
var middlewares = [];
var batchedMiddlewares = [];
var afterwares = [];
var batchedAfterwares = [];
var applyMiddlewares = function (requestAndOptions, batched) {
return new Promise(function (resolve, reject) {
if (batched) {
buildWareStack(batchedMiddlewares.slice(), requestAndOptions, resolve);
}
else {
buildWareStack(middlewares.slice(), requestAndOptions, resolve);
}
});
};
var applyAfterwares = function (responseObject, batched) {
return new Promise(function (resolve, reject) {
if (batched) {
buildWareStack(batchedAfterwares.slice(), responseObject, resolve);
}
else {
buildWareStack(afterwares.slice(), responseObject, resolve);
}
});
};
var apolloFetch = function (request) {
var options = {};
var parseError;
var batched = Array.isArray(request);
var requestObject = (batched
? {
requests: request,
options: options,
}
: {
request: request,
options: options,
});
return applyMiddlewares(requestObject, batched)
.then(function (reqOpts) {
var construct = constructOptions || constructDefaultOptions;
var requestOrRequests = reqOpts.request ||
reqOpts.requests;
return construct(requestOrRequests, reqOpts.options);
})
.then(function (opts) {
options = __assign({}, opts);
return (customFetch || fetch)(_uri, options);
})
.then(function (response) {
return response.text().then(function (raw) {
try {
var parsed = JSON.parse(raw);
response.raw = raw;
response.parsed = parsed;
return response;
}
catch (e) {
parseError = e;
response.raw = raw;
return response;
}
});
})
.then(function (response) {
return applyAfterwares({
response: response,
options: options,
}, batched);
})
.then(function (_a) {
var response = _a.response;
if (response.parsed) {
if (batched) {
if (Array.isArray(response.parsed)) {
return response.parsed;
}
else {
throwBatchError(response);
}
}
else {
return __assign({}, response.parsed);
}
}
else {
throwHttpError(response, parseError);
}
});
};
apolloFetch.use = function (middleware) {
if (typeof middleware === 'function') {
middlewares.push(middleware);
}
else {
throw new Error('Middleware must be a function');
}
return apolloFetch;
};
apolloFetch.useAfter = function (afterware) {
if (typeof afterware === 'function') {
afterwares.push(afterware);
}
else {
throw new Error('Afterware must be a function');
}
return apolloFetch;
};
apolloFetch.batchUse = function (middleware) {
if (typeof middleware === 'function') {
batchedMiddlewares.push(middleware);
}
else {
throw new Error('Middleware must be a function');
}
return apolloFetch;
};
apolloFetch.batchUseAfter = function (afterware) {
if (typeof afterware === 'function') {
batchedAfterwares.push(afterware);
}
else {
throw new Error('Afterware must be a function');
}
return apolloFetch;
};
return apolloFetch;
}
exports.constructDefaultOptions = constructDefaultOptions;
exports.createApolloFetch = createApolloFetch;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=bundle.umd.js.map