@apollo/client
Version:
A fully-featured caching GraphQL client.
139 lines • 6.38 kB
JavaScript
import { __extends } from "tslib";
import { invariant } from "../../../utilities/globals/index.js";
import { print } from 'graphql';
import { equal } from '@wry/equality';
import { ApolloLink, } from "../../../link/core/index.js";
import { Observable, addTypenameToDocument, removeClientSetsFromDocument, removeConnectionDirectiveFromDocument, cloneDeep, stringifyForDisplay, } from "../../../utilities/index.js";
function requestToKey(request, addTypename) {
var queryString = request.query &&
print(addTypename ? addTypenameToDocument(request.query) : request.query);
var requestKey = { query: queryString };
return JSON.stringify(requestKey);
}
var MockLink = (function (_super) {
__extends(MockLink, _super);
function MockLink(mockedResponses, addTypename, options) {
if (addTypename === void 0) { addTypename = true; }
if (options === void 0) { options = Object.create(null); }
var _this = this;
var _a;
_this = _super.call(this) || this;
_this.addTypename = true;
_this.showWarnings = true;
_this.mockedResponsesByKey = {};
_this.addTypename = addTypename;
_this.showWarnings = (_a = options.showWarnings) !== null && _a !== void 0 ? _a : true;
if (mockedResponses) {
mockedResponses.forEach(function (mockedResponse) {
_this.addMockedResponse(mockedResponse);
});
}
return _this;
}
MockLink.prototype.addMockedResponse = function (mockedResponse) {
var normalizedMockedResponse = this.normalizeMockedResponse(mockedResponse);
var key = requestToKey(normalizedMockedResponse.request, this.addTypename);
var mockedResponses = this.mockedResponsesByKey[key];
if (!mockedResponses) {
mockedResponses = [];
this.mockedResponsesByKey[key] = mockedResponses;
}
mockedResponses.push(normalizedMockedResponse);
};
MockLink.prototype.request = function (operation) {
var _this = this;
this.operation = operation;
var key = requestToKey(operation, this.addTypename);
var unmatchedVars = [];
var requestVariables = operation.variables || {};
var mockedResponses = this.mockedResponsesByKey[key];
var responseIndex = mockedResponses ? mockedResponses.findIndex(function (res, index) {
var mockedResponseVars = res.request.variables || {};
if (equal(requestVariables, mockedResponseVars)) {
return true;
}
unmatchedVars.push(mockedResponseVars);
return false;
}) : -1;
var response = responseIndex >= 0
? mockedResponses[responseIndex]
: void 0;
var configError;
if (!response) {
configError = new Error("No more mocked responses for the query: ".concat(print(operation.query), "\nExpected variables: ").concat(stringifyForDisplay(operation.variables), "\n").concat(unmatchedVars.length > 0 ? "\nFailed to match ".concat(unmatchedVars.length, " mock").concat(unmatchedVars.length === 1 ? "" : "s", " for this query. The mocked response had the following variables:\n").concat(unmatchedVars.map(function (d) { return " ".concat(stringifyForDisplay(d)); }).join('\n'), "\n") : ""));
if (this.showWarnings) {
console.warn(configError.message +
'\nThis typically indicates a configuration error in your mocks ' +
'setup, usually due to a typo or mismatched variable.');
}
}
else {
mockedResponses.splice(responseIndex, 1);
var newData = response.newData;
if (newData) {
response.result = newData();
mockedResponses.push(response);
}
if (!response.result && !response.error) {
configError = new Error("Mocked response should contain either result or error: ".concat(key));
}
}
return new Observable(function (observer) {
var timer = setTimeout(function () {
if (configError) {
try {
if (_this.onError(configError, observer) !== false) {
throw configError;
}
}
catch (error) {
observer.error(error);
}
}
else if (response) {
if (response.error) {
observer.error(response.error);
}
else {
if (response.result) {
observer.next(typeof response.result === 'function'
? response.result()
: response.result);
}
observer.complete();
}
}
}, response && response.delay || 0);
return function () {
clearTimeout(timer);
};
});
};
MockLink.prototype.normalizeMockedResponse = function (mockedResponse) {
var newMockedResponse = cloneDeep(mockedResponse);
var queryWithoutConnection = removeConnectionDirectiveFromDocument(newMockedResponse.request.query);
__DEV__ ? invariant(queryWithoutConnection, "query is required") : invariant(queryWithoutConnection, 38);
newMockedResponse.request.query = queryWithoutConnection;
var query = removeClientSetsFromDocument(newMockedResponse.request.query);
if (query) {
newMockedResponse.request.query = query;
}
return newMockedResponse;
};
return MockLink;
}(ApolloLink));
export { MockLink };
export function mockSingleLink() {
var mockedResponses = [];
for (var _i = 0; _i < arguments.length; _i++) {
mockedResponses[_i] = arguments[_i];
}
var maybeTypename = mockedResponses[mockedResponses.length - 1];
var mocks = mockedResponses.slice(0, mockedResponses.length - 1);
if (typeof maybeTypename !== 'boolean') {
mocks = mockedResponses;
maybeTypename = true;
}
return new MockLink(mocks, maybeTypename);
}
//# sourceMappingURL=mockLink.js.map