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

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 (211) hide show
  1. package/README.md +344 -230
  2. package/README.ru.md +341 -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 +3 -2
  9. package/dist/src/auth/contract.js.map +1 -1
  10. package/dist/src/auth/password.d.ts +9 -0
  11. package/dist/src/auth/password.js +12 -0
  12. package/dist/src/auth/password.js.map +1 -1
  13. package/dist/src/auth/routes.d.ts +3 -0
  14. package/dist/src/auth/routes.js +3 -0
  15. package/dist/src/auth/routes.js.map +1 -1
  16. package/dist/src/auth/service.d.ts +21 -0
  17. package/dist/src/auth/service.js +38 -7
  18. package/dist/src/auth/service.js.map +1 -1
  19. package/dist/src/cli/index.d.ts +7 -0
  20. package/dist/src/{cli.js → cli/index.js} +32 -14
  21. package/dist/src/cli/index.js.map +1 -0
  22. package/dist/src/{constants.d.ts → core/constants.d.ts} +1 -1
  23. package/dist/src/{constants.js → core/constants.js} +1 -1
  24. package/dist/src/core/constants.js.map +1 -0
  25. package/dist/src/core/database.d.ts +50 -0
  26. package/dist/src/{database.js → core/database.js} +21 -1
  27. package/dist/src/core/database.js.map +1 -0
  28. package/dist/src/core/engine.d.ts +64 -0
  29. package/dist/src/{engine.js → core/engine.js} +64 -18
  30. package/dist/src/core/engine.js.map +1 -0
  31. package/dist/src/{errors.d.ts → core/errors.d.ts} +4 -1
  32. package/dist/src/core/errors.js +12 -0
  33. package/dist/src/core/errors.js.map +1 -0
  34. package/dist/src/core/http-errors.d.ts +9 -0
  35. package/dist/src/core/http-errors.js +15 -0
  36. package/dist/src/core/http-errors.js.map +1 -0
  37. package/dist/src/core/lifecycle/mutation.d.ts +49 -0
  38. package/dist/src/core/lifecycle/mutation.js +170 -0
  39. package/dist/src/core/lifecycle/mutation.js.map +1 -0
  40. package/dist/src/core/lifecycle/options.d.ts +20 -0
  41. package/dist/src/core/lifecycle/options.js +21 -0
  42. package/dist/src/core/lifecycle/options.js.map +1 -0
  43. package/dist/src/core/model.d.ts +130 -0
  44. package/dist/src/{model.js → core/model.js} +106 -10
  45. package/dist/src/core/model.js.map +1 -0
  46. package/dist/src/{mutations → core/mutations}/write.d.ts +3 -2
  47. package/dist/src/{mutations → core/mutations}/write.js +14 -4
  48. package/dist/src/core/mutations/write.js.map +1 -0
  49. package/dist/src/core/pagination.d.ts +10 -0
  50. package/dist/src/{pagination.js → core/pagination.js} +3 -0
  51. package/dist/src/core/pagination.js.map +1 -0
  52. package/dist/src/core/paths.d.ts +16 -0
  53. package/dist/src/{paths.js → core/paths.js} +12 -0
  54. package/dist/src/core/paths.js.map +1 -0
  55. package/dist/src/core/query/contract.d.ts +6 -0
  56. package/dist/src/{query → core/query}/contract.js +3 -0
  57. package/dist/src/core/query/contract.js.map +1 -0
  58. package/dist/src/core/query/filter.d.ts +6 -0
  59. package/dist/src/{query → core/query}/filter.js +18 -4
  60. package/dist/src/core/query/filter.js.map +1 -0
  61. package/dist/src/core/query/options.d.ts +30 -0
  62. package/dist/src/{query → core/query}/options.js +12 -0
  63. package/dist/src/core/query/options.js.map +1 -0
  64. package/dist/src/core/records.d.ts +46 -0
  65. package/dist/src/{records.js → core/records.js} +24 -3
  66. package/dist/src/core/records.js.map +1 -0
  67. package/dist/src/core/relation-metadata.d.ts +15 -0
  68. package/dist/src/{relation-metadata.js → core/relation-metadata.js} +7 -1
  69. package/dist/src/core/relation-metadata.js.map +1 -0
  70. package/dist/src/core/types.d.ts +10 -0
  71. package/dist/src/{types.js.map → core/types.js.map} +1 -1
  72. package/dist/src/core/utils.d.ts +56 -0
  73. package/dist/src/core/utils.js +102 -0
  74. package/dist/src/core/utils.js.map +1 -0
  75. package/dist/src/files/contract.d.ts +33 -0
  76. package/dist/src/files/contract.js +25 -3
  77. package/dist/src/files/contract.js.map +1 -1
  78. package/dist/src/files/disk-store.d.ts +3 -0
  79. package/dist/src/files/disk-store.js +27 -3
  80. package/dist/src/files/disk-store.js.map +1 -1
  81. package/dist/src/files/http.d.ts +8 -3
  82. package/dist/src/files/http.js +9 -0
  83. package/dist/src/files/http.js.map +1 -1
  84. package/dist/src/files/index.d.ts +4 -3
  85. package/dist/src/files/index.js +3 -1
  86. package/dist/src/files/index.js.map +1 -1
  87. package/dist/src/files/memory-store.d.ts +4 -1
  88. package/dist/src/files/memory-store.js +8 -2
  89. package/dist/src/files/memory-store.js.map +1 -1
  90. package/dist/src/files/routes.d.ts +3 -0
  91. package/dist/src/files/routes.js +25 -1
  92. package/dist/src/files/routes.js.map +1 -1
  93. package/dist/src/graphql/entry.d.ts +2 -2
  94. package/dist/src/graphql/entry.js.map +1 -1
  95. package/dist/src/graphql/lazy.d.ts +10 -0
  96. package/dist/src/graphql/lazy.js +13 -0
  97. package/dist/src/graphql/lazy.js.map +1 -0
  98. package/dist/src/graphql/preflight.d.ts +4 -1
  99. package/dist/src/graphql/preflight.js +3 -0
  100. package/dist/src/graphql/preflight.js.map +1 -1
  101. package/dist/src/graphql/public.d.ts +10 -2
  102. package/dist/src/graphql/public.js +10 -4
  103. package/dist/src/graphql/public.js.map +1 -1
  104. package/dist/src/graphql/resolvers.d.ts +10 -2
  105. package/dist/src/graphql/resolvers.js +8 -2
  106. package/dist/src/graphql/resolvers.js.map +1 -1
  107. package/dist/src/graphql/routes.d.ts +6 -2
  108. package/dist/src/graphql/routes.js +6 -3
  109. package/dist/src/graphql/routes.js.map +1 -1
  110. package/dist/src/graphql/schema.d.ts +6 -0
  111. package/dist/src/{graphql.js → graphql/schema.js} +14 -11
  112. package/dist/src/graphql/schema.js.map +1 -0
  113. package/dist/src/graphql/write.d.ts +3 -0
  114. package/dist/src/graphql/write.js +3 -0
  115. package/dist/src/graphql/write.js.map +1 -1
  116. package/dist/src/openapi/auth.d.ts +13 -0
  117. package/dist/src/{auth/openapi.js → openapi/auth.js} +15 -5
  118. package/dist/src/openapi/auth.js.map +1 -0
  119. package/dist/src/openapi/document.d.ts +5 -2
  120. package/dist/src/openapi/document.js +29 -33
  121. package/dist/src/openapi/document.js.map +1 -1
  122. package/dist/src/openapi/entry.d.ts +2 -2
  123. package/dist/src/openapi/entry.js.map +1 -1
  124. package/dist/src/openapi/files.d.ts +6 -0
  125. package/dist/src/{files/openapi.js → openapi/files.js} +6 -3
  126. package/dist/src/openapi/files.js.map +1 -0
  127. package/dist/src/openapi/helpers.d.ts +10 -1
  128. package/dist/src/openapi/helpers.js +9 -0
  129. package/dist/src/openapi/helpers.js.map +1 -1
  130. package/dist/src/openapi/index.d.ts +7 -1
  131. package/dist/src/openapi/index.js +14 -5
  132. package/dist/src/openapi/index.js.map +1 -1
  133. package/dist/src/openapi/lazy.d.ts +11 -0
  134. package/dist/src/openapi/lazy.js +13 -0
  135. package/dist/src/openapi/lazy.js.map +1 -0
  136. package/dist/src/openapi/public.d.ts +10 -2
  137. package/dist/src/openapi/public.js +9 -3
  138. package/dist/src/openapi/public.js.map +1 -1
  139. package/dist/src/{types.d.ts → openapi/types.d.ts} +1 -10
  140. package/dist/src/openapi/types.js +2 -0
  141. package/dist/src/openapi/types.js.map +1 -0
  142. package/dist/src/rest/options.d.ts +11 -2
  143. package/dist/src/rest/options.js +12 -3
  144. package/dist/src/rest/options.js.map +1 -1
  145. package/dist/src/rest/projection.d.ts +10 -4
  146. package/dist/src/rest/projection.js +10 -4
  147. package/dist/src/rest/projection.js.map +1 -1
  148. package/dist/src/rest/routes.d.ts +6 -2
  149. package/dist/src/rest/routes.js +7 -3
  150. package/dist/src/rest/routes.js.map +1 -1
  151. package/dist/src/server/config.d.ts +79 -0
  152. package/dist/src/{config.js → server/config.js} +57 -19
  153. package/dist/src/server/config.js.map +1 -0
  154. package/dist/src/server/create.d.ts +18 -0
  155. package/dist/src/{server.js → server/create.js} +31 -23
  156. package/dist/src/server/create.js.map +1 -0
  157. package/dist/src/server/features.d.ts +15 -0
  158. package/dist/src/{features.js → server/features.js} +8 -2
  159. package/dist/src/server/features.js.map +1 -0
  160. package/dist/src/server/public.d.ts +3 -3
  161. package/dist/src/server/public.js +1 -1
  162. package/dist/src/server/public.js.map +1 -1
  163. package/package.json +1 -1
  164. package/dist/src/auth/openapi.d.ts +0 -10
  165. package/dist/src/auth/openapi.js.map +0 -1
  166. package/dist/src/cli.d.ts +0 -4
  167. package/dist/src/cli.js.map +0 -1
  168. package/dist/src/config.d.ts +0 -86
  169. package/dist/src/config.js.map +0 -1
  170. package/dist/src/constants.js.map +0 -1
  171. package/dist/src/database.d.ts +0 -20
  172. package/dist/src/database.js.map +0 -1
  173. package/dist/src/engine.d.ts +0 -36
  174. package/dist/src/engine.js.map +0 -1
  175. package/dist/src/errors.js +0 -9
  176. package/dist/src/errors.js.map +0 -1
  177. package/dist/src/features.d.ts +0 -9
  178. package/dist/src/features.js.map +0 -1
  179. package/dist/src/files/openapi.d.ts +0 -3
  180. package/dist/src/files/openapi.js.map +0 -1
  181. package/dist/src/graphql.d.ts +0 -3
  182. package/dist/src/graphql.js.map +0 -1
  183. package/dist/src/http/errors.d.ts +0 -6
  184. package/dist/src/http/errors.js +0 -3
  185. package/dist/src/http/errors.js.map +0 -1
  186. package/dist/src/model.d.ts +0 -72
  187. package/dist/src/model.js.map +0 -1
  188. package/dist/src/mutations/write.js.map +0 -1
  189. package/dist/src/pagination.d.ts +0 -7
  190. package/dist/src/pagination.js.map +0 -1
  191. package/dist/src/paths.d.ts +0 -7
  192. package/dist/src/paths.js.map +0 -1
  193. package/dist/src/query/contract.d.ts +0 -3
  194. package/dist/src/query/contract.js.map +0 -1
  195. package/dist/src/query/filter.d.ts +0 -3
  196. package/dist/src/query/filter.js.map +0 -1
  197. package/dist/src/query/options.d.ts +0 -18
  198. package/dist/src/query/options.js.map +0 -1
  199. package/dist/src/records.d.ts +0 -25
  200. package/dist/src/records.js.map +0 -1
  201. package/dist/src/relation-metadata.d.ts +0 -9
  202. package/dist/src/relation-metadata.js.map +0 -1
  203. package/dist/src/schema.d.ts +0 -8
  204. package/dist/src/schema.js +0 -13
  205. package/dist/src/schema.js.map +0 -1
  206. package/dist/src/server.d.ts +0 -12
  207. package/dist/src/server.js.map +0 -1
  208. package/dist/src/utils.d.ts +0 -12
  209. package/dist/src/utils.js +0 -58
  210. package/dist/src/utils.js.map +0 -1
  211. /package/dist/src/{types.js → core/types.js} +0 -0
@@ -0,0 +1,20 @@
1
+ export interface RecordOptions {
2
+ timestamps?: boolean;
3
+ softDelete?: boolean;
4
+ auth?: boolean;
5
+ }
6
+ export interface Actor {
7
+ id: string;
8
+ isAdmin?: boolean;
9
+ }
10
+ export type Authenticate = (authorization: unknown) => Actor;
11
+ export declare const DELETION_META = "djsDeletion";
12
+ export declare const AUDIT_FIELDS: readonly ['createdAt', 'updatedAt', 'deletedAt', 'createdById', 'updatedById', 'deletedById'];
13
+ /** Проверяет логические флаги и заменяет отсутствующие значения на false.
14
+ * @example recordOptions({ softDelete: true }) → { timestamps: false, softDelete: true, auth: false }.
15
+ */
16
+ export declare function recordOptions(options?: RecordOptions): Required<RecordOptions>;
17
+ /** Ищет условие deletedAt на текущем уровне и в логических ветках, не заходя в поля связанных объектов.
18
+ * @example mentionsDeletedAt({ or: [{ deletedAt: { ne: null } }] }) → true; { user: { deletedAt: {} } } → false.
19
+ */
20
+ export declare function mentionsDeletedAt(where: unknown): boolean;
@@ -0,0 +1,21 @@
1
+ import { isObject } from '../utils.js';
2
+ export const DELETION_META = 'djsDeletion';
3
+ export const AUDIT_FIELDS = ['createdAt', 'updatedAt', 'deletedAt', 'createdById', 'updatedById', 'deletedById'];
4
+ /** Проверяет логические флаги и заменяет отсутствующие значения на false.
5
+ * @example recordOptions({ softDelete: true }) → { timestamps: false, softDelete: true, auth: false }.
6
+ */
7
+ export function recordOptions(options = {}) {
8
+ for (const key of ['timestamps', 'softDelete', 'auth'])
9
+ if (options[key] !== undefined && typeof options[key] !== 'boolean')
10
+ throw new Error(`${key} must be boolean`);
11
+ return { timestamps: options.timestamps ?? false, softDelete: options.softDelete ?? false, auth: options.auth ?? false };
12
+ }
13
+ /** Ищет условие deletedAt на текущем уровне и в логических ветках, не заходя в поля связанных объектов.
14
+ * @example mentionsDeletedAt({ or: [{ deletedAt: { ne: null } }] }) → true; { user: { deletedAt: {} } } → false.
15
+ */
16
+ export function mentionsDeletedAt(where) {
17
+ if (!isObject(where))
18
+ return false;
19
+ return Object.hasOwn(where, 'deletedAt') || ['and', 'or'].some((key) => Array.isArray(where[key]) && where[key].some(mentionsDeletedAt)) || mentionsDeletedAt(where.not);
20
+ }
21
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../src/core/lifecycle/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAYvC,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAU,CAAC;AAC1H;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAO,GAAkB,EAAE;IACvD,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,CAAU;QAAE,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,kBAAkB,CAAC,CAAC;IAChL,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;AAC3H,CAAC;AACD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC3K,CAAC"}
@@ -0,0 +1,130 @@
1
+ import { type RecordOptions } from './lifecycle/options.js';
2
+ import type { DatabaseData, JsonValue } from './types.js';
3
+ export interface Field {
4
+ type: string;
5
+ description?: string;
6
+ example?: JsonValue;
7
+ required?: boolean;
8
+ nullable?: boolean;
9
+ default?: JsonValue;
10
+ enum?: JsonValue[];
11
+ primary?: boolean;
12
+ generated?: 'uuid' | 'increment';
13
+ readOnly?: boolean;
14
+ writeOnly?: boolean;
15
+ minLength?: number;
16
+ maxLength?: number;
17
+ pattern?: string;
18
+ format?: 'date' | 'date-time' | 'email' | 'uri' | 'uuid';
19
+ minimum?: number;
20
+ maximum?: number;
21
+ source?: string;
22
+ target?: string;
23
+ onDelete?: 'restrict' | 'cascade';
24
+ }
25
+ export interface EntityDefinition {
26
+ timestamps?: boolean;
27
+ softDelete?: boolean;
28
+ collection: string;
29
+ api?: ('openapi' | 'graphql')[];
30
+ fields: Record<string, Field>;
31
+ }
32
+ export type ModelSchema = Record<string, EntityDefinition>;
33
+ export interface Node extends Field {
34
+ system?: boolean;
35
+ internal?: boolean;
36
+ softDelete?: boolean;
37
+ path: string;
38
+ base: string;
39
+ many: boolean;
40
+ children: Record<string, Node>;
41
+ relation?: Entity;
42
+ implicit?: boolean;
43
+ mixed?: boolean;
44
+ relationKey?: boolean;
45
+ }
46
+ export interface Entity {
47
+ timestamps: boolean;
48
+ softDelete: boolean;
49
+ name: string;
50
+ collection: string;
51
+ api: ('openapi' | 'graphql')[];
52
+ primary: string;
53
+ fields: Record<string, Node>;
54
+ root: Node;
55
+ }
56
+ export interface Model {
57
+ options: Required<RecordOptions>;
58
+ entities: Entity[];
59
+ byName: Map<string, Entity>;
60
+ byCollection: Map<string, Entity>;
61
+ explicit: boolean;
62
+ }
63
+ export type ValidationSchema = Record<string, unknown>;
64
+ /** Разбивает путь по точкам и проверяет допустимость каждого имени.
65
+ * @example pathParts('profile.name') → ['profile', 'name']; pathParts('a..b') → ошибка.
66
+ */
67
+ export declare const pathParts: (path: string) => string[];
68
+ /** Находит самый длинный префикс пути среди ключей объекта, учитывая границы сегментов.
69
+ * @example bindingFor({ a: {}, 'a.b': {} }, 'a.b.id') → 'a.b'; bindingFor({ a: {} }, 'abc.id') → undefined.
70
+ */
71
+ export declare function bindingFor(bindings: Record<string, unknown>, path: string): string | undefined;
72
+ /** Проверяет, что все сегменты пути объявлены и доступны для записи, включая родительские объекты.
73
+ * @example Для поля name без ограничений canWriteKey(entity, 'name') → true; для первичного ключа → false.
74
+ */
75
+ export declare function canWriteKey(entity: Entity, path: string): boolean;
76
+ /** Распознаёт обратную связь: источник совпадает с первичным ключом, а целевой путь отличается от первичного ключа цели.
77
+ * @example При source = 'id', target = 'authorId' и первичных ключах id → true.
78
+ */
79
+ export declare function isReverseRelation(entity: Entity, node: Node): boolean;
80
+ /** Собирает значения по вложенному пути, проходя через массивы; отсутствующие значения и null пропускает.
81
+ * @example readPath({ rows: [{ id: 1 }, { id: 2 }] }, 'rows.id') → [1, 2].
82
+ */
83
+ export declare const readPath: (value: unknown, path: string | string[]) => unknown[];
84
+ /** Возвращает последний сегмент пути поля.
85
+ * @example childName({ path: 'profile.name', … }) → 'name'.
86
+ */
87
+ export declare const childName: (node: Node) => string;
88
+ /** Для связи возвращает целевую сущность и её корень; обычный узел сохраняет без изменений.
89
+ * @example canonicalNode(author, { relation: book }) → [book, book.root].
90
+ * @example canonicalNode(author, author.root) → [author, author.root].
91
+ */
92
+ export declare const canonicalNode: (entity: Entity, node: Node) => [Entity, Node];
93
+ /** Соединяет имя сущности и путь поля, заменяя точки подчёркиваниями.
94
+ * @example nodeName({ name: 'User', … }, { path: 'profile.name', … }) → 'User_profile_name'.
95
+ */
96
+ export declare const nodeName: (entity: Entity, node: Node) => string;
97
+ /** Переводит первую букву имени сущности в нижний регистр.
98
+ * @example operationName({ name: 'UserProfile', … }) → 'userProfile'.
99
+ */
100
+ export declare const operationName: (entity: Entity) => string;
101
+ /** Загружает описание из объекта или JSON-файла, проверяет поля и сопоставляет связи.
102
+ * @example loadModel(undefined) → Promise<undefined>; корректное описание → Promise<Model>.
103
+ */
104
+ export declare function loadModel(source: unknown, settings?: RecordOptions): Promise<Model | undefined>;
105
+ /** Определяет доступность поля для выбранного режима записи, учитывая защищённые дочерние поля.
106
+ * @example writable({ readOnly: true, … }, 'update') → false.
107
+ */
108
+ export declare function writable(node: Node, mode: InputMode, relations?: boolean): boolean;
109
+ /** Проверяет наличие явной модели и доступность выбранного формата для её связей.
110
+ * @example assertApi(undefined, 'graphql') → ошибка; согласованная модель → undefined.
111
+ */
112
+ export declare function assertApi(model: Model | undefined, api: 'graphql' | 'openapi'): asserts model is Model;
113
+ /** Строит схему проверки значения с ограничениями, массивом и допустимостью null.
114
+ * @example Для строкового узла без ограничений valueSchema(node) → { type: 'string' }.
115
+ */
116
+ export declare function valueSchema(node: Node): ValidationSchema;
117
+ export type InputMode = 'stored' | 'create' | 'replace' | 'update';
118
+ /** Строит схему объекта для выбранного режима; при частичном обновлении корневые поля необязательны.
119
+ * @example Для пустого узла → { type: 'object', properties: {}, additionalProperties: false }.
120
+ */
121
+ export declare function objectSchema(node: Node, mode: InputMode, root?: boolean, relationSchema?: (node: Node) => ValidationSchema): ValidationSchema;
122
+ export declare function relationInputSchema(node: Node, object?: ValidationSchema): ValidationSchema;
123
+ /** Проверяет запись по схеме выбранного режима и выбрасывает исключение при несоответствии.
124
+ * @example Обязательное строковое name: { name: 'Анна' } → undefined; { name: 2 } → ошибка.
125
+ */
126
+ export declare function validateRecord(entity: Entity, value: unknown, mode: InputMode, relations?: boolean): void;
127
+ /** Выводит поля и связи из значений коллекций, не меняя переданные записи.
128
+ * @example inferModel({ users: [{ id: '1', name: 'Анна' }] }) → модель со строковыми id и name.
129
+ */
130
+ export declare function inferModel(database: DatabaseData, settings?: RecordOptions): Model;
@@ -2,6 +2,7 @@ import { readFile } from 'node:fs/promises';
2
2
  import { Ajv } from 'ajv';
3
3
  import addFormats from 'ajv-formats';
4
4
  import { domainError } from './errors.js';
5
+ import { AUDIT_FIELDS, DELETION_META, recordOptions } from './lifecycle/options.js';
5
6
  import { getRelationMetadata } from './relation-metadata.js';
6
7
  import { assertKnownKeys, isObject, isSafeKey, singularize, toPascalCase } from './utils.js';
7
8
  const createValidator = () => {
@@ -34,13 +35,18 @@ const FIELD_KEYS = new Set([
34
35
  'target',
35
36
  'onDelete',
36
37
  ]);
38
+ /** Разбивает путь по точкам и проверяет допустимость каждого имени.
39
+ * @example pathParts('profile.name') → ['profile', 'name']; pathParts('a..b') → ошибка.
40
+ */
37
41
  export const pathParts = (path) => {
38
42
  const parts = path.split('.');
39
43
  if (parts.some((p) => !NAME.test(p) || !isSafeKey(p)))
40
44
  throw domainError('INVALID_INPUT', `Invalid field path: ${path}`);
41
45
  return parts;
42
46
  };
43
- /** Finds the nearest physical object containing a relation key. */
47
+ /** Находит самый длинный префикс пути среди ключей объекта, учитывая границы сегментов.
48
+ * @example bindingFor({ a: {}, 'a.b': {} }, 'a.b.id') → 'a.b'; bindingFor({ a: {} }, 'abc.id') → undefined.
49
+ */
44
50
  export function bindingFor(bindings, path) {
45
51
  let nearest;
46
52
  for (const prefix of Object.keys(bindings))
@@ -48,6 +54,9 @@ export function bindingFor(bindings, path) {
48
54
  nearest = prefix;
49
55
  return nearest;
50
56
  }
57
+ /** Проверяет, что все сегменты пути объявлены и доступны для записи, включая родительские объекты.
58
+ * @example Для поля name без ограничений canWriteKey(entity, 'name') → true; для первичного ключа → false.
59
+ */
51
60
  export function canWriteKey(entity, path) {
52
61
  const parts = pathParts(path);
53
62
  return parts.every((_, index) => {
@@ -55,9 +64,15 @@ export function canWriteKey(entity, path) {
55
64
  return field && !field.primary && !field.generated && !field.readOnly;
56
65
  });
57
66
  }
67
+ /** Распознаёт обратную связь: источник совпадает с первичным ключом, а целевой путь отличается от первичного ключа цели.
68
+ * @example При source = 'id', target = 'authorId' и первичных ключах id → true.
69
+ */
58
70
  export function isReverseRelation(entity, node) {
59
71
  return node.source === entity.primary || (!canWriteKey(entity, node.source) && canWriteKey(node.relation, node.target));
60
72
  }
73
+ /** Собирает значения по вложенному пути, проходя через массивы; отсутствующие значения и null пропускает.
74
+ * @example readPath({ rows: [{ id: 1 }, { id: 2 }] }, 'rows.id') → [1, 2].
75
+ */
61
76
  export const readPath = (value, path) => {
62
77
  const parts = typeof path === 'string' ? pathParts(path) : path;
63
78
  if (!parts.length)
@@ -66,8 +81,22 @@ export const readPath = (value, path) => {
66
81
  return value.flatMap((v) => readPath(v, parts));
67
82
  return isObject(value) && Object.hasOwn(value, parts[0]) ? readPath(value[parts[0]], parts.slice(1)) : [];
68
83
  };
84
+ /** Возвращает последний сегмент пути поля.
85
+ * @example childName({ path: 'profile.name', … }) → 'name'.
86
+ */
69
87
  export const childName = (node) => node.path.split('.').at(-1);
88
+ /** Для связи возвращает целевую сущность и её корень; обычный узел сохраняет без изменений.
89
+ * @example canonicalNode(author, { relation: book }) → [book, book.root].
90
+ * @example canonicalNode(author, author.root) → [author, author.root].
91
+ */
92
+ export const canonicalNode = (entity, node) => (node.relation ? [node.relation, node.relation.root] : [entity, node]);
93
+ /** Соединяет имя сущности и путь поля, заменяя точки подчёркиваниями.
94
+ * @example nodeName({ name: 'User', … }, { path: 'profile.name', … }) → 'User_profile_name'.
95
+ */
70
96
  export const nodeName = (entity, node) => (node.path ? `${entity.name}_${node.path.replaceAll('.', '_')}` : entity.name);
97
+ /** Переводит первую букву имени сущности в нижний регистр.
98
+ * @example operationName({ name: 'UserProfile', … }) → 'userProfile'.
99
+ */
71
100
  export const operationName = (entity) => entity.name[0].toLowerCase() + entity.name.slice(1);
72
101
  const newNode = (path, field) => ({ ...field, path, base: field.type.replace(/\[\]$/, ''), many: field.type.endsWith('[]'), children: Object.create(null) });
73
102
  function addField(entity, path, field, implicit = false) {
@@ -91,6 +120,25 @@ function addField(entity, path, field, implicit = false) {
91
120
  entity.fields[path] = node;
92
121
  return node;
93
122
  }
123
+ function systemFields(entity, options) {
124
+ const names = [
125
+ ...(entity.timestamps ? ['createdAt', 'updatedAt'] : []),
126
+ DELETION_META,
127
+ ...(entity.softDelete ? ['deletedAt'] : []),
128
+ ...(options.auth ? ['createdById', 'updatedById', ...(entity.softDelete ? ['deletedById'] : [])] : []),
129
+ ];
130
+ entity.root.softDelete = entity.softDelete;
131
+ for (const name of names) {
132
+ if (entity.fields[name])
133
+ throw new Error(`Reserved system field ${entity.name}.${name}`);
134
+ const node = addField(entity, name, { type: 'string', readOnly: true, nullable: true, ...(name.endsWith('At') ? { format: 'date-time' } : {}) });
135
+ node.system = true;
136
+ if (name === DELETION_META) {
137
+ node.internal = true;
138
+ node.writeOnly = true;
139
+ }
140
+ }
141
+ }
94
142
  function checkField(path, field) {
95
143
  if (!isObject(field))
96
144
  throw new Error(`Field ${path} must be an object`);
@@ -139,7 +187,11 @@ function checkField(path, field) {
139
187
  if (typeof field.minLength === 'number' && typeof field.maxLength === 'number' && field.minLength > field.maxLength)
140
188
  throw new Error(`${path}: minLength exceeds maxLength`);
141
189
  }
142
- export async function loadModel(source) {
190
+ /** Загружает описание из объекта или JSON-файла, проверяет поля и сопоставляет связи.
191
+ * @example loadModel(undefined) → Promise<undefined>; корректное описание → Promise<Model>.
192
+ */
193
+ export async function loadModel(source, settings = {}) {
194
+ const options = recordOptions(settings);
143
195
  if (source === undefined)
144
196
  return undefined;
145
197
  const schema = typeof source === 'string' ? JSON.parse(await readFile(source, 'utf8')) : structuredClone(source);
@@ -148,11 +200,11 @@ export async function loadModel(source) {
148
200
  throw new Error('Model schema must be a nonempty object');
149
201
  if ('$schema' in schema || '$info' in schema)
150
202
  throw new Error('Legacy $schema/$info format is no longer supported');
151
- const model = { entities: [], byName: new Map(), byCollection: new Map(), explicit: true };
203
+ const model = { entities: [], byName: new Map(), byCollection: new Map(), explicit: true, options };
152
204
  for (const [name, definition] of Object.entries(schema)) {
153
205
  if (!NAME.test(name) || !isSafeKey(name) || PRIMITIVES.has(name) || !isObject(definition))
154
206
  throw new Error(`Invalid model ${name}`);
155
- assertKnownKeys(definition, new Set(['collection', 'api', 'fields']), name);
207
+ assertKnownKeys(definition, new Set(['collection', 'api', 'fields', 'timestamps', 'softDelete']), name);
156
208
  if (typeof definition.collection !== 'string' || !/^[A-Za-z][A-Za-z0-9_-]*$/.test(definition.collection) || !isSafeKey(definition.collection))
157
209
  throw new Error(`Invalid collection for ${name}`);
158
210
  if (model.byCollection.has(definition.collection))
@@ -162,7 +214,17 @@ export async function loadModel(source) {
162
214
  throw new Error(`Invalid api for ${name}`);
163
215
  if (!isObject(definition.fields))
164
216
  throw new Error(`${name}.fields must be an object`);
165
- const entity = { name, collection: definition.collection, api, primary: '', fields: Object.create(null), root: newNode('', { type: 'object' }) };
217
+ const flags = recordOptions({ timestamps: definition.timestamps, softDelete: definition.softDelete });
218
+ const entity = {
219
+ timestamps: definition.timestamps === undefined ? options.timestamps : flags.timestamps,
220
+ softDelete: definition.softDelete === undefined ? options.softDelete : flags.softDelete,
221
+ name,
222
+ collection: definition.collection,
223
+ api,
224
+ primary: '',
225
+ fields: Object.create(null),
226
+ root: newNode('', { type: 'object' }),
227
+ };
166
228
  for (const [path, field] of Object.entries(definition.fields).sort(([a], [b]) => a.split('.').length - b.split('.').length)) {
167
229
  checkField(path, field);
168
230
  addField(entity, path, field);
@@ -175,6 +237,7 @@ export async function loadModel(source) {
175
237
  }
176
238
  if (!entity.primary)
177
239
  throw new Error(`${name}: primary key is required`);
240
+ systemFields(entity, options);
178
241
  entityValidators.set(entity, ajv);
179
242
  model.entities.push(entity);
180
243
  model.byName.set(name, entity);
@@ -254,6 +317,9 @@ export async function loadModel(source) {
254
317
  }
255
318
  return model;
256
319
  }
320
+ /** Определяет доступность поля для выбранного режима записи, учитывая защищённые дочерние поля.
321
+ * @example writable({ readOnly: true, … }, 'update') → false.
322
+ */
257
323
  export function writable(node, mode, relations = false) {
258
324
  if (node.relation)
259
325
  return relations;
@@ -262,6 +328,9 @@ export function writable(node, mode, relations = false) {
262
328
  const children = Object.values(node.children);
263
329
  return node.base !== 'object' || children.length === 0 || children.some((child) => writable(child, mode, relations));
264
330
  }
331
+ /** Проверяет наличие явной модели и доступность выбранного формата для её связей.
332
+ * @example assertApi(undefined, 'graphql') → ошибка; согласованная модель → undefined.
333
+ */
265
334
  export function assertApi(model, api) {
266
335
  if (!model?.explicit)
267
336
  throw new Error(`${api} requires an explicit model schema`);
@@ -270,6 +339,9 @@ export function assertApi(model, api) {
270
339
  if (node.relation && !node.relation.api.includes(api))
271
340
  throw new Error(`${entity.name}.${node.path}: ${node.relation.name} does not enable ${api}`);
272
341
  }
342
+ /** Строит схему проверки значения с ограничениями, массивом и допустимостью null.
343
+ * @example Для строкового узла без ограничений valueSchema(node) → { type: 'string' }.
344
+ */
273
345
  export function valueSchema(node) {
274
346
  let schema = node.base === 'object' ? objectSchema(node, 'stored') : { type: node.base };
275
347
  for (const key of ['minLength', 'maxLength', 'pattern', 'format', 'minimum', 'maximum', 'enum'])
@@ -281,6 +353,9 @@ export function valueSchema(node) {
281
353
  schema = { anyOf: [schema, { type: 'null' }] };
282
354
  return schema;
283
355
  }
356
+ /** Строит схему объекта для выбранного режима; при частичном обновлении корневые поля необязательны.
357
+ * @example Для пустого узла → { type: 'object', properties: {}, additionalProperties: false }.
358
+ */
284
359
  export function objectSchema(node, mode, root = false, relationSchema) {
285
360
  const properties = {};
286
361
  const required = [];
@@ -304,6 +379,10 @@ export function objectSchema(node, mode, root = false, relationSchema) {
304
379
  if (child.required && !(root && mode === 'update') && !(mode !== 'stored' && child.default !== undefined) && !(relationSchema && child.relationKey))
305
380
  required.push(key);
306
381
  }
382
+ // Сохраняем ранее записанные даты и авторов при отключении соответствующих флагов.
383
+ if (root && mode === 'stored')
384
+ for (const name of AUDIT_FIELDS)
385
+ properties[name] ??= { type: ['string', 'null'], ...(name.endsWith('At') ? { format: 'date-time' } : {}) };
307
386
  return { type: 'object', properties, additionalProperties: false, ...(required.length ? { required } : {}) };
308
387
  }
309
388
  export function relationInputSchema(node, object = { type: 'object' }) {
@@ -316,6 +395,9 @@ export function relationInputSchema(node, object = { type: 'object' }) {
316
395
  return schema;
317
396
  }
318
397
  const validators = new WeakMap();
398
+ /** Проверяет запись по схеме выбранного режима и выбрасывает исключение при несоответствии.
399
+ * @example Обязательное строковое name: { name: 'Анна' } → undefined; { name: 2 } → ошибка.
400
+ */
319
401
  export function validateRecord(entity, value, mode, relations = false) {
320
402
  const ajv = entityValidators.get(entity);
321
403
  let cache = validators.get(entity);
@@ -332,16 +414,30 @@ export function validateRecord(entity, value, mode, relations = false) {
332
414
  if (!validate(value))
333
415
  throw domainError('INVALID_INPUT', `${entity.name}: ${ajv.errorsText(validate.errors)}`);
334
416
  }
335
- export function inferModel(database) {
417
+ /** Выводит поля и связи из значений коллекций, не меняя переданные записи.
418
+ * @example inferModel({ users: [{ id: '1', name: 'Анна' }] }) → модель со строковыми id и name.
419
+ */
420
+ export function inferModel(database, settings = {}) {
421
+ const options = recordOptions(settings);
336
422
  const valueType = (value) => (isObject(value) ? 'object' : ['string', 'number', 'boolean'].includes(typeof value) ? typeof value : 'string');
337
- const model = { entities: [], byName: new Map(), byCollection: new Map(), explicit: false };
423
+ const model = { entities: [], byName: new Map(), byCollection: new Map(), explicit: false, options };
338
424
  for (const [collection, records] of Object.entries(database)) {
339
425
  const name = toPascalCase(singularize(collection));
340
- const entity = { name, collection, api: [], primary: 'id', fields: Object.create(null), root: newNode('', { type: 'object' }) };
426
+ const entity = {
427
+ timestamps: options.timestamps,
428
+ softDelete: options.softDelete,
429
+ name,
430
+ collection,
431
+ api: [],
432
+ primary: 'id',
433
+ fields: Object.create(null),
434
+ root: newNode('', { type: 'object' }),
435
+ };
436
+ systemFields(entity, options);
341
437
  const observed = new Map();
342
438
  const scan = (record, prefix = '') => {
343
439
  for (const [key, value] of Object.entries(record)) {
344
- if (!NAME.test(key) || !isSafeKey(key))
440
+ if (!NAME.test(key) || !isSafeKey(key) || (!prefix && entity.fields[key]?.system))
345
441
  continue;
346
442
  const path = prefix + key;
347
443
  const sample = Array.isArray(value) ? value.find((v) => v !== null) : value;
@@ -382,7 +478,7 @@ export function inferModel(database) {
382
478
  const resources = Object.keys(database);
383
479
  for (const entity of model.entities)
384
480
  for (const field of Object.values(entity.fields)) {
385
- if (field.mixed)
481
+ if (field.mixed || field.system)
386
482
  continue;
387
483
  const relation = getRelationMetadata(childName(field), resources, entity.collection);
388
484
  if (!relation)
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/core/model.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,16 @@ import { type DatabaseContainer } from '../database.js';
2
2
  import { type Entity, type Model } from '../model.js';
3
3
  import type { JsonObject } from '../types.js';
4
4
  type WriteMode = 'create' | 'replace' | 'update';
5
- /** Executes all nested writes on the enclosing database transaction's draft. */
5
+ /** Выполняет вложенные изменения в общем черновике транзакции. */
6
6
  export declare class MutationWriter {
7
7
  private database;
8
8
  private model;
9
9
  private existingMode;
10
+ private beforeWrite;
10
11
  private indexes;
11
12
  private active;
12
13
  private selections;
13
- constructor(database: DatabaseContainer, model: Model, existingMode: 'replace' | 'update');
14
+ constructor(database: DatabaseContainer, model: Model, existingMode: 'replace' | 'update', beforeWrite?: (entity: Entity, record: JsonObject) => void);
14
15
  write(entity: Entity, mode: WriteMode, key: unknown, body: unknown, depth?: number): JsonObject;
15
16
  private extract;
16
17
  private resolve;
@@ -1,27 +1,32 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { createId } from '../database.js';
3
3
  import { domainError } from '../errors.js';
4
+ import { AUDIT_FIELDS } from '../lifecycle/options.js';
4
5
  import { bindingFor, canWriteKey, isReverseRelation, pathParts, readPath, validateRecord } from '../model.js';
5
6
  import { keyOf, makeContext, related, rootRef, sourceValues } from '../records.js';
6
7
  import { isEqual, isObject } from '../utils.js';
7
- /** Executes all nested writes on the enclosing database transaction's draft. */
8
+ /** Выполняет вложенные изменения в общем черновике транзакции. */
8
9
  export class MutationWriter {
9
10
  database;
10
11
  model;
11
12
  existingMode;
13
+ beforeWrite;
12
14
  indexes = new Map();
13
15
  active = new Set();
14
16
  selections = [];
15
- constructor(database, model, existingMode) {
17
+ constructor(database, model, existingMode, beforeWrite = () => { }) {
16
18
  this.database = database;
17
19
  this.model = model;
18
20
  this.existingMode = existingMode;
21
+ this.beforeWrite = beforeWrite;
19
22
  }
20
23
  write(entity, mode, key, body, depth = 0) {
21
24
  if (depth > 32)
22
25
  throw domainError('INVALID_INPUT', 'Nested writes are too deep');
23
26
  if (!isObject(body))
24
27
  throw domainError('INVALID_INPUT', 'Record input must be an object');
28
+ if (Object.keys(body).some((name) => entity.fields[name]?.system))
29
+ throw domainError('INVALID_INPUT', 'System fields are read-only');
25
30
  if (this.model.explicit)
26
31
  validateRecord(entity, body, mode, true);
27
32
  else if (Object.hasOwn(body, entity.primary))
@@ -34,11 +39,16 @@ export class MutationWriter {
34
39
  throw domainError('NOT_FOUND', `${entity.name}: record not found`);
35
40
  if (current && this.active.has(current))
36
41
  throw domainError('CONFLICT', 'A nested write cannot modify an active ancestor record');
42
+ if (current)
43
+ this.beforeWrite(entity, current);
37
44
  const input = structuredClone(body);
38
45
  const next = mode === 'update' ? { ...current, ...input } : { ...input };
39
46
  if (current) {
40
47
  next[entity.primary] = current[entity.primary];
41
48
  this.preserve(entity.root, next, current);
49
+ for (const name of AUDIT_FIELDS)
50
+ if (!entity.fields[name] && Object.hasOwn(current, name))
51
+ next[name] = current[name];
42
52
  }
43
53
  if (this.model.explicit) {
44
54
  if (mode !== 'update')
@@ -51,7 +61,7 @@ export class MutationWriter {
51
61
  const duplicate = index.get(String(next[entity.primary]));
52
62
  if (duplicate && duplicate !== current)
53
63
  throw domainError('CONFLICT', 'Primary key already exists');
54
- // Keep identities stable so multiple nested references see the same draft record.
64
+ // Сохраняем ссылки на объекты, чтобы вложенные обращения видели одну и ту же запись черновика.
55
65
  const record = current ?? {};
56
66
  for (const name of Object.keys(record))
57
67
  delete record[name];
@@ -78,7 +88,7 @@ export class MutationWriter {
78
88
  for (const [name, node] of Object.entries(ref.node.children)) {
79
89
  if (node.relation) {
80
90
  const supplied = Object.hasOwn(ref.value, name);
81
- // A PUT also disconnects omitted reverse links; direct storage keys follow normal replacement.
91
+ // При замене разрываем пропущенные обратные связи; прямые ключи заменяются вместе с записью.
82
92
  const omitted = !supplied && replace && isReverseRelation(ref.entity, node) && canWriteKey(node.relation, node.target);
83
93
  if (!supplied && !omitted)
84
94
  continue;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../../src/core/mutations/write.ts"],"names":[],"mappings":"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"}