@zze/mock-server 0.2.4
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.
- package/README.md +643 -0
- package/dist/__tests__/mock-server.test.d.ts +5 -0
- package/dist/__tests__/mock-server.test.d.ts.map +1 -0
- package/dist/__tests__/mock-server.test.js +599 -0
- package/dist/__tests__/mock-server.test.js.map +1 -0
- package/dist/admin/__tests__/admin-router.test.d.ts +2 -0
- package/dist/admin/__tests__/admin-router.test.d.ts.map +1 -0
- package/dist/admin/__tests__/admin-router.test.js +621 -0
- package/dist/admin/__tests__/admin-router.test.js.map +1 -0
- package/dist/admin/admin-router.d.ts +27 -0
- package/dist/admin/admin-router.d.ts.map +1 -0
- package/dist/admin/admin-router.js +616 -0
- package/dist/admin/admin-router.js.map +1 -0
- package/dist/admin/index.d.ts +4 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +10 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/types.d.ts +185 -0
- package/dist/admin/types.d.ts.map +1 -0
- package/dist/admin/types.js +33 -0
- package/dist/admin/types.js.map +1 -0
- package/dist/config/__tests__/config-discovery.test.d.ts +2 -0
- package/dist/config/__tests__/config-discovery.test.d.ts.map +1 -0
- package/dist/config/__tests__/config-discovery.test.js +52 -0
- package/dist/config/__tests__/config-discovery.test.js.map +1 -0
- package/dist/config/__tests__/config-loader.test.d.ts +2 -0
- package/dist/config/__tests__/config-loader.test.d.ts.map +1 -0
- package/dist/config/__tests__/config-loader.test.js +124 -0
- package/dist/config/__tests__/config-loader.test.js.map +1 -0
- package/dist/config/__tests__/file-loader.test.d.ts +2 -0
- package/dist/config/__tests__/file-loader.test.d.ts.map +1 -0
- package/dist/config/__tests__/file-loader.test.js +63 -0
- package/dist/config/__tests__/file-loader.test.js.map +1 -0
- package/dist/config/__tests__/fixtures/mock-config/endpoints/products.d.ts +25 -0
- package/dist/config/__tests__/fixtures/mock-config/endpoints/products.d.ts.map +1 -0
- package/dist/config/__tests__/fixtures/mock-config/endpoints/products.js +25 -0
- package/dist/config/__tests__/fixtures/mock-config/endpoints/products.js.map +1 -0
- package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.d.ts +11 -0
- package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.d.ts.map +1 -0
- package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.js +11 -0
- package/dist/config/__tests__/fixtures/mock-config/flows/error-flow.js.map +1 -0
- package/dist/config/config-discovery.d.ts +23 -0
- package/dist/config/config-discovery.d.ts.map +1 -0
- package/dist/config/config-discovery.js +60 -0
- package/dist/config/config-discovery.js.map +1 -0
- package/dist/config/config-loader.d.ts +56 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +162 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-writer.d.ts +96 -0
- package/dist/config/config-writer.d.ts.map +1 -0
- package/dist/config/config-writer.js +248 -0
- package/dist/config/config-writer.js.map +1 -0
- package/dist/config/file-loader.d.ts +16 -0
- package/dist/config/file-loader.d.ts.map +1 -0
- package/dist/config/file-loader.js +90 -0
- package/dist/config/file-loader.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +23 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +47 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +7 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/mock-server.d.ts +243 -0
- package/dist/mock-server.d.ts.map +1 -0
- package/dist/mock-server.js +387 -0
- package/dist/mock-server.js.map +1 -0
- package/dist/resolver/__tests__/response-resolver.test.d.ts +2 -0
- package/dist/resolver/__tests__/response-resolver.test.d.ts.map +1 -0
- package/dist/resolver/__tests__/response-resolver.test.js +358 -0
- package/dist/resolver/__tests__/response-resolver.test.js.map +1 -0
- package/dist/resolver/index.d.ts +4 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +9 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/response-resolver.d.ts +73 -0
- package/dist/resolver/response-resolver.d.ts.map +1 -0
- package/dist/resolver/response-resolver.js +167 -0
- package/dist/resolver/response-resolver.js.map +1 -0
- package/dist/resolver/types.d.ts +47 -0
- package/dist/resolver/types.d.ts.map +1 -0
- package/dist/resolver/types.js +9 -0
- package/dist/resolver/types.js.map +1 -0
- package/dist/schemas/__tests__/config.validator.test.d.ts +2 -0
- package/dist/schemas/__tests__/config.validator.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/config.validator.test.js +66 -0
- package/dist/schemas/__tests__/config.validator.test.js.map +1 -0
- package/dist/schemas/__tests__/endpoint.schema.test.d.ts +2 -0
- package/dist/schemas/__tests__/endpoint.schema.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/endpoint.schema.test.js +103 -0
- package/dist/schemas/__tests__/endpoint.schema.test.js.map +1 -0
- package/dist/schemas/__tests__/flow.schema.test.d.ts +2 -0
- package/dist/schemas/__tests__/flow.schema.test.d.ts.map +1 -0
- package/dist/schemas/__tests__/flow.schema.test.js +92 -0
- package/dist/schemas/__tests__/flow.schema.test.js.map +1 -0
- package/dist/schemas/config.validator.d.ts +39 -0
- package/dist/schemas/config.validator.d.ts.map +1 -0
- package/dist/schemas/config.validator.js +117 -0
- package/dist/schemas/config.validator.js.map +1 -0
- package/dist/schemas/endpoint.schema.d.ts +108 -0
- package/dist/schemas/endpoint.schema.d.ts.map +1 -0
- package/dist/schemas/endpoint.schema.js +87 -0
- package/dist/schemas/endpoint.schema.js.map +1 -0
- package/dist/schemas/flow.schema.d.ts +46 -0
- package/dist/schemas/flow.schema.d.ts.map +1 -0
- package/dist/schemas/flow.schema.js +73 -0
- package/dist/schemas/flow.schema.js.map +1 -0
- package/dist/schemas/http.schema.d.ts +15 -0
- package/dist/schemas/http.schema.d.ts.map +1 -0
- package/dist/schemas/http.schema.js +32 -0
- package/dist/schemas/http.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +6 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +33 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/scenario.schema.d.ts +54 -0
- package/dist/schemas/scenario.schema.d.ts.map +1 -0
- package/dist/schemas/scenario.schema.js +75 -0
- package/dist/schemas/scenario.schema.js.map +1 -0
- package/dist/server/__tests__/mock-server-app.test.d.ts +2 -0
- package/dist/server/__tests__/mock-server-app.test.d.ts.map +1 -0
- package/dist/server/__tests__/mock-server-app.test.js +296 -0
- package/dist/server/__tests__/mock-server-app.test.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +10 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mock-server-app.d.ts +119 -0
- package/dist/server/mock-server-app.d.ts.map +1 -0
- package/dist/server/mock-server-app.js +304 -0
- package/dist/server/mock-server-app.js.map +1 -0
- package/dist/server/types.d.ts +38 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +11 -0
- package/dist/server/types.js.map +1 -0
- package/dist/state/__tests__/state-manager.test.d.ts +2 -0
- package/dist/state/__tests__/state-manager.test.d.ts.map +1 -0
- package/dist/state/__tests__/state-manager.test.js +275 -0
- package/dist/state/__tests__/state-manager.test.js.map +1 -0
- package/dist/state/index.d.ts +3 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +7 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/state-manager.d.ts +92 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +198 -0
- package/dist/state/state-manager.js.map +1 -0
- package/dist/state/types.d.ts +30 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/state/types.js +2 -0
- package/dist/state/types.js.map +1 -0
- package/dist/ui/assets/index-SADMOgPE.js +10 -0
- package/dist/ui/assets/index-rj7m-XdG.css +1 -0
- package/dist/ui/index.html +29 -0
- package/dist/watcher/__tests__/config-watcher.test.d.ts +2 -0
- package/dist/watcher/__tests__/config-watcher.test.d.ts.map +1 -0
- package/dist/watcher/__tests__/config-watcher.test.js +372 -0
- package/dist/watcher/__tests__/config-watcher.test.js.map +1 -0
- package/dist/watcher/config-watcher.d.ts +100 -0
- package/dist/watcher/config-watcher.d.ts.map +1 -0
- package/dist/watcher/config-watcher.js +358 -0
- package/dist/watcher/config-watcher.js.map +1 -0
- package/dist/watcher/index.d.ts +7 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +8 -0
- package/dist/watcher/index.js.map +1 -0
- package/dist/watcher/types.d.ts +64 -0
- package/dist/watcher/types.d.ts.map +1 -0
- package/dist/watcher/types.js +15 -0
- package/dist/watcher/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const response_resolver_js_1 = require("../response-resolver.js");
|
|
5
|
+
const index_js_1 = require("../../state/index.js");
|
|
6
|
+
// Mock Express request
|
|
7
|
+
function createMockRequest(overrides = {}) {
|
|
8
|
+
return {
|
|
9
|
+
params: {},
|
|
10
|
+
query: {},
|
|
11
|
+
body: {},
|
|
12
|
+
headers: {},
|
|
13
|
+
method: 'GET',
|
|
14
|
+
path: '/test',
|
|
15
|
+
...overrides,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// Mock Express response
|
|
19
|
+
function createMockResponse() {
|
|
20
|
+
const res = {
|
|
21
|
+
_status: 200,
|
|
22
|
+
_headers: {},
|
|
23
|
+
_body: undefined,
|
|
24
|
+
_ended: false,
|
|
25
|
+
status(code) {
|
|
26
|
+
this._status = code;
|
|
27
|
+
return this;
|
|
28
|
+
},
|
|
29
|
+
setHeader(key, value) {
|
|
30
|
+
this._headers[key] = value;
|
|
31
|
+
return this;
|
|
32
|
+
},
|
|
33
|
+
json(body) {
|
|
34
|
+
this._body = body;
|
|
35
|
+
return this;
|
|
36
|
+
},
|
|
37
|
+
send(body) {
|
|
38
|
+
this._body = body;
|
|
39
|
+
return this;
|
|
40
|
+
},
|
|
41
|
+
end() {
|
|
42
|
+
this._ended = true;
|
|
43
|
+
return this;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
return res;
|
|
47
|
+
}
|
|
48
|
+
// Test fixtures
|
|
49
|
+
const mockEndpoints = [
|
|
50
|
+
{
|
|
51
|
+
id: 'get-users',
|
|
52
|
+
path: '/users',
|
|
53
|
+
method: 'GET',
|
|
54
|
+
scenarios: [
|
|
55
|
+
{
|
|
56
|
+
id: 'success',
|
|
57
|
+
name: 'Success',
|
|
58
|
+
status: 200,
|
|
59
|
+
body: [{ id: 1, name: 'Alice' }],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'error',
|
|
63
|
+
name: 'Error',
|
|
64
|
+
status: 500,
|
|
65
|
+
body: { error: 'Server error' },
|
|
66
|
+
headers: { 'X-Error': 'true' },
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: 'delayed',
|
|
70
|
+
name: 'Delayed',
|
|
71
|
+
status: 200,
|
|
72
|
+
body: { delayed: true },
|
|
73
|
+
delay: 100,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
defaultScenarioId: 'success',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: 'get-user',
|
|
80
|
+
path: '/users/:id',
|
|
81
|
+
method: 'GET',
|
|
82
|
+
scenarios: [
|
|
83
|
+
{
|
|
84
|
+
id: 'found',
|
|
85
|
+
name: 'User Found',
|
|
86
|
+
status: 200,
|
|
87
|
+
body: (ctx) => ({ id: ctx.params.id, name: 'Dynamic User' }),
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: 'not-found',
|
|
91
|
+
name: 'Not Found',
|
|
92
|
+
status: 404,
|
|
93
|
+
body: null,
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
defaultScenarioId: 'found',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: 'create-user',
|
|
100
|
+
path: '/users',
|
|
101
|
+
method: 'POST',
|
|
102
|
+
scenarios: [
|
|
103
|
+
{
|
|
104
|
+
id: 'created',
|
|
105
|
+
name: 'Created',
|
|
106
|
+
status: 201,
|
|
107
|
+
body: (ctx) => ({ ...ctx.body, id: 123 }),
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
defaultScenarioId: 'created',
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
(0, vitest_1.describe)('ResponseResolver', () => {
|
|
114
|
+
let stateManager;
|
|
115
|
+
let resolver;
|
|
116
|
+
(0, vitest_1.beforeEach)(() => {
|
|
117
|
+
stateManager = new index_js_1.StateManager();
|
|
118
|
+
stateManager.setEndpoints(mockEndpoints);
|
|
119
|
+
stateManager.setFlows([]);
|
|
120
|
+
resolver = new response_resolver_js_1.ResponseResolver(stateManager);
|
|
121
|
+
resolver.setEndpoints(mockEndpoints);
|
|
122
|
+
});
|
|
123
|
+
(0, vitest_1.describe)('setEndpoints', () => {
|
|
124
|
+
(0, vitest_1.it)('should register endpoints', () => {
|
|
125
|
+
const endpoints = resolver.getEndpoints();
|
|
126
|
+
(0, vitest_1.expect)(endpoints).toHaveLength(3);
|
|
127
|
+
});
|
|
128
|
+
(0, vitest_1.it)('should clear previous endpoints on re-registration', () => {
|
|
129
|
+
resolver.setEndpoints([mockEndpoints[0]]);
|
|
130
|
+
(0, vitest_1.expect)(resolver.getEndpoints()).toHaveLength(1);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
(0, vitest_1.describe)('findEndpoint', () => {
|
|
134
|
+
(0, vitest_1.it)('should find endpoint by method and path', () => {
|
|
135
|
+
const endpoint = resolver.findEndpoint('GET', '/users');
|
|
136
|
+
(0, vitest_1.expect)(endpoint?.id).toBe('get-users');
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)('should return null for unknown route', () => {
|
|
139
|
+
const endpoint = resolver.findEndpoint('GET', '/unknown');
|
|
140
|
+
(0, vitest_1.expect)(endpoint).toBeNull();
|
|
141
|
+
});
|
|
142
|
+
(0, vitest_1.it)('should match case-insensitively for method', () => {
|
|
143
|
+
const endpoint = resolver.findEndpoint('get', '/users');
|
|
144
|
+
(0, vitest_1.expect)(endpoint?.id).toBe('get-users');
|
|
145
|
+
});
|
|
146
|
+
(0, vitest_1.it)('should distinguish same path with different methods', () => {
|
|
147
|
+
const getEndpoint = resolver.findEndpoint('GET', '/users');
|
|
148
|
+
const postEndpoint = resolver.findEndpoint('POST', '/users');
|
|
149
|
+
(0, vitest_1.expect)(getEndpoint?.id).toBe('get-users');
|
|
150
|
+
(0, vitest_1.expect)(postEndpoint?.id).toBe('create-user');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
(0, vitest_1.describe)('getEndpointById', () => {
|
|
154
|
+
(0, vitest_1.it)('should return endpoint by ID', () => {
|
|
155
|
+
const endpoint = resolver.getEndpointById('get-users');
|
|
156
|
+
(0, vitest_1.expect)(endpoint?.path).toBe('/users');
|
|
157
|
+
});
|
|
158
|
+
(0, vitest_1.it)('should return null for unknown ID', () => {
|
|
159
|
+
const endpoint = resolver.getEndpointById('unknown');
|
|
160
|
+
(0, vitest_1.expect)(endpoint).toBeNull();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
(0, vitest_1.describe)('resolveResponse', () => {
|
|
164
|
+
(0, vitest_1.it)('should resolve default scenario', () => {
|
|
165
|
+
const req = createMockRequest();
|
|
166
|
+
const resolved = resolver.resolveResponse('get-users', req);
|
|
167
|
+
(0, vitest_1.expect)(resolved).not.toBeNull();
|
|
168
|
+
(0, vitest_1.expect)(resolved?.status).toBe(200);
|
|
169
|
+
(0, vitest_1.expect)(resolved?.scenario.id).toBe('success');
|
|
170
|
+
});
|
|
171
|
+
(0, vitest_1.it)('should resolve explicitly activated scenario', () => {
|
|
172
|
+
stateManager.activateScenario('get-users', 'error');
|
|
173
|
+
const req = createMockRequest();
|
|
174
|
+
const resolved = resolver.resolveResponse('get-users', req);
|
|
175
|
+
(0, vitest_1.expect)(resolved?.status).toBe(500);
|
|
176
|
+
(0, vitest_1.expect)(resolved?.scenario.id).toBe('error');
|
|
177
|
+
});
|
|
178
|
+
(0, vitest_1.it)('should include headers from scenario', () => {
|
|
179
|
+
stateManager.activateScenario('get-users', 'error');
|
|
180
|
+
const req = createMockRequest();
|
|
181
|
+
const resolved = resolver.resolveResponse('get-users', req);
|
|
182
|
+
(0, vitest_1.expect)(resolved?.headers).toEqual({ 'X-Error': 'true' });
|
|
183
|
+
});
|
|
184
|
+
(0, vitest_1.it)('should include delay from scenario', () => {
|
|
185
|
+
stateManager.activateScenario('get-users', 'delayed');
|
|
186
|
+
const req = createMockRequest();
|
|
187
|
+
const resolved = resolver.resolveResponse('get-users', req);
|
|
188
|
+
(0, vitest_1.expect)(resolved?.delay).toBe(100);
|
|
189
|
+
});
|
|
190
|
+
(0, vitest_1.it)('should return null for unknown endpoint', () => {
|
|
191
|
+
const req = createMockRequest();
|
|
192
|
+
const resolved = resolver.resolveResponse('unknown', req);
|
|
193
|
+
(0, vitest_1.expect)(resolved).toBeNull();
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
(0, vitest_1.describe)('resolveResponseByRoute', () => {
|
|
197
|
+
(0, vitest_1.it)('should resolve by method and path', () => {
|
|
198
|
+
const req = createMockRequest();
|
|
199
|
+
const resolved = resolver.resolveResponseByRoute('GET', '/users', req);
|
|
200
|
+
(0, vitest_1.expect)(resolved?.endpoint.id).toBe('get-users');
|
|
201
|
+
});
|
|
202
|
+
(0, vitest_1.it)('should return null for unmatched route', () => {
|
|
203
|
+
const req = createMockRequest();
|
|
204
|
+
const resolved = resolver.resolveResponseByRoute('GET', '/unknown', req);
|
|
205
|
+
(0, vitest_1.expect)(resolved).toBeNull();
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
(0, vitest_1.describe)('createRequestContext', () => {
|
|
209
|
+
(0, vitest_1.it)('should create context from request', () => {
|
|
210
|
+
const req = createMockRequest({
|
|
211
|
+
params: { id: '123' },
|
|
212
|
+
query: { filter: 'active' },
|
|
213
|
+
body: { name: 'Test' },
|
|
214
|
+
headers: { 'content-type': 'application/json' },
|
|
215
|
+
method: 'POST',
|
|
216
|
+
path: '/users',
|
|
217
|
+
});
|
|
218
|
+
const context = resolver.createRequestContext(req);
|
|
219
|
+
(0, vitest_1.expect)(context.params).toEqual({ id: '123' });
|
|
220
|
+
(0, vitest_1.expect)(context.query).toEqual({ filter: 'active' });
|
|
221
|
+
(0, vitest_1.expect)(context.body).toEqual({ name: 'Test' });
|
|
222
|
+
(0, vitest_1.expect)(context.method).toBe('POST');
|
|
223
|
+
(0, vitest_1.expect)(context.path).toBe('/users');
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
(0, vitest_1.describe)('evaluateBody', () => {
|
|
227
|
+
(0, vitest_1.it)('should return static body as-is', async () => {
|
|
228
|
+
const body = { static: true };
|
|
229
|
+
const context = resolver.createRequestContext(createMockRequest());
|
|
230
|
+
const result = await resolver.evaluateBody(body, context);
|
|
231
|
+
(0, vitest_1.expect)(result).toEqual({ static: true });
|
|
232
|
+
});
|
|
233
|
+
(0, vitest_1.it)('should execute function body with context', async () => {
|
|
234
|
+
const body = (ctx) => ({ userId: ctx.params.id });
|
|
235
|
+
const req = createMockRequest({ params: { id: '456' } });
|
|
236
|
+
const context = resolver.createRequestContext(req);
|
|
237
|
+
const result = await resolver.evaluateBody(body, context);
|
|
238
|
+
(0, vitest_1.expect)(result).toEqual({ userId: '456' });
|
|
239
|
+
});
|
|
240
|
+
(0, vitest_1.it)('should handle async function body', async () => {
|
|
241
|
+
const body = async (ctx) => {
|
|
242
|
+
return { async: true, path: ctx.path };
|
|
243
|
+
};
|
|
244
|
+
const req = createMockRequest({ path: '/test' });
|
|
245
|
+
const context = resolver.createRequestContext(req);
|
|
246
|
+
const result = await resolver.evaluateBody(body, context);
|
|
247
|
+
(0, vitest_1.expect)(result).toEqual({ async: true, path: '/test' });
|
|
248
|
+
});
|
|
249
|
+
(0, vitest_1.it)('should handle null body', async () => {
|
|
250
|
+
const context = resolver.createRequestContext(createMockRequest());
|
|
251
|
+
const result = await resolver.evaluateBody(null, context);
|
|
252
|
+
(0, vitest_1.expect)(result).toBeNull();
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
(0, vitest_1.describe)('applyDelay', () => {
|
|
256
|
+
(0, vitest_1.it)('should delay for specified milliseconds', async () => {
|
|
257
|
+
const start = Date.now();
|
|
258
|
+
await resolver.applyDelay(50);
|
|
259
|
+
const elapsed = Date.now() - start;
|
|
260
|
+
(0, vitest_1.expect)(elapsed).toBeGreaterThanOrEqual(45); // Allow small margin
|
|
261
|
+
});
|
|
262
|
+
(0, vitest_1.it)('should not delay for zero', async () => {
|
|
263
|
+
const start = Date.now();
|
|
264
|
+
await resolver.applyDelay(0);
|
|
265
|
+
const elapsed = Date.now() - start;
|
|
266
|
+
(0, vitest_1.expect)(elapsed).toBeLessThan(10);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
(0, vitest_1.describe)('sendResponse', () => {
|
|
270
|
+
(0, vitest_1.it)('should set status code', async () => {
|
|
271
|
+
const req = createMockRequest();
|
|
272
|
+
const res = createMockResponse();
|
|
273
|
+
const resolved = resolver.resolveResponse('get-users', req);
|
|
274
|
+
await resolver.sendResponse(resolved, req, res);
|
|
275
|
+
(0, vitest_1.expect)(res._status).toBe(200);
|
|
276
|
+
});
|
|
277
|
+
(0, vitest_1.it)('should set headers', async () => {
|
|
278
|
+
stateManager.activateScenario('get-users', 'error');
|
|
279
|
+
const req = createMockRequest();
|
|
280
|
+
const res = createMockResponse();
|
|
281
|
+
const resolved = resolver.resolveResponse('get-users', req);
|
|
282
|
+
await resolver.sendResponse(resolved, req, res);
|
|
283
|
+
(0, vitest_1.expect)(res._headers['X-Error']).toBe('true');
|
|
284
|
+
});
|
|
285
|
+
(0, vitest_1.it)('should send JSON body for objects', async () => {
|
|
286
|
+
const req = createMockRequest();
|
|
287
|
+
const res = createMockResponse();
|
|
288
|
+
const resolved = resolver.resolveResponse('get-users', req);
|
|
289
|
+
await resolver.sendResponse(resolved, req, res);
|
|
290
|
+
(0, vitest_1.expect)(res._body).toEqual([{ id: 1, name: 'Alice' }]);
|
|
291
|
+
});
|
|
292
|
+
(0, vitest_1.it)('should send string body directly', async () => {
|
|
293
|
+
// Create endpoint with string body
|
|
294
|
+
const stringEndpoint = {
|
|
295
|
+
id: 'string-endpoint',
|
|
296
|
+
path: '/string',
|
|
297
|
+
method: 'GET',
|
|
298
|
+
scenarios: [{ id: 'text', name: 'Text', status: 200, body: 'Hello World' }],
|
|
299
|
+
defaultScenarioId: 'text',
|
|
300
|
+
};
|
|
301
|
+
stateManager.setEndpoints([...mockEndpoints, stringEndpoint]);
|
|
302
|
+
resolver.setEndpoints([...mockEndpoints, stringEndpoint]);
|
|
303
|
+
const req = createMockRequest();
|
|
304
|
+
const res = createMockResponse();
|
|
305
|
+
const resolved = resolver.resolveResponse('string-endpoint', req);
|
|
306
|
+
await resolver.sendResponse(resolved, req, res);
|
|
307
|
+
(0, vitest_1.expect)(res._body).toBe('Hello World');
|
|
308
|
+
});
|
|
309
|
+
(0, vitest_1.it)('should call end() for null body', async () => {
|
|
310
|
+
stateManager.activateScenario('get-user', 'not-found');
|
|
311
|
+
const req = createMockRequest();
|
|
312
|
+
const res = createMockResponse();
|
|
313
|
+
const resolved = resolver.resolveResponse('get-user', req);
|
|
314
|
+
await resolver.sendResponse(resolved, req, res);
|
|
315
|
+
(0, vitest_1.expect)(res._ended).toBe(true);
|
|
316
|
+
});
|
|
317
|
+
(0, vitest_1.it)('should evaluate dynamic body', async () => {
|
|
318
|
+
const req = createMockRequest({ params: { id: '789' } });
|
|
319
|
+
const res = createMockResponse();
|
|
320
|
+
const resolved = resolver.resolveResponse('get-user', req);
|
|
321
|
+
await resolver.sendResponse(resolved, req, res);
|
|
322
|
+
(0, vitest_1.expect)(res._body).toEqual({ id: '789', name: 'Dynamic User' });
|
|
323
|
+
});
|
|
324
|
+
(0, vitest_1.it)('should apply delay before sending', async () => {
|
|
325
|
+
stateManager.activateScenario('get-users', 'delayed');
|
|
326
|
+
const req = createMockRequest();
|
|
327
|
+
const res = createMockResponse();
|
|
328
|
+
const resolved = resolver.resolveResponse('get-users', req);
|
|
329
|
+
const start = Date.now();
|
|
330
|
+
await resolver.sendResponse(resolved, req, res);
|
|
331
|
+
const elapsed = Date.now() - start;
|
|
332
|
+
(0, vitest_1.expect)(elapsed).toBeGreaterThanOrEqual(95);
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
(0, vitest_1.describe)('handleRequest', () => {
|
|
336
|
+
(0, vitest_1.it)('should resolve and send response', async () => {
|
|
337
|
+
const req = createMockRequest();
|
|
338
|
+
const res = createMockResponse();
|
|
339
|
+
const handled = await resolver.handleRequest('get-users', req, res);
|
|
340
|
+
(0, vitest_1.expect)(handled).toBe(true);
|
|
341
|
+
(0, vitest_1.expect)(res._status).toBe(200);
|
|
342
|
+
(0, vitest_1.expect)(res._body).toEqual([{ id: 1, name: 'Alice' }]);
|
|
343
|
+
});
|
|
344
|
+
(0, vitest_1.it)('should return false for unknown endpoint', async () => {
|
|
345
|
+
const req = createMockRequest();
|
|
346
|
+
const res = createMockResponse();
|
|
347
|
+
const handled = await resolver.handleRequest('unknown', req, res);
|
|
348
|
+
(0, vitest_1.expect)(handled).toBe(false);
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
(0, vitest_1.describe)('createResponseResolver', () => {
|
|
353
|
+
(0, vitest_1.it)('should create a ResponseResolver instance', () => {
|
|
354
|
+
const stateManager = new index_js_1.StateManager();
|
|
355
|
+
const resolver = (0, response_resolver_js_1.createResponseResolver)(stateManager);
|
|
356
|
+
(0, vitest_1.expect)(resolver).toBeInstanceOf(response_resolver_js_1.ResponseResolver);
|
|
357
|
+
});
|
|
358
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-resolver.test.js","sourceRoot":"","sources":["../../../src/resolver/__tests__/response-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createResponseResolver = exports.ResponseResolver = exports.isDynamicBody = void 0;
|
|
4
|
+
var types_js_1 = require("./types.js");
|
|
5
|
+
Object.defineProperty(exports, "isDynamicBody", { enumerable: true, get: function () { return types_js_1.isDynamicBody; } });
|
|
6
|
+
// Response resolver
|
|
7
|
+
var response_resolver_js_1 = require("./response-resolver.js");
|
|
8
|
+
Object.defineProperty(exports, "ResponseResolver", { enumerable: true, get: function () { return response_resolver_js_1.ResponseResolver; } });
|
|
9
|
+
Object.defineProperty(exports, "createResponseResolver", { enumerable: true, get: function () { return response_resolver_js_1.createResponseResolver; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":";;;AAOA,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AAEtB,oBAAoB;AACpB,+DAAkF;AAAzE,wHAAA,gBAAgB,OAAA;AAAE,8HAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { Request, Response } from 'express';
|
|
2
|
+
import type { EndpointConfig } from '../schemas/index.js';
|
|
3
|
+
import type { StateManager } from '../state/index.js';
|
|
4
|
+
import type { ResolvedResponse, RequestContext } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolves which response to send for incoming requests
|
|
7
|
+
* Uses StateManager to determine active scenario based on priority chain
|
|
8
|
+
*/
|
|
9
|
+
export declare class ResponseResolver {
|
|
10
|
+
private stateManager;
|
|
11
|
+
private endpoints;
|
|
12
|
+
private routeMap;
|
|
13
|
+
constructor(stateManager: StateManager);
|
|
14
|
+
/**
|
|
15
|
+
* Register endpoints for routing
|
|
16
|
+
*/
|
|
17
|
+
setEndpoints(endpoints: EndpointConfig[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Create a route key for method + path combination
|
|
20
|
+
*/
|
|
21
|
+
private createRouteKey;
|
|
22
|
+
/**
|
|
23
|
+
* Find endpoint by method and path
|
|
24
|
+
*/
|
|
25
|
+
findEndpoint(method: string, path: string): EndpointConfig | null;
|
|
26
|
+
/**
|
|
27
|
+
* Get endpoint by ID
|
|
28
|
+
*/
|
|
29
|
+
getEndpointById(endpointId: string): EndpointConfig | null;
|
|
30
|
+
/**
|
|
31
|
+
* Get all registered endpoints
|
|
32
|
+
*/
|
|
33
|
+
getEndpoints(): EndpointConfig[];
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the response for a given endpoint
|
|
36
|
+
* Uses the state manager's priority chain to determine the scenario
|
|
37
|
+
*/
|
|
38
|
+
resolveResponse(endpointId: string, req: Request): ResolvedResponse | null;
|
|
39
|
+
/**
|
|
40
|
+
* Resolve the response for a request by matching method and path
|
|
41
|
+
*/
|
|
42
|
+
resolveResponseByRoute(method: string, path: string, req: Request): ResolvedResponse | null;
|
|
43
|
+
/**
|
|
44
|
+
* Build the resolved response from endpoint and scenario
|
|
45
|
+
*/
|
|
46
|
+
private buildResponse;
|
|
47
|
+
/**
|
|
48
|
+
* Create request context for dynamic body functions
|
|
49
|
+
*/
|
|
50
|
+
createRequestContext(req: Request): RequestContext;
|
|
51
|
+
/**
|
|
52
|
+
* Evaluate the response body, handling dynamic functions
|
|
53
|
+
*/
|
|
54
|
+
evaluateBody(body: unknown, context: RequestContext): Promise<unknown>;
|
|
55
|
+
/**
|
|
56
|
+
* Apply delay if configured
|
|
57
|
+
*/
|
|
58
|
+
applyDelay(delay: number): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Send the resolved response
|
|
61
|
+
*/
|
|
62
|
+
sendResponse(resolved: ResolvedResponse, req: Request, res: Response): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Handle a request: resolve and send the response
|
|
65
|
+
* Returns true if handled, false if no matching endpoint
|
|
66
|
+
*/
|
|
67
|
+
handleRequest(endpointId: string, req: Request, res: Response): Promise<boolean>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create a new ResponseResolver instance
|
|
71
|
+
*/
|
|
72
|
+
export declare function createResponseResolver(stateManager: StateManager): ResponseResolver;
|
|
73
|
+
//# sourceMappingURL=response-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-resolver.d.ts","sourceRoot":"","sources":["../../src/resolver/response-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAGlF;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,QAAQ,CAA0C;gBAE9C,YAAY,EAAE,YAAY;IAItC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI;IAY/C;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAKjE;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAI1D;;OAEG;IACH,YAAY,IAAI,cAAc,EAAE;IAIhC;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI;IAc1E;;OAEG;IACH,sBAAsB,CACpB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,OAAO,GACX,gBAAgB,GAAG,IAAI;IAS1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc;IAYlD;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,OAAO,CAAC;IAOnB;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C;;OAEG;IACG,YAAY,CAChB,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,IAAI,CAAC;IAyBhB;;;OAGG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,OAAO,CAAC;CASpB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,YAAY,GAAG,gBAAgB,CAEnF"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResponseResolver = void 0;
|
|
4
|
+
exports.createResponseResolver = createResponseResolver;
|
|
5
|
+
const types_js_1 = require("./types.js");
|
|
6
|
+
/**
|
|
7
|
+
* Resolves which response to send for incoming requests
|
|
8
|
+
* Uses StateManager to determine active scenario based on priority chain
|
|
9
|
+
*/
|
|
10
|
+
class ResponseResolver {
|
|
11
|
+
constructor(stateManager) {
|
|
12
|
+
this.endpoints = new Map();
|
|
13
|
+
this.routeMap = new Map();
|
|
14
|
+
this.stateManager = stateManager;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register endpoints for routing
|
|
18
|
+
*/
|
|
19
|
+
setEndpoints(endpoints) {
|
|
20
|
+
this.endpoints.clear();
|
|
21
|
+
this.routeMap.clear();
|
|
22
|
+
for (const endpoint of endpoints) {
|
|
23
|
+
this.endpoints.set(endpoint.id, endpoint);
|
|
24
|
+
// Create route key for lookup: METHOD:path
|
|
25
|
+
const routeKey = this.createRouteKey(endpoint.method, endpoint.path);
|
|
26
|
+
this.routeMap.set(routeKey, endpoint);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a route key for method + path combination
|
|
31
|
+
*/
|
|
32
|
+
createRouteKey(method, path) {
|
|
33
|
+
return `${method.toUpperCase()}:${path}`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Find endpoint by method and path
|
|
37
|
+
*/
|
|
38
|
+
findEndpoint(method, path) {
|
|
39
|
+
const routeKey = this.createRouteKey(method, path);
|
|
40
|
+
return this.routeMap.get(routeKey) ?? null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get endpoint by ID
|
|
44
|
+
*/
|
|
45
|
+
getEndpointById(endpointId) {
|
|
46
|
+
return this.endpoints.get(endpointId) ?? null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get all registered endpoints
|
|
50
|
+
*/
|
|
51
|
+
getEndpoints() {
|
|
52
|
+
return [...this.endpoints.values()];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the response for a given endpoint
|
|
56
|
+
* Uses the state manager's priority chain to determine the scenario
|
|
57
|
+
*/
|
|
58
|
+
resolveResponse(endpointId, req) {
|
|
59
|
+
const endpoint = this.endpoints.get(endpointId);
|
|
60
|
+
if (!endpoint) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const scenario = this.stateManager.resolveScenario(endpointId);
|
|
64
|
+
if (!scenario) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
return this.buildResponse(endpoint, scenario, req);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve the response for a request by matching method and path
|
|
71
|
+
*/
|
|
72
|
+
resolveResponseByRoute(method, path, req) {
|
|
73
|
+
const endpoint = this.findEndpoint(method, path);
|
|
74
|
+
if (!endpoint) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return this.resolveResponse(endpoint.id, req);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build the resolved response from endpoint and scenario
|
|
81
|
+
*/
|
|
82
|
+
buildResponse(endpoint, scenario, req) {
|
|
83
|
+
return {
|
|
84
|
+
status: scenario.status,
|
|
85
|
+
headers: scenario.headers ?? {},
|
|
86
|
+
body: scenario.body,
|
|
87
|
+
delay: scenario.delay ?? 0,
|
|
88
|
+
scenario,
|
|
89
|
+
endpoint,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create request context for dynamic body functions
|
|
94
|
+
*/
|
|
95
|
+
createRequestContext(req) {
|
|
96
|
+
return {
|
|
97
|
+
req,
|
|
98
|
+
params: req.params,
|
|
99
|
+
query: req.query,
|
|
100
|
+
body: req.body,
|
|
101
|
+
headers: req.headers,
|
|
102
|
+
method: req.method,
|
|
103
|
+
path: req.path,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Evaluate the response body, handling dynamic functions
|
|
108
|
+
*/
|
|
109
|
+
async evaluateBody(body, context) {
|
|
110
|
+
if ((0, types_js_1.isDynamicBody)(body)) {
|
|
111
|
+
return await body(context);
|
|
112
|
+
}
|
|
113
|
+
return body;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Apply delay if configured
|
|
117
|
+
*/
|
|
118
|
+
async applyDelay(delay) {
|
|
119
|
+
if (delay > 0) {
|
|
120
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Send the resolved response
|
|
125
|
+
*/
|
|
126
|
+
async sendResponse(resolved, req, res) {
|
|
127
|
+
// Apply delay
|
|
128
|
+
await this.applyDelay(resolved.delay);
|
|
129
|
+
// Set headers
|
|
130
|
+
for (const [key, value] of Object.entries(resolved.headers)) {
|
|
131
|
+
res.setHeader(key, value);
|
|
132
|
+
}
|
|
133
|
+
// Evaluate body (handle dynamic functions)
|
|
134
|
+
const context = this.createRequestContext(req);
|
|
135
|
+
const body = await this.evaluateBody(resolved.body, context);
|
|
136
|
+
// Send response
|
|
137
|
+
res.status(resolved.status);
|
|
138
|
+
if (body === null || body === undefined) {
|
|
139
|
+
res.end();
|
|
140
|
+
}
|
|
141
|
+
else if (typeof body === 'string') {
|
|
142
|
+
res.send(body);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
res.json(body);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Handle a request: resolve and send the response
|
|
150
|
+
* Returns true if handled, false if no matching endpoint
|
|
151
|
+
*/
|
|
152
|
+
async handleRequest(endpointId, req, res) {
|
|
153
|
+
const resolved = this.resolveResponse(endpointId, req);
|
|
154
|
+
if (!resolved) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
await this.sendResponse(resolved, req, res);
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
exports.ResponseResolver = ResponseResolver;
|
|
162
|
+
/**
|
|
163
|
+
* Create a new ResponseResolver instance
|
|
164
|
+
*/
|
|
165
|
+
function createResponseResolver(stateManager) {
|
|
166
|
+
return new ResponseResolver(stateManager);
|
|
167
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-resolver.js","sourceRoot":"","sources":["../../src/resolver/response-resolver.ts"],"names":[],"mappings":"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"}
|