letopis 1.4.2 → 3.0.0

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 (123) hide show
  1. package/AGENT-CHEATSHEET.md +516 -398
  2. package/CHANGELOG.md +739 -0
  3. package/LICENSE +75 -21
  4. package/LICENSE-COMMERCIAL.md +49 -0
  5. package/README.md +1312 -1190
  6. package/api-contract.json +381 -0
  7. package/dist/acl.d.ts +81 -1
  8. package/dist/acl.js +281 -13
  9. package/dist/admin.d.ts +11 -141
  10. package/dist/admin.js +28 -186
  11. package/dist/auth.d.ts +20 -5
  12. package/dist/auth.js +80 -21
  13. package/dist/cache.d.ts +8 -1
  14. package/dist/cache.js +30 -8
  15. package/dist/chain.d.ts +46 -48
  16. package/dist/chain.js +556 -223
  17. package/dist/cli.js +73 -96
  18. package/dist/demo/booking.d.ts +352 -36
  19. package/dist/describe.d.ts +47 -0
  20. package/dist/describe.js +195 -0
  21. package/dist/errors.d.ts +77 -13
  22. package/dist/errors.js +231 -30
  23. package/dist/index.d.ts +62 -74
  24. package/dist/index.js +312 -155
  25. package/dist/internal.d.ts +7 -0
  26. package/dist/jsonschema.js +18 -17
  27. package/dist/load.d.ts +29 -17
  28. package/dist/load.js +235 -190
  29. package/dist/log.d.ts +121 -0
  30. package/dist/log.js +633 -0
  31. package/dist/mcp.d.ts +5 -7
  32. package/dist/mcp.js +194 -225
  33. package/dist/messages/access.d.ts +90 -0
  34. package/dist/messages/access.js +113 -0
  35. package/dist/messages/api.d.ts +237 -0
  36. package/dist/messages/api.js +304 -0
  37. package/dist/messages/boot.d.ts +201 -0
  38. package/dist/messages/boot.js +256 -0
  39. package/dist/messages/codes.d.ts +172 -0
  40. package/dist/messages/codes.js +173 -0
  41. package/dist/messages/index.d.ts +98 -0
  42. package/dist/messages/index.js +121 -0
  43. package/dist/messages/log.d.ts +229 -0
  44. package/dist/messages/log.js +102 -0
  45. package/dist/messages/mcp.d.ts +306 -0
  46. package/dist/messages/mcp.js +387 -0
  47. package/dist/messages/model.d.ts +256 -0
  48. package/dist/messages/model.js +314 -0
  49. package/dist/messages/query.d.ts +141 -0
  50. package/dist/messages/query.js +171 -0
  51. package/dist/messages/sql-access.d.ts +70 -0
  52. package/dist/messages/sql-access.js +87 -0
  53. package/dist/messages/sql-core.d.ts +164 -0
  54. package/dist/messages/sql-core.js +198 -0
  55. package/dist/messages/sql-time.d.ts +86 -0
  56. package/dist/messages/sql-time.js +111 -0
  57. package/dist/messages/sql-write.d.ts +246 -0
  58. package/dist/messages/sql-write.js +270 -0
  59. package/dist/messages/time.d.ts +23 -0
  60. package/dist/messages/time.js +29 -0
  61. package/dist/messages/types.d.ts +27 -0
  62. package/dist/messages/types.js +5 -0
  63. package/dist/messages/write.d.ts +452 -0
  64. package/dist/messages/write.js +572 -0
  65. package/dist/model.d.ts +77 -60
  66. package/dist/model.js +43 -34
  67. package/dist/ops.d.ts +35 -0
  68. package/dist/ops.js +101 -0
  69. package/dist/pglite.d.ts +0 -9
  70. package/dist/pglite.js +3 -1
  71. package/dist/registry.d.ts +3 -19
  72. package/dist/registry.js +3 -16
  73. package/dist/signals.d.ts +1 -5
  74. package/dist/signals.js +1 -5
  75. package/dist/sql.d.ts +9 -1
  76. package/dist/sql.js +175 -107
  77. package/dist/sync.d.ts +10 -4
  78. package/dist/sync.js +90 -17
  79. package/dist/tx.d.ts +21 -2
  80. package/dist/tx.js +76 -13
  81. package/dist/typed.d.ts +252 -53
  82. package/dist/types.d.ts +93 -90
  83. package/dist/types.js +17 -14
  84. package/dist/up.d.ts +56 -35
  85. package/dist/up.js +229 -83
  86. package/dist/uuid.d.ts +8 -0
  87. package/dist/uuid.js +14 -6
  88. package/dist/validate.d.ts +13 -1
  89. package/dist/validate.js +82 -33
  90. package/dist/watch.d.ts +10 -16
  91. package/dist/watch.js +36 -77
  92. package/dist/write.d.ts +87 -17
  93. package/dist/write.js +441 -206
  94. package/llms.txt +48 -31
  95. package/package.json +13 -14
  96. package/sql/10-core.sql +7 -50
  97. package/sql/15-errors.sql +64 -10
  98. package/sql/20-context.sql +18 -9
  99. package/sql/30-validate.sql +79 -30
  100. package/sql/40-class.sql +41 -115
  101. package/sql/50-acl.sql +8 -13
  102. package/sql/60-write.sql +220 -676
  103. package/sql/70-read.sql +11 -13
  104. package/sql/80-auth.sql +109 -42
  105. package/sql/90-time.sql +108 -947
  106. package/sql/95-seed.system.sql +7 -14
  107. package/sql/99-revision.sql +6 -1
  108. package/sql/README.md +32 -24
  109. package/sql/migrate/0009-restore-rev.tenants-name.sql +10 -0
  110. package/sql/migrate/0010-impersonation-no-account.sql +5 -0
  111. package/sql/migrate/0011-key-lock.otp-enabled.sql +7 -0
  112. package/sql/migrate/README.md +18 -0
  113. package/AGENT-CHEATSHEET.en.md +0 -488
  114. package/MIGRATION.md +0 -190
  115. package/README.en.md +0 -2910
  116. package/dist/import.d.ts +0 -185
  117. package/dist/import.js +0 -820
  118. package/dist/project.d.ts +0 -359
  119. package/dist/project.js +0 -1258
  120. package/sql/75-history.sql +0 -436
  121. package/sql/88-derived.sql +0 -1236
  122. package/sql/migrate/0006-changed-paths.sql +0 -3
  123. package/sql/migrate/0007-secret-account-fk.sql +0 -12
@@ -0,0 +1,304 @@
1
+ export const api = {
2
+ // errors.ts, ValidationError: данные не проходят проверку на TypeScript (из базы — sql-write.invalid_data)
3
+ 'api.validation_failed': {
4
+ code: 'invalid_data',
5
+ ru: 'данные не проходят описание класса {cls}',
6
+ },
7
+ // chain.ts: шаг цепочки — не класс, не алиас и не роль реестра сессии; похожие имена — params.similar
8
+ 'api.unknown_step': {
9
+ code: 'invalid_class',
10
+ ru: 'класс или роль {name} не найдены',
11
+ hint: 'классы арендатора видны только в его сессии: арендаторы пользователя — db.auth.tenants(), переход — db.auth.switch(tenant) или db.as(аккаунт, { tenant }); имя — как в модели (классы записывает syncModels)',
12
+ },
13
+ // chain.ts: шаг не найден, а в реестре сессии нет ни одного класса, кроме классов System — сессия, похоже, в
14
+ // личном арендаторе (вход без switch); похожие имена — params.similar
15
+ // index.ts: connect({ token }) — токен не даёт сессии (погашен, истёк, неверен); chain.ts: шаг корня без сессии
16
+ // (сессия погасла после connect) — отказ терминала, а не синхронный
17
+ 'api.token_not_active': {
18
+ code: 'no_session',
19
+ ru: 'нет действующей сессии: токен погашен, истёк или неверен',
20
+ hint: 'войти заново и подключиться с новым токеном; веб-сервису — одно подключение сервиса и svc.as(account, { tenant }) на запрос, а не connect({ token }) на каждый вход',
21
+ },
22
+ 'api.unknown_step_no_classes': {
23
+ code: 'invalid_class',
24
+ ru: 'класс или роль {name} не найдены: в реестре сессии нет ни одного класса арендатора — сессия, похоже, в личном арендаторе',
25
+ hint: 'после входа сессия работает в личном арендаторе пользователя: найти нужного — db.auth.tenants(), перейти — db.auth.switch(tenant) или db.as(аккаунт, { tenant }); классы в арендатор записывает syncModels',
26
+ },
27
+ // chain.ts: у цепочки спросили свойство массива (length, map, filter, 0 …) или перебрали её — она не массив строк
28
+ 'api.chain_not_rows': {
29
+ code: 'invalid_query',
30
+ ru: 'цепочка — не массив: {name} есть у строк ответа, а не у цепочки',
31
+ hint: 'получить строки терминалом с await: const rows = await db.Класс(…).rows(), одну строку — await ….first()',
32
+ },
33
+ // chain.ts, A13: шаг вызван с аргументом undefined — фильтра нет, шаг находит все строки класса (как без аргумента);
34
+ // предупреждение (lwarn), один раз на имя шага
35
+ 'api.step_undefined_filter': {
36
+ code: 'invalid_query',
37
+ ru: '{name}(undefined) — фильтра нет: шаг находит все строки, как {name}(). Проверьте переменную с id',
38
+ },
39
+ // chain.ts, A13: шаг после sort() — сортировка относится к последнему шагу цепочки, а не к тому, после которого
40
+ // стоит; предупреждение (lwarn), один раз на пару
41
+ 'api.sort_not_last': {
42
+ code: 'invalid_query',
43
+ ru: "sort('{field}') перед шагом {step} сортирует строки последнего шага ({step}), а не прежнего: ставьте sort() в конец цепочки",
44
+ },
45
+ // chain.ts, A9: withDeleted() не у последнего шага, а у последнего — нет; предупреждение (lwarn), один раз на пару:
46
+ // с 2.1 withDeleted() — модификатор своего шага
47
+ 'api.with_deleted_step': {
48
+ code: 'invalid_query',
49
+ ru: 'withDeleted() у шага {step} относится к нему, а не к последнему шагу {last}: удалённые {last} — .{last}().withDeleted()',
50
+ },
51
+ // errors.ts, fromDbError: подстраховка — значение не того типа (SQLSTATE 22P02), которое не поймала проверка до
52
+ // запроса; text — текст сервера
53
+ 'api.db_bad_value': {
54
+ code: 'invalid_query',
55
+ ru: 'значение не того типа: {text}',
56
+ hint: 'id — строка uuid, числа — числа, даты — строки ISO; проверьте значения фильтра, курсора и опций',
57
+ },
58
+ // errors.ts, ValidationError: первое нарушение в тексте ошибки — путь и сообщение; текст не для ошибки (lmsg)
59
+ 'api.validation_issue': {
60
+ code: 'invalid_data',
61
+ ru: '{path} — {issue}',
62
+ },
63
+ // errors.ts, ValidationError: путь нарушения на верхнем уровне данных (пустой путь); текст не для ошибки (lmsg)
64
+ 'api.validation_root': {
65
+ code: 'invalid_data',
66
+ ru: 'данные',
67
+ },
68
+ // errors.ts, ValidationError: число нарушений, если их больше одного; текст не для ошибки (lmsg)
69
+ 'api.validation_more': {
70
+ code: 'invalid_data',
71
+ ru: ' (всего нарушений: {n}, все — err.issues)',
72
+ },
73
+ // index.ts: connect({ schema })
74
+ 'api.connect_schema': {
75
+ code: 'invalid_data',
76
+ ru: 'connect: схема {schema} — нужно v<N>.<имя>',
77
+ hint: 'имя схемы — v<N>.<имя>, как у up({ schema }): например, v2.salon',
78
+ },
79
+ // errors.ts, checkOptions: неизвестная опция connect(), up(), load(), watch(), createMcpServer() — в 1.5
80
+ // было предупреждение, с 2.0 — ошибка (план 2.0, этап 4, п. 2; 7.10 №4)
81
+ 'api.unknown_option': {
82
+ code: 'invalid_data',
83
+ ru: 'неизвестная опция {where}({ {name} })',
84
+ hint: 'проверить имя опции: похожие названы в тексте, все опции — в README, «Справочник API»',
85
+ },
86
+ // errors.ts, fromDbError: новые значения строки не проходят условие ACL (политика RLS WITH CHECK)
87
+ 'api.row_check_denied': {
88
+ code: 'acl_denied',
89
+ ru: 'новые значения строки запрещают правила доступа',
90
+ },
91
+ // chain.ts, warnNoHistory: versions(), asOf() у класса без журнала — предупреждение (lwarn), один раз
92
+ // на класс и метод; код записи не печатается
93
+ 'api.no_history': {
94
+ code: 'invalid_query',
95
+ ru: '.{method}() у класса {cls} без журнала (history: false) — истории нет',
96
+ },
97
+ // chain.ts, report: медленный запрос без хука onQuery — предупреждение (lwarn); ms — целое, classes — классы шагов через →
98
+ 'api.slow_query': {
99
+ code: 'invalid_query',
100
+ ru: 'медленный запрос {ms} мс — {mode} {classes}',
101
+ },
102
+ // chain.ts: терминал у цепочки батча с глаголами
103
+ 'api.batch_queued': {
104
+ code: 'invalid_query',
105
+ ru: 'план стоит в очереди батча — его исполнит batch.run()',
106
+ },
107
+ // chain.ts, afterVerbError: модификатор выборки сразу после глагола перед rows, first, ids, count, paths (и в batch.run())
108
+ 'api.mod_after_verb': {
109
+ code: 'invalid_query',
110
+ ru: '{name}() после {verb}() ни на что не действует: глагол проходит по всем целям шага, а ответ — его строки. Цели сужают limit(), offset() и sort() до глагола: db.Класс(…).limit(n).{verb}(…)',
111
+ },
112
+ // chain.ts, afterNotPaged: after() перед count() или агрегатом чтения (sum, avg, min, max, countBy) — с 2.0 отказ, в 1.x
113
+ // курсор там молча не учитывался (план 2.0, этап 4, п. 2; 7.10 №7); fn — имя терминала
114
+ 'api.after_not_paged': {
115
+ code: 'invalid_query',
116
+ ru: '{fn}() не листается: after() сдвигает начало страницы rows(), ids(), versions() и paths(), а {fn}() считает по всем объектам шага',
117
+ hint: 'убрать after() перед счётом и агрегатом; сузить то, что считается, — фильтром шага',
118
+ },
119
+ // chain.ts, lockedRead: forUpdate() вне db.begin()
120
+ 'api.for_update_outside_tx': {
121
+ code: 'tx_required',
122
+ ru: 'forUpdate() — только внутри db.begin(): вне явной транзакции блокировка снялась бы сразу',
123
+ },
124
+ // chain.ts, lockedRead: forUpdate() с другим терминалом, агрегатом, срезом, глаголом
125
+ // chain.ts, lockedRead: what — что мешает блокировке (терминал, asOf(), withDeleted(), deep(), глагол)
126
+ 'api.for_update_unsupported': {
127
+ code: 'lock_unsupported',
128
+ ru: 'forUpdate() нельзя с {what}: блокировка — только у чтения rows(), first(), ids()',
129
+ hint: 'forUpdate() — в db.begin(), перед rows(), first() или ids(); без asOf(), versions(), withDeleted(), deep(), count(), paths(), агрегатов и глаголов. Правка — отдельной цепочкой после чтения: await tr.X(id).forUpdate().first(); await tr.X(id).update(…).rows()',
130
+ },
131
+ // chain.ts, lockedRead: строки видны, но политика правки не даёт их заблокировать; ids — через запятую (detail.ids — списком)
132
+ 'api.lock_denied': {
133
+ code: 'acl_denied',
134
+ ru: 'строки видны, но заблокировать их нельзя: {ids}',
135
+ },
136
+ // chain.ts, slotValue: значение .Роль.set(…), .add(…), .remove(…)
137
+ 'api.slot_value': {
138
+ code: 'invalid_query',
139
+ ru: 'значение слота — id, список id, строка ответа или цепочка',
140
+ },
141
+ // chain.ts: слот не сразу после create(), update() или upsert(); name — роль, как вызвана, op — set, unset, add, remove
142
+ 'api.slot_without_write': {
143
+ code: 'invalid_query',
144
+ ru: 'слот .{name}.{op}() — после create(), update() или upsert(): db.Класс(…).update(…).{name}.{op}(…)',
145
+ },
146
+ // chain.ts: add() или remove() у одиночного конца
147
+ 'api.slot_single': {
148
+ code: 'invalid_query',
149
+ ru: 'слот .{name}.{op}(): конец {role} одиночный — set() или unset()',
150
+ },
151
+ // chain.ts: unset() у обязательного конца
152
+ 'api.slot_required': {
153
+ code: 'invalid_query',
154
+ ru: 'слот .{name}.unset(): конец {role} обязателен',
155
+ },
156
+ // chain.ts: set() или unset() одного конца дважды в одной записи
157
+ 'api.slot_twice': {
158
+ code: 'invalid_query',
159
+ ru: 'слот {role} задан дважды в одной записи',
160
+ },
161
+ // chain.ts, withLast: deep(), exact(), alias(), tags(), owner() сразу после глагола; verb — глагол
162
+ 'api.step_mod_after_verb': {
163
+ code: 'invalid_query',
164
+ ru: 'модификатор шага после {verb}() — сначала шаг класса',
165
+ },
166
+ // chain.ts, withOp: глагол без шага класса
167
+ 'api.verb_without_step': {
168
+ code: 'invalid_query',
169
+ ru: '{verb}() — нужен шаг класса: db.Класс(…).{verb}(…)',
170
+ },
171
+ // chain.ts, entity(): цепочка с глаголами
172
+ 'api.entity_with_verbs': {
173
+ code: 'invalid_query',
174
+ ru: 'entity() принимает читающий паттерн — цепочку с глаголами вклеить нельзя',
175
+ },
176
+ // chain.ts, entity(): не цепочка и не строка ответа
177
+ 'api.entity_arg': {
178
+ code: 'invalid_query',
179
+ ru: 'entity() принимает ленивую цепочку или строку ответа',
180
+ },
181
+ // chain.ts: set, unset, add, remove у цепочки, а не у слота роли; method — имя метода
182
+ 'api.slot_method': {
183
+ code: 'invalid_query',
184
+ ru: '{method}() — метод слота: db.Класс(…).update(…).Роль.{method}(…)',
185
+ },
186
+ // chain.ts: cache({ ttl })
187
+ 'api.cache_ttl': {
188
+ code: 'invalid_query',
189
+ ru: 'cache({ ttl }): срок — положительное число секунд',
190
+ },
191
+ // index.ts, noTx: lock(), commit(), rollback() вне db.begin(); what — вызов
192
+ 'api.tx_only': {
193
+ code: 'tx_required',
194
+ ru: '{what} — только внутри db.begin()',
195
+ },
196
+ // index.ts: db.idOf() без арендатора сессии
197
+ 'api.id_of_no_tenant': {
198
+ code: 'no_session',
199
+ ru: 'idOf: нет арендатора сессии',
200
+ },
201
+ // index.ts: db.as() внутри db.begin()
202
+ 'api.as_in_tx': {
203
+ code: 'invalid_query',
204
+ ru: 'db.as() — от корня подключения, а не внутри db.begin()',
205
+ },
206
+ // index.ts: db.as() — сессии нет (первое чтение контекста и повторное, если контекст ушёл из арендатора)
207
+ 'api.as_no_session': {
208
+ code: 'no_session',
209
+ ru: 'db.as(): нет действующей сессии',
210
+ },
211
+ // index.ts: db.as() — контекст сессии трижды ушёл из арендатора, пока грузился реестр
212
+ 'api.as_context_changing': {
213
+ code: 'no_session',
214
+ ru: 'db.as(): контекст сессии меняется — реестр арендатора не загружен',
215
+ hint: 'повторить вызов: между запросами db.as() сессия сменила арендатора или кончилась',
216
+ },
217
+ // index.ts: db.begin() внутри db.begin()
218
+ // index.ts: db.begin(аргумент) — не объект опций (функция, строка, число); функцию begin() не вызывает; type — typeof
219
+ // аргумента (array — массив)
220
+ 'api.begin_arg': {
221
+ code: 'invalid_query',
222
+ ru: 'db.begin() принимает только опции { reason }, а не {type}: транзакцию открывает begin(), закрывают commit() и rollback()',
223
+ hint: 'const tr = await db.begin(); try { …; await tr.commit() } catch (e) { await tr.rollback(); throw e }',
224
+ },
225
+ 'api.nested_begin': {
226
+ code: 'invalid_query',
227
+ ru: 'вложенных транзакций нет: db.begin() внутри db.begin()',
228
+ },
229
+ // index.ts: db.load() внутри db.begin()
230
+ 'api.load_in_tx': {
231
+ code: 'invalid_query',
232
+ ru: 'load() — своей транзакцией, не внутри db.begin()',
233
+ },
234
+ // index.ts: connect() без dsn и sql
235
+ 'api.connect_no_dsn': {
236
+ code: 'invalid_data',
237
+ ru: 'connect: нужен dsn или sql',
238
+ hint: 'передать dsn — строку подключения — или sql — готовый пул postgres.js',
239
+ },
240
+ // index.ts: connect({ apiKey | service | token }) передан, но пуст (null, '', не строка) — опция есть, а значения нет
241
+ 'api.connect_empty_credential': {
242
+ code: 'invalid_data',
243
+ ru: 'connect: {name} передан, но пуст ({value}) — подключение без сессии не открывается',
244
+ hint: 'передать ключ сервиса или токен строкой (process.env.SERVICE_KEY не задана?) — либо убрать опцию, если сессия не нужна; ключ сервиса up() выдаёт один раз — храните его сами',
245
+ },
246
+ // index.ts: connect({ admin }) — не строка и не пул
247
+ 'api.connect_admin_type': {
248
+ code: 'invalid_data',
249
+ ru: 'connect: admin — строка подключения администратора или пул postgres.js',
250
+ hint: 'передать в admin строку подключения администратора или пул postgres.js либо убрать опцию',
251
+ },
252
+ // index.ts, adminReady: роль строки admin не может стать владельцем схемы; owner — роль-владелец
253
+ 'api.connect_admin_role': {
254
+ code: 'admin_required',
255
+ ru: 'connect({ admin }): роль администраторской строки подключения не может стать владельцем схемы — нужен суперпользователь или роль с SET на {owner}',
256
+ hint: 'для admin взять строку подключения суперпользователя или роли с правом SET на роль-владельца',
257
+ },
258
+ // index.ts: роли владельца (опция owner) в базе нет
259
+ 'api.connect_no_owner': {
260
+ code: 'invalid_data',
261
+ ru: 'connect: роли владельца {owner} в базе нет — проверьте опцию owner (по умолчанию letopis_owner)',
262
+ hint: 'указать в owner роль-владельца, с которой up() ставил схему (по умолчанию letopis_owner)',
263
+ },
264
+ // index.ts: роль подключения обходит RLS, а allowBypassRls нет
265
+ 'api.connect_bypass_rls': {
266
+ code: 'bypass_rls',
267
+ ru: 'роль подключения обходит RLS (суперпользователь, BYPASSRLS или член роли-владельца); администраторское подключение — только с опцией allowBypassRls',
268
+ },
269
+ // index.ts: подключение с allowBypassRls — предупреждение (lwarn)
270
+ 'api.admin_connection': {
271
+ code: 'bypass_rls',
272
+ ru: 'администраторское подключение — RLS не действует, данные всех арендаторов видны',
273
+ },
274
+ // index.ts: схемы нет
275
+ 'api.connect_no_schema': {
276
+ code: 'invalid_data',
277
+ ru: 'connect: схемы {schema} нет — установите её: up({ schema })',
278
+ hint: 'установить схему up({ schema }) или исправить имя в connect({ schema })',
279
+ },
280
+ // index.ts: ревизия движка схемы 2.x старше библиотеки — предупреждение (lwarn); want — DDL_REVISION. Схема 1.x — отказ
281
+ // boot.schema_1x (refuse1x в up.ts)
282
+ 'api.schema_older': {
283
+ code: 'invalid_data',
284
+ ru: "движок схемы {schema} ревизии {rev}, библиотека ждёт {want} — обновите: up({ schema: '{schema}', upgrade: true })",
285
+ },
286
+ // index.ts: ревизия движка схемы новее библиотеки — предупреждение (lwarn); known — DDL_REVISION
287
+ 'api.schema_newer': {
288
+ code: 'invalid_data',
289
+ ru: 'движок схемы {schema} ревизии {rev} новее библиотеки (она знает {known}) — обновите пакет letopis',
290
+ },
291
+ // up.ts, createTenant(): первый аргумент — не пул postgres() (строка DSN, подключение connect(), объект без begin и
292
+ // unsafe); type — typeof значения или null
293
+ 'api.create_tenant_admin': {
294
+ code: 'invalid_query',
295
+ ru: 'createTenant(admin, …): admin — пул postgres() с правами администратора, а не {type}',
296
+ hint: "const admin = postgres(dsnАдминистратора); await createTenant(admin, 'salon', { name }); await admin.end(). DSN-строку и подключение connect() letopis createTenant не принимает",
297
+ },
298
+ // chain.ts, versions(): у результата versions() вызвали метод цепочки (rows, first, sort…); method — его имя
299
+ 'api.versions_terminal': {
300
+ code: 'invalid_query',
301
+ ru: 'versions() — терминал: отдаёт строки версий, у результата нет .{method}()',
302
+ hint: "const v = await db.Класс(id).versions(); модификаторы — до versions(): db.Класс(id).sort('at', 'desc').limit(10).versions()",
303
+ },
304
+ };
@@ -0,0 +1,201 @@
1
+ export declare const boot: {
2
+ 'boot.unknown_marker': {
3
+ code: "invalid_data";
4
+ ru: string;
5
+ hint: string;
6
+ };
7
+ 'boot.install_schema_name': {
8
+ code: "invalid_data";
9
+ ru: string;
10
+ hint: string;
11
+ };
12
+ 'boot.role_name': {
13
+ code: "invalid_data";
14
+ ru: string;
15
+ hint: string;
16
+ };
17
+ 'boot.signals_mode': {
18
+ code: "invalid_data";
19
+ ru: string;
20
+ hint: string;
21
+ };
22
+ 'boot.owner_no_admin': {
23
+ code: "admin_required";
24
+ ru: string;
25
+ hint: string;
26
+ };
27
+ 'boot.seed_name': {
28
+ code: "invalid_data";
29
+ ru: string;
30
+ hint: string;
31
+ };
32
+ 'boot.service_key_format': {
33
+ code: "invalid_data";
34
+ ru: string;
35
+ hint: string;
36
+ };
37
+ 'boot.up_schema_name': {
38
+ code: "invalid_data";
39
+ ru: string;
40
+ hint: string;
41
+ };
42
+ 'boot.no_connection': {
43
+ code: "invalid_data";
44
+ ru: string;
45
+ hint: string;
46
+ };
47
+ 'boot.login_not_object': {
48
+ code: "invalid_data";
49
+ ru: string;
50
+ hint: string;
51
+ };
52
+ 'boot.login_user': {
53
+ code: "invalid_data";
54
+ ru: string;
55
+ hint: string;
56
+ };
57
+ 'boot.login_password': {
58
+ code: "invalid_data";
59
+ ru: string;
60
+ hint: string;
61
+ };
62
+ 'boot.login_privileged': {
63
+ code: "invalid_data";
64
+ ru: string;
65
+ hint: string;
66
+ };
67
+ 'boot.tenant_name_required': {
68
+ code: "invalid_data";
69
+ ru: string;
70
+ hint: string;
71
+ };
72
+ 'boot.tenant_kind': {
73
+ code: "invalid_data";
74
+ ru: string;
75
+ hint: string;
76
+ };
77
+ 'boot.tenant_roles_empty': {
78
+ code: "invalid_data";
79
+ ru: string;
80
+ hint: string;
81
+ };
82
+ 'boot.tenant_role_type': {
83
+ code: "invalid_data";
84
+ ru: string;
85
+ hint: string;
86
+ };
87
+ 'boot.tenant_role_mask': {
88
+ code: "invalid_data";
89
+ ru: string;
90
+ hint: string;
91
+ };
92
+ 'boot.tenant_roles_repeat': {
93
+ code: "invalid_data";
94
+ ru: string;
95
+ hint: string;
96
+ };
97
+ 'boot.tenant_deleted': {
98
+ code: "invalid_data";
99
+ ru: string;
100
+ hint: string;
101
+ };
102
+ 'boot.tenant_user_deleted': {
103
+ code: "invalid_data";
104
+ ru: string;
105
+ hint: string;
106
+ };
107
+ 'boot.tenant_member_deleted': {
108
+ code: "invalid_data";
109
+ ru: string;
110
+ hint: string;
111
+ };
112
+ 'boot.schema_1x': {
113
+ code: "invalid_data";
114
+ ru: string;
115
+ hint: string;
116
+ };
117
+ 'boot.install_pg_version': {
118
+ code: "invalid_query";
119
+ ru: string;
120
+ };
121
+ 'boot.pg_version': {
122
+ code: "invalid_query";
123
+ ru: string;
124
+ };
125
+ 'boot.encoding': {
126
+ code: "invalid_query";
127
+ ru: string;
128
+ };
129
+ 'boot.wait_timeout': {
130
+ code: "invalid_query";
131
+ ru: string;
132
+ };
133
+ 'boot.schema_newer': {
134
+ code: "invalid_data";
135
+ ru: string;
136
+ };
137
+ 'boot.schema_older': {
138
+ code: "invalid_data";
139
+ ru: string;
140
+ };
141
+ 'boot.pglite_package': {
142
+ code: "invalid_query";
143
+ ru: string;
144
+ };
145
+ 'boot.pg_clog': {
146
+ code: "invalid_query";
147
+ ru: string;
148
+ };
149
+ 'boot.analyze_skipped': {
150
+ code: "invalid_query";
151
+ ru: string;
152
+ };
153
+ 'boot.reserved_hubs': {
154
+ code: "invalid_class";
155
+ ru: string;
156
+ };
157
+ 'boot.stamp_newer': {
158
+ code: "invalid_data";
159
+ ru: string;
160
+ };
161
+ 'boot.stamp_unknown': {
162
+ code: "invalid_data";
163
+ ru: string;
164
+ };
165
+ 'boot.stamp_other_build': {
166
+ code: "invalid_data";
167
+ ru: string;
168
+ };
169
+ 'boot.stamp_other_version': {
170
+ code: "invalid_data";
171
+ ru: string;
172
+ };
173
+ 'boot.log_database_created': {
174
+ code: "invalid_query";
175
+ ru: string;
176
+ };
177
+ 'boot.log_fresh': {
178
+ code: "invalid_query";
179
+ ru: string;
180
+ };
181
+ 'boot.log_installed': {
182
+ code: "invalid_query";
183
+ ru: string;
184
+ };
185
+ 'boot.log_upgraded': {
186
+ code: "invalid_query";
187
+ ru: string;
188
+ };
189
+ 'boot.log_reapplied': {
190
+ code: "invalid_query";
191
+ ru: string;
192
+ };
193
+ 'boot.log_login_created': {
194
+ code: "invalid_query";
195
+ ru: string;
196
+ };
197
+ 'boot.log_login_updated': {
198
+ code: "invalid_query";
199
+ ru: string;
200
+ };
201
+ };