@apollo/client
Version:
A fully-featured caching GraphQL client.
355 lines (344 loc) • 14.1 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
var tslib = require('tslib');
var globals = require('../../utilities/globals');
var equality = require('@wry/equality');
var core = require('../../link/core');
var utilities = require('../../utilities');
var core$1 = require('../../core');
var cache = require('../../cache');
function requestToKey(request, addTypename) {
var queryString = request.query &&
utilities.print(addTypename ? utilities.addTypenameToDocument(request.query) : request.query);
var requestKey = { query: queryString };
return JSON.stringify(requestKey);
}
var MockLink = (function (_super) {
tslib.__extends(MockLink, _super);
function MockLink(mockedResponses, addTypename, options) {
if (addTypename === void 0) { addTypename = true; }
if (options === void 0) { options = Object.create(null); }
var _a;
var _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;
var _a;
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 (equality.equal(requestVariables, mockedResponseVars)) {
return true;
}
if (res.variableMatcher && res.variableMatcher(operation.variables)) {
return true;
}
unmatchedVars.push(mockedResponseVars);
return false;
})
: -1;
var response = responseIndex >= 0 ? mockedResponses[responseIndex] : void 0;
var delay = (response === null || response === void 0 ? void 0 : response.delay) === Infinity ? 0 : (_a = response === null || response === void 0 ? void 0 : response.delay) !== null && _a !== void 0 ? _a : 0;
var configError;
if (!response) {
configError = new Error("No more mocked responses for the query: ".concat(utilities.print(operation.query), "\nExpected variables: ").concat(utilities.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(utilities.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 {
if (response.maxUsageCount && response.maxUsageCount > 1) {
response.maxUsageCount--;
}
else {
mockedResponses.splice(responseIndex, 1);
}
var newData = response.newData;
if (newData) {
response.result = newData(operation.variables);
mockedResponses.push(response);
}
if (!response.result && !response.error && response.delay !== Infinity) {
configError = new Error("Mocked response should contain either `result`, `error` or a `delay` of `Infinity`: ".concat(key));
}
}
return new utilities.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 && response.delay !== Infinity) {
if (response.error) {
observer.error(response.error);
}
else {
if (response.result) {
observer.next(typeof response.result === "function" ?
response.result(operation.variables)
: response.result);
}
observer.complete();
}
}
}, delay);
return function () {
clearTimeout(timer);
};
});
};
MockLink.prototype.normalizeMockedResponse = function (mockedResponse) {
var _a;
var newMockedResponse = utilities.cloneDeep(mockedResponse);
var queryWithoutClientOnlyDirectives = utilities.removeDirectivesFromDocument([{ name: "connection" }, { name: "nonreactive" }], utilities.checkDocument(newMockedResponse.request.query));
globals.invariant(queryWithoutClientOnlyDirectives, 67);
newMockedResponse.request.query = queryWithoutClientOnlyDirectives;
var query = utilities.removeClientSetsFromDocument(newMockedResponse.request.query);
if (query) {
newMockedResponse.request.query = query;
}
mockedResponse.maxUsageCount = (_a = mockedResponse.maxUsageCount) !== null && _a !== void 0 ? _a : 1;
globals.invariant(mockedResponse.maxUsageCount > 0, 68, mockedResponse.maxUsageCount);
this.normalizeVariableMatching(newMockedResponse);
return newMockedResponse;
};
MockLink.prototype.normalizeVariableMatching = function (mockedResponse) {
var request = mockedResponse.request;
if (mockedResponse.variableMatcher && request.variables) {
throw new Error("Mocked response should contain either variableMatcher or request.variables");
}
if (!mockedResponse.variableMatcher) {
request.variables = tslib.__assign(tslib.__assign({}, utilities.getDefaultValues(utilities.getOperationDefinition(request.query))), request.variables);
mockedResponse.variableMatcher = function (vars) {
var requestVariables = vars || {};
var mockedResponseVariables = request.variables || {};
return equality.equal(requestVariables, mockedResponseVariables);
};
}
};
return MockLink;
}(core.ApolloLink));
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);
}
var MockSubscriptionLink = (function (_super) {
tslib.__extends(MockSubscriptionLink, _super);
function MockSubscriptionLink() {
var _this = _super.call(this) || this;
_this.unsubscribers = [];
_this.setups = [];
_this.observers = [];
return _this;
}
MockSubscriptionLink.prototype.request = function (operation) {
var _this = this;
this.operation = operation;
return new utilities.Observable(function (observer) {
_this.setups.forEach(function (x) { return x(); });
_this.observers.push(observer);
return function () {
_this.unsubscribers.forEach(function (x) { return x(); });
};
});
};
MockSubscriptionLink.prototype.simulateResult = function (result, complete) {
var _this = this;
if (complete === void 0) { complete = false; }
setTimeout(function () {
var observers = _this.observers;
if (!observers.length)
throw new Error("subscription torn down");
observers.forEach(function (observer) {
if (result.result && observer.next)
observer.next(result.result);
if (result.error && observer.error)
observer.error(result.error);
if (complete && observer.complete)
observer.complete();
});
}, result.delay || 0);
};
MockSubscriptionLink.prototype.simulateComplete = function () {
var observers = this.observers;
if (!observers.length)
throw new Error("subscription torn down");
observers.forEach(function (observer) {
if (observer.complete)
observer.complete();
});
};
MockSubscriptionLink.prototype.onSetup = function (listener) {
this.setups = this.setups.concat([listener]);
};
MockSubscriptionLink.prototype.onUnsubscribe = function (listener) {
this.unsubscribers = this.unsubscribers.concat([listener]);
};
return MockSubscriptionLink;
}(core.ApolloLink));
function mockObservableLink() {
return new MockSubscriptionLink();
}
function createMockClient(data, query, variables) {
if (variables === void 0) { variables = {}; }
return new core$1.ApolloClient({
link: mockSingleLink({
request: { query: query, variables: variables },
result: { data: data },
}).setOnError(function (error) {
throw error;
}),
cache: new cache.InMemoryCache({ addTypename: false }),
});
}
function subscribeAndCount(reject, observable, cb) {
var queue = Promise.resolve();
var handleCount = 0;
var subscription = utilities.asyncMap(observable, function (result) {
return (queue = queue
.then(function () {
return cb(++handleCount, result);
})
.catch(error));
}).subscribe({ error: error });
function error(e) {
subscription.unsubscribe();
reject(e);
}
return subscription;
}
function wrap(key) {
return function (message, callback, timeout) {
return (key ? it[key] : it)(message, function () {
var _this = this;
return new Promise(function (resolve, reject) {
return callback.call(_this, resolve, reject);
});
}, timeout);
};
}
var wrappedIt = wrap();
var itAsync = Object.assign(function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return wrappedIt.apply(this, args);
}, {
only: wrap("only"),
skip: wrap("skip"),
todo: wrap("todo"),
});
function wait(ms) {
return tslib.__awaiter(this, void 0, void 0, function () {
return tslib.__generator(this, function (_a) {
return [2 , new Promise(function (resolve) { return setTimeout(resolve, ms); })];
});
});
}
function tick() {
return tslib.__awaiter(this, void 0, void 0, function () {
return tslib.__generator(this, function (_a) {
return [2 , wait(0)];
});
});
}
function wrapTestFunction(fn, consoleMethodName) {
return function () {
var _this = this;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var spy = jest.spyOn(console, consoleMethodName);
spy.mockImplementation(function () { });
return new Promise(function (resolve) {
resolve(fn === null || fn === void 0 ? void 0 : fn.apply(_this, args));
}).finally(function () {
expect(spy).toMatchSnapshot();
spy.mockReset();
});
};
}
function withErrorSpy(it) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
args[1] = wrapTestFunction(args[1], "error");
return it.apply(void 0, args);
}
function withWarningSpy(it) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
args[1] = wrapTestFunction(args[1], "warn");
return it.apply(void 0, args);
}
function withLogSpy(it) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
args[1] = wrapTestFunction(args[1], "log");
return it.apply(void 0, args);
}
exports.MockLink = MockLink;
exports.MockSubscriptionLink = MockSubscriptionLink;
exports.createMockClient = createMockClient;
exports.itAsync = itAsync;
exports.mockObservableLink = mockObservableLink;
exports.mockSingleLink = mockSingleLink;
exports.subscribeAndCount = subscribeAndCount;
exports.tick = tick;
exports.wait = wait;
exports.withErrorSpy = withErrorSpy;
exports.withLogSpy = withLogSpy;
exports.withWarningSpy = withWarningSpy;
//# sourceMappingURL=core.cjs.map
;