@kollors/deep-json-server 1.0.0-alpha.5 → 1.0.0-alpha.7
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 +346 -188
- package/README.ru.md +343 -185
- package/dist/bin/deep-json-server.js +1 -1
- package/dist/bin/deep-json-server.js.map +1 -1
- package/dist/index.d.ts +12 -8
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/src/auth/contract.d.ts +27 -0
- package/dist/src/auth/contract.js +5 -0
- package/dist/src/auth/contract.js.map +1 -0
- package/dist/src/auth/password.d.ts +13 -0
- package/dist/src/auth/password.js +37 -0
- package/dist/src/auth/password.js.map +1 -0
- package/dist/src/auth/public.d.ts +3 -0
- package/dist/src/auth/public.js +5 -0
- package/dist/src/auth/public.js.map +1 -0
- package/dist/src/auth/routes.d.ts +6 -0
- package/dist/src/auth/routes.js +15 -0
- package/dist/src/auth/routes.js.map +1 -0
- package/dist/src/auth/service.d.ts +39 -0
- package/dist/src/auth/service.js +143 -0
- package/dist/src/auth/service.js.map +1 -0
- package/dist/src/cli/index.d.ts +7 -0
- package/dist/src/{cli.js → cli/index.js} +32 -12
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/{constants.d.ts → core/constants.d.ts} +1 -1
- package/dist/src/{constants.js → core/constants.js} +1 -1
- package/dist/src/core/constants.js.map +1 -0
- package/dist/src/core/database.d.ts +50 -0
- package/dist/src/{database.js → core/database.js} +21 -1
- package/dist/src/core/database.js.map +1 -0
- package/dist/src/core/engine.d.ts +64 -0
- package/dist/src/{engine.js → core/engine.js} +64 -18
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/errors.d.ts +9 -0
- package/dist/src/core/errors.js +12 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/http-errors.d.ts +9 -0
- package/dist/src/core/http-errors.js +15 -0
- package/dist/src/core/http-errors.js.map +1 -0
- package/dist/src/core/lifecycle/mutation.d.ts +49 -0
- package/dist/src/core/lifecycle/mutation.js +170 -0
- package/dist/src/core/lifecycle/mutation.js.map +1 -0
- package/dist/src/core/lifecycle/options.d.ts +20 -0
- package/dist/src/core/lifecycle/options.js +21 -0
- package/dist/src/core/lifecycle/options.js.map +1 -0
- package/dist/src/core/model.d.ts +130 -0
- package/dist/src/{model.js → core/model.js} +106 -10
- package/dist/src/core/model.js.map +1 -0
- package/dist/src/{mutations → core/mutations}/write.d.ts +3 -2
- package/dist/src/{mutations → core/mutations}/write.js +14 -4
- package/dist/src/core/mutations/write.js.map +1 -0
- package/dist/src/core/pagination.d.ts +10 -0
- package/dist/src/{pagination.js → core/pagination.js} +3 -0
- package/dist/src/core/pagination.js.map +1 -0
- package/dist/src/core/paths.d.ts +16 -0
- package/dist/src/{paths.js → core/paths.js} +14 -1
- package/dist/src/core/paths.js.map +1 -0
- package/dist/src/core/query/contract.d.ts +6 -0
- package/dist/src/{query → core/query}/contract.js +3 -0
- package/dist/src/core/query/contract.js.map +1 -0
- package/dist/src/core/query/filter.d.ts +6 -0
- package/dist/src/{query → core/query}/filter.js +18 -4
- package/dist/src/core/query/filter.js.map +1 -0
- package/dist/src/core/query/options.d.ts +30 -0
- package/dist/src/{query → core/query}/options.js +12 -0
- package/dist/src/core/query/options.js.map +1 -0
- package/dist/src/core/records.d.ts +46 -0
- package/dist/src/{records.js → core/records.js} +24 -3
- package/dist/src/core/records.js.map +1 -0
- package/dist/src/core/relation-metadata.d.ts +15 -0
- package/dist/src/{relation-metadata.js → core/relation-metadata.js} +7 -1
- package/dist/src/core/relation-metadata.js.map +1 -0
- package/dist/src/core/types.d.ts +10 -0
- package/dist/src/{types.js.map → core/types.js.map} +1 -1
- package/dist/src/core/utils.d.ts +56 -0
- package/dist/src/core/utils.js +102 -0
- package/dist/src/core/utils.js.map +1 -0
- package/dist/src/files/contract.d.ts +33 -0
- package/dist/src/files/contract.js +25 -3
- package/dist/src/files/contract.js.map +1 -1
- package/dist/src/files/disk-store.d.ts +3 -0
- package/dist/src/files/disk-store.js +27 -3
- package/dist/src/files/disk-store.js.map +1 -1
- package/dist/src/files/http.d.ts +8 -3
- package/dist/src/files/http.js +9 -0
- package/dist/src/files/http.js.map +1 -1
- package/dist/src/files/index.d.ts +4 -3
- package/dist/src/files/index.js +3 -1
- package/dist/src/files/index.js.map +1 -1
- package/dist/src/files/memory-store.d.ts +4 -1
- package/dist/src/files/memory-store.js +8 -2
- package/dist/src/files/memory-store.js.map +1 -1
- package/dist/src/files/routes.d.ts +3 -0
- package/dist/src/files/routes.js +25 -1
- package/dist/src/files/routes.js.map +1 -1
- package/dist/src/graphql/entry.d.ts +2 -2
- package/dist/src/graphql/entry.js.map +1 -1
- package/dist/src/graphql/lazy.d.ts +10 -0
- package/dist/src/graphql/lazy.js +13 -0
- package/dist/src/graphql/lazy.js.map +1 -0
- package/dist/src/graphql/preflight.d.ts +4 -1
- package/dist/src/graphql/preflight.js +3 -0
- package/dist/src/graphql/preflight.js.map +1 -1
- package/dist/src/graphql/public.d.ts +10 -2
- package/dist/src/graphql/public.js +10 -4
- package/dist/src/graphql/public.js.map +1 -1
- package/dist/src/graphql/resolvers.d.ts +10 -2
- package/dist/src/graphql/resolvers.js +8 -2
- package/dist/src/graphql/resolvers.js.map +1 -1
- package/dist/src/graphql/routes.d.ts +6 -2
- package/dist/src/graphql/routes.js +6 -3
- package/dist/src/graphql/routes.js.map +1 -1
- package/dist/src/graphql/schema.d.ts +6 -0
- package/dist/src/{graphql.js → graphql/schema.js} +14 -11
- package/dist/src/graphql/schema.js.map +1 -0
- package/dist/src/graphql/write.d.ts +3 -0
- package/dist/src/graphql/write.js +3 -0
- package/dist/src/graphql/write.js.map +1 -1
- package/dist/src/openapi/auth.d.ts +13 -0
- package/dist/src/openapi/auth.js +72 -0
- package/dist/src/openapi/auth.js.map +1 -0
- package/dist/src/openapi/document.d.ts +7 -3
- package/dist/src/openapi/document.js +49 -34
- package/dist/src/openapi/document.js.map +1 -1
- package/dist/src/openapi/entry.d.ts +2 -2
- package/dist/src/openapi/entry.js.map +1 -1
- package/dist/src/openapi/files.d.ts +6 -0
- package/dist/src/{files/openapi.js → openapi/files.js} +6 -3
- package/dist/src/openapi/files.js.map +1 -0
- package/dist/src/openapi/helpers.d.ts +10 -1
- package/dist/src/openapi/helpers.js +9 -0
- package/dist/src/openapi/helpers.js.map +1 -1
- package/dist/src/openapi/index.d.ts +7 -1
- package/dist/src/openapi/index.js +14 -5
- package/dist/src/openapi/index.js.map +1 -1
- package/dist/src/openapi/lazy.d.ts +11 -0
- package/dist/src/openapi/lazy.js +13 -0
- package/dist/src/openapi/lazy.js.map +1 -0
- package/dist/src/openapi/public.d.ts +11 -2
- package/dist/src/openapi/public.js +12 -4
- package/dist/src/openapi/public.js.map +1 -1
- package/dist/src/{types.d.ts → openapi/types.d.ts} +2 -10
- package/dist/src/openapi/types.js +2 -0
- package/dist/src/openapi/types.js.map +1 -0
- package/dist/src/rest/options.d.ts +11 -2
- package/dist/src/rest/options.js +12 -3
- package/dist/src/rest/options.js.map +1 -1
- package/dist/src/rest/projection.d.ts +10 -4
- package/dist/src/rest/projection.js +10 -4
- package/dist/src/rest/projection.js.map +1 -1
- package/dist/src/rest/routes.d.ts +6 -2
- package/dist/src/rest/routes.js +7 -3
- package/dist/src/rest/routes.js.map +1 -1
- package/dist/src/server/config.d.ts +79 -0
- package/dist/src/{config.js → server/config.js} +73 -12
- package/dist/src/server/config.js.map +1 -0
- package/dist/src/server/create.d.ts +18 -0
- package/dist/src/{server.js → server/create.js} +39 -21
- package/dist/src/server/create.js.map +1 -0
- package/dist/src/server/features.d.ts +15 -0
- package/dist/src/server/features.js +31 -0
- package/dist/src/server/features.js.map +1 -0
- package/dist/src/server/public.d.ts +3 -3
- package/dist/src/server/public.js +1 -1
- package/dist/src/server/public.js.map +1 -1
- package/package.json +5 -1
- package/dist/src/cli.d.ts +0 -4
- package/dist/src/cli.js.map +0 -1
- package/dist/src/config.d.ts +0 -81
- package/dist/src/config.js.map +0 -1
- package/dist/src/constants.js.map +0 -1
- package/dist/src/database.d.ts +0 -20
- package/dist/src/database.js.map +0 -1
- package/dist/src/engine.d.ts +0 -36
- package/dist/src/engine.js.map +0 -1
- package/dist/src/errors.d.ts +0 -6
- package/dist/src/errors.js +0 -9
- package/dist/src/errors.js.map +0 -1
- package/dist/src/features.d.ts +0 -8
- package/dist/src/features.js +0 -18
- package/dist/src/features.js.map +0 -1
- package/dist/src/files/openapi.d.ts +0 -3
- package/dist/src/files/openapi.js.map +0 -1
- package/dist/src/graphql.d.ts +0 -3
- package/dist/src/graphql.js.map +0 -1
- package/dist/src/http/errors.d.ts +0 -6
- package/dist/src/http/errors.js +0 -3
- package/dist/src/http/errors.js.map +0 -1
- package/dist/src/model.d.ts +0 -72
- package/dist/src/model.js.map +0 -1
- package/dist/src/mutations/write.js.map +0 -1
- package/dist/src/pagination.d.ts +0 -7
- package/dist/src/pagination.js.map +0 -1
- package/dist/src/paths.d.ts +0 -6
- package/dist/src/paths.js.map +0 -1
- package/dist/src/query/contract.d.ts +0 -3
- package/dist/src/query/contract.js.map +0 -1
- package/dist/src/query/filter.d.ts +0 -3
- package/dist/src/query/filter.js.map +0 -1
- package/dist/src/query/options.d.ts +0 -18
- package/dist/src/query/options.js.map +0 -1
- package/dist/src/records.d.ts +0 -25
- package/dist/src/records.js.map +0 -1
- package/dist/src/relation-metadata.d.ts +0 -9
- package/dist/src/relation-metadata.js.map +0 -1
- package/dist/src/schema.d.ts +0 -8
- package/dist/src/schema.js +0 -13
- package/dist/src/schema.js.map +0 -1
- package/dist/src/server.d.ts +0 -12
- package/dist/src/server.js.map +0 -1
- package/dist/src/utils.d.ts +0 -12
- package/dist/src/utils.js +0 -58
- package/dist/src/utils.js.map +0 -1
- /package/dist/src/{types.js → core/types.js} +0 -0
package/dist/src/rest/options.js
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { badQuery, childrenOf } from '../query/options.js';
|
|
2
|
-
import { isObject, isSafeKey } from '../utils.js';
|
|
1
|
+
import { badQuery, childrenOf } from '../core/query/options.js';
|
|
2
|
+
import { hasOnlyKeys, isObject, isSafeKey } from '../core/utils.js';
|
|
3
3
|
export const ownScope = [{ '*': true }];
|
|
4
|
+
/** Выбирает вложенный набор полей; для отсутствующего поля или true возвращает выбор собственных полей.
|
|
5
|
+
* @example scopeFor([{ '*': true }], 'name') → [{ '*': true }].
|
|
6
|
+
*/
|
|
4
7
|
export function scopeFor(scope, key) {
|
|
5
8
|
const selection = Object.hasOwn(scope[0], key) ? scope[0][key] : true;
|
|
6
9
|
return selection === true ? ownScope : selection;
|
|
7
10
|
}
|
|
11
|
+
/** Читает JSON-массив выбора полей из единственного параметра URL; проверяет длину и синтаксис JSON.
|
|
12
|
+
* @example parseRestOptions({ scope: '[{"id":true}]' }) → { scope: [{ id: true }] }.
|
|
13
|
+
*/
|
|
8
14
|
export function parseRestOptions(query) {
|
|
9
15
|
if (!isObject(query))
|
|
10
16
|
badQuery('Invalid query');
|
|
@@ -24,6 +30,9 @@ export function parseRestOptions(query) {
|
|
|
24
30
|
badQuery('Invalid JSON in scope');
|
|
25
31
|
}
|
|
26
32
|
}
|
|
33
|
+
/** Проверяет выбор полей рекурсивно; аргументы разрешены только для однородных списков.
|
|
34
|
+
* @example Для узла со строковым id: [{ id: true }] → undefined; [{ missing: true }] → ошибка.
|
|
35
|
+
*/
|
|
27
36
|
export function validateScope(node, scope, list = false, depth = 0) {
|
|
28
37
|
if (depth > 32)
|
|
29
38
|
badQuery('scope is too deep');
|
|
@@ -32,7 +41,7 @@ export function validateScope(node, scope, list = false, depth = 0) {
|
|
|
32
41
|
if (scope.length === 2) {
|
|
33
42
|
if (!list || node.mixed)
|
|
34
43
|
badQuery('scope arguments require a list with consistent object types');
|
|
35
|
-
if (!isObject(scope[1]) ||
|
|
44
|
+
if (!isObject(scope[1]) || !hasOnlyKeys(scope[1], ['where', 'order', 'pager']))
|
|
36
45
|
badQuery('Invalid scope arguments');
|
|
37
46
|
}
|
|
38
47
|
const children = childrenOf(node);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/rest/options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAoB,MAAM,
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/rest/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import type { Engine, PreparedList } from '../engine.js';
|
|
2
|
-
import type { Entity, Node } from '../model.js';
|
|
3
|
-
import { type Ref } from '../records.js';
|
|
4
|
-
import type { JsonObject } from '../types.js';
|
|
1
|
+
import type { Engine, PreparedList } from '../core/engine.js';
|
|
2
|
+
import type { Entity, Node } from '../core/model.js';
|
|
3
|
+
import { type Ref } from '../core/records.js';
|
|
4
|
+
import type { JsonObject } from '../core/types.js';
|
|
5
5
|
import { type RestOptions, type Scope } from './options.js';
|
|
6
|
+
/** Проверяет дерево выбора и заранее подготавливает фильтры, сортировку и пагинацию вложенных списков.
|
|
7
|
+
* @example Выбор без аргументов у одиночной записи → пустая Map; неверное поле → ошибка.
|
|
8
|
+
*/
|
|
6
9
|
export declare function validateRest(engine: Engine, entity: Entity, options: RestOptions, list?: boolean): Map<Scope | Node, PreparedList>;
|
|
10
|
+
/** Строит новый объект из выбранных полей, разворачивая связи и обрабатывая вложенные списки.
|
|
11
|
+
* @example Запись { id: '1', name: 'Анна' } и выбор [{ name: true }] → { name: 'Анна' }.
|
|
12
|
+
*/
|
|
7
13
|
export declare function project(engine: Engine, ref: Ref, scope?: Scope, plans?: Map<Node | Scope, PreparedList>): JsonObject;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { childrenOf } from '../query/options.js';
|
|
2
|
-
import { isRef, resolveField } from '../records.js';
|
|
1
|
+
import { childrenOf } from '../core/query/options.js';
|
|
2
|
+
import { isRef, resolveField } from '../core/records.js';
|
|
3
3
|
import { ownScope, scopeFor, validateScope } from './options.js';
|
|
4
|
+
/** Проверяет дерево выбора и заранее подготавливает фильтры, сортировку и пагинацию вложенных списков.
|
|
5
|
+
* @example Выбор без аргументов у одиночной записи → пустая Map; неверное поле → ошибка.
|
|
6
|
+
*/
|
|
4
7
|
export function validateRest(engine, entity, options, list = false) {
|
|
5
8
|
validateScope(entity.root, options.scope, list);
|
|
6
9
|
const plans = new Map();
|
|
@@ -19,6 +22,9 @@ export function validateRest(engine, entity, options, list = false) {
|
|
|
19
22
|
visit(entity.root, options.scope);
|
|
20
23
|
return plans;
|
|
21
24
|
}
|
|
25
|
+
/** Строит новый объект из выбранных полей, разворачивая связи и обрабатывая вложенные списки.
|
|
26
|
+
* @example Запись { id: '1', name: 'Анна' } и выбор [{ name: true }] → { name: 'Анна' }.
|
|
27
|
+
*/
|
|
22
28
|
export function project(engine, ref, scope = ownScope, plans = new Map()) {
|
|
23
29
|
const output = Object.create(null);
|
|
24
30
|
const children = childrenOf(ref.node);
|
|
@@ -45,10 +51,10 @@ export function project(engine, ref, scope = ownScope, plans = new Map()) {
|
|
|
45
51
|
else
|
|
46
52
|
output[key] = structuredClone(value);
|
|
47
53
|
}
|
|
48
|
-
//
|
|
54
|
+
// При выведенной модели добавляем исходные поля, которые не удалось описать.
|
|
49
55
|
if (!ref.context.model.explicit && scope[0]['*'] === true)
|
|
50
56
|
for (const [key, value] of Object.entries(ref.value))
|
|
51
|
-
if (!Object.hasOwn(output, key) && !children[key]?.relation)
|
|
57
|
+
if (!Object.hasOwn(output, key) && !children[key]?.relation && !children[key]?.writeOnly)
|
|
52
58
|
output[key] = structuredClone(value);
|
|
53
59
|
return output;
|
|
54
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/rest/projection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/rest/projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { FastifyInstance } from 'fastify';
|
|
2
|
-
import type { Engine } from '../engine.js';
|
|
3
|
-
|
|
2
|
+
import type { Engine } from '../core/engine.js';
|
|
3
|
+
import type { Authenticate } from '../core/lifecycle/options.js';
|
|
4
|
+
/** Регистрирует чтение коллекций и операции создания, замены, изменения и удаления записей.
|
|
5
|
+
* @example После регистрации GET / → { resources: [...] }; функция возвращает undefined.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerRestRoutes(server: FastifyInstance, engine: Engine, authenticate?: Authenticate): void;
|
package/dist/src/rest/routes.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { domainError } from '../errors.js';
|
|
1
|
+
import { domainError } from '../core/errors.js';
|
|
2
2
|
import { parseRestOptions } from './options.js';
|
|
3
3
|
import { project, validateRest } from './projection.js';
|
|
4
|
-
|
|
4
|
+
/** Регистрирует чтение коллекций и операции создания, замены, изменения и удаления записей.
|
|
5
|
+
* @example После регистрации GET / → { resources: [...] }; функция возвращает undefined.
|
|
6
|
+
*/
|
|
7
|
+
export function registerRestRoutes(server, engine, authenticate) {
|
|
5
8
|
server.get('/', async () => ({ resources: engine.model.entities.map((entity) => entity.collection) }));
|
|
6
9
|
for (const initial of engine.model.entities) {
|
|
7
10
|
const path = `/${initial.collection}`;
|
|
@@ -34,11 +37,12 @@ export function registerRestRoutes(server, engine) {
|
|
|
34
37
|
method,
|
|
35
38
|
url: mode === 'create' ? path : itemPath,
|
|
36
39
|
handler: async (request, reply) => {
|
|
40
|
+
const actor = authenticate?.(request.headers.authorization);
|
|
37
41
|
const options = parseRestOptions(request.query);
|
|
38
42
|
const result = await engine.mutate(initial, mode, request.params[initial.primary], request.body, (ref) => {
|
|
39
43
|
const plans = validateRest(engine, ref.entity, options);
|
|
40
44
|
return project(engine, ref, options.scope, plans);
|
|
41
|
-
});
|
|
45
|
+
}, actor);
|
|
42
46
|
return reply.code(mode === 'create' ? 201 : 200).send(result);
|
|
43
47
|
},
|
|
44
48
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/rest/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/rest/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { AuthConfig } from '../auth/contract.js';
|
|
2
|
+
import type { DatabaseConfig } from '../core/database.js';
|
|
3
|
+
import type { FilesConfig } from '../files/contract.js';
|
|
4
|
+
export type { AuthConfig } from '../auth/contract.js';
|
|
5
|
+
import type { FastifyServerOptions } from 'fastify';
|
|
6
|
+
import type { ModelSchema } from '../core/model.js';
|
|
7
|
+
export type DatabaseSchema = ModelSchema;
|
|
8
|
+
export type { DatabaseConfig } from '../core/database.js';
|
|
9
|
+
export type { FilesConfig, MemoryFile } from '../files/contract.js';
|
|
10
|
+
export interface OpenapiConfig {
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
endpoint?: string;
|
|
13
|
+
path?: string;
|
|
14
|
+
info?: {
|
|
15
|
+
title: string;
|
|
16
|
+
version: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface GraphqlConfig {
|
|
21
|
+
path?: string;
|
|
22
|
+
enabled?: boolean;
|
|
23
|
+
endpoint?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ServerConfig {
|
|
26
|
+
cors?: boolean;
|
|
27
|
+
host?: string;
|
|
28
|
+
logger?: FastifyServerOptions['logger'];
|
|
29
|
+
maxFileSize?: number;
|
|
30
|
+
maxPageSize?: number;
|
|
31
|
+
pageSize?: number;
|
|
32
|
+
port?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface DeepJsonServerConfig {
|
|
35
|
+
database: DatabaseConfig;
|
|
36
|
+
files?: FilesConfig;
|
|
37
|
+
auth?: AuthConfig;
|
|
38
|
+
openapi?: OpenapiConfig;
|
|
39
|
+
graphql?: GraphqlConfig;
|
|
40
|
+
server?: ServerConfig;
|
|
41
|
+
}
|
|
42
|
+
export interface NormalizedServerConfig {
|
|
43
|
+
database: DatabaseConfig;
|
|
44
|
+
files?: FilesConfig;
|
|
45
|
+
auth?: AuthConfig;
|
|
46
|
+
openapi: OpenapiConfig;
|
|
47
|
+
graphql: GraphqlConfig;
|
|
48
|
+
server: ServerConfig;
|
|
49
|
+
}
|
|
50
|
+
/** Проверяет настройки и разрешает относительные пути, не читая содержимое файлов.
|
|
51
|
+
* @example При directoryPath = '/tmp' путь './db.json' → '/tmp/db.json'.
|
|
52
|
+
*/
|
|
53
|
+
export declare const normalizeServerConfig: (config: DeepJsonServerConfig, directoryPath?: string) => NormalizedServerConfig;
|
|
54
|
+
/** Загружает default-экспорт ES-модуля, обходя кеш повторного импорта; выполняет код модуля.
|
|
55
|
+
* @example Файл /tmp/config.mjs с export default {} → { config: {}, directory: '/tmp', path: '/tmp/config.mjs' }.
|
|
56
|
+
*/
|
|
57
|
+
export declare function readConfigModule(configPath: string): Promise<{
|
|
58
|
+
config: Record<string, unknown>;
|
|
59
|
+
directory: string;
|
|
60
|
+
path: string;
|
|
61
|
+
}>;
|
|
62
|
+
/** Возвращает сохранённый путь исходного файла для данного объекта настроек.
|
|
63
|
+
* @example Для объекта без зарегистрированного источника → undefined.
|
|
64
|
+
*/
|
|
65
|
+
export declare const configSourcePath: (config: NormalizedServerConfig) => string | undefined;
|
|
66
|
+
/** Нормализует настройки и запоминает путь их источника во внутренней таблице.
|
|
67
|
+
* @example configure(config, '/tmp', '/tmp/config.mjs') → настройки; configSourcePath(result) → '/tmp/config.mjs'.
|
|
68
|
+
*/
|
|
69
|
+
export declare function configure(config: unknown, directory: string, sourcePath?: string): NormalizedServerConfig;
|
|
70
|
+
/** Выбирает настройки для указанных форматов экспорта и подставляет пустые данные вместо чтения базы.
|
|
71
|
+
* @example formats = ['graphql'] → настройки генерации GraphQL с database.data = {}.
|
|
72
|
+
*/
|
|
73
|
+
export declare function configureGeneration(source: Record<string, unknown>, formats: string[], directory: string, sourcePath: string, overrides: {
|
|
74
|
+
host?: string;
|
|
75
|
+
port?: number;
|
|
76
|
+
files?: boolean;
|
|
77
|
+
timestamps?: boolean;
|
|
78
|
+
softDelete?: boolean;
|
|
79
|
+
}): NormalizedServerConfig;
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
import { recordOptions } from '../core/lifecycle/options.js';
|
|
2
|
+
import { errorMessage, isPortNumber } from '../core/utils.js';
|
|
1
3
|
import { dirname, resolve } from 'node:path';
|
|
2
4
|
import { pathToFileURL } from 'node:url';
|
|
3
|
-
import { normalizePagination } from '
|
|
4
|
-
import { assertKnownKeys, isObject } from '
|
|
5
|
-
const CONFIG_KEYS = new Set(['database', 'files', 'openapi', 'graphql', 'server']);
|
|
6
|
-
const DATABASE_KEYS = new Set(['data', 'path', 'schema']);
|
|
5
|
+
import { normalizePagination } from '../core/pagination.js';
|
|
6
|
+
import { assertKnownKeys, isObject } from '../core/utils.js';
|
|
7
|
+
const CONFIG_KEYS = new Set(['database', 'files', 'openapi', 'graphql', 'server', 'auth']);
|
|
8
|
+
const DATABASE_KEYS = new Set(['data', 'path', 'schema', 'timestamps', 'softDelete']);
|
|
7
9
|
const FILES_KEYS = new Set(['data', 'directory', 'metadata']);
|
|
8
10
|
const OPENAPI_KEYS = new Set(['path', 'info', 'enabled', 'endpoint']);
|
|
9
11
|
const GRAPHQL_KEYS = new Set(['path', 'enabled', 'endpoint']);
|
|
10
12
|
const SERVER_KEYS = new Set(['cors', 'host', 'logger', 'maxFileSize', 'maxPageSize', 'pageSize', 'port']);
|
|
11
13
|
let configImportIndex = 0;
|
|
14
|
+
/** Глубоко копирует структурированные данные и оборачивает ошибку неподдерживаемого значения.
|
|
15
|
+
* @example copyInput({ a: [1] }) → независимая копия { a: [1] }; функция в значении → ошибка.
|
|
16
|
+
*/
|
|
12
17
|
const copyInput = (value) => {
|
|
13
18
|
try {
|
|
14
19
|
return structuredClone(value);
|
|
@@ -35,7 +40,13 @@ function getString(value, path, required = false) {
|
|
|
35
40
|
}
|
|
36
41
|
return value;
|
|
37
42
|
}
|
|
43
|
+
/** Делает заданный путь абсолютным относительно указанного каталога.
|
|
44
|
+
* @example resolveConfigPath('a.json', '/tmp') → '/tmp/a.json'; undefined → undefined.
|
|
45
|
+
*/
|
|
38
46
|
const resolveConfigPath = (value, directoryPath) => (value == null ? undefined : resolve(directoryPath, value));
|
|
47
|
+
/** Принимает положительное целое число или отсутствие значения.
|
|
48
|
+
* @example getPositiveInteger(2, 'size') → 2; getPositiveInteger(0, 'size') → ошибка.
|
|
49
|
+
*/
|
|
39
50
|
const getPositiveInteger = (value, path) => {
|
|
40
51
|
if (value == null) {
|
|
41
52
|
return undefined;
|
|
@@ -45,6 +56,9 @@ const getPositiveInteger = (value, path) => {
|
|
|
45
56
|
}
|
|
46
57
|
return value;
|
|
47
58
|
};
|
|
59
|
+
/** Принимает объект описания или разрешает путь к нему относительно каталога.
|
|
60
|
+
* @example normalizeSchema('schema.json', '/tmp') → '/tmp/schema.json'.
|
|
61
|
+
*/
|
|
48
62
|
const normalizeSchema = (schema, directoryPath) => {
|
|
49
63
|
if (schema == null) {
|
|
50
64
|
return undefined;
|
|
@@ -54,6 +68,9 @@ const normalizeSchema = (schema, directoryPath) => {
|
|
|
54
68
|
}
|
|
55
69
|
return getObject(schema, 'config.database.schema', true);
|
|
56
70
|
};
|
|
71
|
+
/** Проверяет выбор между файлом и данными в памяти, разрешает пути и копирует данные.
|
|
72
|
+
* @example { path: 'db.json' } с каталогом /tmp → path: '/tmp/db.json'; одновременно data и path → ошибка.
|
|
73
|
+
*/
|
|
57
74
|
const normalizeDatabase = (value, directoryPath) => {
|
|
58
75
|
const database = getObject(value, 'config.database', true);
|
|
59
76
|
assertKnownKeys(database, DATABASE_KEYS, 'config.database');
|
|
@@ -63,11 +80,19 @@ const normalizeDatabase = (value, directoryPath) => {
|
|
|
63
80
|
throw new Error('Укажите ровно один из ключей config.database.path и config.database.data');
|
|
64
81
|
}
|
|
65
82
|
const schema = normalizeSchema(database.schema, directoryPath);
|
|
83
|
+
recordOptions({ timestamps: database.timestamps, softDelete: database.softDelete });
|
|
84
|
+
const flags = {
|
|
85
|
+
...(database.timestamps !== undefined ? { timestamps: database.timestamps } : {}),
|
|
86
|
+
...(database.softDelete !== undefined ? { softDelete: database.softDelete } : {}),
|
|
87
|
+
};
|
|
66
88
|
if (hasData) {
|
|
67
|
-
return { data: copyInput(getObject(database.data, 'config.database.data', true)), schema };
|
|
89
|
+
return { data: copyInput(getObject(database.data, 'config.database.data', true)), schema, ...flags };
|
|
68
90
|
}
|
|
69
|
-
return { path: resolve(directoryPath, getString(database.path, 'config.database.path', true)), schema };
|
|
91
|
+
return { path: resolve(directoryPath, getString(database.path, 'config.database.path', true)), schema, ...flags };
|
|
70
92
|
};
|
|
93
|
+
/** Проверяет выбор между файлами в памяти и дисковым хранилищем, разрешает пути.
|
|
94
|
+
* @example normalizeFiles(undefined, '/tmp') → undefined; { data: [] } → { data: [] }.
|
|
95
|
+
*/
|
|
71
96
|
const normalizeFiles = (value, directoryPath) => {
|
|
72
97
|
const files = getObject(value, 'config.files');
|
|
73
98
|
if (files == null) {
|
|
@@ -90,6 +115,27 @@ const normalizeFiles = (value, directoryPath) => {
|
|
|
90
115
|
metadata: resolve(directoryPath, getString(files.metadata, 'config.files.metadata', true)),
|
|
91
116
|
};
|
|
92
117
|
};
|
|
118
|
+
/** Проверяет источник учётных записей и срок сессии; массив копирует, путь делает абсолютным.
|
|
119
|
+
* @example { users: 'users.json' } с каталогом /tmp → users: '/tmp/users.json'.
|
|
120
|
+
*/
|
|
121
|
+
const normalizeAuth = (value, directory) => {
|
|
122
|
+
const auth = getObject(value, 'config.auth');
|
|
123
|
+
if (!auth)
|
|
124
|
+
return undefined;
|
|
125
|
+
assertKnownKeys(auth, new Set(['users', 'expiresIn']), 'config.auth');
|
|
126
|
+
if (typeof auth.users !== 'string' && !Array.isArray(auth.users))
|
|
127
|
+
throw new Error('config.auth.users must be a file path or user array');
|
|
128
|
+
const expiresIn = getPositiveInteger(auth.expiresIn, 'config.auth.expiresIn');
|
|
129
|
+
if (expiresIn !== undefined && expiresIn > 2147483647)
|
|
130
|
+
throw new Error('config.auth.expiresIn must be at most 2147483647 seconds');
|
|
131
|
+
return {
|
|
132
|
+
users: typeof auth.users === 'string' ? resolve(directory, getString(auth.users, 'config.auth.users', true)) : copyInput(auth.users),
|
|
133
|
+
expiresIn,
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
/** Проверяет секции настроек и возвращает нормализованный объект с абсолютными путями.
|
|
137
|
+
* @example { database: { path: 'db.json' } } с каталогом /tmp → database.path: '/tmp/db.json'.
|
|
138
|
+
*/
|
|
93
139
|
const normalizeConfig = (config, directoryPath = '.') => {
|
|
94
140
|
if (!isObject(config)) {
|
|
95
141
|
throw new Error('Конфигурация сервера должна содержать JSON-объект');
|
|
@@ -125,7 +171,7 @@ const normalizeConfig = (config, directoryPath = '.') => {
|
|
|
125
171
|
const pageSize = getPositiveInteger(server.pageSize, 'config.server.pageSize');
|
|
126
172
|
normalizePagination({ pageSize, maxPageSize });
|
|
127
173
|
const port = server.port;
|
|
128
|
-
if (port != null &&
|
|
174
|
+
if (port != null && !isPortNumber(port)) {
|
|
129
175
|
throw new Error('Ключ config.server.port должен быть целым числом от 0 до 65535');
|
|
130
176
|
}
|
|
131
177
|
if (logger != null && typeof logger !== 'boolean' && !isObject(logger)) {
|
|
@@ -137,6 +183,7 @@ const normalizeConfig = (config, directoryPath = '.') => {
|
|
|
137
183
|
return {
|
|
138
184
|
database,
|
|
139
185
|
files,
|
|
186
|
+
auth: normalizeAuth(config.auth, directoryPath),
|
|
140
187
|
openapi: {
|
|
141
188
|
enabled: openapi.enabled,
|
|
142
189
|
endpoint: openapiEndpoint,
|
|
@@ -155,20 +202,24 @@ const normalizeConfig = (config, directoryPath = '.') => {
|
|
|
155
202
|
},
|
|
156
203
|
};
|
|
157
204
|
};
|
|
158
|
-
/**
|
|
205
|
+
/** Проверяет настройки и разрешает относительные пути, не читая содержимое файлов.
|
|
206
|
+
* @example При directoryPath = '/tmp' путь './db.json' → '/tmp/db.json'.
|
|
207
|
+
*/
|
|
159
208
|
export const normalizeServerConfig = (config, directoryPath) => normalizeConfig(config, directoryPath);
|
|
160
|
-
/**
|
|
209
|
+
/** Загружает default-экспорт ES-модуля, обходя кеш повторного импорта; выполняет код модуля.
|
|
210
|
+
* @example Файл /tmp/config.mjs с export default {} → { config: {}, directory: '/tmp', path: '/tmp/config.mjs' }.
|
|
211
|
+
*/
|
|
161
212
|
export async function readConfigModule(configPath) {
|
|
162
213
|
const resolvedConfigPath = resolve(getString(configPath, 'config', true));
|
|
163
214
|
let config;
|
|
164
215
|
try {
|
|
165
216
|
const configUrl = pathToFileURL(resolvedConfigPath);
|
|
166
|
-
//
|
|
217
|
+
// Обходим кеш модуля, чтобы повторное чтение выполняло обновлённый файл.
|
|
167
218
|
configUrl.searchParams.set('deep-json-server-import', String(configImportIndex++));
|
|
168
219
|
config = (await import(configUrl.href)).default;
|
|
169
220
|
}
|
|
170
221
|
catch (error) {
|
|
171
|
-
const message =
|
|
222
|
+
const message = errorMessage(error);
|
|
172
223
|
throw new Error(`Не удалось загрузить конфигурацию ${resolvedConfigPath}: ${message}`, { cause: error });
|
|
173
224
|
}
|
|
174
225
|
if (!isObject(config)) {
|
|
@@ -177,13 +228,22 @@ export async function readConfigModule(configPath) {
|
|
|
177
228
|
return { config, directory: dirname(resolvedConfigPath), path: resolvedConfigPath };
|
|
178
229
|
}
|
|
179
230
|
const sourcePaths = new WeakMap();
|
|
231
|
+
/** Возвращает сохранённый путь исходного файла для данного объекта настроек.
|
|
232
|
+
* @example Для объекта без зарегистрированного источника → undefined.
|
|
233
|
+
*/
|
|
180
234
|
export const configSourcePath = (config) => sourcePaths.get(config);
|
|
235
|
+
/** Нормализует настройки и запоминает путь их источника во внутренней таблице.
|
|
236
|
+
* @example configure(config, '/tmp', '/tmp/config.mjs') → настройки; configSourcePath(result) → '/tmp/config.mjs'.
|
|
237
|
+
*/
|
|
181
238
|
export function configure(config, directory, sourcePath) {
|
|
182
239
|
const normalized = normalizeConfig(config, directory);
|
|
183
240
|
if (sourcePath)
|
|
184
241
|
sourcePaths.set(normalized, sourcePath);
|
|
185
242
|
return normalized;
|
|
186
243
|
}
|
|
244
|
+
/** Выбирает настройки для указанных форматов экспорта и подставляет пустые данные вместо чтения базы.
|
|
245
|
+
* @example formats = ['graphql'] → настройки генерации GraphQL с database.data = {}.
|
|
246
|
+
*/
|
|
187
247
|
export function configureGeneration(source, formats, directory, sourcePath, overrides) {
|
|
188
248
|
assertKnownKeys(source, CONFIG_KEYS, 'config');
|
|
189
249
|
const database = getObject(source.database, 'config.database', true);
|
|
@@ -192,7 +252,8 @@ export function configureGeneration(source, formats, directory, sourcePath, over
|
|
|
192
252
|
const openapi = formats.includes('openapi');
|
|
193
253
|
const server = openapi ? (getObject(source.server, 'config.server') ?? {}) : {};
|
|
194
254
|
return configure({
|
|
195
|
-
database: { data: {}, schema: database.schema },
|
|
255
|
+
database: { data: {}, schema: database.schema, timestamps: overrides.timestamps ?? database.timestamps, softDelete: overrides.softDelete ?? database.softDelete },
|
|
256
|
+
auth: source.auth != null ? { users: [] } : undefined,
|
|
196
257
|
openapi: openapi ? source.openapi : undefined,
|
|
197
258
|
graphql: formats.includes('graphql') ? source.graphql : undefined,
|
|
198
259
|
files: openapi && (overrides.files || source.files != null) ? { data: [] } : undefined,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/server/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FastifyInstance } from 'fastify';
|
|
2
|
+
import type { OpenapiDocument } from '../openapi/types.js';
|
|
3
|
+
import { type DeepJsonServerConfig, type NormalizedServerConfig } from './config.js';
|
|
4
|
+
import { type ServerFeatures } from './features.js';
|
|
5
|
+
export interface ServerFacade {
|
|
6
|
+
fastify(): FastifyInstance;
|
|
7
|
+
openapi(): Promise<OpenapiDocument>;
|
|
8
|
+
graphql(): Promise<string>;
|
|
9
|
+
}
|
|
10
|
+
export type { ServerFeatures } from './features.js';
|
|
11
|
+
/** Проверяет настройки и создаёт интерфейс запуска и генерации схем; сетевой порт ещё не открывает.
|
|
12
|
+
* @example await createServer({ database: { data: { notes: [] } } }) → объект с fastify(), openapi(), graphql().
|
|
13
|
+
*/
|
|
14
|
+
export declare function createServer(config: DeepJsonServerConfig, features?: ServerFeatures): Promise<ServerFacade>;
|
|
15
|
+
/** Собирает сервер из нормализованных настроек; хранилища открываются при инициализации HTTP-экземпляра.
|
|
16
|
+
* @example Нормализованные настройки → Promise<ServerFacade>; listen() затем открывает сетевой порт.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createConfiguredServer(normalized: NormalizedServerConfig, features?: ServerFeatures): Promise<ServerFacade>;
|
|
@@ -1,33 +1,44 @@
|
|
|
1
|
+
import { AUTH_PATHS } from '../auth/contract.js';
|
|
2
|
+
import { DEFAULT_HOST, DEFAULT_MAX_FILE_SIZE, DEFAULT_PORT } from '../core/constants.js';
|
|
3
|
+
import { DomainError } from '../core/errors.js';
|
|
4
|
+
import { domainStatus } from '../core/http-errors.js';
|
|
5
|
+
import { normalizePagination } from '../core/pagination.js';
|
|
6
|
+
import { inputPaths } from '../core/paths.js';
|
|
7
|
+
import { errorMessage, isObject } from '../core/utils.js';
|
|
1
8
|
import { configSourcePath, normalizeServerConfig } from './config.js';
|
|
2
|
-
import { DEFAULT_HOST, DEFAULT_MAX_FILE_SIZE, DEFAULT_PORT } from './constants.js';
|
|
3
|
-
import { DomainError } from './errors.js';
|
|
4
9
|
import { resolveFeatures, validateEndpoints } from './features.js';
|
|
5
|
-
import { domainStatus } from './http/errors.js';
|
|
6
|
-
import { normalizePagination } from './pagination.js';
|
|
7
|
-
import { inputPaths } from './paths.js';
|
|
8
|
-
import { isObject } from './utils.js';
|
|
9
10
|
const CORS_HEADERS = {
|
|
10
11
|
'Access-Control-Allow-Headers': 'Content-Type',
|
|
11
12
|
'Access-Control-Allow-Methods': 'DELETE, GET, OPTIONS, PATCH, POST, PUT',
|
|
12
13
|
'Access-Control-Allow-Origin': '*',
|
|
13
14
|
};
|
|
15
|
+
/** Проверяет настройки и создаёт интерфейс запуска и генерации схем; сетевой порт ещё не открывает.
|
|
16
|
+
* @example await createServer({ database: { data: { notes: [] } } }) → объект с fastify(), openapi(), graphql().
|
|
17
|
+
*/
|
|
14
18
|
export async function createServer(config, features = {}) {
|
|
15
19
|
return createConfiguredServer(normalizeServerConfig(config), features);
|
|
16
20
|
}
|
|
21
|
+
/** Собирает сервер из нормализованных настроек; хранилища открываются при инициализации HTTP-экземпляра.
|
|
22
|
+
* @example Нормализованные настройки → Promise<ServerFacade>; listen() затем открывает сетевой порт.
|
|
23
|
+
*/
|
|
17
24
|
export async function createConfiguredServer(normalized, features = {}) {
|
|
18
25
|
const enabled = resolveFeatures(normalized, features);
|
|
19
|
-
const { loadModel, inferModel } = await import('
|
|
20
|
-
const
|
|
26
|
+
const { loadModel, inferModel } = await import('../core/model.js');
|
|
27
|
+
const recordSettings = { timestamps: normalized.database.timestamps, softDelete: normalized.database.softDelete, auth: enabled.auth };
|
|
28
|
+
const explicitModel = await loadModel(normalized.database.schema, recordSettings);
|
|
21
29
|
const { default: Fastify } = await import('fastify');
|
|
22
30
|
const corsHeaders = { ...CORS_HEADERS };
|
|
23
31
|
if (enabled.files) {
|
|
24
|
-
const { FILE_HEADERS } = await import('
|
|
32
|
+
const { FILE_HEADERS } = await import('../files/http.js');
|
|
25
33
|
corsHeaders['Access-Control-Allow-Headers'] = [...Object.values(FILE_HEADERS).map(({ name }) => name), 'Content-Type'].join(', ');
|
|
26
34
|
}
|
|
35
|
+
if (enabled.auth)
|
|
36
|
+
corsHeaders['Access-Control-Allow-Headers'] += ', Authorization';
|
|
27
37
|
const { cors = true, logger = true, maxFileSize = DEFAULT_MAX_FILE_SIZE } = normalized.server;
|
|
28
38
|
const { pageSize, maxPageSize } = normalizePagination(normalized.server);
|
|
29
|
-
const openapi = async () => (await import('
|
|
39
|
+
const openapi = async () => (await import('../openapi/public.js')).openapiFromModel(explicitModel, {
|
|
30
40
|
files: enabled.files,
|
|
41
|
+
...recordSettings,
|
|
31
42
|
pageSize,
|
|
32
43
|
maxPageSize,
|
|
33
44
|
info: normalized.openapi.info,
|
|
@@ -58,7 +69,7 @@ export async function createConfiguredServer(normalized, features = {}) {
|
|
|
58
69
|
const status = typeof candidate === 'number' && Number.isInteger(candidate) && candidate >= 400 && candidate <= 599 ? candidate : 500;
|
|
59
70
|
if (status === 500)
|
|
60
71
|
request.log.error(error);
|
|
61
|
-
return reply.code(status).send({ error: status === 500 ? 'Внутренняя ошибка сервера' :
|
|
72
|
+
return reply.code(status).send({ error: status === 500 ? 'Внутренняя ошибка сервера' : errorMessage(error) });
|
|
62
73
|
});
|
|
63
74
|
if (cors) {
|
|
64
75
|
server.addHook('onRequest', async (_request, reply) => {
|
|
@@ -69,19 +80,26 @@ export async function createConfiguredServer(normalized, features = {}) {
|
|
|
69
80
|
server.options('/*', async (_request, reply) => reply.code(204).send());
|
|
70
81
|
}
|
|
71
82
|
server.register(async (app) => {
|
|
72
|
-
const [{ createDatabaseStore }, { Engine }, { registerRestRoutes }] = await Promise.all([import('
|
|
83
|
+
const [{ createDatabaseStore }, { Engine }, { registerRestRoutes }] = await Promise.all([import('../core/database.js'), import('../core/engine.js'), import('../rest/routes.js')]);
|
|
73
84
|
const keys = explicitModel ? new Map(explicitModel.entities.map((e) => [e.collection, e.primary])) : undefined;
|
|
74
85
|
const store = await createDatabaseStore(normalized.database, keys);
|
|
75
|
-
const model = explicitModel ?? inferModel(store.database.data);
|
|
86
|
+
const model = explicitModel ?? inferModel(store.database.data, recordSettings);
|
|
76
87
|
const engine = new Engine(store, model, pageSize, maxPageSize);
|
|
77
88
|
engine.validateData(store.database.data);
|
|
78
89
|
const graphqlPath = normalized.graphql.endpoint ?? '/graphql';
|
|
79
90
|
const openapiPath = normalized.openapi.endpoint ?? '/openapi.json';
|
|
80
|
-
validateEndpoints(model.entities.map((entity) => entity.collection), [...(enabled.graphql ? [graphqlPath] : []), ...(enabled.openapi ? [openapiPath] : [])]);
|
|
81
|
-
|
|
91
|
+
validateEndpoints(model.entities.map((entity) => entity.collection), [...(enabled.graphql ? [graphqlPath] : []), ...(enabled.openapi ? [openapiPath] : []), ...(enabled.auth ? Object.values(AUTH_PATHS) : [])]);
|
|
92
|
+
const auth = enabled.auth && normalized.auth ? await (await import('../auth/service.js')).createAuthService(normalized.auth) : undefined;
|
|
93
|
+
if (auth) {
|
|
94
|
+
app.addHook('onClose', async () => auth.close());
|
|
95
|
+
const { registerAuthRoutes } = await import('../auth/routes.js');
|
|
96
|
+
registerAuthRoutes(app, auth);
|
|
97
|
+
}
|
|
98
|
+
const authenticate = auth ? (header) => auth.me(header) : undefined;
|
|
99
|
+
registerRestRoutes(app, engine, authenticate);
|
|
82
100
|
if (enabled.graphql) {
|
|
83
|
-
const [{ registerGraphqlRoutes }, { buildGraphql }] = await Promise.all([import('
|
|
84
|
-
registerGraphqlRoutes(app, buildGraphql(model), engine, graphqlPath);
|
|
101
|
+
const [{ registerGraphqlRoutes }, { buildGraphql }] = await Promise.all([import('../graphql/routes.js'), import('../graphql/schema.js')]);
|
|
102
|
+
registerGraphqlRoutes(app, buildGraphql(model), engine, graphqlPath, authenticate);
|
|
85
103
|
}
|
|
86
104
|
if (enabled.openapi) {
|
|
87
105
|
const document = await openapi();
|
|
@@ -90,8 +108,8 @@ export async function createConfiguredServer(normalized, features = {}) {
|
|
|
90
108
|
}
|
|
91
109
|
const files = normalized.files;
|
|
92
110
|
if (enabled.files && files) {
|
|
93
|
-
const { createFileStore, registerFileRoutes } = await import('
|
|
94
|
-
const protectedPaths = inputPaths({ database: normalized.database }, '.', configSourcePath(normalized));
|
|
111
|
+
const { createFileStore, registerFileRoutes } = await import('../files/index.js');
|
|
112
|
+
const protectedPaths = inputPaths({ database: normalized.database, auth: normalized.auth }, '.', configSourcePath(normalized));
|
|
95
113
|
registerFileRoutes(app, { getStore: () => createFileStore(files, protectedPaths), maxFileSize });
|
|
96
114
|
}
|
|
97
115
|
});
|
|
@@ -102,8 +120,8 @@ export async function createConfiguredServer(normalized, features = {}) {
|
|
|
102
120
|
fastify: getFastify,
|
|
103
121
|
openapi,
|
|
104
122
|
graphql: async () => {
|
|
105
|
-
return (await import('
|
|
123
|
+
return (await import('../graphql/public.js')).graphqlFromModel(explicitModel);
|
|
106
124
|
},
|
|
107
125
|
};
|
|
108
126
|
}
|
|
109
|
-
//# sourceMappingURL=
|
|
127
|
+
//# sourceMappingURL=create.js.map
|