mock-config-server 3.1.1 → 3.3.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 +174 -14
- package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/isDescriptorValueValid.d.ts +2 -1
- package/dist/bin/validateMockServerConfig/helpers/isDescriptorValueValid/isDescriptorValueValid.js +30 -7
- package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateGraphqlConfig.js +9 -3
- package/dist/bin/validateMockServerConfig/validateGraphqlConfig/validateRoutes/validateRoutes.js +67 -18
- package/dist/bin/validateMockServerConfig/validateMockServerConfig.js +2 -2
- package/dist/bin/validateMockServerConfig/validateQueue/validateQueue.d.ts +1 -0
- package/dist/bin/validateMockServerConfig/validateQueue/validateQueue.js +29 -0
- package/dist/bin/validateMockServerConfig/validateRestConfig/validateRoutes/validateRoutes.js +67 -18
- package/dist/bin/validateMockServerConfig/validateSettings/validateSettings.d.ts +1 -0
- package/dist/bin/validateMockServerConfig/validateSettings/validateSettings.js +34 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/createNestedDatabaseRoutes/createNestedDatabaseRoutes.js +51 -2
- package/dist/src/core/database/createDatabaseRoutes/helpers/filter/filter.d.ts +2 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/filter/filter.js +17 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/index.d.ts +1 -1
- package/dist/src/core/database/createDatabaseRoutes/helpers/index.js +8 -8
- package/dist/src/core/database/createDatabaseRoutes/helpers/pagination/pagination.d.ts +13 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/pagination/pagination.js +36 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/sort/sort.d.ts +2 -0
- package/dist/src/core/database/createDatabaseRoutes/helpers/sort/sort.js +42 -0
- package/dist/src/core/database/createDatabaseRoutes/storages/File/FileStorage.d.ts +1 -2
- package/dist/src/core/database/createDatabaseRoutes/storages/Memory/MemoryStorage.d.ts +1 -2
- package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.d.ts +7 -1
- package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.js +65 -24
- package/dist/src/core/middlewares/index.d.ts +4 -4
- package/dist/src/core/middlewares/index.js +28 -28
- package/dist/src/core/middlewares/notFoundMiddleware/helpers/getLevenshteinDistance/getLevenshteinDistance.js +1 -0
- package/dist/src/core/middlewares/notFoundMiddleware/notFoundMiddleware.js +1 -3
- package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.d.ts +7 -1
- package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.js +6 -2
- package/dist/src/core/rest/createRestRoutes/createRestRoutes.d.ts +7 -1
- package/dist/src/core/rest/createRestRoutes/createRestRoutes.js +55 -12
- package/dist/src/index.d.ts +1 -2
- package/dist/src/index.js +4 -15
- package/dist/src/server/createDatabaseMockServer/createDatabaseMockServer.d.ts +3 -0
- package/dist/src/server/createDatabaseMockServer/createDatabaseMockServer.js +58 -0
- package/dist/src/server/createGraphQLMockServer/createGraphQLMockServer.d.ts +3 -0
- package/dist/src/server/createGraphQLMockServer/createGraphQLMockServer.js +67 -0
- package/dist/src/server/createMockServer/createMockServer.d.ts +1 -1
- package/dist/src/server/createMockServer/createMockServer.js +29 -11
- package/dist/src/server/createRestMockServer/createRestMockServer.d.ts +3 -0
- package/dist/src/server/createRestMockServer/createRestMockServer.js +67 -0
- package/dist/src/server/index.d.ts +6 -0
- package/dist/src/server/index.js +66 -0
- package/dist/src/server/startDatabaseMockServer/startDatabaseMockServer.d.ts +5 -0
- package/dist/src/server/startDatabaseMockServer/startDatabaseMockServer.js +23 -0
- package/dist/src/server/startGraphQLMockServer/startGraphQLMockServer.d.ts +5 -0
- package/dist/src/server/startGraphQLMockServer/startGraphQLMockServer.js +23 -0
- package/dist/src/server/startRestMockServer/startRestMockServer.d.ts +5 -0
- package/dist/src/server/startRestMockServer/startRestMockServer.js +23 -0
- package/dist/src/static/views/assets/styles/global.css +2 -2
- package/dist/src/static/views/components/header/index.css +4 -4
- package/dist/src/static/views/components/header/index.ejs +6 -6
- package/dist/src/static/views/components/header/index.js +1 -1
- package/dist/src/static/views/features/scheme/dark.css +1 -0
- package/dist/src/static/views/features/scheme/index.js +1 -1
- package/dist/src/static/views/features/scheme/light.css +1 -0
- package/dist/src/static/views/features/tab/index.css +4 -4
- package/dist/src/static/views/features/tab/index.js +12 -12
- package/dist/src/static/views/pages/404/index.css +4 -4
- package/dist/src/static/views/pages/404/index.ejs +8 -8
- package/dist/src/utils/constants/checkModes.d.ts +1 -1
- package/dist/src/utils/helpers/entities/isEntityDescriptor/isEntityDescriptor.d.ts +2 -1
- package/dist/src/utils/helpers/graphql/getGraphQLInput/getGraphQLInput.d.ts +7 -2
- package/dist/src/utils/helpers/graphql/getGraphQLInput/getGraphQLInput.js +6 -4
- package/dist/src/utils/helpers/graphql/index.d.ts +1 -1
- package/dist/src/utils/helpers/graphql/index.js +11 -11
- package/dist/src/utils/helpers/graphql/parseQuery/parseQuery.d.ts +1 -1
- package/dist/src/utils/helpers/graphql/parseQuery/parseQuery.js +1 -1
- package/dist/src/utils/helpers/index.d.ts +5 -5
- package/dist/src/utils/helpers/index.js +40 -40
- package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.js +19 -10
- package/dist/src/utils/types/graphql.d.ts +60 -51
- package/dist/src/utils/types/index.d.ts +1 -0
- package/dist/src/utils/types/index.js +11 -0
- package/dist/src/utils/types/interceptors.d.ts +1 -1
- package/dist/src/utils/types/rest.d.ts +47 -40
- package/dist/src/utils/types/server.d.ts +18 -4
- package/dist/src/utils/types/utils.d.ts +8 -0
- package/dist/src/utils/types/utils.js +1 -0
- package/dist/src/utils/types/values.d.ts +0 -1
- package/package.json +9 -19
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.validateSettings = void 0;
|
|
7
|
+
var _helpers = require("../../../src/utils/helpers");
|
|
8
|
+
const ALLOWED_SETTINGS = ['polling'];
|
|
9
|
+
const validateSetting = (setting, settingName) => {
|
|
10
|
+
if (settingName === 'polling' && typeof setting !== 'boolean') {
|
|
11
|
+
throw new Error('polling');
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const validateSettings = settings => {
|
|
15
|
+
const isSettingsObject = (0, _helpers.isPlainObject)(settings);
|
|
16
|
+
if (isSettingsObject) {
|
|
17
|
+
Object.keys(settings).forEach(settingName => {
|
|
18
|
+
const isSettingAllowed = ALLOWED_SETTINGS.includes(settingName);
|
|
19
|
+
if (!isSettingAllowed) {
|
|
20
|
+
throw new Error(`settings.${settingName}`);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
validateSetting(settings[settingName], settingName);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
throw new Error(`settings.${error.message}`);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (typeof settings !== 'undefined') {
|
|
31
|
+
throw new Error('settings');
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.validateSettings = validateSettings;
|
|
@@ -5,16 +5,65 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.createNestedDatabaseRoutes = void 0;
|
|
7
7
|
var _array = require("../array");
|
|
8
|
+
var _filter = require("../filter/filter");
|
|
9
|
+
var _pagination = require("../pagination/pagination");
|
|
10
|
+
var _sort2 = require("../sort/sort");
|
|
8
11
|
const createNestedDatabaseRoutes = (router, database, storage) => {
|
|
9
12
|
Object.keys(database).forEach(key => {
|
|
10
13
|
const collectionPath = `/${key}`;
|
|
11
14
|
const itemPath = `/${key}/:id`;
|
|
12
|
-
router.route(collectionPath).get((
|
|
15
|
+
router.route(collectionPath).get((request, response) => {
|
|
16
|
+
var _request$query;
|
|
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;
|
|
28
|
+
data = (0, _filter.filter)(data, filters);
|
|
29
|
+
}
|
|
30
|
+
if ((_request$query = request.query) !== null && _request$query !== void 0 && _request$query._page) {
|
|
31
|
+
data = (0, _pagination.pagination)(data, request.query);
|
|
32
|
+
if (data._link) {
|
|
33
|
+
const links = {};
|
|
34
|
+
const fullUrl = `${request.protocol}://${request.get('host')}${request.originalUrl}`;
|
|
35
|
+
if (data._link.first) {
|
|
36
|
+
links.first = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.first}`);
|
|
37
|
+
}
|
|
38
|
+
if (data._link.prev) {
|
|
39
|
+
links.prev = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.prev}`);
|
|
40
|
+
}
|
|
41
|
+
if (data._link.next) {
|
|
42
|
+
links.next = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.next}`);
|
|
43
|
+
}
|
|
44
|
+
if (data._link.last) {
|
|
45
|
+
links.last = fullUrl.replace(`page=${data._link.current}`, `page=${data._link.last}`);
|
|
46
|
+
}
|
|
47
|
+
data._link = {
|
|
48
|
+
...data._link,
|
|
49
|
+
...links
|
|
50
|
+
};
|
|
51
|
+
response.links(links);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (request.query && request.query._sort) {
|
|
55
|
+
data = (0, _sort2.sort)(data, request.query);
|
|
56
|
+
}
|
|
57
|
+
if (request.query._begin || request.query._end) {
|
|
58
|
+
var _request$query$_begin;
|
|
59
|
+
data = data.slice((_request$query$_begin = request.query._begin) !== null && _request$query$_begin !== void 0 ? _request$query$_begin : 0, request.query._end);
|
|
60
|
+
response.set('X-Total-Count', data.length);
|
|
61
|
+
}
|
|
13
62
|
// ✅ important:
|
|
14
63
|
// set 'Cache-Control' header for explicit browsers response revalidate
|
|
15
64
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
|
|
16
65
|
response.set('Cache-control', 'max-age=0, must-revalidate');
|
|
17
|
-
response.json(
|
|
66
|
+
response.json(data);
|
|
18
67
|
});
|
|
19
68
|
router.route(collectionPath).post((request, response) => {
|
|
20
69
|
const collection = storage.read(key);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.filter = void 0;
|
|
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]}`);
|
|
13
|
+
}
|
|
14
|
+
return `${flattenedElement[key]}` === value;
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
exports.filter = filter;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export * from './array';
|
|
2
|
-
export * from './createRewrittenDatabaseRoutes/createRewrittenDatabaseRoutes';
|
|
3
2
|
export * from './createNestedDatabaseRoutes/createNestedDatabaseRoutes';
|
|
3
|
+
export * from './createRewrittenDatabaseRoutes/createRewrittenDatabaseRoutes';
|
|
4
4
|
export * from './createShallowDatabaseRoutes/createShallowDatabaseRoutes';
|
|
5
5
|
export * from './splitDatabaseByNesting/splitDatabaseByNesting';
|
|
@@ -14,25 +14,25 @@ Object.keys(_array).forEach(function (key) {
|
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
16
|
});
|
|
17
|
-
var
|
|
18
|
-
Object.keys(
|
|
17
|
+
var _createNestedDatabaseRoutes = require("./createNestedDatabaseRoutes/createNestedDatabaseRoutes");
|
|
18
|
+
Object.keys(_createNestedDatabaseRoutes).forEach(function (key) {
|
|
19
19
|
if (key === "default" || key === "__esModule") return;
|
|
20
|
-
if (key in exports && exports[key] ===
|
|
20
|
+
if (key in exports && exports[key] === _createNestedDatabaseRoutes[key]) return;
|
|
21
21
|
Object.defineProperty(exports, key, {
|
|
22
22
|
enumerable: true,
|
|
23
23
|
get: function () {
|
|
24
|
-
return
|
|
24
|
+
return _createNestedDatabaseRoutes[key];
|
|
25
25
|
}
|
|
26
26
|
});
|
|
27
27
|
});
|
|
28
|
-
var
|
|
29
|
-
Object.keys(
|
|
28
|
+
var _createRewrittenDatabaseRoutes = require("./createRewrittenDatabaseRoutes/createRewrittenDatabaseRoutes");
|
|
29
|
+
Object.keys(_createRewrittenDatabaseRoutes).forEach(function (key) {
|
|
30
30
|
if (key === "default" || key === "__esModule") return;
|
|
31
|
-
if (key in exports && exports[key] ===
|
|
31
|
+
if (key in exports && exports[key] === _createRewrittenDatabaseRoutes[key]) return;
|
|
32
32
|
Object.defineProperty(exports, key, {
|
|
33
33
|
enumerable: true,
|
|
34
34
|
get: function () {
|
|
35
|
-
return
|
|
35
|
+
return _createRewrittenDatabaseRoutes[key];
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
38
|
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ParsedUrlQuery } from 'node:querystring';
|
|
2
|
+
export declare const pagination: (array: any[], queries: ParsedUrlQuery) => any[] | {
|
|
3
|
+
_link: {
|
|
4
|
+
count: number;
|
|
5
|
+
pages: number;
|
|
6
|
+
first: number;
|
|
7
|
+
current: number;
|
|
8
|
+
next: number | null;
|
|
9
|
+
prev: number | null;
|
|
10
|
+
last: number | null;
|
|
11
|
+
};
|
|
12
|
+
results: any[];
|
|
13
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.pagination = void 0;
|
|
7
|
+
const DEFAULT_LIMIT = 10;
|
|
8
|
+
const pagination = (array, queries) => {
|
|
9
|
+
const {
|
|
10
|
+
_page
|
|
11
|
+
} = queries;
|
|
12
|
+
if (!_page || +_page <= 0) return array;
|
|
13
|
+
const page = +_page;
|
|
14
|
+
const limit = queries._limit && +queries._limit > 0 ? +queries._limit : DEFAULT_LIMIT;
|
|
15
|
+
const pages = Math.ceil(array.length / limit);
|
|
16
|
+
if (page > pages) return array;
|
|
17
|
+
const start = page * limit - limit;
|
|
18
|
+
const end = page * limit;
|
|
19
|
+
const results = array.slice(start, end);
|
|
20
|
+
const next = page + 1 <= pages ? page + 1 : null;
|
|
21
|
+
const prev = page - 1 !== 0 ? page - 1 : null;
|
|
22
|
+
const last = pages > 0 ? pages : null;
|
|
23
|
+
return {
|
|
24
|
+
_link: {
|
|
25
|
+
count: array.length,
|
|
26
|
+
pages,
|
|
27
|
+
first: 1,
|
|
28
|
+
current: page,
|
|
29
|
+
next,
|
|
30
|
+
prev,
|
|
31
|
+
last
|
|
32
|
+
},
|
|
33
|
+
results
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
exports.pagination = pagination;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.sort = void 0;
|
|
7
|
+
var _flat = _interopRequireDefault(require("flat"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
const DEFAULT_ORDER = 'asc';
|
|
10
|
+
const getOrder = order => {
|
|
11
|
+
if (order === 'asc' || order === 'desc') return order;
|
|
12
|
+
return DEFAULT_ORDER;
|
|
13
|
+
};
|
|
14
|
+
const sortArray = (array, key, order) => array.sort((a, b) => {
|
|
15
|
+
const flattenedA = (0, _flat.default)(a);
|
|
16
|
+
const flattenedB = (0, _flat.default)(b);
|
|
17
|
+
if (!flattenedA[key] || !flattenedB[key]) return 0;
|
|
18
|
+
if (typeof flattenedA[key] === 'string' && typeof flattenedB[key] === 'string') {
|
|
19
|
+
return order === 'asc' ? flattenedA[key].localeCompare(flattenedB[key]) : flattenedB[key].localeCompare(flattenedA[key]);
|
|
20
|
+
}
|
|
21
|
+
return order === 'asc' ? Number(flattenedA[key]) - Number(flattenedB[key]) : Number(flattenedB[key]) - Number(flattenedA[key]);
|
|
22
|
+
});
|
|
23
|
+
const sort = (array, queries) => {
|
|
24
|
+
const {
|
|
25
|
+
_sort,
|
|
26
|
+
_order = DEFAULT_ORDER
|
|
27
|
+
} = queries;
|
|
28
|
+
if (!_sort) return array;
|
|
29
|
+
const result = [...array];
|
|
30
|
+
if (Array.isArray(_sort)) {
|
|
31
|
+
const orders = Array.isArray(_order) ? _order : [_order];
|
|
32
|
+
_sort.forEach((key, index) => {
|
|
33
|
+
const order = getOrder(orders[index]);
|
|
34
|
+
sortArray(result, key, order);
|
|
35
|
+
});
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
const order = getOrder(Array.isArray(_order) ? _order[0] : _order);
|
|
39
|
+
sortArray(result, _sort, order);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
exports.sort = sort;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
type Index = string | number;
|
|
2
|
-
|
|
3
|
-
export declare class FileStorage<T extends Object = Object> {
|
|
2
|
+
export declare class FileStorage<T extends Record<Index, any> = Record<Index, any>> {
|
|
4
3
|
private readonly fileWriter;
|
|
5
4
|
private readonly data;
|
|
6
5
|
constructor(fileName: string);
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
type Index = string | number;
|
|
2
|
-
|
|
3
|
-
export declare class MemoryStorage<T extends Object = Object> {
|
|
2
|
+
export declare class MemoryStorage<T extends Record<Index, any> = Record<Index, any>> {
|
|
4
3
|
private readonly data;
|
|
5
4
|
constructor(initialData: T);
|
|
6
5
|
read(key?: Index | Index[]): any;
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import type { IRouter } from 'express';
|
|
2
2
|
import type { GraphqlConfig, Interceptors } from '../../../utils/types';
|
|
3
|
-
|
|
3
|
+
interface CreateGraphQLRoutesParams {
|
|
4
|
+
router: IRouter;
|
|
5
|
+
graphqlConfig: GraphqlConfig;
|
|
6
|
+
serverResponseInterceptor?: Interceptors['response'];
|
|
7
|
+
}
|
|
8
|
+
export declare const createGraphQLRoutes: ({ router, graphqlConfig, serverResponseInterceptor }: CreateGraphQLRoutesParams) => IRouter;
|
|
9
|
+
export {};
|
|
@@ -7,12 +7,16 @@ exports.createGraphQLRoutes = void 0;
|
|
|
7
7
|
var _flat = require("flat");
|
|
8
8
|
var _helpers = require("../../../utils/helpers");
|
|
9
9
|
var _helpers2 = require("./helpers");
|
|
10
|
-
const createGraphQLRoutes = (
|
|
10
|
+
const createGraphQLRoutes = ({
|
|
11
|
+
router,
|
|
12
|
+
graphqlConfig,
|
|
13
|
+
serverResponseInterceptor
|
|
14
|
+
}) => {
|
|
11
15
|
const preparedGraphQLRequestConfig = (0, _helpers2.prepareGraphQLRequestConfigs)(graphqlConfig.configs);
|
|
12
16
|
const graphqlMiddleware = async (request, response, next) => {
|
|
13
|
-
var _matchedRequestConfig, _matchedRouteConfig$e, _matchedRouteConfig$i, _matchedRequestConfig2, _graphqlConfig$interc;
|
|
17
|
+
var _matchedRequestConfig, _matchedRouteConfig$s, _matchedRouteConfig$e, _matchedRouteConfig$i, _matchedRequestConfig2, _graphqlConfig$interc;
|
|
14
18
|
const graphQLInput = (0, _helpers.getGraphQLInput)(request);
|
|
15
|
-
if (!graphQLInput
|
|
19
|
+
if (!graphQLInput.query) {
|
|
16
20
|
return response.status(400).json({
|
|
17
21
|
message: 'Query is missing, you must pass a valid GraphQL query'
|
|
18
22
|
});
|
|
@@ -23,16 +27,16 @@ const createGraphQLRoutes = (router, graphqlConfig, serverResponseInterceptors)
|
|
|
23
27
|
message: 'Query is invalid, you must use a valid GraphQL query'
|
|
24
28
|
});
|
|
25
29
|
}
|
|
26
|
-
if (!query.operationName || !query.operationType) {
|
|
27
|
-
return response.status(400).json({
|
|
28
|
-
message: `You should to specify operationName and operationType for ${request.method}:${request.baseUrl}${request.path}`
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
30
|
const matchedRequestConfig = preparedGraphQLRequestConfig.find(requestConfig => {
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
var _graphQLInput$query;
|
|
32
|
+
if (requestConfig.operationType !== query.operationType) return false;
|
|
33
|
+
if ('query' in requestConfig && requestConfig.query.replace(/\s+/gi, ' ') !== ((_graphQLInput$query = graphQLInput.query) === null || _graphQLInput$query === void 0 ? void 0 : _graphQLInput$query.replace(/\s+/gi, ' '))) return false;
|
|
34
|
+
if ('operationName' in requestConfig) {
|
|
35
|
+
if (!query.operationName) return false;
|
|
36
|
+
if (requestConfig.operationName instanceof RegExp) return new RegExp(requestConfig.operationName).test(query.operationName);
|
|
37
|
+
return requestConfig.operationName === query.operationName;
|
|
34
38
|
}
|
|
35
|
-
return
|
|
39
|
+
return true;
|
|
36
40
|
});
|
|
37
41
|
if (!matchedRequestConfig) {
|
|
38
42
|
return next();
|
|
@@ -49,25 +53,29 @@ const createGraphQLRoutes = (router, graphqlConfig, serverResponseInterceptors)
|
|
|
49
53
|
}) => {
|
|
50
54
|
if (!entities) return true;
|
|
51
55
|
const entries = Object.entries(entities);
|
|
52
|
-
return entries.every(([entityName,
|
|
56
|
+
return entries.every(([entityName, entityDescriptorOrValue]) => {
|
|
53
57
|
const {
|
|
54
58
|
checkMode,
|
|
55
|
-
value:
|
|
56
|
-
} = (0, _helpers.convertToEntityDescriptor)(
|
|
59
|
+
value: entityDescriptorValue
|
|
60
|
+
} = (0, _helpers.convertToEntityDescriptor)(entityDescriptorOrValue);
|
|
57
61
|
|
|
58
62
|
// ✅ important: check whole variables as plain value strictly if descriptor used for variables
|
|
59
|
-
const
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
-
return (0, _helpers.resolveEntityValues)(checkMode, Object.keys(graphQLInput.variables).length ? graphQLInput.variables : undefined, descriptorValue);
|
|
63
|
+
const isEntityVariablesByTopLevelDescriptor = entityName === 'variables' && (0, _helpers.isEntityDescriptor)(entityDescriptorOrValue);
|
|
64
|
+
if (isEntityVariablesByTopLevelDescriptor) {
|
|
65
|
+
return (0, _helpers.resolveEntityValues)(checkMode, graphQLInput.variables, entityDescriptorValue);
|
|
63
66
|
}
|
|
64
|
-
const
|
|
65
|
-
|
|
67
|
+
const isEntityVariablesByTopLevelArray = entityName === 'variables' && Array.isArray(entityDescriptorOrValue);
|
|
68
|
+
if (isEntityVariablesByTopLevelArray) {
|
|
69
|
+
return entityDescriptorOrValue.some(entityDescriptorOrValueElement => (0, _helpers.resolveEntityValues)(checkMode, graphQLInput.variables, entityDescriptorOrValueElement));
|
|
70
|
+
}
|
|
71
|
+
const recordOrArrayEntries = Object.entries(entityDescriptorOrValue);
|
|
72
|
+
return recordOrArrayEntries.every(([entityKey, entityValue]) => {
|
|
66
73
|
const {
|
|
67
74
|
checkMode,
|
|
68
75
|
value: descriptorValue
|
|
69
|
-
} = (0, _helpers.convertToEntityDescriptor)(
|
|
76
|
+
} = (0, _helpers.convertToEntityDescriptor)(entityValue);
|
|
70
77
|
const flattenEntity = (0, _flat.flatten)(entityName === 'variables' ? graphQLInput.variables : request[entityName]);
|
|
78
|
+
|
|
71
79
|
// ✅ important: transform header keys to lower case because browsers send headers in lowercase
|
|
72
80
|
return (0, _helpers.resolveEntityValues)(checkMode, flattenEntity[entityName === 'headers' ? entityKey.toLowerCase() : entityKey], descriptorValue);
|
|
73
81
|
});
|
|
@@ -76,16 +84,49 @@ const createGraphQLRoutes = (router, graphqlConfig, serverResponseInterceptors)
|
|
|
76
84
|
if (!matchedRouteConfig) {
|
|
77
85
|
return next();
|
|
78
86
|
}
|
|
79
|
-
|
|
87
|
+
let matchedRouteConfigData = null;
|
|
88
|
+
if ((_matchedRouteConfig$s = matchedRouteConfig.settings) !== null && _matchedRouteConfig$s !== void 0 && _matchedRouteConfig$s.polling && 'queue' in matchedRouteConfig) {
|
|
89
|
+
var _shallowMatchedRouteC;
|
|
90
|
+
if (!matchedRouteConfig.queue.length) return next();
|
|
91
|
+
const shallowMatchedRouteConfig = matchedRouteConfig;
|
|
92
|
+
let index = (_shallowMatchedRouteC = shallowMatchedRouteConfig.__pollingIndex) !== null && _shallowMatchedRouteC !== void 0 ? _shallowMatchedRouteC : 0;
|
|
93
|
+
const {
|
|
94
|
+
time,
|
|
95
|
+
data
|
|
96
|
+
} = matchedRouteConfig.queue[index];
|
|
97
|
+
const updateIndex = () => {
|
|
98
|
+
if (matchedRouteConfig.queue.length - 1 === index) {
|
|
99
|
+
index = 0;
|
|
100
|
+
} else {
|
|
101
|
+
index += 1;
|
|
102
|
+
}
|
|
103
|
+
shallowMatchedRouteConfig.__pollingIndex = index;
|
|
104
|
+
};
|
|
105
|
+
if (time && !shallowMatchedRouteConfig.__timeoutInProgress) {
|
|
106
|
+
shallowMatchedRouteConfig.__timeoutInProgress = true;
|
|
107
|
+
setTimeout(() => {
|
|
108
|
+
shallowMatchedRouteConfig.__timeoutInProgress = false;
|
|
109
|
+
updateIndex();
|
|
110
|
+
}, time);
|
|
111
|
+
}
|
|
112
|
+
if (!time && !shallowMatchedRouteConfig.__timeoutInProgress) {
|
|
113
|
+
updateIndex();
|
|
114
|
+
}
|
|
115
|
+
matchedRouteConfigData = data;
|
|
116
|
+
}
|
|
117
|
+
if ('data' in matchedRouteConfig) {
|
|
118
|
+
matchedRouteConfigData = matchedRouteConfig.data;
|
|
119
|
+
}
|
|
120
|
+
const resolvedData = typeof matchedRouteConfigData === 'function' ? await matchedRouteConfigData(request, (_matchedRouteConfig$e = matchedRouteConfig.entities) !== null && _matchedRouteConfig$e !== void 0 ? _matchedRouteConfig$e : {}) : matchedRouteConfigData;
|
|
80
121
|
const data = await (0, _helpers.callResponseInterceptors)({
|
|
81
|
-
data:
|
|
122
|
+
data: resolvedData,
|
|
82
123
|
request,
|
|
83
124
|
response,
|
|
84
125
|
interceptors: {
|
|
85
126
|
routeInterceptor: (_matchedRouteConfig$i = matchedRouteConfig.interceptors) === null || _matchedRouteConfig$i === void 0 ? void 0 : _matchedRouteConfig$i.response,
|
|
86
127
|
requestInterceptor: (_matchedRequestConfig2 = matchedRequestConfig.interceptors) === null || _matchedRequestConfig2 === void 0 ? void 0 : _matchedRequestConfig2.response,
|
|
87
128
|
apiInterceptor: (_graphqlConfig$interc = graphqlConfig.interceptors) === null || _graphqlConfig$interc === void 0 ? void 0 : _graphqlConfig$interc.response,
|
|
88
|
-
serverInterceptor:
|
|
129
|
+
serverInterceptor: serverResponseInterceptor
|
|
89
130
|
}
|
|
90
131
|
});
|
|
91
132
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './cookieParseMiddleware/cookieParseMiddleware';
|
|
2
2
|
export * from './corsMiddleware/corsMiddleware';
|
|
3
|
+
export * from './destroyerMiddleware/destroyerMiddleware';
|
|
4
|
+
export * from './errorMiddleware/errorMiddleware';
|
|
3
5
|
export * from './noCorsMiddleware/noCorsMiddleware';
|
|
4
6
|
export * from './notFoundMiddleware/notFoundMiddleware';
|
|
5
7
|
export * from './requestInterceptorMiddleware/requestInterceptorMiddleware';
|
|
6
|
-
export * from './
|
|
7
|
-
export * from './cookieParseMiddleware/cookieParseMiddleware';
|
|
8
|
-
export * from './errorMiddleware/errorMiddleware';
|
|
8
|
+
export * from './staticMiddleware/staticMiddleware';
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
var
|
|
7
|
-
Object.keys(
|
|
6
|
+
var _cookieParseMiddleware = require("./cookieParseMiddleware/cookieParseMiddleware");
|
|
7
|
+
Object.keys(_cookieParseMiddleware).forEach(function (key) {
|
|
8
8
|
if (key === "default" || key === "__esModule") return;
|
|
9
|
-
if (key in exports && exports[key] ===
|
|
9
|
+
if (key in exports && exports[key] === _cookieParseMiddleware[key]) return;
|
|
10
10
|
Object.defineProperty(exports, key, {
|
|
11
11
|
enumerable: true,
|
|
12
12
|
get: function () {
|
|
13
|
-
return
|
|
13
|
+
return _cookieParseMiddleware[key];
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
16
|
});
|
|
@@ -25,69 +25,69 @@ Object.keys(_corsMiddleware).forEach(function (key) {
|
|
|
25
25
|
}
|
|
26
26
|
});
|
|
27
27
|
});
|
|
28
|
-
var
|
|
29
|
-
Object.keys(
|
|
28
|
+
var _destroyerMiddleware = require("./destroyerMiddleware/destroyerMiddleware");
|
|
29
|
+
Object.keys(_destroyerMiddleware).forEach(function (key) {
|
|
30
30
|
if (key === "default" || key === "__esModule") return;
|
|
31
|
-
if (key in exports && exports[key] ===
|
|
31
|
+
if (key in exports && exports[key] === _destroyerMiddleware[key]) return;
|
|
32
32
|
Object.defineProperty(exports, key, {
|
|
33
33
|
enumerable: true,
|
|
34
34
|
get: function () {
|
|
35
|
-
return
|
|
35
|
+
return _destroyerMiddleware[key];
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
38
|
});
|
|
39
|
-
var
|
|
40
|
-
Object.keys(
|
|
39
|
+
var _errorMiddleware = require("./errorMiddleware/errorMiddleware");
|
|
40
|
+
Object.keys(_errorMiddleware).forEach(function (key) {
|
|
41
41
|
if (key === "default" || key === "__esModule") return;
|
|
42
|
-
if (key in exports && exports[key] ===
|
|
42
|
+
if (key in exports && exports[key] === _errorMiddleware[key]) return;
|
|
43
43
|
Object.defineProperty(exports, key, {
|
|
44
44
|
enumerable: true,
|
|
45
45
|
get: function () {
|
|
46
|
-
return
|
|
46
|
+
return _errorMiddleware[key];
|
|
47
47
|
}
|
|
48
48
|
});
|
|
49
49
|
});
|
|
50
|
-
var
|
|
51
|
-
Object.keys(
|
|
50
|
+
var _noCorsMiddleware = require("./noCorsMiddleware/noCorsMiddleware");
|
|
51
|
+
Object.keys(_noCorsMiddleware).forEach(function (key) {
|
|
52
52
|
if (key === "default" || key === "__esModule") return;
|
|
53
|
-
if (key in exports && exports[key] ===
|
|
53
|
+
if (key in exports && exports[key] === _noCorsMiddleware[key]) return;
|
|
54
54
|
Object.defineProperty(exports, key, {
|
|
55
55
|
enumerable: true,
|
|
56
56
|
get: function () {
|
|
57
|
-
return
|
|
57
|
+
return _noCorsMiddleware[key];
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
|
-
var
|
|
62
|
-
Object.keys(
|
|
61
|
+
var _notFoundMiddleware = require("./notFoundMiddleware/notFoundMiddleware");
|
|
62
|
+
Object.keys(_notFoundMiddleware).forEach(function (key) {
|
|
63
63
|
if (key === "default" || key === "__esModule") return;
|
|
64
|
-
if (key in exports && exports[key] ===
|
|
64
|
+
if (key in exports && exports[key] === _notFoundMiddleware[key]) return;
|
|
65
65
|
Object.defineProperty(exports, key, {
|
|
66
66
|
enumerable: true,
|
|
67
67
|
get: function () {
|
|
68
|
-
return
|
|
68
|
+
return _notFoundMiddleware[key];
|
|
69
69
|
}
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
|
-
var
|
|
73
|
-
Object.keys(
|
|
72
|
+
var _requestInterceptorMiddleware = require("./requestInterceptorMiddleware/requestInterceptorMiddleware");
|
|
73
|
+
Object.keys(_requestInterceptorMiddleware).forEach(function (key) {
|
|
74
74
|
if (key === "default" || key === "__esModule") return;
|
|
75
|
-
if (key in exports && exports[key] ===
|
|
75
|
+
if (key in exports && exports[key] === _requestInterceptorMiddleware[key]) return;
|
|
76
76
|
Object.defineProperty(exports, key, {
|
|
77
77
|
enumerable: true,
|
|
78
78
|
get: function () {
|
|
79
|
-
return
|
|
79
|
+
return _requestInterceptorMiddleware[key];
|
|
80
80
|
}
|
|
81
81
|
});
|
|
82
82
|
});
|
|
83
|
-
var
|
|
84
|
-
Object.keys(
|
|
83
|
+
var _staticMiddleware = require("./staticMiddleware/staticMiddleware");
|
|
84
|
+
Object.keys(_staticMiddleware).forEach(function (key) {
|
|
85
85
|
if (key === "default" || key === "__esModule") return;
|
|
86
|
-
if (key in exports && exports[key] ===
|
|
86
|
+
if (key in exports && exports[key] === _staticMiddleware[key]) return;
|
|
87
87
|
Object.defineProperty(exports, key, {
|
|
88
88
|
enumerable: true,
|
|
89
89
|
get: function () {
|
|
90
|
-
return
|
|
90
|
+
return _staticMiddleware[key];
|
|
91
91
|
}
|
|
92
92
|
});
|
|
93
93
|
});
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getLevenshteinDistance = void 0;
|
|
7
|
+
/* eslint-disable eslint-comments/disable-enable-pair, eslint-comments/no-unlimited-disable */
|
|
7
8
|
/* eslint-disable */
|
|
8
9
|
|
|
9
10
|
const min = (d0, d1, d2, bx, ay) => d0 < d1 || d2 < d1 ? d0 > d2 ? d2 + 1 : d0 + 1 : bx === ay ? d1 : d1 + 1;
|
|
@@ -22,9 +22,7 @@ const notFoundMiddleware = (server, mockServerConfig) => {
|
|
|
22
22
|
path: `${serverBaseUrl !== null && serverBaseUrl !== void 0 ? serverBaseUrl : ''}${(_rest$baseUrl = rest === null || rest === void 0 ? void 0 : rest.baseUrl) !== null && _rest$baseUrl !== void 0 ? _rest$baseUrl : ''}${request.path}`
|
|
23
23
|
};
|
|
24
24
|
})) !== null && _rest$configs$filter$ !== void 0 ? _rest$configs$filter$ : [];
|
|
25
|
-
const graphqlRequestConfigs = (_graphql$configs$filt = graphql === null || graphql === void 0 ? void 0 : graphql.configs.filter(({
|
|
26
|
-
operationName
|
|
27
|
-
}) => !(operationName instanceof RegExp)).map(request => {
|
|
25
|
+
const graphqlRequestConfigs = (_graphql$configs$filt = graphql === null || graphql === void 0 ? void 0 : graphql.configs.filter(request => 'operationName' in request && !(request.operationName instanceof RegExp)).map(request => {
|
|
28
26
|
var _graphql$baseUrl;
|
|
29
27
|
return {
|
|
30
28
|
operationType: request.operationType,
|
package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import type { Express } from 'express';
|
|
2
2
|
import type { RequestInterceptor } from '../../../utils/types';
|
|
3
|
-
|
|
3
|
+
interface RequestInterceptorMiddlewareParams {
|
|
4
|
+
server: Express;
|
|
5
|
+
path?: string;
|
|
6
|
+
interceptor: RequestInterceptor;
|
|
7
|
+
}
|
|
8
|
+
export declare const requestInterceptorMiddleware: ({ server, path, interceptor }: RequestInterceptorMiddlewareParams) => void;
|
|
9
|
+
export {};
|
package/dist/src/core/middlewares/requestInterceptorMiddleware/requestInterceptorMiddleware.js
CHANGED
|
@@ -5,8 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.requestInterceptorMiddleware = void 0;
|
|
7
7
|
var _helpers = require("../../../utils/helpers");
|
|
8
|
-
const requestInterceptorMiddleware = (
|
|
9
|
-
server
|
|
8
|
+
const requestInterceptorMiddleware = ({
|
|
9
|
+
server,
|
|
10
|
+
path = '*',
|
|
11
|
+
interceptor
|
|
12
|
+
}) => {
|
|
13
|
+
server.use(path, (0, _helpers.asyncHandler)(async (request, _response, next) => {
|
|
10
14
|
await (0, _helpers.callRequestInterceptor)({
|
|
11
15
|
request,
|
|
12
16
|
interceptor
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import type { IRouter } from 'express';
|
|
2
2
|
import type { Interceptors, RestConfig } from '../../../utils/types';
|
|
3
|
-
|
|
3
|
+
interface CreateRestRoutesParams {
|
|
4
|
+
router: IRouter;
|
|
5
|
+
restConfig: RestConfig;
|
|
6
|
+
serverResponseInterceptor?: Interceptors['response'];
|
|
7
|
+
}
|
|
8
|
+
export declare const createRestRoutes: ({ router, restConfig, serverResponseInterceptor }: CreateRestRoutesParams) => IRouter;
|
|
9
|
+
export {};
|