kakapo
Version:
Next generation mocking framework in Javascript
100 lines (99 loc) • 4.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var Response_1 = require("../Response");
var Request_1 = require("../Request");
var interceptorHelper_1 = require("./interceptorHelper");
var utils_1 = require("../utils");
var Database_1 = require("../Database");
var fakeResponse = function (response, headers) {
if (response === void 0) { response = {}; }
if (headers === void 0) { headers = {}; }
if (headers['content-type'] &&
headers['content-type'].indexOf('application/json') == -1) {
return new Response(response, { headers: headers });
}
return new Response(JSON.stringify(response), { headers: headers });
};
var FakeFetchFactory = (function () {
function FakeFetchFactory() {
this.interceptors = [];
}
FakeFetchFactory.prototype.use = function (config) {
this.interceptors.push(interceptorHelper_1.interceptorHelper(config));
};
FakeFetchFactory.prototype.getFetch = function () {
var _this = this;
return function (requestInfo, options) {
if (options === void 0) { options = {}; }
var url = utils_1.mapRequestInfoToUrlString(requestInfo);
var method = options.method || 'GET';
var interceptor = _this.interceptors.reduce(function (result, interceptor) {
return interceptor.getHandler(url, method) !== null ? interceptor : result;
}, undefined);
if (interceptor) {
var handler = interceptor.getHandler(url, method);
if (handler) {
var request = new Request_1.KakapoRequest({
params: interceptor.getParams(url, method),
query: interceptor.getQuery(url),
body: options.body || '',
headers: options.headers || {}
});
var db = interceptor.getDB() || new Database_1.Database();
var response_1 = handler(request, db);
if (response_1 instanceof Promise) {
return response_1.then(function (data) {
if (data instanceof Response_1.KakapoResponse) {
return fakeResponse(data.body, data.headers);
}
return fakeResponse(data);
});
}
if (!(response_1 instanceof Response_1.KakapoResponse)) {
return new Promise(function (resolve) {
return setTimeout(function () { return resolve(fakeResponse(response_1)); }, interceptor.getDelay());
});
}
var result_1 = fakeResponse(response_1.body, response_1.headers);
return new Promise(function (resolve, reject) {
return setTimeout(function () {
if (response_1.error) {
return reject(result_1);
}
return resolve(result_1);
}, interceptor.getDelay());
});
}
else {
return nativeFetch(url, options);
}
}
else {
return nativeFetch(url, options);
}
};
};
return FakeFetchFactory;
}());
exports.FakeFetchFactory = FakeFetchFactory;
var nativeFetch;
function isFakeFetch(fetch) {
return window.fetch !== nativeFetch;
}
exports.isFakeFetch = isFakeFetch;
var fakeFetchFactory = new FakeFetchFactory();
exports.enable = function (config) {
if (!utils_1.canUseWindow) {
throw new Error("You're trying to use fetch interceptor in non-browser environment");
}
if (!nativeFetch) {
nativeFetch = window.fetch;
}
if (!isFakeFetch(window.fetch)) {
window.fetch = fakeFetchFactory.getFetch();
}
fakeFetchFactory.use(config);
};
exports.disable = function () {
window.fetch = nativeFetch;
};