@data-client/core
Version:
Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch
124 lines (120 loc) • 17.4 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { actionTypes } from '../index.js';
import { collapseFixture } from './collapseFixture.js';
import { createFixtureMap } from './createFixtureMap.js';
export function MockController(Base, {
fixtures = [],
getInitialInterceptorData = () => ({})
}) {
const [fixtureMap, interceptors] = createFixtureMap(fixtures);
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return class MockedController extends Base {
constructor(...args) {
super(...args);
// legacy compatibility
// TODO: drop when drop support for destructuring (0.14 and below)
// legacy compatibility (re-declaration)
// TODO: drop when drop support for destructuring (0.14 and below)
this.fixtureMap = fixtureMap;
this.interceptors = interceptors;
this.interceptorData = getInitialInterceptorData();
if (!this._dispatch) {
this._dispatch = args[0].dispatch;
}
}
// legacy compatibility - we need this to work with 0.14 and below as they do not have this setter
// TODO: drop when drop support for destructuring (0.14 and below)
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
set dispatch(dispatch) {
this._dispatch = dispatch;
}
get dispatch() {
return action => {
var _actionTypes$FETCH;
// support legacy that has _TYPE suffix
if (action.type === ((_actionTypes$FETCH = actionTypes.FETCH) != null ? _actionTypes$FETCH : actionTypes.FETCH_TYPE)) {
// eslint-disable-next-line prefer-const
let {
key,
args
} = action;
let fixture;
if (this.fixtureMap.has(key)) {
fixture = this.fixtureMap.get(key);
if (!args) args = fixture.args;
// exact matches take priority; now test ComputedFixture
} else {
for (const cfix of this.interceptors) {
if (cfix.endpoint.testKey(key)) {
fixture = cfix;
break;
}
}
}
// we have a match
if (fixture !== undefined) {
var _fixture$delay;
const replacedAction = _extends({}, action);
const delayMs = typeof fixture.delay === 'function' ? fixture.delay(...args) : (_fixture$delay = fixture.delay) != null ? _fixture$delay : 0;
if ('fetchResponse' in fixture) {
const {
fetchResponse
} = fixture;
fixture = {
endpoint: fixture.endpoint,
response(...args) {
const endpoint = action.endpoint.extend({
fetchResponse: (input, init) => {
const ret = fetchResponse.call(this, input, init);
return Promise.resolve(new Response(JSON.stringify(ret), {
status: 200,
headers: new Headers({
'Content-Type': 'application/json'
})
}));
}
});
return endpoint(...args);
}
};
}
const fetch = async () => {
if (!fixture) {
throw new Error('No fixture found');
}
// delayCollapse determines when the fixture function is 'collapsed' (aka 'run')
// collapsed: https://en.wikipedia.org/wiki/Copenhagen_interpretation
if (fixture.delayCollapse) {
await new Promise(resolve => setTimeout(resolve, delayMs));
}
const result = await collapseFixture(fixture, args, this.interceptorData);
if (!fixture.delayCollapse && delayMs) {
await new Promise(resolve => setTimeout(resolve, delayMs));
}
if (result.error) {
throw result.response;
}
return result.response;
};
if (typeof replacedAction.endpoint.extend === 'function') {
replacedAction.endpoint = replacedAction.endpoint.extend({
fetch
});
} else {
// TODO: full testing of this
replacedAction.endpoint = fetch;
replacedAction.endpoint.__proto__ = action.endpoint;
}
// TODO: make super.dispatch (once we drop support for destructuring)
return this._dispatch(replacedAction);
}
}
// TODO: make super.dispatch (once we drop support for destructuring)
return this._dispatch(action);
};
}
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3Rpb25UeXBlcyIsImNvbGxhcHNlRml4dHVyZSIsImNyZWF0ZUZpeHR1cmVNYXAiLCJNb2NrQ29udHJvbGxlciIsIkJhc2UiLCJmaXh0dXJlcyIsImdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEiLCJmaXh0dXJlTWFwIiwiaW50ZXJjZXB0b3JzIiwiTW9ja2VkQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYXJncyIsImludGVyY2VwdG9yRGF0YSIsIl9kaXNwYXRjaCIsImRpc3BhdGNoIiwiYWN0aW9uIiwiX2FjdGlvblR5cGVzJEZFVENIIiwidHlwZSIsIkZFVENIIiwiRkVUQ0hfVFlQRSIsImtleSIsImZpeHR1cmUiLCJoYXMiLCJnZXQiLCJjZml4IiwiZW5kcG9pbnQiLCJ0ZXN0S2V5IiwidW5kZWZpbmVkIiwiX2ZpeHR1cmUkZGVsYXkiLCJyZXBsYWNlZEFjdGlvbiIsIl9leHRlbmRzIiwiZGVsYXlNcyIsImRlbGF5IiwiZmV0Y2hSZXNwb25zZSIsInJlc3BvbnNlIiwiZXh0ZW5kIiwiaW5wdXQiLCJpbml0IiwicmV0IiwiY2FsbCIsIlByb21pc2UiLCJyZXNvbHZlIiwiUmVzcG9uc2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhdHVzIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJmZXRjaCIsIkVycm9yIiwiZGVsYXlDb2xsYXBzZSIsInNldFRpbWVvdXQiLCJyZXN1bHQiLCJlcnJvciIsIl9fcHJvdG9fXyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2NrL01vY2tDb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFjdGlvblR5cGVzLFxuICBDb250cm9sbGVyLFxuICBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4gIEdlbmVyaWNEaXNwYXRjaCxcbn0gZnJvbSAnLi4vaW5kZXguanMnO1xuaW1wb3J0IHsgY29sbGFwc2VGaXh0dXJlIH0gZnJvbSAnLi9jb2xsYXBzZUZpeHR1cmUuanMnO1xuaW1wb3J0IHsgY3JlYXRlRml4dHVyZU1hcCB9IGZyb20gJy4vY3JlYXRlRml4dHVyZU1hcC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZpeHR1cmUsIEludGVyY2VwdG9yIH0gZnJvbSAnLi9maXh0dXJlVHlwZXMuanMnO1xuaW1wb3J0IHsgTW9ja1Byb3BzIH0gZnJvbSAnLi9tb2NrVHlwZXMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gTW9ja0NvbnRyb2xsZXI8VEJhc2UgZXh0ZW5kcyB0eXBlb2YgQ29udHJvbGxlciwgVD4oXG4gIEJhc2U6IFRCYXNlLFxuICB7XG4gICAgZml4dHVyZXMgPSBbXSxcbiAgICBnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhID0gKCkgPT4gKHt9KSBhcyBhbnksXG4gIH06IE1vY2tQcm9wczxUPixcbik6IFRCYXNlIHtcbiAgY29uc3QgW2ZpeHR1cmVNYXAsIGludGVyY2VwdG9yc10gPSBjcmVhdGVGaXh0dXJlTWFwKGZpeHR1cmVzKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIGNsYXNzIE1vY2tlZENvbnRyb2xsZXI8XG4gICAgRCBleHRlbmRzIEdlbmVyaWNEaXNwYXRjaCA9IERhdGFDbGllbnREaXNwYXRjaCxcbiAgPiBleHRlbmRzIEJhc2U8RD4ge1xuICAgIC8vIGxlZ2FjeSBjb21wYXRpYmlsaXR5IChyZS1kZWNsYXJhdGlvbilcbiAgICAvLyBUT0RPOiBkcm9wIHdoZW4gZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nICgwLjE0IGFuZCBiZWxvdylcbiAgICBkZWNsYXJlIHByb3RlY3RlZCBfZGlzcGF0Y2g6IEQ7XG5cbiAgICBmaXh0dXJlTWFwOiBNYXA8c3RyaW5nLCBGaXh0dXJlPiA9IGZpeHR1cmVNYXA7XG4gICAgaW50ZXJjZXB0b3JzOiBJbnRlcmNlcHRvcjxhbnk+W10gPSBpbnRlcmNlcHRvcnM7XG4gICAgaW50ZXJjZXB0b3JEYXRhOiBUID0gZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSgpO1xuXG4gICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuXG4gICAgICAvLyBsZWdhY3kgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gVE9ETzogZHJvcCB3aGVuIGRyb3Agc3VwcG9ydCBmb3IgZGVzdHJ1Y3R1cmluZyAoMC4xNCBhbmQgYmVsb3cpXG4gICAgICBpZiAoIXRoaXMuX2Rpc3BhdGNoKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoID0gKGFyZ3NbMF0gYXMgYW55KS5kaXNwYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsZWdhY3kgY29tcGF0aWJpbGl0eSAtIHdlIG5lZWQgdGhpcyB0byB3b3JrIHdpdGggMC4xNCBhbmQgYmVsb3cgYXMgdGhleSBkbyBub3QgaGF2ZSB0aGlzIHNldHRlclxuICAgIC8vIFRPRE86IGRyb3Agd2hlbiBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcgKDAuMTQgYW5kIGJlbG93KVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc2V0IGRpc3BhdGNoKGRpc3BhdGNoOiBEKSB7XG4gICAgICB0aGlzLl9kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIH1cblxuICAgIGdldCBkaXNwYXRjaCgpOiBEIHtcbiAgICAgIHJldHVybiAoKGFjdGlvbjogUGFyYW1ldGVyczxEPlswXSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAvLyBzdXBwb3J0IGxlZ2FjeSB0aGF0IGhhcyBfVFlQRSBzdWZmaXhcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAoYWN0aW9uVHlwZXMuRkVUQ0ggPz8gYWN0aW9uVHlwZXMuRkVUQ0hfVFlQRSkpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgICAgbGV0IHsga2V5LCBhcmdzIH0gPSBhY3Rpb247XG4gICAgICAgICAgbGV0IGZpeHR1cmU6IEZpeHR1cmUgfCBJbnRlcmNlcHRvciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAodGhpcy5maXh0dXJlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBmaXh0dXJlID0gdGhpcy5maXh0dXJlTWFwLmdldChrZXkpIGFzIEZpeHR1cmU7XG4gICAgICAgICAgICBpZiAoIWFyZ3MpIGFyZ3MgPSBmaXh0dXJlLmFyZ3M7XG4gICAgICAgICAgICAvLyBleGFjdCBtYXRjaGVzIHRha2UgcHJpb3JpdHk7IG5vdyB0ZXN0IENvbXB1dGVkRml4dHVyZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNmaXggb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgICAgICAgaWYgKGNmaXguZW5kcG9pbnQudGVzdEtleShrZXkpKSB7XG4gICAgICAgICAgICAgICAgZml4dHVyZSA9IGNmaXg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgaGF2ZSBhIG1hdGNoXG4gICAgICAgICAgaWYgKGZpeHR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRBY3Rpb246IHR5cGVvZiBhY3Rpb24gPSB7XG4gICAgICAgICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBkZWxheU1zID1cbiAgICAgICAgICAgICAgdHlwZW9mIGZpeHR1cmUuZGVsYXkgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICAgICAgICAgIGZpeHR1cmUuZGVsYXkoLi4uKGFyZ3MgYXMgYW55KSlcbiAgICAgICAgICAgICAgOiAoZml4dHVyZS5kZWxheSA/PyAwKTtcblxuICAgICAgICAgICAgaWYgKCdmZXRjaFJlc3BvbnNlJyBpbiBmaXh0dXJlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgZmV0Y2hSZXNwb25zZSB9ID0gZml4dHVyZTtcbiAgICAgICAgICAgICAgZml4dHVyZSA9IHtcbiAgICAgICAgICAgICAgICBlbmRwb2ludDogZml4dHVyZS5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICByZXNwb25zZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmRwb2ludCA9IChhY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5leHRlbmQoe1xuICAgICAgICAgICAgICAgICAgICBmZXRjaFJlc3BvbnNlOiAoaW5wdXQ6IFJlcXVlc3RJbmZvLCBpbml0OiBSZXF1ZXN0SW5pdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGZldGNoUmVzcG9uc2UuY2FsbCh0aGlzLCBpbnB1dCwgaW5pdCk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeShyZXQpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGVuZHBvaW50IGFzIGFueSkoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZldGNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWZpeHR1cmUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGZpeHR1cmUgZm91bmQnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBkZWxheUNvbGxhcHNlIGRldGVybWluZXMgd2hlbiB0aGUgZml4dHVyZSBmdW5jdGlvbiBpcyAnY29sbGFwc2VkJyAoYWthICdydW4nKVxuICAgICAgICAgICAgICAvLyBjb2xsYXBzZWQ6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvcGVuaGFnZW5faW50ZXJwcmV0YXRpb25cbiAgICAgICAgICAgICAgaWYgKGZpeHR1cmUuZGVsYXlDb2xsYXBzZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29sbGFwc2VGaXh0dXJlKFxuICAgICAgICAgICAgICAgIGZpeHR1cmUgYXMgYW55LFxuICAgICAgICAgICAgICAgIGFyZ3MgYXMgYW55LFxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JEYXRhLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoIWZpeHR1cmUuZGVsYXlDb2xsYXBzZSAmJiBkZWxheU1zKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5TXMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LnJlc3BvbnNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzcG9uc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5leHRlbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgcmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgPSAocmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5leHRlbmQoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZmV0Y2gsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IGZ1bGwgdGVzdGluZyBvZiB0aGlzXG4gICAgICAgICAgICAgIHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50ID0gZmV0Y2ggYXMgYW55O1xuICAgICAgICAgICAgICAocmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5fX3Byb3RvX18gPSBhY3Rpb24uZW5kcG9pbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IG1ha2Ugc3VwZXIuZGlzcGF0Y2ggKG9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoKHJlcGxhY2VkQWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogbWFrZSBzdXBlci5kaXNwYXRjaCAob25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcpXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaChhY3Rpb24pO1xuICAgICAgfSkgYXMgYW55O1xuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQ0VBLFdBQVcsUUFJTixhQUFhO0FBQ3BCLFNBQVNDLGVBQWUsUUFBUSxzQkFBc0I7QUFDdEQsU0FBU0MsZ0JB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