@kollors/deep-json-server 0.8.1 → 1.0.0-alpha.1
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 +286 -410
- package/README.ru.md +278 -404
- package/dist/index.d.ts +2 -1
- package/dist/index.js.map +1 -1
- package/dist/src/cli.js +50 -63
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.d.ts +16 -2
- package/dist/src/config.js +24 -8
- package/dist/src/config.js.map +1 -1
- package/dist/src/constants.d.ts +1 -1
- package/dist/src/constants.js +1 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/database.d.ts +4 -3
- package/dist/src/database.js +32 -19
- package/dist/src/database.js.map +1 -1
- package/dist/src/engine.d.ts +47 -0
- package/dist/src/engine.js +438 -0
- package/dist/src/engine.js.map +1 -0
- package/dist/src/files/disk-store.js +13 -2
- package/dist/src/files/disk-store.js.map +1 -1
- package/dist/src/files/openapi.d.ts +3 -0
- package/dist/src/files/openapi.js +86 -0
- package/dist/src/files/openapi.js.map +1 -0
- package/dist/src/graphql.d.ts +4 -0
- package/dist/src/graphql.js +223 -0
- package/dist/src/graphql.js.map +1 -0
- package/dist/src/model.d.ts +67 -0
- package/dist/src/model.js +319 -0
- package/dist/src/model.js.map +1 -0
- package/dist/src/openapi/document.d.ts +7 -7
- package/dist/src/openapi/document.js +234 -320
- package/dist/src/openapi/document.js.map +1 -1
- package/dist/src/openapi/index.d.ts +3 -6
- package/dist/src/openapi/index.js +2 -3
- package/dist/src/openapi/index.js.map +1 -1
- package/dist/src/query/filter.d.ts +0 -5
- package/dist/src/query/filter.js +6 -170
- package/dist/src/query/filter.js.map +1 -1
- package/dist/src/query/options.d.ts +31 -0
- package/dist/src/query/options.js +135 -0
- package/dist/src/query/options.js.map +1 -0
- package/dist/src/server.d.ts +4 -3
- package/dist/src/server.js +113 -135
- package/dist/src/server.js.map +1 -1
- package/dist/src/types.d.ts +1 -3
- package/dist/src/utils.d.ts +0 -1
- package/dist/src/utils.js +0 -1
- package/dist/src/utils.js.map +1 -1
- package/package.json +13 -8
- package/dist/src/openapi/config.d.ts +0 -11
- package/dist/src/openapi/config.js +0 -204
- package/dist/src/openapi/config.js.map +0 -1
- package/dist/src/openapi/inference.d.ts +0 -14
- package/dist/src/openapi/inference.js +0 -145
- package/dist/src/openapi/inference.js.map +0 -1
- package/dist/src/query/index.d.ts +0 -3
- package/dist/src/query/index.js +0 -4
- package/dist/src/query/index.js.map +0 -1
- package/dist/src/query/pagination.d.ts +0 -11
- package/dist/src/query/pagination.js +0 -28
- package/dist/src/query/pagination.js.map +0 -1
- package/dist/src/query/sort.d.ts +0 -1
- package/dist/src/query/sort.js +0 -54
- package/dist/src/query/sort.js.map +0 -1
- package/dist/src/relations.d.ts +0 -12
- package/dist/src/relations.js +0 -155
- package/dist/src/relations.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export type { DatabaseConfig, DeepJsonServerConfig, FilesConfig, MemoryFile, OpenapiConfig, ServerConfig } from './src/config.js';
|
|
1
|
+
export type { DatabaseConfig, DeepJsonServerConfig, FilesConfig, GraphqlConfig, MemoryFile, OpenapiConfig, ServerConfig } from './src/config.js';
|
|
2
2
|
export type { FileMetadata, FileUpdate } from './src/files/contract.js';
|
|
3
|
+
export type { EntityDefinition, Field, ModelSchema } from './src/model.js';
|
|
3
4
|
export type { ServerFacade } from './src/server.js';
|
|
4
5
|
export { createServer } from './src/server.js';
|
|
5
6
|
export type { OpenapiDocument } from './src/types.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/src/cli.js
CHANGED
|
@@ -4,77 +4,64 @@ import { DEFAULT_HOST, DEFAULT_PORT } from './constants.js';
|
|
|
4
4
|
import { createServer } from './server.js';
|
|
5
5
|
const HELP_TEXT = `Deep JSON Server
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
deep-json-server [--files] [--openapi | --openapi-only] <server.config.js>
|
|
7
|
+
Usage:
|
|
8
|
+
deep-json-server [--files] [--graphql] [--openapi | --openapi-only] [--graphql-schema | --graphql-only] <server.config.js>
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
--
|
|
12
|
-
--openapi
|
|
13
|
-
--openapi-only
|
|
14
|
-
--
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if (argument === '--files') {
|
|
20
|
-
options.files = true;
|
|
21
|
-
}
|
|
22
|
-
else if (argument === '--openapi') {
|
|
23
|
-
if (options.openapiMode !== 'none') {
|
|
24
|
-
throw new Error('Параметры --openapi и --openapi-only нельзя использовать одновременно');
|
|
25
|
-
}
|
|
26
|
-
options.openapiMode = 'generate';
|
|
27
|
-
}
|
|
28
|
-
else if (argument === '--openapi-only') {
|
|
29
|
-
if (options.openapiMode !== 'none') {
|
|
30
|
-
throw new Error('Параметры --openapi и --openapi-only нельзя использовать одновременно');
|
|
31
|
-
}
|
|
32
|
-
options.openapiMode = 'only';
|
|
33
|
-
}
|
|
34
|
-
else if (argument.startsWith('-')) {
|
|
35
|
-
throw new Error(`Неизвестный параметр: ${argument}`);
|
|
36
|
-
}
|
|
37
|
-
else if (configPath == null) {
|
|
38
|
-
configPath = argument;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
throw new Error('Можно указать только один файл конфигурации');
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
if (configPath == null) {
|
|
45
|
-
throw new Error('Укажите путь к файлу конфигурации');
|
|
46
|
-
}
|
|
47
|
-
return { configPath, ...options };
|
|
48
|
-
};
|
|
49
|
-
const validateModeConfig = (config, { files, openapiMode }) => {
|
|
50
|
-
if (openapiMode !== 'none' && config.openapi.path == null) {
|
|
51
|
-
throw new Error(`Для --openapi${openapiMode === 'only' ? '-only' : ''} укажите ключ config.openapi.path`);
|
|
52
|
-
}
|
|
53
|
-
if (files && config.files == null) {
|
|
54
|
-
throw new Error('Для --files укажите секцию config.files');
|
|
55
|
-
}
|
|
56
|
-
};
|
|
10
|
+
--files Enable binary file routes
|
|
11
|
+
--graphql Enable the GraphQL endpoint
|
|
12
|
+
--openapi Export OpenAPI and start the server
|
|
13
|
+
--openapi-only Export OpenAPI without starting the server
|
|
14
|
+
--graphql-schema Export GraphQL SDL and start the server
|
|
15
|
+
--graphql-only Export GraphQL SDL without starting the server
|
|
16
|
+
--help Show help
|
|
17
|
+
|
|
18
|
+
Both exporters can be combined; any --*-only flag prevents server startup.`;
|
|
57
19
|
export async function runCli(args = process.argv.slice(2), services = { createServer }) {
|
|
58
20
|
if (args.includes('--help')) {
|
|
59
21
|
process.stdout.write(`${HELP_TEXT}\n`);
|
|
60
22
|
return;
|
|
61
23
|
}
|
|
62
|
-
const
|
|
24
|
+
const flags = new Set();
|
|
25
|
+
let configPath;
|
|
26
|
+
for (const arg of args) {
|
|
27
|
+
if (arg.startsWith('-')) {
|
|
28
|
+
if (!['--files', '--graphql', '--openapi', '--openapi-only', '--graphql-schema', '--graphql-only'].includes(arg) || flags.has(arg))
|
|
29
|
+
throw new Error(`Неизвестный параметр или повтор: ${arg}`);
|
|
30
|
+
flags.add(arg);
|
|
31
|
+
}
|
|
32
|
+
else if (configPath === undefined)
|
|
33
|
+
configPath = arg;
|
|
34
|
+
else
|
|
35
|
+
throw new Error('Можно указать только один файл конфигурации');
|
|
36
|
+
}
|
|
37
|
+
if (!configPath)
|
|
38
|
+
throw new Error('Укажите путь к файлу конфигурации');
|
|
39
|
+
if ((flags.has('--openapi') && flags.has('--openapi-only')) || (flags.has('--graphql-schema') && flags.has('--graphql-only')))
|
|
40
|
+
throw new Error('Режимы одного экспортера нельзя использовать одновременно');
|
|
63
41
|
const config = await readServerConfig(configPath);
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
42
|
+
const openapi = flags.has('--openapi') || flags.has('--openapi-only');
|
|
43
|
+
const graphql = flags.has('--graphql-schema') || flags.has('--graphql-only');
|
|
44
|
+
if (openapi && !config.openapi.path)
|
|
45
|
+
throw new Error('Укажите config.openapi.path');
|
|
46
|
+
if (graphql && !config.graphql.path)
|
|
47
|
+
throw new Error('Укажите config.graphql.path');
|
|
48
|
+
if (flags.has('--files') && !config.files)
|
|
49
|
+
throw new Error('Укажите config.files');
|
|
50
|
+
const runtimeConfig = { ...config, server: { ...config.server, host: config.server.host ?? process.env.HOST ?? DEFAULT_HOST, port: config.server.port ?? Number(process.env.PORT ?? DEFAULT_PORT) } };
|
|
51
|
+
const only = flags.has('--openapi-only') || flags.has('--graphql-only');
|
|
52
|
+
const facade = await services.createServer(runtimeConfig, { files: flags.has('--files'), graphql: only ? false : flags.has('--graphql') || config.graphql.enabled === true });
|
|
53
|
+
if (openapi) {
|
|
54
|
+
await facade.openapi();
|
|
55
|
+
process.stdout.write(`OpenAPI: ${config.openapi.path}\n`);
|
|
72
56
|
}
|
|
73
|
-
if (
|
|
74
|
-
|
|
57
|
+
if (graphql) {
|
|
58
|
+
await facade.graphql();
|
|
59
|
+
process.stdout.write(`GraphQL: ${config.graphql.path}\n`);
|
|
75
60
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
61
|
+
if (only)
|
|
62
|
+
return;
|
|
63
|
+
const server = facade.fastify();
|
|
64
|
+
await server.listen();
|
|
65
|
+
server.log.info('Deep JSON Server started');
|
|
79
66
|
}
|
|
80
67
|
//# sourceMappingURL=cli.js.map
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/config.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { FastifyServerOptions } from 'fastify';
|
|
2
|
-
import type {
|
|
3
|
-
|
|
2
|
+
import type { ModelSchema } from './model.js';
|
|
3
|
+
import type { DatabaseData } from './types.js';
|
|
4
|
+
export type DatabaseSchema = ModelSchema;
|
|
4
5
|
export type DatabaseConfig = {
|
|
5
6
|
data: DatabaseData;
|
|
6
7
|
path?: never;
|
|
@@ -27,6 +28,16 @@ export type FilesConfig = {
|
|
|
27
28
|
};
|
|
28
29
|
export interface OpenapiConfig {
|
|
29
30
|
path?: string;
|
|
31
|
+
info?: {
|
|
32
|
+
title: string;
|
|
33
|
+
version: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface GraphqlConfig {
|
|
38
|
+
path?: string;
|
|
39
|
+
enabled?: boolean;
|
|
40
|
+
endpoint?: string;
|
|
30
41
|
}
|
|
31
42
|
export interface ServerConfig {
|
|
32
43
|
cors?: boolean;
|
|
@@ -34,18 +45,21 @@ export interface ServerConfig {
|
|
|
34
45
|
logger?: FastifyServerOptions['logger'];
|
|
35
46
|
maxFileSize?: number;
|
|
36
47
|
maxPageSize?: number;
|
|
48
|
+
pageSize?: number;
|
|
37
49
|
port?: number;
|
|
38
50
|
}
|
|
39
51
|
export interface DeepJsonServerConfig {
|
|
40
52
|
database: DatabaseConfig;
|
|
41
53
|
files?: FilesConfig;
|
|
42
54
|
openapi?: OpenapiConfig;
|
|
55
|
+
graphql?: GraphqlConfig;
|
|
43
56
|
server?: ServerConfig;
|
|
44
57
|
}
|
|
45
58
|
export interface NormalizedServerConfig {
|
|
46
59
|
database: DatabaseConfig;
|
|
47
60
|
files?: FilesConfig;
|
|
48
61
|
openapi: OpenapiConfig;
|
|
62
|
+
graphql: GraphqlConfig;
|
|
49
63
|
server: ServerConfig;
|
|
50
64
|
}
|
|
51
65
|
/** Validates configuration and resolves relative paths. */
|
package/dist/src/config.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { dirname, resolve } from 'node:path';
|
|
2
2
|
import { pathToFileURL } from 'node:url';
|
|
3
3
|
import { assertKnownKeys, isObject } from './utils.js';
|
|
4
|
-
const CONFIG_KEYS = new Set(['database', 'files', 'openapi', 'server']);
|
|
4
|
+
const CONFIG_KEYS = new Set(['database', 'files', 'openapi', 'graphql', 'server']);
|
|
5
5
|
const DATABASE_KEYS = new Set(['data', 'path', 'schema']);
|
|
6
6
|
const FILES_KEYS = new Set(['data', 'directory', 'metadata']);
|
|
7
|
-
const OPENAPI_KEYS = new Set(['path']);
|
|
8
|
-
const
|
|
7
|
+
const OPENAPI_KEYS = new Set(['path', 'info']);
|
|
8
|
+
const GRAPHQL_KEYS = new Set(['path', 'enabled', 'endpoint']);
|
|
9
|
+
const SERVER_KEYS = new Set(['cors', 'host', 'logger', 'maxFileSize', 'maxPageSize', 'pageSize', 'port']);
|
|
9
10
|
let configImportIndex = 0;
|
|
10
11
|
function getObject(value, path, required = false) {
|
|
11
12
|
if (value == null && !required) {
|
|
@@ -40,7 +41,7 @@ const normalizeSchema = (schema, directoryPath) => {
|
|
|
40
41
|
return undefined;
|
|
41
42
|
}
|
|
42
43
|
if (typeof schema === 'string') {
|
|
43
|
-
return
|
|
44
|
+
return resolve(directoryPath, getString(schema, 'config.database.schema', true));
|
|
44
45
|
}
|
|
45
46
|
return getObject(schema, 'config.database.schema', true);
|
|
46
47
|
};
|
|
@@ -56,7 +57,7 @@ const normalizeDatabase = (value, directoryPath) => {
|
|
|
56
57
|
if (hasData) {
|
|
57
58
|
return { data: getObject(database.data, 'config.database.data', true), schema };
|
|
58
59
|
}
|
|
59
|
-
return { path:
|
|
60
|
+
return { path: resolve(directoryPath, getString(database.path, 'config.database.path', true)), schema };
|
|
60
61
|
};
|
|
61
62
|
const normalizeFiles = (value, directoryPath) => {
|
|
62
63
|
const files = getObject(value, 'config.files');
|
|
@@ -76,8 +77,8 @@ const normalizeFiles = (value, directoryPath) => {
|
|
|
76
77
|
return { data: files.data };
|
|
77
78
|
}
|
|
78
79
|
return {
|
|
79
|
-
directory:
|
|
80
|
-
metadata:
|
|
80
|
+
directory: resolve(directoryPath, getString(files.directory, 'config.files.directory', true)),
|
|
81
|
+
metadata: resolve(directoryPath, getString(files.metadata, 'config.files.metadata', true)),
|
|
81
82
|
};
|
|
82
83
|
};
|
|
83
84
|
const normalizeConfig = (config, directoryPath = '.') => {
|
|
@@ -88,8 +89,18 @@ const normalizeConfig = (config, directoryPath = '.') => {
|
|
|
88
89
|
const database = normalizeDatabase(config.database, directoryPath);
|
|
89
90
|
const files = normalizeFiles(config.files, directoryPath);
|
|
90
91
|
const openapi = getObject(config.openapi, 'config.openapi') ?? {};
|
|
92
|
+
const graphql = getObject(config.graphql, 'config.graphql') ?? {};
|
|
91
93
|
const server = getObject(config.server, 'config.server') ?? {};
|
|
92
94
|
assertKnownKeys(openapi, OPENAPI_KEYS, 'config.openapi');
|
|
95
|
+
assertKnownKeys(graphql, GRAPHQL_KEYS, 'config.graphql');
|
|
96
|
+
if (graphql.enabled !== undefined && typeof graphql.enabled !== 'boolean')
|
|
97
|
+
throw new Error('config.graphql.enabled must be boolean');
|
|
98
|
+
const endpoint = getString(graphql.endpoint, 'config.graphql.endpoint');
|
|
99
|
+
if (endpoint && (!/^\/[A-Za-z][A-Za-z0-9_/-]*$/.test(endpoint) || endpoint === '/'))
|
|
100
|
+
throw new Error('Invalid GraphQL endpoint');
|
|
101
|
+
const info = getObject(openapi.info, 'config.openapi.info');
|
|
102
|
+
if (info && (typeof info.title !== 'string' || typeof info.version !== 'string'))
|
|
103
|
+
throw new Error('OpenAPI info requires title and version');
|
|
93
104
|
assertKnownKeys(server, SERVER_KEYS, 'config.server');
|
|
94
105
|
const openapiPath = getString(openapi.path, 'config.openapi.path');
|
|
95
106
|
const cors = server.cors;
|
|
@@ -97,6 +108,9 @@ const normalizeConfig = (config, directoryPath = '.') => {
|
|
|
97
108
|
const logger = server.logger;
|
|
98
109
|
const maxFileSize = getPositiveInteger(server.maxFileSize, 'config.server.maxFileSize');
|
|
99
110
|
const maxPageSize = getPositiveInteger(server.maxPageSize, 'config.server.maxPageSize');
|
|
111
|
+
const pageSize = getPositiveInteger(server.pageSize, 'config.server.pageSize');
|
|
112
|
+
if (pageSize !== undefined && pageSize > (maxPageSize ?? 100))
|
|
113
|
+
throw new Error('pageSize exceeds maxPageSize');
|
|
100
114
|
const port = server.port;
|
|
101
115
|
if (port != null && (typeof port !== 'number' || !Number.isInteger(port) || port < 0 || port > 65_535)) {
|
|
102
116
|
throw new Error('Ключ config.server.port должен быть целым числом от 0 до 65535');
|
|
@@ -110,13 +124,15 @@ const normalizeConfig = (config, directoryPath = '.') => {
|
|
|
110
124
|
return {
|
|
111
125
|
database,
|
|
112
126
|
files,
|
|
113
|
-
openapi: { path: resolveConfigPath(openapiPath, directoryPath) },
|
|
127
|
+
openapi: { path: resolveConfigPath(openapiPath, directoryPath), ...(info && { info: info }) },
|
|
128
|
+
graphql: { path: resolveConfigPath(getString(graphql.path, 'config.graphql.path'), directoryPath), enabled: graphql.enabled, endpoint },
|
|
114
129
|
server: {
|
|
115
130
|
cors: cors,
|
|
116
131
|
host,
|
|
117
132
|
logger: logger,
|
|
118
133
|
maxFileSize,
|
|
119
134
|
maxPageSize,
|
|
135
|
+
pageSize,
|
|
120
136
|
port: port,
|
|
121
137
|
},
|
|
122
138
|
};
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/src/constants.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const DEFAULT_HOST = "127.0.0.1";
|
|
2
2
|
export declare const DEFAULT_MAX_FILE_SIZE: number;
|
|
3
|
-
export declare const DEFAULT_MAX_PAGE_SIZE =
|
|
3
|
+
export declare const DEFAULT_MAX_PAGE_SIZE = 100;
|
|
4
4
|
export declare const DEFAULT_PAGE_SIZE = 10;
|
|
5
5
|
export declare const DEFAULT_PORT = 4001;
|
package/dist/src/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export const DEFAULT_HOST = '127.0.0.1';
|
|
2
2
|
export const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;
|
|
3
|
-
export const DEFAULT_MAX_PAGE_SIZE =
|
|
3
|
+
export const DEFAULT_MAX_PAGE_SIZE = 100;
|
|
4
4
|
export const DEFAULT_PAGE_SIZE = 10;
|
|
5
5
|
export const DEFAULT_PORT = 4001;
|
|
6
6
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC"}
|
package/dist/src/database.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { DatabaseConfig } from './config.js';
|
|
|
2
2
|
import type { DatabaseData, DatabaseRecord } from './types.js';
|
|
3
3
|
export interface DatabaseContainer {
|
|
4
4
|
data: DatabaseData;
|
|
5
|
+
counters?: Record<string, number>;
|
|
5
6
|
}
|
|
6
7
|
export interface DatabaseStore {
|
|
7
8
|
database: DatabaseContainer;
|
|
@@ -10,11 +11,11 @@ export interface DatabaseStore {
|
|
|
10
11
|
update<T>(operation: (database: DatabaseContainer) => T): Promise<T>;
|
|
11
12
|
}
|
|
12
13
|
export declare const validateJsonValue: (value: unknown, path: string, ancestors?: WeakSet<object>) => void;
|
|
13
|
-
export declare const validateDatabase: (data: unknown) => DatabaseData;
|
|
14
|
+
export declare const validateDatabase: (data: unknown, primaryKeys?: Map<string, string>) => DatabaseData;
|
|
14
15
|
export declare const readJsonObjectFile: (path: string, label: string) => Promise<Record<string, unknown>>;
|
|
15
|
-
export declare const readDatabaseFile: (databasePath: string) => Promise<DatabaseData>;
|
|
16
|
+
export declare const readDatabaseFile: (databasePath: string, keys?: Map<string, string>) => Promise<DatabaseData>;
|
|
16
17
|
/** Creates a disk- or memory-backed database with serialized updates. */
|
|
17
|
-
export declare const createDatabaseStore: (config: DatabaseConfig) => Promise<DatabaseStore>;
|
|
18
|
+
export declare const createDatabaseStore: (config: DatabaseConfig, keys?: Map<string, string>) => Promise<DatabaseStore>;
|
|
18
19
|
export declare const getCollection: (database: DatabaseContainer, resource: string) => DatabaseRecord[];
|
|
19
20
|
export declare const findItemIndex: (collection: DatabaseRecord[], id: unknown) => number;
|
|
20
21
|
export declare const createId: (collection: DatabaseRecord[]) => string;
|
package/dist/src/database.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { Low } from 'lowdb';
|
|
4
|
+
import { JSONFile } from 'lowdb/node';
|
|
4
5
|
import { createHttpError, createSerialQueue, createUniqueId, isObject, isSafeKey, isSystemError, resolveDatabasePath } from './utils.js';
|
|
5
6
|
const RESOURCE_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_-]*$/;
|
|
6
7
|
export const validateJsonValue = (value, path, ancestors = new WeakSet()) => {
|
|
@@ -39,7 +40,7 @@ export const validateJsonValue = (value, path, ancestors = new WeakSet()) => {
|
|
|
39
40
|
}
|
|
40
41
|
ancestors.delete(value);
|
|
41
42
|
};
|
|
42
|
-
export const validateDatabase = (data) => {
|
|
43
|
+
export const validateDatabase = (data, primaryKeys) => {
|
|
43
44
|
if (!isObject(data)) {
|
|
44
45
|
throw new Error('База данных должна содержать JSON-объект');
|
|
45
46
|
}
|
|
@@ -51,18 +52,19 @@ export const validateDatabase = (data) => {
|
|
|
51
52
|
if (!Array.isArray(records)) {
|
|
52
53
|
throw new Error(`Ресурс «${resource}» должен содержать JSON-массив`);
|
|
53
54
|
}
|
|
55
|
+
const primary = primaryKeys?.get(resource) ?? 'id';
|
|
54
56
|
const ids = new Set();
|
|
55
57
|
records.forEach((record, index) => {
|
|
56
58
|
if (!isObject(record)) {
|
|
57
59
|
throw new Error(`Запись ${index} ресурса «${resource}» должна содержать JSON-объект`);
|
|
58
60
|
}
|
|
59
|
-
if (typeof record
|
|
61
|
+
if (typeof record[primary] !== 'string' && !(typeof record[primary] === 'number' && Number.isFinite(record[primary]))) {
|
|
60
62
|
throw new Error(`Запись ${index} ресурса «${resource}» должна содержать строковый или числовой id`);
|
|
61
63
|
}
|
|
62
|
-
if (String(record
|
|
64
|
+
if (String(record[primary]) === '') {
|
|
63
65
|
throw new Error(`Запись ${index} ресурса «${resource}» должна содержать непустой id`);
|
|
64
66
|
}
|
|
65
|
-
const id = String(record
|
|
67
|
+
const id = String(record[primary]);
|
|
66
68
|
if (ids.has(id)) {
|
|
67
69
|
throw new Error(`Ресурс «${resource}» содержит повторяющийся id «${id}»`);
|
|
68
70
|
}
|
|
@@ -89,41 +91,52 @@ export const readJsonObjectFile = async (path, label) => {
|
|
|
89
91
|
}
|
|
90
92
|
return value;
|
|
91
93
|
};
|
|
92
|
-
export const readDatabaseFile = async (databasePath) => validateDatabase(await readJsonObjectFile(databasePath, 'Файл базы данных'));
|
|
93
|
-
const createDiskDatabaseStore = async (databasePath) => {
|
|
94
|
+
export const readDatabaseFile = async (databasePath, keys) => validateDatabase(await readJsonObjectFile(databasePath, 'Файл базы данных'), keys);
|
|
95
|
+
const createDiskDatabaseStore = async (databasePath, keys) => {
|
|
94
96
|
const resolvedDatabasePath = resolveDatabasePath(databasePath);
|
|
95
|
-
const initialData = await readDatabaseFile(resolvedDatabasePath);
|
|
96
|
-
const database =
|
|
97
|
+
const initialData = await readDatabaseFile(resolvedDatabasePath, keys);
|
|
98
|
+
const database = new Low(new JSONFile(resolvedDatabasePath), initialData);
|
|
97
99
|
const schedule = createSerialQueue();
|
|
100
|
+
const counterStore = new Low(new JSONFile(`${resolvedDatabasePath}.counters.json`), {});
|
|
101
|
+
await counterStore.read();
|
|
98
102
|
const read = async () => {
|
|
99
|
-
database.data = await readDatabaseFile(resolvedDatabasePath);
|
|
103
|
+
database.data = await readDatabaseFile(resolvedDatabasePath, keys);
|
|
100
104
|
return database.data;
|
|
101
105
|
};
|
|
102
106
|
const update = (operation) => schedule(async () => {
|
|
103
107
|
await read();
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
108
|
+
await counterStore.read();
|
|
109
|
+
const draft = { data: structuredClone(database.data), counters: structuredClone(counterStore.data) };
|
|
110
|
+
const result = operation(draft);
|
|
111
|
+
validateDatabase(draft.data, keys);
|
|
112
|
+
// Reserve generated numbers first: failed data writes may leave gaps, never reused IDs.
|
|
113
|
+
if (JSON.stringify(draft.counters) !== JSON.stringify(counterStore.data)) {
|
|
114
|
+
counterStore.data = draft.counters;
|
|
115
|
+
await counterStore.write();
|
|
116
|
+
}
|
|
117
|
+
await database.adapter.write(draft.data);
|
|
118
|
+
database.data = draft.data;
|
|
107
119
|
return result;
|
|
108
120
|
});
|
|
109
121
|
return { database, path: resolvedDatabasePath, read, update };
|
|
110
122
|
};
|
|
111
|
-
const createMemoryDatabaseStore = (sourceData) => {
|
|
112
|
-
validateDatabase(sourceData);
|
|
113
|
-
const database = { data: structuredClone(sourceData) };
|
|
123
|
+
const createMemoryDatabaseStore = (sourceData, keys) => {
|
|
124
|
+
validateDatabase(sourceData, keys);
|
|
125
|
+
const database = { data: structuredClone(sourceData), counters: {} };
|
|
114
126
|
const schedule = createSerialQueue();
|
|
115
127
|
const read = async () => database.data;
|
|
116
128
|
const update = (operation) => schedule(() => {
|
|
117
|
-
const draft =
|
|
129
|
+
const draft = structuredClone(database);
|
|
118
130
|
const result = operation(draft);
|
|
119
|
-
validateDatabase(draft.data);
|
|
131
|
+
validateDatabase(draft.data, keys);
|
|
120
132
|
database.data = draft.data;
|
|
133
|
+
database.counters = draft.counters;
|
|
121
134
|
return result;
|
|
122
135
|
});
|
|
123
136
|
return { database, read, update };
|
|
124
137
|
};
|
|
125
138
|
/** Creates a disk- or memory-backed database with serialized updates. */
|
|
126
|
-
export const createDatabaseStore = async (config) =>
|
|
139
|
+
export const createDatabaseStore = async (config, keys) => config.data != null ? createMemoryDatabaseStore(config.data, keys) : createDiskDatabaseStore(config.path, keys);
|
|
127
140
|
export const getCollection = (database, resource) => {
|
|
128
141
|
const collection = isSafeKey(resource) ? database.data[resource] : undefined;
|
|
129
142
|
if (!Array.isArray(collection)) {
|
package/dist/src/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { DatabaseStore } from './database.js';
|
|
2
|
+
import { type Entity, type Model, type Node } from './model.js';
|
|
3
|
+
import { type ListOptions, type RestOptions, type Scope } from './query/options.js';
|
|
4
|
+
import type { DatabaseData, JsonObject } from './types.js';
|
|
5
|
+
export interface Ref {
|
|
6
|
+
entity: Entity;
|
|
7
|
+
node: Node;
|
|
8
|
+
value: JsonObject;
|
|
9
|
+
root: JsonObject;
|
|
10
|
+
bindings: Record<string, JsonObject>;
|
|
11
|
+
context: Context;
|
|
12
|
+
}
|
|
13
|
+
export interface Context {
|
|
14
|
+
data: DatabaseData;
|
|
15
|
+
model: Model;
|
|
16
|
+
indexes: Map<string, Map<string, JsonObject[]>>;
|
|
17
|
+
}
|
|
18
|
+
export interface Page {
|
|
19
|
+
data: Ref[];
|
|
20
|
+
total: number;
|
|
21
|
+
}
|
|
22
|
+
export declare const makeContext: (data: DatabaseData, model: Model) => Context;
|
|
23
|
+
export declare const rootRef: (context: Context, entity: Entity, value: JsonObject) => Ref;
|
|
24
|
+
export declare function related(ref: Ref, node: Node): Ref[];
|
|
25
|
+
export declare function resolveField(ref: Ref, node: Node): unknown;
|
|
26
|
+
export declare class Engine {
|
|
27
|
+
readonly store: DatabaseStore;
|
|
28
|
+
model: Model;
|
|
29
|
+
readonly pageSize: number;
|
|
30
|
+
readonly maxPageSize: number;
|
|
31
|
+
constructor(store: DatabaseStore, model: Model, pageSize?: number, maxPageSize?: number);
|
|
32
|
+
context(): Promise<Context>;
|
|
33
|
+
entity(collection: string): Entity;
|
|
34
|
+
records(context: Context, entity: Entity): Ref[];
|
|
35
|
+
find(context: Context, entity: Entity, key: unknown): Ref | undefined;
|
|
36
|
+
validateOptions(node: Node, options: ListOptions): {
|
|
37
|
+
page: number;
|
|
38
|
+
pageSize: number;
|
|
39
|
+
};
|
|
40
|
+
list(records: Ref[], node: Node, options?: ListOptions): Page;
|
|
41
|
+
validateRest(entity: Entity, options: RestOptions): void;
|
|
42
|
+
project(ref: Ref, scope?: Scope, nested?: RestOptions['nested'], prefix?: string): JsonObject;
|
|
43
|
+
validateData(data: DatabaseData): void;
|
|
44
|
+
private defaults;
|
|
45
|
+
mutate(entity: Entity, mode: 'create' | 'replace' | 'update' | 'delete', key?: unknown, body?: unknown): Promise<Ref>;
|
|
46
|
+
private cascade;
|
|
47
|
+
}
|