mock-config-server 2.1.0 → 2.3.0
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/LICENSE +21 -0
- package/README.md +32 -15
- package/dist/bin/build.d.ts +2 -0
- package/dist/bin/build.js +49 -0
- package/dist/bin/cli.js +14 -2
- package/dist/bin/helpers/index.d.ts +3 -0
- package/dist/bin/helpers/index.js +19 -0
- package/dist/bin/helpers/resolveConfigFile.d.ts +2 -0
- package/dist/bin/helpers/resolveConfigFile.js +20 -0
- package/dist/bin/helpers/resolveConfigFilePath.d.ts +1 -0
- package/dist/bin/helpers/resolveConfigFilePath.js +39 -0
- package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.d.ts +1 -0
- package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.js +39 -0
- package/dist/bin/run.d.ts +6 -0
- package/dist/bin/run.js +17 -0
- package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.js +11 -11
- package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.js +15 -15
- package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.d.ts +2 -2
- package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.js +9 -11
- package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.js +3 -1
- package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.d.ts +2 -0
- package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.js +16 -0
- package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.d.ts +1 -0
- package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.js +17 -0
- package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.d.ts +3 -0
- package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.js +17 -0
- package/dist/src/core/middlewares/corsMiddleware/corsMiddleware.js +12 -12
- package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.d.ts +7 -0
- package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.js +23 -0
- package/dist/src/core/middlewares/index.d.ts +3 -0
- package/dist/src/core/middlewares/index.js +3 -0
- package/dist/src/core/middlewares/noCorsMiddleware/noCorsMiddleware.js +13 -13
- package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.d.ts +3 -0
- package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.js +11 -0
- package/dist/src/core/rest/createRestRoutes/createRestRoutes.d.ts +2 -2
- package/dist/src/core/rest/createRestRoutes/createRestRoutes.js +9 -11
- package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.js +3 -1
- package/dist/src/server/createMockServer/createMockServer.js +15 -2
- package/dist/src/server/index.d.ts +1 -1
- package/dist/src/server/index.js +1 -1
- package/dist/src/server/startMockServer/startMockServer.d.ts +4 -1
- package/dist/src/server/startMockServer/startMockServer.js +4 -1
- package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.d.ts +8 -0
- package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.js +19 -0
- package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.d.ts +6 -5
- package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.js +20 -23
- package/dist/src/utils/helpers/interceptors/helpers/setDelay.d.ts +1 -0
- package/dist/src/utils/helpers/interceptors/helpers/setDelay.js +8 -0
- package/dist/src/utils/helpers/interceptors/index.d.ts +1 -1
- package/dist/src/utils/helpers/interceptors/index.js +1 -1
- package/dist/src/utils/helpers/sleep.d.ts +1 -1
- package/dist/src/utils/helpers/sleep.js +2 -2
- package/dist/src/utils/types/graphql.d.ts +1 -1
- package/dist/src/utils/types/interceptors.d.ts +15 -6
- package/dist/src/utils/types/rest.d.ts +7 -7
- package/dist/src/utils/types/server.d.ts +19 -9
- package/dist/src/utils/types/values.d.ts +1 -0
- package/package.json +4 -2
- package/dist/bin/start.d.ts +0 -3
- package/dist/bin/start.js +0 -73
- package/dist/src/utils/helpers/interceptors/callRequestInterceptors/callRequestInterceptors.d.ts +0 -12
- package/dist/src/utils/helpers/interceptors/callRequestInterceptors/callRequestInterceptors.js +0 -13
- /package/dist/bin/{resolveExportsFromSourceCode → helpers}/resolveExportsFromSourceCode.d.ts +0 -0
- /package/dist/bin/{resolveExportsFromSourceCode → helpers}/resolveExportsFromSourceCode.js +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 siberiacancode
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -57,19 +57,21 @@ export default mockServerConfig;
|
|
|
57
57
|
Start **🎉 Mock Config Server**
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
|
-
$ npx
|
|
61
|
-
|
|
62
|
-
# 🎉 Mock Config Server is running at http://localhost:31299
|
|
60
|
+
$ npx mock-config-server
|
|
63
61
|
```
|
|
64
62
|
|
|
63
|
+
> If the package is already installed you can use short command `mcs`
|
|
64
|
+
|
|
65
65
|
## 🎭 Parameters for mock-server.config.(js|ts)
|
|
66
66
|
|
|
67
67
|
- `rest?` Rest configs for mock requests
|
|
68
68
|
- `baseUrl?` {string} part of the url that will be substituted at the beginning of rest request url (default: `'/'`)
|
|
69
69
|
- `configs` {Array<RestRequestConfig>} configs for mock requests, [read](#configs)
|
|
70
|
+
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
70
71
|
- `graphql?` GraphQL configs for mock requests
|
|
71
72
|
- `baseUrl?` {string} part of the url that will be substituted at the beginning of graphql request url (default: `'/'`)
|
|
72
73
|
- `configs` {Array<GraphQLRequestConfig>} configs for mock requests, [read](#configs)
|
|
74
|
+
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
73
75
|
- `staticPath?` {StaticPath} entity for working with static files, [read](#static-path)
|
|
74
76
|
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
75
77
|
- `cors?` {Cors} CORS settings object (default: `CORS is turn off`), [read](#cors)
|
|
@@ -78,7 +80,7 @@ $ npx mcs
|
|
|
78
80
|
|
|
79
81
|
### Configs
|
|
80
82
|
|
|
81
|
-
Configs are the fundamental part of the mock server. These configs are easy to fill and maintain. Config entities is an object with which you can emulate various application behaviors. You can specify `headers` | `query` | `params` | `body` for Rest request or `headers` | `query` | `variables` for GraphQL request to define what contract data you need to get. Using this mechanism, you can easily simulate the operation of the server and emulate various cases
|
|
83
|
+
Configs are the fundamental part of the mock server. These configs are easy to fill and maintain. Config entities is an object with which you can emulate various application behaviors. You can specify `headers` | `cookies` | `query` | `params` | `body` for Rest request or `headers` | `cookies` | `query` | `variables` for GraphQL request to define what contract data you need to get. Using this mechanism, you can easily simulate the operation of the server and emulate various cases
|
|
82
84
|
|
|
83
85
|
##### Rest request config
|
|
84
86
|
|
|
@@ -86,7 +88,7 @@ Configs are the fundamental part of the mock server. These configs are easy to f
|
|
|
86
88
|
- `method` {GET | POST | DELETE | PUT | PATCH} rest api method
|
|
87
89
|
- `routes` {RestRouteConfig[]} request routes
|
|
88
90
|
- `data` {any} mock data of request
|
|
89
|
-
- `entities?` Object<headers | query | params | body> object that helps in data retrieval
|
|
91
|
+
- `entities?` Object<headers | cookies | query | params | body> object that helps in data retrieval
|
|
90
92
|
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
91
93
|
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
92
94
|
|
|
@@ -96,7 +98,7 @@ Configs are the fundamental part of the mock server. These configs are easy to f
|
|
|
96
98
|
- `operationName` {string} graphql operation name
|
|
97
99
|
- `routes` {GraphQLRouteConfig[]} request routes
|
|
98
100
|
- `data` {any} mock data of request
|
|
99
|
-
- `entities?` Object<headers | query | variables> object that helps in data retrieval
|
|
101
|
+
- `entities?` Object<headers | cookies | query | variables> object that helps in data retrieval
|
|
100
102
|
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
101
103
|
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
102
104
|
|
|
@@ -230,6 +232,13 @@ Functions to change request or response parameters
|
|
|
230
232
|
|
|
231
233
|
- `params`
|
|
232
234
|
- `request` request object
|
|
235
|
+
- `setDelay` (delay) => Promise<void>
|
|
236
|
+
- `delay` {number} milliseconds of delay time
|
|
237
|
+
- `getHeader` (field) => string | number | string[] | undefined
|
|
238
|
+
- `field` {string} name of response header
|
|
239
|
+
- `getHeaders` () => Record<string | number | string[] | undefined>
|
|
240
|
+
- `getCookie` (name) => string | undefined
|
|
241
|
+
- `name` {string} name of cookie
|
|
233
242
|
|
|
234
243
|
##### Response
|
|
235
244
|
|
|
@@ -238,19 +247,24 @@ Functions to change request or response parameters
|
|
|
238
247
|
- `request` request object
|
|
239
248
|
- `response` response object
|
|
240
249
|
- `setDelay` (delay) => Promise<void>
|
|
241
|
-
- `delay` {number}
|
|
250
|
+
- `delay` {number} milliseconds of delay time
|
|
242
251
|
- `setStatusCode` (statusCode) => void
|
|
243
252
|
- `statusCode` {number} status code for response
|
|
244
|
-
- `setHeader` (
|
|
245
|
-
- `
|
|
253
|
+
- `setHeader` (field, value) => void
|
|
254
|
+
- `field` {string} name of response header
|
|
246
255
|
- `value` {string | string[] | undefined} value of response header
|
|
247
|
-
- `appendHeader` (
|
|
248
|
-
- `
|
|
256
|
+
- `appendHeader` (field, value) => void
|
|
257
|
+
- `field` {string} name of response header
|
|
249
258
|
- `value` {string | string[] | undefined} value of response header
|
|
259
|
+
- `getHeader` (field) => string | number | string[] | undefined
|
|
260
|
+
- `field` {string} name of response header
|
|
261
|
+
- `getHeaders` () => Record<string | number | string[] | undefined>
|
|
250
262
|
- `setCookie` (name, value, options) => void
|
|
251
263
|
- `name` {string} name of cookie
|
|
252
264
|
- `value` {string} value of cookie
|
|
253
265
|
- `options` {[CookieOptions](https://expressjs.com/en/resources/middleware/cookie-session.html) | undefined} cookie options (like path, expires, etc.)
|
|
266
|
+
- `getCookie` (name) => string | undefined
|
|
267
|
+
- `name` {string} name of cookie
|
|
254
268
|
- `clearCookie` (name, options) => void
|
|
255
269
|
- `name` {string} name of cookie
|
|
256
270
|
- `options` {[CookieOptions](https://expressjs.com/en/resources/middleware/cookie-session.html) | undefined} cookie options (like path, expires, etc.)
|
|
@@ -258,19 +272,22 @@ Functions to change request or response parameters
|
|
|
258
272
|
- `filename` {string} name of file in 'Content-Disposition' header
|
|
259
273
|
|
|
260
274
|
## CLI usage
|
|
275
|
+
|
|
261
276
|
```
|
|
262
277
|
mcs [options]
|
|
263
278
|
|
|
264
279
|
Options:
|
|
265
|
-
--baseUrl, -b Set base url
|
|
266
|
-
--port, -p Set port
|
|
280
|
+
--baseUrl, -b Set base url (default: '/')
|
|
281
|
+
--port, -p Set port (default: 31299)
|
|
267
282
|
--staticPath, -s Set static path
|
|
283
|
+
--config, -c Set path to config file (default: './mock-server.config.(?:ts|mts|cts|js|mjs|cjs)')
|
|
284
|
+
--watch, -w Enables server restart after config file changes (default: false)
|
|
268
285
|
|
|
269
286
|
--version, -v Show version number
|
|
270
287
|
--help, -h Show help
|
|
271
|
-
|
|
288
|
+
|
|
272
289
|
Examples:
|
|
273
|
-
mcs --baseurl /base/url --port 3000
|
|
290
|
+
mcs --baseurl /base/url --port 3000 --config ./path/to/config.ts -w
|
|
274
291
|
mcs --help
|
|
275
292
|
```
|
|
276
293
|
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.build = void 0;
|
|
4
|
+
const esbuild_1 = require("esbuild");
|
|
5
|
+
const helpers_1 = require("./helpers");
|
|
6
|
+
const run_1 = require("./run");
|
|
7
|
+
const build = async (argv) => {
|
|
8
|
+
const configFilePath = (0, helpers_1.resolveConfigFilePath)(argv.config);
|
|
9
|
+
if (!configFilePath) {
|
|
10
|
+
throw new Error('Cannot find config file mock-server.config.(ts|mts|cts|js|mjs|cjs)');
|
|
11
|
+
}
|
|
12
|
+
const buildOptions = {
|
|
13
|
+
entryPoints: [configFilePath],
|
|
14
|
+
bundle: true,
|
|
15
|
+
platform: 'node',
|
|
16
|
+
target: 'esnext',
|
|
17
|
+
minifySyntax: true,
|
|
18
|
+
minify: true,
|
|
19
|
+
write: false,
|
|
20
|
+
metafile: false,
|
|
21
|
+
logLevel: 'info',
|
|
22
|
+
plugins: []
|
|
23
|
+
};
|
|
24
|
+
if (argv.watch) {
|
|
25
|
+
const watchPlugin = {
|
|
26
|
+
name: 'watch',
|
|
27
|
+
setup: (build) => {
|
|
28
|
+
let instance;
|
|
29
|
+
build.onStart(() => {
|
|
30
|
+
instance?.destroy();
|
|
31
|
+
});
|
|
32
|
+
build.onEnd((result) => {
|
|
33
|
+
if (!result.errors.length) {
|
|
34
|
+
const mockConfig = (0, helpers_1.resolveConfigFile)(result.outputFiles[0].text);
|
|
35
|
+
instance = (0, run_1.run)(mockConfig, argv);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
buildOptions.plugins.push(watchPlugin);
|
|
41
|
+
const ctx = await (0, esbuild_1.context)(buildOptions);
|
|
42
|
+
ctx.watch();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const { outputFiles } = await (0, esbuild_1.build)(buildOptions);
|
|
46
|
+
const mockConfig = (0, helpers_1.resolveConfigFile)(outputFiles[0].text);
|
|
47
|
+
(0, run_1.run)(mockConfig, argv);
|
|
48
|
+
};
|
|
49
|
+
exports.build = build;
|
package/dist/bin/cli.js
CHANGED
|
@@ -6,9 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.cli = void 0;
|
|
7
7
|
const yargs_1 = __importDefault(require("yargs"));
|
|
8
8
|
const helpers_1 = require("yargs/helpers");
|
|
9
|
-
const
|
|
9
|
+
const build_1 = require("./build");
|
|
10
10
|
const cli = () => {
|
|
11
11
|
const argv = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
12
|
+
.usage('mcs [options]')
|
|
13
|
+
.epilogue('More info: https://github.com/siberiacancode/mock-config-server#readme')
|
|
12
14
|
.options({
|
|
13
15
|
baseUrl: {
|
|
14
16
|
alias: 'b',
|
|
@@ -24,6 +26,16 @@ const cli = () => {
|
|
|
24
26
|
alias: 's',
|
|
25
27
|
description: 'Set static path for mock server',
|
|
26
28
|
type: 'string'
|
|
29
|
+
},
|
|
30
|
+
config: {
|
|
31
|
+
alias: 'c',
|
|
32
|
+
description: 'Set path to config file',
|
|
33
|
+
type: 'string'
|
|
34
|
+
},
|
|
35
|
+
watch: {
|
|
36
|
+
alias: 'w',
|
|
37
|
+
description: 'Enables server restart after config file changes',
|
|
38
|
+
type: 'boolean'
|
|
27
39
|
}
|
|
28
40
|
})
|
|
29
41
|
.version()
|
|
@@ -31,6 +43,6 @@ const cli = () => {
|
|
|
31
43
|
.help()
|
|
32
44
|
.alias('help', 'h')
|
|
33
45
|
.parse();
|
|
34
|
-
(0,
|
|
46
|
+
(0, build_1.build)(argv);
|
|
35
47
|
};
|
|
36
48
|
exports.cli = cli;
|
|
@@ -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("./resolveConfigFile"), exports);
|
|
18
|
+
__exportStar(require("./resolveConfigFilePath"), exports);
|
|
19
|
+
__exportStar(require("./resolveExportsFromSourceCode"), exports);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveConfigFile = void 0;
|
|
4
|
+
const helpers_1 = require("../../src/utils/helpers");
|
|
5
|
+
const resolveExportsFromSourceCode_1 = require("./resolveExportsFromSourceCode");
|
|
6
|
+
const resolveConfigFile = (configSourceCode) => {
|
|
7
|
+
if (!configSourceCode) {
|
|
8
|
+
throw new Error('Cannot handle source code of mock-server.config.(ts|js)');
|
|
9
|
+
}
|
|
10
|
+
const mockServerConfigExports = (0, resolveExportsFromSourceCode_1.resolveExportsFromSourceCode)(configSourceCode);
|
|
11
|
+
const mockServerConfig = mockServerConfigExports.default;
|
|
12
|
+
if (!mockServerConfig) {
|
|
13
|
+
throw new Error('Cannot handle exports of mock-server.config.(ts|js)');
|
|
14
|
+
}
|
|
15
|
+
if (!(0, helpers_1.isPlainObject)(mockServerConfig)) {
|
|
16
|
+
throw new Error('configuration should be plain object; see our doc (https://www.npmjs.com/package/mock-config-server) for more information');
|
|
17
|
+
}
|
|
18
|
+
return mockServerConfig;
|
|
19
|
+
};
|
|
20
|
+
exports.resolveConfigFile = resolveConfigFile;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const resolveConfigFilePath: (cliConfigFilePath?: string) => string | undefined;
|
|
@@ -0,0 +1,39 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.resolveConfigFilePath = void 0;
|
|
30
|
+
const fs = __importStar(require("fs"));
|
|
31
|
+
const path_1 = __importDefault(require("path"));
|
|
32
|
+
const resolveConfigFilePath = (cliConfigFilePath) => {
|
|
33
|
+
const appPath = process.cwd();
|
|
34
|
+
if (cliConfigFilePath)
|
|
35
|
+
return path_1.default.resolve(appPath, cliConfigFilePath);
|
|
36
|
+
const configFileNameRegex = /mock-server.config.(?:ts|mts|cts|js|mjs|cjs)/;
|
|
37
|
+
return fs.readdirSync(appPath).find((fileName) => configFileNameRegex.test(fileName));
|
|
38
|
+
};
|
|
39
|
+
exports.resolveConfigFilePath = resolveConfigFilePath;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const resolveConfigFilePath: (cliConfigFilePath?: string) => string | undefined;
|
|
@@ -0,0 +1,39 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.resolveConfigFilePath = void 0;
|
|
30
|
+
const fs = __importStar(require("fs"));
|
|
31
|
+
const path_1 = __importDefault(require("path"));
|
|
32
|
+
const resolveConfigFilePath = (cliConfigFilePath) => {
|
|
33
|
+
const appPath = process.cwd();
|
|
34
|
+
if (cliConfigFilePath)
|
|
35
|
+
return path_1.default.resolve(appPath, cliConfigFilePath);
|
|
36
|
+
const configFileNameRegex = /mock-server.config.(?:ts|mts|cts|js|mjs|cjs)/;
|
|
37
|
+
return fs.readdirSync(appPath).find((fileName) => configFileNameRegex.test(fileName));
|
|
38
|
+
};
|
|
39
|
+
exports.resolveConfigFilePath = resolveConfigFilePath;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import type { MockServerConfig, MockServerConfigArgv } from '../src';
|
|
4
|
+
export declare const run: (mockConfig: MockServerConfig, argv: MockServerConfigArgv) => (import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse> & {
|
|
5
|
+
destroy: (callback?: ((err?: Error | undefined) => void) | undefined) => import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
|
|
6
|
+
}) | undefined;
|
package/dist/bin/run.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.run = void 0;
|
|
5
|
+
const server_1 = require("../src/server");
|
|
6
|
+
const validateMockServerConfig_1 = require("./validateMockServerConfig/validateMockServerConfig");
|
|
7
|
+
const run = (mockConfig, argv) => {
|
|
8
|
+
try {
|
|
9
|
+
const mergedMockServerConfig = { ...mockConfig, ...argv };
|
|
10
|
+
(0, validateMockServerConfig_1.validateMockServerConfig)(mergedMockServerConfig);
|
|
11
|
+
return (0, server_1.startMockServer)(mergedMockServerConfig);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
console.error(error.message);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
exports.run = run;
|
package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.js
CHANGED
|
@@ -4,15 +4,15 @@ exports.validateRoutes = void 0;
|
|
|
4
4
|
const helpers_1 = require("../../../../src/utils/helpers");
|
|
5
5
|
const validateInterceptors_1 = require("../../validateInterceptors/validateInterceptors");
|
|
6
6
|
const ALLOWED_ENTITIES_BY_OPERATION_TYPE = {
|
|
7
|
-
query: ['headers', 'query', 'variables'],
|
|
8
|
-
mutation: ['headers', 'query', 'variables']
|
|
7
|
+
query: ['headers', 'cookies', 'query', 'variables'],
|
|
8
|
+
mutation: ['headers', 'cookies', 'query', 'variables']
|
|
9
9
|
};
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
if (
|
|
13
|
-
Object.entries(
|
|
14
|
-
if (typeof
|
|
15
|
-
throw new Error(`${entity}.${
|
|
10
|
+
const validateHeadersOrCookiesOrQuery = (headersOrCookiesOrQuery, entity) => {
|
|
11
|
+
const isHeadersOrCookiesOrQueryObject = (0, helpers_1.isPlainObject)(headersOrCookiesOrQuery);
|
|
12
|
+
if (isHeadersOrCookiesOrQueryObject) {
|
|
13
|
+
Object.entries(headersOrCookiesOrQuery).forEach(([headerOrCookieOrQueryKey, headerOrCookieOrQueryValue]) => {
|
|
14
|
+
if (typeof headerOrCookieOrQueryValue !== 'string') {
|
|
15
|
+
throw new Error(`${entity}.${headerOrCookieOrQueryKey}`);
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
18
|
return;
|
|
@@ -27,10 +27,10 @@ const validateEntities = (entities, operationType) => {
|
|
|
27
27
|
if (!isEntityAllowed) {
|
|
28
28
|
throw new Error(`entities.${entity}`);
|
|
29
29
|
}
|
|
30
|
-
if (entity === 'headers' || entity === 'query') {
|
|
30
|
+
if (entity === 'headers' || entity === 'query' || entity === 'cookies') {
|
|
31
31
|
try {
|
|
32
|
-
const
|
|
33
|
-
|
|
32
|
+
const headersOrCookiesOrQuery = entities[entity];
|
|
33
|
+
validateHeadersOrCookiesOrQuery(headersOrCookiesOrQuery, entity);
|
|
34
34
|
}
|
|
35
35
|
catch (error) {
|
|
36
36
|
throw new Error(`entities.${error.message}`);
|
package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.js
CHANGED
|
@@ -4,19 +4,19 @@ exports.validateRoutes = void 0;
|
|
|
4
4
|
const helpers_1 = require("../../../../src/utils/helpers");
|
|
5
5
|
const validateInterceptors_1 = require("../../validateInterceptors/validateInterceptors");
|
|
6
6
|
const ALLOWED_ENTITIES_BY_METHOD = {
|
|
7
|
-
get: ['headers', 'query', 'params'],
|
|
8
|
-
delete: ['headers', 'query', 'params'],
|
|
9
|
-
post: ['headers', 'query', 'params', 'body'],
|
|
10
|
-
put: ['headers', 'query', 'params', 'body'],
|
|
11
|
-
patch: ['headers', 'query', 'params', 'body'],
|
|
12
|
-
options: ['headers', 'query', 'params']
|
|
7
|
+
get: ['headers', 'cookies', 'query', 'params'],
|
|
8
|
+
delete: ['headers', 'cookies', 'query', 'params'],
|
|
9
|
+
post: ['headers', 'cookies', 'query', 'params', 'body'],
|
|
10
|
+
put: ['headers', 'cookies', 'query', 'params', 'body'],
|
|
11
|
+
patch: ['headers', 'cookies', 'query', 'params', 'body'],
|
|
12
|
+
options: ['headers', 'cookies', 'query', 'params']
|
|
13
13
|
};
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
if (
|
|
17
|
-
Object.entries(
|
|
18
|
-
if (typeof
|
|
19
|
-
throw new Error(`${entity}.${
|
|
14
|
+
const validateHeadersOrCookiesOrParams = (headersOrCookiesOrParams, entity) => {
|
|
15
|
+
const isHeadersOrCookiesOrParamsObject = (0, helpers_1.isPlainObject)(headersOrCookiesOrParams);
|
|
16
|
+
if (isHeadersOrCookiesOrParamsObject) {
|
|
17
|
+
Object.entries(headersOrCookiesOrParams).forEach(([headerOrCookieOrParamKey, headerOrCookieOrParamValue]) => {
|
|
18
|
+
if (typeof headerOrCookieOrParamValue !== 'string') {
|
|
19
|
+
throw new Error(`${entity}.${headerOrCookieOrParamKey}`);
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
return;
|
|
@@ -52,10 +52,10 @@ const validateEntities = (entities, method) => {
|
|
|
52
52
|
if (!isEntityAllowed) {
|
|
53
53
|
throw new Error(`entities.${entity}`);
|
|
54
54
|
}
|
|
55
|
-
if (entity === 'headers' || entity === 'params') {
|
|
55
|
+
if (entity === 'headers' || entity === 'params' || entity === 'cookies') {
|
|
56
56
|
try {
|
|
57
|
-
const
|
|
58
|
-
|
|
57
|
+
const headersOrCookiesOrParams = entities[entity];
|
|
58
|
+
validateHeadersOrCookiesOrParams(headersOrCookiesOrParams, entity);
|
|
59
59
|
}
|
|
60
60
|
catch (error) {
|
|
61
61
|
throw new Error(`entities.${error.message}`);
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { IRouter } from 'express';
|
|
2
|
-
import type {
|
|
3
|
-
export declare const createGraphQLRoutes: (router: IRouter,
|
|
2
|
+
import type { GraphqlConfig, Interceptors } from '../../../utils/types';
|
|
3
|
+
export declare const createGraphQLRoutes: (router: IRouter, graphqlConfig: GraphqlConfig, serverResponseInterceptors?: Interceptors['response']) => IRouter;
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createGraphQLRoutes = void 0;
|
|
4
4
|
const helpers_1 = require("../../../utils/helpers");
|
|
5
5
|
const helpers_2 = require("./helpers");
|
|
6
|
-
const createGraphQLRoutes = (router,
|
|
7
|
-
const preparedGraphQLRequestConfig = (0, helpers_2.prepareGraphQLRequestConfigs)(configs);
|
|
6
|
+
const createGraphQLRoutes = (router, graphqlConfig, serverResponseInterceptors) => {
|
|
7
|
+
const preparedGraphQLRequestConfig = (0, helpers_2.prepareGraphQLRequestConfigs)(graphqlConfig.configs);
|
|
8
8
|
const graphqlMiddleware = async (request, response, next) => {
|
|
9
9
|
const graphQLInput = (0, helpers_1.getGraphQLInput)(request);
|
|
10
10
|
if (!graphQLInput || !graphQLInput.query) {
|
|
@@ -30,13 +30,10 @@ const createGraphQLRoutes = (router, configs, interceptors) => {
|
|
|
30
30
|
if (!matchedRequestConfig) {
|
|
31
31
|
return next();
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
serverInterceptor: interceptors?.request
|
|
38
|
-
}
|
|
39
|
-
});
|
|
33
|
+
const requestInterceptor = matchedRequestConfig.interceptors?.request;
|
|
34
|
+
if (requestInterceptor) {
|
|
35
|
+
await (0, helpers_1.callRequestInterceptor)({ request, interceptor: requestInterceptor });
|
|
36
|
+
}
|
|
40
37
|
const matchedRouteConfig = matchedRequestConfig.routes.find(({ entities }) => {
|
|
41
38
|
if (!entities)
|
|
42
39
|
return true;
|
|
@@ -53,14 +50,15 @@ const createGraphQLRoutes = (router, configs, interceptors) => {
|
|
|
53
50
|
const matchedRouteConfigData = typeof matchedRouteConfig.data === 'function'
|
|
54
51
|
? await matchedRouteConfig.data(request, matchedRouteConfig.entities ?? {})
|
|
55
52
|
: matchedRouteConfig.data;
|
|
56
|
-
const data = (0, helpers_1.callResponseInterceptors)({
|
|
53
|
+
const data = await (0, helpers_1.callResponseInterceptors)({
|
|
57
54
|
data: matchedRouteConfigData,
|
|
58
55
|
request,
|
|
59
56
|
response,
|
|
60
57
|
interceptors: {
|
|
61
58
|
routeInterceptor: matchedRouteConfig.interceptors?.response,
|
|
62
59
|
requestInterceptor: matchedRequestConfig.interceptors?.response,
|
|
63
|
-
|
|
60
|
+
apiInterceptor: graphqlConfig.interceptors?.response,
|
|
61
|
+
serverInterceptor: serverResponseInterceptors
|
|
64
62
|
}
|
|
65
63
|
});
|
|
66
64
|
// ✅ important:
|
|
@@ -7,9 +7,11 @@ const calculateRouteConfigWeight = (graphQLRouteConfig) => {
|
|
|
7
7
|
if (!entities)
|
|
8
8
|
return 0;
|
|
9
9
|
let routeConfigWeight = 0;
|
|
10
|
-
const { headers, query, variables } = entities;
|
|
10
|
+
const { headers, cookies, query, variables } = entities;
|
|
11
11
|
if (headers)
|
|
12
12
|
routeConfigWeight += Object.keys(headers).length;
|
|
13
|
+
if (cookies)
|
|
14
|
+
routeConfigWeight += Object.keys(cookies).length;
|
|
13
15
|
if (query)
|
|
14
16
|
routeConfigWeight += Object.keys(query).length;
|
|
15
17
|
if (variables)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cookieParseMiddleware = void 0;
|
|
4
|
+
const helpers_1 = require("./helpers");
|
|
5
|
+
const cookieParseMiddleware = (server) => {
|
|
6
|
+
server.use((request, _response, next) => {
|
|
7
|
+
if (request.headers.cookie) {
|
|
8
|
+
request.cookies = (0, helpers_1.parseCookie)(request.headers.cookie);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
request.cookies = {};
|
|
12
|
+
}
|
|
13
|
+
return next();
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
exports.cookieParseMiddleware = cookieParseMiddleware;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './parseCookie/parseCookie';
|
|
@@ -0,0 +1,17 @@
|
|
|
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("./parseCookie/parseCookie"), exports);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseCookie = void 0;
|
|
4
|
+
const parseCookie = (cookieHeader) => {
|
|
5
|
+
if (!cookieHeader)
|
|
6
|
+
return {};
|
|
7
|
+
const cookies = {};
|
|
8
|
+
const cookiePairs = cookieHeader.split(';');
|
|
9
|
+
cookiePairs.forEach((cookie) => {
|
|
10
|
+
const [name, value] = cookie.trim().split('=');
|
|
11
|
+
if (!name)
|
|
12
|
+
return;
|
|
13
|
+
cookies[name.trim()] = value?.trim() ?? '';
|
|
14
|
+
});
|
|
15
|
+
return cookies;
|
|
16
|
+
};
|
|
17
|
+
exports.parseCookie = parseCookie;
|