@data-client/core 0.15.0-beta-20251022142546-a457d1596871fb28f1a91f2531cc259db4d55a9c → 0.15.1-beta-20251116224907-3174fe59b114d2037762a6458f5576d23e483ba4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/legacy/mock/MockController.js +124 -0
  3. package/legacy/mock/collapseFixture.js +19 -0
  4. package/legacy/mock/createFixtureMap.js +23 -0
  5. package/legacy/mock/fixtureTypes.js +2 -0
  6. package/legacy/mock/index.js +4 -0
  7. package/legacy/mock/mockTypes.js +2 -0
  8. package/lib/mock/MockController.d.ts +4 -0
  9. package/lib/mock/MockController.d.ts.map +1 -0
  10. package/lib/mock/MockController.js +125 -0
  11. package/lib/mock/collapseFixture.d.ts +6 -0
  12. package/lib/mock/collapseFixture.d.ts.map +1 -0
  13. package/lib/mock/collapseFixture.js +19 -0
  14. package/lib/mock/createFixtureMap.d.ts +3 -0
  15. package/lib/mock/createFixtureMap.d.ts.map +1 -0
  16. package/lib/mock/createFixtureMap.js +23 -0
  17. package/lib/mock/fixtureTypes.d.ts +99 -0
  18. package/lib/mock/fixtureTypes.d.ts.map +1 -0
  19. package/lib/mock/fixtureTypes.js +2 -0
  20. package/lib/mock/index.d.ts +6 -0
  21. package/lib/mock/index.d.ts.map +1 -0
  22. package/lib/mock/index.js +4 -0
  23. package/lib/mock/mockTypes.d.ts +6 -0
  24. package/lib/mock/mockTypes.d.ts.map +1 -0
  25. package/lib/mock/mockTypes.js +2 -0
  26. package/package.json +16 -3
  27. package/src/mock/MockController.ts +146 -0
  28. package/src/mock/collapseFixture.ts +21 -0
  29. package/src/mock/createFixtureMap.ts +26 -0
  30. package/src/mock/fixtureTypes.ts +121 -0
  31. package/src/mock/index.ts +15 -0
  32. package/src/mock/mockTypes.ts +6 -0
  33. package/ts3.4/mock/MockController.d.ts +4 -0
  34. package/ts3.4/mock/collapseFixture.d.ts +6 -0
  35. package/ts3.4/mock/createFixtureMap.d.ts +6 -0
  36. package/ts3.4/mock/fixtureTypes.d.ts +99 -0
  37. package/ts3.4/mock/index.d.ts +6 -0
  38. package/ts3.4/mock/mockTypes.d.ts +6 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @data-client/core
2
2
 
3
+ ## 0.15.1-beta-20251116224907-3174fe59b114d2037762a6458f5576d23e483ba4
4
+
5
+ ### Patch Changes
6
+
7
+ - [#3622](https://github.com/reactive/data-client/pull/3622) [`ad3964d`](https://github.com/reactive/data-client/commit/ad3964d65d245c459809f64afe17ebdf5fda5042) Thanks [@ntucker](https://github.com/ntucker)! - Add @data-client/core/mock
8
+
9
+ New exports:
10
+ - `MockController` - Controller wrapper for mocking endpoints
11
+ - `collapseFixture` - Resolves fixture responses (handles function responses)
12
+ - `createFixtureMap` - Separates fixtures into static map and interceptors
13
+ - Types: `MockProps`, `Fixture`, `SuccessFixture`, `ErrorFixture`, `Interceptor`, `ResponseInterceptor`, `FetchInterceptor`, `FixtureEndpoint`, `SuccessFixtureEndpoint`, `ErrorFixtureEndpoint`
14
+
3
15
  ## 0.15.0-beta-20251022142546-a457d1596871fb28f1a91f2531cc259db4d55a9c
4
16
 
5
17
  ### Patch Changes
@@ -0,0 +1,124 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import { actionTypes } from '../index.js';
3
+ import { collapseFixture } from './collapseFixture.js';
4
+ import { createFixtureMap } from './createFixtureMap.js';
5
+ export function MockController(Base, {
6
+ fixtures = [],
7
+ getInitialInterceptorData = () => ({})
8
+ }) {
9
+ const [fixtureMap, interceptors] = createFixtureMap(fixtures);
10
+
11
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
12
+ // @ts-ignore
13
+ return class MockedController extends Base {
14
+ constructor(...args) {
15
+ super(...args);
16
+
17
+ // legacy compatibility
18
+ // TODO: drop when drop support for destructuring (0.14 and below)
19
+ // legacy compatibility (re-declaration)
20
+ // TODO: drop when drop support for destructuring (0.14 and below)
21
+ this.fixtureMap = fixtureMap;
22
+ this.interceptors = interceptors;
23
+ this.interceptorData = getInitialInterceptorData();
24
+ if (!this._dispatch) {
25
+ this._dispatch = args[0].dispatch;
26
+ }
27
+ }
28
+
29
+ // legacy compatibility - we need this to work with 0.14 and below as they do not have this setter
30
+ // TODO: drop when drop support for destructuring (0.14 and below)
31
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
32
+ // @ts-ignore
33
+ set dispatch(dispatch) {
34
+ this._dispatch = dispatch;
35
+ }
36
+ get dispatch() {
37
+ return action => {
38
+ var _actionTypes$FETCH;
39
+ // support legacy that has _TYPE suffix
40
+ if (action.type === ((_actionTypes$FETCH = actionTypes.FETCH) != null ? _actionTypes$FETCH : actionTypes.FETCH_TYPE)) {
41
+ // eslint-disable-next-line prefer-const
42
+ let {
43
+ key,
44
+ args
45
+ } = action;
46
+ let fixture;
47
+ if (this.fixtureMap.has(key)) {
48
+ fixture = this.fixtureMap.get(key);
49
+ if (!args) args = fixture.args;
50
+ // exact matches take priority; now test ComputedFixture
51
+ } else {
52
+ for (const cfix of this.interceptors) {
53
+ if (cfix.endpoint.testKey(key)) {
54
+ fixture = cfix;
55
+ break;
56
+ }
57
+ }
58
+ }
59
+ // we have a match
60
+ if (fixture !== undefined) {
61
+ var _fixture$delay;
62
+ const replacedAction = _extends({}, action);
63
+ const delayMs = typeof fixture.delay === 'function' ? fixture.delay(...args) : (_fixture$delay = fixture.delay) != null ? _fixture$delay : 0;
64
+ if ('fetchResponse' in fixture) {
65
+ const {
66
+ fetchResponse
67
+ } = fixture;
68
+ fixture = {
69
+ endpoint: fixture.endpoint,
70
+ response(...args) {
71
+ const endpoint = action.endpoint.extend({
72
+ fetchResponse: (input, init) => {
73
+ const ret = fetchResponse.call(this, input, init);
74
+ return Promise.resolve(new Response(JSON.stringify(ret), {
75
+ status: 200,
76
+ headers: new Headers({
77
+ 'Content-Type': 'application/json'
78
+ })
79
+ }));
80
+ }
81
+ });
82
+ return endpoint(...args);
83
+ }
84
+ };
85
+ }
86
+ const fetch = async () => {
87
+ if (!fixture) {
88
+ throw new Error('No fixture found');
89
+ }
90
+ // delayCollapse determines when the fixture function is 'collapsed' (aka 'run')
91
+ // collapsed: https://en.wikipedia.org/wiki/Copenhagen_interpretation
92
+ if (fixture.delayCollapse) {
93
+ await new Promise(resolve => setTimeout(resolve, delayMs));
94
+ }
95
+ const result = await collapseFixture(fixture, args, this.interceptorData);
96
+ if (!fixture.delayCollapse && delayMs) {
97
+ await new Promise(resolve => setTimeout(resolve, delayMs));
98
+ }
99
+ if (result.error) {
100
+ throw result.response;
101
+ }
102
+ return result.response;
103
+ };
104
+ if (typeof replacedAction.endpoint.extend === 'function') {
105
+ replacedAction.endpoint = replacedAction.endpoint.extend({
106
+ fetch
107
+ });
108
+ } else {
109
+ // TODO: full testing of this
110
+ replacedAction.endpoint = fetch;
111
+ replacedAction.endpoint.__proto__ = action.endpoint;
112
+ }
113
+
114
+ // TODO: make super.dispatch (once we drop support for destructuring)
115
+ return this._dispatch(replacedAction);
116
+ }
117
+ }
118
+ // TODO: make super.dispatch (once we drop support for destructuring)
119
+ return this._dispatch(action);
120
+ };
121
+ }
122
+ };
123
+ }
124
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3Rpb25UeXBlcyIsImNvbGxhcHNlRml4dHVyZSIsImNyZWF0ZUZpeHR1cmVNYXAiLCJNb2NrQ29udHJvbGxlciIsIkJhc2UiLCJmaXh0dXJlcyIsImdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEiLCJmaXh0dXJlTWFwIiwiaW50ZXJjZXB0b3JzIiwiTW9ja2VkQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYXJncyIsImludGVyY2VwdG9yRGF0YSIsIl9kaXNwYXRjaCIsImRpc3BhdGNoIiwiYWN0aW9uIiwiX2FjdGlvblR5cGVzJEZFVENIIiwidHlwZSIsIkZFVENIIiwiRkVUQ0hfVFlQRSIsImtleSIsImZpeHR1cmUiLCJoYXMiLCJnZXQiLCJjZml4IiwiZW5kcG9pbnQiLCJ0ZXN0S2V5IiwidW5kZWZpbmVkIiwiX2ZpeHR1cmUkZGVsYXkiLCJyZXBsYWNlZEFjdGlvbiIsIl9leHRlbmRzIiwiZGVsYXlNcyIsImRlbGF5IiwiZmV0Y2hSZXNwb25zZSIsInJlc3BvbnNlIiwiZXh0ZW5kIiwiaW5wdXQiLCJpbml0IiwicmV0IiwiY2FsbCIsIlByb21pc2UiLCJyZXNvbHZlIiwiUmVzcG9uc2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhdHVzIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJmZXRjaCIsIkVycm9yIiwiZGVsYXlDb2xsYXBzZSIsInNldFRpbWVvdXQiLCJyZXN1bHQiLCJlcnJvciIsIl9fcHJvdG9fXyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2NrL01vY2tDb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFjdGlvblR5cGVzLFxuICBDb250cm9sbGVyLFxuICBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4gIEdlbmVyaWNEaXNwYXRjaCxcbn0gZnJvbSAnLi4vaW5kZXguanMnO1xuaW1wb3J0IHsgY29sbGFwc2VGaXh0dXJlIH0gZnJvbSAnLi9jb2xsYXBzZUZpeHR1cmUuanMnO1xuaW1wb3J0IHsgY3JlYXRlRml4dHVyZU1hcCB9IGZyb20gJy4vY3JlYXRlRml4dHVyZU1hcC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZpeHR1cmUsIEludGVyY2VwdG9yIH0gZnJvbSAnLi9maXh0dXJlVHlwZXMuanMnO1xuaW1wb3J0IHsgTW9ja1Byb3BzIH0gZnJvbSAnLi9tb2NrVHlwZXMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gTW9ja0NvbnRyb2xsZXI8VEJhc2UgZXh0ZW5kcyB0eXBlb2YgQ29udHJvbGxlciwgVD4oXG4gIEJhc2U6IFRCYXNlLFxuICB7XG4gICAgZml4dHVyZXMgPSBbXSxcbiAgICBnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhID0gKCkgPT4gKHt9KSBhcyBhbnksXG4gIH06IE1vY2tQcm9wczxUPixcbik6IFRCYXNlIHtcbiAgY29uc3QgW2ZpeHR1cmVNYXAsIGludGVyY2VwdG9yc10gPSBjcmVhdGVGaXh0dXJlTWFwKGZpeHR1cmVzKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIGNsYXNzIE1vY2tlZENvbnRyb2xsZXI8XG4gICAgRCBleHRlbmRzIEdlbmVyaWNEaXNwYXRjaCA9IERhdGFDbGllbnREaXNwYXRjaCxcbiAgPiBleHRlbmRzIEJhc2U8RD4ge1xuICAgIC8vIGxlZ2FjeSBjb21wYXRpYmlsaXR5IChyZS1kZWNsYXJhdGlvbilcbiAgICAvLyBUT0RPOiBkcm9wIHdoZW4gZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nICgwLjE0IGFuZCBiZWxvdylcbiAgICBkZWNsYXJlIHByb3RlY3RlZCBfZGlzcGF0Y2g6IEQ7XG5cbiAgICBmaXh0dXJlTWFwOiBNYXA8c3RyaW5nLCBGaXh0dXJlPiA9IGZpeHR1cmVNYXA7XG4gICAgaW50ZXJjZXB0b3JzOiBJbnRlcmNlcHRvcjxhbnk+W10gPSBpbnRlcmNlcHRvcnM7XG4gICAgaW50ZXJjZXB0b3JEYXRhOiBUID0gZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSgpO1xuXG4gICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuXG4gICAgICAvLyBsZWdhY3kgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gVE9ETzogZHJvcCB3aGVuIGRyb3Agc3VwcG9ydCBmb3IgZGVzdHJ1Y3R1cmluZyAoMC4xNCBhbmQgYmVsb3cpXG4gICAgICBpZiAoIXRoaXMuX2Rpc3BhdGNoKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoID0gKGFyZ3NbMF0gYXMgYW55KS5kaXNwYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsZWdhY3kgY29tcGF0aWJpbGl0eSAtIHdlIG5lZWQgdGhpcyB0byB3b3JrIHdpdGggMC4xNCBhbmQgYmVsb3cgYXMgdGhleSBkbyBub3QgaGF2ZSB0aGlzIHNldHRlclxuICAgIC8vIFRPRE86IGRyb3Agd2hlbiBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcgKDAuMTQgYW5kIGJlbG93KVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc2V0IGRpc3BhdGNoKGRpc3BhdGNoOiBEKSB7XG4gICAgICB0aGlzLl9kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIH1cblxuICAgIGdldCBkaXNwYXRjaCgpOiBEIHtcbiAgICAgIHJldHVybiAoKGFjdGlvbjogUGFyYW1ldGVyczxEPlswXSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAvLyBzdXBwb3J0IGxlZ2FjeSB0aGF0IGhhcyBfVFlQRSBzdWZmaXhcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAoYWN0aW9uVHlwZXMuRkVUQ0ggPz8gYWN0aW9uVHlwZXMuRkVUQ0hfVFlQRSkpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgICAgbGV0IHsga2V5LCBhcmdzIH0gPSBhY3Rpb247XG4gICAgICAgICAgbGV0IGZpeHR1cmU6IEZpeHR1cmUgfCBJbnRlcmNlcHRvciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAodGhpcy5maXh0dXJlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBmaXh0dXJlID0gdGhpcy5maXh0dXJlTWFwLmdldChrZXkpIGFzIEZpeHR1cmU7XG4gICAgICAgICAgICBpZiAoIWFyZ3MpIGFyZ3MgPSBmaXh0dXJlLmFyZ3M7XG4gICAgICAgICAgICAvLyBleGFjdCBtYXRjaGVzIHRha2UgcHJpb3JpdHk7IG5vdyB0ZXN0IENvbXB1dGVkRml4dHVyZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNmaXggb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgICAgICAgaWYgKGNmaXguZW5kcG9pbnQudGVzdEtleShrZXkpKSB7XG4gICAgICAgICAgICAgICAgZml4dHVyZSA9IGNmaXg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgaGF2ZSBhIG1hdGNoXG4gICAgICAgICAgaWYgKGZpeHR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRBY3Rpb246IHR5cGVvZiBhY3Rpb24gPSB7XG4gICAgICAgICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBkZWxheU1zID1cbiAgICAgICAgICAgICAgdHlwZW9mIGZpeHR1cmUuZGVsYXkgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICAgICAgICAgIGZpeHR1cmUuZGVsYXkoLi4uKGFyZ3MgYXMgYW55KSlcbiAgICAgICAgICAgICAgOiAoZml4dHVyZS5kZWxheSA/PyAwKTtcblxuICAgICAgICAgICAgaWYgKCdmZXRjaFJlc3BvbnNlJyBpbiBmaXh0dXJlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgZmV0Y2hSZXNwb25zZSB9ID0gZml4dHVyZTtcbiAgICAgICAgICAgICAgZml4dHVyZSA9IHtcbiAgICAgICAgICAgICAgICBlbmRwb2ludDogZml4dHVyZS5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICByZXNwb25zZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmRwb2ludCA9IChhY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5leHRlbmQoe1xuICAgICAgICAgICAgICAgICAgICBmZXRjaFJlc3BvbnNlOiAoaW5wdXQ6IFJlcXVlc3RJbmZvLCBpbml0OiBSZXF1ZXN0SW5pdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGZldGNoUmVzcG9uc2UuY2FsbCh0aGlzLCBpbnB1dCwgaW5pdCk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeShyZXQpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGVuZHBvaW50IGFzIGFueSkoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZldGNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWZpeHR1cmUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGZpeHR1cmUgZm91bmQnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBkZWxheUNvbGxhcHNlIGRldGVybWluZXMgd2hlbiB0aGUgZml4dHVyZSBmdW5jdGlvbiBpcyAnY29sbGFwc2VkJyAoYWthICdydW4nKVxuICAgICAgICAgICAgICAvLyBjb2xsYXBzZWQ6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvcGVuaGFnZW5faW50ZXJwcmV0YXRpb25cbiAgICAgICAgICAgICAgaWYgKGZpeHR1cmUuZGVsYXlDb2xsYXBzZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29sbGFwc2VGaXh0dXJlKFxuICAgICAgICAgICAgICAgIGZpeHR1cmUgYXMgYW55LFxuICAgICAgICAgICAgICAgIGFyZ3MgYXMgYW55LFxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JEYXRhLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoIWZpeHR1cmUuZGVsYXlDb2xsYXBzZSAmJiBkZWxheU1zKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5TXMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LnJlc3BvbnNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzcG9uc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5leHRlbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgcmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgPSAocmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5leHRlbmQoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZmV0Y2gsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IGZ1bGwgdGVzdGluZyBvZiB0aGlzXG4gICAgICAgICAgICAgIHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50ID0gZmV0Y2ggYXMgYW55O1xuICAgICAgICAgICAgICAocmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5fX3Byb3RvX18gPSBhY3Rpb24uZW5kcG9pbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IG1ha2Ugc3VwZXIuZGlzcGF0Y2ggKG9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoKHJlcGxhY2VkQWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogbWFrZSBzdXBlci5kaXNwYXRjaCAob25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcpXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaChhY3Rpb24pO1xuICAgICAgfSkgYXMgYW55O1xuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQ0VBLFdBQVcsUUFJTixhQUFhO0FBQ3BCLFNBQVNDLGVBQWUsUUFBUSxzQkFBc0I7QUFDdEQsU0FBU0MsZ0JB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
@@ -0,0 +1,19 @@
1
+ export async function collapseFixture(fixture, args, interceptorData) {
2
+ let error = 'error' in fixture ? fixture.error : false;
3
+ let response = fixture.response;
4
+ if (typeof fixture.response === 'function') {
5
+ try {
6
+ response = await fixture.response.apply(interceptorData, args);
7
+ // dispatch goes through user-code that can sometimes fail.
8
+ // let's ensure we always handle errors
9
+ } catch (e) {
10
+ response = e;
11
+ error = true;
12
+ }
13
+ }
14
+ return {
15
+ response,
16
+ error
17
+ };
18
+ }
19
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb2xsYXBzZUZpeHR1cmUiLCJmaXh0dXJlIiwiYXJncyIsImludGVyY2VwdG9yRGF0YSIsImVycm9yIiwicmVzcG9uc2UiLCJhcHBseSIsImUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9jay9jb2xsYXBzZUZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBGaXh0dXJlLCBSZXNwb25zZUludGVyY2VwdG9yIH0gZnJvbSAnLi9maXh0dXJlVHlwZXMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGFwc2VGaXh0dXJlKFxuICBmaXh0dXJlOiBGaXh0dXJlIHwgUmVzcG9uc2VJbnRlcmNlcHRvcixcbiAgYXJnczogYW55W10sXG4gIGludGVyY2VwdG9yRGF0YTogYW55LFxuKSB7XG4gIGxldCBlcnJvciA9ICdlcnJvcicgaW4gZml4dHVyZSA/IGZpeHR1cmUuZXJyb3IgOiBmYWxzZTtcbiAgbGV0IHJlc3BvbnNlID0gZml4dHVyZS5yZXNwb25zZTtcbiAgaWYgKHR5cGVvZiBmaXh0dXJlLnJlc3BvbnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZml4dHVyZS5yZXNwb25zZS5hcHBseShpbnRlcmNlcHRvckRhdGEsIGFyZ3MpO1xuICAgICAgLy8gZGlzcGF0Y2ggZ29lcyB0aHJvdWdoIHVzZXItY29kZSB0aGF0IGNhbiBzb21ldGltZXMgZmFpbC5cbiAgICAgIC8vIGxldCdzIGVuc3VyZSB3ZSBhbHdheXMgaGFuZGxlIGVycm9yc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmVzcG9uc2UgPSBlO1xuICAgICAgZXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByZXNwb25zZSwgZXJyb3IgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxlQUFlQSxlQUFlQSxDQUNuQ0MsT0FBc0MsRUFDdENDLElBQVcsRUFDWEMsZUFBb0IsRUFDcEI7RUFDQSxJQUFJQyxLQUFLLEdBQUcsT0FBTyxJQUFJSCxPQUFPLEdBQUdBLE9BQU8sQ0FBQ0csS0FBSyxHQUFHLEtBQUs7RUFDdEQsSUFBSUMsUUFBUSxHQUFHSixPQUFPLENBQUNJLFFBQVE7RUFDL0IsSUFBSSxPQUFPSixPQUFPLENBQUNJLFFBQVEsS0FBSyxVQUFVLEVBQUU7SUFDMUMsSUFBSTtNQUNGQSxRQUFRLEdBQUcsTUFBTUosT0FBTyxDQUFDSSxRQUFRLENBQUNDLEtBQUssQ0FBQ0gsZUFBZSxFQUFFRCxJQUFJLENBQUM7TUFDOUQ7TUFDQTtJQUNGLENBQUMsQ0FBQyxPQUFPSyxDQUFNLEVBQUU7TUFDZkYsUUFBUSxHQUFHRSxDQUFDO01BQ1pILEtBQUssR0FBRyxJQUFJO0lBQ2Q7RUFDRjtFQUNBLE9BQU87SUFBRUMsUUFBUTtJQUFFRDtFQUFNLENBQUM7QUFDNUIiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,23 @@
1
+ export function createFixtureMap(fixtures = []) {
2
+ const map = new Map();
3
+ const computed = [];
4
+ for (const fixture of fixtures) {
5
+ if ('args' in fixture) {
6
+ if (typeof fixture.response !== 'function') {
7
+ const key = fixture.endpoint.key(...fixture.args);
8
+ map.set(key, fixture);
9
+ } else {
10
+ // this has to be a typo. probably needs to remove args
11
+ console.warn(`Fixture found with function response, and explicit args. Interceptors should not specify args.
12
+ ${fixture.endpoint.name}: ${JSON.stringify(fixture.args)}
13
+
14
+ Treating as Interceptor`);
15
+ computed.push(fixture);
16
+ }
17
+ } else {
18
+ computed.push(fixture);
19
+ }
20
+ }
21
+ return [map, computed];
22
+ }
23
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVGaXh0dXJlTWFwIiwiZml4dHVyZXMiLCJtYXAiLCJNYXAiLCJjb21wdXRlZCIsImZpeHR1cmUiLCJyZXNwb25zZSIsImtleSIsImVuZHBvaW50IiwiYXJncyIsInNldCIsImNvbnNvbGUiLCJ3YXJuIiwibmFtZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdXNoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vY2svY3JlYXRlRml4dHVyZU1hcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpeHR1cmUsIEludGVyY2VwdG9yIH0gZnJvbSAnLi9maXh0dXJlVHlwZXMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRml4dHVyZU1hcChmaXh0dXJlczogKEZpeHR1cmUgfCBJbnRlcmNlcHRvcilbXSA9IFtdKSB7XG4gIGNvbnN0IG1hcDogTWFwPHN0cmluZywgRml4dHVyZT4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGNvbXB1dGVkOiBJbnRlcmNlcHRvcltdID0gW107XG4gIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgIGlmICgnYXJncycgaW4gZml4dHVyZSkge1xuICAgICAgaWYgKHR5cGVvZiBmaXh0dXJlLnJlc3BvbnNlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpeHR1cmUuZW5kcG9pbnQua2V5KC4uLmZpeHR1cmUuYXJncyk7XG4gICAgICAgIG1hcC5zZXQoa2V5LCBmaXh0dXJlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMgaGFzIHRvIGJlIGEgdHlwby4gcHJvYmFibHkgbmVlZHMgdG8gcmVtb3ZlIGFyZ3NcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBGaXh0dXJlIGZvdW5kIHdpdGggZnVuY3Rpb24gcmVzcG9uc2UsIGFuZCBleHBsaWNpdCBhcmdzLiBJbnRlcmNlcHRvcnMgc2hvdWxkIG5vdCBzcGVjaWZ5IGFyZ3MuXG4ke2ZpeHR1cmUuZW5kcG9pbnQubmFtZX06ICR7SlNPTi5zdHJpbmdpZnkoZml4dHVyZS5hcmdzKX1cblxuVHJlYXRpbmcgYXMgSW50ZXJjZXB0b3JgLFxuICAgICAgICApO1xuICAgICAgICBjb21wdXRlZC5wdXNoKGZpeHR1cmUgYXMgYW55KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tcHV0ZWQucHVzaChmaXh0dXJlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFttYXAsIGNvbXB1dGVkXSBhcyBjb25zdDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxTQUFTQSxnQkFBZ0JBLENBQUNDLFFBQW1DLEdBQUcsRUFBRSxFQUFFO0VBQ3pFLE1BQU1DLEdBQXlCLEdBQUcsSUFBSUMsR0FBRyxDQUFDLENBQUM7RUFDM0MsTUFBTUMsUUFBdUIsR0FBRyxFQUFFO0VBQ2xDLEtBQUssTUFBTUMsT0FBTyxJQUFJSixRQUFRLEVBQUU7SUFDOUIsSUFBSSxNQUFNLElBQUlJLE9BQU8sRUFBRTtNQUNyQixJQUFJLE9BQU9BLE9BQU8sQ0FBQ0MsUUFBUSxLQUFLLFVBQVUsRUFBRTtRQUMxQyxNQUFNQyxHQUFHLEdBQUdGLE9BQU8sQ0FBQ0csUUFBUSxDQUFDRCxHQUFHLENBQUMsR0FBR0YsT0FBTyxDQUFDSSxJQUFJLENBQUM7UUFDakRQLEdBQUcsQ0FBQ1EsR0FBRyxDQUFDSCxHQUFHLEVBQUVGLE9BQU8sQ0FBQztNQUN2QixDQUFDLE1BQU07UUFDTDtRQUNBTSxPQUFPLENBQUNDLElBQUksQ0FDVjtBQUNWLEVBQUVQLE9BQU8sQ0FBQ0csUUFBUSxDQUFDSyxJQUFJLEtBQUtDLElBQUksQ0FBQ0MsU0FBUyxDQUFDVixPQUFPLENBQUNJLElBQUksQ0FBQztBQUN4RDtBQUNBLHdCQUNRLENBQUM7UUFDREwsUUFBUSxDQUFDWSxJQUFJLENBQUNYLE9BQWMsQ0FBQztNQUMvQjtJQUNGLENBQUMsTUFBTTtNQUNMRCxRQUFRLENBQUNZLElBQUksQ0FBQ1gsT0FBTyxDQUFDO0lBQ3hCO0VBQ0Y7RUFDQSxPQUFPLENBQUNILEdBQUcsRUFBRUUsUUFBUSxDQUFDO0FBQ3hCIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vY2svZml4dHVyZVR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW5kcG9pbnRJbnRlcmZhY2UsIFJlc29sdmVUeXBlIH0gZnJvbSAnQGRhdGEtY2xpZW50L2VuZHBvaW50JztcblxudHlwZSBVcGRhdGVyID0gKFxuICByZXN1bHQ6IGFueSxcbiAgLi4uYXJnczogYW55XG4pID0+IFJlY29yZDxzdHJpbmcsICguLi5hcmdzOiBhbnkpID0+IGFueT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VjY2Vzc0ZpeHR1cmVFbmRwb2ludDxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBVcGRhdGVyIH0gPSBFbmRwb2ludEludGVyZmFjZSxcbj4ge1xuICByZWFkb25seSBlbmRwb2ludDogRTtcbiAgcmVhZG9ubHkgYXJnczogUGFyYW1ldGVyczxFPjtcbiAgcmVhZG9ubHkgcmVzcG9uc2U6XG4gICAgfCBSZXNvbHZlVHlwZTxFPlxuICAgIHwgKCguLi5hcmdzOiBQYXJhbWV0ZXJzPEU+KSA9PiBSZXNvbHZlVHlwZTxFPik7XG4gIHJlYWRvbmx5IGVycm9yPzogZmFsc2U7XG4gIC8qKiBOdW1iZXIgb2YgbWlsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmVzb2x2aW5nICovXG4gIHJlYWRvbmx5IGRlbGF5PzogbnVtYmVyO1xuICAvKiogV2FpdHMgdG8gcnVuIGByZXNwb25zZSgpYCBhZnRlciBgZGVsYXlgIHRpbWUgKi9cbiAgcmVhZG9ubHkgZGVsYXlDb2xsYXBzZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VJbnRlcmNlcHRvcjxcbiAgVCA9IGFueSxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgIHVwZGF0ZT86IFVwZGF0ZXI7XG4gICAgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gIH0gPSBFbmRwb2ludEludGVyZmFjZSAmIHsgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4gfSxcbj4ge1xuICByZWFkb25seSBlbmRwb2ludDogRTtcbiAgcmVzcG9uc2UodGhpczogVCwgLi4uYXJnczogUGFyYW1ldGVyczxFPik6IFJlc29sdmVUeXBlPEU+O1xuICAvKiogTnVtYmVyIG9mIG1pbGlzZWNvbmRzIChvciBmdW5jdGlvbiB0aGF0IHJldHVybnMpIHRvIHdhaXQgYmVmb3JlIHJlc29sdmluZyAqL1xuICByZWFkb25seSBkZWxheT86IG51bWJlciB8ICgoLi4uYXJnczogUGFyYW1ldGVyczxFPikgPT4gbnVtYmVyKTtcbiAgLyoqIFdhaXRzIHRvIHJ1biBgcmVzcG9uc2UoKWAgYWZ0ZXIgYGRlbGF5YCB0aW1lICovXG4gIHJlYWRvbmx5IGRlbGF5Q29sbGFwc2U/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBGZXRjaEludGVyY2VwdG9yPFxuICBUID0gYW55LFxuICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgdXBkYXRlPzogVXBkYXRlcjtcbiAgICB0ZXN0S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICBmZXRjaFJlc3BvbnNlKGlucHV0OiBSZXF1ZXN0SW5mbywgaW5pdDogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPjtcbiAgICBleHRlbmQob3B0aW9uczogYW55KTogYW55O1xuICB9ID0gRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgZmV0Y2hSZXNwb25zZShpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ6IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gICAgZXh0ZW5kKG9wdGlvbnM6IGFueSk6IGFueTtcbiAgfSxcbj4ge1xuICByZWFkb25seSBlbmRwb2ludDogRTtcbiAgZmV0Y2hSZXNwb25zZSh0aGlzOiBULCBpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ6IFJlcXVlc3RJbml0KTogUmVzb2x2ZVR5cGU8RT47XG4gIC8qKiBOdW1iZXIgb2YgbWlsaXNlY29uZHMgKG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucykgdG8gd2FpdCBiZWZvcmUgcmVzb2x2aW5nICovXG4gIHJlYWRvbmx5IGRlbGF5PzogbnVtYmVyIHwgKCguLi5hcmdzOiBQYXJhbWV0ZXJzPEU+KSA9PiBudW1iZXIpO1xuICAvKiogV2FpdHMgdG8gcnVuIGByZXNwb25zZSgpYCBhZnRlciBgZGVsYXlgIHRpbWUgKi9cbiAgcmVhZG9ubHkgZGVsYXlDb2xsYXBzZT86IGJvb2xlYW47XG59XG4vKiogSW50ZXJjZXB0b3JzIG1hdGNoIGFuZCBjb21wdXRlIGR5bmFtaWMgcmVzcG9uc2VzIGJhc2VkIG9uIGFyZ3NcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9GaXh0dXJlcyNpbnRlcmNlcHRvclxuICovXG5leHBvcnQgdHlwZSBJbnRlcmNlcHRvcjxcbiAgVCA9IGFueSxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgIHVwZGF0ZT86IFVwZGF0ZXI7XG4gICAgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgZmV0Y2hSZXNwb25zZT8oaW5wdXQ6IFJlcXVlc3RJbmZvLCBpbml0OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+O1xuICAgIGV4dGVuZD8ob3B0aW9uczogYW55KTogYW55O1xuICB9ID0gRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgZmV0Y2hSZXNwb25zZShpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ6IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gICAgZXh0ZW5kKG9wdGlvbnM6IGFueSk6IGFueTtcbiAgfSxcbj4gPVxuICB8IFJlc3BvbnNlSW50ZXJjZXB0b3I8VCwgRT5cbiAgfCAoRSBleHRlbmRzIChcbiAgICAgIHtcbiAgICAgICAgZmV0Y2hSZXNwb25zZShpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ6IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gICAgICAgIGV4dGVuZChvcHRpb25zOiBhbnkpOiBhbnk7XG4gICAgICB9XG4gICAgKSA/XG4gICAgICBGZXRjaEludGVyY2VwdG9yPFQsIEU+XG4gICAgOiBuZXZlcik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JGaXh0dXJlRW5kcG9pbnQ8XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHsgdXBkYXRlPzogVXBkYXRlciB9ID0gRW5kcG9pbnRJbnRlcmZhY2UsXG4+IHtcbiAgcmVhZG9ubHkgZW5kcG9pbnQ6IEU7XG4gIHJlYWRvbmx5IGFyZ3M6IFBhcmFtZXRlcnM8RT47XG4gIHJlYWRvbmx5IHJlc3BvbnNlOiBhbnk7XG4gIHJlYWRvbmx5IGVycm9yOiB0cnVlO1xuICAvKiogTnVtYmVyIG9mIG1pbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJlc29sdmluZyAqL1xuICByZWFkb25seSBkZWxheT86IG51bWJlcjtcbiAgLyoqIFdhaXRzIHRvIHJ1biBgcmVzcG9uc2UoKWAgYWZ0ZXIgYGRlbGF5YCB0aW1lICovXG4gIHJlYWRvbmx5IGRlbGF5Q29sbGFwc2U/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBGaXh0dXJlRW5kcG9pbnQ8XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHsgdXBkYXRlPzogVXBkYXRlciB9ID0gRW5kcG9pbnRJbnRlcmZhY2UsXG4+ID0gU3VjY2Vzc0ZpeHR1cmVFbmRwb2ludDxFPiB8IEVycm9yRml4dHVyZUVuZHBvaW50PEU+O1xuXG4vKiogUmVwcmVzZW50cyBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2VcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9GaXh0dXJlcyNzdWNjZXNzZml4dHVyZVxuICovXG5leHBvcnQgdHlwZSBTdWNjZXNzRml4dHVyZTxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBVcGRhdGVyIH0gPSBFbmRwb2ludEludGVyZmFjZSxcbj4gPSBTdWNjZXNzRml4dHVyZUVuZHBvaW50PEU+O1xuLyoqIFJlcHJlc2VudHMgYSBmYWlsZWQvZXJyb3JlZCByZXNwb25zZVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0ZpeHR1cmVzI2Vycm9yZml4dHVyZXNcbiAqL1xuZXhwb3J0IHR5cGUgRXJyb3JGaXh0dXJlPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IFVwZGF0ZXIgfSA9IEVuZHBvaW50SW50ZXJmYWNlLFxuPiA9IEVycm9yRml4dHVyZUVuZHBvaW50PEU+O1xuLyoqIFJlcHJlc2VudHMgYSBzdGF0aWMgcmVzcG9uc2VcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9GaXh0dXJlc1xuICovXG5leHBvcnQgdHlwZSBGaXh0dXJlPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IFVwZGF0ZXIgfSA9IEVuZHBvaW50SW50ZXJmYWNlLFxuPiA9IEZpeHR1cmVFbmRwb2ludDxFPjtcbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,4 @@
1
+ export { MockController } from './MockController.js';
2
+ export { collapseFixture } from './collapseFixture.js';
3
+ export { createFixtureMap } from './createFixtureMap.js';
4
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2NrQ29udHJvbGxlciIsImNvbGxhcHNlRml4dHVyZSIsImNyZWF0ZUZpeHR1cmVNYXAiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9jay9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBNb2NrQ29udHJvbGxlciB9IGZyb20gJy4vTW9ja0NvbnRyb2xsZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBNb2NrUHJvcHMgfSBmcm9tICcuL21vY2tUeXBlcy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEZpeHR1cmUsXG4gIFN1Y2Nlc3NGaXh0dXJlLFxuICBFcnJvckZpeHR1cmUsXG4gIEludGVyY2VwdG9yLFxuICBSZXNwb25zZUludGVyY2VwdG9yLFxuICBGZXRjaEludGVyY2VwdG9yLFxuICBGaXh0dXJlRW5kcG9pbnQsXG4gIFN1Y2Nlc3NGaXh0dXJlRW5kcG9pbnQsXG4gIEVycm9yRml4dHVyZUVuZHBvaW50LFxufSBmcm9tICcuL2ZpeHR1cmVUeXBlcy5qcyc7XG5leHBvcnQgeyBjb2xsYXBzZUZpeHR1cmUgfSBmcm9tICcuL2NvbGxhcHNlRml4dHVyZS5qcyc7XG5leHBvcnQgeyBjcmVhdGVGaXh0dXJlTWFwIH0gZnJvbSAnLi9jcmVhdGVGaXh0dXJlTWFwLmpzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsY0FBYyxRQUFRLHFCQUFxQjtBQWFwRCxTQUFTQyxlQUFlLFFBQVEsc0JBQXNCO0FBQ3RELFNBQVNDLGdCQUFnQixRQUFRLHVCQUF1QiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vY2svbW9ja1R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRml4dHVyZSwgSW50ZXJjZXB0b3IgfSBmcm9tICcuL2ZpeHR1cmVUeXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ja1Byb3BzPFQgPSBhbnk+IHtcbiAgcmVhZG9ubHkgZml4dHVyZXM/OiAoRml4dHVyZSB8IEludGVyY2VwdG9yPFQ+KVtdO1xuICBnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhPzogKCkgPT4gVDtcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,4 @@
1
+ import { Controller } from '../index.js';
2
+ import { MockProps } from './mockTypes.js';
3
+ export declare function MockController<TBase extends typeof Controller, T>(Base: TBase, { fixtures, getInitialInterceptorData, }: MockProps<T>): TBase;
4
+ //# sourceMappingURL=MockController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockController.d.ts","sourceRoot":"","sources":["../../src/mock/MockController.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAGX,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,wBAAgB,cAAc,CAAC,KAAK,SAAS,OAAO,UAAU,EAAE,CAAC,EAC/D,IAAI,EAAE,KAAK,EACX,EACE,QAAa,EACb,yBAA6C,GAC9C,EAAE,SAAS,CAAC,CAAC,CAAC,GACd,KAAK,CAgIP"}
@@ -0,0 +1,125 @@
1
+ import { actionTypes } from '../index.js';
2
+ import { collapseFixture } from './collapseFixture.js';
3
+ import { createFixtureMap } from './createFixtureMap.js';
4
+ export function MockController(Base, {
5
+ fixtures = [],
6
+ getInitialInterceptorData = () => ({})
7
+ }) {
8
+ const [fixtureMap, interceptors] = createFixtureMap(fixtures);
9
+
10
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
11
+ // @ts-ignore
12
+ return class MockedController extends Base {
13
+ constructor(...args) {
14
+ super(...args);
15
+
16
+ // legacy compatibility
17
+ // TODO: drop when drop support for destructuring (0.14 and below)
18
+ // legacy compatibility (re-declaration)
19
+ // TODO: drop when drop support for destructuring (0.14 and below)
20
+ this.fixtureMap = fixtureMap;
21
+ this.interceptors = interceptors;
22
+ this.interceptorData = getInitialInterceptorData();
23
+ if (!this._dispatch) {
24
+ this._dispatch = args[0].dispatch;
25
+ }
26
+ }
27
+
28
+ // legacy compatibility - we need this to work with 0.14 and below as they do not have this setter
29
+ // TODO: drop when drop support for destructuring (0.14 and below)
30
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
31
+ // @ts-ignore
32
+ set dispatch(dispatch) {
33
+ this._dispatch = dispatch;
34
+ }
35
+ get dispatch() {
36
+ return action => {
37
+ var _actionTypes$FETCH;
38
+ // support legacy that has _TYPE suffix
39
+ if (action.type === ((_actionTypes$FETCH = actionTypes.FETCH) != null ? _actionTypes$FETCH : actionTypes.FETCH_TYPE)) {
40
+ // eslint-disable-next-line prefer-const
41
+ let {
42
+ key,
43
+ args
44
+ } = action;
45
+ let fixture;
46
+ if (this.fixtureMap.has(key)) {
47
+ fixture = this.fixtureMap.get(key);
48
+ if (!args) args = fixture.args;
49
+ // exact matches take priority; now test ComputedFixture
50
+ } else {
51
+ for (const cfix of this.interceptors) {
52
+ if (cfix.endpoint.testKey(key)) {
53
+ fixture = cfix;
54
+ break;
55
+ }
56
+ }
57
+ }
58
+ // we have a match
59
+ if (fixture !== undefined) {
60
+ var _fixture$delay;
61
+ const replacedAction = {
62
+ ...action
63
+ };
64
+ const delayMs = typeof fixture.delay === 'function' ? fixture.delay(...args) : (_fixture$delay = fixture.delay) != null ? _fixture$delay : 0;
65
+ if ('fetchResponse' in fixture) {
66
+ const {
67
+ fetchResponse
68
+ } = fixture;
69
+ fixture = {
70
+ endpoint: fixture.endpoint,
71
+ response(...args) {
72
+ const endpoint = action.endpoint.extend({
73
+ fetchResponse: (input, init) => {
74
+ const ret = fetchResponse.call(this, input, init);
75
+ return Promise.resolve(new Response(JSON.stringify(ret), {
76
+ status: 200,
77
+ headers: new Headers({
78
+ 'Content-Type': 'application/json'
79
+ })
80
+ }));
81
+ }
82
+ });
83
+ return endpoint(...args);
84
+ }
85
+ };
86
+ }
87
+ const fetch = async () => {
88
+ if (!fixture) {
89
+ throw new Error('No fixture found');
90
+ }
91
+ // delayCollapse determines when the fixture function is 'collapsed' (aka 'run')
92
+ // collapsed: https://en.wikipedia.org/wiki/Copenhagen_interpretation
93
+ if (fixture.delayCollapse) {
94
+ await new Promise(resolve => setTimeout(resolve, delayMs));
95
+ }
96
+ const result = await collapseFixture(fixture, args, this.interceptorData);
97
+ if (!fixture.delayCollapse && delayMs) {
98
+ await new Promise(resolve => setTimeout(resolve, delayMs));
99
+ }
100
+ if (result.error) {
101
+ throw result.response;
102
+ }
103
+ return result.response;
104
+ };
105
+ if (typeof replacedAction.endpoint.extend === 'function') {
106
+ replacedAction.endpoint = replacedAction.endpoint.extend({
107
+ fetch
108
+ });
109
+ } else {
110
+ // TODO: full testing of this
111
+ replacedAction.endpoint = fetch;
112
+ replacedAction.endpoint.__proto__ = action.endpoint;
113
+ }
114
+
115
+ // TODO: make super.dispatch (once we drop support for destructuring)
116
+ return this._dispatch(replacedAction);
117
+ }
118
+ }
119
+ // TODO: make super.dispatch (once we drop support for destructuring)
120
+ return this._dispatch(action);
121
+ };
122
+ }
123
+ };
124
+ }
125
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3Rpb25UeXBlcyIsImNvbGxhcHNlRml4dHVyZSIsImNyZWF0ZUZpeHR1cmVNYXAiLCJNb2NrQ29udHJvbGxlciIsIkJhc2UiLCJmaXh0dXJlcyIsImdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEiLCJmaXh0dXJlTWFwIiwiaW50ZXJjZXB0b3JzIiwiTW9ja2VkQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYXJncyIsImludGVyY2VwdG9yRGF0YSIsIl9kaXNwYXRjaCIsImRpc3BhdGNoIiwiYWN0aW9uIiwiX2FjdGlvblR5cGVzJEZFVENIIiwidHlwZSIsIkZFVENIIiwiRkVUQ0hfVFlQRSIsImtleSIsImZpeHR1cmUiLCJoYXMiLCJnZXQiLCJjZml4IiwiZW5kcG9pbnQiLCJ0ZXN0S2V5IiwidW5kZWZpbmVkIiwiX2ZpeHR1cmUkZGVsYXkiLCJyZXBsYWNlZEFjdGlvbiIsImRlbGF5TXMiLCJkZWxheSIsImZldGNoUmVzcG9uc2UiLCJyZXNwb25zZSIsImV4dGVuZCIsImlucHV0IiwiaW5pdCIsInJldCIsImNhbGwiLCJQcm9taXNlIiwicmVzb2x2ZSIsIlJlc3BvbnNlIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXR1cyIsImhlYWRlcnMiLCJIZWFkZXJzIiwiZmV0Y2giLCJFcnJvciIsImRlbGF5Q29sbGFwc2UiLCJzZXRUaW1lb3V0IiwicmVzdWx0IiwiZXJyb3IiLCJfX3Byb3RvX18iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9jay9Nb2NrQ29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBhY3Rpb25UeXBlcyxcbiAgQ29udHJvbGxlcixcbiAgRGF0YUNsaWVudERpc3BhdGNoLFxuICBHZW5lcmljRGlzcGF0Y2gsXG59IGZyb20gJy4uL2luZGV4LmpzJztcbmltcG9ydCB7IGNvbGxhcHNlRml4dHVyZSB9IGZyb20gJy4vY29sbGFwc2VGaXh0dXJlLmpzJztcbmltcG9ydCB7IGNyZWF0ZUZpeHR1cmVNYXAgfSBmcm9tICcuL2NyZWF0ZUZpeHR1cmVNYXAuanMnO1xuaW1wb3J0IHR5cGUgeyBGaXh0dXJlLCBJbnRlcmNlcHRvciB9IGZyb20gJy4vZml4dHVyZVR5cGVzLmpzJztcbmltcG9ydCB7IE1vY2tQcm9wcyB9IGZyb20gJy4vbW9ja1R5cGVzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIE1vY2tDb250cm9sbGVyPFRCYXNlIGV4dGVuZHMgdHlwZW9mIENvbnRyb2xsZXIsIFQ+KFxuICBCYXNlOiBUQmFzZSxcbiAge1xuICAgIGZpeHR1cmVzID0gW10sXG4gICAgZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSA9ICgpID0+ICh7fSkgYXMgYW55LFxuICB9OiBNb2NrUHJvcHM8VD4sXG4pOiBUQmFzZSB7XG4gIGNvbnN0IFtmaXh0dXJlTWFwLCBpbnRlcmNlcHRvcnNdID0gY3JlYXRlRml4dHVyZU1hcChmaXh0dXJlcyk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBjbGFzcyBNb2NrZWRDb250cm9sbGVyPFxuICAgIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4gID4gZXh0ZW5kcyBCYXNlPEQ+IHtcbiAgICAvLyBsZWdhY3kgY29tcGF0aWJpbGl0eSAocmUtZGVjbGFyYXRpb24pXG4gICAgLy8gVE9ETzogZHJvcCB3aGVuIGRyb3Agc3VwcG9ydCBmb3IgZGVzdHJ1Y3R1cmluZyAoMC4xNCBhbmQgYmVsb3cpXG4gICAgZGVjbGFyZSBwcm90ZWN0ZWQgX2Rpc3BhdGNoOiBEO1xuXG4gICAgZml4dHVyZU1hcDogTWFwPHN0cmluZywgRml4dHVyZT4gPSBmaXh0dXJlTWFwO1xuICAgIGludGVyY2VwdG9yczogSW50ZXJjZXB0b3I8YW55PltdID0gaW50ZXJjZXB0b3JzO1xuICAgIGludGVyY2VwdG9yRGF0YTogVCA9IGdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEoKTtcblxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcblxuICAgICAgLy8gbGVnYWN5IGNvbXBhdGliaWxpdHlcbiAgICAgIC8vIFRPRE86IGRyb3Agd2hlbiBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcgKDAuMTQgYW5kIGJlbG93KVxuICAgICAgaWYgKCF0aGlzLl9kaXNwYXRjaCkge1xuICAgICAgICB0aGlzLl9kaXNwYXRjaCA9IChhcmdzWzBdIGFzIGFueSkuZGlzcGF0Y2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbGVnYWN5IGNvbXBhdGliaWxpdHkgLSB3ZSBuZWVkIHRoaXMgdG8gd29yayB3aXRoIDAuMTQgYW5kIGJlbG93IGFzIHRoZXkgZG8gbm90IGhhdmUgdGhpcyBzZXR0ZXJcbiAgICAvLyBUT0RPOiBkcm9wIHdoZW4gZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nICgwLjE0IGFuZCBiZWxvdylcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNldCBkaXNwYXRjaChkaXNwYXRjaDogRCkge1xuICAgICAgdGhpcy5fZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICB9XG5cbiAgICBnZXQgZGlzcGF0Y2goKTogRCB7XG4gICAgICByZXR1cm4gKChhY3Rpb246IFBhcmFtZXRlcnM8RD5bMF0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgLy8gc3VwcG9ydCBsZWdhY3kgdGhhdCBoYXMgX1RZUEUgc3VmZml4XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gKGFjdGlvblR5cGVzLkZFVENIID8/IGFjdGlvblR5cGVzLkZFVENIX1RZUEUpKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgICAgIGxldCB7IGtleSwgYXJncyB9ID0gYWN0aW9uO1xuICAgICAgICAgIGxldCBmaXh0dXJlOiBGaXh0dXJlIHwgSW50ZXJjZXB0b3IgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMuZml4dHVyZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgZml4dHVyZSA9IHRoaXMuZml4dHVyZU1hcC5nZXQoa2V5KSBhcyBGaXh0dXJlO1xuICAgICAgICAgICAgaWYgKCFhcmdzKSBhcmdzID0gZml4dHVyZS5hcmdzO1xuICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2hlcyB0YWtlIHByaW9yaXR5OyBub3cgdGVzdCBDb21wdXRlZEZpeHR1cmVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjZml4IG9mIHRoaXMuaW50ZXJjZXB0b3JzKSB7XG4gICAgICAgICAgICAgIGlmIChjZml4LmVuZHBvaW50LnRlc3RLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGZpeHR1cmUgPSBjZml4O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHdlIGhhdmUgYSBtYXRjaFxuICAgICAgICAgIGlmIChmaXh0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VkQWN0aW9uOiB0eXBlb2YgYWN0aW9uID0ge1xuICAgICAgICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZGVsYXlNcyA9XG4gICAgICAgICAgICAgIHR5cGVvZiBmaXh0dXJlLmRlbGF5ID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICAgICAgICBmaXh0dXJlLmRlbGF5KC4uLihhcmdzIGFzIGFueSkpXG4gICAgICAgICAgICAgIDogKGZpeHR1cmUuZGVsYXkgPz8gMCk7XG5cbiAgICAgICAgICAgIGlmICgnZmV0Y2hSZXNwb25zZScgaW4gZml4dHVyZSkge1xuICAgICAgICAgICAgICBjb25zdCB7IGZldGNoUmVzcG9uc2UgfSA9IGZpeHR1cmU7XG4gICAgICAgICAgICAgIGZpeHR1cmUgPSB7XG4gICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGZpeHR1cmUuZW5kcG9pbnQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UoLi4uYXJncykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSAoYWN0aW9uLmVuZHBvaW50IGFzIGFueSkuZXh0ZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hSZXNwb25zZTogKGlucHV0OiBSZXF1ZXN0SW5mbywgaW5pdDogUmVxdWVzdEluaXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBmZXRjaFJlc3BvbnNlLmNhbGwodGhpcywgaW5wdXQsIGluaXQpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkocmV0KSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbmRwb2ludCBhcyBhbnkpKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmZXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFmaXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBmaXh0dXJlIGZvdW5kJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZGVsYXlDb2xsYXBzZSBkZXRlcm1pbmVzIHdoZW4gdGhlIGZpeHR1cmUgZnVuY3Rpb24gaXMgJ2NvbGxhcHNlZCcgKGFrYSAncnVuJylcbiAgICAgICAgICAgICAgLy8gY29sbGFwc2VkOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db3BlbmhhZ2VuX2ludGVycHJldGF0aW9uXG4gICAgICAgICAgICAgIGlmIChmaXh0dXJlLmRlbGF5Q29sbGFwc2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXlNcykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbGxhcHNlRml4dHVyZShcbiAgICAgICAgICAgICAgICBmaXh0dXJlIGFzIGFueSxcbiAgICAgICAgICAgICAgICBhcmdzIGFzIGFueSxcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyY2VwdG9yRGF0YSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKCFmaXh0dXJlLmRlbGF5Q29sbGFwc2UgJiYgZGVsYXlNcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdC5yZXNwb25zZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50IGFzIGFueSkuZXh0ZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50ID0gKHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50IGFzIGFueSkuZXh0ZW5kKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZldGNoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBmdWxsIHRlc3Rpbmcgb2YgdGhpc1xuICAgICAgICAgICAgICByZXBsYWNlZEFjdGlvbi5lbmRwb2ludCA9IGZldGNoIGFzIGFueTtcbiAgICAgICAgICAgICAgKHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50IGFzIGFueSkuX19wcm90b19fID0gYWN0aW9uLmVuZHBvaW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHN1cGVyLmRpc3BhdGNoIChvbmNlIHdlIGRyb3Agc3VwcG9ydCBmb3IgZGVzdHJ1Y3R1cmluZylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaChyZXBsYWNlZEFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IG1ha2Ugc3VwZXIuZGlzcGF0Y2ggKG9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nKVxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgIH0pIGFzIGFueTtcbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQ0VBLFdBQVcsUUFJTixhQUFhO0FBQ3BCLFNBQVNDLGVBQWUsUUFBUSxzQkFBc0I7QUFDdEQsU0FBU0MsZ0JBQWdCLFFBQVEsdUJB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
@@ -0,0 +1,6 @@
1
+ import type { Fixture, ResponseInterceptor } from './fixtureTypes.js';
2
+ export declare function collapseFixture(fixture: Fixture | ResponseInterceptor, args: any[], interceptorData: any): Promise<{
3
+ response: any;
4
+ error: boolean | undefined;
5
+ }>;
6
+ //# sourceMappingURL=collapseFixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapseFixture.d.ts","sourceRoot":"","sources":["../../src/mock/collapseFixture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,GAAG,mBAAmB,EACtC,IAAI,EAAE,GAAG,EAAE,EACX,eAAe,EAAE,GAAG;;;GAerB"}
@@ -0,0 +1,19 @@
1
+ export async function collapseFixture(fixture, args, interceptorData) {
2
+ let error = 'error' in fixture ? fixture.error : false;
3
+ let response = fixture.response;
4
+ if (typeof fixture.response === 'function') {
5
+ try {
6
+ response = await fixture.response.apply(interceptorData, args);
7
+ // dispatch goes through user-code that can sometimes fail.
8
+ // let's ensure we always handle errors
9
+ } catch (e) {
10
+ response = e;
11
+ error = true;
12
+ }
13
+ }
14
+ return {
15
+ response,
16
+ error
17
+ };
18
+ }
19
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb2xsYXBzZUZpeHR1cmUiLCJmaXh0dXJlIiwiYXJncyIsImludGVyY2VwdG9yRGF0YSIsImVycm9yIiwicmVzcG9uc2UiLCJhcHBseSIsImUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9jay9jb2xsYXBzZUZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBGaXh0dXJlLCBSZXNwb25zZUludGVyY2VwdG9yIH0gZnJvbSAnLi9maXh0dXJlVHlwZXMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGFwc2VGaXh0dXJlKFxuICBmaXh0dXJlOiBGaXh0dXJlIHwgUmVzcG9uc2VJbnRlcmNlcHRvcixcbiAgYXJnczogYW55W10sXG4gIGludGVyY2VwdG9yRGF0YTogYW55LFxuKSB7XG4gIGxldCBlcnJvciA9ICdlcnJvcicgaW4gZml4dHVyZSA/IGZpeHR1cmUuZXJyb3IgOiBmYWxzZTtcbiAgbGV0IHJlc3BvbnNlID0gZml4dHVyZS5yZXNwb25zZTtcbiAgaWYgKHR5cGVvZiBmaXh0dXJlLnJlc3BvbnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZml4dHVyZS5yZXNwb25zZS5hcHBseShpbnRlcmNlcHRvckRhdGEsIGFyZ3MpO1xuICAgICAgLy8gZGlzcGF0Y2ggZ29lcyB0aHJvdWdoIHVzZXItY29kZSB0aGF0IGNhbiBzb21ldGltZXMgZmFpbC5cbiAgICAgIC8vIGxldCdzIGVuc3VyZSB3ZSBhbHdheXMgaGFuZGxlIGVycm9yc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmVzcG9uc2UgPSBlO1xuICAgICAgZXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByZXNwb25zZSwgZXJyb3IgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxlQUFlQSxlQUFlQSxDQUNuQ0MsT0FBc0MsRUFDdENDLElBQVcsRUFDWEMsZUFBb0IsRUFDcEI7RUFDQSxJQUFJQyxLQUFLLEdBQUcsT0FBTyxJQUFJSCxPQUFPLEdBQUdBLE9BQU8sQ0FBQ0csS0FBSyxHQUFHLEtBQUs7RUFDdEQsSUFBSUMsUUFBUSxHQUFHSixPQUFPLENBQUNJLFFBQVE7RUFDL0IsSUFBSSxPQUFPSixPQUFPLENBQUNJLFFBQVEsS0FBSyxVQUFVLEVBQUU7SUFDMUMsSUFBSTtNQUNGQSxRQUFRLEdBQUcsTUFBTUosT0FBTyxDQUFDSSxRQUFRLENBQUNDLEtBQUssQ0FBQ0gsZUFBZSxFQUFFRCxJQUFJLENBQUM7TUFDOUQ7TUFDQTtJQUNGLENBQUMsQ0FBQyxPQUFPSyxDQUFNLEVBQUU7TUFDZkYsUUFBUSxHQUFHRSxDQUFDO01BQ1pILEtBQUssR0FBRyxJQUFJO0lBQ2Q7RUFDRjtFQUNBLE9BQU87SUFBRUMsUUFBUTtJQUFFRDtFQUFNLENBQUM7QUFDNUIiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,3 @@
1
+ import type { Fixture, Interceptor } from './fixtureTypes.js';
2
+ export declare function createFixtureMap(fixtures?: (Fixture | Interceptor)[]): readonly [Map<string, Fixture>, Interceptor[]];
3
+ //# sourceMappingURL=createFixtureMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFixtureMap.d.ts","sourceRoot":"","sources":["../../src/mock/createFixtureMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE9D,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,CAAC,OAAO,GAAG,WAAW,CAAC,EAAO,kDAuBxE"}
@@ -0,0 +1,23 @@
1
+ export function createFixtureMap(fixtures = []) {
2
+ const map = new Map();
3
+ const computed = [];
4
+ for (const fixture of fixtures) {
5
+ if ('args' in fixture) {
6
+ if (typeof fixture.response !== 'function') {
7
+ const key = fixture.endpoint.key(...fixture.args);
8
+ map.set(key, fixture);
9
+ } else {
10
+ // this has to be a typo. probably needs to remove args
11
+ console.warn(`Fixture found with function response, and explicit args. Interceptors should not specify args.
12
+ ${fixture.endpoint.name}: ${JSON.stringify(fixture.args)}
13
+
14
+ Treating as Interceptor`);
15
+ computed.push(fixture);
16
+ }
17
+ } else {
18
+ computed.push(fixture);
19
+ }
20
+ }
21
+ return [map, computed];
22
+ }
23
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVGaXh0dXJlTWFwIiwiZml4dHVyZXMiLCJtYXAiLCJNYXAiLCJjb21wdXRlZCIsImZpeHR1cmUiLCJyZXNwb25zZSIsImtleSIsImVuZHBvaW50IiwiYXJncyIsInNldCIsImNvbnNvbGUiLCJ3YXJuIiwibmFtZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdXNoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vY2svY3JlYXRlRml4dHVyZU1hcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpeHR1cmUsIEludGVyY2VwdG9yIH0gZnJvbSAnLi9maXh0dXJlVHlwZXMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRml4dHVyZU1hcChmaXh0dXJlczogKEZpeHR1cmUgfCBJbnRlcmNlcHRvcilbXSA9IFtdKSB7XG4gIGNvbnN0IG1hcDogTWFwPHN0cmluZywgRml4dHVyZT4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGNvbXB1dGVkOiBJbnRlcmNlcHRvcltdID0gW107XG4gIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgIGlmICgnYXJncycgaW4gZml4dHVyZSkge1xuICAgICAgaWYgKHR5cGVvZiBmaXh0dXJlLnJlc3BvbnNlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpeHR1cmUuZW5kcG9pbnQua2V5KC4uLmZpeHR1cmUuYXJncyk7XG4gICAgICAgIG1hcC5zZXQoa2V5LCBmaXh0dXJlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMgaGFzIHRvIGJlIGEgdHlwby4gcHJvYmFibHkgbmVlZHMgdG8gcmVtb3ZlIGFyZ3NcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBGaXh0dXJlIGZvdW5kIHdpdGggZnVuY3Rpb24gcmVzcG9uc2UsIGFuZCBleHBsaWNpdCBhcmdzLiBJbnRlcmNlcHRvcnMgc2hvdWxkIG5vdCBzcGVjaWZ5IGFyZ3MuXG4ke2ZpeHR1cmUuZW5kcG9pbnQubmFtZX06ICR7SlNPTi5zdHJpbmdpZnkoZml4dHVyZS5hcmdzKX1cblxuVHJlYXRpbmcgYXMgSW50ZXJjZXB0b3JgLFxuICAgICAgICApO1xuICAgICAgICBjb21wdXRlZC5wdXNoKGZpeHR1cmUgYXMgYW55KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tcHV0ZWQucHVzaChmaXh0dXJlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFttYXAsIGNvbXB1dGVkXSBhcyBjb25zdDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxTQUFTQSxnQkFBZ0JBLENBQUNDLFFBQW1DLEdBQUcsRUFBRSxFQUFFO0VBQ3pFLE1BQU1DLEdBQXlCLEdBQUcsSUFBSUMsR0FBRyxDQUFDLENBQUM7RUFDM0MsTUFBTUMsUUFBdUIsR0FBRyxFQUFFO0VBQ2xDLEtBQUssTUFBTUMsT0FBTyxJQUFJSixRQUFRLEVBQUU7SUFDOUIsSUFBSSxNQUFNLElBQUlJLE9BQU8sRUFBRTtNQUNyQixJQUFJLE9BQU9BLE9BQU8sQ0FBQ0MsUUFBUSxLQUFLLFVBQVUsRUFBRTtRQUMxQyxNQUFNQyxHQUFHLEdBQUdGLE9BQU8sQ0FBQ0csUUFBUSxDQUFDRCxHQUFHLENBQUMsR0FBR0YsT0FBTyxDQUFDSSxJQUFJLENBQUM7UUFDakRQLEdBQUcsQ0FBQ1EsR0FBRyxDQUFDSCxHQUFHLEVBQUVGLE9BQU8sQ0FBQztNQUN2QixDQUFDLE1BQU07UUFDTDtRQUNBTSxPQUFPLENBQUNDLElBQUksQ0FDVjtBQUNWLEVBQUVQLE9BQU8sQ0FBQ0csUUFBUSxDQUFDSyxJQUFJLEtBQUtDLElBQUksQ0FBQ0MsU0FBUyxDQUFDVixPQUFPLENBQUNJLElBQUksQ0FBQztBQUN4RDtBQUNBLHdCQUNRLENBQUM7UUFDREwsUUFBUSxDQUFDWSxJQUFJLENBQUNYLE9BQWMsQ0FBQztNQUMvQjtJQUNGLENBQUMsTUFBTTtNQUNMRCxRQUFRLENBQUNZLElBQUksQ0FBQ1gsT0FBTyxDQUFDO0lBQ3hCO0VBQ0Y7RUFDQSxPQUFPLENBQUNILEdBQUcsRUFBRUUsUUFBUSxDQUFDO0FBQ3hCIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,99 @@
1
+ import type { EndpointInterface, ResolveType } from '@data-client/endpoint';
2
+ type Updater = (result: any, ...args: any) => Record<string, (...args: any) => any>;
3
+ export interface SuccessFixtureEndpoint<E extends EndpointInterface & {
4
+ update?: Updater;
5
+ } = EndpointInterface> {
6
+ readonly endpoint: E;
7
+ readonly args: Parameters<E>;
8
+ readonly response: ResolveType<E> | ((...args: Parameters<E>) => ResolveType<E>);
9
+ readonly error?: false;
10
+ /** Number of miliseconds to wait before resolving */
11
+ readonly delay?: number;
12
+ /** Waits to run `response()` after `delay` time */
13
+ readonly delayCollapse?: boolean;
14
+ }
15
+ export interface ResponseInterceptor<T = any, E extends EndpointInterface & {
16
+ update?: Updater;
17
+ testKey(key: string): boolean;
18
+ } = EndpointInterface & {
19
+ testKey(key: string): boolean;
20
+ }> {
21
+ readonly endpoint: E;
22
+ response(this: T, ...args: Parameters<E>): ResolveType<E>;
23
+ /** Number of miliseconds (or function that returns) to wait before resolving */
24
+ readonly delay?: number | ((...args: Parameters<E>) => number);
25
+ /** Waits to run `response()` after `delay` time */
26
+ readonly delayCollapse?: boolean;
27
+ }
28
+ export interface FetchInterceptor<T = any, E extends EndpointInterface & {
29
+ update?: Updater;
30
+ testKey(key: string): boolean;
31
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
32
+ extend(options: any): any;
33
+ } = EndpointInterface & {
34
+ testKey(key: string): boolean;
35
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
36
+ extend(options: any): any;
37
+ }> {
38
+ readonly endpoint: E;
39
+ fetchResponse(this: T, input: RequestInfo, init: RequestInit): ResolveType<E>;
40
+ /** Number of miliseconds (or function that returns) to wait before resolving */
41
+ readonly delay?: number | ((...args: Parameters<E>) => number);
42
+ /** Waits to run `response()` after `delay` time */
43
+ readonly delayCollapse?: boolean;
44
+ }
45
+ /** Interceptors match and compute dynamic responses based on args
46
+ *
47
+ * @see https://dataclient.io/docs/api/Fixtures#interceptor
48
+ */
49
+ export type Interceptor<T = any, E extends EndpointInterface & {
50
+ update?: Updater;
51
+ testKey(key: string): boolean;
52
+ fetchResponse?(input: RequestInfo, init: RequestInit): Promise<Response>;
53
+ extend?(options: any): any;
54
+ } = EndpointInterface & {
55
+ testKey(key: string): boolean;
56
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
57
+ extend(options: any): any;
58
+ }> = ResponseInterceptor<T, E> | (E extends ({
59
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
60
+ extend(options: any): any;
61
+ }) ? FetchInterceptor<T, E> : never);
62
+ export interface ErrorFixtureEndpoint<E extends EndpointInterface & {
63
+ update?: Updater;
64
+ } = EndpointInterface> {
65
+ readonly endpoint: E;
66
+ readonly args: Parameters<E>;
67
+ readonly response: any;
68
+ readonly error: true;
69
+ /** Number of miliseconds to wait before resolving */
70
+ readonly delay?: number;
71
+ /** Waits to run `response()` after `delay` time */
72
+ readonly delayCollapse?: boolean;
73
+ }
74
+ export type FixtureEndpoint<E extends EndpointInterface & {
75
+ update?: Updater;
76
+ } = EndpointInterface> = SuccessFixtureEndpoint<E> | ErrorFixtureEndpoint<E>;
77
+ /** Represents a successful response
78
+ *
79
+ * @see https://dataclient.io/docs/api/Fixtures#successfixture
80
+ */
81
+ export type SuccessFixture<E extends EndpointInterface & {
82
+ update?: Updater;
83
+ } = EndpointInterface> = SuccessFixtureEndpoint<E>;
84
+ /** Represents a failed/errored response
85
+ *
86
+ * @see https://dataclient.io/docs/api/Fixtures#errorfixtures
87
+ */
88
+ export type ErrorFixture<E extends EndpointInterface & {
89
+ update?: Updater;
90
+ } = EndpointInterface> = ErrorFixtureEndpoint<E>;
91
+ /** Represents a static response
92
+ *
93
+ * @see https://dataclient.io/docs/api/Fixtures
94
+ */
95
+ export type Fixture<E extends EndpointInterface & {
96
+ update?: Updater;
97
+ } = EndpointInterface> = FixtureEndpoint<E>;
98
+ export {};
99
+ //# sourceMappingURL=fixtureTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtureTypes.d.ts","sourceRoot":"","sources":["../../src/mock/fixtureTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vY2svZml4dHVyZVR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW5kcG9pbnRJbnRlcmZhY2UsIFJlc29sdmVUeXBlIH0gZnJvbSAnQGRhdGEtY2xpZW50L2VuZHBvaW50JztcblxudHlwZSBVcGRhdGVyID0gKFxuICByZXN1bHQ6IGFueSxcbiAgLi4uYXJnczogYW55XG4pID0+IFJlY29yZDxzdHJpbmcsICguLi5hcmdzOiBhbnkpID0+IGFueT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VjY2Vzc0ZpeHR1cmVFbmRwb2ludDxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBVcGRhdGVyIH0gPSBFbmRwb2ludEludGVyZmFjZSxcbj4ge1xuICByZWFkb25seSBlbmRwb2ludDogRTtcbiAgcmVhZG9ubHkgYXJnczogUGFyYW1ldGVyczxFPjtcbiAgcmVhZG9ubHkgcmVzcG9uc2U6XG4gICAgfCBSZXNvbHZlVHlwZTxFPlxuICAgIHwgKCguLi5hcmdzOiBQYXJhbWV0ZXJzPEU+KSA9PiBSZXNvbHZlVHlwZTxFPik7XG4gIHJlYWRvbmx5IGVycm9yPzogZmFsc2U7XG4gIC8qKiBOdW1iZXIgb2YgbWlsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmVzb2x2aW5nICovXG4gIHJlYWRvbmx5IGRlbGF5PzogbnVtYmVyO1xuICAvKiogV2FpdHMgdG8gcnVuIGByZXNwb25zZSgpYCBhZnRlciBgZGVsYXlgIHRpbWUgKi9cbiAgcmVhZG9ubHkgZGVsYXlDb2xsYXBzZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VJbnRlcmNlcHRvcjxcbiAgVCA9IGFueSxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgIHVwZGF0ZT86IFVwZGF0ZXI7XG4gICAgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gIH0gPSBFbmRwb2ludEludGVyZmFjZSAmIHsgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4gfSxcbj4ge1xuICByZWFkb25seSBlbmRwb2ludDogRTtcbiAgcmVzcG9uc2UodGhpczogVCwgLi4uYXJnczogUGFyYW1ldGVyczxFPik6IFJlc29sdmVUeXBlPEU+O1xuICAvKiogTnVtYmVyIG9mIG1pbGlzZWNvbmRzIChvciBmdW5jdGlvbiB0aGF0IHJldHVybnMpIHRvIHdhaXQgYmVmb3JlIHJlc29sdmluZyAqL1xuICByZWFkb25seSBkZWxheT86IG51bWJlciB8ICgoLi4uYXJnczogUGFyYW1ldGVyczxFPikgPT4gbnVtYmVyKTtcbiAgLyoqIFdhaXRzIHRvIHJ1biBgcmVzcG9uc2UoKWAgYWZ0ZXIgYGRlbGF5YCB0aW1lICovXG4gIHJlYWRvbmx5IGRlbGF5Q29sbGFwc2U/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBGZXRjaEludGVyY2VwdG9yPFxuICBUID0gYW55LFxuICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgdXBkYXRlPzogVXBkYXRlcjtcbiAgICB0ZXN0S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICBmZXRjaFJlc3BvbnNlKGlucHV0OiBSZXF1ZXN0SW5mbywgaW5pdDogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPjtcbiAgICBleHRlbmQob3B0aW9uczogYW55KTogYW55O1xuICB9ID0gRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgZmV0Y2hSZXNwb25zZShpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ6IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gICAgZXh0ZW5kKG9wdGlvbnM6IGFueSk6IGFueTtcbiAgfSxcbj4ge1xuICByZWFkb25seSBlbmRwb2ludDogRTtcbiAgZmV0Y2hSZXNwb25zZSh0aGlzOiBULCBpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ6IFJlcXVlc3RJbml0KTogUmVzb2x2ZVR5cGU8RT47XG4gIC8qKiBOdW1iZXIgb2YgbWlsaXNlY29uZHMgKG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucykgdG8gd2FpdCBiZWZvcmUgcmVzb2x2aW5nICovXG4gIHJlYWRvbmx5IGRlbGF5PzogbnVtYmVyIHwgKCguLi5hcmdzOiBQYXJhbWV0ZXJzPEU+KSA9PiBudW1iZXIpO1xuICAvKiogV2FpdHMgdG8gcnVuIGByZXNwb25zZSgpYCBhZnRlciBgZGVsYXlgIHRpbWUgKi9cbiAgcmVhZG9ubHkgZGVsYXlDb2xsYXBzZT86IGJvb2xlYW47XG59XG4vKiogSW50ZXJjZXB0b3JzIG1hdGNoIGFuZCBjb21wdXRlIGR5bmFtaWMgcmVzcG9uc2VzIGJhc2VkIG9uIGFyZ3NcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9GaXh0dXJlcyNpbnRlcmNlcHRvclxuICovXG5leHBvcnQgdHlwZSBJbnRlcmNlcHRvcjxcbiAgVCA9IGFueSxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYge1xuICAgIHVwZGF0ZT86IFVwZGF0ZXI7XG4gICAgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgZmV0Y2hSZXNwb25zZT8oaW5wdXQ6IFJlcXVlc3RJbmZvLCBpbml0OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+O1xuICAgIGV4dGVuZD8ob3B0aW9uczogYW55KTogYW55O1xuICB9ID0gRW5kcG9pbnRJbnRlcmZhY2UgJiB7XG4gICAgdGVzdEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgZmV0Y2hSZXNwb25zZShpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ6IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gICAgZXh0ZW5kKG9wdGlvbnM6IGFueSk6IGFueTtcbiAgfSxcbj4gPVxuICB8IFJlc3BvbnNlSW50ZXJjZXB0b3I8VCwgRT5cbiAgfCAoRSBleHRlbmRzIChcbiAgICAgIHtcbiAgICAgICAgZmV0Y2hSZXNwb25zZShpbnB1dDogUmVxdWVzdEluZm8sIGluaXQ6IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gICAgICAgIGV4dGVuZChvcHRpb25zOiBhbnkpOiBhbnk7XG4gICAgICB9XG4gICAgKSA/XG4gICAgICBGZXRjaEludGVyY2VwdG9yPFQsIEU+XG4gICAgOiBuZXZlcik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JGaXh0dXJlRW5kcG9pbnQ8XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHsgdXBkYXRlPzogVXBkYXRlciB9ID0gRW5kcG9pbnRJbnRlcmZhY2UsXG4+IHtcbiAgcmVhZG9ubHkgZW5kcG9pbnQ6IEU7XG4gIHJlYWRvbmx5IGFyZ3M6IFBhcmFtZXRlcnM8RT47XG4gIHJlYWRvbmx5IHJlc3BvbnNlOiBhbnk7XG4gIHJlYWRvbmx5IGVycm9yOiB0cnVlO1xuICAvKiogTnVtYmVyIG9mIG1pbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJlc29sdmluZyAqL1xuICByZWFkb25seSBkZWxheT86IG51bWJlcjtcbiAgLyoqIFdhaXRzIHRvIHJ1biBgcmVzcG9uc2UoKWAgYWZ0ZXIgYGRlbGF5YCB0aW1lICovXG4gIHJlYWRvbmx5IGRlbGF5Q29sbGFwc2U/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBGaXh0dXJlRW5kcG9pbnQ8XG4gIEUgZXh0ZW5kcyBFbmRwb2ludEludGVyZmFjZSAmIHsgdXBkYXRlPzogVXBkYXRlciB9ID0gRW5kcG9pbnRJbnRlcmZhY2UsXG4+ID0gU3VjY2Vzc0ZpeHR1cmVFbmRwb2ludDxFPiB8IEVycm9yRml4dHVyZUVuZHBvaW50PEU+O1xuXG4vKiogUmVwcmVzZW50cyBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2VcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9GaXh0dXJlcyNzdWNjZXNzZml4dHVyZVxuICovXG5leHBvcnQgdHlwZSBTdWNjZXNzRml4dHVyZTxcbiAgRSBleHRlbmRzIEVuZHBvaW50SW50ZXJmYWNlICYgeyB1cGRhdGU/OiBVcGRhdGVyIH0gPSBFbmRwb2ludEludGVyZmFjZSxcbj4gPSBTdWNjZXNzRml4dHVyZUVuZHBvaW50PEU+O1xuLyoqIFJlcHJlc2VudHMgYSBmYWlsZWQvZXJyb3JlZCByZXNwb25zZVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL0ZpeHR1cmVzI2Vycm9yZml4dHVyZXNcbiAqL1xuZXhwb3J0IHR5cGUgRXJyb3JGaXh0dXJlPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IFVwZGF0ZXIgfSA9IEVuZHBvaW50SW50ZXJmYWNlLFxuPiA9IEVycm9yRml4dHVyZUVuZHBvaW50PEU+O1xuLyoqIFJlcHJlc2VudHMgYSBzdGF0aWMgcmVzcG9uc2VcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9GaXh0dXJlc1xuICovXG5leHBvcnQgdHlwZSBGaXh0dXJlPFxuICBFIGV4dGVuZHMgRW5kcG9pbnRJbnRlcmZhY2UgJiB7IHVwZGF0ZT86IFVwZGF0ZXIgfSA9IEVuZHBvaW50SW50ZXJmYWNlLFxuPiA9IEZpeHR1cmVFbmRwb2ludDxFPjtcbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,6 @@
1
+ export { MockController } from './MockController.js';
2
+ export type { MockProps } from './mockTypes.js';
3
+ export type { Fixture, SuccessFixture, ErrorFixture, Interceptor, ResponseInterceptor, FetchInterceptor, FixtureEndpoint, SuccessFixtureEndpoint, ErrorFixtureEndpoint, } from './fixtureTypes.js';
4
+ export { collapseFixture } from './collapseFixture.js';
5
+ export { createFixtureMap } from './createFixtureMap.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mock/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EACV,OAAO,EACP,cAAc,EACd,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { MockController } from './MockController.js';
2
+ export { collapseFixture } from './collapseFixture.js';
3
+ export { createFixtureMap } from './createFixtureMap.js';
4
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2NrQ29udHJvbGxlciIsImNvbGxhcHNlRml4dHVyZSIsImNyZWF0ZUZpeHR1cmVNYXAiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9jay9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBNb2NrQ29udHJvbGxlciB9IGZyb20gJy4vTW9ja0NvbnRyb2xsZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBNb2NrUHJvcHMgfSBmcm9tICcuL21vY2tUeXBlcy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEZpeHR1cmUsXG4gIFN1Y2Nlc3NGaXh0dXJlLFxuICBFcnJvckZpeHR1cmUsXG4gIEludGVyY2VwdG9yLFxuICBSZXNwb25zZUludGVyY2VwdG9yLFxuICBGZXRjaEludGVyY2VwdG9yLFxuICBGaXh0dXJlRW5kcG9pbnQsXG4gIFN1Y2Nlc3NGaXh0dXJlRW5kcG9pbnQsXG4gIEVycm9yRml4dHVyZUVuZHBvaW50LFxufSBmcm9tICcuL2ZpeHR1cmVUeXBlcy5qcyc7XG5leHBvcnQgeyBjb2xsYXBzZUZpeHR1cmUgfSBmcm9tICcuL2NvbGxhcHNlRml4dHVyZS5qcyc7XG5leHBvcnQgeyBjcmVhdGVGaXh0dXJlTWFwIH0gZnJvbSAnLi9jcmVhdGVGaXh0dXJlTWFwLmpzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsY0FBYyxRQUFRLHFCQUFxQjtBQWFwRCxTQUFTQyxlQUFlLFFBQVEsc0JBQXNCO0FBQ3RELFNBQVNDLGdCQUFnQixRQUFRLHVCQUF1QiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,6 @@
1
+ import type { Fixture, Interceptor } from './fixtureTypes.js';
2
+ export interface MockProps<T = any> {
3
+ readonly fixtures?: (Fixture | Interceptor<T>)[];
4
+ getInitialInterceptorData?: () => T;
5
+ }
6
+ //# sourceMappingURL=mockTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockTypes.d.ts","sourceRoot":"","sources":["../../src/mock/mockTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,GAAG;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,yBAAyB,CAAC,EAAE,MAAM,CAAC,CAAC;CACrC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vY2svbW9ja1R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRml4dHVyZSwgSW50ZXJjZXB0b3IgfSBmcm9tICcuL2ZpeHR1cmVUeXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ja1Byb3BzPFQgPSBhbnk+IHtcbiAgcmVhZG9ubHkgZml4dHVyZXM/OiAoRml4dHVyZSB8IEludGVyY2VwdG9yPFQ+KVtdO1xuICBnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhPzogKCkgPT4gVDtcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-client/core",
3
- "version": "0.15.0-beta-20251022142546-a457d1596871fb28f1a91f2531cc259db4d55a9c",
3
+ "version": "0.15.1-beta-20251116224907-3174fe59b114d2037762a6458f5576d23e483ba4",
4
4
  "description": "Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.js",
@@ -16,6 +16,9 @@
16
16
  "next": [
17
17
  "lib/next/index.d.ts"
18
18
  ],
19
+ "mock": [
20
+ "lib/mock/index.d.ts"
21
+ ],
19
22
  "*": [
20
23
  "lib/index.d.ts"
21
24
  ]
@@ -27,6 +30,9 @@
27
30
  "next": [
28
31
  "ts3.4/next/index.d.ts"
29
32
  ],
33
+ "mock": [
34
+ "ts3.4/mock/index.d.ts"
35
+ ],
30
36
  "*": [
31
37
  "ts3.4/index.d.ts"
32
38
  ]
@@ -48,6 +54,13 @@
48
54
  "react-native": "./lib/next/index.js",
49
55
  "default": "./lib/next/index.js"
50
56
  },
57
+ "./mock": {
58
+ "types": "./lib/mock/index.d.ts",
59
+ "require": "./lib/mock/index.js",
60
+ "browser": "./lib/mock/index.js",
61
+ "react-native": "./lib/mock/index.js",
62
+ "default": "./lib/mock/index.js"
63
+ },
51
64
  "./package.json": "./package.json"
52
65
  },
53
66
  "type": "module",
@@ -130,9 +143,9 @@
130
143
  },
131
144
  "devDependencies": {
132
145
  "@anansi/browserslist-config": "^1.4.2",
133
- "@data-client/endpoint": "0.15.0-beta-20251022010821-0e5f6bd2963b6deecb68b5febe71cdd3b10c801a",
146
+ "@data-client/endpoint": "0.15.1-beta-20251110013913-ef632c49a03da67187b6097fe8154893cd930d30",
134
147
  "@types/jest": "30.0.0",
135
- "@types/node": "^22.0.0",
148
+ "@types/node": "^24.0.0",
136
149
  "rollup-plugins": "1.0.0"
137
150
  }
138
151
  }
@@ -0,0 +1,146 @@
1
+ import {
2
+ actionTypes,
3
+ Controller,
4
+ DataClientDispatch,
5
+ GenericDispatch,
6
+ } from '../index.js';
7
+ import { collapseFixture } from './collapseFixture.js';
8
+ import { createFixtureMap } from './createFixtureMap.js';
9
+ import type { Fixture, Interceptor } from './fixtureTypes.js';
10
+ import { MockProps } from './mockTypes.js';
11
+
12
+ export function MockController<TBase extends typeof Controller, T>(
13
+ Base: TBase,
14
+ {
15
+ fixtures = [],
16
+ getInitialInterceptorData = () => ({}) as any,
17
+ }: MockProps<T>,
18
+ ): TBase {
19
+ const [fixtureMap, interceptors] = createFixtureMap(fixtures);
20
+
21
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
22
+ // @ts-ignore
23
+ return class MockedController<
24
+ D extends GenericDispatch = DataClientDispatch,
25
+ > extends Base<D> {
26
+ // legacy compatibility (re-declaration)
27
+ // TODO: drop when drop support for destructuring (0.14 and below)
28
+ declare protected _dispatch: D;
29
+
30
+ fixtureMap: Map<string, Fixture> = fixtureMap;
31
+ interceptors: Interceptor<any>[] = interceptors;
32
+ interceptorData: T = getInitialInterceptorData();
33
+
34
+ constructor(...args: any[]) {
35
+ super(...args);
36
+
37
+ // legacy compatibility
38
+ // TODO: drop when drop support for destructuring (0.14 and below)
39
+ if (!this._dispatch) {
40
+ this._dispatch = (args[0] as any).dispatch;
41
+ }
42
+ }
43
+
44
+ // legacy compatibility - we need this to work with 0.14 and below as they do not have this setter
45
+ // TODO: drop when drop support for destructuring (0.14 and below)
46
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
47
+ // @ts-ignore
48
+ set dispatch(dispatch: D) {
49
+ this._dispatch = dispatch;
50
+ }
51
+
52
+ get dispatch(): D {
53
+ return ((action: Parameters<D>[0]): Promise<void> => {
54
+ // support legacy that has _TYPE suffix
55
+ if (action.type === (actionTypes.FETCH ?? actionTypes.FETCH_TYPE)) {
56
+ // eslint-disable-next-line prefer-const
57
+ let { key, args } = action;
58
+ let fixture: Fixture | Interceptor | undefined;
59
+ if (this.fixtureMap.has(key)) {
60
+ fixture = this.fixtureMap.get(key) as Fixture;
61
+ if (!args) args = fixture.args;
62
+ // exact matches take priority; now test ComputedFixture
63
+ } else {
64
+ for (const cfix of this.interceptors) {
65
+ if (cfix.endpoint.testKey(key)) {
66
+ fixture = cfix;
67
+ break;
68
+ }
69
+ }
70
+ }
71
+ // we have a match
72
+ if (fixture !== undefined) {
73
+ const replacedAction: typeof action = {
74
+ ...action,
75
+ };
76
+ const delayMs =
77
+ typeof fixture.delay === 'function' ?
78
+ fixture.delay(...(args as any))
79
+ : (fixture.delay ?? 0);
80
+
81
+ if ('fetchResponse' in fixture) {
82
+ const { fetchResponse } = fixture;
83
+ fixture = {
84
+ endpoint: fixture.endpoint,
85
+ response(...args) {
86
+ const endpoint = (action.endpoint as any).extend({
87
+ fetchResponse: (input: RequestInfo, init: RequestInit) => {
88
+ const ret = fetchResponse.call(this, input, init);
89
+ return Promise.resolve(
90
+ new Response(JSON.stringify(ret), {
91
+ status: 200,
92
+ headers: new Headers({
93
+ 'Content-Type': 'application/json',
94
+ }),
95
+ }),
96
+ );
97
+ },
98
+ });
99
+ return (endpoint as any)(...args);
100
+ },
101
+ };
102
+ }
103
+ const fetch = async () => {
104
+ if (!fixture) {
105
+ throw new Error('No fixture found');
106
+ }
107
+ // delayCollapse determines when the fixture function is 'collapsed' (aka 'run')
108
+ // collapsed: https://en.wikipedia.org/wiki/Copenhagen_interpretation
109
+ if (fixture.delayCollapse) {
110
+ await new Promise(resolve => setTimeout(resolve, delayMs));
111
+ }
112
+ const result = await collapseFixture(
113
+ fixture as any,
114
+ args as any,
115
+ this.interceptorData,
116
+ );
117
+ if (!fixture.delayCollapse && delayMs) {
118
+ await new Promise(resolve => setTimeout(resolve, delayMs));
119
+ }
120
+ if (result.error) {
121
+ throw result.response;
122
+ }
123
+ return result.response;
124
+ };
125
+ if (typeof (replacedAction.endpoint as any).extend === 'function') {
126
+ replacedAction.endpoint = (replacedAction.endpoint as any).extend(
127
+ {
128
+ fetch,
129
+ },
130
+ );
131
+ } else {
132
+ // TODO: full testing of this
133
+ replacedAction.endpoint = fetch as any;
134
+ (replacedAction.endpoint as any).__proto__ = action.endpoint;
135
+ }
136
+
137
+ // TODO: make super.dispatch (once we drop support for destructuring)
138
+ return this._dispatch(replacedAction);
139
+ }
140
+ }
141
+ // TODO: make super.dispatch (once we drop support for destructuring)
142
+ return this._dispatch(action);
143
+ }) as any;
144
+ }
145
+ };
146
+ }
@@ -0,0 +1,21 @@
1
+ import type { Fixture, ResponseInterceptor } from './fixtureTypes.js';
2
+
3
+ export async function collapseFixture(
4
+ fixture: Fixture | ResponseInterceptor,
5
+ args: any[],
6
+ interceptorData: any,
7
+ ) {
8
+ let error = 'error' in fixture ? fixture.error : false;
9
+ let response = fixture.response;
10
+ if (typeof fixture.response === 'function') {
11
+ try {
12
+ response = await fixture.response.apply(interceptorData, args);
13
+ // dispatch goes through user-code that can sometimes fail.
14
+ // let's ensure we always handle errors
15
+ } catch (e: any) {
16
+ response = e;
17
+ error = true;
18
+ }
19
+ }
20
+ return { response, error };
21
+ }
@@ -0,0 +1,26 @@
1
+ import type { Fixture, Interceptor } from './fixtureTypes.js';
2
+
3
+ export function createFixtureMap(fixtures: (Fixture | Interceptor)[] = []) {
4
+ const map: Map<string, Fixture> = new Map();
5
+ const computed: Interceptor[] = [];
6
+ for (const fixture of fixtures) {
7
+ if ('args' in fixture) {
8
+ if (typeof fixture.response !== 'function') {
9
+ const key = fixture.endpoint.key(...fixture.args);
10
+ map.set(key, fixture);
11
+ } else {
12
+ // this has to be a typo. probably needs to remove args
13
+ console.warn(
14
+ `Fixture found with function response, and explicit args. Interceptors should not specify args.
15
+ ${fixture.endpoint.name}: ${JSON.stringify(fixture.args)}
16
+
17
+ Treating as Interceptor`,
18
+ );
19
+ computed.push(fixture as any);
20
+ }
21
+ } else {
22
+ computed.push(fixture);
23
+ }
24
+ }
25
+ return [map, computed] as const;
26
+ }
@@ -0,0 +1,121 @@
1
+ import type { EndpointInterface, ResolveType } from '@data-client/endpoint';
2
+
3
+ type Updater = (
4
+ result: any,
5
+ ...args: any
6
+ ) => Record<string, (...args: any) => any>;
7
+
8
+ export interface SuccessFixtureEndpoint<
9
+ E extends EndpointInterface & { update?: Updater } = EndpointInterface,
10
+ > {
11
+ readonly endpoint: E;
12
+ readonly args: Parameters<E>;
13
+ readonly response:
14
+ | ResolveType<E>
15
+ | ((...args: Parameters<E>) => ResolveType<E>);
16
+ readonly error?: false;
17
+ /** Number of miliseconds to wait before resolving */
18
+ readonly delay?: number;
19
+ /** Waits to run `response()` after `delay` time */
20
+ readonly delayCollapse?: boolean;
21
+ }
22
+
23
+ export interface ResponseInterceptor<
24
+ T = any,
25
+ E extends EndpointInterface & {
26
+ update?: Updater;
27
+ testKey(key: string): boolean;
28
+ } = EndpointInterface & { testKey(key: string): boolean },
29
+ > {
30
+ readonly endpoint: E;
31
+ response(this: T, ...args: Parameters<E>): ResolveType<E>;
32
+ /** Number of miliseconds (or function that returns) to wait before resolving */
33
+ readonly delay?: number | ((...args: Parameters<E>) => number);
34
+ /** Waits to run `response()` after `delay` time */
35
+ readonly delayCollapse?: boolean;
36
+ }
37
+ export interface FetchInterceptor<
38
+ T = any,
39
+ E extends EndpointInterface & {
40
+ update?: Updater;
41
+ testKey(key: string): boolean;
42
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
43
+ extend(options: any): any;
44
+ } = EndpointInterface & {
45
+ testKey(key: string): boolean;
46
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
47
+ extend(options: any): any;
48
+ },
49
+ > {
50
+ readonly endpoint: E;
51
+ fetchResponse(this: T, input: RequestInfo, init: RequestInit): ResolveType<E>;
52
+ /** Number of miliseconds (or function that returns) to wait before resolving */
53
+ readonly delay?: number | ((...args: Parameters<E>) => number);
54
+ /** Waits to run `response()` after `delay` time */
55
+ readonly delayCollapse?: boolean;
56
+ }
57
+ /** Interceptors match and compute dynamic responses based on args
58
+ *
59
+ * @see https://dataclient.io/docs/api/Fixtures#interceptor
60
+ */
61
+ export type Interceptor<
62
+ T = any,
63
+ E extends EndpointInterface & {
64
+ update?: Updater;
65
+ testKey(key: string): boolean;
66
+ fetchResponse?(input: RequestInfo, init: RequestInit): Promise<Response>;
67
+ extend?(options: any): any;
68
+ } = EndpointInterface & {
69
+ testKey(key: string): boolean;
70
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
71
+ extend(options: any): any;
72
+ },
73
+ > =
74
+ | ResponseInterceptor<T, E>
75
+ | (E extends (
76
+ {
77
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
78
+ extend(options: any): any;
79
+ }
80
+ ) ?
81
+ FetchInterceptor<T, E>
82
+ : never);
83
+
84
+ export interface ErrorFixtureEndpoint<
85
+ E extends EndpointInterface & { update?: Updater } = EndpointInterface,
86
+ > {
87
+ readonly endpoint: E;
88
+ readonly args: Parameters<E>;
89
+ readonly response: any;
90
+ readonly error: true;
91
+ /** Number of miliseconds to wait before resolving */
92
+ readonly delay?: number;
93
+ /** Waits to run `response()` after `delay` time */
94
+ readonly delayCollapse?: boolean;
95
+ }
96
+
97
+ export type FixtureEndpoint<
98
+ E extends EndpointInterface & { update?: Updater } = EndpointInterface,
99
+ > = SuccessFixtureEndpoint<E> | ErrorFixtureEndpoint<E>;
100
+
101
+ /** Represents a successful response
102
+ *
103
+ * @see https://dataclient.io/docs/api/Fixtures#successfixture
104
+ */
105
+ export type SuccessFixture<
106
+ E extends EndpointInterface & { update?: Updater } = EndpointInterface,
107
+ > = SuccessFixtureEndpoint<E>;
108
+ /** Represents a failed/errored response
109
+ *
110
+ * @see https://dataclient.io/docs/api/Fixtures#errorfixtures
111
+ */
112
+ export type ErrorFixture<
113
+ E extends EndpointInterface & { update?: Updater } = EndpointInterface,
114
+ > = ErrorFixtureEndpoint<E>;
115
+ /** Represents a static response
116
+ *
117
+ * @see https://dataclient.io/docs/api/Fixtures
118
+ */
119
+ export type Fixture<
120
+ E extends EndpointInterface & { update?: Updater } = EndpointInterface,
121
+ > = FixtureEndpoint<E>;
@@ -0,0 +1,15 @@
1
+ export { MockController } from './MockController.js';
2
+ export type { MockProps } from './mockTypes.js';
3
+ export type {
4
+ Fixture,
5
+ SuccessFixture,
6
+ ErrorFixture,
7
+ Interceptor,
8
+ ResponseInterceptor,
9
+ FetchInterceptor,
10
+ FixtureEndpoint,
11
+ SuccessFixtureEndpoint,
12
+ ErrorFixtureEndpoint,
13
+ } from './fixtureTypes.js';
14
+ export { collapseFixture } from './collapseFixture.js';
15
+ export { createFixtureMap } from './createFixtureMap.js';
@@ -0,0 +1,6 @@
1
+ import type { Fixture, Interceptor } from './fixtureTypes.js';
2
+
3
+ export interface MockProps<T = any> {
4
+ readonly fixtures?: (Fixture | Interceptor<T>)[];
5
+ getInitialInterceptorData?: () => T;
6
+ }
@@ -0,0 +1,4 @@
1
+ import { Controller } from '../index.js';
2
+ import { MockProps } from './mockTypes.js';
3
+ export declare function MockController<TBase extends typeof Controller, T>(Base: TBase, { fixtures, getInitialInterceptorData, }: MockProps<T>): TBase;
4
+ //# sourceMappingURL=MockController.d.ts.map
@@ -0,0 +1,6 @@
1
+ import { Fixture, ResponseInterceptor } from './fixtureTypes.js';
2
+ export declare function collapseFixture(fixture: Fixture | ResponseInterceptor, args: any[], interceptorData: any): Promise<{
3
+ response: any;
4
+ error: boolean | undefined;
5
+ }>;
6
+ //# sourceMappingURL=collapseFixture.d.ts.map
@@ -0,0 +1,6 @@
1
+ import { Fixture, Interceptor } from './fixtureTypes.js';
2
+ export declare function createFixtureMap(fixtures?: (Fixture | Interceptor)[]): readonly [
3
+ Map<string, Fixture>,
4
+ Interceptor[]
5
+ ];
6
+ //# sourceMappingURL=createFixtureMap.d.ts.map
@@ -0,0 +1,99 @@
1
+ import { EndpointInterface, ResolveType } from '@data-client/endpoint';
2
+ type Updater = (result: any, ...args: any) => Record<string, (...args: any) => any>;
3
+ export interface SuccessFixtureEndpoint<E extends EndpointInterface & {
4
+ update?: Updater;
5
+ } = EndpointInterface> {
6
+ readonly endpoint: E;
7
+ readonly args: Parameters<E>;
8
+ readonly response: ResolveType<E> | ((...args: Parameters<E>) => ResolveType<E>);
9
+ readonly error?: false;
10
+ /** Number of miliseconds to wait before resolving */
11
+ readonly delay?: number;
12
+ /** Waits to run `response()` after `delay` time */
13
+ readonly delayCollapse?: boolean;
14
+ }
15
+ export interface ResponseInterceptor<T = any, E extends EndpointInterface & {
16
+ update?: Updater;
17
+ testKey(key: string): boolean;
18
+ } = EndpointInterface & {
19
+ testKey(key: string): boolean;
20
+ }> {
21
+ readonly endpoint: E;
22
+ response(this: T, ...args: Parameters<E>): ResolveType<E>;
23
+ /** Number of miliseconds (or function that returns) to wait before resolving */
24
+ readonly delay?: number | ((...args: Parameters<E>) => number);
25
+ /** Waits to run `response()` after `delay` time */
26
+ readonly delayCollapse?: boolean;
27
+ }
28
+ export interface FetchInterceptor<T = any, E extends EndpointInterface & {
29
+ update?: Updater;
30
+ testKey(key: string): boolean;
31
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
32
+ extend(options: any): any;
33
+ } = EndpointInterface & {
34
+ testKey(key: string): boolean;
35
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
36
+ extend(options: any): any;
37
+ }> {
38
+ readonly endpoint: E;
39
+ fetchResponse(this: T, input: RequestInfo, init: RequestInit): ResolveType<E>;
40
+ /** Number of miliseconds (or function that returns) to wait before resolving */
41
+ readonly delay?: number | ((...args: Parameters<E>) => number);
42
+ /** Waits to run `response()` after `delay` time */
43
+ readonly delayCollapse?: boolean;
44
+ }
45
+ /** Interceptors match and compute dynamic responses based on args
46
+ *
47
+ * @see https://dataclient.io/docs/api/Fixtures#interceptor
48
+ */
49
+ export type Interceptor<T = any, E extends EndpointInterface & {
50
+ update?: Updater;
51
+ testKey(key: string): boolean;
52
+ fetchResponse?(input: RequestInfo, init: RequestInit): Promise<Response>;
53
+ extend?(options: any): any;
54
+ } = EndpointInterface & {
55
+ testKey(key: string): boolean;
56
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
57
+ extend(options: any): any;
58
+ }> = ResponseInterceptor<T, E> | (E extends ({
59
+ fetchResponse(input: RequestInfo, init: RequestInit): Promise<Response>;
60
+ extend(options: any): any;
61
+ }) ? FetchInterceptor<T, E> : never);
62
+ export interface ErrorFixtureEndpoint<E extends EndpointInterface & {
63
+ update?: Updater;
64
+ } = EndpointInterface> {
65
+ readonly endpoint: E;
66
+ readonly args: Parameters<E>;
67
+ readonly response: any;
68
+ readonly error: true;
69
+ /** Number of miliseconds to wait before resolving */
70
+ readonly delay?: number;
71
+ /** Waits to run `response()` after `delay` time */
72
+ readonly delayCollapse?: boolean;
73
+ }
74
+ export type FixtureEndpoint<E extends EndpointInterface & {
75
+ update?: Updater;
76
+ } = EndpointInterface> = SuccessFixtureEndpoint<E> | ErrorFixtureEndpoint<E>;
77
+ /** Represents a successful response
78
+ *
79
+ * @see https://dataclient.io/docs/api/Fixtures#successfixture
80
+ */
81
+ export type SuccessFixture<E extends EndpointInterface & {
82
+ update?: Updater;
83
+ } = EndpointInterface> = SuccessFixtureEndpoint<E>;
84
+ /** Represents a failed/errored response
85
+ *
86
+ * @see https://dataclient.io/docs/api/Fixtures#errorfixtures
87
+ */
88
+ export type ErrorFixture<E extends EndpointInterface & {
89
+ update?: Updater;
90
+ } = EndpointInterface> = ErrorFixtureEndpoint<E>;
91
+ /** Represents a static response
92
+ *
93
+ * @see https://dataclient.io/docs/api/Fixtures
94
+ */
95
+ export type Fixture<E extends EndpointInterface & {
96
+ update?: Updater;
97
+ } = EndpointInterface> = FixtureEndpoint<E>;
98
+ export {};
99
+ //# sourceMappingURL=fixtureTypes.d.ts.map
@@ -0,0 +1,6 @@
1
+ export { MockController } from './MockController.js';
2
+ export { MockProps } from './mockTypes.js';
3
+ export { Fixture, SuccessFixture, ErrorFixture, Interceptor, ResponseInterceptor, FetchInterceptor, FixtureEndpoint, SuccessFixtureEndpoint, ErrorFixtureEndpoint, } from './fixtureTypes.js';
4
+ export { collapseFixture } from './collapseFixture.js';
5
+ export { createFixtureMap } from './createFixtureMap.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,6 @@
1
+ import { Fixture, Interceptor } from './fixtureTypes.js';
2
+ export interface MockProps<T = any> {
3
+ readonly fixtures?: (Fixture | Interceptor<T>)[];
4
+ getInitialInterceptorData?: () => T;
5
+ }
6
+ //# sourceMappingURL=mockTypes.d.ts.map