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.
Files changed (63) hide show
  1. package/README.md +9 -4
  2. package/dist/bin/build.d.ts +2 -0
  3. package/dist/bin/build.js +49 -0
  4. package/dist/bin/cli.js +14 -2
  5. package/dist/bin/helpers/index.d.ts +3 -0
  6. package/dist/bin/helpers/index.js +19 -0
  7. package/dist/bin/helpers/resolveConfigFile.d.ts +2 -0
  8. package/dist/bin/helpers/resolveConfigFile.js +20 -0
  9. package/dist/bin/helpers/resolveConfigFilePath.d.ts +1 -0
  10. package/dist/bin/helpers/resolveConfigFilePath.js +39 -0
  11. package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.d.ts +1 -0
  12. package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.js +39 -0
  13. package/dist/bin/run.d.ts +6 -0
  14. package/dist/bin/run.js +17 -0
  15. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.js +11 -11
  16. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.js +15 -15
  17. package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.d.ts +2 -2
  18. package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.js +9 -11
  19. package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.js +3 -1
  20. package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.d.ts +2 -0
  21. package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.js +16 -0
  22. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.d.ts +1 -0
  23. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.js +17 -0
  24. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.d.ts +3 -0
  25. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.js +17 -0
  26. package/dist/src/core/middlewares/corsMiddleware/corsMiddleware.js +12 -12
  27. package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.d.ts +7 -0
  28. package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.js +23 -0
  29. package/dist/src/core/middlewares/index.d.ts +3 -0
  30. package/dist/src/core/middlewares/index.js +3 -0
  31. package/dist/src/core/middlewares/noCorsMiddleware/noCorsMiddleware.js +13 -13
  32. package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.d.ts +3 -0
  33. package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.js +11 -0
  34. package/dist/src/core/rest/createRestRoutes/createRestRoutes.d.ts +2 -2
  35. package/dist/src/core/rest/createRestRoutes/createRestRoutes.js +9 -11
  36. package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.js +3 -1
  37. package/dist/src/server/createMockServer/createMockServer.js +15 -2
  38. package/dist/src/server/index.d.ts +1 -1
  39. package/dist/src/server/index.js +1 -1
  40. package/dist/src/server/startMockServer/startMockServer.d.ts +4 -1
  41. package/dist/src/server/startMockServer/startMockServer.js +4 -1
  42. package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.d.ts +8 -0
  43. package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.js +19 -0
  44. package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.d.ts +6 -5
  45. package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.js +20 -23
  46. package/dist/src/utils/helpers/interceptors/helpers/setDelay.d.ts +1 -0
  47. package/dist/src/utils/helpers/interceptors/helpers/setDelay.js +8 -0
  48. package/dist/src/utils/helpers/interceptors/index.d.ts +1 -1
  49. package/dist/src/utils/helpers/interceptors/index.js +1 -1
  50. package/dist/src/utils/helpers/sleep.d.ts +1 -1
  51. package/dist/src/utils/helpers/sleep.js +2 -2
  52. package/dist/src/utils/types/graphql.d.ts +1 -1
  53. package/dist/src/utils/types/interceptors.d.ts +15 -6
  54. package/dist/src/utils/types/rest.d.ts +7 -7
  55. package/dist/src/utils/types/server.d.ts +19 -9
  56. package/dist/src/utils/types/values.d.ts +1 -0
  57. package/package.json +1 -1
  58. package/dist/bin/start.d.ts +0 -3
  59. package/dist/bin/start.js +0 -73
  60. package/dist/src/utils/helpers/interceptors/callRequestInterceptors/callRequestInterceptors.d.ts +0 -12
  61. package/dist/src/utils/helpers/interceptors/callRequestInterceptors/callRequestInterceptors.js +0 -13
  62. /package/dist/bin/{resolveExportsFromSourceCode → helpers}/resolveExportsFromSourceCode.d.ts +0 -0
  63. /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
- - `setCookie` (name) => string | undefined
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,2 @@
1
+ import type { MockServerConfigArgv } from '../src/utils/types';
2
+ export declare const build: (argv: MockServerConfigArgv) => Promise<void>;
@@ -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 start_1 = require("./start");
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, start_1.start)(argv);
46
+ (0, build_1.build)(argv);
35
47
  };
36
48
  exports.cli = cli;
@@ -0,0 +1,3 @@
1
+ export * from './resolveConfigFile';
2
+ export * from './resolveConfigFilePath';
3
+ export * from './resolveExportsFromSourceCode';
@@ -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,2 @@
1
+ import type { MockServerConfig } from '../../src/utils/types';
2
+ export declare const resolveConfigFile: (configSourceCode: string) => MockServerConfig;
@@ -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;
@@ -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;
@@ -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 validateHeadersOrQuery = (headersOrQuery, entity) => {
11
- const isHeadersOrQueryObject = (0, helpers_1.isPlainObject)(headersOrQuery);
12
- if (isHeadersOrQueryObject) {
13
- Object.entries(headersOrQuery).forEach(([headerOrQueryKey, headerOrQueryValue]) => {
14
- if (typeof headerOrQueryValue !== 'string') {
15
- throw new Error(`${entity}.${headerOrQueryKey}`);
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 headersOrQuery = entities[entity];
33
- validateHeadersOrQuery(headersOrQuery, entity);
32
+ const headersOrCookiesOrQuery = entities[entity];
33
+ validateHeadersOrCookiesOrQuery(headersOrCookiesOrQuery, entity);
34
34
  }
35
35
  catch (error) {
36
36
  throw new Error(`entities.${error.message}`);
@@ -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 validateHeadersOrParams = (headersOrParams, entity) => {
15
- const isHeadersOrParamsObject = (0, helpers_1.isPlainObject)(headersOrParams);
16
- if (isHeadersOrParamsObject) {
17
- Object.entries(headersOrParams).forEach(([headerOrParamKey, headerOrParamValue]) => {
18
- if (typeof headerOrParamValue !== 'string') {
19
- throw new Error(`${entity}.${headerOrParamKey}`);
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 headersOrParams = entities[entity];
58
- validateHeadersOrParams(headersOrParams, entity);
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 { GraphQLRequestConfig, Interceptors } from '../../../utils/types';
3
- export declare const createGraphQLRoutes: (router: IRouter, configs: GraphQLRequestConfig[], interceptors?: Interceptors) => 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, configs, interceptors) => {
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
- (0, helpers_1.callRequestInterceptors)({
34
- request,
35
- interceptors: {
36
- requestInterceptor: matchedRequestConfig.interceptors?.request,
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
- serverInterceptor: interceptors?.response
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,2 @@
1
+ import type { Express } from 'express';
2
+ export declare const cookieParseMiddleware: (server: Express) => void;
@@ -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,3 @@
1
+ type Cookies = Record<string, string>;
2
+ export declare const parseCookie: (cookieHeader: string) => Cookies;
3
+ export {};
@@ -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 (req, res, next) => {
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(req);
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 } = req.headers;
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
- res.setHeader('Access-Control-Allow-Origin', origin);
31
- res.setHeader('Access-Control-Allow-Credentials', `${cors.credentials ?? constants_1.DEFAULT.CORS.CREDENTIALS}`);
32
- res.setHeader('Access-Control-Expose-Headers', cors.exposedHeaders ?? constants_1.DEFAULT.CORS.EXPOSED_HEADERS);
33
- if (req.method === 'OPTIONS') {
34
- res.setHeader('Access-Control-Allow-Methods', cors.methods ?? constants_1.DEFAULT.CORS.METHODS);
35
- res.setHeader('Access-Control-Allow-Headers', cors.allowedHeaders ?? constants_1.DEFAULT.CORS.ALLOWED_HEADERS);
36
- res.setHeader('Access-Control-Max-Age', cors.maxAge ?? constants_1.DEFAULT.CORS.MAX_AGE);
37
- res.sendStatus(204);
38
- return res.end();
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,7 @@
1
+ /// <reference types="node" />
2
+ import type { Server } from 'http';
3
+ type ServerWithDestroyer = Server & {
4
+ destroy: Server['close'];
5
+ };
6
+ export declare const destroyerMiddleware: (server: Server) => ServerWithDestroyer;
7
+ export {};
@@ -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);