Skip to content

Commit 9cea561

Browse files
committed
feat: Add original response data changer
1 parent abe1d3d commit 9cea561

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,17 @@ proxy.onGet('/path-to-request').changeRequest((requestConfig) => {
5555
return requestConfig;
5656
});
5757

58+
// Can change original response data
59+
proxy.onGet('/').changeResponseData(originalData => ({
60+
...originalData,
61+
override: 'another value',
62+
}));
63+
64+
proxy.onGet('/').changeResponseDataOnce(originalData => ({
65+
...originalData,
66+
override: 'another value once',
67+
}));
68+
5869
// Or just want to see the response change the AxiosRequestConfig
5970
proxy.onGet('/path-to-request').printResponse();
6071

src/runtime/handler.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import type { AxiosResponse } from 'axios';
2-
import type { RequestConfigChanger, RouteConfig } from '../types';
2+
import type {
3+
RequestConfigChanger,
4+
ResponseChanger,
5+
RouteConfig,
6+
} from '../types';
37
import {
48
ejectFromRequest,
59
ejectFromResponse,
@@ -105,14 +109,34 @@ export default class Handler {
105109
response => {
106110
if (matchResponse(verbConfig, pathConfig, response, paramsConfig)) {
107111
if (once) ejectFromResponse(this.scope.axios, interceptorId);
112+
// eslint-disable-next-line no-console
108113
console.log('Response from:', this.path);
114+
// eslint-disable-next-line no-console
109115
console.log(JSON.stringify(response.data, null, 2));
110116
}
111117
return response;
112118
},
113119
);
114120
}
115121

122+
private setChangerResponseData(
123+
responseChanger: ResponseChanger,
124+
once = false,
125+
) {
126+
const verbConfig = this.verb;
127+
const pathConfig = this.path;
128+
const paramsConfig = this.params;
129+
const interceptorId = this.scope.axios.interceptors.response.use(
130+
response => {
131+
if (matchResponse(verbConfig, pathConfig, response, paramsConfig)) {
132+
if (once) ejectFromResponse(this.scope.axios, interceptorId);
133+
response.data = responseChanger(response.data);
134+
}
135+
return response;
136+
},
137+
);
138+
}
139+
116140
reply(statusCodeOrConfig: number | RouteConfig, mock?: unknown) {
117141
this.setProxy(statusCodeOrConfig, mock);
118142
return this.scope;
@@ -142,4 +166,14 @@ export default class Handler {
142166
this.setPrintableResponse(true);
143167
return this;
144168
}
169+
170+
changeResponseData(changer: ResponseChanger) {
171+
this.setChangerResponseData(changer);
172+
return this;
173+
}
174+
175+
changeResponseDataOnce(changer: ResponseChanger) {
176+
this.setChangerResponseData(changer, true);
177+
return this;
178+
}
145179
}

src/types.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import type { AxiosRequestConfig, InternalAxiosRequestConfig } from 'axios';
1+
import type {
2+
AxiosRequestConfig,
3+
InternalAxiosRequestConfig,
4+
AxiosResponse,
5+
} from 'axios';
26

37
export type RouteConfig = (
48
config?: AxiosRequestConfig,
@@ -7,3 +11,5 @@ export type RouteConfig = (
711
export type RequestConfigChanger = (
812
config: InternalAxiosRequestConfig,
913
) => InternalAxiosRequestConfig;
14+
15+
export type ResponseChanger = (response: AxiosResponse) => AxiosResponse;

test/index.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,20 @@ describe('axios-dev-proxy tests', () => {
227227
expect(response.data).toEqual({ data: 2 });
228228
expect(response.status).toEqual(201);
229229
});
230+
231+
it('should change original response', async () => {
232+
server.get('/').reply(200, { data: 1, xpto: 2 });
233+
234+
proxy.onGet('/').changeResponseDataOnce(data => ({
235+
...data,
236+
data: 2,
237+
}));
238+
239+
const response = await api.get('/');
240+
241+
expect(response.data).toEqual({ data: 2, xpto: 2 });
242+
expect(response.status).toEqual(200);
243+
});
230244
});
231245

232246
describe('always GET configs', () => {

0 commit comments

Comments
 (0)