mock-config-server 2.2.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/README.md +9 -4
- 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 +1 -1
- 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/README.md
CHANGED
|
@@ -80,7 +80,7 @@ $ npx mock-config-server
|
|
|
80
80
|
|
|
81
81
|
### Configs
|
|
82
82
|
|
|
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` | `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
|
|
84
84
|
|
|
85
85
|
##### Rest request config
|
|
86
86
|
|
|
@@ -88,7 +88,7 @@ Configs are the fundamental part of the mock server. These configs are easy to f
|
|
|
88
88
|
- `method` {GET | POST | DELETE | PUT | PATCH} rest api method
|
|
89
89
|
- `routes` {RestRouteConfig[]} request routes
|
|
90
90
|
- `data` {any} mock data of request
|
|
91
|
-
- `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
|
|
92
92
|
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
93
93
|
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
94
94
|
|
|
@@ -98,7 +98,7 @@ Configs are the fundamental part of the mock server. These configs are easy to f
|
|
|
98
98
|
- `operationName` {string} graphql operation name
|
|
99
99
|
- `routes` {GraphQLRouteConfig[]} request routes
|
|
100
100
|
- `data` {any} mock data of request
|
|
101
|
-
- `entities?` Object<headers | query | variables> object that helps in data retrieval
|
|
101
|
+
- `entities?` Object<headers | cookies | query | variables> object that helps in data retrieval
|
|
102
102
|
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
103
103
|
- `interceptors?` {Interceptors} functions to change request or response parameters, [read](#interceptors)
|
|
104
104
|
|
|
@@ -237,7 +237,7 @@ Functions to change request or response parameters
|
|
|
237
237
|
- `getHeader` (field) => string | number | string[] | undefined
|
|
238
238
|
- `field` {string} name of response header
|
|
239
239
|
- `getHeaders` () => Record<string | number | string[] | undefined>
|
|
240
|
-
- `
|
|
240
|
+
- `getCookie` (name) => string | undefined
|
|
241
241
|
- `name` {string} name of cookie
|
|
242
242
|
|
|
243
243
|
##### Response
|
|
@@ -256,10 +256,15 @@ Functions to change request or response parameters
|
|
|
256
256
|
- `appendHeader` (field, value) => void
|
|
257
257
|
- `field` {string} name of response header
|
|
258
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>
|
|
259
262
|
- `setCookie` (name, value, options) => void
|
|
260
263
|
- `name` {string} name of cookie
|
|
261
264
|
- `value` {string} value of cookie
|
|
262
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
|
|
263
268
|
- `clearCookie` (name, options) => void
|
|
264
269
|
- `name` {string} name of cookie
|
|
265
270
|
- `options` {[CookieOptions](https://expressjs.com/en/resources/middleware/cookie-session.html) | undefined} cookie options (like path, expires, etc.)
|
|
@@ -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;
|
|
@@ -4,19 +4,19 @@ exports.corsMiddleware = void 0;
|
|
|
4
4
|
const constants_1 = require("../../../utils/constants");
|
|
5
5
|
const helpers_1 = require("./helpers");
|
|
6
6
|
const corsMiddleware = (server, cors) => {
|
|
7
|
-
server.use(async (
|
|
7
|
+
server.use(async (request, response, next) => {
|
|
8
8
|
if (Array.isArray(cors.origin) && !cors.origin.length) {
|
|
9
9
|
return next();
|
|
10
10
|
}
|
|
11
11
|
let allowedOrigins = [];
|
|
12
12
|
if (typeof cors.origin === 'function') {
|
|
13
|
-
const origins = await cors.origin(
|
|
13
|
+
const origins = await cors.origin(request);
|
|
14
14
|
allowedOrigins = (0, helpers_1.getAllowedOrigins)(origins);
|
|
15
15
|
}
|
|
16
16
|
else {
|
|
17
17
|
allowedOrigins = (0, helpers_1.getAllowedOrigins)(cors.origin);
|
|
18
18
|
}
|
|
19
|
-
const { origin } =
|
|
19
|
+
const { origin } = request.headers;
|
|
20
20
|
if (!allowedOrigins?.length || !origin) {
|
|
21
21
|
return next();
|
|
22
22
|
}
|
|
@@ -27,15 +27,15 @@ const corsMiddleware = (server, cors) => {
|
|
|
27
27
|
return allowedOrigin === origin;
|
|
28
28
|
});
|
|
29
29
|
if (isRequestOriginAllowed) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return
|
|
30
|
+
response.setHeader('Access-Control-Allow-Origin', origin);
|
|
31
|
+
response.setHeader('Access-Control-Allow-Credentials', `${cors.credentials ?? constants_1.DEFAULT.CORS.CREDENTIALS}`);
|
|
32
|
+
response.setHeader('Access-Control-Expose-Headers', cors.exposedHeaders ?? constants_1.DEFAULT.CORS.EXPOSED_HEADERS);
|
|
33
|
+
if (request.method === 'OPTIONS') {
|
|
34
|
+
response.setHeader('Access-Control-Allow-Methods', cors.methods ?? constants_1.DEFAULT.CORS.METHODS);
|
|
35
|
+
response.setHeader('Access-Control-Allow-Headers', cors.allowedHeaders ?? constants_1.DEFAULT.CORS.ALLOWED_HEADERS);
|
|
36
|
+
response.setHeader('Access-Control-Max-Age', cors.maxAge ?? constants_1.DEFAULT.CORS.MAX_AGE);
|
|
37
|
+
response.sendStatus(204);
|
|
38
|
+
return response.end();
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
return next();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.destroyerMiddleware = void 0;
|
|
4
|
+
const destroyerMiddleware = (server) => {
|
|
5
|
+
const serverWithDestroyer = server;
|
|
6
|
+
const connections = {};
|
|
7
|
+
serverWithDestroyer.on('connection', (connection) => {
|
|
8
|
+
const key = `${connection.remoteAddress}:${connection.remotePort}`;
|
|
9
|
+
connections[key] = connection;
|
|
10
|
+
connection.on('close', () => {
|
|
11
|
+
delete connections[key];
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
serverWithDestroyer.destroy = (callback) => {
|
|
15
|
+
serverWithDestroyer.close(callback);
|
|
16
|
+
Object.values(connections).forEach((connection) => {
|
|
17
|
+
connection.destroy();
|
|
18
|
+
});
|
|
19
|
+
return serverWithDestroyer;
|
|
20
|
+
};
|
|
21
|
+
return serverWithDestroyer;
|
|
22
|
+
};
|
|
23
|
+
exports.destroyerMiddleware = destroyerMiddleware;
|
|
@@ -2,3 +2,6 @@ export * from './staticMiddleware/staticMiddleware';
|
|
|
2
2
|
export * from './corsMiddleware/corsMiddleware';
|
|
3
3
|
export * from './noCorsMiddleware/noCorsMiddleware';
|
|
4
4
|
export * from './notFoundMiddleware/notFoundMiddleware';
|
|
5
|
+
export * from './requestInterceptorMiddleware/requestInterceptorMiddleware';
|
|
6
|
+
export * from './destroyerMiddleware/destroyerMiddleware';
|
|
7
|
+
export * from './cookieParseMiddleware/cookieParseMiddleware';
|
|
@@ -18,3 +18,6 @@ __exportStar(require("./staticMiddleware/staticMiddleware"), exports);
|
|
|
18
18
|
__exportStar(require("./corsMiddleware/corsMiddleware"), exports);
|
|
19
19
|
__exportStar(require("./noCorsMiddleware/noCorsMiddleware"), exports);
|
|
20
20
|
__exportStar(require("./notFoundMiddleware/notFoundMiddleware"), exports);
|
|
21
|
+
__exportStar(require("./requestInterceptorMiddleware/requestInterceptorMiddleware"), exports);
|
|
22
|
+
__exportStar(require("./destroyerMiddleware/destroyerMiddleware"), exports);
|
|
23
|
+
__exportStar(require("./cookieParseMiddleware/cookieParseMiddleware"), exports);
|