mock-config-server 3.3.4 → 3.4.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 (171) hide show
  1. package/README.md +107 -3
  2. package/dist/bin/build.js +1 -1
  3. package/dist/bin/cli.d.ts +1 -1
  4. package/dist/bin/cli.js +25 -16
  5. package/dist/bin/helpers/createTemplate.d.ts +9 -0
  6. package/dist/bin/helpers/createTemplate.js +25 -0
  7. package/dist/bin/helpers/getMostSpecificPathFromError.d.ts +2 -0
  8. package/dist/bin/helpers/getMostSpecificPathFromError.js +36 -0
  9. package/dist/bin/helpers/getValidationMessageFromPath.d.ts +1 -0
  10. package/dist/bin/helpers/getValidationMessageFromPath.js +11 -0
  11. package/dist/bin/helpers/index.d.ts +4 -0
  12. package/dist/bin/helpers/index.js +44 -0
  13. package/dist/bin/helpers/isOnlyRequestedDataResolvingPropertyExists.d.ts +4 -0
  14. package/dist/bin/helpers/isOnlyRequestedDataResolvingPropertyExists.js +9 -0
  15. package/dist/bin/init.d.ts +2 -0
  16. package/dist/bin/init.js +101 -0
  17. package/dist/bin/run.d.ts +1 -1
  18. package/dist/bin/run.js +23 -2
  19. package/dist/bin/templates/.eslintrc.js +14 -0
  20. package/dist/bin/templates/js/full/mock-requests/graphql/index.js +2 -0
  21. package/dist/bin/templates/js/full/mock-requests/graphql/user.js +35 -0
  22. package/dist/bin/templates/js/full/mock-requests/graphql/users.js +12 -0
  23. package/dist/bin/templates/js/full/mock-requests/rest/index.js +2 -0
  24. package/dist/bin/templates/js/full/mock-requests/rest/user.js +35 -0
  25. package/dist/bin/templates/js/full/mock-requests/rest/users.js +12 -0
  26. package/dist/bin/templates/js/full/mock-server.config.js +16 -0
  27. package/dist/bin/templates/js/graphql/mock-requests/index.js +2 -0
  28. package/dist/bin/templates/js/graphql/mock-requests/user.js +35 -0
  29. package/dist/bin/templates/js/graphql/mock-requests/users.js +12 -0
  30. package/dist/bin/templates/js/graphql/mock-server.config.js +9 -0
  31. package/dist/bin/templates/js/rest/mock-requests/index.js +2 -0
  32. package/dist/bin/templates/js/rest/mock-requests/user.js +35 -0
  33. package/dist/bin/templates/js/rest/mock-requests/users.js +12 -0
  34. package/dist/bin/templates/js/rest/mock-server.config.js +9 -0
  35. package/dist/bin/templates/ts/full/mock-requests/graphql/index.ts +2 -0
  36. package/dist/bin/templates/ts/full/mock-requests/graphql/user.ts +37 -0
  37. package/dist/bin/templates/ts/full/mock-requests/graphql/users.ts +14 -0
  38. package/dist/bin/templates/ts/full/mock-requests/rest/index.ts +2 -0
  39. package/dist/bin/templates/ts/full/mock-requests/rest/user.ts +37 -0
  40. package/dist/bin/templates/ts/full/mock-requests/rest/users.ts +14 -0
  41. package/dist/bin/templates/ts/full/mock-server.config.ts +18 -0
  42. package/dist/bin/templates/ts/graphql/mock-requests/index.ts +2 -0
  43. package/dist/bin/templates/ts/graphql/mock-requests/user.ts +37 -0
  44. package/dist/bin/templates/ts/graphql/mock-requests/users.ts +14 -0
  45. package/dist/bin/templates/ts/graphql/mock-server.config.ts +11 -0
  46. package/dist/bin/templates/ts/rest/mock-requests/index.ts +2 -0
  47. package/dist/bin/templates/ts/rest/mock-requests/user.ts +37 -0
  48. package/dist/bin/templates/ts/rest/mock-requests/users.ts +14 -0
  49. package/dist/bin/templates/ts/rest/mock-server.config.ts +11 -0
  50. package/dist/bin/templates/tsconfig.json +11 -0
  51. package/dist/bin/validateMockServerConfig/baseUrlSchema/baseUrlSchema.d.ts +1 -0
  52. package/dist/bin/validateMockServerConfig/baseUrlSchema/baseUrlSchema.js +8 -0
  53. package/dist/bin/validateMockServerConfig/corsSchema/corsSchema.d.ts +23 -0
  54. package/dist/bin/validateMockServerConfig/corsSchema/corsSchema.js +17 -0
  55. package/dist/bin/validateMockServerConfig/databaseConfigSchema/databaseConfigSchema.d.ts +11 -0
  56. package/dist/bin/validateMockServerConfig/databaseConfigSchema/databaseConfigSchema.js +12 -0
  57. package/dist/bin/validateMockServerConfig/graphqlConfigSchema/graphqlConfigSchema.d.ts +248 -0
  58. package/dist/bin/validateMockServerConfig/graphqlConfigSchema/graphqlConfigSchema.js +31 -0
  59. package/dist/bin/validateMockServerConfig/graphqlConfigSchema/routeConfigSchema/routeConfigSchema.d.ts +61 -0
  60. package/dist/bin/validateMockServerConfig/graphqlConfigSchema/routeConfigSchema/routeConfigSchema.js +37 -0
  61. package/dist/bin/validateMockServerConfig/interceptorsSchema/interceptorsSchema.d.ts +11 -0
  62. package/dist/bin/validateMockServerConfig/interceptorsSchema/interceptorsSchema.js +11 -0
  63. package/dist/bin/validateMockServerConfig/portSchema/portSchema.d.ts +2 -0
  64. package/dist/bin/validateMockServerConfig/portSchema/portSchema.js +9 -0
  65. package/dist/bin/validateMockServerConfig/queueSchema/queueSchema.d.ts +8 -0
  66. package/dist/bin/validateMockServerConfig/queueSchema/queueSchema.js +12 -0
  67. package/dist/bin/validateMockServerConfig/restConfigSchema/restConfigSchema.d.ts +713 -0
  68. package/dist/bin/validateMockServerConfig/restConfigSchema/restConfigSchema.js +23 -0
  69. package/dist/bin/validateMockServerConfig/restConfigSchema/routeConfigSchema/routeConfigSchema.d.ts +77 -0
  70. package/dist/bin/validateMockServerConfig/restConfigSchema/routeConfigSchema/routeConfigSchema.js +52 -0
  71. package/dist/bin/validateMockServerConfig/settingsSchema/settingsSchema.d.ts +14 -0
  72. package/dist/bin/validateMockServerConfig/settingsSchema/settingsSchema.js +12 -0
  73. package/dist/bin/validateMockServerConfig/staticPathSchema/staticPathSchema.d.ts +20 -0
  74. package/dist/bin/validateMockServerConfig/staticPathSchema/staticPathSchema.js +14 -0
  75. package/dist/bin/validateMockServerConfig/utils/checkModeSchema/checkModeSchema.d.ts +5 -0
  76. package/dist/bin/validateMockServerConfig/utils/checkModeSchema/checkModeSchema.js +12 -0
  77. package/dist/bin/validateMockServerConfig/utils/entitiesSchema/entitiesSchema.d.ts +75 -0
  78. package/dist/bin/validateMockServerConfig/utils/entitiesSchema/entitiesSchema.js +67 -0
  79. package/dist/bin/validateMockServerConfig/utils/index.d.ts +6 -0
  80. package/dist/bin/validateMockServerConfig/utils/index.js +71 -0
  81. package/dist/bin/validateMockServerConfig/utils/jsonSchema/jsonSchema.d.ts +8 -0
  82. package/dist/bin/validateMockServerConfig/utils/jsonSchema/jsonSchema.js +13 -0
  83. package/dist/bin/validateMockServerConfig/utils/plainObjectSchema/plainObjectSchema.d.ts +2 -0
  84. package/dist/bin/validateMockServerConfig/utils/plainObjectSchema/plainObjectSchema.js +11 -0
  85. package/dist/bin/validateMockServerConfig/utils/requiredPropertiesSchema/requiredPropertiesSchema.d.ts +3 -0
  86. package/dist/bin/validateMockServerConfig/utils/requiredPropertiesSchema/requiredPropertiesSchema.js +10 -0
  87. package/dist/bin/validateMockServerConfig/utils/sharedSchema/sharedSchema.d.ts +3 -0
  88. package/dist/bin/validateMockServerConfig/utils/sharedSchema/sharedSchema.js +9 -0
  89. package/dist/bin/validateMockServerConfig/validateApiMockServerConfig.d.ts +2 -0
  90. package/dist/bin/validateMockServerConfig/validateApiMockServerConfig.js +44 -0
  91. package/dist/bin/validateMockServerConfig/validateMockServerConfig.js +27 -20
  92. package/dist/src/core/database/createDatabaseRoutes/helpers/createNestedDatabaseRoutes/createNestedDatabaseRoutes.js +27 -16
  93. package/dist/src/core/database/createDatabaseRoutes/helpers/createShallowDatabaseRoutes/createShallowDatabaseRoutes.js +64 -3
  94. package/dist/src/core/database/createDatabaseRoutes/helpers/filter/filter.d.ts +1 -0
  95. package/dist/src/core/database/createDatabaseRoutes/helpers/filter/filter.js +46 -6
  96. package/dist/src/core/database/createDatabaseRoutes/helpers/pagination/pagination.d.ts +1 -0
  97. package/dist/src/core/database/createDatabaseRoutes/helpers/search/search.d.ts +4 -0
  98. package/dist/src/core/database/createDatabaseRoutes/helpers/search/search.js +29 -0
  99. package/dist/src/core/database/createDatabaseRoutes/helpers/sort/sort.d.ts +1 -0
  100. package/dist/src/core/database/createDatabaseRoutes/helpers/sort/sort.js +3 -4
  101. package/dist/src/core/database/createDatabaseRoutes/storages/File/FileWriter.js +2 -2
  102. package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.js +13 -7
  103. package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.js +7 -1
  104. package/dist/src/core/rest/createRestRoutes/createRestRoutes.js +27 -10
  105. package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.js +6 -0
  106. package/dist/src/server/createGraphQLMockServer/createGraphQLMockServer.js +1 -1
  107. package/dist/src/server/createRestMockServer/createRestMockServer.js +1 -1
  108. package/dist/src/static/views/components/header/index.js +1 -1
  109. package/dist/src/static/views/features/scheme/index.js +31 -31
  110. package/dist/src/static/views/features/tab/index.js +12 -12
  111. package/dist/src/utils/constants/appPath.js +1 -2
  112. package/dist/src/utils/constants/checkModes.d.ts +8 -9
  113. package/dist/src/utils/constants/checkModes.js +8 -16
  114. package/dist/src/utils/constants/default.js +2 -3
  115. package/dist/src/utils/helpers/files/index.d.ts +1 -0
  116. package/dist/src/utils/helpers/files/index.js +16 -0
  117. package/dist/src/utils/helpers/files/isFilePathValid/isFilePathValid.d.ts +1 -0
  118. package/dist/src/utils/helpers/files/isFilePathValid/isFilePathValid.js +19 -0
  119. package/dist/src/utils/helpers/index.d.ts +1 -0
  120. package/dist/src/utils/helpers/index.js +11 -0
  121. package/dist/src/utils/helpers/tests/createTmpDir.d.ts +1 -0
  122. package/dist/src/utils/helpers/tests/createTmpDir.js +12 -0
  123. package/dist/src/utils/helpers/tests/index.d.ts +1 -0
  124. package/dist/{bin/validateMockServerConfig/helpers/isCheckModeValid → src/utils/helpers/tests}/index.js +4 -4
  125. package/dist/src/utils/types/entities.d.ts +48 -0
  126. package/dist/src/utils/types/entities.js +1 -0
  127. package/dist/src/utils/types/graphql.d.ts +11 -45
  128. package/dist/src/utils/types/index.d.ts +1 -0
  129. package/dist/src/utils/types/index.js +11 -0
  130. package/dist/src/utils/types/rest.d.ts +17 -46
  131. package/dist/src/utils/types/server.d.ts +5 -4
  132. package/package.json +35 -27
  133. package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.d.ts +0 -1
  134. package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.js +0 -16
  135. package/dist/bin/validateMockServerConfig/helpers/index.d.ts +0 -2
  136. package/dist/bin/validateMockServerConfig/helpers/index.js +0 -27
  137. package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/index.d.ts +0 -1
  138. package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/isCheckModeValid.d.ts +0 -1
  139. package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/isCheckModeValid.js +0 -12
  140. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/index.d.ts +0 -1
  141. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/index.js +0 -16
  142. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/isDescriptorValueValid.d.ts +0 -2
  143. package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/isDescriptorValueValid.js +0 -43
  144. package/dist/bin/validateMockServerConfig/validateBaseUrl/validateBaseUrl.d.ts +0 -1
  145. package/dist/bin/validateMockServerConfig/validateBaseUrl/validateBaseUrl.js +0 -15
  146. package/dist/bin/validateMockServerConfig/validateCors/validateCors.d.ts +0 -1
  147. package/dist/bin/validateMockServerConfig/validateCors/validateCors.js +0 -84
  148. package/dist/bin/validateMockServerConfig/validateDatabaseConfig/validateDatabaseConfig.d.ts +0 -1
  149. package/dist/bin/validateMockServerConfig/validateDatabaseConfig/validateDatabaseConfig.js +0 -45
  150. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateGraphqlConfig.d.ts +0 -1
  151. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateGraphqlConfig.js +0 -58
  152. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.d.ts +0 -2
  153. package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.js +0 -153
  154. package/dist/bin/validateMockServerConfig/validateInterceptors/validateInterceptors.d.ts +0 -1
  155. package/dist/bin/validateMockServerConfig/validateInterceptors/validateInterceptors.js +0 -27
  156. package/dist/bin/validateMockServerConfig/validatePort/validatePort.d.ts +0 -1
  157. package/dist/bin/validateMockServerConfig/validatePort/validatePort.js +0 -12
  158. package/dist/bin/validateMockServerConfig/validateQueue/validateQueue.d.ts +0 -1
  159. package/dist/bin/validateMockServerConfig/validateQueue/validateQueue.js +0 -29
  160. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRestConfig.d.ts +0 -1
  161. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRestConfig.js +0 -57
  162. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.d.ts +0 -2
  163. package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.js +0 -157
  164. package/dist/bin/validateMockServerConfig/validateSettings/validateSettings.d.ts +0 -1
  165. package/dist/bin/validateMockServerConfig/validateSettings/validateSettings.js +0 -34
  166. package/dist/bin/validateMockServerConfig/validateStaticPath/validateStaticPath.d.ts +0 -1
  167. package/dist/bin/validateMockServerConfig/validateStaticPath/validateStaticPath.js +0 -53
  168. package/dist/src/core/database/createOrm/createOrm.d.ts +0 -4
  169. package/dist/src/core/database/createOrm/createOrm.js +0 -70
  170. package/dist/src/core/database/createStorage/createStorage.d.ts +0 -2
  171. package/dist/src/core/database/createStorage/createStorage.js +0 -10
@@ -4,29 +4,36 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.validateMockServerConfig = void 0;
7
- var _validateBaseUrl = require("./validateBaseUrl/validateBaseUrl");
8
- var _validateCors = require("./validateCors/validateCors");
9
- var _validateDatabaseConfig = require("./validateDatabaseConfig/validateDatabaseConfig");
10
- var _validateGraphqlConfig = require("./validateGraphqlConfig/validateGraphqlConfig");
11
- var _validateInterceptors = require("./validateInterceptors/validateInterceptors");
12
- var _validatePort = require("./validatePort/validatePort");
13
- var _validateRestConfig = require("./validateRestConfig/validateRestConfig");
14
- var _validateStaticPath = require("./validateStaticPath/validateStaticPath");
7
+ var _zod = require("zod");
8
+ var _helpers = require("../helpers");
9
+ var _baseUrlSchema = require("./baseUrlSchema/baseUrlSchema");
10
+ var _corsSchema = require("./corsSchema/corsSchema");
11
+ var _databaseConfigSchema = require("./databaseConfigSchema/databaseConfigSchema");
12
+ var _graphqlConfigSchema = require("./graphqlConfigSchema/graphqlConfigSchema");
13
+ var _interceptorsSchema = require("./interceptorsSchema/interceptorsSchema");
14
+ var _portSchema = require("./portSchema/portSchema");
15
+ var _restConfigSchema = require("./restConfigSchema/restConfigSchema");
16
+ var _staticPathSchema = require("./staticPathSchema/staticPathSchema");
17
+ var _utils = require("./utils");
15
18
  const validateMockServerConfig = mockServerConfig => {
16
19
  if (!mockServerConfig.rest && !mockServerConfig.graphql && !mockServerConfig.database && !mockServerConfig.staticPath) {
17
- throw new Error('configuration should contain at least one of these configs: rest | graphql | database | staticPath; see our doc (https://www.npmjs.com/package/mock-config-server) for more information');
20
+ throw new Error('Configuration should contain at least one of these configs: rest | graphql | database | staticPath; see our doc (https://github.com/siberiacancode/mock-config-server) for more information');
18
21
  }
19
- try {
20
- if (mockServerConfig.rest) (0, _validateRestConfig.validateRestConfig)(mockServerConfig.rest);
21
- if (mockServerConfig.graphql) (0, _validateGraphqlConfig.validateGraphqlConfig)(mockServerConfig.graphql);
22
- if (mockServerConfig.database) (0, _validateDatabaseConfig.validateDatabaseConfig)(mockServerConfig.database);
23
- (0, _validateBaseUrl.validateBaseUrl)(mockServerConfig.baseUrl);
24
- (0, _validatePort.validatePort)(mockServerConfig.port);
25
- (0, _validateStaticPath.validateStaticPath)(mockServerConfig.staticPath);
26
- (0, _validateInterceptors.validateInterceptors)(mockServerConfig.interceptors);
27
- (0, _validateCors.validateCors)(mockServerConfig.cors);
28
- } catch (error) {
29
- throw new Error(`Validation Error: configuration.${error.message} does not match the API schema. Click here to see correct type: https://github.com/siberiacancode/mock-config-server`);
22
+ const mockServerConfigSchema = _zod.z.strictObject({
23
+ baseUrl: _baseUrlSchema.baseUrlSchema.optional(),
24
+ port: _portSchema.portSchema.optional(),
25
+ staticPath: _staticPathSchema.staticPathSchema.optional(),
26
+ interceptors: (0, _utils.plainObjectSchema)(_interceptorsSchema.interceptorsSchema).optional(),
27
+ cors: _corsSchema.corsSchema.optional(),
28
+ rest: _restConfigSchema.restConfigSchema.optional(),
29
+ graphql: _graphqlConfigSchema.graphqlConfigSchema.optional(),
30
+ database: _databaseConfigSchema.databaseConfigSchema.optional()
31
+ });
32
+ const validationResult = mockServerConfigSchema.safeParse(mockServerConfig);
33
+ if (!validationResult.success) {
34
+ const path = (0, _helpers.getMostSpecificPathFromError)(validationResult.error);
35
+ const validationMessage = (0, _helpers.getValidationMessageFromPath)(path);
36
+ throw new Error(`Validation Error: configuration${validationMessage} does not match the API schema. Click here to see correct type: https://github.com/siberiacancode/mock-config-server`);
30
37
  }
31
38
  };
32
39
  exports.validateMockServerConfig = validateMockServerConfig;
@@ -7,27 +7,38 @@ exports.createNestedDatabaseRoutes = void 0;
7
7
  var _array = require("../array");
8
8
  var _filter = require("../filter/filter");
9
9
  var _pagination = require("../pagination/pagination");
10
+ var _search = require("../search/search");
10
11
  var _sort2 = require("../sort/sort");
11
12
  const createNestedDatabaseRoutes = (router, database, storage) => {
12
13
  Object.keys(database).forEach(key => {
13
14
  const collectionPath = `/${key}`;
14
15
  const itemPath = `/${key}/:id`;
15
16
  router.route(collectionPath).get((request, response) => {
16
- var _request$query;
17
17
  let data = storage.read(key);
18
- if (request.query && Object.keys(request.query).length) {
19
- const {
20
- _page,
21
- _limit,
22
- _begin,
23
- _end,
24
- _sort,
25
- _order,
26
- ...filters
27
- } = request.query;
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) {
28
36
  data = (0, _filter.filter)(data, filters);
29
37
  }
30
- if ((_request$query = request.query) !== null && _request$query !== void 0 && _request$query._page) {
38
+ if (_q) {
39
+ data = (0, _search.search)(data, request.query._q);
40
+ }
41
+ if (_page) {
31
42
  data = (0, _pagination.pagination)(data, request.query);
32
43
  if (data._link) {
33
44
  const links = {};
@@ -51,10 +62,10 @@ const createNestedDatabaseRoutes = (router, database, storage) => {
51
62
  response.links(links);
52
63
  }
53
64
  }
54
- if (request.query && request.query._sort) {
65
+ if (_sort) {
55
66
  data = (0, _sort2.sort)(data, request.query);
56
67
  }
57
- if (request.query._begin || request.query._end) {
68
+ if (_begin || _end) {
58
69
  var _request$query$_begin;
59
70
  data = data.slice((_request$query$_begin = request.query._begin) !== null && _request$query$_begin !== void 0 ? _request$query$_begin : 0, request.query._end);
60
71
  response.set('X-Total-Count', data.length);
@@ -62,7 +73,7 @@ const createNestedDatabaseRoutes = (router, database, storage) => {
62
73
  // ✅ important:
63
74
  // set 'Cache-Control' header for explicit browsers response revalidate
64
75
  // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
65
- response.set('Cache-control', 'max-age=0, must-revalidate');
76
+ response.set('Cache-control', 'no-cache');
66
77
  response.json(data);
67
78
  });
68
79
  router.route(collectionPath).post((request, response) => {
@@ -87,7 +98,7 @@ const createNestedDatabaseRoutes = (router, database, storage) => {
87
98
  // ✅ important:
88
99
  // set 'Cache-Control' header for explicit browsers response revalidate
89
100
  // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
90
- response.set('Cache-control', 'max-age=0, must-revalidate');
101
+ response.set('Cache-control', 'no-cache');
91
102
  response.json(storage.read([key, currentResourceIndex]));
92
103
  });
93
104
  router.route(itemPath).put((request, response) => {
@@ -4,15 +4,76 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
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");
7
11
  const createShallowDatabaseRoutes = (router, database, storage) => {
8
12
  Object.keys(database).forEach(key => {
9
13
  const path = `/${key}`;
10
- router.route(path).get((_request, response) => {
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
+ }
11
72
  // ✅ important:
12
73
  // set 'Cache-Control' header for explicit browsers response revalidate
13
74
  // 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));
75
+ response.set('Cache-control', 'no-cache');
76
+ response.json(data);
16
77
  });
17
78
  router.route(path).post((request, response) => {
18
79
  storage.write(key, request.body);
@@ -1,2 +1,3 @@
1
+ /// <reference types="node" />
1
2
  import type { ParsedUrlQuery } from 'node:querystring';
2
3
  export declare const filter: (array: any[], filters: ParsedUrlQuery) => any[];
@@ -5,13 +5,53 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.filter = void 0;
7
7
  var _flat = require("flat");
8
- const filter = (array, filters) => array.filter(element => {
9
- const flattenedElement = (0, _flat.flatten)(element);
10
- return Object.entries(filters).every(([key, value]) => {
11
- if (Array.isArray(value)) {
12
- return value.includes(`${flattenedElement[key]}`);
8
+ 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)
20
+ };
21
+ const OPERATORS_KEYS = Object.keys(OPERATORS);
22
+ const OPERATOR_REGEXP = new RegExp(`^(.+)_(${OPERATORS_KEYS.join('|')})$`);
23
+ const getEntities = (object, key) => {
24
+ const parts = key.match(OPERATOR_REGEXP);
25
+ if (parts) {
26
+ const [, element, operator] = parts;
27
+ return {
28
+ element: object[element],
29
+ operator: operator
30
+ };
31
+ }
32
+ return {
33
+ element: object[key]
34
+ };
35
+ };
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));
13
49
  }
14
- return `${flattenedElement[key]}` === value;
50
+ const {
51
+ element,
52
+ operator
53
+ } = getEntities(flattenedArrayElement, key);
54
+ return filtered(element, filter, operator);
15
55
  });
16
56
  });
17
57
  exports.filter = filter;
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import type { ParsedUrlQuery } from 'node:querystring';
2
3
  export declare const pagination: (array: any[], queries: ParsedUrlQuery) => any[] | {
3
4
  _link: {
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" />
2
+ import type { ParsedUrlQuery } from 'node:querystring';
3
+ export declare const searchInNestedObjects: (obj: any, searchText: string) => boolean;
4
+ export declare const search: (array: any[], searchText: ParsedUrlQuery) => any[];
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.searchInNestedObjects = exports.search = void 0;
7
+ const searchInNestedObjects = (obj, searchText) => {
8
+ for (const key in obj) {
9
+ if (typeof obj[key] === 'object' && obj[key] !== null) {
10
+ if (searchInNestedObjects(obj[key], searchText)) {
11
+ return true;
12
+ }
13
+ } else if (String(obj[key]).includes(searchText)) {
14
+ return true;
15
+ }
16
+ }
17
+ return false;
18
+ };
19
+ exports.searchInNestedObjects = searchInNestedObjects;
20
+ const search = (array, searchText) => array.filter(element => {
21
+ if (typeof searchText === 'string') {
22
+ return searchInNestedObjects(element, searchText);
23
+ }
24
+ if (Array.isArray(searchText)) {
25
+ return searchText.some(text => searchInNestedObjects(element, text));
26
+ }
27
+ throw new Error('search technical error');
28
+ });
29
+ exports.search = search;
@@ -1,2 +1,3 @@
1
+ /// <reference types="node" />
1
2
  import type { ParsedUrlQuery } from 'node:querystring';
2
3
  export declare const sort: (array: any[], queries: ParsedUrlQuery) => any[];
@@ -4,16 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.sort = void 0;
7
- var _flat = _interopRequireDefault(require("flat"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
7
+ var _flat = require("flat");
9
8
  const DEFAULT_ORDER = 'asc';
10
9
  const getOrder = order => {
11
10
  if (order === 'asc' || order === 'desc') return order;
12
11
  return DEFAULT_ORDER;
13
12
  };
14
13
  const sortArray = (array, key, order) => array.sort((a, b) => {
15
- const flattenedA = (0, _flat.default)(a);
16
- const flattenedB = (0, _flat.default)(b);
14
+ const flattenedA = (0, _flat.flatten)(a);
15
+ const flattenedB = (0, _flat.flatten)(b);
17
16
  if (!flattenedA[key] || !flattenedB[key]) return 0;
18
17
  if (typeof flattenedA[key] === 'string' && typeof flattenedB[key] === 'string') {
19
18
  return order === 'asc' ? flattenedA[key].localeCompare(flattenedB[key]) : flattenedB[key].localeCompare(flattenedA[key]);
@@ -22,7 +22,7 @@ class FileWriter {
22
22
  });
23
23
  return new Promise(resolve => {
24
24
  var _this$nextDataPromise2;
25
- (_this$nextDataPromise2 = this.nextDataPromise) === null || _this$nextDataPromise2 === void 0 ? void 0 : _this$nextDataPromise2.then(() => {
25
+ (_this$nextDataPromise2 = this.nextDataPromise) === null || _this$nextDataPromise2 === void 0 || _this$nextDataPromise2.then(() => {
26
26
  resolve();
27
27
  });
28
28
  });
@@ -41,7 +41,7 @@ class FileWriter {
41
41
  await this.unlockedWrite(passedData, recursionLevel + 1);
42
42
  if (recursionLevel === 0) {
43
43
  var _this$nextDataResolve;
44
- (_this$nextDataResolve = this.nextDataResolve) === null || _this$nextDataResolve === void 0 ? void 0 : _this$nextDataResolve.call(this);
44
+ (_this$nextDataResolve = this.nextDataResolve) === null || _this$nextDataResolve === void 0 || _this$nextDataResolve.call(this);
45
45
  this.nextDataPromise = null;
46
46
  this.nextDataResolve = null;
47
47
  }
@@ -14,7 +14,7 @@ const createGraphQLRoutes = ({
14
14
  }) => {
15
15
  const preparedGraphQLRequestConfig = (0, _helpers2.prepareGraphQLRequestConfigs)(graphqlConfig.configs);
16
16
  const graphqlMiddleware = async (request, response, next) => {
17
- var _matchedRequestConfig, _matchedRouteConfig$s, _matchedRouteConfig$e, _matchedRouteConfig$i, _matchedRequestConfig2, _graphqlConfig$interc;
17
+ var _matchedRequestConfig, _matchedRouteConfig$s, _matchedRouteConfig$e, _matchedRouteConfig$s2, _matchedRouteConfig$i, _matchedRequestConfig2, _graphqlConfig$interc, _matchedRouteConfig$s3;
18
18
  const graphQLInput = (0, _helpers.getGraphQLInput)(request);
19
19
  if (!graphQLInput.query) {
20
20
  return response.status(400).json({
@@ -118,6 +118,14 @@ const createGraphQLRoutes = ({
118
118
  matchedRouteConfigData = matchedRouteConfig.data;
119
119
  }
120
120
  const resolvedData = typeof matchedRouteConfigData === 'function' ? await matchedRouteConfigData(request, (_matchedRouteConfig$e = matchedRouteConfig.entities) !== null && _matchedRouteConfig$e !== void 0 ? _matchedRouteConfig$e : {}) : matchedRouteConfigData;
121
+ if ((_matchedRouteConfig$s2 = matchedRouteConfig.settings) !== null && _matchedRouteConfig$s2 !== void 0 && _matchedRouteConfig$s2.status) {
122
+ response.statusCode = matchedRouteConfig.settings.status;
123
+ }
124
+
125
+ // ✅ important:
126
+ // set 'Cache-Control' header for explicit browsers response revalidate: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
127
+ // this code should place before response interceptors for giving opportunity to rewrite 'Cache-Control' header
128
+ if (matchedRequestConfig.operationType === 'query') response.set('Cache-control', 'no-cache');
121
129
  const data = await (0, _helpers.callResponseInterceptors)({
122
130
  data: resolvedData,
123
131
  request,
@@ -129,12 +137,10 @@ const createGraphQLRoutes = ({
129
137
  serverInterceptor: serverResponseInterceptor
130
138
  }
131
139
  });
132
-
133
- // important:
134
- // set 'Cache-Control' header for explicit browsers response revalidate
135
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
136
- response.set('Cache-control', 'max-age=0, must-revalidate');
137
- return response.status(response.statusCode).json(data);
140
+ if ((_matchedRouteConfig$s3 = matchedRouteConfig.settings) !== null && _matchedRouteConfig$s3 !== void 0 && _matchedRouteConfig$s3.delay) {
141
+ await (0, _helpers.sleep)(matchedRouteConfig.settings.delay);
142
+ }
143
+ return response.json(data);
138
144
  };
139
145
  router.route('/').get((0, _helpers.asyncHandler)(graphqlMiddleware));
140
146
  router.route('/').post((0, _helpers.asyncHandler)(graphqlMiddleware));
@@ -22,10 +22,16 @@ const calculateRouteConfigWeight = graphQLRouteConfig => {
22
22
  if (query) routeConfigWeight += Object.keys(query).length;
23
23
  if (variables) {
24
24
  if ((0, _helpers.isPlainObject)(variables) && variables.checkMode) {
25
+ // ✅ important:
26
+ // check that actual value check modes does not have `value` for compare
27
+ if (variables.checkMode === 'exists' || variables.checkMode === 'notExists') {
28
+ routeConfigWeight += 1;
29
+ return routeConfigWeight;
30
+ }
25
31
  routeConfigWeight += (0, _helpers.isPlainObject)(variables.value) ? Object.keys(variables.value).length : 1;
26
32
  return routeConfigWeight;
27
33
  }
28
- routeConfigWeight += Object.keys(variables).length;
34
+ routeConfigWeight += (0, _helpers.isPlainObject)(variables) ? Object.keys(variables).length : 1;
29
35
  }
30
36
  return routeConfigWeight;
31
37
  };
@@ -5,8 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createRestRoutes = void 0;
7
7
  var _flat = require("flat");
8
+ var _path = _interopRequireDefault(require("path"));
8
9
  var _helpers = require("../../../utils/helpers");
9
10
  var _helpers2 = require("./helpers");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
12
  const createRestRoutes = ({
11
13
  router,
12
14
  restConfig,
@@ -14,7 +16,7 @@ const createRestRoutes = ({
14
16
  }) => {
15
17
  (0, _helpers2.prepareRestRequestConfigs)(restConfig.configs).forEach(requestConfig => {
16
18
  router.route(requestConfig.path)[requestConfig.method]((0, _helpers.asyncHandler)(async (request, response, next) => {
17
- var _requestConfig$interc, _matchedRouteConfig$s, _matchedRouteConfig$e, _matchedRouteConfig$i, _requestConfig$interc2, _restConfig$intercept;
19
+ var _requestConfig$interc, _matchedRouteConfig$s, _matchedRouteConfig$e, _matchedRouteConfig$s2, _matchedRouteConfig$i, _requestConfig$interc2, _restConfig$intercept, _matchedRouteConfig$s3;
18
20
  const requestInterceptor = (_requestConfig$interc = requestConfig.interceptors) === null || _requestConfig$interc === void 0 ? void 0 : _requestConfig$interc.request;
19
21
  if (requestInterceptor) {
20
22
  await (0, _helpers.callRequestInterceptor)({
@@ -33,16 +35,19 @@ const createRestRoutes = ({
33
35
  value: descriptorValue
34
36
  } = (0, _helpers.convertToEntityDescriptor)(entityDescriptorOrValue);
35
37
 
36
- // ✅ important: check whole body as plain value strictly if descriptor used for body
38
+ // ✅ important:
39
+ // check whole body as plain value strictly if descriptor used for body
37
40
  const isEntityBodyByTopLevelDescriptor = entityName === 'body' && (0, _helpers.isEntityDescriptor)(entityDescriptorOrValue);
38
41
  if (isEntityBodyByTopLevelDescriptor) {
39
- // ✅ important: bodyParser sets body to empty object if body not sent or invalid, so assume {} as undefined
42
+ // ✅ important:
43
+ // bodyParser sets body to empty object if body not sent or invalid, so assume {} as undefined
40
44
  return (0, _helpers.resolveEntityValues)(checkMode, Object.keys(request.body).length ? request.body : undefined, descriptorValue);
41
45
  }
42
46
  const isEntityBodyByTopLevelArray = entityName === 'body' && Array.isArray(entityDescriptorOrValue);
43
47
  if (isEntityBodyByTopLevelArray) {
44
48
  return entityDescriptorOrValue.some(entityDescriptorOrValueElement =>
45
- // ✅ important: bodyParser sets body to empty object if body not sent or invalid, so assume {} as undefined
49
+ // ✅ important:
50
+ // bodyParser sets body to empty object if body not sent or invalid, so assume {} as undefined
46
51
  (0, _helpers.resolveEntityValues)(checkMode, Object.keys(request.body).length ? request.body : undefined, entityDescriptorOrValueElement));
47
52
  }
48
53
  const recordOrArrayEntries = Object.entries(entityDescriptorOrValue);
@@ -93,7 +98,18 @@ const createRestRoutes = ({
93
98
  if ('data' in matchedRouteConfig) {
94
99
  matchedRouteConfigData = matchedRouteConfig.data;
95
100
  }
101
+ if ('file' in matchedRouteConfig) {
102
+ if (!(0, _helpers.isFilePathValid)(matchedRouteConfig.file)) return next();
103
+ }
96
104
  const resolvedData = typeof matchedRouteConfigData === 'function' ? await matchedRouteConfigData(request, (_matchedRouteConfig$e = matchedRouteConfig.entities) !== null && _matchedRouteConfig$e !== void 0 ? _matchedRouteConfig$e : {}) : matchedRouteConfigData;
105
+ if ((_matchedRouteConfig$s2 = matchedRouteConfig.settings) !== null && _matchedRouteConfig$s2 !== void 0 && _matchedRouteConfig$s2.status) {
106
+ response.statusCode = matchedRouteConfig.settings.status;
107
+ }
108
+
109
+ // ✅ important:
110
+ // set 'Cache-Control' header for explicit browsers response revalidate: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
111
+ // this code should place before response interceptors for giving opportunity to rewrite 'Cache-Control' header
112
+ if (request.method === 'GET') response.set('Cache-control', 'no-cache');
97
113
  const data = await (0, _helpers.callResponseInterceptors)({
98
114
  data: resolvedData,
99
115
  request,
@@ -105,12 +121,13 @@ const createRestRoutes = ({
105
121
  serverInterceptor: serverResponseInterceptor
106
122
  }
107
123
  });
108
-
109
- // important:
110
- // set 'Cache-Control' header for explicit browsers response revalidate
111
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
112
- response.set('Cache-control', 'max-age=0, must-revalidate');
113
- return response.status(response.statusCode).json(data);
124
+ if ((_matchedRouteConfig$s3 = matchedRouteConfig.settings) !== null && _matchedRouteConfig$s3 !== void 0 && _matchedRouteConfig$s3.delay) {
125
+ await (0, _helpers.sleep)(matchedRouteConfig.settings.delay);
126
+ }
127
+ if ('file' in matchedRouteConfig) {
128
+ return response.sendFile(_path.default.resolve(matchedRouteConfig.file));
129
+ }
130
+ return response.json(data);
114
131
  }));
115
132
  });
116
133
  return router;
@@ -24,6 +24,12 @@ const calculateRouteConfigWeight = restRouteConfig => {
24
24
  if (params) routeConfigWeight += Object.keys(params).length;
25
25
  if (body) {
26
26
  if ((0, _helpers.isPlainObject)(body) && body.checkMode) {
27
+ // ✅ important:
28
+ // check that actual value check modes does not have `value` for compare
29
+ if (body.checkMode === 'exists' || body.checkMode === 'notExists') {
30
+ routeConfigWeight += 1;
31
+ return routeConfigWeight;
32
+ }
27
33
  routeConfigWeight += (0, _helpers.isPlainObject)(body.value) ? Object.keys(body.value).length : 1;
28
34
  return routeConfigWeight;
29
35
  }
@@ -51,7 +51,7 @@ const createGraphQLMockServer = (graphqlMockServerConfig, server = (0, _express.
51
51
  const routerWithGraphqlRoutes = (0, _graphql.createGraphQLRoutes)({
52
52
  router: _express.default.Router(),
53
53
  graphqlConfig: {
54
- configs
54
+ configs: configs !== null && configs !== void 0 ? configs : []
55
55
  },
56
56
  serverResponseInterceptor: interceptors === null || interceptors === void 0 ? void 0 : interceptors.response
57
57
  });
@@ -51,7 +51,7 @@ const createRestMockServer = (restMockServerConfig, server = (0, _express.defaul
51
51
  const routerWithRestRoutes = (0, _rest.createRestRoutes)({
52
52
  router: _express.default.Router(),
53
53
  restConfig: {
54
- configs
54
+ configs: configs !== null && configs !== void 0 ? configs : []
55
55
  },
56
56
  serverResponseInterceptor: interceptors === null || interceptors === void 0 ? void 0 : interceptors.response
57
57
  });
@@ -1 +1 @@
1
- document.getElementById('scheme_switcher').addEventListener('click', () => window.switchScheme());
1
+ document.getElementById('scheme_switcher').addEventListener('click', () => window.switchScheme());
@@ -1,31 +1,31 @@
1
- const lightStyles = document.querySelector(
2
- 'link[rel=stylesheet][media*=prefers-color-scheme][media*=light]'
3
- );
4
- const darkStyles = document.querySelector(
5
- 'link[rel=stylesheet][media*=prefers-color-scheme][media*=dark]'
6
- );
7
-
8
- function getSavedScheme() {
9
- return localStorage.getItem('color-scheme');
10
- }
11
-
12
- function setScheme(scheme) {
13
- const lightMedia = scheme === 'light' ? 'all' : 'not all';
14
- const darkMedia = scheme === 'dark' ? 'all' : 'not all';
15
-
16
- lightStyles.media = lightMedia;
17
- darkStyles.media = darkMedia;
18
-
19
- localStorage.setItem('color-scheme', scheme);
20
- }
21
-
22
- // eslint-disable-next-line no-unused-vars
23
- function switchScheme() {
24
- setScheme(getSavedScheme() === 'light' ? 'dark' : 'light');
25
- }
26
-
27
- function initScheme() {
28
- setScheme(getSavedScheme() ?? 'dark');
29
- }
30
-
31
- initScheme();
1
+ const lightStyles = document.querySelector(
2
+ 'link[rel=stylesheet][media*=prefers-color-scheme][media*=light]'
3
+ );
4
+ const darkStyles = document.querySelector(
5
+ 'link[rel=stylesheet][media*=prefers-color-scheme][media*=dark]'
6
+ );
7
+
8
+ function getSavedScheme() {
9
+ return localStorage.getItem('color-scheme');
10
+ }
11
+
12
+ function setScheme(scheme) {
13
+ const lightMedia = scheme === 'light' ? 'all' : 'not all';
14
+ const darkMedia = scheme === 'dark' ? 'all' : 'not all';
15
+
16
+ lightStyles.media = lightMedia;
17
+ darkStyles.media = darkMedia;
18
+
19
+ localStorage.setItem('color-scheme', scheme);
20
+ }
21
+
22
+ // eslint-disable-next-line no-unused-vars
23
+ function switchScheme() {
24
+ setScheme(getSavedScheme() === 'light' ? 'dark' : 'light');
25
+ }
26
+
27
+ function initScheme() {
28
+ setScheme(getSavedScheme() ?? 'dark');
29
+ }
30
+
31
+ initScheme();
@@ -1,12 +1,12 @@
1
- function switchTab(activeTabId) {
2
- document.querySelector('body').className = activeTabId;
3
- }
4
-
5
- function initTab() {
6
- const tabItems = document.getElementsByClassName('tab_item');
7
- for (let i = 0; i < tabItems.length; i += 1) {
8
- tabItems[i].addEventListener('click', () => switchTab(tabItems[i].id));
9
- }
10
- }
11
-
12
- initTab();
1
+ function switchTab(activeTabId) {
2
+ document.querySelector('body').className = activeTabId;
3
+ }
4
+
5
+ function initTab() {
6
+ const tabItems = document.getElementsByClassName('tab_item');
7
+ for (let i = 0; i < tabItems.length; i += 1) {
8
+ tabItems[i].addEventListener('click', () => switchTab(tabItems[i].id));
9
+ }
10
+ }
11
+
12
+ initTab();