@kollors/deep-json-server 1.0.0-alpha.6 → 1.0.0-alpha.8

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 (237) hide show
  1. package/README.md +373 -230
  2. package/README.ru.md +370 -227
  3. package/dist/bin/deep-json-server.js +1 -1
  4. package/dist/bin/deep-json-server.js.map +1 -1
  5. package/dist/index.d.ts +10 -8
  6. package/dist/index.js +3 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/src/auth/contract.d.ts +6 -2
  9. package/dist/src/auth/contract.js +8 -1
  10. package/dist/src/auth/contract.js.map +1 -1
  11. package/dist/src/auth/input.d.ts +18 -0
  12. package/dist/src/auth/input.js +34 -0
  13. package/dist/src/auth/input.js.map +1 -0
  14. package/dist/src/auth/password.d.ts +13 -0
  15. package/dist/src/auth/password.js +17 -1
  16. package/dist/src/auth/password.js.map +1 -1
  17. package/dist/src/auth/routes.d.ts +3 -0
  18. package/dist/src/auth/routes.js +6 -0
  19. package/dist/src/auth/routes.js.map +1 -1
  20. package/dist/src/auth/service.d.ts +64 -4
  21. package/dist/src/auth/service.js +167 -61
  22. package/dist/src/auth/service.js.map +1 -1
  23. package/dist/src/auth/store.d.ts +26 -0
  24. package/dist/src/auth/store.js +82 -0
  25. package/dist/src/auth/store.js.map +1 -0
  26. package/dist/src/cli/index.d.ts +7 -0
  27. package/dist/src/{cli.js → cli/index.js} +31 -15
  28. package/dist/src/cli/index.js.map +1 -0
  29. package/dist/src/core/config-values.d.ts +28 -0
  30. package/dist/src/core/config-values.js +53 -0
  31. package/dist/src/core/config-values.js.map +1 -0
  32. package/dist/src/{constants.d.ts → core/constants.d.ts} +1 -1
  33. package/dist/src/{constants.js → core/constants.js} +1 -1
  34. package/dist/src/core/constants.js.map +1 -0
  35. package/dist/src/core/database.d.ts +53 -0
  36. package/dist/src/{database.js → core/database.js} +23 -3
  37. package/dist/src/core/database.js.map +1 -0
  38. package/dist/src/core/engine.d.ts +65 -0
  39. package/dist/src/{engine.js → core/engine.js} +114 -59
  40. package/dist/src/core/engine.js.map +1 -0
  41. package/dist/src/{errors.d.ts → core/errors.d.ts} +4 -1
  42. package/dist/src/core/errors.js +12 -0
  43. package/dist/src/core/errors.js.map +1 -0
  44. package/dist/src/core/http-errors.d.ts +9 -0
  45. package/dist/src/core/http-errors.js +15 -0
  46. package/dist/src/core/http-errors.js.map +1 -0
  47. package/dist/src/core/lifecycle/mutation.d.ts +49 -0
  48. package/dist/src/core/lifecycle/mutation.js +170 -0
  49. package/dist/src/core/lifecycle/mutation.js.map +1 -0
  50. package/dist/src/core/lifecycle/options.d.ts +21 -0
  51. package/dist/src/core/lifecycle/options.js +19 -0
  52. package/dist/src/core/lifecycle/options.js.map +1 -0
  53. package/dist/src/core/model.d.ts +131 -0
  54. package/dist/src/{model.js → core/model.js} +106 -10
  55. package/dist/src/core/model.js.map +1 -0
  56. package/dist/src/{mutations → core/mutations}/write.d.ts +4 -4
  57. package/dist/src/{mutations → core/mutations}/write.js +14 -4
  58. package/dist/src/core/mutations/write.js.map +1 -0
  59. package/dist/src/core/operations.d.ts +33 -0
  60. package/dist/src/core/operations.js +10 -0
  61. package/dist/src/core/operations.js.map +1 -0
  62. package/dist/src/core/pagination.d.ts +10 -0
  63. package/dist/src/core/pagination.js +13 -0
  64. package/dist/src/core/pagination.js.map +1 -0
  65. package/dist/src/core/paths.d.ts +16 -0
  66. package/dist/src/{paths.js → core/paths.js} +16 -0
  67. package/dist/src/core/paths.js.map +1 -0
  68. package/dist/src/core/query/contract.d.ts +6 -0
  69. package/dist/src/{query → core/query}/contract.js +3 -0
  70. package/dist/src/core/query/contract.js.map +1 -0
  71. package/dist/src/core/query/filter.d.ts +6 -0
  72. package/dist/src/{query → core/query}/filter.js +18 -4
  73. package/dist/src/core/query/filter.js.map +1 -0
  74. package/dist/src/core/query/options.d.ts +30 -0
  75. package/dist/src/{query → core/query}/options.js +12 -0
  76. package/dist/src/core/query/options.js.map +1 -0
  77. package/dist/src/core/records.d.ts +46 -0
  78. package/dist/src/{records.js → core/records.js} +24 -3
  79. package/dist/src/core/records.js.map +1 -0
  80. package/dist/src/core/relation-metadata.d.ts +15 -0
  81. package/dist/src/{relation-metadata.js → core/relation-metadata.js} +7 -1
  82. package/dist/src/core/relation-metadata.js.map +1 -0
  83. package/dist/src/core/types.d.ts +10 -0
  84. package/dist/src/{types.js.map → core/types.js.map} +1 -1
  85. package/dist/src/core/utils.d.ts +56 -0
  86. package/dist/src/core/utils.js +102 -0
  87. package/dist/src/core/utils.js.map +1 -0
  88. package/dist/src/files/contract.d.ts +33 -0
  89. package/dist/src/files/contract.js +25 -3
  90. package/dist/src/files/contract.js.map +1 -1
  91. package/dist/src/files/disk-store.d.ts +3 -0
  92. package/dist/src/files/disk-store.js +25 -18
  93. package/dist/src/files/disk-store.js.map +1 -1
  94. package/dist/src/files/http.d.ts +8 -3
  95. package/dist/src/files/http.js +9 -0
  96. package/dist/src/files/http.js.map +1 -1
  97. package/dist/src/files/index.d.ts +4 -3
  98. package/dist/src/files/index.js +3 -1
  99. package/dist/src/files/index.js.map +1 -1
  100. package/dist/src/files/memory-store.d.ts +4 -1
  101. package/dist/src/files/memory-store.js +21 -15
  102. package/dist/src/files/memory-store.js.map +1 -1
  103. package/dist/src/files/routes.d.ts +3 -0
  104. package/dist/src/files/routes.js +25 -1
  105. package/dist/src/files/routes.js.map +1 -1
  106. package/dist/src/files/streams.d.ts +5 -0
  107. package/dist/src/files/streams.js +20 -0
  108. package/dist/src/files/streams.js.map +1 -0
  109. package/dist/src/graphql/entry.d.ts +12 -3
  110. package/dist/src/graphql/entry.js +12 -2
  111. package/dist/src/graphql/entry.js.map +1 -1
  112. package/dist/src/graphql/generate.d.ts +11 -0
  113. package/dist/src/graphql/generate.js +17 -0
  114. package/dist/src/graphql/generate.js.map +1 -0
  115. package/dist/src/graphql/preflight.d.ts +4 -1
  116. package/dist/src/graphql/preflight.js +3 -0
  117. package/dist/src/graphql/preflight.js.map +1 -1
  118. package/dist/src/graphql/resolvers.d.ts +10 -2
  119. package/dist/src/graphql/resolvers.js +8 -2
  120. package/dist/src/graphql/resolvers.js.map +1 -1
  121. package/dist/src/graphql/routes.d.ts +6 -2
  122. package/dist/src/graphql/routes.js +6 -3
  123. package/dist/src/graphql/routes.js.map +1 -1
  124. package/dist/src/graphql/schema.d.ts +6 -0
  125. package/dist/src/{graphql.js → graphql/schema.js} +20 -14
  126. package/dist/src/graphql/schema.js.map +1 -0
  127. package/dist/src/graphql/write.d.ts +3 -0
  128. package/dist/src/graphql/write.js +3 -0
  129. package/dist/src/graphql/write.js.map +1 -1
  130. package/dist/src/openapi/auth.d.ts +13 -0
  131. package/dist/src/openapi/auth.js +139 -0
  132. package/dist/src/openapi/auth.js.map +1 -0
  133. package/dist/src/openapi/document.d.ts +5 -2
  134. package/dist/src/openapi/document.js +41 -42
  135. package/dist/src/openapi/document.js.map +1 -1
  136. package/dist/src/openapi/entry.d.ts +14 -3
  137. package/dist/src/openapi/entry.js +12 -1
  138. package/dist/src/openapi/entry.js.map +1 -1
  139. package/dist/src/openapi/files.d.ts +6 -0
  140. package/dist/src/{files/openapi.js → openapi/files.js} +6 -3
  141. package/dist/src/openapi/files.js.map +1 -0
  142. package/dist/src/openapi/generate.d.ts +19 -0
  143. package/dist/src/openapi/generate.js +39 -0
  144. package/dist/src/openapi/generate.js.map +1 -0
  145. package/dist/src/openapi/helpers.d.ts +10 -1
  146. package/dist/src/openapi/helpers.js +9 -0
  147. package/dist/src/openapi/helpers.js.map +1 -1
  148. package/dist/src/openapi/options.d.ts +20 -0
  149. package/dist/src/openapi/options.js +13 -0
  150. package/dist/src/openapi/options.js.map +1 -0
  151. package/dist/src/{types.d.ts → openapi/types.d.ts} +1 -10
  152. package/dist/src/openapi/types.js +2 -0
  153. package/dist/src/openapi/types.js.map +1 -0
  154. package/dist/src/openapi/write.d.ts +5 -0
  155. package/dist/src/openapi/write.js +12 -0
  156. package/dist/src/openapi/write.js.map +1 -0
  157. package/dist/src/rest/options.d.ts +11 -2
  158. package/dist/src/rest/options.js +12 -3
  159. package/dist/src/rest/options.js.map +1 -1
  160. package/dist/src/rest/projection.d.ts +10 -4
  161. package/dist/src/rest/projection.js +10 -4
  162. package/dist/src/rest/projection.js.map +1 -1
  163. package/dist/src/rest/routes.d.ts +6 -2
  164. package/dist/src/rest/routes.js +12 -11
  165. package/dist/src/rest/routes.js.map +1 -1
  166. package/dist/src/server/config.d.ts +76 -0
  167. package/dist/src/{config.js → server/config.js} +71 -74
  168. package/dist/src/server/config.js.map +1 -0
  169. package/dist/src/server/create.d.ts +18 -0
  170. package/dist/src/{server.js → server/create.js} +33 -28
  171. package/dist/src/server/create.js.map +1 -0
  172. package/dist/src/server/features.d.ts +15 -0
  173. package/dist/src/{features.js → server/features.js} +8 -2
  174. package/dist/src/server/features.js.map +1 -0
  175. package/dist/src/server/public.d.ts +3 -3
  176. package/dist/src/server/public.js +1 -1
  177. package/dist/src/server/public.js.map +1 -1
  178. package/package.json +1 -1
  179. package/dist/src/auth/openapi.d.ts +0 -10
  180. package/dist/src/auth/openapi.js +0 -62
  181. package/dist/src/auth/openapi.js.map +0 -1
  182. package/dist/src/cli.d.ts +0 -4
  183. package/dist/src/cli.js.map +0 -1
  184. package/dist/src/config.d.ts +0 -86
  185. package/dist/src/config.js.map +0 -1
  186. package/dist/src/constants.js.map +0 -1
  187. package/dist/src/database.d.ts +0 -20
  188. package/dist/src/database.js.map +0 -1
  189. package/dist/src/engine.d.ts +0 -36
  190. package/dist/src/engine.js.map +0 -1
  191. package/dist/src/errors.js +0 -9
  192. package/dist/src/errors.js.map +0 -1
  193. package/dist/src/features.d.ts +0 -9
  194. package/dist/src/features.js.map +0 -1
  195. package/dist/src/files/openapi.d.ts +0 -3
  196. package/dist/src/files/openapi.js.map +0 -1
  197. package/dist/src/graphql/public.d.ts +0 -3
  198. package/dist/src/graphql/public.js +0 -11
  199. package/dist/src/graphql/public.js.map +0 -1
  200. package/dist/src/graphql.d.ts +0 -3
  201. package/dist/src/graphql.js.map +0 -1
  202. package/dist/src/http/errors.d.ts +0 -6
  203. package/dist/src/http/errors.js +0 -3
  204. package/dist/src/http/errors.js.map +0 -1
  205. package/dist/src/model.d.ts +0 -72
  206. package/dist/src/model.js.map +0 -1
  207. package/dist/src/mutations/write.js.map +0 -1
  208. package/dist/src/openapi/index.d.ts +0 -7
  209. package/dist/src/openapi/index.js +0 -28
  210. package/dist/src/openapi/index.js.map +0 -1
  211. package/dist/src/openapi/public.d.ts +0 -18
  212. package/dist/src/openapi/public.js +0 -20
  213. package/dist/src/openapi/public.js.map +0 -1
  214. package/dist/src/pagination.d.ts +0 -7
  215. package/dist/src/pagination.js +0 -12
  216. package/dist/src/pagination.js.map +0 -1
  217. package/dist/src/paths.d.ts +0 -7
  218. package/dist/src/paths.js.map +0 -1
  219. package/dist/src/query/contract.d.ts +0 -3
  220. package/dist/src/query/contract.js.map +0 -1
  221. package/dist/src/query/filter.d.ts +0 -3
  222. package/dist/src/query/filter.js.map +0 -1
  223. package/dist/src/query/options.d.ts +0 -18
  224. package/dist/src/query/options.js.map +0 -1
  225. package/dist/src/records.d.ts +0 -25
  226. package/dist/src/records.js.map +0 -1
  227. package/dist/src/relation-metadata.d.ts +0 -9
  228. package/dist/src/relation-metadata.js.map +0 -1
  229. package/dist/src/schema.d.ts +0 -8
  230. package/dist/src/schema.js +0 -13
  231. package/dist/src/schema.js.map +0 -1
  232. package/dist/src/server.d.ts +0 -12
  233. package/dist/src/server.js.map +0 -1
  234. package/dist/src/utils.d.ts +0 -12
  235. package/dist/src/utils.js +0 -58
  236. package/dist/src/utils.js.map +0 -1
  237. /package/dist/src/{types.js → core/types.js} +0 -0
@@ -0,0 +1,20 @@
1
+ export type OpenapiInfo = {
2
+ title: string;
3
+ version: string;
4
+ description?: string;
5
+ };
6
+ /** Проверяет метаданные спецификации и возвращает независимую копию.
7
+ * @example normalizeOpenapiInfo({ title: 'API', version: '1' }) → { title: 'API', version: '1' }; description: 42 → ошибка.
8
+ */
9
+ export declare function normalizeOpenapiInfo(value: unknown): OpenapiInfo | undefined;
10
+ export interface OpenapiOptions {
11
+ timestamps?: boolean;
12
+ softDelete?: boolean;
13
+ auth?: boolean;
14
+ files?: boolean;
15
+ host?: string;
16
+ port?: number;
17
+ pageSize?: number;
18
+ maxPageSize?: number;
19
+ info?: OpenapiInfo;
20
+ }
@@ -0,0 +1,13 @@
1
+ import { getObject } from '../core/config-values.js';
2
+ /** Проверяет метаданные спецификации и возвращает независимую копию.
3
+ * @example normalizeOpenapiInfo({ title: 'API', version: '1' }) → { title: 'API', version: '1' }; description: 42 → ошибка.
4
+ */
5
+ export function normalizeOpenapiInfo(value) {
6
+ const info = getObject(value, 'openapi.info');
7
+ if (!info)
8
+ return undefined;
9
+ if (typeof info.title !== 'string' || typeof info.version !== 'string' || (info.description !== undefined && typeof info.description !== 'string'))
10
+ throw new Error('Invalid OpenAPI info');
11
+ return structuredClone(info);
12
+ }
13
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/openapi/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC5L,OAAO,eAAe,CAAC,IAAI,CAAgB,CAAC;AAC9C,CAAC"}
@@ -1,11 +1,4 @@
1
- export type JsonPrimitive = boolean | number | string | null;
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/openapi/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { OpenapiDocument } from './types.js';
2
+ /** Сохраняет документ в YAML, создавая родительские каталоги.
3
+ * @example writeOpenapi(document, './out/api.yaml') → Promise<void>; результат записан в файл.
4
+ */
5
+ export declare const writeOpenapi: (document: OpenapiDocument, outputPath: string) => Promise<void>;
@@ -0,0 +1,12 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { stringify } from 'yaml';
4
+ /** Сохраняет документ в YAML, создавая родительские каталоги.
5
+ * @example writeOpenapi(document, './out/api.yaml') → Promise<void>; результат записан в файл.
6
+ */
7
+ export const writeOpenapi = async (document, outputPath) => {
8
+ const resolvedOutputPath = resolve(outputPath);
9
+ await mkdir(dirname(resolvedOutputPath), { recursive: true });
10
+ await writeFile(resolvedOutputPath, stringify(document, { aliasDuplicateObjects: false, lineWidth: 0 }), 'utf8');
11
+ };
12
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/openapi/write.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;AAGjC;;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"}
@@ -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;
@@ -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]) || Object.keys(scope[1]).some((key) => !['where', 'order', 'pager'].includes(key)))
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":"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"}
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
- // Schemaless REST includes raw fields absent from the inferred model.
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":"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"}
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
- export declare function registerRestRoutes(server: FastifyInstance, engine: Engine): void;
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;
@@ -1,7 +1,11 @@
1
- import { domainError } from '../errors.js';
1
+ import { domainError } from '../core/errors.js';
2
+ import { MUTATIONS } from '../core/operations.js';
2
3
  import { parseRestOptions } from './options.js';
3
4
  import { project, validateRest } from './projection.js';
4
- export function registerRestRoutes(server, engine) {
5
+ /** Регистрирует чтение коллекций и операции создания, замены, изменения и удаления записей.
6
+ * @example После регистрации GET / → { resources: [...] }; функция возвращает undefined.
7
+ */
8
+ export function registerRestRoutes(server, engine, authenticate) {
5
9
  server.get('/', async () => ({ resources: engine.model.entities.map((entity) => entity.collection) }));
6
10
  for (const initial of engine.model.entities) {
7
11
  const path = `/${initial.collection}`;
@@ -24,22 +28,19 @@ export function registerRestRoutes(server, engine) {
24
28
  throw domainError('NOT_FOUND', 'Record not found');
25
29
  return project(engine, ref, options.scope, plans);
26
30
  });
27
- for (const [method, mode] of [
28
- ['POST', 'create'],
29
- ['PUT', 'replace'],
30
- ['PATCH', 'update'],
31
- ['DELETE', 'delete'],
32
- ]) {
31
+ for (const { method, mode, hasKey, status } of MUTATIONS) {
33
32
  server.route({
34
33
  method,
35
- url: mode === 'create' ? path : itemPath,
34
+ url: hasKey ? itemPath : path,
36
35
  handler: async (request, reply) => {
36
+ const actor = authenticate ? () => authenticate(request.headers.authorization) : undefined;
37
+ actor?.();
37
38
  const options = parseRestOptions(request.query);
38
39
  const result = await engine.mutate(initial, mode, request.params[initial.primary], request.body, (ref) => {
39
40
  const plans = validateRest(engine, ref.entity, options);
40
41
  return project(engine, ref, options.scope, plans);
41
- });
42
- return reply.code(mode === 'create' ? 201 : 200).send(result);
42
+ }, actor);
43
+ return reply.code(status).send(result);
43
44
  },
44
45
  });
45
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/rest/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/rest/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
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
+ import { type OpenapiInfo } from '../openapi/options.js';
5
+ export type { AuthConfig } from '../auth/contract.js';
6
+ import type { FastifyServerOptions } from 'fastify';
7
+ import type { ModelSchema } from '../core/model.js';
8
+ export type DatabaseSchema = ModelSchema;
9
+ export type { DatabaseConfig } from '../core/database.js';
10
+ export type { FilesConfig, MemoryFile } from '../files/contract.js';
11
+ export interface OpenapiConfig {
12
+ enabled?: boolean;
13
+ endpoint?: string;
14
+ path?: string;
15
+ info?: OpenapiInfo;
16
+ }
17
+ export interface GraphqlConfig {
18
+ path?: string;
19
+ enabled?: boolean;
20
+ endpoint?: string;
21
+ }
22
+ export interface ServerConfig {
23
+ cors?: boolean;
24
+ host?: string;
25
+ logger?: FastifyServerOptions['logger'];
26
+ maxFileSize?: number;
27
+ maxPageSize?: number;
28
+ pageSize?: number;
29
+ port?: number;
30
+ }
31
+ export interface DeepJsonServerConfig {
32
+ database: DatabaseConfig;
33
+ files?: FilesConfig;
34
+ auth?: AuthConfig;
35
+ openapi?: OpenapiConfig;
36
+ graphql?: GraphqlConfig;
37
+ server?: ServerConfig;
38
+ }
39
+ export interface NormalizedServerConfig {
40
+ database: DatabaseConfig;
41
+ files?: FilesConfig;
42
+ auth?: AuthConfig;
43
+ openapi: OpenapiConfig & Required<Pick<OpenapiConfig, 'enabled' | 'endpoint'>>;
44
+ graphql: GraphqlConfig & Required<Pick<GraphqlConfig, 'enabled' | 'endpoint'>>;
45
+ server: Required<ServerConfig>;
46
+ }
47
+ /** Проверяет настройки и разрешает относительные пути, не читая содержимое файлов.
48
+ * @example При directoryPath = '/tmp' путь './db.json' → '/tmp/db.json'.
49
+ */
50
+ export declare const normalizeServerConfig: (config: DeepJsonServerConfig, directoryPath?: string) => NormalizedServerConfig;
51
+ /** Загружает default-экспорт ES-модуля, обходя кеш повторного импорта; выполняет код модуля.
52
+ * @example Файл /tmp/config.mjs с export default {} → { config: {}, directory: '/tmp', path: '/tmp/config.mjs' }.
53
+ */
54
+ export declare function readConfigModule(configPath: string): Promise<{
55
+ config: Record<string, unknown>;
56
+ directory: string;
57
+ path: string;
58
+ }>;
59
+ /** Возвращает сохранённый путь исходного файла для данного объекта настроек.
60
+ * @example Для объекта без зарегистрированного источника → undefined.
61
+ */
62
+ export declare const configSourcePath: (config: NormalizedServerConfig) => string | undefined;
63
+ /** Нормализует настройки и запоминает путь их источника во внутренней таблице.
64
+ * @example configure(config, '/tmp', '/tmp/config.mjs') → настройки; configSourcePath(result) → '/tmp/config.mjs'.
65
+ */
66
+ export declare function configure(config: unknown, directory: string, sourcePath?: string): NormalizedServerConfig;
67
+ /** Выбирает настройки для указанных форматов экспорта и подставляет пустые данные вместо чтения базы.
68
+ * @example formats = ['graphql'] → настройки генерации GraphQL с database.data = {}.
69
+ */
70
+ export declare function configureGeneration(source: Record<string, unknown>, formats: string[], directory: string, sourcePath: string, overrides: {
71
+ host?: string;
72
+ port?: number;
73
+ files?: boolean;
74
+ timestamps?: boolean;
75
+ softDelete?: boolean;
76
+ }): NormalizedServerConfig;