mock-config-server 3.0.1 → 3.1.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 (146) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +614 -502
  3. package/dist/bin/bin.js +8 -3
  4. package/dist/bin/build.js +51 -45
  5. package/dist/bin/cli.js +37 -44
  6. package/dist/bin/helpers/index.js +36 -17
  7. package/dist/bin/helpers/resolveConfigFile.js +20 -17
  8. package/dist/bin/helpers/resolveConfigFilePath.js +12 -35
  9. package/dist/bin/helpers/resolveExportsFromSourceCode.js +11 -8
  10. package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.js +12 -35
  11. package/dist/bin/run.js +17 -12
  12. package/dist/bin/validateMockServerConfig/helpers/index.js +25 -16
  13. package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/index.js +14 -15
  14. package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/isCheckModeValid.js +8 -6
  15. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/index.js +14 -15
  16. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/isDescriptorValueValid.js +15 -18
  17. package/dist/bin/validateMockServerConfig/validateBaseUrl/validateBaseUrl.js +12 -9
  18. package/dist/bin/validateMockServerConfig/validateCors/validateCors.js +75 -73
  19. package/dist/bin/validateMockServerConfig/validateDatabaseConfig/validateDatabaseConfig.d.ts +1 -0
  20. package/dist/bin/validateMockServerConfig/validateDatabaseConfig/validateDatabaseConfig.js +45 -0
  21. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateGraphqlConfig.js +47 -43
  22. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.js +90 -83
  23. package/dist/bin/validateMockServerConfig/validateInterceptors/validateInterceptors.js +22 -16
  24. package/dist/bin/validateMockServerConfig/validateMockServerConfig.js +29 -27
  25. package/dist/bin/validateMockServerConfig/validatePort/validatePort.js +9 -6
  26. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRestConfig.js +52 -47
  27. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.js +94 -87
  28. package/dist/bin/validateMockServerConfig/validateStaticPath/validateStaticPath.js +43 -34
  29. package/dist/index.js +14 -15
  30. package/dist/src/core/database/createDatabaseRoutes/createDatabaseRoutes.d.ts +3 -0
  31. package/dist/src/core/database/createDatabaseRoutes/createDatabaseRoutes.js +33 -0
  32. package/dist/src/core/database/createDatabaseRoutes/helpers/array/createNewId/createNewId.d.ts +4 -0
  33. package/dist/src/core/database/createDatabaseRoutes/helpers/array/createNewId/createNewId.js +16 -0
  34. package/dist/src/core/database/createDatabaseRoutes/helpers/array/findIndexById/findIndexById.d.ts +4 -0
  35. package/dist/src/core/database/createDatabaseRoutes/helpers/array/findIndexById/findIndexById.js +8 -0
  36. package/dist/src/core/database/createDatabaseRoutes/helpers/array/index.d.ts +3 -0
  37. package/dist/src/core/database/createDatabaseRoutes/helpers/array/index.js +38 -0
  38. package/dist/src/core/database/createDatabaseRoutes/helpers/array/isIndex/isIndex.d.ts +1 -0
  39. package/dist/src/core/database/createDatabaseRoutes/helpers/array/isIndex/isIndex.js +8 -0
  40. package/dist/src/core/database/createDatabaseRoutes/helpers/createNestedDatabaseRoutes/createNestedDatabaseRoutes.d.ts +4 -0
  41. package/dist/src/core/database/createDatabaseRoutes/helpers/createNestedDatabaseRoutes/createNestedDatabaseRoutes.js +88 -0
  42. package/dist/src/core/database/createDatabaseRoutes/helpers/createRewrittenDatabaseRoutes/createRewrittenDatabaseRoutes.d.ts +2 -0
  43. package/dist/src/core/database/createDatabaseRoutes/helpers/createRewrittenDatabaseRoutes/createRewrittenDatabaseRoutes.js +12 -0
  44. package/dist/src/core/database/createDatabaseRoutes/helpers/createShallowDatabaseRoutes/createShallowDatabaseRoutes.d.ts +4 -0
  45. package/dist/src/core/database/createDatabaseRoutes/helpers/createShallowDatabaseRoutes/createShallowDatabaseRoutes.js +38 -0
  46. package/dist/src/core/database/createDatabaseRoutes/helpers/index.d.ts +5 -0
  47. package/dist/src/core/database/createDatabaseRoutes/helpers/index.js +60 -0
  48. package/dist/src/core/database/createDatabaseRoutes/helpers/splitDatabaseByNesting/splitDatabaseByNesting.d.ts +5 -0
  49. package/dist/src/core/database/createDatabaseRoutes/helpers/splitDatabaseByNesting/splitDatabaseByNesting.js +30 -0
  50. package/dist/src/core/database/createDatabaseRoutes/storages/File/FileStorage.d.ts +11 -0
  51. package/dist/src/core/database/createDatabaseRoutes/storages/File/FileStorage.js +64 -0
  52. package/dist/src/core/database/createDatabaseRoutes/storages/File/FileWriter.d.ts +11 -0
  53. package/dist/src/core/database/createDatabaseRoutes/storages/File/FileWriter.js +58 -0
  54. package/dist/src/core/database/createDatabaseRoutes/storages/Memory/MemoryStorage.d.ts +10 -0
  55. package/dist/src/core/database/createDatabaseRoutes/storages/Memory/MemoryStorage.js +54 -0
  56. package/dist/src/core/database/createDatabaseRoutes/storages/index.d.ts +2 -0
  57. package/dist/src/core/database/createDatabaseRoutes/storages/index.js +27 -0
  58. package/dist/src/core/database/index.d.ts +1 -0
  59. package/dist/src/core/database/index.js +16 -0
  60. package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.js +96 -83
  61. package/dist/src/core/graphql/createGraphQLRoutes/helpers/index.js +14 -15
  62. package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.js +36 -30
  63. package/dist/src/core/graphql/index.js +14 -15
  64. package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.js +15 -13
  65. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.js +14 -15
  66. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.js +16 -14
  67. package/dist/src/core/middlewares/corsMiddleware/corsMiddleware.js +48 -41
  68. package/dist/src/core/middlewares/corsMiddleware/helpers/getAllowedOrigins/getAllowedOrigins.js +13 -10
  69. package/dist/src/core/middlewares/corsMiddleware/helpers/index.js +14 -15
  70. package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.js +21 -18
  71. package/dist/src/core/middlewares/errorMiddleware/errorMiddleware.js +18 -15
  72. package/dist/src/core/middlewares/index.js +92 -23
  73. package/dist/src/core/middlewares/noCorsMiddleware/noCorsMiddleware.js +21 -21
  74. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getGraphqlUrlSuggestions/getGraphqlUrlSuggestions.js +24 -16
  75. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getLevenshteinDistance/getLevenshteinDistance.js +78 -74
  76. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/getRestUrlSuggestions.js +36 -31
  77. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getActualRestUrlMeaningfulString/getActualRestUrlMeaningfulString.js +6 -5
  78. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getPatternRestUrlMeaningfulString/getPatternRestUrlMeaningfulString.js +6 -3
  79. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/index.js +25 -16
  80. package/dist/src/core/middlewares/notFoundMiddleware/helpers/index.js +36 -17
  81. package/dist/src/core/middlewares/notFoundMiddleware/notFoundMiddleware.js +63 -48
  82. package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.js +13 -7
  83. package/dist/src/core/middlewares/staticMiddleware/staticMiddleware.js +26 -25
  84. package/dist/src/core/rest/createRestRoutes/createRestRoutes.js +71 -56
  85. package/dist/src/core/rest/createRestRoutes/helpers/index.js +14 -15
  86. package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.js +38 -32
  87. package/dist/src/core/rest/index.js +14 -15
  88. package/dist/src/index.js +36 -17
  89. package/dist/src/server/createMockServer/createMockServer.js +74 -53
  90. package/dist/src/server/index.js +25 -16
  91. package/dist/src/server/startMockServer/startMockServer.js +20 -17
  92. package/dist/src/static/views/assets/icons/scheme-dark.svg +3 -3
  93. package/dist/src/static/views/assets/icons/scheme-light.svg +3 -3
  94. package/dist/src/static/views/assets/styles/global.css +88 -88
  95. package/dist/src/static/views/components/header/index.css +55 -55
  96. package/dist/src/static/views/components/header/index.ejs +39 -39
  97. package/dist/src/static/views/components/header/index.js +1 -1
  98. package/dist/src/static/views/features/scheme/dark.css +12 -12
  99. package/dist/src/static/views/features/scheme/index.ejs +3 -3
  100. package/dist/src/static/views/features/scheme/index.js +31 -31
  101. package/dist/src/static/views/features/scheme/light.css +12 -12
  102. package/dist/src/static/views/features/tab/index.css +30 -30
  103. package/dist/src/static/views/features/tab/index.ejs +1 -1
  104. package/dist/src/static/views/features/tab/index.js +12 -12
  105. package/dist/src/static/views/pages/404/index.css +10 -10
  106. package/dist/src/static/views/pages/404/index.ejs +84 -84
  107. package/dist/src/utils/constants/appPath.js +6 -2
  108. package/dist/src/utils/constants/checkModes.js +21 -30
  109. package/dist/src/utils/constants/default.js +15 -11
  110. package/dist/src/utils/constants/index.js +36 -17
  111. package/dist/src/utils/helpers/asyncHandler.js +6 -3
  112. package/dist/src/utils/helpers/config/index.js +14 -15
  113. package/dist/src/utils/helpers/config/resolveEntityValues/resolveEntityValues.js +109 -122
  114. package/dist/src/utils/helpers/entities/convertToEntityDescriptor/convertToEntityDescriptor.js +10 -6
  115. package/dist/src/utils/helpers/entities/index.js +25 -16
  116. package/dist/src/utils/helpers/entities/isEntityDescriptor/isEntityDescriptor.js +7 -4
  117. package/dist/src/utils/helpers/graphql/getGraphQLInput/getGraphQLInput.js +28 -18
  118. package/dist/src/utils/helpers/graphql/index.js +36 -17
  119. package/dist/src/utils/helpers/graphql/parseGraphQLRequest/parseGraphQLRequest.js +11 -9
  120. package/dist/src/utils/helpers/graphql/parseQuery/parseQuery.js +20 -17
  121. package/dist/src/utils/helpers/index.js +114 -25
  122. package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.js +22 -16
  123. package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.js +56 -48
  124. package/dist/src/utils/helpers/interceptors/helpers/setDelay.js +8 -5
  125. package/dist/src/utils/helpers/interceptors/index.js +25 -16
  126. package/dist/src/utils/helpers/isPlainObject/isPlainObject.js +6 -6
  127. package/dist/src/utils/helpers/isPrimitive/isPrimitive.js +6 -3
  128. package/dist/src/utils/helpers/isRegExp/isRegExp.js +6 -3
  129. package/dist/src/utils/helpers/sleep.js +7 -4
  130. package/dist/src/utils/helpers/url/convertWin32PathToUnix/convertWin32PathToUnix.js +6 -6
  131. package/dist/src/utils/helpers/url/getUrlParts/getUrlParts.js +7 -4
  132. package/dist/src/utils/helpers/url/index.js +47 -18
  133. package/dist/src/utils/helpers/url/removeLeadingAndTrailingSlashes/removeLeadingAndTrailingSlashes.js +6 -3
  134. package/dist/src/utils/helpers/url/urlJoin/urlJoin.js +11 -10
  135. package/dist/src/utils/types/checkModes.js +1 -2
  136. package/dist/src/utils/types/database.d.ts +6 -0
  137. package/dist/src/utils/types/database.js +1 -0
  138. package/dist/src/utils/types/graphql.js +1 -2
  139. package/dist/src/utils/types/index.d.ts +1 -0
  140. package/dist/src/utils/types/index.js +80 -20
  141. package/dist/src/utils/types/interceptors.js +1 -2
  142. package/dist/src/utils/types/rest.js +1 -2
  143. package/dist/src/utils/types/server.d.ts +5 -0
  144. package/dist/src/utils/types/server.js +1 -2
  145. package/dist/src/utils/types/values.js +1 -2
  146. package/package.json +130 -113
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createNestedDatabaseRoutes = void 0;
7
+ var _array = require("../array");
8
+ const createNestedDatabaseRoutes = (router, database, storage) => {
9
+ Object.keys(database).forEach(key => {
10
+ const collectionPath = `/${key}`;
11
+ const itemPath = `/${key}/:id`;
12
+ router.route(collectionPath).get((_request, response) => {
13
+ // ✅ important:
14
+ // set 'Cache-Control' header for explicit browsers response revalidate
15
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
16
+ response.set('Cache-control', 'max-age=0, must-revalidate');
17
+ response.json(storage.read(key));
18
+ });
19
+ router.route(collectionPath).post((request, response) => {
20
+ const collection = storage.read(key);
21
+ const newResourceId = (0, _array.createNewId)(collection);
22
+ const newResource = {
23
+ ...request.body,
24
+ id: newResourceId
25
+ };
26
+ storage.write([key, collection.length], newResource);
27
+ response.set('Location', `${request.url}/${newResourceId}`);
28
+ response.status(201).json(newResource);
29
+ });
30
+ router.route(itemPath).get((request, response) => {
31
+ const currentResourceCollection = storage.read(key);
32
+ const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
33
+ if (currentResourceIndex === -1) {
34
+ response.status(404).end();
35
+ return;
36
+ }
37
+
38
+ // ✅ important:
39
+ // set 'Cache-Control' header for explicit browsers response revalidate
40
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
41
+ response.set('Cache-control', 'max-age=0, must-revalidate');
42
+ response.json(storage.read([key, currentResourceIndex]));
43
+ });
44
+ router.route(itemPath).put((request, response) => {
45
+ const currentResourceCollection = storage.read(key);
46
+ const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
47
+ if (currentResourceIndex === -1) {
48
+ response.status(404).end();
49
+ return;
50
+ }
51
+ const currentResource = storage.read([key, currentResourceIndex]);
52
+ const updatedResource = {
53
+ ...request.body,
54
+ id: currentResource.id
55
+ };
56
+ storage.write([key, currentResourceIndex], updatedResource);
57
+ response.json(updatedResource);
58
+ });
59
+ router.route(itemPath).patch((request, response) => {
60
+ const currentResourceCollection = storage.read(key);
61
+ const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
62
+ if (currentResourceIndex === -1) {
63
+ response.status(404).end();
64
+ return;
65
+ }
66
+ const currentResource = storage.read([key, currentResourceIndex]);
67
+ const updatedResource = {
68
+ ...currentResource,
69
+ ...request.body,
70
+ id: currentResource.id
71
+ };
72
+ storage.write([key, currentResourceIndex], updatedResource);
73
+ response.json(updatedResource);
74
+ });
75
+ router.route(itemPath).delete((request, response) => {
76
+ const currentResourceCollection = storage.read(key);
77
+ const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
78
+ if (currentResourceIndex === -1) {
79
+ response.status(404).end();
80
+ return;
81
+ }
82
+ storage.delete([key, currentResourceIndex]);
83
+ response.status(204).end();
84
+ });
85
+ });
86
+ return router;
87
+ };
88
+ exports.createNestedDatabaseRoutes = createNestedDatabaseRoutes;
@@ -0,0 +1,2 @@
1
+ import type { IRouter } from 'express';
2
+ export declare const createRewrittenDatabaseRoutes: (router: IRouter, rewrittenRoutes: Record<string, string>) => void;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createRewrittenDatabaseRoutes = void 0;
7
+ var _expressUrlrewrite = _interopRequireDefault(require("express-urlrewrite"));
8
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ const createRewrittenDatabaseRoutes = (router, rewrittenRoutes) => Object.entries(rewrittenRoutes).forEach(([key, value]) => {
10
+ router.use((0, _expressUrlrewrite.default)(key, value));
11
+ });
12
+ exports.createRewrittenDatabaseRoutes = createRewrittenDatabaseRoutes;
@@ -0,0 +1,4 @@
1
+ import type { IRouter } from 'express';
2
+ import type { ShallowDatabase } from '../../../../../utils/types';
3
+ import type { MemoryStorage } from '../../storages';
4
+ export declare const createShallowDatabaseRoutes: (router: IRouter, database: ShallowDatabase, storage: MemoryStorage<ShallowDatabase>) => IRouter;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createShallowDatabaseRoutes = void 0;
7
+ const createShallowDatabaseRoutes = (router, database, storage) => {
8
+ Object.keys(database).forEach(key => {
9
+ const path = `/${key}`;
10
+ router.route(path).get((_request, response) => {
11
+ // ✅ important:
12
+ // set 'Cache-Control' header for explicit browsers response revalidate
13
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
14
+ response.set('Cache-control', 'max-age=0, must-revalidate');
15
+ response.json(storage.read(key));
16
+ });
17
+ router.route(path).post((request, response) => {
18
+ storage.write(key, request.body);
19
+ response.set('Location', request.url);
20
+ response.status(201).json(request.body);
21
+ });
22
+ router.route(path).put((request, response) => {
23
+ storage.write(key, request.body);
24
+ response.json(request.body);
25
+ });
26
+ router.route(path).patch((request, response) => {
27
+ const currentResource = storage.read(key);
28
+ const updatedResource = {
29
+ ...currentResource,
30
+ ...request.body
31
+ };
32
+ storage.write(key, updatedResource);
33
+ response.json(updatedResource);
34
+ });
35
+ });
36
+ return router;
37
+ };
38
+ exports.createShallowDatabaseRoutes = createShallowDatabaseRoutes;
@@ -0,0 +1,5 @@
1
+ export * from './array';
2
+ export * from './createRewrittenDatabaseRoutes/createRewrittenDatabaseRoutes';
3
+ export * from './createNestedDatabaseRoutes/createNestedDatabaseRoutes';
4
+ export * from './createShallowDatabaseRoutes/createShallowDatabaseRoutes';
5
+ export * from './splitDatabaseByNesting/splitDatabaseByNesting';
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _array = require("./array");
7
+ Object.keys(_array).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _array[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _array[key];
14
+ }
15
+ });
16
+ });
17
+ var _createRewrittenDatabaseRoutes = require("./createRewrittenDatabaseRoutes/createRewrittenDatabaseRoutes");
18
+ Object.keys(_createRewrittenDatabaseRoutes).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _createRewrittenDatabaseRoutes[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _createRewrittenDatabaseRoutes[key];
25
+ }
26
+ });
27
+ });
28
+ var _createNestedDatabaseRoutes = require("./createNestedDatabaseRoutes/createNestedDatabaseRoutes");
29
+ Object.keys(_createNestedDatabaseRoutes).forEach(function (key) {
30
+ if (key === "default" || key === "__esModule") return;
31
+ if (key in exports && exports[key] === _createNestedDatabaseRoutes[key]) return;
32
+ Object.defineProperty(exports, key, {
33
+ enumerable: true,
34
+ get: function () {
35
+ return _createNestedDatabaseRoutes[key];
36
+ }
37
+ });
38
+ });
39
+ var _createShallowDatabaseRoutes = require("./createShallowDatabaseRoutes/createShallowDatabaseRoutes");
40
+ Object.keys(_createShallowDatabaseRoutes).forEach(function (key) {
41
+ if (key === "default" || key === "__esModule") return;
42
+ if (key in exports && exports[key] === _createShallowDatabaseRoutes[key]) return;
43
+ Object.defineProperty(exports, key, {
44
+ enumerable: true,
45
+ get: function () {
46
+ return _createShallowDatabaseRoutes[key];
47
+ }
48
+ });
49
+ });
50
+ var _splitDatabaseByNesting = require("./splitDatabaseByNesting/splitDatabaseByNesting");
51
+ Object.keys(_splitDatabaseByNesting).forEach(function (key) {
52
+ if (key === "default" || key === "__esModule") return;
53
+ if (key in exports && exports[key] === _splitDatabaseByNesting[key]) return;
54
+ Object.defineProperty(exports, key, {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _splitDatabaseByNesting[key];
58
+ }
59
+ });
60
+ });
@@ -0,0 +1,5 @@
1
+ import type { DatabaseConfig, NestedDatabase, ShallowDatabase } from '../../../../../utils/types';
2
+ export declare const splitDatabaseByNesting: (data: DatabaseConfig['data']) => {
3
+ shallowDatabase: ShallowDatabase;
4
+ nestedDatabase: NestedDatabase;
5
+ };
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.splitDatabaseByNesting = void 0;
7
+ var _helpers = require("../../../../../utils/helpers");
8
+ const isAllArrayElementsHaveValidTypeId = array => array.every(element => (0, _helpers.isPlainObject)(element) && (typeof element.id === 'number' || typeof element.id === 'string'));
9
+ const isAllArrayElementsHaveUniqueId = array => {
10
+ const uniqueIdsCount = new Set(array.map(({
11
+ id
12
+ }) => id)).size;
13
+ return array.length === uniqueIdsCount;
14
+ };
15
+ const splitDatabaseByNesting = data => {
16
+ const shallowDatabase = {};
17
+ const nestedDatabase = {};
18
+ Object.entries(data).forEach(([databaseEntityKey, databaseEntityValue]) => {
19
+ if (Array.isArray(databaseEntityValue) && isAllArrayElementsHaveValidTypeId(databaseEntityValue) && isAllArrayElementsHaveUniqueId(databaseEntityValue)) {
20
+ nestedDatabase[databaseEntityKey] = databaseEntityValue;
21
+ return;
22
+ }
23
+ shallowDatabase[databaseEntityKey] = databaseEntityValue;
24
+ });
25
+ return {
26
+ shallowDatabase,
27
+ nestedDatabase
28
+ };
29
+ };
30
+ exports.splitDatabaseByNesting = splitDatabaseByNesting;
@@ -0,0 +1,11 @@
1
+ type Index = string | number;
2
+ type Object = Record<Index, any>;
3
+ export declare class FileStorage<T extends Object = Object> {
4
+ private readonly fileWriter;
5
+ private readonly data;
6
+ constructor(fileName: string);
7
+ read(key?: Index | Index[]): any;
8
+ write(key: Index | Index[], value: unknown): void;
9
+ delete(key: Index | Index[]): void;
10
+ }
11
+ export {};
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FileStorage = void 0;
7
+ var _fs = _interopRequireDefault(require("fs"));
8
+ var _path = _interopRequireDefault(require("path"));
9
+ var _constants = require("../../../../../utils/constants");
10
+ var _helpers = require("../../helpers");
11
+ var _FileWriter = require("./FileWriter");
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
14
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
15
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
16
+ class FileStorage {
17
+ constructor(fileName) {
18
+ _defineProperty(this, "fileWriter", void 0);
19
+ _defineProperty(this, "data", void 0);
20
+ const filePath = _path.default.resolve(_constants.APP_PATH, fileName);
21
+ this.fileWriter = new _FileWriter.FileWriter(filePath);
22
+ this.data = JSON.parse(_fs.default.readFileSync(filePath, 'utf-8'));
23
+ }
24
+ read(key) {
25
+ if (!key) return this.data;
26
+ const keys = Array.isArray(key) ? key : [key];
27
+ let readable = this.data;
28
+ for (const currentKey of keys) {
29
+ readable = readable[currentKey];
30
+ }
31
+ return readable;
32
+ }
33
+ write(key, value) {
34
+ const keys = Array.isArray(key) ? key : [key];
35
+ let writable = this.data;
36
+ let index = 0;
37
+ // ✅ important:
38
+ // stop iterate one element before end of keys for get access to writable object property
39
+ while (index < keys.length - 1) {
40
+ writable = writable[keys[index]];
41
+ index += 1;
42
+ }
43
+ writable[keys[index]] = value;
44
+ this.fileWriter.write(JSON.stringify(this.data));
45
+ }
46
+ delete(key) {
47
+ const keys = Array.isArray(key) ? key : [key];
48
+ let deletable = this.data;
49
+ let index = 0;
50
+ // ✅ important:
51
+ // stop iterate one element before end of key for get access to deletable object property
52
+ while (index < keys.length - 1) {
53
+ deletable = deletable[keys[index]];
54
+ index += 1;
55
+ }
56
+ if (Array.isArray(deletable) && (0, _helpers.isIndex)(keys[index])) {
57
+ deletable.splice(keys[index], 1);
58
+ } else {
59
+ delete deletable[keys[index]];
60
+ }
61
+ this.fileWriter.write(JSON.stringify(this.data));
62
+ }
63
+ }
64
+ exports.FileStorage = FileStorage;
@@ -0,0 +1,11 @@
1
+ export declare class FileWriter {
2
+ private readonly filePath;
3
+ private nextData;
4
+ private nextDataPromise;
5
+ private nextDataResolve;
6
+ private writeIsLocked;
7
+ constructor(filePath: string);
8
+ private lockedWrite;
9
+ private unlockedWrite;
10
+ write(data: string): Promise<void>;
11
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FileWriter = void 0;
7
+ var _fs = _interopRequireDefault(require("fs"));
8
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
10
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
11
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
12
+ class FileWriter {
13
+ constructor(filePath) {
14
+ _defineProperty(this, "filePath", void 0);
15
+ _defineProperty(this, "nextData", null);
16
+ _defineProperty(this, "nextDataPromise", null);
17
+ _defineProperty(this, "nextDataResolve", null);
18
+ _defineProperty(this, "writeIsLocked", false);
19
+ this.filePath = filePath;
20
+ }
21
+ lockedWrite(data) {
22
+ var _this$nextDataPromise;
23
+ this.nextData = data;
24
+ this.nextDataPromise = (_this$nextDataPromise = this.nextDataPromise) !== null && _this$nextDataPromise !== void 0 ? _this$nextDataPromise : new Promise(resolve => {
25
+ this.nextDataResolve = resolve;
26
+ });
27
+ return new Promise(resolve => {
28
+ var _this$nextDataPromise2;
29
+ (_this$nextDataPromise2 = this.nextDataPromise) === null || _this$nextDataPromise2 === void 0 ? void 0 : _this$nextDataPromise2.then(() => {
30
+ resolve();
31
+ });
32
+ });
33
+ }
34
+ async unlockedWrite(data, recursionLevel = 0) {
35
+ this.writeIsLocked = true;
36
+ await _fs.default.promises.writeFile(this.filePath, data, 'utf-8');
37
+ this.writeIsLocked = false;
38
+
39
+ // ✅ important:
40
+ // copy content of this.nextData into new variable
41
+ // for avoid infinite recursion of 'unlockedWrite'
42
+ const passedData = this.nextData;
43
+ this.nextData = null;
44
+ if (passedData) {
45
+ await this.unlockedWrite(passedData, recursionLevel + 1);
46
+ if (recursionLevel === 0) {
47
+ var _this$nextDataResolve;
48
+ (_this$nextDataResolve = this.nextDataResolve) === null || _this$nextDataResolve === void 0 ? void 0 : _this$nextDataResolve.call(this);
49
+ this.nextDataPromise = null;
50
+ this.nextDataResolve = null;
51
+ }
52
+ }
53
+ }
54
+ write(data) {
55
+ return this.writeIsLocked ? this.lockedWrite(data) : this.unlockedWrite(data);
56
+ }
57
+ }
58
+ exports.FileWriter = FileWriter;
@@ -0,0 +1,10 @@
1
+ type Index = string | number;
2
+ type Object = Record<Index, any>;
3
+ export declare class MemoryStorage<T extends Object = Object> {
4
+ private readonly data;
5
+ constructor(initialData: T);
6
+ read(key?: Index | Index[]): any;
7
+ write(key: Index | Index[], value: unknown): void;
8
+ delete(key: Index | Index[]): void;
9
+ }
10
+ export {};
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.MemoryStorage = void 0;
7
+ var _helpers = require("../../helpers");
8
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
10
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
11
+ class MemoryStorage {
12
+ constructor(initialData) {
13
+ _defineProperty(this, "data", void 0);
14
+ this.data = initialData;
15
+ }
16
+ read(key) {
17
+ if (!key) return this.data;
18
+ const keys = Array.isArray(key) ? key : [key];
19
+ let readable = this.data;
20
+ for (const currentKey of keys) {
21
+ readable = readable[currentKey];
22
+ }
23
+ return readable;
24
+ }
25
+ write(key, value) {
26
+ const keys = Array.isArray(key) ? key : [key];
27
+ let writable = this.data;
28
+ let index = 0;
29
+ // ✅ important:
30
+ // stop iterate one element before end of keys for get access to writable object property
31
+ while (index < keys.length - 1) {
32
+ writable = writable[keys[index]];
33
+ index += 1;
34
+ }
35
+ writable[keys[index]] = value;
36
+ }
37
+ delete(key) {
38
+ const keys = Array.isArray(key) ? key : [key];
39
+ let deletable = this.data;
40
+ let index = 0;
41
+ // ✅ important:
42
+ // stop iterate one element before end of key for get access to deletable object property
43
+ while (index < keys.length - 1) {
44
+ deletable = deletable[keys[index]];
45
+ index += 1;
46
+ }
47
+ if (Array.isArray(deletable) && (0, _helpers.isIndex)(keys[index])) {
48
+ deletable.splice(keys[index], 1);
49
+ return;
50
+ }
51
+ delete deletable[keys[index]];
52
+ }
53
+ }
54
+ exports.MemoryStorage = MemoryStorage;
@@ -0,0 +1,2 @@
1
+ export * from './File/FileStorage';
2
+ export * from './Memory/MemoryStorage';
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _FileStorage = require("./File/FileStorage");
7
+ Object.keys(_FileStorage).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _FileStorage[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _FileStorage[key];
14
+ }
15
+ });
16
+ });
17
+ var _MemoryStorage = require("./Memory/MemoryStorage");
18
+ Object.keys(_MemoryStorage).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _MemoryStorage[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _MemoryStorage[key];
25
+ }
26
+ });
27
+ });
@@ -0,0 +1 @@
1
+ export * from './createDatabaseRoutes/createDatabaseRoutes';
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _createDatabaseRoutes = require("./createDatabaseRoutes/createDatabaseRoutes");
7
+ Object.keys(_createDatabaseRoutes).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _createDatabaseRoutes[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _createDatabaseRoutes[key];
14
+ }
15
+ });
16
+ });