mock-config-server 3.4.1 → 3.6.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 (148) hide show
  1. package/README.md +2 -0
  2. package/dist/bin/bin.js +3 -6
  3. package/dist/bin/build.js +52 -50
  4. package/dist/bin/cli.js +50 -43
  5. package/dist/bin/helpers/createTemplate.js +29 -21
  6. package/dist/bin/helpers/getMostSpecificPathFromError.js +34 -30
  7. package/dist/bin/helpers/getValidationMessageFromPath.js +11 -8
  8. package/dist/bin/helpers/index.js +21 -79
  9. package/dist/bin/helpers/isOnlyRequestedDataResolvingPropertyExists.js +13 -6
  10. package/dist/bin/helpers/resolveConfigFile.js +22 -19
  11. package/dist/bin/helpers/resolveConfigFilePath.js +19 -12
  12. package/dist/bin/helpers/resolveExportsFromSourceCode.js +13 -10
  13. package/dist/bin/init.js +114 -97
  14. package/dist/bin/run.js +42 -43
  15. package/dist/bin/validateMockServerConfig/baseUrlSchema/baseUrlSchema.js +9 -5
  16. package/dist/bin/validateMockServerConfig/corsSchema/corsSchema.d.ts +2 -2
  17. package/dist/bin/validateMockServerConfig/corsSchema/corsSchema.js +32 -14
  18. package/dist/bin/validateMockServerConfig/databaseConfigSchema/databaseConfigSchema.js +19 -9
  19. package/dist/bin/validateMockServerConfig/graphqlConfigSchema/graphqlConfigSchema.d.ts +82 -72
  20. package/dist/bin/validateMockServerConfig/graphqlConfigSchema/graphqlConfigSchema.js +38 -22
  21. package/dist/bin/validateMockServerConfig/graphqlConfigSchema/routeConfigSchema/routeConfigSchema.d.ts +25 -21
  22. package/dist/bin/validateMockServerConfig/graphqlConfigSchema/routeConfigSchema/routeConfigSchema.js +36 -28
  23. package/dist/bin/validateMockServerConfig/interceptorsSchema/interceptorsSchema.js +12 -8
  24. package/dist/bin/validateMockServerConfig/portSchema/portSchema.js +9 -5
  25. package/dist/bin/validateMockServerConfig/queueSchema/queueSchema.d.ts +2 -2
  26. package/dist/bin/validateMockServerConfig/queueSchema/queueSchema.js +18 -9
  27. package/dist/bin/validateMockServerConfig/restConfigSchema/restConfigSchema.d.ts +270 -240
  28. package/dist/bin/validateMockServerConfig/restConfigSchema/restConfigSchema.js +33 -19
  29. package/dist/bin/validateMockServerConfig/restConfigSchema/routeConfigSchema/routeConfigSchema.d.ts +33 -28
  30. package/dist/bin/validateMockServerConfig/restConfigSchema/routeConfigSchema/routeConfigSchema.js +60 -48
  31. package/dist/bin/validateMockServerConfig/settingsSchema/settingsSchema.js +13 -9
  32. package/dist/bin/validateMockServerConfig/staticPathSchema/staticPathSchema.js +19 -9
  33. package/dist/bin/validateMockServerConfig/utils/checkModeSchema/checkModeSchema.js +27 -9
  34. package/dist/bin/validateMockServerConfig/utils/entitiesSchema/entitiesSchema.d.ts +4 -8
  35. package/dist/bin/validateMockServerConfig/utils/entitiesSchema/entitiesSchema.js +117 -60
  36. package/dist/bin/validateMockServerConfig/utils/index.js +20 -68
  37. package/dist/bin/validateMockServerConfig/utils/jsonSchema/jsonSchema.js +30 -10
  38. package/dist/bin/validateMockServerConfig/utils/plainObjectSchema/plainObjectSchema.js +9 -8
  39. package/dist/bin/validateMockServerConfig/utils/requiredPropertiesSchema/requiredPropertiesSchema.d.ts +1 -1
  40. package/dist/bin/validateMockServerConfig/utils/requiredPropertiesSchema/requiredPropertiesSchema.js +10 -7
  41. package/dist/bin/validateMockServerConfig/utils/sharedSchema/sharedSchema.js +18 -6
  42. package/dist/bin/validateMockServerConfig/validateApiMockServerConfig.js +43 -40
  43. package/dist/bin/validateMockServerConfig/validateMockServerConfig.js +38 -35
  44. package/dist/index.js +15 -13
  45. package/dist/src/core/database/createDatabaseRoutes/createDatabaseRoutes.js +25 -28
  46. package/dist/src/core/database/createDatabaseRoutes/helpers/array/createNewId/createNewId.js +14 -11
  47. package/dist/src/core/database/createDatabaseRoutes/helpers/array/findIndexById/findIndexById.js +8 -5
  48. package/dist/src/core/database/createDatabaseRoutes/helpers/array/index.js +17 -35
  49. package/dist/src/core/database/createDatabaseRoutes/helpers/array/isIndex/isIndex.js +8 -5
  50. package/dist/src/core/database/createDatabaseRoutes/helpers/createNestedDatabaseRoutes/createNestedDatabaseRoutes.js +159 -143
  51. package/dist/src/core/database/createDatabaseRoutes/helpers/createRewrittenDatabaseRoutes/createRewrittenDatabaseRoutes.js +15 -8
  52. package/dist/src/core/database/createDatabaseRoutes/helpers/createShallowDatabaseRoutes/createShallowDatabaseRoutes.js +90 -94
  53. package/dist/src/core/database/createDatabaseRoutes/helpers/filter/filter.js +49 -46
  54. package/dist/src/core/database/createDatabaseRoutes/helpers/index.js +19 -57
  55. package/dist/src/core/database/createDatabaseRoutes/helpers/pagination/pagination.js +32 -31
  56. package/dist/src/core/database/createDatabaseRoutes/helpers/search/search.js +34 -24
  57. package/dist/src/core/database/createDatabaseRoutes/helpers/sort/sort.js +37 -33
  58. package/dist/src/core/database/createDatabaseRoutes/helpers/splitDatabaseByNesting/splitDatabaseByNesting.js +26 -25
  59. package/dist/src/core/database/createDatabaseRoutes/storages/File/FileStorage.js +65 -50
  60. package/dist/src/core/database/createDatabaseRoutes/storages/File/FileWriter.js +55 -48
  61. package/dist/src/core/database/createDatabaseRoutes/storages/Memory/MemoryStorage.js +51 -41
  62. package/dist/src/core/database/createDatabaseRoutes/storages/index.js +16 -24
  63. package/dist/src/core/database/index.js +15 -13
  64. package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.js +131 -140
  65. package/dist/src/core/graphql/createGraphQLRoutes/helpers/index.js +15 -13
  66. package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.js +36 -41
  67. package/dist/src/core/graphql/index.js +15 -13
  68. package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.js +16 -13
  69. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/index.js +15 -13
  70. package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.js +18 -15
  71. package/dist/src/core/middlewares/corsMiddleware/corsMiddleware.js +50 -47
  72. package/dist/src/core/middlewares/corsMiddleware/helpers/getAllowedOrigins/getAllowedOrigins.js +17 -12
  73. package/dist/src/core/middlewares/corsMiddleware/helpers/index.js +15 -13
  74. package/dist/src/core/middlewares/destroyerMiddleware/destroyerMiddleware.js +23 -20
  75. package/dist/src/core/middlewares/errorMiddleware/errorMiddleware.js +23 -17
  76. package/dist/src/core/middlewares/index.js +23 -91
  77. package/dist/src/core/middlewares/noCorsMiddleware/noCorsMiddleware.js +22 -19
  78. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getGraphqlUrlSuggestions/getGraphqlUrlSuggestions.js +21 -23
  79. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getLevenshteinDistance/getLevenshteinDistance.js +80 -80
  80. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/getRestUrlSuggestions.js +34 -34
  81. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getActualRestUrlMeaningfulString/getActualRestUrlMeaningfulString.js +8 -5
  82. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getPatternRestUrlMeaningfulString/getPatternRestUrlMeaningfulString.js +8 -5
  83. package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/index.js +16 -24
  84. package/dist/src/core/middlewares/notFoundMiddleware/helpers/index.js +17 -35
  85. package/dist/src/core/middlewares/notFoundMiddleware/notFoundMiddleware.js +58 -60
  86. package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.js +16 -17
  87. package/dist/src/core/middlewares/staticMiddleware/staticMiddleware.js +32 -25
  88. package/dist/src/core/rest/createRestRoutes/createRestRoutes.js +125 -130
  89. package/dist/src/core/rest/createRestRoutes/helpers/index.js +15 -13
  90. package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.js +37 -43
  91. package/dist/src/core/rest/index.js +15 -13
  92. package/dist/src/index.js +16 -24
  93. package/dist/src/server/createDatabaseMockServer/createDatabaseMockServer.js +56 -53
  94. package/dist/src/server/createGraphQLMockServer/createGraphQLMockServer.js +64 -62
  95. package/dist/src/server/createMockServer/createMockServer.js +94 -91
  96. package/dist/src/server/createRestMockServer/createRestMockServer.js +64 -62
  97. package/dist/src/server/index.js +23 -91
  98. package/dist/src/server/startDatabaseMockServer/startDatabaseMockServer.js +25 -19
  99. package/dist/src/server/startGraphQLMockServer/startGraphQLMockServer.js +25 -19
  100. package/dist/src/server/startMockServer/startMockServer.js +25 -19
  101. package/dist/src/server/startRestMockServer/startRestMockServer.js +25 -19
  102. package/dist/src/utils/constants/appPath.js +8 -4
  103. package/dist/src/utils/constants/checkModes.js +74 -11
  104. package/dist/src/utils/constants/default.js +18 -14
  105. package/dist/src/utils/constants/index.js +17 -35
  106. package/dist/src/utils/helpers/asyncHandler.js +8 -5
  107. package/dist/src/utils/helpers/config/index.js +15 -13
  108. package/dist/src/utils/helpers/config/resolveEntityValues/resolveEntityValues.js +103 -110
  109. package/dist/src/utils/helpers/entities/convertToEntityDescriptor/convertToEntityDescriptor.js +12 -9
  110. package/dist/src/utils/helpers/entities/index.js +16 -24
  111. package/dist/src/utils/helpers/entities/isEntityDescriptor/isEntityDescriptor.js +9 -6
  112. package/dist/src/utils/helpers/files/index.js +15 -13
  113. package/dist/src/utils/helpers/files/isFilePathValid/isFilePathValid.js +22 -15
  114. package/dist/src/utils/helpers/graphql/getGraphQLInput/getGraphQLInput.js +25 -29
  115. package/dist/src/utils/helpers/graphql/index.js +17 -35
  116. package/dist/src/utils/helpers/graphql/parseGraphQLRequest/parseGraphQLRequest.js +13 -10
  117. package/dist/src/utils/helpers/graphql/parseQuery/parseQuery.js +23 -19
  118. package/dist/src/utils/helpers/index.js +26 -124
  119. package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptor.js +21 -21
  120. package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.js +62 -64
  121. package/dist/src/utils/helpers/interceptors/helpers/setDelay.js +10 -7
  122. package/dist/src/utils/helpers/interceptors/index.js +16 -24
  123. package/dist/src/utils/helpers/isPlainObject/isPlainObject.js +8 -5
  124. package/dist/src/utils/helpers/isPrimitive/isPrimitive.js +8 -5
  125. package/dist/src/utils/helpers/isRegExp/isRegExp.js +8 -5
  126. package/dist/src/utils/helpers/sleep.js +9 -6
  127. package/dist/src/utils/helpers/tests/createTmpDir.js +16 -9
  128. package/dist/src/utils/helpers/tests/index.js +15 -13
  129. package/dist/src/utils/helpers/url/convertWin32PathToUnix/convertWin32PathToUnix.js +8 -5
  130. package/dist/src/utils/helpers/url/getUrlParts/getUrlParts.js +9 -6
  131. package/dist/src/utils/helpers/url/index.js +18 -46
  132. package/dist/src/utils/helpers/url/removeLeadingAndTrailingSlashes/removeLeadingAndTrailingSlashes.js +8 -5
  133. package/dist/src/utils/helpers/url/urlJoin/urlJoin.js +18 -11
  134. package/dist/src/utils/types/checkModes.js +4 -1
  135. package/dist/src/utils/types/database.js +4 -1
  136. package/dist/src/utils/types/entities.js +4 -1
  137. package/dist/src/utils/types/graphql.d.ts +1 -1
  138. package/dist/src/utils/types/graphql.js +4 -1
  139. package/dist/src/utils/types/index.js +24 -102
  140. package/dist/src/utils/types/interceptors.js +4 -1
  141. package/dist/src/utils/types/rest.d.ts +1 -1
  142. package/dist/src/utils/types/rest.js +4 -1
  143. package/dist/src/utils/types/server.js +4 -1
  144. package/dist/src/utils/types/utils.js +4 -1
  145. package/dist/src/utils/types/values.js +4 -1
  146. package/package.json +26 -29
  147. package/dist/bin/templates/.eslintrc.js +0 -14
  148. package/dist/bin/templates/tsconfig.json +0 -11
@@ -1,148 +1,164 @@
1
1
  "use strict";
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
- value: true
3
+ value: true
5
4
  });
6
- exports.createNestedDatabaseRoutes = void 0;
7
- var _array = require("../array");
8
- var _filter = require("../filter/filter");
9
- var _pagination = require("../pagination/pagination");
10
- var _search = require("../search/search");
11
- var _sort2 = require("../sort/sort");
12
- const createNestedDatabaseRoutes = (router, database, storage) => {
13
- Object.keys(database).forEach(key => {
14
- const collectionPath = `/${key}`;
15
- const itemPath = `/${key}/:id`;
16
- router.route(collectionPath).get((request, response) => {
17
- let data = storage.read(key);
18
- if (!Array.isArray(data) || !request.query) {
19
- // important:
20
- // set 'Cache-Control' header for explicit browsers response revalidate
21
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
22
- response.set('Cache-control', 'max-age=0, must-revalidate');
23
- return response.json(data);
24
- }
25
- const {
26
- _page,
27
- _limit,
28
- _begin,
29
- _end,
30
- _sort,
31
- _order,
32
- _q,
33
- ...filters
34
- } = request.query;
35
- if (Object.keys(filters).length) {
36
- data = (0, _filter.filter)(data, filters);
37
- }
38
- if (_q) {
39
- data = (0, _search.search)(data, request.query._q);
40
- }
41
- if (_page) {
42
- data = (0, _pagination.pagination)(data, request.query);
43
- if (data._link) {
44
- const links = {};
45
- const fullUrl = `${request.protocol}://${request.get('host')}${request.originalUrl}`;
46
- if (data._link.first) {
47
- links.first = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.first}`);
48
- }
49
- if (data._link.prev) {
50
- links.prev = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.prev}`);
51
- }
52
- if (data._link.next) {
53
- links.next = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.next}`);
54
- }
55
- if (data._link.last) {
56
- links.last = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.last}`);
57
- }
58
- data._link = {
59
- ...data._link,
60
- ...links
61
- };
62
- response.links(links);
63
- }
64
- }
65
- if (_sort) {
66
- data = (0, _sort2.sort)(data, request.query);
67
- }
68
- if (_begin || _end) {
69
- var _request$query$_begin;
70
- data = data.slice((_request$query$_begin = request.query._begin) !== null && _request$query$_begin !== void 0 ? _request$query$_begin : 0, request.query._end);
71
- response.set('X-Total-Count', data.length);
72
- }
73
- // ✅ important:
74
- // set 'Cache-Control' header for explicit browsers response revalidate
75
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
76
- response.set('Cache-control', 'no-cache');
77
- response.json(data);
78
- });
79
- router.route(collectionPath).post((request, response) => {
80
- const collection = storage.read(key);
81
- const newResourceId = (0, _array.createNewId)(collection);
82
- const newResource = {
83
- ...request.body,
84
- id: newResourceId
85
- };
86
- storage.write([key, collection.length], newResource);
87
- response.set('Location', `${request.url}/${newResourceId}`);
88
- response.status(201).json(newResource);
89
- });
90
- router.route(itemPath).get((request, response) => {
91
- const currentResourceCollection = storage.read(key);
92
- const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
93
- if (currentResourceIndex === -1) {
94
- response.status(404).end();
95
- return;
96
- }
97
-
98
- // ✅ important:
99
- // set 'Cache-Control' header for explicit browsers response revalidate
100
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
101
- response.set('Cache-control', 'no-cache');
102
- response.json(storage.read([key, currentResourceIndex]));
103
- });
104
- router.route(itemPath).put((request, response) => {
105
- const currentResourceCollection = storage.read(key);
106
- const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
107
- if (currentResourceIndex === -1) {
108
- response.status(404).end();
109
- return;
110
- }
111
- const currentResource = storage.read([key, currentResourceIndex]);
112
- const updatedResource = {
113
- ...request.body,
114
- id: currentResource.id
115
- };
116
- storage.write([key, currentResourceIndex], updatedResource);
117
- response.json(updatedResource);
118
- });
119
- router.route(itemPath).patch((request, response) => {
120
- const currentResourceCollection = storage.read(key);
121
- const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
122
- if (currentResourceIndex === -1) {
123
- response.status(404).end();
124
- return;
125
- }
126
- const currentResource = storage.read([key, currentResourceIndex]);
127
- const updatedResource = {
128
- ...currentResource,
129
- ...request.body,
130
- id: currentResource.id
131
- };
132
- storage.write([key, currentResourceIndex], updatedResource);
133
- response.json(updatedResource);
134
- });
135
- router.route(itemPath).delete((request, response) => {
136
- const currentResourceCollection = storage.read(key);
137
- const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
138
- if (currentResourceIndex === -1) {
139
- response.status(404).end();
140
- return;
141
- }
142
- storage.delete([key, currentResourceIndex]);
143
- response.status(204).end();
5
+ Object.defineProperty(exports, "createNestedDatabaseRoutes", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createNestedDatabaseRoutes;
9
+ }
10
+ });
11
+ const _array = require("../array");
12
+ const _filter = require("../filter/filter");
13
+ const _pagination = require("../pagination/pagination");
14
+ const _search = require("../search/search");
15
+ const _sort = require("../sort/sort");
16
+ const createNestedDatabaseRoutes = (router, database, storage)=>{
17
+ Object.keys(database).forEach((key)=>{
18
+ const collectionPath = `/${key}`;
19
+ const itemPath = `/${key}/:id`;
20
+ router.route(collectionPath).get((request, response)=>{
21
+ let data = storage.read(key);
22
+ if (!Array.isArray(data) || !request.query) {
23
+ // ✅ important:
24
+ // set 'Cache-Control' header for explicit browsers response revalidate
25
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
26
+ response.set('Cache-control', 'max-age=0, must-revalidate');
27
+ return response.json(data);
28
+ }
29
+ const { _page, _limit, _begin, _end, _sort: _sort1, _order, _q, ...filters } = request.query;
30
+ if (Object.keys(filters).length) {
31
+ data = (0, _filter.filter)(data, filters);
32
+ }
33
+ if (_q) {
34
+ data = (0, _search.search)(data, request.query._q);
35
+ }
36
+ if (_sort1) {
37
+ data = (0, _sort.sort)(data, request.query);
38
+ }
39
+ if (_begin || _end) {
40
+ var _request_query__begin;
41
+ data = data.slice((_request_query__begin = request.query._begin) !== null && _request_query__begin !== void 0 ? _request_query__begin : 0, request.query._end);
42
+ response.set('X-Total-Count', data.length);
43
+ }
44
+ // important:
45
+ // The pagination should be last because it changes the form of the response
46
+ if (_page) {
47
+ data = (0, _pagination.pagination)(data, request.query);
48
+ if (data._link) {
49
+ const links = {};
50
+ const fullUrl = `${request.protocol}://${request.get('host')}${request.originalUrl}`;
51
+ if (data._link.first) {
52
+ links.first = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.first}`);
53
+ }
54
+ if (data._link.prev) {
55
+ links.prev = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.prev}`);
56
+ }
57
+ if (data._link.next) {
58
+ links.next = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.next}`);
59
+ }
60
+ if (data._link.last) {
61
+ links.last = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.last}`);
62
+ }
63
+ data._link = {
64
+ ...data._link,
65
+ ...links
66
+ };
67
+ response.links(links);
68
+ }
69
+ }
70
+ // ✅ important:
71
+ // set 'Cache-Control' header for explicit browsers response revalidate
72
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
73
+ response.set('Cache-control', 'no-cache');
74
+ response.json(data);
75
+ });
76
+ router.route(collectionPath).post((request, response)=>{
77
+ const collection = storage.read(key);
78
+ const newResourceId = (0, _array.createNewId)(collection);
79
+ const newResource = {
80
+ ...request.body,
81
+ id: newResourceId
82
+ };
83
+ storage.write([
84
+ key,
85
+ collection.length
86
+ ], newResource);
87
+ response.set('Location', `${request.url}/${newResourceId}`);
88
+ response.status(201).json(newResource);
89
+ });
90
+ router.route(itemPath).get((request, response)=>{
91
+ const currentResourceCollection = storage.read(key);
92
+ const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
93
+ if (currentResourceIndex === -1) {
94
+ response.status(404).end();
95
+ return;
96
+ }
97
+ // ✅ important:
98
+ // set 'Cache-Control' header for explicit browsers response revalidate
99
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
100
+ response.set('Cache-control', 'no-cache');
101
+ response.json(storage.read([
102
+ key,
103
+ currentResourceIndex
104
+ ]));
105
+ });
106
+ router.route(itemPath).put((request, response)=>{
107
+ const currentResourceCollection = storage.read(key);
108
+ const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
109
+ if (currentResourceIndex === -1) {
110
+ response.status(404).end();
111
+ return;
112
+ }
113
+ const currentResource = storage.read([
114
+ key,
115
+ currentResourceIndex
116
+ ]);
117
+ const updatedResource = {
118
+ ...request.body,
119
+ id: currentResource.id
120
+ };
121
+ storage.write([
122
+ key,
123
+ currentResourceIndex
124
+ ], updatedResource);
125
+ response.json(updatedResource);
126
+ });
127
+ router.route(itemPath).patch((request, response)=>{
128
+ const currentResourceCollection = storage.read(key);
129
+ const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
130
+ if (currentResourceIndex === -1) {
131
+ response.status(404).end();
132
+ return;
133
+ }
134
+ const currentResource = storage.read([
135
+ key,
136
+ currentResourceIndex
137
+ ]);
138
+ const updatedResource = {
139
+ ...currentResource,
140
+ ...request.body,
141
+ id: currentResource.id
142
+ };
143
+ storage.write([
144
+ key,
145
+ currentResourceIndex
146
+ ], updatedResource);
147
+ response.json(updatedResource);
148
+ });
149
+ router.route(itemPath).delete((request, response)=>{
150
+ const currentResourceCollection = storage.read(key);
151
+ const currentResourceIndex = (0, _array.findIndexById)(currentResourceCollection, request.params.id);
152
+ if (currentResourceIndex === -1) {
153
+ response.status(404).end();
154
+ return;
155
+ }
156
+ storage.delete([
157
+ key,
158
+ currentResourceIndex
159
+ ]);
160
+ response.status(204).end();
161
+ });
144
162
  });
145
- });
146
- return router;
163
+ return router;
147
164
  };
148
- exports.createNestedDatabaseRoutes = createNestedDatabaseRoutes;
@@ -1,12 +1,19 @@
1
1
  "use strict";
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
- value: true
3
+ value: true
5
4
  });
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));
5
+ Object.defineProperty(exports, "createRewrittenDatabaseRoutes", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createRewrittenDatabaseRoutes;
9
+ }
11
10
  });
12
- exports.createRewrittenDatabaseRoutes = createRewrittenDatabaseRoutes;
11
+ const _expressurlrewrite = /*#__PURE__*/ _interop_require_default(require("express-urlrewrite"));
12
+ function _interop_require_default(obj) {
13
+ return obj && obj.__esModule ? obj : {
14
+ default: obj
15
+ };
16
+ }
17
+ const createRewrittenDatabaseRoutes = (router, rewrittenRoutes)=>Object.entries(rewrittenRoutes).forEach(([key, value])=>{
18
+ router.use((0, _expressurlrewrite.default)(key, value));
19
+ });
@@ -1,99 +1,95 @@
1
1
  "use strict";
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
- value: true
3
+ value: true
5
4
  });
6
- exports.createShallowDatabaseRoutes = void 0;
7
- var _filter = require("../filter/filter");
8
- var _pagination = require("../pagination/pagination");
9
- var _search = require("../search/search");
10
- var _sort2 = require("../sort/sort");
11
- const createShallowDatabaseRoutes = (router, database, storage) => {
12
- Object.keys(database).forEach(key => {
13
- const path = `/${key}`;
14
- router.route(path).get((request, response) => {
15
- let data = storage.read(key);
16
- if (!Array.isArray(data) || !request.query) {
17
- // ✅ important:
18
- // set 'Cache-Control' header for explicit browsers response revalidate
19
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
20
- response.set('Cache-control', 'no-cache');
21
- return response.json(data);
22
- }
23
- data = data.filter(element => typeof element === 'object' && element !== null);
24
- const {
25
- _page,
26
- _limit,
27
- _begin,
28
- _end,
29
- _sort,
30
- _order,
31
- _q,
32
- ...filters
33
- } = request.query;
34
- if (Object.keys(filters).length) {
35
- data = (0, _filter.filter)(data, filters);
36
- }
37
- if (_q) {
38
- data = (0, _search.search)(data, request.query._q);
39
- }
40
- if (_page) {
41
- data = (0, _pagination.pagination)(data, request.query);
42
- if (data._link) {
43
- const links = {};
44
- const fullUrl = `${request.protocol}://${request.get('host')}${request.originalUrl}`;
45
- if (data._link.first) {
46
- links.first = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.first}`);
47
- }
48
- if (data._link.prev) {
49
- links.prev = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.prev}`);
50
- }
51
- if (data._link.next) {
52
- links.next = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.next}`);
53
- }
54
- if (data._link.last) {
55
- links.last = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.last}`);
56
- }
57
- data._link = {
58
- ...data._link,
59
- ...links
60
- };
61
- response.links(links);
62
- }
63
- }
64
- if (_sort) {
65
- data = (0, _sort2.sort)(data, request.query);
66
- }
67
- if (_begin || _end) {
68
- var _request$query$_begin;
69
- data = data.slice((_request$query$_begin = request.query._begin) !== null && _request$query$_begin !== void 0 ? _request$query$_begin : 0, request.query._end);
70
- response.set('X-Total-Count', data.length);
71
- }
72
- // ✅ important:
73
- // set 'Cache-Control' header for explicit browsers response revalidate
74
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
75
- response.set('Cache-control', 'no-cache');
76
- response.json(data);
77
- });
78
- router.route(path).post((request, response) => {
79
- storage.write(key, request.body);
80
- response.set('Location', request.url);
81
- response.status(201).json(request.body);
82
- });
83
- router.route(path).put((request, response) => {
84
- storage.write(key, request.body);
85
- response.json(request.body);
86
- });
87
- router.route(path).patch((request, response) => {
88
- const currentResource = storage.read(key);
89
- const updatedResource = {
90
- ...currentResource,
91
- ...request.body
92
- };
93
- storage.write(key, updatedResource);
94
- response.json(updatedResource);
5
+ Object.defineProperty(exports, "createShallowDatabaseRoutes", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createShallowDatabaseRoutes;
9
+ }
10
+ });
11
+ const _filter = require("../filter/filter");
12
+ const _pagination = require("../pagination/pagination");
13
+ const _search = require("../search/search");
14
+ const _sort = require("../sort/sort");
15
+ const createShallowDatabaseRoutes = (router, database, storage)=>{
16
+ Object.keys(database).forEach((key)=>{
17
+ const path = `/${key}`;
18
+ router.route(path).get((request, response)=>{
19
+ let data = storage.read(key);
20
+ if (!Array.isArray(data) || !request.query) {
21
+ // ✅ important:
22
+ // set 'Cache-Control' header for explicit browsers response revalidate
23
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
24
+ response.set('Cache-control', 'no-cache');
25
+ return response.json(data);
26
+ }
27
+ data = data.filter((element)=>typeof element === 'object' && element !== null);
28
+ const { _page, _limit, _begin, _end, _sort: _sort1, _order, _q, ...filters } = request.query;
29
+ if (Object.keys(filters).length) {
30
+ data = (0, _filter.filter)(data, filters);
31
+ }
32
+ if (_q) {
33
+ data = (0, _search.search)(data, request.query._q);
34
+ }
35
+ if (_sort1) {
36
+ data = (0, _sort.sort)(data, request.query);
37
+ }
38
+ if (_begin || _end) {
39
+ var _request_query__begin;
40
+ data = data.slice((_request_query__begin = request.query._begin) !== null && _request_query__begin !== void 0 ? _request_query__begin : 0, request.query._end);
41
+ response.set('X-Total-Count', data.length);
42
+ }
43
+ // important:
44
+ // The pagination should be last because it changes the form of the response
45
+ if (_page) {
46
+ data = (0, _pagination.pagination)(data, request.query);
47
+ if (data._link) {
48
+ const links = {};
49
+ const fullUrl = `${request.protocol}://${request.get('host')}${request.originalUrl}`;
50
+ if (data._link.first) {
51
+ links.first = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.first}`);
52
+ }
53
+ if (data._link.prev) {
54
+ links.prev = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.prev}`);
55
+ }
56
+ if (data._link.next) {
57
+ links.next = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.next}`);
58
+ }
59
+ if (data._link.last) {
60
+ links.last = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.last}`);
61
+ }
62
+ data._link = {
63
+ ...data._link,
64
+ ...links
65
+ };
66
+ response.links(links);
67
+ }
68
+ }
69
+ // ✅ important:
70
+ // set 'Cache-Control' header for explicit browsers response revalidate
71
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
72
+ response.set('Cache-control', 'no-cache');
73
+ response.json(data);
74
+ });
75
+ router.route(path).post((request, response)=>{
76
+ storage.write(key, request.body);
77
+ response.set('Location', request.url);
78
+ response.status(201).json(request.body);
79
+ });
80
+ router.route(path).put((request, response)=>{
81
+ storage.write(key, request.body);
82
+ response.json(request.body);
83
+ });
84
+ router.route(path).patch((request, response)=>{
85
+ const currentResource = storage.read(key);
86
+ const updatedResource = {
87
+ ...currentResource,
88
+ ...request.body
89
+ };
90
+ storage.write(key, updatedResource);
91
+ response.json(updatedResource);
92
+ });
95
93
  });
96
- });
97
- return router;
94
+ return router;
98
95
  };
99
- exports.createShallowDatabaseRoutes = createShallowDatabaseRoutes;
@@ -1,57 +1,60 @@
1
1
  "use strict";
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
- value: true
3
+ value: true
5
4
  });
6
- exports.filter = void 0;
7
- var _flat = require("flat");
5
+ Object.defineProperty(exports, "filter", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return filter;
9
+ }
10
+ });
11
+ const _flat = require("flat");
8
12
  const OPERATORS = {
9
- neq: (a, b) => `${a}` !== `${b}`,
10
- gt: (a, b) => +a > +b,
11
- gte: (a, b) => +a >= +b,
12
- lt: (a, b) => +a < +b,
13
- lte: (a, b) => +a <= +b,
14
- cn: (a, b) => a.includes(b),
15
- ncn: (a, b) => !a.includes(b),
16
- sw: (a, b) => a.startsWith(b),
17
- nsw: (a, b) => !a.startsWith(b),
18
- ew: (a, b) => a.endsWith(b),
19
- new: (a, b) => !a.endsWith(b)
13
+ eq: (a, b)=>`${a}` === `${b}`,
14
+ neq: (a, b)=>`${a}` !== `${b}`,
15
+ gt: (a, b)=>+a > +b,
16
+ gte: (a, b)=>+a >= +b,
17
+ lt: (a, b)=>+a < +b,
18
+ lte: (a, b)=>+a <= +b,
19
+ cn: (a, b)=>a.includes(b),
20
+ ncn: (a, b)=>!a.includes(b),
21
+ sw: (a, b)=>a.startsWith(b),
22
+ nsw: (a, b)=>!a.startsWith(b),
23
+ ew: (a, b)=>a.endsWith(b),
24
+ new: (a, b)=>!a.endsWith(b),
25
+ some: (a, b)=>a.some((element)=>`${element}` === `${b}`)
20
26
  };
21
27
  const OPERATORS_KEYS = Object.keys(OPERATORS);
22
28
  const OPERATOR_REGEXP = new RegExp(`^(.+)_(${OPERATORS_KEYS.join('|')})$`);
23
- const getEntities = (object, key) => {
24
- const parts = key.match(OPERATOR_REGEXP);
25
- if (parts) {
29
+ const getEntities = (object, key)=>{
30
+ const parts = key.match(OPERATOR_REGEXP);
31
+ if (!parts) {
32
+ return {
33
+ operator: 'eq',
34
+ element: object[key]
35
+ };
36
+ }
26
37
  const [, element, operator] = parts;
38
+ if (operator === 'some') {
39
+ const array = Object.entries(object).filter(([objectKey])=>new RegExp(`^${element}.\\d$`).test(objectKey));
40
+ return {
41
+ operator,
42
+ element: array.map(([, value])=>value)
43
+ };
44
+ }
27
45
  return {
28
- element: object[element],
29
- operator: operator
46
+ element: object[element],
47
+ operator: operator
30
48
  };
31
- }
32
- return {
33
- element: object[key]
34
- };
35
49
  };
36
- const filtered = (element, value, operator) => {
37
- if (!operator) return `${element}` === value;
38
- return OPERATORS[operator](element, value);
39
- };
40
- const filter = (array, filters) => array.filter(arrayElement => {
41
- const flattenedArrayElement = (0, _flat.flatten)(arrayElement);
42
- return Object.entries(filters).every(([key, filter]) => {
43
- if (Array.isArray(filter)) {
44
- const {
45
- element,
46
- operator
47
- } = getEntities(flattenedArrayElement, key);
48
- return filter.some(value => filtered(element, value, operator));
49
- }
50
- const {
51
- element,
52
- operator
53
- } = getEntities(flattenedArrayElement, key);
54
- return filtered(element, filter, operator);
55
- });
56
- });
57
- exports.filter = filter;
50
+ const filter = (array, filters)=>array.filter((arrayElement)=>{
51
+ const flattenedArrayElement = (0, _flat.flatten)(arrayElement);
52
+ return Object.entries(filters).every(([key, filter])=>{
53
+ if (Array.isArray(filter)) {
54
+ const { element, operator } = getEntities(flattenedArrayElement, key);
55
+ return filter.some((value)=>OPERATORS[operator](element, value));
56
+ }
57
+ const { element, operator } = getEntities(flattenedArrayElement, key);
58
+ return OPERATORS[operator](element, filter);
59
+ });
60
+ });