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.
- package/README.md +107 -3
- package/dist/bin/build.js +1 -1
- package/dist/bin/cli.d.ts +1 -1
- package/dist/bin/cli.js +25 -16
- package/dist/bin/helpers/createTemplate.d.ts +9 -0
- package/dist/bin/helpers/createTemplate.js +25 -0
- package/dist/bin/helpers/getMostSpecificPathFromError.d.ts +2 -0
- package/dist/bin/helpers/getMostSpecificPathFromError.js +36 -0
- package/dist/bin/helpers/getValidationMessageFromPath.d.ts +1 -0
- package/dist/bin/helpers/getValidationMessageFromPath.js +11 -0
- package/dist/bin/helpers/index.d.ts +4 -0
- package/dist/bin/helpers/index.js +44 -0
- package/dist/bin/helpers/isOnlyRequestedDataResolvingPropertyExists.d.ts +4 -0
- package/dist/bin/helpers/isOnlyRequestedDataResolvingPropertyExists.js +9 -0
- package/dist/bin/init.d.ts +2 -0
- package/dist/bin/init.js +101 -0
- package/dist/bin/run.d.ts +1 -1
- package/dist/bin/run.js +23 -2
- package/dist/bin/templates/.eslintrc.js +14 -0
- package/dist/bin/templates/js/full/mock-requests/graphql/index.js +2 -0
- package/dist/bin/templates/js/full/mock-requests/graphql/user.js +35 -0
- package/dist/bin/templates/js/full/mock-requests/graphql/users.js +12 -0
- package/dist/bin/templates/js/full/mock-requests/rest/index.js +2 -0
- package/dist/bin/templates/js/full/mock-requests/rest/user.js +35 -0
- package/dist/bin/templates/js/full/mock-requests/rest/users.js +12 -0
- package/dist/bin/templates/js/full/mock-server.config.js +16 -0
- package/dist/bin/templates/js/graphql/mock-requests/index.js +2 -0
- package/dist/bin/templates/js/graphql/mock-requests/user.js +35 -0
- package/dist/bin/templates/js/graphql/mock-requests/users.js +12 -0
- package/dist/bin/templates/js/graphql/mock-server.config.js +9 -0
- package/dist/bin/templates/js/rest/mock-requests/index.js +2 -0
- package/dist/bin/templates/js/rest/mock-requests/user.js +35 -0
- package/dist/bin/templates/js/rest/mock-requests/users.js +12 -0
- package/dist/bin/templates/js/rest/mock-server.config.js +9 -0
- package/dist/bin/templates/ts/full/mock-requests/graphql/index.ts +2 -0
- package/dist/bin/templates/ts/full/mock-requests/graphql/user.ts +37 -0
- package/dist/bin/templates/ts/full/mock-requests/graphql/users.ts +14 -0
- package/dist/bin/templates/ts/full/mock-requests/rest/index.ts +2 -0
- package/dist/bin/templates/ts/full/mock-requests/rest/user.ts +37 -0
- package/dist/bin/templates/ts/full/mock-requests/rest/users.ts +14 -0
- package/dist/bin/templates/ts/full/mock-server.config.ts +18 -0
- package/dist/bin/templates/ts/graphql/mock-requests/index.ts +2 -0
- package/dist/bin/templates/ts/graphql/mock-requests/user.ts +37 -0
- package/dist/bin/templates/ts/graphql/mock-requests/users.ts +14 -0
- package/dist/bin/templates/ts/graphql/mock-server.config.ts +11 -0
- package/dist/bin/templates/ts/rest/mock-requests/index.ts +2 -0
- package/dist/bin/templates/ts/rest/mock-requests/user.ts +37 -0
- package/dist/bin/templates/ts/rest/mock-requests/users.ts +14 -0
- package/dist/bin/templates/ts/rest/mock-server.config.ts +11 -0
- package/dist/bin/templates/tsconfig.json +11 -0
- package/dist/bin/validateMockServerConfig/baseUrlSchema/baseUrlSchema.d.ts +1 -0
- package/dist/bin/validateMockServerConfig/baseUrlSchema/baseUrlSchema.js +8 -0
- package/dist/bin/validateMockServerConfig/corsSchema/corsSchema.d.ts +23 -0
- package/dist/bin/validateMockServerConfig/corsSchema/corsSchema.js +17 -0
- package/dist/bin/validateMockServerConfig/databaseConfigSchema/databaseConfigSchema.d.ts +11 -0
- package/dist/bin/validateMockServerConfig/databaseConfigSchema/databaseConfigSchema.js +12 -0
- package/dist/bin/validateMockServerConfig/graphqlConfigSchema/graphqlConfigSchema.d.ts +248 -0
- package/dist/bin/validateMockServerConfig/graphqlConfigSchema/graphqlConfigSchema.js +31 -0
- package/dist/bin/validateMockServerConfig/graphqlConfigSchema/routeConfigSchema/routeConfigSchema.d.ts +61 -0
- package/dist/bin/validateMockServerConfig/graphqlConfigSchema/routeConfigSchema/routeConfigSchema.js +37 -0
- package/dist/bin/validateMockServerConfig/interceptorsSchema/interceptorsSchema.d.ts +11 -0
- package/dist/bin/validateMockServerConfig/interceptorsSchema/interceptorsSchema.js +11 -0
- package/dist/bin/validateMockServerConfig/portSchema/portSchema.d.ts +2 -0
- package/dist/bin/validateMockServerConfig/portSchema/portSchema.js +9 -0
- package/dist/bin/validateMockServerConfig/queueSchema/queueSchema.d.ts +8 -0
- package/dist/bin/validateMockServerConfig/queueSchema/queueSchema.js +12 -0
- package/dist/bin/validateMockServerConfig/restConfigSchema/restConfigSchema.d.ts +713 -0
- package/dist/bin/validateMockServerConfig/restConfigSchema/restConfigSchema.js +23 -0
- package/dist/bin/validateMockServerConfig/restConfigSchema/routeConfigSchema/routeConfigSchema.d.ts +77 -0
- package/dist/bin/validateMockServerConfig/restConfigSchema/routeConfigSchema/routeConfigSchema.js +52 -0
- package/dist/bin/validateMockServerConfig/settingsSchema/settingsSchema.d.ts +14 -0
- package/dist/bin/validateMockServerConfig/settingsSchema/settingsSchema.js +12 -0
- package/dist/bin/validateMockServerConfig/staticPathSchema/staticPathSchema.d.ts +20 -0
- package/dist/bin/validateMockServerConfig/staticPathSchema/staticPathSchema.js +14 -0
- package/dist/bin/validateMockServerConfig/utils/checkModeSchema/checkModeSchema.d.ts +5 -0
- package/dist/bin/validateMockServerConfig/utils/checkModeSchema/checkModeSchema.js +12 -0
- package/dist/bin/validateMockServerConfig/utils/entitiesSchema/entitiesSchema.d.ts +75 -0
- package/dist/bin/validateMockServerConfig/utils/entitiesSchema/entitiesSchema.js +67 -0
- package/dist/bin/validateMockServerConfig/utils/index.d.ts +6 -0
- package/dist/bin/validateMockServerConfig/utils/index.js +71 -0
- package/dist/bin/validateMockServerConfig/utils/jsonSchema/jsonSchema.d.ts +8 -0
- package/dist/bin/validateMockServerConfig/utils/jsonSchema/jsonSchema.js +13 -0
- package/dist/bin/validateMockServerConfig/utils/plainObjectSchema/plainObjectSchema.d.ts +2 -0
- package/dist/bin/validateMockServerConfig/utils/plainObjectSchema/plainObjectSchema.js +11 -0
- package/dist/bin/validateMockServerConfig/utils/requiredPropertiesSchema/requiredPropertiesSchema.d.ts +3 -0
- package/dist/bin/validateMockServerConfig/utils/requiredPropertiesSchema/requiredPropertiesSchema.js +10 -0
- package/dist/bin/validateMockServerConfig/utils/sharedSchema/sharedSchema.d.ts +3 -0
- package/dist/bin/validateMockServerConfig/utils/sharedSchema/sharedSchema.js +9 -0
- package/dist/bin/validateMockServerConfig/validateApiMockServerConfig.d.ts +2 -0
- package/dist/bin/validateMockServerConfig/validateApiMockServerConfig.js +44 -0
- package/dist/bin/validateMockServerConfig/validateMockServerConfig.js +27 -20
- package/dist/src/core/database/createDatabaseRoutes/helpers/createNestedDatabaseRoutes/createNestedDatabaseRoutes.js +27 -16
- package/dist/src/core/database/createDatabaseRoutes/helpers/createShallowDatabaseRoutes/createShallowDatabaseRoutes.js +64 -3
- package/dist/src/core/database/createDatabaseRoutes/helpers/filter/filter.d.ts +1 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/filter/filter.js +46 -6
- package/dist/src/core/database/createDatabaseRoutes/helpers/pagination/pagination.d.ts +1 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/search/search.d.ts +4 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/search/search.js +29 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/sort/sort.d.ts +1 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/sort/sort.js +3 -4
- package/dist/src/core/database/createDatabaseRoutes/storages/File/FileWriter.js +2 -2
- package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.js +13 -7
- package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.js +7 -1
- package/dist/src/core/rest/createRestRoutes/createRestRoutes.js +27 -10
- package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.js +6 -0
- package/dist/src/server/createGraphQLMockServer/createGraphQLMockServer.js +1 -1
- package/dist/src/server/createRestMockServer/createRestMockServer.js +1 -1
- package/dist/src/static/views/components/header/index.js +1 -1
- package/dist/src/static/views/features/scheme/index.js +31 -31
- package/dist/src/static/views/features/tab/index.js +12 -12
- package/dist/src/utils/constants/appPath.js +1 -2
- package/dist/src/utils/constants/checkModes.d.ts +8 -9
- package/dist/src/utils/constants/checkModes.js +8 -16
- package/dist/src/utils/constants/default.js +2 -3
- package/dist/src/utils/helpers/files/index.d.ts +1 -0
- package/dist/src/utils/helpers/files/index.js +16 -0
- package/dist/src/utils/helpers/files/isFilePathValid/isFilePathValid.d.ts +1 -0
- package/dist/src/utils/helpers/files/isFilePathValid/isFilePathValid.js +19 -0
- package/dist/src/utils/helpers/index.d.ts +1 -0
- package/dist/src/utils/helpers/index.js +11 -0
- package/dist/src/utils/helpers/tests/createTmpDir.d.ts +1 -0
- package/dist/src/utils/helpers/tests/createTmpDir.js +12 -0
- package/dist/src/utils/helpers/tests/index.d.ts +1 -0
- package/dist/{bin/validateMockServerConfig/helpers/isCheckModeValid → src/utils/helpers/tests}/index.js +4 -4
- package/dist/src/utils/types/entities.d.ts +48 -0
- package/dist/src/utils/types/entities.js +1 -0
- package/dist/src/utils/types/graphql.d.ts +11 -45
- package/dist/src/utils/types/index.d.ts +1 -0
- package/dist/src/utils/types/index.js +11 -0
- package/dist/src/utils/types/rest.d.ts +17 -46
- package/dist/src/utils/types/server.d.ts +5 -4
- package/package.json +35 -27
- package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.d.ts +0 -1
- package/dist/bin/resolveConfigFilePath/resolveConfigFilePath.js +0 -16
- package/dist/bin/validateMockServerConfig/helpers/index.d.ts +0 -2
- package/dist/bin/validateMockServerConfig/helpers/index.js +0 -27
- package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/index.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/isCheckModeValid.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/helpers/isCheckModeValid/isCheckModeValid.js +0 -12
- package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/index.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/index.js +0 -16
- package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/isDescriptorValueValid.d.ts +0 -2
- package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/isDescriptorValueValid.js +0 -43
- package/dist/bin/validateMockServerConfig/validateBaseUrl/validateBaseUrl.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validateBaseUrl/validateBaseUrl.js +0 -15
- package/dist/bin/validateMockServerConfig/validateCors/validateCors.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validateCors/validateCors.js +0 -84
- package/dist/bin/validateMockServerConfig/validateDatabaseConfig/validateDatabaseConfig.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validateDatabaseConfig/validateDatabaseConfig.js +0 -45
- package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateGraphqlConfig.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateGraphqlConfig.js +0 -58
- package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.d.ts +0 -2
- package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.js +0 -153
- package/dist/bin/validateMockServerConfig/validateInterceptors/validateInterceptors.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validateInterceptors/validateInterceptors.js +0 -27
- package/dist/bin/validateMockServerConfig/validatePort/validatePort.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validatePort/validatePort.js +0 -12
- package/dist/bin/validateMockServerConfig/validateQueue/validateQueue.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validateQueue/validateQueue.js +0 -29
- package/dist/bin/validateMockServerConfig/validateRestConfig/validateRestConfig.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validateRestConfig/validateRestConfig.js +0 -57
- package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.d.ts +0 -2
- package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.js +0 -157
- package/dist/bin/validateMockServerConfig/validateSettings/validateSettings.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validateSettings/validateSettings.js +0 -34
- package/dist/bin/validateMockServerConfig/validateStaticPath/validateStaticPath.d.ts +0 -1
- package/dist/bin/validateMockServerConfig/validateStaticPath/validateStaticPath.js +0 -53
- package/dist/src/core/database/createOrm/createOrm.d.ts +0 -4
- package/dist/src/core/database/createOrm/createOrm.js +0 -70
- package/dist/src/core/database/createStorage/createStorage.d.ts +0 -2
- 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
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
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('
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
(0,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
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 (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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 (
|
|
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 (
|
|
65
|
+
if (_sort) {
|
|
55
66
|
data = (0, _sort2.sort)(data, request.query);
|
|
56
67
|
}
|
|
57
|
-
if (
|
|
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', '
|
|
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', '
|
|
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((
|
|
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', '
|
|
15
|
-
response.json(
|
|
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);
|
|
@@ -5,13 +5,53 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.filter = void 0;
|
|
7
7
|
var _flat = require("flat");
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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;
|
|
@@ -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;
|
|
@@ -4,16 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.sort = void 0;
|
|
7
|
-
var _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.
|
|
16
|
-
const flattenedB = (0, _flat.
|
|
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
|
|
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
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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();
|