UNPKG

kakapo

Version:

Next generation mocking framework in Javascript

100 lines (99 loc) 4.16 kB
"use strict"; 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; };