@kollors/deep-json-server 1.0.0-alpha.6 → 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 +344 -230
- package/README.ru.md +341 -227
- package/dist/bin/deep-json-server.js +1 -1
- package/dist/bin/deep-json-server.js.map +1 -1
- package/dist/index.d.ts +10 -8
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/src/auth/contract.d.ts +3 -2
- package/dist/src/auth/contract.js.map +1 -1
- package/dist/src/auth/password.d.ts +9 -0
- package/dist/src/auth/password.js +12 -0
- package/dist/src/auth/password.js.map +1 -1
- package/dist/src/auth/routes.d.ts +3 -0
- package/dist/src/auth/routes.js +3 -0
- package/dist/src/auth/routes.js.map +1 -1
- package/dist/src/auth/service.d.ts +21 -0
- package/dist/src/auth/service.js +38 -7
- package/dist/src/auth/service.js.map +1 -1
- package/dist/src/cli/index.d.ts +7 -0
- package/dist/src/{cli.js → cli/index.js} +32 -14
- 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/{errors.d.ts → core/errors.d.ts} +4 -1
- 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} +12 -0
- 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/{auth/openapi.js → openapi/auth.js} +15 -5
- package/dist/src/openapi/auth.js.map +1 -0
- package/dist/src/openapi/document.d.ts +5 -2
- package/dist/src/openapi/document.js +29 -33
- 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 +10 -2
- package/dist/src/openapi/public.js +9 -3
- package/dist/src/openapi/public.js.map +1 -1
- package/dist/src/{types.d.ts → openapi/types.d.ts} +1 -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} +57 -19
- 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} +31 -23
- package/dist/src/server/create.js.map +1 -0
- package/dist/src/server/features.d.ts +15 -0
- package/dist/src/{features.js → server/features.js} +8 -2
- 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 +1 -1
- package/dist/src/auth/openapi.d.ts +0 -10
- package/dist/src/auth/openapi.js.map +0 -1
- package/dist/src/cli.d.ts +0 -4
- package/dist/src/cli.js.map +0 -1
- package/dist/src/config.d.ts +0 -86
- 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.js +0 -9
- package/dist/src/errors.js.map +0 -1
- package/dist/src/features.d.ts +0 -9
- 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 -7
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../src/openapi/entry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../src/openapi/entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAuB,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
type OpenapiObject = Record<string, unknown>;
|
|
2
|
+
/** Создаёт описания HTTP-маршрутов работы с файлами.
|
|
3
|
+
* @example createFilePaths() → объект, содержащий '/_files/storage' и маршруты чтения, перемещения и удаления.
|
|
4
|
+
*/
|
|
5
|
+
export declare const createFilePaths: () => Record<string, OpenapiObject>;
|
|
6
|
+
export {};
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { FILE_ROUTES } from '
|
|
2
|
-
import { json as createJsonContent, response as createResponse, ref as createSchemaReference } from '
|
|
1
|
+
import { FILE_ROUTES } from '../files/http.js';
|
|
2
|
+
import { json as createJsonContent, response as createResponse, ref as createSchemaReference } from './helpers.js';
|
|
3
3
|
const createErrorResponse = (description) => createResponse(description, createSchemaReference('Error'));
|
|
4
4
|
const createParameterReference = (name) => ({ $ref: `#/components/parameters/${name}` });
|
|
5
5
|
const createRequestBody = (name) => ({ required: true, ...createJsonContent(createSchemaReference(name)) });
|
|
6
|
+
/** Создаёт описания HTTP-маршрутов работы с файлами.
|
|
7
|
+
* @example createFilePaths() → объект, содержащий '/_files/storage' и маршруты чтения, перемещения и удаления.
|
|
8
|
+
*/
|
|
6
9
|
export const createFilePaths = () => ({
|
|
7
10
|
[`${FILE_ROUTES.download}/{path}`]: {
|
|
8
11
|
get: {
|
|
@@ -81,4 +84,4 @@ export const createFilePaths = () => ({
|
|
|
81
84
|
},
|
|
82
85
|
},
|
|
83
86
|
});
|
|
84
|
-
//# sourceMappingURL=
|
|
87
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/openapi/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import type { OpenapiSchema } from '
|
|
1
|
+
import type { OpenapiSchema } from './types.js';
|
|
2
|
+
/** Создаёт ссылку на именованную схему компонента.
|
|
3
|
+
* @example ref('User') → { $ref: '#/components/schemas/User' }.
|
|
4
|
+
*/
|
|
2
5
|
export declare const ref: (name: string) => OpenapiSchema;
|
|
6
|
+
/** Оборачивает схему в описание тела application/json.
|
|
7
|
+
* @example json({ type: 'string' }) → { content: { 'application/json': { schema: { type: 'string' } } } }.
|
|
8
|
+
*/
|
|
3
9
|
export declare const json: (schema: unknown) => {
|
|
4
10
|
content: {
|
|
5
11
|
'application/json': {
|
|
@@ -7,6 +13,9 @@ export declare const json: (schema: unknown) => {
|
|
|
7
13
|
};
|
|
8
14
|
};
|
|
9
15
|
};
|
|
16
|
+
/** Создаёт описание ответа; тело добавляется только при переданной схеме.
|
|
17
|
+
* @example response('No content') → { description: 'No content' }.
|
|
18
|
+
*/
|
|
10
19
|
export declare const response: (description: string, schema?: unknown) => {
|
|
11
20
|
content?: {
|
|
12
21
|
'application/json': {
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
+
/** Создаёт ссылку на именованную схему компонента.
|
|
2
|
+
* @example ref('User') → { $ref: '#/components/schemas/User' }.
|
|
3
|
+
*/
|
|
1
4
|
export const ref = (name) => ({ $ref: `#/components/schemas/${name}` });
|
|
5
|
+
/** Оборачивает схему в описание тела application/json.
|
|
6
|
+
* @example json({ type: 'string' }) → { content: { 'application/json': { schema: { type: 'string' } } } }.
|
|
7
|
+
*/
|
|
2
8
|
export const json = (schema) => ({ content: { 'application/json': { schema } } });
|
|
9
|
+
/** Создаёт описание ответа; тело добавляется только при переданной схеме.
|
|
10
|
+
* @example response('No content') → { description: 'No content' }.
|
|
11
|
+
*/
|
|
3
12
|
export const response = (description, schema) => ({ description, ...(schema === undefined ? {} : json(schema)) });
|
|
4
13
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/openapi/helpers.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAiB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;AAC3F,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,WAAmB,EAAE,MAAgB,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/openapi/helpers.ts"],"names":[],"mappings":"AACA;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAiB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/F;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;AAC3F;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,WAAmB,EAAE,MAAgB,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import type { OpenapiDocument } from '
|
|
1
|
+
import type { OpenapiDocument } from './types.js';
|
|
2
|
+
/** Копирует документ и задаёт адрес сервера, не меняя исходный объект.
|
|
3
|
+
* @example При host = 'localhost', port = 80 поле servers → [{ url: 'http://localhost:80' }].
|
|
4
|
+
*/
|
|
2
5
|
export declare const createOpenapi: ({ document: sourceDocument, host, port }: {
|
|
3
6
|
document: OpenapiDocument;
|
|
4
7
|
host?: string;
|
|
5
8
|
port?: number;
|
|
6
9
|
}) => OpenapiDocument;
|
|
10
|
+
/** Сохраняет документ в YAML, создавая родительские каталоги.
|
|
11
|
+
* @example writeOpenapi(document, './out/api.yaml') → Promise<void>; результат записан в файл.
|
|
12
|
+
*/
|
|
7
13
|
export declare const writeOpenapi: (document: OpenapiDocument, outputPath: string) => Promise<void>;
|
|
@@ -1,25 +1,34 @@
|
|
|
1
1
|
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
2
|
import { dirname, resolve } from 'node:path';
|
|
3
3
|
import { stringify } from 'yaml';
|
|
4
|
-
import { DEFAULT_HOST, DEFAULT_PORT } from '../constants.js';
|
|
4
|
+
import { DEFAULT_HOST, DEFAULT_PORT } from '../core/constants.js';
|
|
5
|
+
import { isPortNumber } from '../core/utils.js';
|
|
6
|
+
/** Строит HTTP-адрес, оборачивая IPv6 в квадратные скобки; нулевой порт даёт относительный адрес.
|
|
7
|
+
* @example getServerUrl('::1', 80) → 'http://[::1]:80'; getServerUrl('localhost', 0) → '/'.
|
|
8
|
+
*/
|
|
5
9
|
const getServerUrl = (host, port) => {
|
|
6
|
-
const serverPort = port;
|
|
7
10
|
if (typeof host !== 'string' || host.trim() === '') {
|
|
8
11
|
throw new Error('Адрес сервера не должен быть пустым');
|
|
9
12
|
}
|
|
10
|
-
if (!
|
|
13
|
+
if (!isPortNumber(port)) {
|
|
11
14
|
throw new Error('Порт должен быть целым числом от 0 до 65535');
|
|
12
15
|
}
|
|
13
|
-
if (
|
|
16
|
+
if (port === 0)
|
|
14
17
|
return '/';
|
|
15
18
|
const serverHost = host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;
|
|
16
|
-
return `http://${serverHost}:${
|
|
19
|
+
return `http://${serverHost}:${port}`;
|
|
17
20
|
};
|
|
21
|
+
/** Копирует документ и задаёт адрес сервера, не меняя исходный объект.
|
|
22
|
+
* @example При host = 'localhost', port = 80 поле servers → [{ url: 'http://localhost:80' }].
|
|
23
|
+
*/
|
|
18
24
|
export const createOpenapi = ({ document: sourceDocument, host = DEFAULT_HOST, port = DEFAULT_PORT }) => {
|
|
19
25
|
const document = structuredClone(sourceDocument);
|
|
20
26
|
document.servers = [{ url: getServerUrl(host, port) }];
|
|
21
27
|
return document;
|
|
22
28
|
};
|
|
29
|
+
/** Сохраняет документ в YAML, создавая родительские каталоги.
|
|
30
|
+
* @example writeOpenapi(document, './out/api.yaml') → Promise<void>; результат записан в файл.
|
|
31
|
+
*/
|
|
23
32
|
export const writeOpenapi = async (document, outputPath) => {
|
|
24
33
|
const resolvedOutputPath = resolve(outputPath);
|
|
25
34
|
await mkdir(dirname(resolvedOutputPath), { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/openapi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/openapi/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD;;GAEG;AACH,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,IAAY,EAAU,EAAE;IAC1D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpF,OAAO,UAAU,UAAU,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,GAAG,YAAY,EAAE,IAAI,GAAG,YAAY,EAA+D,EAAmB,EAAE;IACpL,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAEjD,QAAQ,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAEvD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,QAAyB,EAAE,UAAkB,EAAiB,EAAE;IACjG,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE/C,MAAM,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,SAAS,CAAC,kBAAkB,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACnH,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ModelSchema } from '../core/model.js';
|
|
2
|
+
import type { OpenapiOptions } from './public.js';
|
|
3
|
+
import type { OpenapiDocument } from './types.js';
|
|
4
|
+
/** Загружает генератор при первом обращении и передаёт ему описание и параметры.
|
|
5
|
+
* @example Описание и параметры → Promise со схемой; при импорте этой обёртки генератор ещё не загружается.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateOpenapi(schema: ModelSchema | string, options?: OpenapiOptions): Promise<OpenapiDocument>;
|
|
8
|
+
/** Загружает модуль записи по требованию и сохраняет схему в указанный файл.
|
|
9
|
+
* @example Схема и путь → Promise<void>; файл появляется после успешного завершения.
|
|
10
|
+
*/
|
|
11
|
+
export declare function writeOpenapi(document: OpenapiDocument, path: string): Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Загружает генератор при первом обращении и передаёт ему описание и параметры.
|
|
2
|
+
* @example Описание и параметры → Promise со схемой; при импорте этой обёртки генератор ещё не загружается.
|
|
3
|
+
*/
|
|
4
|
+
export async function generateOpenapi(schema, options) {
|
|
5
|
+
return (await import('./public.js')).generateOpenapi(schema, options);
|
|
6
|
+
}
|
|
7
|
+
/** Загружает модуль записи по требованию и сохраняет схему в указанный файл.
|
|
8
|
+
* @example Схема и путь → Promise<void>; файл появляется после успешного завершения.
|
|
9
|
+
*/
|
|
10
|
+
export async function writeOpenapi(document, path) {
|
|
11
|
+
return (await import('./index.js')).writeOpenapi(document, path);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=lazy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../../src/openapi/lazy.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAA4B,EAAE,OAAwB;IAC1F,OAAO,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AACD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAyB,EAAE,IAAY;IACxE,OAAO,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { type Model, type ModelSchema } from '../model.js';
|
|
2
|
-
import type { OpenapiDocument } from '
|
|
1
|
+
import { type Model, type ModelSchema } from '../core/model.js';
|
|
2
|
+
import type { OpenapiDocument } from './types.js';
|
|
3
3
|
export interface OpenapiOptions {
|
|
4
|
+
timestamps?: boolean;
|
|
5
|
+
softDelete?: boolean;
|
|
4
6
|
auth?: boolean;
|
|
5
7
|
files?: boolean;
|
|
6
8
|
host?: string;
|
|
@@ -13,6 +15,12 @@ export interface OpenapiOptions {
|
|
|
13
15
|
description?: string;
|
|
14
16
|
};
|
|
15
17
|
}
|
|
18
|
+
/** Проверяет параметры экспорта и строит документ из подготовленной модели.
|
|
19
|
+
* @example Модель с коллекцией notes → документ с paths['/notes'].
|
|
20
|
+
*/
|
|
16
21
|
export declare function openapiFromModel(model: Model | undefined, options?: OpenapiOptions): OpenapiDocument;
|
|
22
|
+
/** Загружает описание из объекта или файла и возвращает документ спецификации.
|
|
23
|
+
* @example Корректное описание → Promise<OpenapiDocument> с openapi: '3.0.3'.
|
|
24
|
+
*/
|
|
17
25
|
export declare function generateOpenapi(schema: ModelSchema | string, options?: OpenapiOptions): Promise<OpenapiDocument>;
|
|
18
26
|
export { writeOpenapi } from './index.js';
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { assertApi, loadModel } from '../model.js';
|
|
2
|
-
import { normalizePagination } from '../pagination.js';
|
|
1
|
+
import { assertApi, loadModel } from '../core/model.js';
|
|
2
|
+
import { normalizePagination } from '../core/pagination.js';
|
|
3
3
|
import { buildOpenapiDocument } from './document.js';
|
|
4
4
|
import { createOpenapi } from './index.js';
|
|
5
|
+
/** Проверяет параметры экспорта и строит документ из подготовленной модели.
|
|
6
|
+
* @example Модель с коллекцией notes → документ с paths['/notes'].
|
|
7
|
+
*/
|
|
5
8
|
export function openapiFromModel(model, options = {}) {
|
|
6
9
|
assertApi(model, 'openapi');
|
|
7
10
|
if (options.auth !== undefined && typeof options.auth !== 'boolean')
|
|
@@ -13,8 +16,11 @@ export function openapiFromModel(model, options = {}) {
|
|
|
13
16
|
const pagination = normalizePagination(options);
|
|
14
17
|
return createOpenapi({ document: buildOpenapiDocument({ model, auth: options.auth, files: options.files, info: options.info, ...pagination }), host: options.host, port: options.port });
|
|
15
18
|
}
|
|
19
|
+
/** Загружает описание из объекта или файла и возвращает документ спецификации.
|
|
20
|
+
* @example Корректное описание → Promise<OpenapiDocument> с openapi: '3.0.3'.
|
|
21
|
+
*/
|
|
16
22
|
export async function generateOpenapi(schema, options = {}) {
|
|
17
|
-
return openapiFromModel(await loadModel(schema), options);
|
|
23
|
+
return openapiFromModel(await loadModel(schema, options), options);
|
|
18
24
|
}
|
|
19
25
|
export { writeOpenapi } from './index.js';
|
|
20
26
|
//# sourceMappingURL=public.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/openapi/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAgC,MAAM,
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/openapi/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAgC,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAa3C;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAwB,EAAE,OAAO,GAAmB,EAAE;IACrF,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC7G,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAChH,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC;QAClM,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,aAAa,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3L,CAAC;AACD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAA4B,EAAE,OAAO,GAAmB,EAAE;IAC9F,OAAO,gBAAgB,CAAC,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AACD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
|
|
3
|
-
export type JsonObject = {
|
|
4
|
-
[key: string]: JsonValue;
|
|
5
|
-
};
|
|
6
|
-
export type DatabaseId = number | string;
|
|
7
|
-
export type DatabaseRecord = JsonObject;
|
|
8
|
-
export type DatabaseData = Record<string, DatabaseRecord[]>;
|
|
1
|
+
import type { JsonValue } from '../core/types.js';
|
|
9
2
|
export type OpenapiType = 'array' | 'boolean' | 'integer' | 'number' | 'object' | 'string';
|
|
10
3
|
export interface OpenapiSchema {
|
|
11
4
|
[key: string]: unknown;
|
|
@@ -47,5 +40,3 @@ export interface OpenapiDocument {
|
|
|
47
40
|
url: string;
|
|
48
41
|
}>;
|
|
49
42
|
}
|
|
50
|
-
export type QueryValue = string | string[] | undefined;
|
|
51
|
-
export type Query = Record<string, QueryValue>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/openapi/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Node } from '../model.js';
|
|
2
|
-
import { type ListOptions } from '../query/options.js';
|
|
1
|
+
import type { Node } from '../core/model.js';
|
|
2
|
+
import { type ListOptions } from '../core/query/options.js';
|
|
3
3
|
export interface Fields {
|
|
4
4
|
[key: string]: Scope | true;
|
|
5
5
|
}
|
|
@@ -8,6 +8,15 @@ export interface RestOptions {
|
|
|
8
8
|
scope: Scope;
|
|
9
9
|
}
|
|
10
10
|
export declare const ownScope: Scope;
|
|
11
|
+
/** Выбирает вложенный набор полей; для отсутствующего поля или true возвращает выбор собственных полей.
|
|
12
|
+
* @example scopeFor([{ '*': true }], 'name') → [{ '*': true }].
|
|
13
|
+
*/
|
|
11
14
|
export declare function scopeFor(scope: Scope, key: string): Scope;
|
|
15
|
+
/** Читает JSON-массив выбора полей из единственного параметра URL; проверяет длину и синтаксис JSON.
|
|
16
|
+
* @example parseRestOptions({ scope: '[{"id":true}]' }) → { scope: [{ id: true }] }.
|
|
17
|
+
*/
|
|
12
18
|
export declare function parseRestOptions(query: unknown): RestOptions;
|
|
19
|
+
/** Проверяет выбор полей рекурсивно; аргументы разрешены только для однородных списков.
|
|
20
|
+
* @example Для узла со строковым id: [{ id: true }] → undefined; [{ missing: true }] → ошибка.
|
|
21
|
+
*/
|
|
13
22
|
export declare function validateScope(node: Node, scope: unknown, list?: boolean, depth?: number): asserts scope is Scope;
|
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;
|