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.
Files changed (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +32 -15
  3. package/dist/bin/build.d.ts +2 -0
  4. package/dist/bin/build.js +49 -0
  5. package/dist/bin/cli.js +14 -2
  6. package/dist/bin/helpers/index.d.ts +3 -0
  7. package/dist/bin/helpers/index.js +19 -0
  8. package/dist/bin/helpers/resolveConfigFile.d.ts +2 -0
  9. package/dist/bin/helpers/resolveConfigFile.js +20 -0
  10. package/dist/bin/helpers/resolveConfigFilePath.d.ts +1 -0
  11. package/dist/bin/helpers/resolveConfigFilePath.js +39 -0
  12. package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.d.ts +1 -0
  13. package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.js +39 -0
  14. package/dist/bin/run.d.ts +6 -0
  15. package/dist/bin/run.js +17 -0
  16. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.js +11 -11
  17. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.js +15 -15
  18. package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.d.ts +2 -2
  19. package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.js +9 -11
  20. package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.js +3 -1
  21. package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.d.ts +2 -0
  22. package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.js +16 -0
  23. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.d.ts +1 -0
  24. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.js +17 -0
  25. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.d.ts +3 -0
  26. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.js +17 -0
  27. package/dist/src/core/middlewares/corsMiddleware/corsMiddleware.js +12 -12
  28. package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.d.ts +7 -0
  29. package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.js +23 -0
  30. package/dist/src/core/middlewares/index.d.ts +3 -0
  31. package/dist/src/core/middlewares/index.js +3 -0
  32. package/dist/src/core/middlewares/noCorsMiddleware/noCorsMiddleware.js +13 -13
  33. package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.d.ts +3 -0
  34. package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.js +11 -0
  35. package/dist/src/core/rest/createRestRoutes/createRestRoutes.d.ts +2 -2
  36. package/dist/src/core/rest/createRestRoutes/createRestRoutes.js +9 -11
  37. package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.js +3 -1
  38. package/dist/src/server/createMockServer/createMockServer.js +15 -2
  39. package/dist/src/server/index.d.ts +1 -1
  40. package/dist/src/server/index.js +1 -1
  41. package/dist/src/server/startMockServer/startMockServer.d.ts +4 -1
  42. package/dist/src/server/startMockServer/startMockServer.js +4 -1
  43. package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.d.ts +8 -0
  44. package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.js +19 -0
  45. package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.d.ts +6 -5
  46. package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.js +20 -23
  47. package/dist/src/utils/helpers/interceptors/helpers/setDelay.d.ts +1 -0
  48. package/dist/src/utils/helpers/interceptors/helpers/setDelay.js +8 -0
  49. package/dist/src/utils/helpers/interceptors/index.d.ts +1 -1
  50. package/dist/src/utils/helpers/interceptors/index.js +1 -1
  51. package/dist/src/utils/helpers/sleep.d.ts +1 -1
  52. package/dist/src/utils/helpers/sleep.js +2 -2
  53. package/dist/src/utils/types/graphql.d.ts +1 -1
  54. package/dist/src/utils/types/interceptors.d.ts +15 -6
  55. package/dist/src/utils/types/rest.d.ts +7 -7
  56. package/dist/src/utils/types/server.d.ts +19 -9
  57. package/dist/src/utils/types/values.d.ts +1 -0
  58. package/package.json +4 -2
  59. package/dist/bin/start.d.ts +0 -3
  60. package/dist/bin/start.js +0 -73
  61. package/dist/src/utils/helpers/interceptors/callRequestInterceptors/callRequestInterceptors.d.ts +0 -12
  62. package/dist/src/utils/helpers/interceptors/callRequestInterceptors/callRequestInterceptors.js +0 -13
  63. /package/dist/bin/{resolveExportsFromSourceCode → helpers}/resolveExportsFromSourceCode.d.ts +0 -0
  64. /package/dist/bin/{resolveExportsFromSourceCode → helpers}/resolveExportsFromSourceCode.js +0 -0
@@ -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);
@@ -3,20 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.noCorsMiddleware = void 0;
4
4
  const constants_1 = require("../../../utils/constants");
5
5
  const noCorsMiddleware = (server) => {
6
- server.use((req, res, next) => {
7
- res.setHeader('Access-Control-Allow-Origin', constants_1.DEFAULT.CORS.ORIGIN);
8
- res.setHeader('Access-Control-Allow-Credentials', `${constants_1.DEFAULT.CORS.CREDENTIALS}`);
9
- res.setHeader('Access-Control-Expose-Headers', constants_1.DEFAULT.CORS.EXPOSED_HEADERS);
10
- const isPreflightRequest = req.method === 'OPTIONS' &&
11
- req.headers.origin &&
12
- req.headers['access-control-request-method'] &&
13
- req.headers['access-control-request-headers'];
6
+ server.use((request, response, next) => {
7
+ response.setHeader('Access-Control-Allow-Origin', constants_1.DEFAULT.CORS.ORIGIN);
8
+ response.setHeader('Access-Control-Allow-Credentials', `${constants_1.DEFAULT.CORS.CREDENTIALS}`);
9
+ response.setHeader('Access-Control-Expose-Headers', constants_1.DEFAULT.CORS.EXPOSED_HEADERS);
10
+ const isPreflightRequest = request.method === 'OPTIONS' &&
11
+ request.headers.origin &&
12
+ request.headers['access-control-request-method'] &&
13
+ request.headers['access-control-request-headers'];
14
14
  if (isPreflightRequest) {
15
- res.setHeader('Access-Control-Allow-Methods', constants_1.DEFAULT.CORS.METHODS);
16
- res.setHeader('Access-Control-Allow-Headers', constants_1.DEFAULT.CORS.ALLOWED_HEADERS);
17
- res.setHeader('Access-Control-Max-Age', constants_1.DEFAULT.CORS.MAX_AGE);
18
- res.sendStatus(204);
19
- return res.end();
15
+ response.setHeader('Access-Control-Allow-Methods', constants_1.DEFAULT.CORS.METHODS);
16
+ response.setHeader('Access-Control-Allow-Headers', constants_1.DEFAULT.CORS.ALLOWED_HEADERS);
17
+ response.setHeader('Access-Control-Max-Age', constants_1.DEFAULT.CORS.MAX_AGE);
18
+ response.sendStatus(204);
19
+ return response.end();
20
20
  }
21
21
  return next();
22
22
  });
@@ -0,0 +1,3 @@
1
+ import type { Express } from 'express';
2
+ import type { RequestInterceptor } from '../../../utils/types';
3
+ export declare const requestInterceptorMiddleware: (server: Express, interceptor: RequestInterceptor) => void;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requestInterceptorMiddleware = void 0;
4
+ const helpers_1 = require("../../../utils/helpers");
5
+ const requestInterceptorMiddleware = (server, interceptor) => {
6
+ server.use(async (request, _response, next) => {
7
+ await (0, helpers_1.callRequestInterceptor)({ request, interceptor });
8
+ return next();
9
+ });
10
+ };
11
+ exports.requestInterceptorMiddleware = requestInterceptorMiddleware;
@@ -1,3 +1,3 @@
1
1
  import type { IRouter } from 'express';
2
- import type { Interceptors, RestRequestConfig } from '../../../utils/types';
3
- export declare const createRestRoutes: (router: IRouter, configs: RestRequestConfig[], interceptors?: Interceptors) => IRouter;
2
+ import type { Interceptors, RestConfig } from '../../../utils/types';
3
+ export declare const createRestRoutes: (router: IRouter, restConfig: RestConfig, serverResponseInterceptors?: Interceptors['response']) => IRouter;
@@ -3,16 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createRestRoutes = void 0;
4
4
  const helpers_1 = require("../../../utils/helpers");
5
5
  const helpers_2 = require("./helpers");
6
- const createRestRoutes = (router, configs, interceptors) => {
7
- (0, helpers_2.prepareRestRequestConfigs)(configs).forEach((requestConfig) => {
6
+ const createRestRoutes = (router, restConfig, serverResponseInterceptors) => {
7
+ (0, helpers_2.prepareRestRequestConfigs)(restConfig.configs).forEach((requestConfig) => {
8
8
  router.route(requestConfig.path)[requestConfig.method](async (request, response, next) => {
9
- (0, helpers_1.callRequestInterceptors)({
10
- request,
11
- interceptors: {
12
- requestInterceptor: requestConfig.interceptors?.request,
13
- serverInterceptor: interceptors?.request
14
- }
15
- });
9
+ const requestInterceptor = requestConfig.interceptors?.request;
10
+ if (requestInterceptor) {
11
+ await (0, helpers_1.callRequestInterceptor)({ request, interceptor: requestInterceptor });
12
+ }
16
13
  const matchedRouteConfig = requestConfig.routes.find(({ entities }) => {
17
14
  if (!entities)
18
15
  return true;
@@ -24,14 +21,15 @@ const createRestRoutes = (router, configs, interceptors) => {
24
21
  const matchedRouteConfigData = typeof matchedRouteConfig.data === 'function'
25
22
  ? await matchedRouteConfig.data(request, matchedRouteConfig.entities ?? {})
26
23
  : matchedRouteConfig.data;
27
- const data = (0, helpers_1.callResponseInterceptors)({
24
+ const data = await (0, helpers_1.callResponseInterceptors)({
28
25
  data: matchedRouteConfigData,
29
26
  request,
30
27
  response,
31
28
  interceptors: {
32
29
  routeInterceptor: matchedRouteConfig.interceptors?.response,
33
30
  requestInterceptor: requestConfig.interceptors?.response,
34
- serverInterceptor: interceptors?.response
31
+ apiInterceptor: restConfig.interceptors?.response,
32
+ serverInterceptor: serverResponseInterceptors
35
33
  }
36
34
  });
37
35
  // ✅ important:
@@ -7,9 +7,11 @@ const calculateRouteConfigWeight = (restRouteConfig) => {
7
7
  if (!entities)
8
8
  return 0;
9
9
  let routeConfigWeight = 0;
10
- const { headers, query, params, body } = entities;
10
+ const { headers, cookies, query, params, body } = 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 (params)
@@ -17,6 +17,11 @@ const createMockServer = (mockServerConfig) => {
17
17
  server.set('view engine', 'ejs');
18
18
  server.use(body_parser_1.default.urlencoded({ extended: false }));
19
19
  server.use(body_parser_1.default.json({ limit: '10mb' }));
20
+ (0, middlewares_1.cookieParseMiddleware)(server);
21
+ const serverRequestInterceptor = mockServerConfig.interceptors?.request;
22
+ if (serverRequestInterceptor) {
23
+ (0, middlewares_1.requestInterceptorMiddleware)(server, serverRequestInterceptor);
24
+ }
20
25
  const baseUrl = mockServerConfig.baseUrl ?? '/';
21
26
  if (cors) {
22
27
  (0, middlewares_1.corsMiddleware)(server, cors);
@@ -28,12 +33,20 @@ const createMockServer = (mockServerConfig) => {
28
33
  (0, middlewares_1.staticMiddleware)(server, baseUrl, staticPath);
29
34
  }
30
35
  if (rest) {
31
- const routerWithRestRoutes = (0, rest_1.createRestRoutes)(express_1.default.Router(), rest.configs, interceptors);
36
+ const routerWithRestRoutes = (0, rest_1.createRestRoutes)(express_1.default.Router(), rest, interceptors?.response);
37
+ const apiRequestInterceptor = rest.interceptors?.request;
38
+ if (apiRequestInterceptor) {
39
+ (0, middlewares_1.requestInterceptorMiddleware)(server, apiRequestInterceptor);
40
+ }
32
41
  const restBaseUrl = (0, helpers_1.urlJoin)(baseUrl, rest.baseUrl ?? '/');
33
42
  server.use(restBaseUrl, routerWithRestRoutes);
34
43
  }
35
44
  if (graphql) {
36
- const routerWithGraphQLRoutes = (0, graphql_1.createGraphQLRoutes)(express_1.default.Router(), graphql.configs, interceptors);
45
+ const routerWithGraphQLRoutes = (0, graphql_1.createGraphQLRoutes)(express_1.default.Router(), graphql, interceptors?.response);
46
+ const apiRequestInterceptor = graphql.interceptors?.request;
47
+ if (apiRequestInterceptor) {
48
+ (0, middlewares_1.requestInterceptorMiddleware)(server, apiRequestInterceptor);
49
+ }
37
50
  const graphqlBaseUrl = (0, helpers_1.urlJoin)(baseUrl, graphql.baseUrl ?? '/');
38
51
  server.use(graphqlBaseUrl, routerWithGraphQLRoutes);
39
52
  }
@@ -1,2 +1,2 @@
1
- export * from './startMockServer/startMockServer';
2
1
  export * from './createMockServer/createMockServer';
2
+ export * from './startMockServer/startMockServer';
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./startMockServer/startMockServer"), exports);
18
17
  __exportStar(require("./createMockServer/createMockServer"), exports);
18
+ __exportStar(require("./startMockServer/startMockServer"), exports);
@@ -1,2 +1,5 @@
1
+ /// <reference types="node" />
1
2
  import type { MockServerConfig } from '../../utils/types';
2
- export declare const startMockServer: (mockServerConfig: MockServerConfig) => void;
3
+ export declare const startMockServer: (mockServerConfig: MockServerConfig) => import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse> & {
4
+ destroy: (callback?: ((err?: Error | undefined) => void) | undefined) => import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
5
+ };
@@ -5,13 +5,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.startMockServer = void 0;
7
7
  const ansi_colors_1 = __importDefault(require("ansi-colors"));
8
+ const middlewares_1 = require("../../core/middlewares");
8
9
  const constants_1 = require("../../utils/constants");
9
10
  const createMockServer_1 = require("../createMockServer/createMockServer");
10
11
  const startMockServer = (mockServerConfig) => {
11
12
  const mockServer = (0, createMockServer_1.createMockServer)(mockServerConfig);
12
13
  const port = mockServerConfig.port ?? constants_1.DEFAULT.PORT;
13
- mockServer.listen(port, () => {
14
+ const server = mockServer.listen(port, () => {
14
15
  console.log(ansi_colors_1.default.green(`🎉 Mock Server is running at http://localhost:${port}`));
15
16
  });
17
+ // ✅ important: add destroy method for closing keep-alive connections after server shutdown
18
+ return (0, middlewares_1.destroyerMiddleware)(server);
16
19
  };
17
20
  exports.startMockServer = startMockServer;
@@ -0,0 +1,8 @@
1
+ import type { Request } from 'express';
2
+ import type { RequestInterceptor } from '../../../types';
3
+ interface CallRequestInterceptorParams {
4
+ request: Request;
5
+ interceptor: RequestInterceptor;
6
+ }
7
+ export declare const callRequestInterceptor: (params: CallRequestInterceptorParams) => Promise<void>;
8
+ export {};
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.callRequestInterceptor = void 0;
4
+ const setDelay_1 = require("../helpers/setDelay");
5
+ const callRequestInterceptor = async (params) => {
6
+ const { request, interceptor } = params;
7
+ const getHeader = (field) => request.headers[field];
8
+ const getHeaders = () => request.headers;
9
+ const getCookie = (name) => request.cookies[name];
10
+ const requestInterceptorParams = {
11
+ request,
12
+ setDelay: setDelay_1.setDelay,
13
+ getHeader,
14
+ getHeaders,
15
+ getCookie
16
+ };
17
+ await interceptor(requestInterceptorParams);
18
+ };
19
+ exports.callRequestInterceptor = callRequestInterceptor;
@@ -1,14 +1,15 @@
1
1
  import type { Request, Response } from 'express';
2
- import type { Data, InterceptorResponse } from '../../../types';
2
+ import type { Data, ResponseInterceptor } from '../../../types';
3
3
  interface CallResponseInterceptorsParams {
4
4
  data: Data;
5
5
  request: Request;
6
6
  response: Response;
7
7
  interceptors?: {
8
- routeInterceptor?: InterceptorResponse | undefined;
9
- requestInterceptor?: InterceptorResponse | undefined;
10
- serverInterceptor?: InterceptorResponse | undefined;
8
+ routeInterceptor?: ResponseInterceptor;
9
+ requestInterceptor?: ResponseInterceptor;
10
+ apiInterceptor?: ResponseInterceptor;
11
+ serverInterceptor?: ResponseInterceptor;
11
12
  };
12
13
  }
13
- export declare const callResponseInterceptors: (params: CallResponseInterceptorsParams) => Data;
14
+ export declare const callResponseInterceptors: (params: CallResponseInterceptorsParams) => Promise<Data>;
14
15
  export {};
@@ -1,54 +1,51 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.callResponseInterceptors = void 0;
4
- const sleep_1 = require("../../sleep");
5
- const callResponseInterceptors = (params) => {
4
+ const setDelay_1 = require("../helpers/setDelay");
5
+ const callResponseInterceptors = async (params) => {
6
6
  const { data, request, response, interceptors } = params;
7
- const setDelay = async (delay) => {
8
- await (0, sleep_1.sleep)(delay === Infinity ? 100000 : delay);
9
- };
7
+ const getHeader = (field) => response.getHeader(field);
8
+ const getHeaders = () => response.getHeaders();
9
+ const getCookie = (name) => request.cookies[name];
10
10
  const setStatusCode = (statusCode) => {
11
11
  response.statusCode = statusCode;
12
12
  };
13
- const setHeader = (field, value) => {
14
- response.header(field, value);
15
- };
16
- const appendHeader = (field, value) => {
17
- response.append(field, value);
18
- };
13
+ const setHeader = (field, value) => response.set(field, value);
14
+ const appendHeader = (field, value) => response.append(field, value);
19
15
  const setCookie = (name, value, options) => {
20
16
  if (options) {
21
17
  response.cookie(name, value, options);
22
- return;
23
18
  }
24
19
  response.cookie(name, value);
25
20
  };
26
- const clearCookie = (name, options) => {
27
- response.clearCookie(name, options);
28
- };
29
- const attachment = (filename) => {
30
- response.attachment(filename);
31
- };
32
- const interceptorResponseParams = {
21
+ const clearCookie = (name, options) => response.clearCookie(name, options);
22
+ const attachment = (filename) => response.attachment(filename);
23
+ const ResponseInterceptorParams = {
33
24
  request,
34
25
  response,
35
- setDelay,
26
+ setDelay: setDelay_1.setDelay,
36
27
  setStatusCode,
37
28
  setHeader,
38
29
  appendHeader,
30
+ getHeader,
31
+ getHeaders,
39
32
  setCookie,
33
+ getCookie,
40
34
  clearCookie,
41
35
  attachment
42
36
  };
43
37
  let updatedData = data;
44
38
  if (interceptors?.routeInterceptor) {
45
- updatedData = interceptors.routeInterceptor(updatedData, interceptorResponseParams);
39
+ updatedData = await interceptors.routeInterceptor(updatedData, ResponseInterceptorParams);
46
40
  }
47
41
  if (interceptors?.requestInterceptor) {
48
- updatedData = interceptors.requestInterceptor(updatedData, interceptorResponseParams);
42
+ updatedData = await interceptors.requestInterceptor(updatedData, ResponseInterceptorParams);
43
+ }
44
+ if (interceptors?.apiInterceptor) {
45
+ updatedData = await interceptors.apiInterceptor(updatedData, ResponseInterceptorParams);
49
46
  }
50
47
  if (interceptors?.serverInterceptor) {
51
- updatedData = interceptors.serverInterceptor(updatedData, interceptorResponseParams);
48
+ updatedData = await interceptors.serverInterceptor(updatedData, ResponseInterceptorParams);
52
49
  }
53
50
  return updatedData;
54
51
  };
@@ -0,0 +1 @@
1
+ export declare const setDelay: (delay: number) => Promise<void>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setDelay = void 0;
4
+ const sleep_1 = require("../../sleep");
5
+ const setDelay = async (delay) => {
6
+ await (0, sleep_1.sleep)(delay === Infinity ? 99999999 : delay);
7
+ };
8
+ exports.setDelay = setDelay;
@@ -1,2 +1,2 @@
1
- export * from './callRequestInterceptors/callRequestInterceptors';
1
+ export * from './callRequestInterceptor/callRequestInterceptor';
2
2
  export * from './callResponseInterceptors/callResponseInterceptors';
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./callRequestInterceptors/callRequestInterceptors"), exports);
17
+ __exportStar(require("./callRequestInterceptor/callRequestInterceptor"), exports);
18
18
  __exportStar(require("./callResponseInterceptors/callResponseInterceptors"), exports);
@@ -1 +1 @@
1
- export declare const sleep: (seconds: number) => Promise<unknown>;
1
+ export declare const sleep: (milliseconds: number) => Promise<unknown>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sleep = void 0;
4
- const sleep = (seconds) => new Promise((resolve) => {
5
- setTimeout(resolve, seconds * 1000);
4
+ const sleep = (milliseconds) => new Promise((resolve) => {
5
+ setTimeout(resolve, milliseconds);
6
6
  });
7
7
  exports.sleep = sleep;
@@ -6,7 +6,7 @@ export interface GraphQLInput {
6
6
  query?: string;
7
7
  variables: GraphQLVariables;
8
8
  }
9
- export type GraphQLEntities = 'headers' | 'query' | 'variables';
9
+ export type GraphQLEntities = 'headers' | 'cookies' | 'query' | 'variables';
10
10
  export type GraphQLEntitiesValues = {
11
11
  [Key in GraphQLEntities]: Key extends 'variables' ? VariablesValue : PlainObject;
12
12
  };
@@ -1,21 +1,30 @@
1
1
  import type { CookieOptions, Request, Response } from 'express';
2
- export interface InterceptorRequestParams {
2
+ export type RequestInterceptorCookieValue = string | undefined;
3
+ export type RequestInterceptorHeaderValue = string | number | string[] | undefined;
4
+ export interface RequestInterceptorParams {
3
5
  request: Request;
6
+ setDelay: (delay: number) => Promise<void>;
7
+ getCookie: (name: string) => RequestInterceptorCookieValue;
8
+ getHeader: (field: string) => RequestInterceptorHeaderValue;
9
+ getHeaders: () => Record<string, RequestInterceptorHeaderValue>;
4
10
  }
5
- export type InterceptorRequest = (params: InterceptorRequestParams) => void;
6
- export interface InterceptorResponseParams {
11
+ export type RequestInterceptor = (params: RequestInterceptorParams) => void;
12
+ export interface ResponseInterceptorParams {
7
13
  request: Request;
8
14
  response: Response;
9
15
  setDelay: (delay: number) => Promise<void>;
10
16
  setStatusCode: (statusCode: number) => void;
11
17
  setHeader: (field: string, value?: string | string[]) => void;
12
18
  appendHeader: (field: string, value?: string[] | string) => void;
19
+ getHeader: (field: string) => RequestInterceptorHeaderValue;
20
+ getHeaders: () => Record<string, RequestInterceptorHeaderValue>;
13
21
  setCookie: (name: string, value: string, options?: CookieOptions) => void;
22
+ getCookie: (name: string) => RequestInterceptorCookieValue;
14
23
  clearCookie: (name: string, options?: CookieOptions) => void;
15
24
  attachment: (filename: string) => void;
16
25
  }
17
- export type InterceptorResponse<DataType extends any = any> = (data: DataType, params: InterceptorResponseParams) => any;
26
+ export type ResponseInterceptor<Data extends any = any> = (data: Data, params: ResponseInterceptorParams) => any;
18
27
  export interface Interceptors {
19
- request?: InterceptorRequest;
20
- response?: InterceptorResponse;
28
+ request?: RequestInterceptor;
29
+ response?: ResponseInterceptor;
21
30
  }
@@ -1,18 +1,18 @@
1
1
  import type { Request } from 'express';
2
2
  import type { Interceptors } from './interceptors';
3
- import type { BodyValue, Data, HeadersValue, ParamsValue, QueryValue } from './values';
4
- export type RestEntities = 'headers' | 'query' | 'params' | 'body';
5
- export type RestEntitiesValue = BodyValue | QueryValue | HeadersValue | ParamsValue;
3
+ import type { BodyValue, CookiesValue, Data, HeadersValue, ParamsValue, QueryValue } from './values';
4
+ export type RestEntities = 'headers' | 'cookies' | 'query' | 'params' | 'body';
5
+ export type RestEntitiesValue = BodyValue | QueryValue | HeadersValue | CookiesValue | ParamsValue;
6
6
  export type RestEntitiesValues = {
7
- [Key in RestEntities]: Key extends 'body' ? BodyValue : Key extends 'query' ? QueryValue : Key extends 'headers' ? HeadersValue : Key extends 'params' ? ParamsValue : never;
7
+ [Key in RestEntities]: Key extends 'body' ? BodyValue : Key extends 'query' ? QueryValue : Key extends 'headers' ? HeadersValue : Key extends 'cookies' ? CookiesValue : Key extends 'params' ? ParamsValue : never;
8
8
  };
9
9
  export interface RestMethodsEntities {
10
- get: Extract<RestEntities, 'headers' | 'query' | 'params'>;
11
- delete: Extract<RestEntities, 'headers' | 'query' | 'params'>;
10
+ get: Exclude<RestEntities, 'body'>;
11
+ delete: Exclude<RestEntities, 'body'>;
12
12
  post: RestEntities;
13
13
  put: RestEntities;
14
14
  patch: RestEntities;
15
- options: Extract<RestEntities, 'headers' | 'query' | 'params'>;
15
+ options: Exclude<RestEntities, 'body'>;
16
16
  }
17
17
  export type RestRouteConfigEntities<Method extends RestMethod> = {
18
18
  [Key in RestMethodsEntities[Method]]?: RestEntitiesValues[Key];
@@ -19,19 +19,29 @@ export type Cors = {
19
19
  };
20
20
  export type Port = number;
21
21
  export type BaseUrl = `/${string}`;
22
+ export interface RestConfig {
23
+ baseUrl?: BaseUrl;
24
+ configs: RestRequestConfig[];
25
+ interceptors?: Interceptors;
26
+ }
27
+ export interface GraphqlConfig {
28
+ baseUrl?: BaseUrl;
29
+ configs: GraphQLRequestConfig[];
30
+ interceptors?: Interceptors;
31
+ }
22
32
  export interface MockServerConfig {
23
33
  baseUrl?: BaseUrl;
24
- rest?: {
25
- baseUrl?: BaseUrl;
26
- configs: RestRequestConfig[];
27
- };
28
- graphql?: {
29
- baseUrl?: BaseUrl;
30
- configs: GraphQLRequestConfig[];
31
- };
34
+ rest?: RestConfig;
35
+ graphql?: GraphqlConfig;
32
36
  port?: Port;
33
37
  staticPath?: StaticPath;
34
38
  interceptors?: Interceptors;
35
39
  cors?: Cors;
36
40
  }
37
- export type MockServerConfigArgv = Partial<Pick<MockServerConfig, 'baseUrl' | 'port' | 'staticPath'>>;
41
+ export interface MockServerConfigArgv {
42
+ baseUrl?: string;
43
+ port?: number;
44
+ staticPath?: string;
45
+ config?: string;
46
+ watch?: boolean;
47
+ }
@@ -5,5 +5,6 @@ export type BodyValue = any;
5
5
  export type VariablesValue = any;
6
6
  export type QueryValue = ParsedQs;
7
7
  export type HeadersValue = Record<string, string>;
8
+ export type CookiesValue = Record<string, string>;
8
9
  export type ParamsValue = Record<string, string>;
9
10
  export type Data = boolean | number | string | any[] | Record<any, any> | null | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mock-config-server",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "Tool that easily and quickly imitates server operation, create full fake api in few steps",
5
5
  "author": {
6
6
  "name": "SIBERIA CAN CODE 🧊",
@@ -20,7 +20,7 @@
20
20
  "url": "https://github.com/RiceWithMeat"
21
21
  }
22
22
  ],
23
- "license": "ISC",
23
+ "license": "MIT",
24
24
  "main": "./dist/index.js",
25
25
  "types": "./dist/index.d.ts",
26
26
  "bin": {
@@ -36,6 +36,8 @@
36
36
  "scripts": {
37
37
  "prepare": "husky install",
38
38
  "build": "shx rm -rf dist && tsc -p tsconfig.production.json && tsc-alias -p tsconfig.production.json && shx cp -R src/static dist/src/static",
39
+ "start": "yarn build && node ./dist/bin/bin.js",
40
+ "dev": "nodemon --watch src --watch bin --watch mock-server.config.* -e js,ts,ejs --exec \"yarn start\"",
39
41
  "test": "jest",
40
42
  "type": "tsc --noEmit",
41
43
  "lint": "eslint . --ext ts --no-error-on-unmatched-pattern",
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import type { MockServerConfigArgv } from '../src';
3
- export declare const start: (argv: MockServerConfigArgv) => Promise<void>;