@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.
Files changed (79) hide show
  1. package/README.md +159 -127
  2. package/README.ru.md +159 -127
  3. package/dist/src/cli/index.js +14 -23
  4. package/dist/src/cli/index.js.map +1 -1
  5. package/dist/src/core/constants.d.ts +1 -1
  6. package/dist/src/core/constants.js +1 -1
  7. package/dist/src/core/constants.js.map +1 -1
  8. package/dist/src/core/engine.d.ts +3 -15
  9. package/dist/src/core/engine.js +10 -69
  10. package/dist/src/core/engine.js.map +1 -1
  11. package/dist/src/core/lifecycle/mutation.js +4 -4
  12. package/dist/src/core/lifecycle/mutation.js.map +1 -1
  13. package/dist/src/core/lifecycle/options.d.ts +15 -0
  14. package/dist/src/core/lifecycle/options.js +13 -0
  15. package/dist/src/core/lifecycle/options.js.map +1 -1
  16. package/dist/src/core/model.d.ts +1 -0
  17. package/dist/src/core/model.js +11 -0
  18. package/dist/src/core/model.js.map +1 -1
  19. package/dist/src/core/mutations/write.js +4 -0
  20. package/dist/src/core/mutations/write.js.map +1 -1
  21. package/dist/src/core/paths.js +1 -7
  22. package/dist/src/core/paths.js.map +1 -1
  23. package/dist/src/core/query/execute.d.ts +25 -0
  24. package/dist/src/core/query/execute.js +82 -0
  25. package/dist/src/core/query/execute.js.map +1 -0
  26. package/dist/src/core/query/filter.js +1 -1
  27. package/dist/src/core/query/filter.js.map +1 -1
  28. package/dist/src/core/query/options.js +2 -2
  29. package/dist/src/core/query/options.js.map +1 -1
  30. package/dist/src/core/records.d.ts +2 -1
  31. package/dist/src/core/records.js +5 -2
  32. package/dist/src/core/records.js.map +1 -1
  33. package/dist/src/files/disk-metadata.d.ts +9 -0
  34. package/dist/src/files/disk-metadata.js +44 -0
  35. package/dist/src/files/disk-metadata.js.map +1 -0
  36. package/dist/src/files/disk-paths.d.ts +15 -0
  37. package/dist/src/files/disk-paths.js +100 -0
  38. package/dist/src/files/disk-paths.js.map +1 -0
  39. package/dist/src/files/disk-store.js +21 -165
  40. package/dist/src/files/disk-store.js.map +1 -1
  41. package/dist/src/files/index.js +1 -1
  42. package/dist/src/files/index.js.map +1 -1
  43. package/dist/src/graphql/preflight.js +2 -0
  44. package/dist/src/graphql/preflight.js.map +1 -1
  45. package/dist/src/graphql/resolvers.js +7 -3
  46. package/dist/src/graphql/resolvers.js.map +1 -1
  47. package/dist/src/graphql/routes.js +4 -1
  48. package/dist/src/graphql/routes.js.map +1 -1
  49. package/dist/src/graphql/schema.js +5 -2
  50. package/dist/src/graphql/schema.js.map +1 -1
  51. package/dist/src/openapi/document.js +30 -19
  52. package/dist/src/openapi/document.js.map +1 -1
  53. package/dist/src/openapi/registry.d.ts +11 -0
  54. package/dist/src/openapi/registry.js +20 -0
  55. package/dist/src/openapi/registry.js.map +1 -0
  56. package/dist/src/rest/options.d.ts +11 -3
  57. package/dist/src/rest/options.js +15 -0
  58. package/dist/src/rest/options.js.map +1 -1
  59. package/dist/src/rest/projection.d.ts +15 -3
  60. package/dist/src/rest/projection.js +49 -15
  61. package/dist/src/rest/projection.js.map +1 -1
  62. package/dist/src/rest/routes.js +18 -7
  63. package/dist/src/rest/routes.js.map +1 -1
  64. package/dist/src/server/bootstrap.d.ts +7 -0
  65. package/dist/src/server/bootstrap.js +48 -0
  66. package/dist/src/server/bootstrap.js.map +1 -0
  67. package/dist/src/server/config.d.ts +2 -2
  68. package/dist/src/server/config.js +5 -5
  69. package/dist/src/server/config.js.map +1 -1
  70. package/dist/src/server/create.d.ts +1 -1
  71. package/dist/src/server/create.js +11 -85
  72. package/dist/src/server/create.js.map +1 -1
  73. package/dist/src/server/http.d.ts +12 -0
  74. package/dist/src/server/http.js +40 -0
  75. package/dist/src/server/http.js.map +1 -0
  76. package/dist/src/server/openapi-options.d.ts +6 -0
  77. package/dist/src/server/openapi-options.js +15 -0
  78. package/dist/src/server/openapi-options.js.map +1 -0
  79. package/package.json +3 -3
@@ -1,11 +1,8 @@
1
- import { AUTH_PATHS } from '../auth/contract.js';
2
- import { DomainError } from '../core/errors.js';
3
- import { domainStatus } from '../core/http-errors.js';
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(config) {
18
- if (arguments.length !== 1)
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, maxFileSize, pageSize, maxPageSize } = normalized.server;
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 = Fastify({ ajv: { customOptions: { coerceTypes: false, removeAdditional: false } }, logger });
57
- const originalListen = server.listen.bind(server);
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":"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"}
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-alpha.9",
4
- "description": "JSON mock server with schema-driven REST, GraphQL, nested queries and OpenAPI generation",
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",