mock-config-server 1.0.1
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 +213 -0
- package/dist/bin/mock-config-server.d.ts +2 -0
- package/dist/bin/mock-config-server.js +65 -0
- package/dist/bin/resolveExportsFromSourceCode.d.ts +1 -0
- package/dist/bin/resolveExportsFromSourceCode.js +11 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +17 -0
- package/dist/jest.config.d.ts +3 -0
- package/dist/jest.config.js +7 -0
- package/dist/src/configs/isEntitiesEqual/isEntityValuesEqual.d.ts +2 -0
- package/dist/src/configs/isEntitiesEqual/isEntityValuesEqual.js +29 -0
- package/dist/src/configs/isEntitiesEqual/isEntityValuesEqual.test.d.ts +1 -0
- package/dist/src/configs/isEntitiesEqual/isEntityValuesEqual.test.js +25 -0
- package/dist/src/configs/prepareRequestConfigs/prepareRequestConfigs.d.ts +2 -0
- package/dist/src/configs/prepareRequestConfigs/prepareRequestConfigs.js +30 -0
- package/dist/src/configs/prepareRequestConfigs/prepareRequestConfigs.test.d.ts +1 -0
- package/dist/src/configs/prepareRequestConfigs/prepareRequestConfigs.test.js +151 -0
- package/dist/src/cors/corsMiddleware/corsMiddleware.d.ts +3 -0
- package/dist/src/cors/corsMiddleware/corsMiddleware.js +32 -0
- package/dist/src/cors/corsMiddleware/corsMiddleware.test.d.ts +1 -0
- package/dist/src/cors/corsMiddleware/corsMiddleware.test.js +86 -0
- package/dist/src/cors/getOrigins/getAllowedOrigins.d.ts +2 -0
- package/dist/src/cors/getOrigins/getAllowedOrigins.js +16 -0
- package/dist/src/cors/getOrigins/getAllowedOrigins.test.d.ts +1 -0
- package/dist/src/cors/getOrigins/getAllowedOrigins.test.js +24 -0
- package/dist/src/cors/noCorsMiddleware/noCorsMiddleware.d.ts +2 -0
- package/dist/src/cors/noCorsMiddleware/noCorsMiddleware.js +15 -0
- package/dist/src/cors/noCorsMiddleware/noCorsMiddleware.test.d.ts +1 -0
- package/dist/src/cors/noCorsMiddleware/noCorsMiddleware.test.js +22 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +19 -0
- package/dist/src/routes/callRequestInterceptors/callRequestInterceptors.d.ts +12 -0
- package/dist/src/routes/callRequestInterceptors/callRequestInterceptors.js +13 -0
- package/dist/src/routes/callRequestInterceptors/callRequestInterceptors.test.d.ts +1 -0
- package/dist/src/routes/callRequestInterceptors/callRequestInterceptors.test.js +28 -0
- package/dist/src/routes/callResponseInterceptors/callResponseInterceptors.d.ts +14 -0
- package/dist/src/routes/callResponseInterceptors/callResponseInterceptors.js +31 -0
- package/dist/src/routes/callResponseInterceptors/callResponseInterceptors.test.d.ts +1 -0
- package/dist/src/routes/callResponseInterceptors/callResponseInterceptors.test.js +36 -0
- package/dist/src/routes/createRoutes/createRoutes.d.ts +3 -0
- package/dist/src/routes/createRoutes/createRoutes.js +43 -0
- package/dist/src/routes/createRoutes/createRoutes.test.d.ts +1 -0
- package/dist/src/routes/createRoutes/createRoutes.test.js +276 -0
- package/dist/src/server/createMockServer/createMockServer.d.ts +3 -0
- package/dist/src/server/createMockServer/createMockServer.js +35 -0
- package/dist/src/server/startMockServer/startMockServer.d.ts +2 -0
- package/dist/src/server/startMockServer/startMockServer.js +13 -0
- package/dist/src/static/staticMiddleware/staticMiddleware.d.ts +3 -0
- package/dist/src/static/staticMiddleware/staticMiddleware.js +29 -0
- package/dist/src/utils/constants/appPath.d.ts +1 -0
- package/dist/src/utils/constants/appPath.js +4 -0
- package/dist/src/utils/constants/default.d.ts +10 -0
- package/dist/src/utils/constants/default.js +13 -0
- package/dist/src/utils/constants/index.d.ts +2 -0
- package/dist/src/utils/constants/index.js +18 -0
- package/dist/src/utils/helpers/index.d.ts +2 -0
- package/dist/src/utils/helpers/index.js +18 -0
- package/dist/src/utils/helpers/isPlainObject.d.ts +1 -0
- package/dist/src/utils/helpers/isPlainObject.js +5 -0
- package/dist/src/utils/helpers/sleep.d.ts +1 -0
- package/dist/src/utils/helpers/sleep.js +7 -0
- package/dist/src/utils/types/configs.d.ts +34 -0
- package/dist/src/utils/types/configs.js +2 -0
- package/dist/src/utils/types/index.d.ts +3 -0
- package/dist/src/utils/types/index.js +19 -0
- package/dist/src/utils/types/interceptors.d.ts +15 -0
- package/dist/src/utils/types/interceptors.js +2 -0
- package/dist/src/utils/types/server.d.ts +24 -0
- package/dist/src/utils/types/server.js +2 -0
- package/package.json +99 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_1 = __importDefault(require("express"));
|
|
7
|
+
const supertest_1 = __importDefault(require("supertest"));
|
|
8
|
+
const createRoutes_1 = require("./createRoutes");
|
|
9
|
+
describe('createRoutes', () => {
|
|
10
|
+
const createServer = (mockServerConfig) => {
|
|
11
|
+
const server = (0, express_1.default)();
|
|
12
|
+
const routerBase = express_1.default.Router();
|
|
13
|
+
const routerWithRoutes = (0, createRoutes_1.createRoutes)(routerBase, mockServerConfig);
|
|
14
|
+
server.use(express_1.default.json());
|
|
15
|
+
server.use(mockServerConfig.baseUrl ?? '/', routerWithRoutes);
|
|
16
|
+
return server;
|
|
17
|
+
};
|
|
18
|
+
test('Should match config by entities "includes" behavior', async () => {
|
|
19
|
+
const server = createServer({
|
|
20
|
+
configs: [
|
|
21
|
+
{
|
|
22
|
+
path: '/users',
|
|
23
|
+
method: 'get',
|
|
24
|
+
routes: [
|
|
25
|
+
{
|
|
26
|
+
entities: {
|
|
27
|
+
headers: { key1: 'value1', key2: 'value2' },
|
|
28
|
+
query: { key1: 'value1' }
|
|
29
|
+
},
|
|
30
|
+
data: { name: 'John', surname: 'Doe' }
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
});
|
|
36
|
+
const response = await (0, supertest_1.default)(server)
|
|
37
|
+
.get('/users')
|
|
38
|
+
.set({ key1: 'value1', key2: 'value2' })
|
|
39
|
+
.query({ key1: 'value1', key2: 'value2' });
|
|
40
|
+
expect(response.statusCode).toBe(200);
|
|
41
|
+
expect(response.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
42
|
+
});
|
|
43
|
+
test('Should give priority to more specific route config', async () => {
|
|
44
|
+
const server = createServer({
|
|
45
|
+
configs: [
|
|
46
|
+
{
|
|
47
|
+
path: '/users',
|
|
48
|
+
method: 'get',
|
|
49
|
+
routes: [
|
|
50
|
+
{
|
|
51
|
+
entities: {
|
|
52
|
+
headers: { key1: 'value1', key2: 'value2' },
|
|
53
|
+
query: { key1: 'value1' }
|
|
54
|
+
},
|
|
55
|
+
data: { name: 'John', surname: 'Doe' }
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
entities: {
|
|
59
|
+
headers: { key1: 'value1', key2: 'value2' },
|
|
60
|
+
query: { key1: 'value1', key2: 'value2' }
|
|
61
|
+
},
|
|
62
|
+
data: { name: 'John', surname: 'Smith' }
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
});
|
|
68
|
+
const response = await (0, supertest_1.default)(server)
|
|
69
|
+
.get('/users')
|
|
70
|
+
.set({ key1: 'value1', key2: 'value2', key3: 'value3' })
|
|
71
|
+
.query({ key1: 'value1', key2: 'value2', key3: 'value3' });
|
|
72
|
+
expect(response.statusCode).toBe(200);
|
|
73
|
+
expect(response.body).toStrictEqual({ name: 'John', surname: 'Smith' });
|
|
74
|
+
});
|
|
75
|
+
test('Should return 404 and description text for no matched request entities', async () => {
|
|
76
|
+
const server = createServer({
|
|
77
|
+
configs: [
|
|
78
|
+
{
|
|
79
|
+
path: '/users',
|
|
80
|
+
method: 'get',
|
|
81
|
+
routes: [
|
|
82
|
+
{
|
|
83
|
+
entities: {
|
|
84
|
+
headers: { key1: 'value1' }
|
|
85
|
+
},
|
|
86
|
+
data: { name: 'John', surname: 'Doe' }
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
});
|
|
92
|
+
const response = await (0, supertest_1.default)(server).get('/users').set({ key2: 'value2' });
|
|
93
|
+
expect(response.statusCode).toBe(404);
|
|
94
|
+
expect(response.body).toBe('No data for GET:/users');
|
|
95
|
+
});
|
|
96
|
+
test('Should compare non plain object body by full equal behavior', async () => {
|
|
97
|
+
const server = createServer({
|
|
98
|
+
configs: [
|
|
99
|
+
{
|
|
100
|
+
path: '/users',
|
|
101
|
+
method: 'post',
|
|
102
|
+
routes: [
|
|
103
|
+
{
|
|
104
|
+
entities: {
|
|
105
|
+
body: [
|
|
106
|
+
{
|
|
107
|
+
key1: 'value1',
|
|
108
|
+
key2: { nestedKey1: 'nestedValue1' }
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
data: { name: 'John', surname: 'Doe' }
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
});
|
|
118
|
+
const successResponse = await (0, supertest_1.default)(server)
|
|
119
|
+
.post('/users')
|
|
120
|
+
.set('Content-Type', 'application/json')
|
|
121
|
+
.send([{ key1: 'value1', key2: { nestedKey1: 'nestedValue1' } }]);
|
|
122
|
+
expect(successResponse.statusCode).toBe(200);
|
|
123
|
+
expect(successResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
124
|
+
const failedResponse = await (0, supertest_1.default)(server)
|
|
125
|
+
.post('/users')
|
|
126
|
+
.set('Content-Type', 'application/json')
|
|
127
|
+
.send([{ key1: 'value1', key2: { nestedKey1: 'nestedValue1', nestedKey2: 'nestedValue2' } }]);
|
|
128
|
+
expect(failedResponse.statusCode).toBe(404);
|
|
129
|
+
expect(failedResponse.body).toBe('No data for POST:/users');
|
|
130
|
+
});
|
|
131
|
+
test('Should compare plain object body by "includes" behavior', async () => {
|
|
132
|
+
const server = createServer({
|
|
133
|
+
configs: [
|
|
134
|
+
{
|
|
135
|
+
path: '/users',
|
|
136
|
+
method: 'post',
|
|
137
|
+
routes: [
|
|
138
|
+
{
|
|
139
|
+
entities: {
|
|
140
|
+
body: {
|
|
141
|
+
key1: 'value1',
|
|
142
|
+
key2: { nestedKey1: 'nestedValue1' }
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
data: { name: 'John', surname: 'Doe' }
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
});
|
|
151
|
+
const response = await (0, supertest_1.default)(server)
|
|
152
|
+
.post('/users')
|
|
153
|
+
.set('Content-Type', 'application/json')
|
|
154
|
+
.send({ key1: 'value1', key2: { nestedKey1: 'nestedValue1', nestedKey2: 'nestedValue2' } });
|
|
155
|
+
expect(response.statusCode).toBe(200);
|
|
156
|
+
expect(response.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
157
|
+
});
|
|
158
|
+
test('Should call request interceptors in order: request -> server', async () => {
|
|
159
|
+
const requestInterceptor = jest.fn();
|
|
160
|
+
const serverInterceptor = jest.fn();
|
|
161
|
+
const server = createServer({
|
|
162
|
+
configs: [
|
|
163
|
+
{
|
|
164
|
+
path: '/users',
|
|
165
|
+
method: 'post',
|
|
166
|
+
routes: [
|
|
167
|
+
{
|
|
168
|
+
entities: {
|
|
169
|
+
body: {
|
|
170
|
+
key1: 'value1',
|
|
171
|
+
key2: 'value2'
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
data: { name: 'John', surname: 'Doe' }
|
|
175
|
+
}
|
|
176
|
+
],
|
|
177
|
+
interceptors: { request: requestInterceptor }
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
path: '/settings',
|
|
181
|
+
method: 'post',
|
|
182
|
+
routes: [
|
|
183
|
+
{
|
|
184
|
+
entities: {
|
|
185
|
+
body: {
|
|
186
|
+
key1: 'value1',
|
|
187
|
+
key2: 'value2'
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
data: { name: 'John', surname: 'Smith' }
|
|
191
|
+
}
|
|
192
|
+
]
|
|
193
|
+
}
|
|
194
|
+
],
|
|
195
|
+
interceptors: { request: serverInterceptor }
|
|
196
|
+
});
|
|
197
|
+
await (0, supertest_1.default)(server)
|
|
198
|
+
.post('/users')
|
|
199
|
+
.set('Content-Type', 'application/json')
|
|
200
|
+
.send({ key1: 'value1', key2: 'value2' });
|
|
201
|
+
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
202
|
+
expect(serverInterceptor.mock.calls.length).toBe(1);
|
|
203
|
+
expect(requestInterceptor.mock.invocationCallOrder[0]).toBeLessThan(serverInterceptor.mock.invocationCallOrder[0]);
|
|
204
|
+
await (0, supertest_1.default)(server)
|
|
205
|
+
.post('/settings')
|
|
206
|
+
.set('Content-Type', 'application/json')
|
|
207
|
+
.send({ key1: 'value1', key2: 'value2' });
|
|
208
|
+
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
209
|
+
expect(serverInterceptor.mock.calls.length).toBe(2);
|
|
210
|
+
});
|
|
211
|
+
test('Should call response interceptors in order: route -> request -> server', async () => {
|
|
212
|
+
const routeInterceptor = jest.fn();
|
|
213
|
+
const requestInterceptor = jest.fn();
|
|
214
|
+
const serverInterceptor = jest.fn();
|
|
215
|
+
const server = createServer({
|
|
216
|
+
configs: [
|
|
217
|
+
{
|
|
218
|
+
path: '/users',
|
|
219
|
+
method: 'post',
|
|
220
|
+
routes: [
|
|
221
|
+
{
|
|
222
|
+
entities: {
|
|
223
|
+
body: {
|
|
224
|
+
key1: 'value1',
|
|
225
|
+
key2: 'value2'
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
data: { name: 'John', surname: 'Doe' },
|
|
229
|
+
interceptors: { response: routeInterceptor }
|
|
230
|
+
}
|
|
231
|
+
],
|
|
232
|
+
interceptors: { response: requestInterceptor }
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
path: '/settings',
|
|
236
|
+
method: 'post',
|
|
237
|
+
routes: [
|
|
238
|
+
{
|
|
239
|
+
entities: {
|
|
240
|
+
body: {
|
|
241
|
+
key1: 'value1',
|
|
242
|
+
key2: 'value2'
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
data: { name: 'John', surname: 'Smith' }
|
|
246
|
+
}
|
|
247
|
+
]
|
|
248
|
+
}
|
|
249
|
+
],
|
|
250
|
+
interceptors: { response: serverInterceptor }
|
|
251
|
+
});
|
|
252
|
+
await (0, supertest_1.default)(server)
|
|
253
|
+
.post('/users')
|
|
254
|
+
.set('Content-Type', 'application/json')
|
|
255
|
+
.send({ key1: 'value1', key2: 'value2' });
|
|
256
|
+
expect(routeInterceptor.mock.calls.length).toBe(1);
|
|
257
|
+
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
258
|
+
expect(serverInterceptor.mock.calls.length).toBe(1);
|
|
259
|
+
expect(routeInterceptor.mock.invocationCallOrder[0]).toBeLessThan(requestInterceptor.mock.invocationCallOrder[0]);
|
|
260
|
+
expect(requestInterceptor.mock.invocationCallOrder[0]).toBeLessThan(serverInterceptor.mock.invocationCallOrder[0]);
|
|
261
|
+
await (0, supertest_1.default)(server)
|
|
262
|
+
.post('/settings')
|
|
263
|
+
.set('Content-Type', 'application/json')
|
|
264
|
+
.send({ key1: 'value1', key2: 'value2' });
|
|
265
|
+
expect(routeInterceptor.mock.calls.length).toBe(1);
|
|
266
|
+
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
267
|
+
expect(serverInterceptor.mock.calls.length).toBe(2);
|
|
268
|
+
await (0, supertest_1.default)(server)
|
|
269
|
+
.post('/messages')
|
|
270
|
+
.set('Content-Type', 'application/json')
|
|
271
|
+
.send({ key1: 'value1', key2: 'value2' });
|
|
272
|
+
expect(routeInterceptor.mock.calls.length).toBe(1);
|
|
273
|
+
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
274
|
+
expect(serverInterceptor.mock.calls.length).toBe(2);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createMockServer = void 0;
|
|
7
|
+
const body_parser_1 = __importDefault(require("body-parser"));
|
|
8
|
+
const express_1 = __importDefault(require("express"));
|
|
9
|
+
const corsMiddleware_1 = require("../../cors/corsMiddleware/corsMiddleware");
|
|
10
|
+
const noCorsMiddleware_1 = require("../../cors/noCorsMiddleware/noCorsMiddleware");
|
|
11
|
+
const createRoutes_1 = require("../../routes/createRoutes/createRoutes");
|
|
12
|
+
const staticMiddleware_1 = require("../../static/staticMiddleware/staticMiddleware");
|
|
13
|
+
const createMockServer = ({ cors, staticPath, ...mockServerConfig }) => {
|
|
14
|
+
const server = (0, express_1.default)();
|
|
15
|
+
server.use(body_parser_1.default.urlencoded({ extended: false }));
|
|
16
|
+
server.use(body_parser_1.default.json({ limit: '10mb' }));
|
|
17
|
+
const baseUrl = mockServerConfig.baseUrl ?? '/';
|
|
18
|
+
if (cors) {
|
|
19
|
+
(0, corsMiddleware_1.corsMiddleware)(server, cors);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
(0, noCorsMiddleware_1.noCorsMiddleware)(server);
|
|
23
|
+
}
|
|
24
|
+
if (staticPath) {
|
|
25
|
+
(0, staticMiddleware_1.staticMiddleware)(server, baseUrl, staticPath);
|
|
26
|
+
}
|
|
27
|
+
const routerBase = express_1.default.Router();
|
|
28
|
+
const routerWithRoutes = (0, createRoutes_1.createRoutes)(routerBase, {
|
|
29
|
+
configs: mockServerConfig.configs,
|
|
30
|
+
interceptors: mockServerConfig.interceptors
|
|
31
|
+
});
|
|
32
|
+
server.use(baseUrl, routerWithRoutes);
|
|
33
|
+
return server;
|
|
34
|
+
};
|
|
35
|
+
exports.createMockServer = createMockServer;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startMockServer = void 0;
|
|
4
|
+
const constants_1 = require("../../utils/constants");
|
|
5
|
+
const createMockServer_1 = require("../createMockServer/createMockServer");
|
|
6
|
+
const startMockServer = (mockServerConfig) => {
|
|
7
|
+
const mockServer = (0, createMockServer_1.createMockServer)(mockServerConfig);
|
|
8
|
+
const port = mockServerConfig.port ?? constants_1.DEFAULT.PORT;
|
|
9
|
+
mockServer.listen(port, () => {
|
|
10
|
+
console.log(`🎉 Mock Server is running at http://localhost:${port}`);
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
exports.startMockServer = startMockServer;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.staticMiddleware = void 0;
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const constants_1 = require("../../utils/constants");
|
|
10
|
+
const staticMiddleware = (server, baseUrl, staticPath) => {
|
|
11
|
+
const isStaticPathArray = Array.isArray(staticPath);
|
|
12
|
+
if (isStaticPathArray) {
|
|
13
|
+
staticPath.forEach((staticPath) => {
|
|
14
|
+
const isPathObject = typeof staticPath === 'object';
|
|
15
|
+
if (isPathObject) {
|
|
16
|
+
return server.use(path_1.default.join(baseUrl, staticPath.prefix), express_1.default.static(path_1.default.join(constants_1.APP_PATH, staticPath.path)));
|
|
17
|
+
}
|
|
18
|
+
server.use(baseUrl, express_1.default.static(path_1.default.join(constants_1.APP_PATH, staticPath)));
|
|
19
|
+
});
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const isStaticPathObject = typeof staticPath === 'object';
|
|
23
|
+
if (isStaticPathObject) {
|
|
24
|
+
server.use(path_1.default.join(baseUrl, staticPath.prefix), express_1.default.static(path_1.default.join(constants_1.APP_PATH, staticPath.path)));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
server.use(baseUrl, express_1.default.static(path_1.default.join(constants_1.APP_PATH, staticPath)));
|
|
28
|
+
};
|
|
29
|
+
exports.staticMiddleware = staticMiddleware;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const APP_PATH: string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./appPath"), exports);
|
|
18
|
+
__exportStar(require("./default"), exports);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./isPlainObject"), exports);
|
|
18
|
+
__exportStar(require("./sleep"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isPlainObject: (value: any) => boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const sleep: (seconds: number) => Promise<unknown>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type PlainObject = Record<string, string | number>;
|
|
2
|
+
export type PlainFunction = (...args: any[]) => any;
|
|
3
|
+
export type Entities = 'headers' | 'query' | 'params' | 'body';
|
|
4
|
+
export type BodyValue = any;
|
|
5
|
+
export type EntitiesValues = {
|
|
6
|
+
[Key in Entities]: Key extends 'body' ? BodyValue : PlainObject;
|
|
7
|
+
};
|
|
8
|
+
export interface HttpMethodsEntities {
|
|
9
|
+
get: Extract<Entities, 'headers' | 'query' | 'params'>;
|
|
10
|
+
delete: Extract<Entities, 'headers' | 'query' | 'params'>;
|
|
11
|
+
post: Entities;
|
|
12
|
+
put: Entities;
|
|
13
|
+
patch: Entities;
|
|
14
|
+
}
|
|
15
|
+
export interface RouteConfig<Method extends RestMethod> {
|
|
16
|
+
entities?: {
|
|
17
|
+
[Key in HttpMethodsEntities[Method]]?: EntitiesValues[Key];
|
|
18
|
+
};
|
|
19
|
+
data: any;
|
|
20
|
+
interceptors?: Pick<import('./interceptors').Interceptors, 'response'>;
|
|
21
|
+
}
|
|
22
|
+
export type RestMethod = 'get' | 'post' | 'delete' | 'put' | 'patch';
|
|
23
|
+
export interface RestRequestConfig<Method extends RestMethod> {
|
|
24
|
+
path: string | RegExp;
|
|
25
|
+
method: Method;
|
|
26
|
+
routes: RouteConfig<Method>[];
|
|
27
|
+
interceptors?: import('./interceptors').Interceptors;
|
|
28
|
+
}
|
|
29
|
+
export type RestGetRequestConfig = RestRequestConfig<'get'>;
|
|
30
|
+
export type RestPostRequestConfig = RestRequestConfig<'post'>;
|
|
31
|
+
export type RestPutRequestConfig = RestRequestConfig<'put'>;
|
|
32
|
+
export type RestDeleteRequestConfig = RestRequestConfig<'delete'>;
|
|
33
|
+
export type RestPatchRequestConfig = RestRequestConfig<'patch'>;
|
|
34
|
+
export type RequestConfig = RestGetRequestConfig | RestPostRequestConfig | RestPutRequestConfig | RestDeleteRequestConfig | RestPatchRequestConfig;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./configs"), exports);
|
|
18
|
+
__exportStar(require("./interceptors"), exports);
|
|
19
|
+
__exportStar(require("./server"), exports);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface InterceptorRequestParams {
|
|
2
|
+
request: import('express').Request;
|
|
3
|
+
}
|
|
4
|
+
export type InterceptorRequest = (params: InterceptorRequestParams) => void;
|
|
5
|
+
export interface InterceptorResponseParams {
|
|
6
|
+
request: import('express').Request;
|
|
7
|
+
response: import('express').Response;
|
|
8
|
+
setDelay: (delay: number) => Promise<void>;
|
|
9
|
+
setStatusCode: (statusCode: number) => void;
|
|
10
|
+
}
|
|
11
|
+
export type InterceptorResponse = <Data>(data: Data, params: InterceptorResponseParams) => any;
|
|
12
|
+
export interface Interceptors {
|
|
13
|
+
response?: InterceptorResponse;
|
|
14
|
+
request?: InterceptorRequest;
|
|
15
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type StaticPathObject = {
|
|
2
|
+
prefix: string;
|
|
3
|
+
path: string;
|
|
4
|
+
};
|
|
5
|
+
export type StaticPath = string | StaticPathObject | (StaticPathObject | string)[];
|
|
6
|
+
export type CorsHeader = string;
|
|
7
|
+
export type CorsOrigin = string | RegExp | (RegExp | string)[];
|
|
8
|
+
export type Cors = {
|
|
9
|
+
origin: CorsOrigin | (() => Promise<CorsOrigin> | CorsOrigin);
|
|
10
|
+
methods?: Uppercase<import('./configs').RestMethod>[];
|
|
11
|
+
headers?: CorsHeader[];
|
|
12
|
+
credentials?: boolean;
|
|
13
|
+
maxAge?: number;
|
|
14
|
+
};
|
|
15
|
+
export type Port = number;
|
|
16
|
+
export type BaseUrl = string;
|
|
17
|
+
export interface MockServerConfig {
|
|
18
|
+
configs: import('./configs').RequestConfig[];
|
|
19
|
+
baseUrl?: BaseUrl;
|
|
20
|
+
port?: Port;
|
|
21
|
+
staticPath?: StaticPath;
|
|
22
|
+
interceptors?: import('./interceptors').Interceptors;
|
|
23
|
+
cors?: Cors;
|
|
24
|
+
}
|