@kollors/deep-json-server 1.0.0-alpha.8 → 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 (112) hide show
  1. package/README.md +279 -217
  2. package/README.ru.md +282 -220
  3. package/dist/index.d.ts +1 -2
  4. package/dist/src/auth/contract.d.ts +3 -2
  5. package/dist/src/auth/contract.js.map +1 -1
  6. package/dist/src/auth/service.js +1 -1
  7. package/dist/src/auth/service.js.map +1 -1
  8. package/dist/src/auth/store.d.ts +1 -1
  9. package/dist/src/auth/store.js.map +1 -1
  10. package/dist/src/cli/index.d.ts +2 -2
  11. package/dist/src/cli/index.js +59 -80
  12. package/dist/src/cli/index.js.map +1 -1
  13. package/dist/src/core/constants.d.ts +1 -1
  14. package/dist/src/core/constants.js +1 -1
  15. package/dist/src/core/constants.js.map +1 -1
  16. package/dist/src/core/database.d.ts +6 -11
  17. package/dist/src/core/database.js +2 -2
  18. package/dist/src/core/database.js.map +1 -1
  19. package/dist/src/core/engine.d.ts +3 -15
  20. package/dist/src/core/engine.js +10 -69
  21. package/dist/src/core/engine.js.map +1 -1
  22. package/dist/src/core/lifecycle/mutation.js +4 -4
  23. package/dist/src/core/lifecycle/mutation.js.map +1 -1
  24. package/dist/src/core/lifecycle/options.d.ts +15 -0
  25. package/dist/src/core/lifecycle/options.js +13 -0
  26. package/dist/src/core/lifecycle/options.js.map +1 -1
  27. package/dist/src/core/model.d.ts +17 -2
  28. package/dist/src/core/model.js +28 -7
  29. package/dist/src/core/model.js.map +1 -1
  30. package/dist/src/core/mutations/write.js +4 -0
  31. package/dist/src/core/mutations/write.js.map +1 -1
  32. package/dist/src/core/paths.d.ts +1 -1
  33. package/dist/src/core/paths.js +5 -5
  34. package/dist/src/core/paths.js.map +1 -1
  35. package/dist/src/core/query/execute.d.ts +25 -0
  36. package/dist/src/core/query/execute.js +82 -0
  37. package/dist/src/core/query/execute.js.map +1 -0
  38. package/dist/src/core/query/filter.js +1 -1
  39. package/dist/src/core/query/filter.js.map +1 -1
  40. package/dist/src/core/query/options.js +2 -2
  41. package/dist/src/core/query/options.js.map +1 -1
  42. package/dist/src/core/records.d.ts +2 -1
  43. package/dist/src/core/records.js +5 -2
  44. package/dist/src/core/records.js.map +1 -1
  45. package/dist/src/core/storage.d.ts +2 -0
  46. package/dist/src/core/storage.js +2 -0
  47. package/dist/src/core/storage.js.map +1 -0
  48. package/dist/src/files/contract.d.ts +6 -7
  49. package/dist/src/files/contract.js.map +1 -1
  50. package/dist/src/files/disk-metadata.d.ts +9 -0
  51. package/dist/src/files/disk-metadata.js +44 -0
  52. package/dist/src/files/disk-metadata.js.map +1 -0
  53. package/dist/src/files/disk-paths.d.ts +15 -0
  54. package/dist/src/files/disk-paths.js +100 -0
  55. package/dist/src/files/disk-paths.js.map +1 -0
  56. package/dist/src/files/disk-store.js +21 -165
  57. package/dist/src/files/disk-store.js.map +1 -1
  58. package/dist/src/files/index.d.ts +1 -1
  59. package/dist/src/files/index.js +5 -2
  60. package/dist/src/files/index.js.map +1 -1
  61. package/dist/src/files/memory-store.js +3 -3
  62. package/dist/src/files/memory-store.js.map +1 -1
  63. package/dist/src/graphql/generate.d.ts +3 -2
  64. package/dist/src/graphql/generate.js +3 -1
  65. package/dist/src/graphql/generate.js.map +1 -1
  66. package/dist/src/graphql/preflight.js +2 -0
  67. package/dist/src/graphql/preflight.js.map +1 -1
  68. package/dist/src/graphql/resolvers.js +7 -3
  69. package/dist/src/graphql/resolvers.js.map +1 -1
  70. package/dist/src/graphql/routes.js +4 -1
  71. package/dist/src/graphql/routes.js.map +1 -1
  72. package/dist/src/graphql/schema.js +5 -2
  73. package/dist/src/graphql/schema.js.map +1 -1
  74. package/dist/src/openapi/document.js +30 -19
  75. package/dist/src/openapi/document.js.map +1 -1
  76. package/dist/src/openapi/generate.js +3 -1
  77. package/dist/src/openapi/generate.js.map +1 -1
  78. package/dist/src/openapi/options.d.ts +0 -2
  79. package/dist/src/openapi/registry.d.ts +11 -0
  80. package/dist/src/openapi/registry.js +20 -0
  81. package/dist/src/openapi/registry.js.map +1 -0
  82. package/dist/src/rest/options.d.ts +11 -3
  83. package/dist/src/rest/options.js +15 -0
  84. package/dist/src/rest/options.js.map +1 -1
  85. package/dist/src/rest/projection.d.ts +15 -3
  86. package/dist/src/rest/projection.js +49 -15
  87. package/dist/src/rest/projection.js.map +1 -1
  88. package/dist/src/rest/routes.js +18 -7
  89. package/dist/src/rest/routes.js.map +1 -1
  90. package/dist/src/server/bootstrap.d.ts +7 -0
  91. package/dist/src/server/bootstrap.js +48 -0
  92. package/dist/src/server/bootstrap.js.map +1 -0
  93. package/dist/src/server/config.d.ts +28 -30
  94. package/dist/src/server/config.js +82 -169
  95. package/dist/src/server/config.js.map +1 -1
  96. package/dist/src/server/create.d.ts +3 -5
  97. package/dist/src/server/create.js +24 -89
  98. package/dist/src/server/create.js.map +1 -1
  99. package/dist/src/server/features.d.ts +0 -11
  100. package/dist/src/server/features.js +0 -20
  101. package/dist/src/server/features.js.map +1 -1
  102. package/dist/src/server/http.d.ts +12 -0
  103. package/dist/src/server/http.js +40 -0
  104. package/dist/src/server/http.js.map +1 -0
  105. package/dist/src/server/model.d.ts +6 -0
  106. package/dist/src/server/model.js +14 -0
  107. package/dist/src/server/model.js.map +1 -0
  108. package/dist/src/server/openapi-options.d.ts +6 -0
  109. package/dist/src/server/openapi-options.js +15 -0
  110. package/dist/src/server/openapi-options.js.map +1 -0
  111. package/dist/src/server/public.d.ts +1 -2
  112. package/package.json +3 -3
@@ -1,29 +1,28 @@
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 { resolveFeatures, validateEndpoints } from './features.js';
1
+ import { registerConfiguredModules } from './bootstrap.js';
2
+ import { normalizeServerConfig } from './config.js';
3
+ import { createHttpServer } from './http.js';
4
+ import { configuredModel } from './model.js';
5
+ import { openapiOptions } from './openapi-options.js';
8
6
  const CORS_HEADERS = {
9
7
  'Access-Control-Allow-Headers': 'Content-Type',
10
8
  'Access-Control-Allow-Methods': 'DELETE, GET, OPTIONS, PATCH, POST, PUT',
11
9
  'Access-Control-Allow-Origin': '*',
12
10
  };
13
11
  /** Проверяет настройки и создаёт интерфейс запуска и генерации схем; сетевой порт ещё не открывает.
14
- * @example await createServer({ database: { data: { notes: [] } } }) → объект с fastify(), openapi(), graphql().
12
+ * @example await createServer({ storage: 'memory', database: { source: { notes: [] } } }) → объект с fastify(), openapi(), graphql().
15
13
  */
16
- export async function createServer(config, features = {}) {
17
- return createConfiguredServer(normalizeServerConfig(config), features);
14
+ export async function createServer(...args) {
15
+ if (args.length !== 1)
16
+ throw new Error('createServer accepts only a configuration object');
17
+ const [config] = args;
18
+ return createConfiguredServer(normalizeServerConfig(config));
18
19
  }
19
20
  /** Собирает сервер из нормализованных настроек; хранилища открываются при инициализации HTTP-экземпляра.
20
21
  * @example Нормализованные настройки → Promise<ServerFacade>; listen() затем открывает сетевой порт.
21
22
  */
22
- export async function createConfiguredServer(normalized, features = {}) {
23
- const enabled = resolveFeatures(normalized, features);
24
- const { loadModel, inferModel } = await import('../core/model.js');
25
- const recordSettings = { timestamps: normalized.database.timestamps, softDelete: normalized.database.softDelete, auth: enabled.auth };
26
- const explicitModel = await loadModel(normalized.database.schema, recordSettings);
23
+ export async function createConfiguredServer(normalized) {
24
+ const enabled = { auth: normalized.auth !== undefined, files: normalized.files !== undefined };
25
+ const explicitModel = await configuredModel(normalized);
27
26
  const { default: Fastify } = await import('fastify');
28
27
  const corsHeaders = { ...CORS_HEADERS };
29
28
  if (enabled.files) {
@@ -32,84 +31,18 @@ export async function createConfiguredServer(normalized, features = {}) {
32
31
  }
33
32
  if (enabled.auth)
34
33
  corsHeaders['Access-Control-Allow-Headers'] += ', Authorization';
35
- const { cors, logger, maxFileSize, pageSize, maxPageSize } = normalized.server;
36
- const openapi = async () => (await import('../openapi/generate.js')).openapiFromModel(explicitModel, {
37
- files: enabled.files,
38
- ...recordSettings,
39
- pageSize,
40
- maxPageSize,
41
- info: normalized.openapi.info,
42
- host: normalized.server.host,
43
- port: normalized.server.port,
44
- });
34
+ const { cors, logger } = normalized.server;
35
+ const openapi = async () => {
36
+ if (!normalized.openapi)
37
+ throw new Error('OpenAPI is not configured');
38
+ return (await import('../openapi/generate.js')).openapiFromModel(explicitModel, openapiOptions(normalized));
39
+ };
45
40
  let instance;
46
41
  const getFastify = () => {
47
42
  if (instance)
48
43
  return instance;
49
- const server = Fastify({ ajv: { customOptions: { coerceTypes: false, removeAdditional: false } }, logger });
50
- const originalListen = server.listen.bind(server);
51
- const defaults = { host: normalized.server.host, port: normalized.server.port };
52
- const listen = (optionsOrCallback, callback) => {
53
- if (typeof optionsOrCallback === 'function') {
54
- originalListen(defaults, optionsOrCallback);
55
- return;
56
- }
57
- if (callback) {
58
- originalListen({ ...defaults, ...optionsOrCallback }, callback);
59
- return;
60
- }
61
- return originalListen({ ...defaults, ...optionsOrCallback });
62
- };
63
- server.listen = listen;
64
- server.setErrorHandler((error, request, reply) => {
65
- const candidate = error instanceof DomainError ? domainStatus[error.code] : isObject(error) ? error.statusCode : undefined;
66
- const status = typeof candidate === 'number' && Number.isInteger(candidate) && candidate >= 400 && candidate <= 599 ? candidate : 500;
67
- if (status === 500)
68
- request.log.error(error);
69
- return reply.code(status).send({ error: status === 500 ? 'Внутренняя ошибка сервера' : errorMessage(error) });
70
- });
71
- if (cors) {
72
- server.addHook('onRequest', async (_request, reply) => {
73
- for (const [key, value] of Object.entries(corsHeaders))
74
- reply.header(key, value);
75
- });
76
- server.options('/', async (_request, reply) => reply.code(204).send());
77
- server.options('/*', async (_request, reply) => reply.code(204).send());
78
- }
79
- server.register(async (app) => {
80
- const [{ createDatabaseStore }, { Engine }, { registerRestRoutes }] = await Promise.all([import('../core/database.js'), import('../core/engine.js'), import('../rest/routes.js')]);
81
- const keys = explicitModel ? new Map(explicitModel.entities.map((e) => [e.collection, e.primary])) : undefined;
82
- const store = await createDatabaseStore(normalized.database, keys);
83
- const model = explicitModel ?? inferModel(store.database.data, recordSettings);
84
- const engine = new Engine(store, model, pageSize, maxPageSize);
85
- engine.validateData(store.database.data);
86
- const graphqlPath = normalized.graphql.endpoint;
87
- const openapiPath = normalized.openapi.endpoint;
88
- validateEndpoints(model.entities.map((entity) => entity.collection), [...(enabled.graphql ? [graphqlPath] : []), ...(enabled.openapi ? [openapiPath] : []), ...(enabled.auth ? Object.values(AUTH_PATHS) : [])]);
89
- const auth = enabled.auth && normalized.auth ? await (await import('../auth/service.js')).createAuthService(normalized.auth) : undefined;
90
- if (auth) {
91
- app.addHook('onClose', async () => auth.close());
92
- const { registerAuthRoutes } = await import('../auth/routes.js');
93
- registerAuthRoutes(app, auth);
94
- }
95
- const authenticate = auth ? (header) => auth.me(header) : undefined;
96
- registerRestRoutes(app, engine, authenticate);
97
- if (enabled.graphql) {
98
- const [{ registerGraphqlRoutes }, { buildGraphql }] = await Promise.all([import('../graphql/routes.js'), import('../graphql/schema.js')]);
99
- registerGraphqlRoutes(app, buildGraphql(model), engine, graphqlPath, authenticate);
100
- }
101
- if (enabled.openapi) {
102
- const document = await openapi();
103
- document.servers = [{ url: '/' }];
104
- app.get(openapiPath, async () => document);
105
- }
106
- const files = normalized.files;
107
- if (enabled.files && files) {
108
- const { createFileStore, registerFileRoutes } = await import('../files/index.js');
109
- const protectedPaths = inputPaths({ database: normalized.database, auth: normalized.auth }, '.', configSourcePath(normalized));
110
- registerFileRoutes(app, { getStore: () => createFileStore(files, protectedPaths), maxFileSize });
111
- }
112
- });
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));
113
46
  instance = server;
114
47
  return server;
115
48
  };
@@ -117,6 +50,8 @@ export async function createConfiguredServer(normalized, features = {}) {
117
50
  fastify: getFastify,
118
51
  openapi,
119
52
  graphql: async () => {
53
+ if (!normalized.graphql)
54
+ throw new Error('GraphQL is not configured');
120
55
  return (await import('../graphql/generate.js')).graphqlFromModel(explicitModel);
121
56
  },
122
57
  };
@@ -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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"}
@@ -1,14 +1,3 @@
1
- import type { NormalizedServerConfig } from './config.js';
2
- export interface ServerFeatures {
3
- auth?: boolean;
4
- files?: boolean;
5
- graphql?: boolean;
6
- openapi?: boolean;
7
- }
8
- /** Вычисляет включённые модули с учётом явных переопределений и проверяет обязательные настройки.
9
- * @example Пустые секции и переопределение { graphql: true } → graphql: true, остальные флаги false.
10
- */
11
- export declare function resolveFeatures(config: NormalizedServerConfig, features?: ServerFeatures): Required<ServerFeatures>;
12
1
  /** Проверяет, что пути не повторяются и не перекрывают коллекции или файловые маршруты.
13
2
  * @example validateEndpoints(['users'], ['/users/1']) → ошибка; ['users'], ['/api'] → undefined.
14
3
  */
@@ -1,23 +1,3 @@
1
- import { isObject } from '../core/utils.js';
2
- /** Вычисляет включённые модули с учётом явных переопределений и проверяет обязательные настройки.
3
- * @example Пустые секции и переопределение { graphql: true } → graphql: true, остальные флаги false.
4
- */
5
- export function resolveFeatures(config, features = {}) {
6
- if (!isObject(features) || Object.entries(features).some(([key, value]) => !['files', 'graphql', 'openapi', 'auth'].includes(key) || typeof value !== 'boolean'))
7
- throw new Error('features supports boolean files, graphql, openapi and auth keys');
8
- const overrides = features;
9
- const resolved = {
10
- auth: overrides.auth ?? config.auth != null,
11
- files: overrides.files ?? config.files != null,
12
- graphql: overrides.graphql ?? config.graphql.enabled ?? false,
13
- openapi: overrides.openapi ?? config.openapi.enabled ?? false,
14
- };
15
- if (resolved.auth && !config.auth)
16
- throw new Error('Укажите config.auth.users для включения auth');
17
- if (resolved.files && !config.files)
18
- throw new Error('Для файловых маршрутов укажите секцию config.files');
19
- return resolved;
20
- }
21
1
  /** Проверяет, что пути не повторяются и не перекрывают коллекции или файловые маршруты.
22
2
  * @example validateEndpoints(['users'], ['/users/1']) → ошибка; ['users'], ['/api'] → undefined.
23
3
  */
@@ -1 +1 @@
1
- {"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/server/features.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQ5C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAA8B,EAAE,QAAQ,GAAmB,EAAE;IAC3F,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC;QAC9J,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,MAAM,SAAS,GAAmB,QAAQ,CAAC;IAC3C,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI;QAC3C,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI;QAC9C,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK;QAC7D,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK;KAC9D,CAAC;IACF,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACnG,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC3G,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAqB,EAAE,SAAmB;IAC1E,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5F,KAAK,MAAM,QAAQ,IAAI,SAAS;QAC9B,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,UAAU,EAAE,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;YAC9I,MAAM,IAAI,KAAK,CAAC,iDAAiD,QAAQ,EAAE,CAAC,CAAC;AACnF,CAAC"}
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/server/features.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAqB,EAAE,SAAmB;IAC1E,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5F,KAAK,MAAM,QAAQ,IAAI,SAAS;QAC9B,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,UAAU,EAAE,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;YAC9I,MAAM,IAAI,KAAK,CAAC,iDAAiD,QAAQ,EAAE,CAAC,CAAC;AACnF,CAAC"}
@@ -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 { Model } from '../core/model.js';
2
+ import type { NormalizedServerConfig } from './config.js';
3
+ /** Загружает схему один раз для заданного объекта настроек; база и учётные записи не читаются.
4
+ * @example Повторные вызовы с одним config → тот же Promise<Model | undefined>.
5
+ */
6
+ export declare function configuredModel(config: NormalizedServerConfig): Promise<Model | undefined>;
@@ -0,0 +1,14 @@
1
+ const models = new WeakMap();
2
+ /** Загружает схему один раз для заданного объекта настроек; база и учётные записи не читаются.
3
+ * @example Повторные вызовы с одним config → тот же Promise<Model | undefined>.
4
+ */
5
+ export function configuredModel(config) {
6
+ let model = models.get(config);
7
+ if (!model) {
8
+ const api = [...(config.openapi ? ['openapi'] : []), ...(config.graphql ? ['graphql'] : [])];
9
+ model = import('../core/model.js').then(({ loadModel }) => loadModel(config.database.schema, { auth: config.auth !== undefined, api }));
10
+ models.set(config, model);
11
+ }
12
+ return model;
13
+ }
14
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/server/model.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,GAAG,IAAI,OAAO,EAAsD,CAAC;AACjF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAA8B;IAC5D,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,GAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5H,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxI,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -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"}
@@ -1,3 +1,2 @@
1
- export type { AuthConfig, DatabaseConfig, DeepJsonServerConfig, FilesConfig, GraphqlConfig, MemoryFile, OpenapiConfig, ServerConfig } from './config.js';
1
+ export type { AuthConfig, DatabaseConfig, DeepJsonServerConfig, FilesConfig, GraphqlConfig, MemoryFile, OpenapiConfig, ServerConfig, Storage } from './config.js';
2
2
  export { createServer, type ServerFacade } from './create.js';
3
- export type { ServerFeatures } from './features.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kollors/deep-json-server",
3
- "version": "1.0.0-alpha.8",
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",