mock-config-server 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/dist/bin/bin.d.ts +2 -0
  2. package/dist/bin/bin.js +8 -0
  3. package/dist/bin/build.d.ts +2 -0
  4. package/dist/bin/build.js +49 -0
  5. package/dist/bin/cli.d.ts +1 -0
  6. package/dist/bin/cli.js +48 -0
  7. package/dist/bin/helpers/index.d.ts +3 -0
  8. package/dist/bin/helpers/index.js +19 -0
  9. package/dist/bin/helpers/resolveConfigFile.d.ts +2 -0
  10. package/dist/bin/helpers/resolveConfigFile.js +20 -0
  11. package/dist/bin/helpers/resolveConfigFilePath.d.ts +1 -0
  12. package/dist/bin/helpers/resolveConfigFilePath.js +39 -0
  13. package/dist/bin/helpers/resolveExportsFromSourceCode.d.ts +1 -0
  14. package/dist/bin/helpers/resolveExportsFromSourceCode.js +11 -0
  15. package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.d.ts +1 -0
  16. package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.js +39 -0
  17. package/dist/bin/run.d.ts +6 -0
  18. package/dist/bin/run.js +17 -0
  19. package/dist/bin/validateMockServerConfig/helpers/index.d.ts +2 -0
  20. package/dist/bin/validateMockServerConfig/helpers/index.js +18 -0
  21. package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/index.d.ts +1 -0
  22. package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/index.js +17 -0
  23. package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/isCheckModeValid.d.ts +1 -0
  24. package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/isCheckModeValid.js +10 -0
  25. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/index.d.ts +1 -0
  26. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/index.js +17 -0
  27. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/isDescriptorValueValid.d.ts +1 -0
  28. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/isDescriptorValueValid.js +23 -0
  29. package/dist/bin/validateMockServerConfig/validateBaseUrl/validateBaseUrl.d.ts +1 -0
  30. package/dist/bin/validateMockServerConfig/validateBaseUrl/validateBaseUrl.js +12 -0
  31. package/dist/bin/validateMockServerConfig/validateCors/validateCors.d.ts +1 -0
  32. package/dist/bin/validateMockServerConfig/validateCors/validateCors.js +82 -0
  33. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateGraphqlConfig.d.ts +1 -0
  34. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateGraphqlConfig.js +48 -0
  35. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.d.ts +2 -0
  36. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.js +97 -0
  37. package/dist/bin/validateMockServerConfig/validateInterceptors/validateInterceptors.d.ts +1 -0
  38. package/dist/bin/validateMockServerConfig/validateInterceptors/validateInterceptors.js +21 -0
  39. package/dist/bin/validateMockServerConfig/validateMockServerConfig.d.ts +2 -0
  40. package/dist/bin/validateMockServerConfig/validateMockServerConfig.js +30 -0
  41. package/dist/bin/validateMockServerConfig/validatePort/validatePort.d.ts +1 -0
  42. package/dist/bin/validateMockServerConfig/validatePort/validatePort.js +9 -0
  43. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRestConfig.d.ts +1 -0
  44. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRestConfig.js +52 -0
  45. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.d.ts +2 -0
  46. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.js +101 -0
  47. package/dist/bin/validateMockServerConfig/validateStaticPath/validateStaticPath.d.ts +1 -0
  48. package/dist/bin/validateMockServerConfig/validateStaticPath/validateStaticPath.js +44 -0
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.js +17 -0
  51. package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.d.ts +3 -0
  52. package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.js +89 -0
  53. package/dist/src/core/graphql/createGraphQLRoutes/helpers/index.d.ts +1 -0
  54. package/dist/src/core/graphql/createGraphQLRoutes/helpers/index.js +17 -0
  55. package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.d.ts +2 -0
  56. package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.js +35 -0
  57. package/dist/src/core/graphql/index.d.ts +1 -0
  58. package/dist/src/core/graphql/index.js +17 -0
  59. package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.d.ts +2 -0
  60. package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.js +16 -0
  61. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.d.ts +1 -0
  62. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.js +17 -0
  63. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.d.ts +3 -0
  64. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.js +17 -0
  65. package/dist/src/core/middlewares/corsMiddleware/corsMiddleware.d.ts +3 -0
  66. package/dist/src/core/middlewares/corsMiddleware/corsMiddleware.js +45 -0
  67. package/dist/src/core/middlewares/corsMiddleware/helpers/getAllowedOrigins/getAllowedOrigins.d.ts +2 -0
  68. package/dist/src/core/middlewares/corsMiddleware/helpers/getAllowedOrigins/getAllowedOrigins.js +13 -0
  69. package/dist/src/core/middlewares/corsMiddleware/helpers/index.d.ts +1 -0
  70. package/dist/src/core/middlewares/corsMiddleware/helpers/index.js +17 -0
  71. package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.d.ts +7 -0
  72. package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.js +23 -0
  73. package/dist/src/core/middlewares/errorMiddleware/errorMiddleware.d.ts +2 -0
  74. package/dist/src/core/middlewares/errorMiddleware/errorMiddleware.js +18 -0
  75. package/dist/src/core/middlewares/index.d.ts +8 -0
  76. package/dist/src/core/middlewares/index.js +24 -0
  77. package/dist/src/core/middlewares/noCorsMiddleware/noCorsMiddleware.d.ts +2 -0
  78. package/dist/src/core/middlewares/noCorsMiddleware/noCorsMiddleware.js +24 -0
  79. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getGraphqlUrlSuggestions/getGraphqlUrlSuggestions.d.ts +11 -0
  80. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getGraphqlUrlSuggestions/getGraphqlUrlSuggestions.js +19 -0
  81. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getLevenshteinDistance/getLevenshteinDistance.d.ts +1 -0
  82. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getLevenshteinDistance/getLevenshteinDistance.js +80 -0
  83. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/getRestUrlSuggestions.d.ts +11 -0
  84. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/getRestUrlSuggestions.js +34 -0
  85. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getActualRestUrlMeaningfulString/getActualRestUrlMeaningfulString.d.ts +1 -0
  86. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getActualRestUrlMeaningfulString/getActualRestUrlMeaningfulString.js +7 -0
  87. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getPatternRestUrlMeaningfulString/getPatternRestUrlMeaningfulString.d.ts +1 -0
  88. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getPatternRestUrlMeaningfulString/getPatternRestUrlMeaningfulString.js +5 -0
  89. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/index.d.ts +2 -0
  90. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/index.js +18 -0
  91. package/dist/src/core/middlewares/notFoundMiddleware/helpers/index.d.ts +3 -0
  92. package/dist/src/core/middlewares/notFoundMiddleware/helpers/index.js +19 -0
  93. package/dist/src/core/middlewares/notFoundMiddleware/notFoundMiddleware.d.ts +3 -0
  94. package/dist/src/core/middlewares/notFoundMiddleware/notFoundMiddleware.js +53 -0
  95. package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.d.ts +3 -0
  96. package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.js +11 -0
  97. package/dist/src/core/middlewares/staticMiddleware/staticMiddleware.d.ts +3 -0
  98. package/dist/src/core/middlewares/staticMiddleware/staticMiddleware.js +30 -0
  99. package/dist/src/core/rest/createRestRoutes/createRestRoutes.d.ts +3 -0
  100. package/dist/src/core/rest/createRestRoutes/createRestRoutes.js +60 -0
  101. package/dist/src/core/rest/createRestRoutes/helpers/index.d.ts +1 -0
  102. package/dist/src/core/rest/createRestRoutes/helpers/index.js +17 -0
  103. package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.d.ts +2 -0
  104. package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.js +37 -0
  105. package/dist/src/core/rest/index.d.ts +1 -0
  106. package/dist/src/core/rest/index.js +17 -0
  107. package/dist/src/index.d.ts +3 -0
  108. package/dist/src/index.js +19 -0
  109. package/dist/src/server/createMockServer/createMockServer.d.ts +3 -0
  110. package/dist/src/server/createMockServer/createMockServer.js +58 -0
  111. package/dist/src/server/index.d.ts +2 -0
  112. package/dist/src/server/index.js +18 -0
  113. package/dist/src/server/startMockServer/startMockServer.d.ts +5 -0
  114. package/dist/src/server/startMockServer/startMockServer.js +20 -0
  115. package/dist/src/static/views/assets/icons/scheme-dark.svg +3 -0
  116. package/dist/src/static/views/assets/icons/scheme-light.svg +3 -0
  117. package/dist/src/static/views/assets/images/404.png +0 -0
  118. package/dist/src/static/views/assets/images/logo.png +0 -0
  119. package/dist/src/static/views/assets/styles/global.css +88 -0
  120. package/dist/src/static/views/components/header/index.css +55 -0
  121. package/dist/src/static/views/components/header/index.ejs +40 -0
  122. package/dist/src/static/views/components/header/index.js +1 -0
  123. package/dist/src/static/views/features/scheme/dark.css +12 -0
  124. package/dist/src/static/views/features/scheme/index.ejs +3 -0
  125. package/dist/src/static/views/features/scheme/index.js +31 -0
  126. package/dist/src/static/views/features/scheme/light.css +12 -0
  127. package/dist/src/static/views/features/tab/index.css +30 -0
  128. package/dist/src/static/views/features/tab/index.ejs +2 -0
  129. package/dist/src/static/views/features/tab/index.js +12 -0
  130. package/dist/src/static/views/pages/404/index.css +10 -0
  131. package/dist/src/static/views/pages/404/index.ejs +85 -0
  132. package/dist/src/utils/constants/appPath.d.ts +1 -0
  133. package/dist/src/utils/constants/appPath.js +4 -0
  134. package/dist/src/utils/constants/checkModes.d.ts +9 -0
  135. package/dist/src/utils/constants/checkModes.js +31 -0
  136. package/dist/src/utils/constants/default.d.ts +11 -0
  137. package/dist/src/utils/constants/default.js +14 -0
  138. package/dist/src/utils/constants/index.d.ts +3 -0
  139. package/dist/src/utils/constants/index.js +19 -0
  140. package/dist/src/utils/helpers/asyncHandler.d.ts +2 -0
  141. package/dist/src/utils/helpers/asyncHandler.js +5 -0
  142. package/dist/src/utils/helpers/config/index.d.ts +1 -0
  143. package/dist/src/utils/helpers/config/index.js +17 -0
  144. package/dist/src/utils/helpers/config/resolveEntityValues/resolveEntityValues.d.ts +2 -0
  145. package/dist/src/utils/helpers/config/resolveEntityValues/resolveEntityValues.js +131 -0
  146. package/dist/src/utils/helpers/entities/convertToEntityDescriptor/convertToEntityDescriptor.d.ts +2 -0
  147. package/dist/src/utils/helpers/entities/convertToEntityDescriptor/convertToEntityDescriptor.js +8 -0
  148. package/dist/src/utils/helpers/entities/index.d.ts +2 -0
  149. package/dist/src/utils/helpers/entities/index.js +18 -0
  150. package/dist/src/utils/helpers/entities/isEntityDescriptor/isEntityDescriptor.d.ts +1 -0
  151. package/dist/src/utils/helpers/entities/isEntityDescriptor/isEntityDescriptor.js +6 -0
  152. package/dist/src/utils/helpers/graphql/getGraphQLInput/getGraphQLInput.d.ts +3 -0
  153. package/dist/src/utils/helpers/graphql/getGraphQLInput/getGraphQLInput.js +21 -0
  154. package/dist/src/utils/helpers/graphql/index.d.ts +3 -0
  155. package/dist/src/utils/helpers/graphql/index.js +19 -0
  156. package/dist/src/utils/helpers/graphql/parseGraphQLRequest/parseGraphQLRequest.d.ts +3 -0
  157. package/dist/src/utils/helpers/graphql/parseGraphQLRequest/parseGraphQLRequest.js +12 -0
  158. package/dist/src/utils/helpers/graphql/parseQuery/parseQuery.d.ts +7 -0
  159. package/dist/src/utils/helpers/graphql/parseQuery/parseQuery.js +21 -0
  160. package/dist/src/utils/helpers/index.d.ts +10 -0
  161. package/dist/src/utils/helpers/index.js +26 -0
  162. package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.d.ts +8 -0
  163. package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.js +19 -0
  164. package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.d.ts +15 -0
  165. package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.js +52 -0
  166. package/dist/src/utils/helpers/interceptors/helpers/setDelay.d.ts +1 -0
  167. package/dist/src/utils/helpers/interceptors/helpers/setDelay.js +8 -0
  168. package/dist/src/utils/helpers/interceptors/index.d.ts +2 -0
  169. package/dist/src/utils/helpers/interceptors/index.js +18 -0
  170. package/dist/src/utils/helpers/isPlainObject/isPlainObject.d.ts +1 -0
  171. package/dist/src/utils/helpers/isPlainObject/isPlainObject.js +8 -0
  172. package/dist/src/utils/helpers/isPrimitive/isPrimitive.d.ts +2 -0
  173. package/dist/src/utils/helpers/isPrimitive/isPrimitive.js +5 -0
  174. package/dist/src/utils/helpers/isRegExp/isRegExp.d.ts +1 -0
  175. package/dist/src/utils/helpers/isRegExp/isRegExp.js +5 -0
  176. package/dist/src/utils/helpers/sleep.d.ts +1 -0
  177. package/dist/src/utils/helpers/sleep.js +7 -0
  178. package/dist/src/utils/helpers/url/convertWin32PathToUnix/convertWin32PathToUnix.d.ts +1 -0
  179. package/dist/src/utils/helpers/url/convertWin32PathToUnix/convertWin32PathToUnix.js +8 -0
  180. package/dist/src/utils/helpers/url/getUrlParts/getUrlParts.d.ts +1 -0
  181. package/dist/src/utils/helpers/url/getUrlParts/getUrlParts.js +6 -0
  182. package/dist/src/utils/helpers/url/index.d.ts +4 -0
  183. package/dist/src/utils/helpers/url/index.js +20 -0
  184. package/dist/src/utils/helpers/url/removeLeadingAndTrailingSlashes/removeLeadingAndTrailingSlashes.d.ts +1 -0
  185. package/dist/src/utils/helpers/url/removeLeadingAndTrailingSlashes/removeLeadingAndTrailingSlashes.js +5 -0
  186. package/dist/src/utils/helpers/url/urlJoin/urlJoin.d.ts +1 -0
  187. package/dist/src/utils/helpers/url/urlJoin/urlJoin.js +14 -0
  188. package/dist/src/utils/types/checkModes.d.ts +12 -0
  189. package/dist/src/utils/types/checkModes.js +2 -0
  190. package/dist/src/utils/types/graphql.d.ts +74 -0
  191. package/dist/src/utils/types/graphql.js +2 -0
  192. package/dist/src/utils/types/index.d.ts +6 -0
  193. package/dist/src/utils/types/index.js +22 -0
  194. package/dist/src/utils/types/interceptors.d.ts +31 -0
  195. package/dist/src/utils/types/interceptors.js +2 -0
  196. package/dist/src/utils/types/rest.d.ts +77 -0
  197. package/dist/src/utils/types/rest.js +2 -0
  198. package/dist/src/utils/types/server.d.ts +48 -0
  199. package/dist/src/utils/types/server.js +2 -0
  200. package/dist/src/utils/types/values.d.ts +4 -0
  201. package/dist/src/utils/types/values.js +2 -0
  202. package/package.json +2 -2
@@ -0,0 +1,3 @@
1
+ import type { Express } from 'express';
2
+ import type { Cors } from '../../../utils/types';
3
+ export declare const corsMiddleware: (server: Express, cors: Cors) => void;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.corsMiddleware = void 0;
4
+ const constants_1 = require("../../../utils/constants");
5
+ const helpers_1 = require("../../../utils/helpers");
6
+ const helpers_2 = require("./helpers");
7
+ const corsMiddleware = (server, cors) => {
8
+ server.use((0, helpers_1.asyncHandler)(async (request, response, next) => {
9
+ if (Array.isArray(cors.origin) && !cors.origin.length) {
10
+ return next();
11
+ }
12
+ let allowedOrigins = [];
13
+ if (typeof cors.origin === 'function') {
14
+ const origins = await cors.origin(request);
15
+ allowedOrigins = (0, helpers_2.getAllowedOrigins)(origins);
16
+ }
17
+ else {
18
+ allowedOrigins = (0, helpers_2.getAllowedOrigins)(cors.origin);
19
+ }
20
+ const { origin } = request.headers;
21
+ if (!allowedOrigins?.length || !origin) {
22
+ return next();
23
+ }
24
+ const isRequestOriginAllowed = allowedOrigins.some((allowedOrigin) => {
25
+ if (allowedOrigin instanceof RegExp) {
26
+ return new RegExp(allowedOrigin).test(origin);
27
+ }
28
+ return allowedOrigin === origin;
29
+ });
30
+ if (isRequestOriginAllowed) {
31
+ response.setHeader('Access-Control-Allow-Origin', origin);
32
+ response.setHeader('Access-Control-Allow-Credentials', `${cors.credentials ?? constants_1.DEFAULT.CORS.CREDENTIALS}`);
33
+ response.setHeader('Access-Control-Expose-Headers', cors.exposedHeaders ?? constants_1.DEFAULT.CORS.EXPOSED_HEADERS);
34
+ if (request.method === 'OPTIONS') {
35
+ response.setHeader('Access-Control-Allow-Methods', cors.methods ?? constants_1.DEFAULT.CORS.METHODS);
36
+ response.setHeader('Access-Control-Allow-Headers', cors.allowedHeaders ?? constants_1.DEFAULT.CORS.ALLOWED_HEADERS);
37
+ response.setHeader('Access-Control-Max-Age', cors.maxAge ?? constants_1.DEFAULT.CORS.MAX_AGE);
38
+ response.sendStatus(204);
39
+ return response.end();
40
+ }
41
+ }
42
+ return next();
43
+ }));
44
+ };
45
+ exports.corsMiddleware = corsMiddleware;
@@ -0,0 +1,2 @@
1
+ import type { CorsOrigin } from '../../../../../utils/types';
2
+ export declare const getAllowedOrigins: (origin: CorsOrigin) => (string | RegExp)[];
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAllowedOrigins = void 0;
4
+ const getAllowedOrigins = (origin) => {
5
+ if (Array.isArray(origin)) {
6
+ return origin;
7
+ }
8
+ if (typeof origin === 'string' || origin instanceof RegExp) {
9
+ return [origin];
10
+ }
11
+ throw new Error('Invalid cors origin format');
12
+ };
13
+ exports.getAllowedOrigins = getAllowedOrigins;
@@ -0,0 +1 @@
1
+ export * from './getAllowedOrigins/getAllowedOrigins';
@@ -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("./getAllowedOrigins/getAllowedOrigins"), exports);
@@ -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;
@@ -0,0 +1,2 @@
1
+ import type { Express } from 'express';
2
+ export declare const errorMiddleware: (server: Express) => void;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.errorMiddleware = void 0;
7
+ const ansi_colors_1 = __importDefault(require("ansi-colors"));
8
+ const errorMiddleware = (server) => {
9
+ server.use(((error, request, response, next) => {
10
+ console.error(ansi_colors_1.default.bgRed(`\nError on ${request.method} ${request.url} request\n`));
11
+ const message = `Message: ${error.message ?? 'Internal server error'}\n\n${error.stack}`;
12
+ response.status(error.status || 500).send(message);
13
+ // ✅ important:
14
+ // call next function for trigger default express error handling behavior
15
+ next(error);
16
+ }));
17
+ };
18
+ exports.errorMiddleware = errorMiddleware;
@@ -0,0 +1,8 @@
1
+ export * from './staticMiddleware/staticMiddleware';
2
+ export * from './corsMiddleware/corsMiddleware';
3
+ export * from './noCorsMiddleware/noCorsMiddleware';
4
+ export * from './notFoundMiddleware/notFoundMiddleware';
5
+ export * from './requestInterceptorMiddleware/requestInterceptorMiddleware';
6
+ export * from './destroyerMiddleware/destroyerMiddleware';
7
+ export * from './cookieParseMiddleware/cookieParseMiddleware';
8
+ export * from './errorMiddleware/errorMiddleware';
@@ -0,0 +1,24 @@
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("./staticMiddleware/staticMiddleware"), exports);
18
+ __exportStar(require("./corsMiddleware/corsMiddleware"), exports);
19
+ __exportStar(require("./noCorsMiddleware/noCorsMiddleware"), exports);
20
+ __exportStar(require("./notFoundMiddleware/notFoundMiddleware"), exports);
21
+ __exportStar(require("./requestInterceptorMiddleware/requestInterceptorMiddleware"), exports);
22
+ __exportStar(require("./destroyerMiddleware/destroyerMiddleware"), exports);
23
+ __exportStar(require("./cookieParseMiddleware/cookieParseMiddleware"), exports);
24
+ __exportStar(require("./errorMiddleware/errorMiddleware"), exports);
@@ -0,0 +1,2 @@
1
+ import type { Express } from 'express';
2
+ export declare const noCorsMiddleware: (server: Express) => void;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noCorsMiddleware = void 0;
4
+ const constants_1 = require("../../../utils/constants");
5
+ const noCorsMiddleware = (server) => {
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
+ if (isPreflightRequest) {
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
+ }
21
+ return next();
22
+ });
23
+ };
24
+ exports.noCorsMiddleware = noCorsMiddleware;
@@ -0,0 +1,11 @@
1
+ import type { GraphQLOperationType } from '../../../../../utils/types';
2
+ export type GraphqlRequestSuggestionConfigs = {
3
+ operationType: GraphQLOperationType;
4
+ operationName: string;
5
+ }[];
6
+ interface GetGraphqlUrlSuggestionsParams {
7
+ url: URL;
8
+ requestConfigs: GraphqlRequestSuggestionConfigs;
9
+ }
10
+ export declare const getGraphqlUrlSuggestions: ({ url, requestConfigs }: GetGraphqlUrlSuggestionsParams) => GraphqlRequestSuggestionConfigs;
11
+ export {};
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getGraphqlUrlSuggestions = void 0;
4
+ const getLevenshteinDistance_1 = require("../getLevenshteinDistance/getLevenshteinDistance");
5
+ const getGraphqlUrlSuggestions = ({ url, requestConfigs }) => {
6
+ // ✅ important: operationName is always second word in 'query' query param
7
+ const actualOperationName = url.searchParams.get('query')?.split(' ')[1];
8
+ const actualUrlMeaningful = `${url.pathname}/${actualOperationName}`;
9
+ const graphqlUrlSuggestions = requestConfigs.reduce((acc, requestConfig) => {
10
+ const { operationName } = requestConfig;
11
+ const distance = (0, getLevenshteinDistance_1.getLevenshteinDistance)(actualUrlMeaningful, operationName);
12
+ const tolerance = Math.floor(operationName.length / 2);
13
+ if (distance <= tolerance)
14
+ acc.push(requestConfig);
15
+ return acc;
16
+ }, []);
17
+ return graphqlUrlSuggestions;
18
+ };
19
+ exports.getGraphqlUrlSuggestions = getGraphqlUrlSuggestions;
@@ -0,0 +1 @@
1
+ export declare const getLevenshteinDistance: (a: string, b: string) => number;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /* eslint-disable */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.getLevenshteinDistance = void 0;
5
+ const min = (d0, d1, d2, bx, ay) => d0 < d1 || d2 < d1 ? (d0 > d2 ? d2 + 1 : d0 + 1) : bx === ay ? d1 : d1 + 1;
6
+ const getLevenshteinDistance = (a, b) => {
7
+ if (a === b) {
8
+ return 0;
9
+ }
10
+ if (a.length > b.length) {
11
+ const tmp = a;
12
+ a = b;
13
+ b = tmp;
14
+ }
15
+ let la = a.length;
16
+ let lb = b.length;
17
+ while (la > 0 && a.charCodeAt(la - 1) === b.charCodeAt(lb - 1)) {
18
+ la--;
19
+ lb--;
20
+ }
21
+ let offset = 0;
22
+ while (offset < la && a.charCodeAt(offset) === b.charCodeAt(offset)) {
23
+ offset++;
24
+ }
25
+ la -= offset;
26
+ lb -= offset;
27
+ if (la === 0 || lb < 3) {
28
+ return lb;
29
+ }
30
+ let x = 0;
31
+ let y;
32
+ let d0;
33
+ let d1;
34
+ let d2;
35
+ let d3;
36
+ let dd = 0;
37
+ let dy;
38
+ let ay;
39
+ let bx0;
40
+ let bx1;
41
+ let bx2;
42
+ let bx3;
43
+ const vector = [];
44
+ for (y = 0; y < la; y++) {
45
+ vector.push(y + 1);
46
+ vector.push(a.charCodeAt(offset + y));
47
+ }
48
+ const len = vector.length - 1;
49
+ for (; x < lb - 3;) {
50
+ bx0 = b.charCodeAt(offset + (d0 = x));
51
+ bx1 = b.charCodeAt(offset + (d1 = x + 1));
52
+ bx2 = b.charCodeAt(offset + (d2 = x + 2));
53
+ bx3 = b.charCodeAt(offset + (d3 = x + 3));
54
+ dd = x += 4;
55
+ for (y = 0; y < len; y += 2) {
56
+ dy = vector[y];
57
+ ay = vector[y + 1];
58
+ d0 = min(dy, d0, d1, bx0, ay);
59
+ d1 = min(d0, d1, d2, bx1, ay);
60
+ d2 = min(d1, d2, d3, bx2, ay);
61
+ dd = min(d2, d3, dd, bx3, ay);
62
+ vector[y] = dd;
63
+ d3 = d2;
64
+ d2 = d1;
65
+ d1 = d0;
66
+ d0 = dy;
67
+ }
68
+ }
69
+ for (; x < lb;) {
70
+ bx0 = b.charCodeAt(offset + (d0 = x));
71
+ dd = ++x;
72
+ for (y = 0; y < len; y += 2) {
73
+ dy = vector[y];
74
+ vector[y] = dd = min(dy, d0, dd, bx0, vector[y + 1]);
75
+ d0 = dy;
76
+ }
77
+ }
78
+ return dd;
79
+ };
80
+ exports.getLevenshteinDistance = getLevenshteinDistance;
@@ -0,0 +1,11 @@
1
+ import type { RestMethod, RestPathString } from '../../../../../utils/types';
2
+ export type RestRequestSuggestionConfigs = {
3
+ method: RestMethod;
4
+ path: RestPathString;
5
+ }[];
6
+ interface GetRestUrlSuggestionsParams {
7
+ url: URL;
8
+ requestConfigs: RestRequestSuggestionConfigs;
9
+ }
10
+ export declare const getRestUrlSuggestions: ({ url, requestConfigs }: GetRestUrlSuggestionsParams) => RestRequestSuggestionConfigs;
11
+ export {};
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRestUrlSuggestions = void 0;
4
+ const helpers_1 = require("../../../../../utils/helpers");
5
+ const getLevenshteinDistance_1 = require("../getLevenshteinDistance/getLevenshteinDistance");
6
+ const helpers_2 = require("./helpers");
7
+ const getRestUrlSuggestions = ({ url, requestConfigs }) => {
8
+ const actualUrlParts = (0, helpers_1.getUrlParts)(url.pathname);
9
+ const restUrlSuggestions = requestConfigs.reduce((acc, requestConfig) => {
10
+ const patternUrlParts = (0, helpers_1.getUrlParts)(requestConfig.path);
11
+ // ✅ important: ignore patterns with different amount of parts
12
+ if (patternUrlParts.length !== actualUrlParts.length)
13
+ return acc;
14
+ const actualUrlMeaningfulString = (0, helpers_2.getActualRestUrlMeaningfulString)(actualUrlParts, patternUrlParts);
15
+ const patternUrlMeaningfulString = (0, helpers_2.getPatternRestUrlMeaningfulString)(patternUrlParts);
16
+ const tolerance = Math.floor(patternUrlMeaningfulString.length / 2);
17
+ const distance = (0, getLevenshteinDistance_1.getLevenshteinDistance)(actualUrlMeaningfulString, patternUrlMeaningfulString);
18
+ if (distance <= tolerance) {
19
+ // replace param names in pattern with param values from actual url
20
+ const urlSuggestion = patternUrlParts
21
+ .map((_patternUrlPart, index) => {
22
+ if (patternUrlParts[index].startsWith(':'))
23
+ return actualUrlParts[index];
24
+ return patternUrlParts[index];
25
+ })
26
+ .join('/');
27
+ const suggestionWithQueryParams = `/${urlSuggestion}${url.search}`;
28
+ acc.push({ ...requestConfig, path: suggestionWithQueryParams });
29
+ }
30
+ return acc;
31
+ }, []);
32
+ return restUrlSuggestions;
33
+ };
34
+ exports.getRestUrlSuggestions = getRestUrlSuggestions;
@@ -0,0 +1 @@
1
+ export declare const getActualRestUrlMeaningfulString: (actualUrlParts: string[], patternUrlParts: string[]) => string;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getActualRestUrlMeaningfulString = void 0;
4
+ const getActualRestUrlMeaningfulString = (actualUrlParts, patternUrlParts) => actualUrlParts
5
+ .filter((_actualUrlPart, index) => !patternUrlParts[index].startsWith(':'))
6
+ .join('');
7
+ exports.getActualRestUrlMeaningfulString = getActualRestUrlMeaningfulString;
@@ -0,0 +1 @@
1
+ export declare const getPatternRestUrlMeaningfulString: (patternUrlParts: string[]) => string;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPatternRestUrlMeaningfulString = void 0;
4
+ const getPatternRestUrlMeaningfulString = (patternUrlParts) => patternUrlParts.filter((urlPatternPart) => !urlPatternPart.startsWith(':')).join('');
5
+ exports.getPatternRestUrlMeaningfulString = getPatternRestUrlMeaningfulString;
@@ -0,0 +1,2 @@
1
+ export * from './getActualRestUrlMeaningfulString/getActualRestUrlMeaningfulString';
2
+ export * from './getPatternRestUrlMeaningfulString/getPatternRestUrlMeaningfulString';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./getActualRestUrlMeaningfulString/getActualRestUrlMeaningfulString"), exports);
18
+ __exportStar(require("./getPatternRestUrlMeaningfulString/getPatternRestUrlMeaningfulString"), exports);
@@ -0,0 +1,3 @@
1
+ export * from './getGraphqlUrlSuggestions/getGraphqlUrlSuggestions';
2
+ export * from './getLevenshteinDistance/getLevenshteinDistance';
3
+ export * from './getRestUrlSuggestions/getRestUrlSuggestions';
@@ -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("./getGraphqlUrlSuggestions/getGraphqlUrlSuggestions"), exports);
18
+ __exportStar(require("./getLevenshteinDistance/getLevenshteinDistance"), exports);
19
+ __exportStar(require("./getRestUrlSuggestions/getRestUrlSuggestions"), exports);
@@ -0,0 +1,3 @@
1
+ import type { Express } from 'express';
2
+ import type { MockServerConfig } from '../../../utils/types';
3
+ export declare const notFoundMiddleware: (server: Express, mockServerConfig: Pick<MockServerConfig, 'baseUrl' | 'rest' | 'graphql'>) => void;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.notFoundMiddleware = void 0;
4
+ const helpers_1 = require("../../../utils/helpers");
5
+ const helpers_2 = require("./helpers");
6
+ const notFoundMiddleware = (server, mockServerConfig) => {
7
+ const { baseUrl: serverBaseUrl, rest, graphql } = mockServerConfig;
8
+ const restRequestConfigs = rest?.configs
9
+ .filter(({ path }) => !(path instanceof RegExp))
10
+ .map((request) => ({
11
+ method: request.method,
12
+ path: `${serverBaseUrl ?? ''}${rest?.baseUrl ?? ''}${request.path}`
13
+ })) ?? [];
14
+ const graphqlRequestConfigs = graphql?.configs
15
+ .filter(({ operationName }) => !(operationName instanceof RegExp))
16
+ .map((request) => ({
17
+ operationType: request.operationType,
18
+ operationName: `${serverBaseUrl ?? ''}${graphql?.baseUrl ?? ''} ${request.operationName}`
19
+ })) ?? [];
20
+ server.use((request, response) => {
21
+ const url = new URL(`${request.protocol}://${request.get('host')}${request.originalUrl}`);
22
+ let restRequestSuggestions = [];
23
+ if (rest) {
24
+ restRequestSuggestions = (0, helpers_2.getRestUrlSuggestions)({
25
+ url,
26
+ requestConfigs: restRequestConfigs
27
+ });
28
+ }
29
+ let graphqlRequestSuggestions = [];
30
+ if (graphql && (0, helpers_1.parseGraphQLRequest)(request)) {
31
+ graphqlRequestSuggestions = (0, helpers_2.getGraphqlUrlSuggestions)({
32
+ url,
33
+ requestConfigs: graphqlRequestConfigs
34
+ });
35
+ }
36
+ const isRequestSupportHtml = request.headers.accept?.includes('text/html') || request.headers.accept?.includes('*/*');
37
+ if (isRequestSupportHtml) {
38
+ response.status(404).render('pages/404', {
39
+ restRequestSuggestions,
40
+ graphqlRequestSuggestions
41
+ });
42
+ return;
43
+ }
44
+ response.status(404).json({
45
+ message: 'Request or page not found. Similar requests in data',
46
+ data: {
47
+ restRequestSuggestions,
48
+ graphqlRequestSuggestions
49
+ }
50
+ });
51
+ });
52
+ };
53
+ exports.notFoundMiddleware = notFoundMiddleware;
@@ -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((0, helpers_1.asyncHandler)(async (request, _response, next) => {
7
+ await (0, helpers_1.callRequestInterceptor)({ request, interceptor });
8
+ return next();
9
+ }));
10
+ };
11
+ exports.requestInterceptorMiddleware = requestInterceptorMiddleware;
@@ -0,0 +1,3 @@
1
+ import type { Express } from 'express';
2
+ import type { BaseUrl, StaticPath } from '../../../utils/types';
3
+ export declare const staticMiddleware: (server: Express, baseUrl: BaseUrl, staticPath: StaticPath) => void;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.staticMiddleware = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const constants_1 = require("../../../utils/constants");
9
+ const helpers_1 = require("../../../utils/helpers");
10
+ const staticMiddleware = (server, baseUrl, staticPath) => {
11
+ const isStaticPathArray = Array.isArray(staticPath);
12
+ if (isStaticPathArray) {
13
+ staticPath.forEach((staticPath) => {
14
+ const isPathObject = typeof staticPath === 'object';
15
+ if (isPathObject) {
16
+ server.use((0, helpers_1.urlJoin)(baseUrl, staticPath.prefix), express_1.default.static((0, helpers_1.urlJoin)(constants_1.APP_PATH, staticPath.path)));
17
+ return;
18
+ }
19
+ server.use(baseUrl, express_1.default.static((0, helpers_1.urlJoin)(constants_1.APP_PATH, staticPath)));
20
+ });
21
+ return;
22
+ }
23
+ const isStaticPathObject = typeof staticPath === 'object';
24
+ if (isStaticPathObject) {
25
+ server.use((0, helpers_1.urlJoin)(baseUrl, staticPath.prefix), express_1.default.static((0, helpers_1.urlJoin)(constants_1.APP_PATH, staticPath.path)));
26
+ return;
27
+ }
28
+ server.use(baseUrl, express_1.default.static((0, helpers_1.urlJoin)(constants_1.APP_PATH, staticPath)));
29
+ };
30
+ exports.staticMiddleware = staticMiddleware;
@@ -0,0 +1,3 @@
1
+ import type { IRouter } from 'express';
2
+ import type { Interceptors, RestConfig } from '../../../utils/types';
3
+ export declare const createRestRoutes: (router: IRouter, restConfig: RestConfig, serverResponseInterceptors?: Interceptors['response']) => IRouter;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRestRoutes = void 0;
4
+ const flat_1 = require("flat");
5
+ const helpers_1 = require("../../../utils/helpers");
6
+ const helpers_2 = require("./helpers");
7
+ const createRestRoutes = (router, restConfig, serverResponseInterceptors) => {
8
+ (0, helpers_2.prepareRestRequestConfigs)(restConfig.configs).forEach((requestConfig) => {
9
+ router.route(requestConfig.path)[requestConfig.method]((0, helpers_1.asyncHandler)(async (request, response, next) => {
10
+ const requestInterceptor = requestConfig.interceptors?.request;
11
+ if (requestInterceptor) {
12
+ await (0, helpers_1.callRequestInterceptor)({ request, interceptor: requestInterceptor });
13
+ }
14
+ const matchedRouteConfig = requestConfig.routes.find(({ entities }) => {
15
+ if (!entities)
16
+ return true;
17
+ const entries = Object.entries(entities);
18
+ return entries.every(([entityName, valueOrDescriptor]) => {
19
+ const { checkMode, value: descriptorValue } = (0, helpers_1.convertToEntityDescriptor)(valueOrDescriptor);
20
+ // ✅ important: check whole body as plain value strictly if descriptor used for body
21
+ const isBodyPlain = entityName === 'body' && (0, helpers_1.isEntityDescriptor)(valueOrDescriptor);
22
+ if (isBodyPlain) {
23
+ // ✅ important: bodyParser sets body to empty object if body not sent or invalid, so count {} as undefined
24
+ return (0, helpers_1.resolveEntityValues)(checkMode, Object.keys(request.body).length ? request.body : undefined, descriptorValue);
25
+ }
26
+ const mappedEntityDescriptors = Object.entries(valueOrDescriptor);
27
+ return mappedEntityDescriptors.every(([entityKey, mappedEntityDescriptor]) => {
28
+ const { checkMode, value: descriptorValue } = (0, helpers_1.convertToEntityDescriptor)(mappedEntityDescriptor);
29
+ const flattenEntity = (0, flat_1.flatten)(request[entityName]);
30
+ return (0, helpers_1.resolveEntityValues)(checkMode, flattenEntity[entityKey], descriptorValue);
31
+ });
32
+ });
33
+ });
34
+ if (!matchedRouteConfig) {
35
+ return next();
36
+ }
37
+ const matchedRouteConfigData = typeof matchedRouteConfig.data === 'function'
38
+ ? await matchedRouteConfig.data(request, matchedRouteConfig.entities ?? {})
39
+ : matchedRouteConfig.data;
40
+ const data = await (0, helpers_1.callResponseInterceptors)({
41
+ data: matchedRouteConfigData,
42
+ request,
43
+ response,
44
+ interceptors: {
45
+ routeInterceptor: matchedRouteConfig.interceptors?.response,
46
+ requestInterceptor: requestConfig.interceptors?.response,
47
+ apiInterceptor: restConfig.interceptors?.response,
48
+ serverInterceptor: serverResponseInterceptors
49
+ }
50
+ });
51
+ // ✅ important:
52
+ // set 'Cache-Control' header for explicit browsers response revalidate
53
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
54
+ response.set('Cache-control', 'max-age=0, must-revalidate');
55
+ return response.status(response.statusCode).json(data);
56
+ }));
57
+ });
58
+ return router;
59
+ };
60
+ exports.createRestRoutes = createRestRoutes;
@@ -0,0 +1 @@
1
+ export * from './prepareRestRequestConfigs/prepareRestRequestConfigs';