@kollors/deep-json-server 1.0.0-alpha.9 → 1.0.0-beta.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 +159 -127
- package/README.ru.md +159 -127
- package/dist/src/cli/index.js +14 -23
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/constants.d.ts +1 -1
- package/dist/src/core/constants.js +1 -1
- package/dist/src/core/constants.js.map +1 -1
- package/dist/src/core/engine.d.ts +3 -15
- package/dist/src/core/engine.js +10 -69
- package/dist/src/core/engine.js.map +1 -1
- package/dist/src/core/lifecycle/mutation.js +4 -4
- package/dist/src/core/lifecycle/mutation.js.map +1 -1
- package/dist/src/core/lifecycle/options.d.ts +15 -0
- package/dist/src/core/lifecycle/options.js +13 -0
- package/dist/src/core/lifecycle/options.js.map +1 -1
- package/dist/src/core/model.d.ts +1 -0
- package/dist/src/core/model.js +11 -0
- package/dist/src/core/model.js.map +1 -1
- package/dist/src/core/mutations/write.js +4 -0
- package/dist/src/core/mutations/write.js.map +1 -1
- package/dist/src/core/paths.js +1 -7
- package/dist/src/core/paths.js.map +1 -1
- package/dist/src/core/query/execute.d.ts +25 -0
- package/dist/src/core/query/execute.js +82 -0
- package/dist/src/core/query/execute.js.map +1 -0
- package/dist/src/core/query/filter.js +1 -1
- package/dist/src/core/query/filter.js.map +1 -1
- package/dist/src/core/query/options.js +2 -2
- package/dist/src/core/query/options.js.map +1 -1
- package/dist/src/core/records.d.ts +2 -1
- package/dist/src/core/records.js +5 -2
- package/dist/src/core/records.js.map +1 -1
- package/dist/src/files/disk-metadata.d.ts +9 -0
- package/dist/src/files/disk-metadata.js +44 -0
- package/dist/src/files/disk-metadata.js.map +1 -0
- package/dist/src/files/disk-paths.d.ts +15 -0
- package/dist/src/files/disk-paths.js +100 -0
- package/dist/src/files/disk-paths.js.map +1 -0
- package/dist/src/files/disk-store.js +21 -165
- package/dist/src/files/disk-store.js.map +1 -1
- package/dist/src/files/index.js +1 -1
- package/dist/src/files/index.js.map +1 -1
- package/dist/src/graphql/preflight.js +2 -0
- package/dist/src/graphql/preflight.js.map +1 -1
- package/dist/src/graphql/resolvers.js +7 -3
- package/dist/src/graphql/resolvers.js.map +1 -1
- package/dist/src/graphql/routes.js +4 -1
- package/dist/src/graphql/routes.js.map +1 -1
- package/dist/src/graphql/schema.js +5 -2
- package/dist/src/graphql/schema.js.map +1 -1
- package/dist/src/openapi/document.js +30 -19
- package/dist/src/openapi/document.js.map +1 -1
- package/dist/src/openapi/registry.d.ts +11 -0
- package/dist/src/openapi/registry.js +20 -0
- package/dist/src/openapi/registry.js.map +1 -0
- package/dist/src/rest/options.d.ts +11 -3
- package/dist/src/rest/options.js +15 -0
- package/dist/src/rest/options.js.map +1 -1
- package/dist/src/rest/projection.d.ts +15 -3
- package/dist/src/rest/projection.js +49 -15
- package/dist/src/rest/projection.js.map +1 -1
- package/dist/src/rest/routes.js +18 -7
- package/dist/src/rest/routes.js.map +1 -1
- package/dist/src/server/bootstrap.d.ts +7 -0
- package/dist/src/server/bootstrap.js +48 -0
- package/dist/src/server/bootstrap.js.map +1 -0
- package/dist/src/server/config.d.ts +2 -2
- package/dist/src/server/config.js +5 -5
- package/dist/src/server/config.js.map +1 -1
- package/dist/src/server/create.d.ts +1 -1
- package/dist/src/server/create.js +11 -85
- package/dist/src/server/create.js.map +1 -1
- package/dist/src/server/http.d.ts +12 -0
- package/dist/src/server/http.js +40 -0
- package/dist/src/server/http.js.map +1 -0
- package/dist/src/server/openapi-options.d.ts +6 -0
- package/dist/src/server/openapi-options.js +15 -0
- package/dist/src/server/openapi-options.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { inputPaths } from '../core/paths.js';
|
|
5
|
-
import { errorMessage, isObject } from '../core/utils.js';
|
|
6
|
-
import { configSourcePath, normalizeServerConfig } from './config.js';
|
|
7
|
-
import { validateEndpoints } from './features.js';
|
|
1
|
+
import { registerConfiguredModules } from './bootstrap.js';
|
|
2
|
+
import { normalizeServerConfig } from './config.js';
|
|
3
|
+
import { createHttpServer } from './http.js';
|
|
8
4
|
import { configuredModel } from './model.js';
|
|
5
|
+
import { openapiOptions } from './openapi-options.js';
|
|
9
6
|
const CORS_HEADERS = {
|
|
10
7
|
'Access-Control-Allow-Headers': 'Content-Type',
|
|
11
8
|
'Access-Control-Allow-Methods': 'DELETE, GET, OPTIONS, PATCH, POST, PUT',
|
|
@@ -14,9 +11,10 @@ const CORS_HEADERS = {
|
|
|
14
11
|
/** Проверяет настройки и создаёт интерфейс запуска и генерации схем; сетевой порт ещё не открывает.
|
|
15
12
|
* @example await createServer({ storage: 'memory', database: { source: { notes: [] } } }) → объект с fastify(), openapi(), graphql().
|
|
16
13
|
*/
|
|
17
|
-
export async function createServer(
|
|
18
|
-
if (
|
|
14
|
+
export async function createServer(...args) {
|
|
15
|
+
if (args.length !== 1)
|
|
19
16
|
throw new Error('createServer accepts only a configuration object');
|
|
17
|
+
const [config] = args;
|
|
20
18
|
return createConfiguredServer(normalizeServerConfig(config));
|
|
21
19
|
}
|
|
22
20
|
/** Собирает сервер из нормализованных настроек; хранилища открываются при инициализации HTTP-экземпляра.
|
|
@@ -24,8 +22,6 @@ export async function createServer(config) {
|
|
|
24
22
|
*/
|
|
25
23
|
export async function createConfiguredServer(normalized) {
|
|
26
24
|
const enabled = { auth: normalized.auth !== undefined, files: normalized.files !== undefined };
|
|
27
|
-
const { inferModel } = await import('../core/model.js');
|
|
28
|
-
const recordSettings = { auth: enabled.auth };
|
|
29
25
|
const explicitModel = await configuredModel(normalized);
|
|
30
26
|
const { default: Fastify } = await import('fastify');
|
|
31
27
|
const corsHeaders = { ...CORS_HEADERS };
|
|
@@ -35,88 +31,18 @@ export async function createConfiguredServer(normalized) {
|
|
|
35
31
|
}
|
|
36
32
|
if (enabled.auth)
|
|
37
33
|
corsHeaders['Access-Control-Allow-Headers'] += ', Authorization';
|
|
38
|
-
const { cors, logger
|
|
34
|
+
const { cors, logger } = normalized.server;
|
|
39
35
|
const openapi = async () => {
|
|
40
36
|
if (!normalized.openapi)
|
|
41
37
|
throw new Error('OpenAPI is not configured');
|
|
42
|
-
return (await import('../openapi/generate.js')).openapiFromModel(explicitModel,
|
|
43
|
-
files: enabled.files,
|
|
44
|
-
...recordSettings,
|
|
45
|
-
pageSize,
|
|
46
|
-
maxPageSize,
|
|
47
|
-
info: normalized.openapi.info,
|
|
48
|
-
host: normalized.server.host,
|
|
49
|
-
port: normalized.server.port,
|
|
50
|
-
});
|
|
38
|
+
return (await import('../openapi/generate.js')).openapiFromModel(explicitModel, openapiOptions(normalized));
|
|
51
39
|
};
|
|
52
40
|
let instance;
|
|
53
41
|
const getFastify = () => {
|
|
54
42
|
if (instance)
|
|
55
43
|
return instance;
|
|
56
|
-
const server =
|
|
57
|
-
|
|
58
|
-
const defaults = { host: normalized.server.host, port: normalized.server.port };
|
|
59
|
-
const listen = (optionsOrCallback, callback) => {
|
|
60
|
-
if (typeof optionsOrCallback === 'function') {
|
|
61
|
-
originalListen(defaults, optionsOrCallback);
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
if (callback) {
|
|
65
|
-
originalListen({ ...defaults, ...optionsOrCallback }, callback);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
return originalListen({ ...defaults, ...optionsOrCallback });
|
|
69
|
-
};
|
|
70
|
-
server.listen = listen;
|
|
71
|
-
server.setErrorHandler((error, request, reply) => {
|
|
72
|
-
const candidate = error instanceof DomainError ? domainStatus[error.code] : isObject(error) ? error.statusCode : undefined;
|
|
73
|
-
const status = typeof candidate === 'number' && Number.isInteger(candidate) && candidate >= 400 && candidate <= 599 ? candidate : 500;
|
|
74
|
-
if (status === 500)
|
|
75
|
-
request.log.error(error);
|
|
76
|
-
return reply.code(status).send({ error: status === 500 ? 'Внутренняя ошибка сервера' : errorMessage(error) });
|
|
77
|
-
});
|
|
78
|
-
if (cors) {
|
|
79
|
-
server.addHook('onRequest', async (_request, reply) => {
|
|
80
|
-
for (const [key, value] of Object.entries(corsHeaders))
|
|
81
|
-
reply.header(key, value);
|
|
82
|
-
});
|
|
83
|
-
server.options('/', async (_request, reply) => reply.code(204).send());
|
|
84
|
-
server.options('/*', async (_request, reply) => reply.code(204).send());
|
|
85
|
-
}
|
|
86
|
-
server.register(async (app) => {
|
|
87
|
-
const [{ createDatabaseStore }, { Engine }, { registerRestRoutes }] = await Promise.all([import('../core/database.js'), import('../core/engine.js'), import('../rest/routes.js')]);
|
|
88
|
-
const keys = explicitModel ? new Map(explicitModel.entities.map((e) => [e.collection, e.primary])) : undefined;
|
|
89
|
-
const store = await createDatabaseStore(normalized.database, keys);
|
|
90
|
-
const model = explicitModel ?? inferModel(store.database.data, recordSettings);
|
|
91
|
-
const engine = new Engine(store, model, pageSize, maxPageSize);
|
|
92
|
-
engine.validateData(store.database.data);
|
|
93
|
-
const graphqlPath = normalized.graphql?.endpoint;
|
|
94
|
-
const openapiPath = normalized.openapi?.endpoint;
|
|
95
|
-
validateEndpoints(model.entities.map((entity) => entity.collection), [...(graphqlPath ? [graphqlPath] : []), ...(openapiPath ? [openapiPath] : []), ...(enabled.auth ? Object.values(AUTH_PATHS) : [])]);
|
|
96
|
-
const auth = enabled.auth && normalized.auth ? await (await import('../auth/service.js')).createAuthService(normalized.auth) : undefined;
|
|
97
|
-
if (auth) {
|
|
98
|
-
app.addHook('onClose', async () => auth.close());
|
|
99
|
-
const { registerAuthRoutes } = await import('../auth/routes.js');
|
|
100
|
-
registerAuthRoutes(app, auth);
|
|
101
|
-
}
|
|
102
|
-
const authenticate = auth ? (header) => auth.me(header) : undefined;
|
|
103
|
-
registerRestRoutes(app, engine, authenticate);
|
|
104
|
-
if (graphqlPath) {
|
|
105
|
-
const [{ registerGraphqlRoutes }, { buildGraphql }] = await Promise.all([import('../graphql/routes.js'), import('../graphql/schema.js')]);
|
|
106
|
-
registerGraphqlRoutes(app, buildGraphql(model), engine, graphqlPath, authenticate);
|
|
107
|
-
}
|
|
108
|
-
if (openapiPath) {
|
|
109
|
-
const document = await openapi();
|
|
110
|
-
document.servers = [{ url: '/' }];
|
|
111
|
-
app.get(openapiPath, async () => document);
|
|
112
|
-
}
|
|
113
|
-
const files = normalized.files;
|
|
114
|
-
if (enabled.files && files) {
|
|
115
|
-
const { createFileStore, registerFileRoutes } = await import('../files/index.js');
|
|
116
|
-
const protectedPaths = inputPaths({ database: normalized.database, auth: normalized.auth }, '.', configSourcePath(normalized));
|
|
117
|
-
registerFileRoutes(app, { getStore: () => createFileStore(files, protectedPaths), maxFileSize });
|
|
118
|
-
}
|
|
119
|
-
});
|
|
44
|
+
const server = createHttpServer({ create: Fastify, host: normalized.server.host, port: normalized.server.port, logger, cors, corsHeaders });
|
|
45
|
+
server.register(async (app) => registerConfiguredModules(app, normalized, explicitModel, openapi));
|
|
120
46
|
instance = server;
|
|
121
47
|
return server;
|
|
122
48
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/server/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/server/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FastifyInstance, FastifyServerOptions } from 'fastify';
|
|
2
|
+
/** Создаёт HTTP-сервер с едиными ошибками, CORS и значениями listen по умолчанию.
|
|
3
|
+
* @example createHttpServer({ host: '127.0.0.1', port: 4001, cors: false }) → FastifyInstance.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createHttpServer({ create, host, port, logger, cors, corsHeaders, }: {
|
|
6
|
+
create: typeof import('fastify').default;
|
|
7
|
+
host: string;
|
|
8
|
+
port: number;
|
|
9
|
+
logger: FastifyServerOptions['logger'];
|
|
10
|
+
cors: boolean;
|
|
11
|
+
corsHeaders: Record<string, string>;
|
|
12
|
+
}): FastifyInstance;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { DomainError } from '../core/errors.js';
|
|
2
|
+
import { domainStatus } from '../core/http-errors.js';
|
|
3
|
+
import { errorMessage, isObject } from '../core/utils.js';
|
|
4
|
+
/** Создаёт HTTP-сервер с едиными ошибками, CORS и значениями listen по умолчанию.
|
|
5
|
+
* @example createHttpServer({ host: '127.0.0.1', port: 4001, cors: false }) → FastifyInstance.
|
|
6
|
+
*/
|
|
7
|
+
export function createHttpServer({ create, host, port, logger, cors, corsHeaders, }) {
|
|
8
|
+
const server = create({ ajv: { customOptions: { coerceTypes: false, removeAdditional: false } }, logger });
|
|
9
|
+
const originalListen = server.listen.bind(server);
|
|
10
|
+
const defaults = { host, port };
|
|
11
|
+
const listen = (optionsOrCallback, callback) => {
|
|
12
|
+
if (typeof optionsOrCallback === 'function') {
|
|
13
|
+
originalListen(defaults, optionsOrCallback);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (callback) {
|
|
17
|
+
originalListen({ ...defaults, ...optionsOrCallback }, callback);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
return originalListen({ ...defaults, ...optionsOrCallback });
|
|
21
|
+
};
|
|
22
|
+
server.listen = listen;
|
|
23
|
+
server.setErrorHandler((error, request, reply) => {
|
|
24
|
+
const candidate = error instanceof DomainError ? domainStatus[error.code] : isObject(error) ? error.statusCode : undefined;
|
|
25
|
+
const status = typeof candidate === 'number' && Number.isInteger(candidate) && candidate >= 400 && candidate <= 599 ? candidate : 500;
|
|
26
|
+
if (status === 500)
|
|
27
|
+
request.log.error(error);
|
|
28
|
+
return reply.code(status).send({ error: status === 500 ? 'Внутренняя ошибка сервера' : errorMessage(error) });
|
|
29
|
+
});
|
|
30
|
+
if (cors) {
|
|
31
|
+
server.addHook('onRequest', async (_request, reply) => {
|
|
32
|
+
for (const [key, value] of Object.entries(corsHeaders))
|
|
33
|
+
reply.header(key, value);
|
|
34
|
+
});
|
|
35
|
+
server.options('/', async (_request, reply) => reply.code(204).send());
|
|
36
|
+
server.options('/*', async (_request, reply) => reply.code(204).send());
|
|
37
|
+
}
|
|
38
|
+
return server;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/server/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { OpenapiOptions } from '../openapi/options.js';
|
|
2
|
+
import type { NormalizedServerConfig } from './config.js';
|
|
3
|
+
/** Собирает параметры OpenAPI из настроек сервера без чтения базы или файлов.
|
|
4
|
+
* @example Конфигурация с files → { files: true, ... }.
|
|
5
|
+
*/
|
|
6
|
+
export declare function openapiOptions(config: NormalizedServerConfig): OpenapiOptions;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Собирает параметры OpenAPI из настроек сервера без чтения базы или файлов.
|
|
2
|
+
* @example Конфигурация с files → { files: true, ... }.
|
|
3
|
+
*/
|
|
4
|
+
export function openapiOptions(config) {
|
|
5
|
+
return {
|
|
6
|
+
files: config.files !== undefined,
|
|
7
|
+
auth: config.auth !== undefined,
|
|
8
|
+
host: config.server.host,
|
|
9
|
+
port: config.server.port,
|
|
10
|
+
pageSize: config.server.pageSize,
|
|
11
|
+
maxPageSize: config.server.maxPageSize,
|
|
12
|
+
info: config.openapi?.info,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=openapi-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-options.js","sourceRoot":"","sources":["../../../src/server/openapi-options.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAA8B;IAC3D,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS;QACjC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,SAAS;QAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QACxB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;QAChC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW;QACtC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI;KAC3B,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kollors/deep-json-server",
|
|
3
|
-
"version": "1.0.0-
|
|
4
|
-
"description": "JSON mock server with schema-driven REST, GraphQL,
|
|
3
|
+
"version": "1.0.0-beta.1",
|
|
4
|
+
"description": "JSON mock server with schema-driven REST, GraphQL, OpenAPI generation and file uploads",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
],
|
|
39
39
|
"scripts": {
|
|
40
40
|
"build": "node scripts/clean-dist.js && tsc && node scripts/prepare-dist.js",
|
|
41
|
-
"lint": "biome check .",
|
|
41
|
+
"lint": "biome check . --error-on-warnings",
|
|
42
42
|
"lint:fix": "biome check --write .",
|
|
43
43
|
"pack:check": "node scripts/check-package.js",
|
|
44
44
|
"prepack": "npm run build",
|