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.
- package/AGENT-CHEATSHEET.md +516 -398
- package/CHANGELOG.md +739 -0
- package/LICENSE +75 -21
- package/LICENSE-COMMERCIAL.md +49 -0
- package/README.md +1312 -1190
- package/api-contract.json +381 -0
- package/dist/acl.d.ts +81 -1
- package/dist/acl.js +281 -13
- package/dist/admin.d.ts +11 -141
- package/dist/admin.js +28 -186
- package/dist/auth.d.ts +20 -5
- package/dist/auth.js +80 -21
- package/dist/cache.d.ts +8 -1
- package/dist/cache.js +30 -8
- package/dist/chain.d.ts +46 -48
- package/dist/chain.js +556 -223
- package/dist/cli.js +73 -96
- package/dist/demo/booking.d.ts +352 -36
- package/dist/describe.d.ts +47 -0
- package/dist/describe.js +195 -0
- package/dist/errors.d.ts +77 -13
- package/dist/errors.js +231 -30
- package/dist/index.d.ts +62 -74
- package/dist/index.js +312 -155
- package/dist/internal.d.ts +7 -0
- package/dist/jsonschema.js +18 -17
- package/dist/load.d.ts +29 -17
- package/dist/load.js +235 -190
- package/dist/log.d.ts +121 -0
- package/dist/log.js +633 -0
- package/dist/mcp.d.ts +5 -7
- package/dist/mcp.js +194 -225
- package/dist/messages/access.d.ts +90 -0
- package/dist/messages/access.js +113 -0
- package/dist/messages/api.d.ts +237 -0
- package/dist/messages/api.js +304 -0
- package/dist/messages/boot.d.ts +201 -0
- package/dist/messages/boot.js +256 -0
- package/dist/messages/codes.d.ts +172 -0
- package/dist/messages/codes.js +173 -0
- package/dist/messages/index.d.ts +98 -0
- package/dist/messages/index.js +121 -0
- package/dist/messages/log.d.ts +229 -0
- package/dist/messages/log.js +102 -0
- package/dist/messages/mcp.d.ts +306 -0
- package/dist/messages/mcp.js +387 -0
- package/dist/messages/model.d.ts +256 -0
- package/dist/messages/model.js +314 -0
- package/dist/messages/query.d.ts +141 -0
- package/dist/messages/query.js +171 -0
- package/dist/messages/sql-access.d.ts +70 -0
- package/dist/messages/sql-access.js +87 -0
- package/dist/messages/sql-core.d.ts +164 -0
- package/dist/messages/sql-core.js +198 -0
- package/dist/messages/sql-time.d.ts +86 -0
- package/dist/messages/sql-time.js +111 -0
- package/dist/messages/sql-write.d.ts +246 -0
- package/dist/messages/sql-write.js +270 -0
- package/dist/messages/time.d.ts +23 -0
- package/dist/messages/time.js +29 -0
- package/dist/messages/types.d.ts +27 -0
- package/dist/messages/types.js +5 -0
- package/dist/messages/write.d.ts +452 -0
- package/dist/messages/write.js +572 -0
- package/dist/model.d.ts +77 -60
- package/dist/model.js +43 -34
- package/dist/ops.d.ts +35 -0
- package/dist/ops.js +101 -0
- package/dist/pglite.d.ts +0 -9
- package/dist/pglite.js +3 -1
- package/dist/registry.d.ts +3 -19
- package/dist/registry.js +3 -16
- package/dist/signals.d.ts +1 -5
- package/dist/signals.js +1 -5
- package/dist/sql.d.ts +9 -1
- package/dist/sql.js +175 -107
- package/dist/sync.d.ts +10 -4
- package/dist/sync.js +90 -17
- package/dist/tx.d.ts +21 -2
- package/dist/tx.js +76 -13
- package/dist/typed.d.ts +252 -53
- package/dist/types.d.ts +93 -90
- package/dist/types.js +17 -14
- package/dist/up.d.ts +56 -35
- package/dist/up.js +229 -83
- package/dist/uuid.d.ts +8 -0
- package/dist/uuid.js +14 -6
- package/dist/validate.d.ts +13 -1
- package/dist/validate.js +82 -33
- package/dist/watch.d.ts +10 -16
- package/dist/watch.js +36 -77
- package/dist/write.d.ts +87 -17
- package/dist/write.js +441 -206
- package/llms.txt +48 -31
- package/package.json +13 -14
- package/sql/10-core.sql +7 -50
- package/sql/15-errors.sql +64 -10
- package/sql/20-context.sql +18 -9
- package/sql/30-validate.sql +79 -30
- package/sql/40-class.sql +41 -115
- package/sql/50-acl.sql +8 -13
- package/sql/60-write.sql +220 -676
- package/sql/70-read.sql +11 -13
- package/sql/80-auth.sql +109 -42
- package/sql/90-time.sql +108 -947
- package/sql/95-seed.system.sql +7 -14
- package/sql/99-revision.sql +6 -1
- package/sql/README.md +32 -24
- package/sql/migrate/0009-restore-rev.tenants-name.sql +10 -0
- package/sql/migrate/0010-impersonation-no-account.sql +5 -0
- package/sql/migrate/0011-key-lock.otp-enabled.sql +7 -0
- package/sql/migrate/README.md +18 -0
- package/AGENT-CHEATSHEET.en.md +0 -488
- package/MIGRATION.md +0 -190
- package/README.en.md +0 -2910
- package/dist/import.d.ts +0 -185
- package/dist/import.js +0 -820
- package/dist/project.d.ts +0 -359
- package/dist/project.js +0 -1258
- package/sql/75-history.sql +0 -436
- package/sql/88-derived.sql +0 -1236
- package/sql/migrate/0006-changed-paths.sql +0 -3
- package/sql/migrate/0007-secret-account-fk.sql +0 -12
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
export declare const query: {
|
|
2
|
+
'query.sort_field': {
|
|
3
|
+
code: "invalid_query";
|
|
4
|
+
ru: string;
|
|
5
|
+
};
|
|
6
|
+
'query.sort_field_data': {
|
|
7
|
+
code: "invalid_query";
|
|
8
|
+
ru: string;
|
|
9
|
+
hint: string;
|
|
10
|
+
};
|
|
11
|
+
'query.unknown_field': {
|
|
12
|
+
code: "invalid_query";
|
|
13
|
+
ru: string;
|
|
14
|
+
hint: string;
|
|
15
|
+
};
|
|
16
|
+
'query.no_path': {
|
|
17
|
+
code: "no_path";
|
|
18
|
+
ru: string;
|
|
19
|
+
};
|
|
20
|
+
'query.unknown_op': {
|
|
21
|
+
code: "invalid_query";
|
|
22
|
+
ru: string;
|
|
23
|
+
};
|
|
24
|
+
'query.tags_arg': {
|
|
25
|
+
code: "invalid_query";
|
|
26
|
+
ru: string;
|
|
27
|
+
};
|
|
28
|
+
'query.step_op': {
|
|
29
|
+
code: "invalid_query";
|
|
30
|
+
ru: string;
|
|
31
|
+
};
|
|
32
|
+
'query.id_list': {
|
|
33
|
+
code: "invalid_query";
|
|
34
|
+
ru: string;
|
|
35
|
+
};
|
|
36
|
+
'query.filter_id_list': {
|
|
37
|
+
code: "invalid_query";
|
|
38
|
+
ru: string;
|
|
39
|
+
};
|
|
40
|
+
'query.filter_id': {
|
|
41
|
+
code: "invalid_query";
|
|
42
|
+
ru: string;
|
|
43
|
+
};
|
|
44
|
+
'query.end_value': {
|
|
45
|
+
code: "invalid_query";
|
|
46
|
+
ru: string;
|
|
47
|
+
};
|
|
48
|
+
'query.cursor_shape': {
|
|
49
|
+
code: "invalid_query";
|
|
50
|
+
ru: string;
|
|
51
|
+
};
|
|
52
|
+
'query.cursor_id': {
|
|
53
|
+
code: "invalid_query";
|
|
54
|
+
ru: string;
|
|
55
|
+
};
|
|
56
|
+
'query.cursor_value': {
|
|
57
|
+
code: "invalid_query";
|
|
58
|
+
ru: string;
|
|
59
|
+
};
|
|
60
|
+
'query.cursor_value_nullable': {
|
|
61
|
+
code: "invalid_query";
|
|
62
|
+
ru: string;
|
|
63
|
+
};
|
|
64
|
+
'query.cursor_expect_numeric': {
|
|
65
|
+
code: "invalid_query";
|
|
66
|
+
ru: string;
|
|
67
|
+
};
|
|
68
|
+
'query.cursor_expect_int': {
|
|
69
|
+
code: "invalid_query";
|
|
70
|
+
ru: string;
|
|
71
|
+
};
|
|
72
|
+
'query.cursor_expect_boolean': {
|
|
73
|
+
code: "invalid_query";
|
|
74
|
+
ru: string;
|
|
75
|
+
};
|
|
76
|
+
'query.cursor_expect_text': {
|
|
77
|
+
code: "invalid_query";
|
|
78
|
+
ru: string;
|
|
79
|
+
};
|
|
80
|
+
'query.cursor_expect_uuid': {
|
|
81
|
+
code: "invalid_query";
|
|
82
|
+
ru: string;
|
|
83
|
+
};
|
|
84
|
+
'query.cursor_expect_timestamptz': {
|
|
85
|
+
code: "invalid_query";
|
|
86
|
+
ru: string;
|
|
87
|
+
};
|
|
88
|
+
'query.cursor_expect_date': {
|
|
89
|
+
code: "invalid_query";
|
|
90
|
+
ru: string;
|
|
91
|
+
};
|
|
92
|
+
'query.cursor_expect_jsonb': {
|
|
93
|
+
code: "invalid_query";
|
|
94
|
+
ru: string;
|
|
95
|
+
};
|
|
96
|
+
'query.cursor_rev': {
|
|
97
|
+
code: "invalid_query";
|
|
98
|
+
ru: string;
|
|
99
|
+
};
|
|
100
|
+
'query.cursor_path': {
|
|
101
|
+
code: "invalid_query";
|
|
102
|
+
ru: string;
|
|
103
|
+
};
|
|
104
|
+
'query.cursor_of_field': {
|
|
105
|
+
code: "invalid_query";
|
|
106
|
+
ru: string;
|
|
107
|
+
};
|
|
108
|
+
'query.empty_chain': {
|
|
109
|
+
code: "invalid_query";
|
|
110
|
+
ru: string;
|
|
111
|
+
};
|
|
112
|
+
'query.pivot_missing': {
|
|
113
|
+
code: "invalid_query";
|
|
114
|
+
ru: string;
|
|
115
|
+
};
|
|
116
|
+
'query.deep_first_step': {
|
|
117
|
+
code: "invalid_query";
|
|
118
|
+
ru: string;
|
|
119
|
+
};
|
|
120
|
+
'query.deep_hop': {
|
|
121
|
+
code: "invalid_query";
|
|
122
|
+
ru: string;
|
|
123
|
+
};
|
|
124
|
+
'query.deep_with_deleted': {
|
|
125
|
+
code: "invalid_query";
|
|
126
|
+
ru: string;
|
|
127
|
+
};
|
|
128
|
+
'query.after_without_sort': {
|
|
129
|
+
code: "invalid_query";
|
|
130
|
+
ru: string;
|
|
131
|
+
};
|
|
132
|
+
'query.bad_uuid': {
|
|
133
|
+
code: "invalid_query";
|
|
134
|
+
ru: string;
|
|
135
|
+
hint: string;
|
|
136
|
+
};
|
|
137
|
+
'query.agg_field': {
|
|
138
|
+
code: "invalid_query";
|
|
139
|
+
ru: string;
|
|
140
|
+
};
|
|
141
|
+
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
export const query = {
|
|
2
|
+
// sql.ts, sortSpec: поле sort() не из списка
|
|
3
|
+
'query.sort_field': {
|
|
4
|
+
code: 'invalid_query',
|
|
5
|
+
ru: "sort: поле 'at', 'rev', 'id' или 'data.<путь>', а не '{field}'",
|
|
6
|
+
},
|
|
7
|
+
// sql.ts, sortSpec: поле sort() похоже на имя поля данных без префикса data. (sort('code'))
|
|
8
|
+
'query.sort_field_data': {
|
|
9
|
+
code: 'invalid_query',
|
|
10
|
+
ru: "sort: поле 'at', 'rev', 'id' или 'data.<путь>', а не '{field}' — может быть, data.{field}?",
|
|
11
|
+
hint: "поле данных в sort() — с префиксом data.: sort('data.code'); колонки строки — 'at' (время версии), 'rev', 'id'",
|
|
12
|
+
},
|
|
13
|
+
// sql.ts, checkField: поле фильтра, sort() или агрегата не описано ни в одном классе шага (в 1.5 — предупреждение, с 2.0 —
|
|
14
|
+
// отказ); where — шаг или вызов, как в коде: Shop({ nmae }), sort('data.nmae'), sum('data.nmae')
|
|
15
|
+
'query.unknown_field': {
|
|
16
|
+
code: 'invalid_query',
|
|
17
|
+
ru: '{where}: поле {field} не описано в классе {cls}',
|
|
18
|
+
hint: 'проверить имя поля: похожие названы в тексте, поля класса — db.registry.resolve(класс).schema',
|
|
19
|
+
},
|
|
20
|
+
// sql.ts, resolveHop: классы соседних шагов не ссылаются друг на друга; from, to — имена шагов
|
|
21
|
+
'query.no_path': {
|
|
22
|
+
code: 'no_path',
|
|
23
|
+
ru: 'нет перехода {from} → {to}: ни один класс не ссылается на другой',
|
|
24
|
+
},
|
|
25
|
+
// sql.ts, compileOp: оператор фильтра, которого построитель не знает
|
|
26
|
+
'query.unknown_op': {
|
|
27
|
+
code: 'invalid_query',
|
|
28
|
+
ru: 'неизвестный оператор {op}',
|
|
29
|
+
},
|
|
30
|
+
// sql.ts, compileTags: значение tags()
|
|
31
|
+
'query.tags_arg': {
|
|
32
|
+
code: 'invalid_query',
|
|
33
|
+
ru: 'tags() принимает строку, список или has/hasAny/hasAll',
|
|
34
|
+
},
|
|
35
|
+
// sql.ts, compileFilter: оператор, кроме or(…), вместо фильтра шага
|
|
36
|
+
'query.step_op': {
|
|
37
|
+
code: 'invalid_query',
|
|
38
|
+
ru: 'оператор {op} на уровне фильтра шага — допустим только or(…)',
|
|
39
|
+
},
|
|
40
|
+
// sql.ts, compileFilter: фильтр — список, а в нём не id
|
|
41
|
+
'query.id_list': {
|
|
42
|
+
code: 'invalid_query',
|
|
43
|
+
ru: 'список id: ожидались строки',
|
|
44
|
+
},
|
|
45
|
+
// sql.ts, compileFilter: { id: […] } — в списке не id
|
|
46
|
+
'query.filter_id_list': {
|
|
47
|
+
code: 'invalid_query',
|
|
48
|
+
ru: 'filter.id: ожидались строки',
|
|
49
|
+
},
|
|
50
|
+
// sql.ts, compileFilter: { id } — не строка и не список
|
|
51
|
+
'query.filter_id': {
|
|
52
|
+
code: 'invalid_query',
|
|
53
|
+
ru: 'filter.id принимает строку или список строк',
|
|
54
|
+
},
|
|
55
|
+
// sql.ts, compileFilter: значение конца в фильтре шага; role — имя конца
|
|
56
|
+
'query.end_value': {
|
|
57
|
+
code: 'invalid_query',
|
|
58
|
+
ru: 'конец {role}: ожидался id, строка ответа или null',
|
|
59
|
+
},
|
|
60
|
+
// sql.ts, cursorParams: курсор — не объект со значением v; field — поле sort()
|
|
61
|
+
'query.cursor_shape': {
|
|
62
|
+
code: 'invalid_query',
|
|
63
|
+
ru: "after(cursor): курсор — объект { v, id } из cursorOf(строка, '{field}')",
|
|
64
|
+
},
|
|
65
|
+
// sql.ts, cursorParams: id курсора — не uuid; id — значение, как его печатает shown() (JSON, длинное — с многоточием)
|
|
66
|
+
'query.cursor_id': {
|
|
67
|
+
code: 'invalid_query',
|
|
68
|
+
ru: 'after(cursor): id курсора — uuid строки, а не {id}',
|
|
69
|
+
},
|
|
70
|
+
// sql.ts, cursorParams: значение курсора не подходит к типу поля sort(); value — как печатает shown(), expect — текст
|
|
71
|
+
// записи query.cursor_expect_* (lmsg)
|
|
72
|
+
'query.cursor_value': {
|
|
73
|
+
code: 'invalid_query',
|
|
74
|
+
ru: "after(cursor): значение курсора {value} не подходит к sort('{field}') — ожидалось: {expect}; курсор снят с другого поля? Нужен cursorOf(строка, '{field}')",
|
|
75
|
+
},
|
|
76
|
+
// то же у поля данных, которого в строке может не быть: подходит и курсор null
|
|
77
|
+
'query.cursor_value_nullable': {
|
|
78
|
+
code: 'invalid_query',
|
|
79
|
+
ru: "after(cursor): значение курсора {value} не подходит к sort('{field}') — ожидалось: {expect} или null; курсор снят с другого поля? Нужен cursorOf(строка, '{field}')",
|
|
80
|
+
},
|
|
81
|
+
// sql.ts, CURSOR_EXPECT: какое значение курсора ждёт поле sort() по своему типу — параметр expect двух записей выше
|
|
82
|
+
'query.cursor_expect_numeric': {
|
|
83
|
+
code: 'invalid_query',
|
|
84
|
+
ru: 'число',
|
|
85
|
+
},
|
|
86
|
+
'query.cursor_expect_int': {
|
|
87
|
+
code: 'invalid_query',
|
|
88
|
+
ru: 'целое число',
|
|
89
|
+
},
|
|
90
|
+
'query.cursor_expect_boolean': {
|
|
91
|
+
code: 'invalid_query',
|
|
92
|
+
ru: 'true/false',
|
|
93
|
+
},
|
|
94
|
+
'query.cursor_expect_text': {
|
|
95
|
+
code: 'invalid_query',
|
|
96
|
+
ru: 'строка',
|
|
97
|
+
},
|
|
98
|
+
'query.cursor_expect_uuid': {
|
|
99
|
+
code: 'invalid_query',
|
|
100
|
+
ru: 'uuid строкой',
|
|
101
|
+
},
|
|
102
|
+
'query.cursor_expect_timestamptz': {
|
|
103
|
+
code: 'invalid_query',
|
|
104
|
+
ru: 'время строкой вида 2026-10-07T10:00:00Z',
|
|
105
|
+
},
|
|
106
|
+
'query.cursor_expect_date': {
|
|
107
|
+
code: 'invalid_query',
|
|
108
|
+
ru: 'дата строкой вида 2026-10-07',
|
|
109
|
+
},
|
|
110
|
+
'query.cursor_expect_jsonb': {
|
|
111
|
+
code: 'invalid_query',
|
|
112
|
+
ru: 'строка, число, true/false',
|
|
113
|
+
},
|
|
114
|
+
// sql.ts, cursorRev: rev курсора versions(); rev — как печатает shown()
|
|
115
|
+
'query.cursor_rev': {
|
|
116
|
+
code: 'invalid_query',
|
|
117
|
+
ru: 'after(cursor): rev курсора — номер версии (целое ≥ 1), а не {rev}',
|
|
118
|
+
},
|
|
119
|
+
// sql.ts, cursorPath: в курсоре paths() нет id узла; key — ключ узла в пути
|
|
120
|
+
'query.cursor_path': {
|
|
121
|
+
code: 'invalid_query',
|
|
122
|
+
ru: 'after(cursor): в курсоре пути нет id узла {key} — нужен cursorOf(путь, поле) из paths() этой же цепочки',
|
|
123
|
+
},
|
|
124
|
+
// sql.ts, cursorOf(): поле не из списка
|
|
125
|
+
'query.cursor_of_field': {
|
|
126
|
+
code: 'invalid_query',
|
|
127
|
+
ru: "cursorOf: поле 'at', 'rev', 'id' или 'data.<путь>', а не '{field}'",
|
|
128
|
+
},
|
|
129
|
+
// sql.ts, buildRead: цепочка без шагов
|
|
130
|
+
'query.empty_chain': {
|
|
131
|
+
code: 'invalid_query',
|
|
132
|
+
ru: 'пустая цепочка',
|
|
133
|
+
},
|
|
134
|
+
// sql.ts, buildRead: возврат к узлу, которого нет в пути; name — имя шага
|
|
135
|
+
'query.pivot_missing': {
|
|
136
|
+
code: 'invalid_query',
|
|
137
|
+
ru: 'возврат к узлу {name}: узла нет в этом пути',
|
|
138
|
+
},
|
|
139
|
+
// sql.ts, buildRead: deep() на первом шаге
|
|
140
|
+
'query.deep_first_step': {
|
|
141
|
+
code: 'invalid_query',
|
|
142
|
+
ru: 'deep() — на шаге перехода к тому же классу, а не на первом шаге',
|
|
143
|
+
},
|
|
144
|
+
// sql.ts, buildRead: deep() на переходе к другому классу; from, to — имена шагов
|
|
145
|
+
'query.deep_hop': {
|
|
146
|
+
code: 'invalid_query',
|
|
147
|
+
ru: 'deep() — только на переходе к тому же классу (дети любой глубины): {from} → {to}',
|
|
148
|
+
},
|
|
149
|
+
// sql.ts, buildRead: deep() вместе с withDeleted()
|
|
150
|
+
'query.deep_with_deleted': {
|
|
151
|
+
code: 'invalid_query',
|
|
152
|
+
ru: 'deep() и withDeleted() не сочетаются',
|
|
153
|
+
},
|
|
154
|
+
// sql.ts, buildRead: after() без sort()
|
|
155
|
+
'query.after_without_sort': {
|
|
156
|
+
code: 'invalid_query',
|
|
157
|
+
ru: 'after(cursor) требует sort(поле)',
|
|
158
|
+
},
|
|
159
|
+
// sql.ts, compileFilter: id шага, фильтра { id } или конца — не uuid (раньше — сырая ошибка PostgreSQL 22P02, у
|
|
160
|
+
// null — TypeError); value — значение, как в коде
|
|
161
|
+
'query.bad_uuid': {
|
|
162
|
+
code: 'invalid_query',
|
|
163
|
+
ru: '{where}: {value} — не uuid',
|
|
164
|
+
hint: 'id — строка uuid (row.id из ответа или db.idOf(…)); проверьте переменную: undefined и null — не id',
|
|
165
|
+
},
|
|
166
|
+
// sql.ts, buildRead: агрегат не по полю данных
|
|
167
|
+
'query.agg_field': {
|
|
168
|
+
code: 'invalid_query',
|
|
169
|
+
ru: "агрегат по полю 'data.<путь>'",
|
|
170
|
+
},
|
|
171
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export declare const sqlAccess: {
|
|
2
|
+
'sql-access.no_session': {
|
|
3
|
+
code: "no_session";
|
|
4
|
+
ru: string;
|
|
5
|
+
};
|
|
6
|
+
'sql-access.no_membership': {
|
|
7
|
+
code: "tenant_denied";
|
|
8
|
+
ru: string;
|
|
9
|
+
};
|
|
10
|
+
'sql-access.acl_bad_op': {
|
|
11
|
+
code: "invalid_data";
|
|
12
|
+
ru: string;
|
|
13
|
+
};
|
|
14
|
+
'sql-access.account_unavailable': {
|
|
15
|
+
code: "target_not_found";
|
|
16
|
+
ru: string;
|
|
17
|
+
};
|
|
18
|
+
'sql-access.no_right': {
|
|
19
|
+
code: "acl_denied";
|
|
20
|
+
ru: string;
|
|
21
|
+
};
|
|
22
|
+
'sql-access.default_deny': {
|
|
23
|
+
code: "acl_denied";
|
|
24
|
+
ru: string;
|
|
25
|
+
};
|
|
26
|
+
'sql-access.bind_denied': {
|
|
27
|
+
code: "acl_denied";
|
|
28
|
+
ru: string;
|
|
29
|
+
};
|
|
30
|
+
'sql-access.self_or_sysadmin': {
|
|
31
|
+
code: "acl_denied";
|
|
32
|
+
ru: string;
|
|
33
|
+
};
|
|
34
|
+
'sql-access.no_sessions_for_account': {
|
|
35
|
+
code: "acl_denied";
|
|
36
|
+
ru: string;
|
|
37
|
+
};
|
|
38
|
+
'sql-access.password_args': {
|
|
39
|
+
code: "invalid_data";
|
|
40
|
+
ru: string;
|
|
41
|
+
};
|
|
42
|
+
'sql-access.apikey_prefix_conflict': {
|
|
43
|
+
code: "conflict";
|
|
44
|
+
ru: string;
|
|
45
|
+
};
|
|
46
|
+
'sql-access.otp_args': {
|
|
47
|
+
code: "invalid_data";
|
|
48
|
+
ru: string;
|
|
49
|
+
};
|
|
50
|
+
'sql-access.account_not_found': {
|
|
51
|
+
code: "target_not_found";
|
|
52
|
+
ru: string;
|
|
53
|
+
};
|
|
54
|
+
'sql-access.otp_sysadmin_only': {
|
|
55
|
+
code: "acl_denied";
|
|
56
|
+
ru: string;
|
|
57
|
+
};
|
|
58
|
+
'sql-access.identity_args': {
|
|
59
|
+
code: "invalid_data";
|
|
60
|
+
ru: string;
|
|
61
|
+
};
|
|
62
|
+
'sql-access.last_service_key': {
|
|
63
|
+
code: "acl_denied";
|
|
64
|
+
ru: string;
|
|
65
|
+
};
|
|
66
|
+
'sql-access.switch_impersonating': {
|
|
67
|
+
code: "acl_denied";
|
|
68
|
+
ru: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export const sqlAccess = {
|
|
2
|
+
// 50-acl.sql (acl_check, acl_require), 80-auth.sql (auth_session_required, auth_can_manage, auth_switch): сессии нет
|
|
3
|
+
'sql-access.no_session': {
|
|
4
|
+
code: 'no_session',
|
|
5
|
+
ru: 'нет действующей сессии',
|
|
6
|
+
},
|
|
7
|
+
// 50-acl.sql, acl_subject(); 80-auth.sql, auth_switch(): аккаунт не член арендатора-цели
|
|
8
|
+
'sql-access.no_membership': {
|
|
9
|
+
code: 'tenant_denied',
|
|
10
|
+
ru: 'нет членства в арендаторе',
|
|
11
|
+
},
|
|
12
|
+
// 50-acl.sql, acl_plan(): op — переданная операция
|
|
13
|
+
'sql-access.acl_bad_op': {
|
|
14
|
+
code: 'invalid_data',
|
|
15
|
+
ru: 'операция {op}: нужна READ, WRITE или DELETE',
|
|
16
|
+
},
|
|
17
|
+
// 50-acl.sql, acl_subject()
|
|
18
|
+
'sql-access.account_unavailable': {
|
|
19
|
+
code: 'target_not_found',
|
|
20
|
+
ru: 'аккаунт не найден или отключён',
|
|
21
|
+
},
|
|
22
|
+
// 50-acl.sql, acl_require(): endpoint — эндпоинт API
|
|
23
|
+
'sql-access.no_right': {
|
|
24
|
+
code: 'acl_denied',
|
|
25
|
+
ru: 'нет права {endpoint}',
|
|
26
|
+
},
|
|
27
|
+
// 50-acl.sql, acl_api_for(): message решения по эндпоинту без подходящего правила — текст не для ошибки (lt_text)
|
|
28
|
+
'sql-access.default_deny': {
|
|
29
|
+
code: 'acl_denied',
|
|
30
|
+
ru: 'нет подходящего правила (запрет по умолчанию)',
|
|
31
|
+
},
|
|
32
|
+
// 80-auth.sql (auth_can_manage, auth_set_password, auth_link): нет недавнего входа и права auth.credential
|
|
33
|
+
'sql-access.bind_denied': {
|
|
34
|
+
code: 'acl_denied',
|
|
35
|
+
ru: 'привязка отклонена: нужен недавний вход или право auth.credential',
|
|
36
|
+
},
|
|
37
|
+
// 80-auth.sql, auth_guard()
|
|
38
|
+
'sql-access.self_or_sysadmin': {
|
|
39
|
+
code: 'acl_denied',
|
|
40
|
+
ru: 'креды и сессии этого аккаунта меняет только он сам или системный администратор',
|
|
41
|
+
},
|
|
42
|
+
// 80-auth.sql, issue_session()
|
|
43
|
+
'sql-access.no_sessions_for_account': {
|
|
44
|
+
code: 'acl_denied',
|
|
45
|
+
ru: 'сессии для этого аккаунта не выпускаются',
|
|
46
|
+
},
|
|
47
|
+
// 80-auth.sql, auth_set_password()
|
|
48
|
+
'sql-access.password_args': {
|
|
49
|
+
code: 'invalid_data',
|
|
50
|
+
ru: 'пароль: вид, идентификатор и хэш scrypt$… обязательны',
|
|
51
|
+
},
|
|
52
|
+
// 80-auth.sql, auth_issue_apikey(): SQLSTATE 40001 — повторяемый конфликт
|
|
53
|
+
'sql-access.apikey_prefix_conflict': {
|
|
54
|
+
code: 'conflict',
|
|
55
|
+
ru: 'не удалось выпустить ключ с уникальным префиксом',
|
|
56
|
+
},
|
|
57
|
+
// 80-auth.sql, auth_issue_otp()
|
|
58
|
+
'sql-access.otp_args': {
|
|
59
|
+
code: 'invalid_data',
|
|
60
|
+
ru: 'код: вид OTP или OTP_<имя>, идентификатор, 4–10 знаков',
|
|
61
|
+
},
|
|
62
|
+
// 80-auth.sql, auth_issue_otp()
|
|
63
|
+
'sql-access.account_not_found': {
|
|
64
|
+
code: 'target_not_found',
|
|
65
|
+
ru: 'аккаунт не найден',
|
|
66
|
+
},
|
|
67
|
+
// 80-auth.sql, auth_issue_otp()
|
|
68
|
+
'sql-access.otp_sysadmin_only': {
|
|
69
|
+
code: 'acl_denied',
|
|
70
|
+
ru: 'коды входа для System, сервисов и системных администраторов выпускает только системный администратор',
|
|
71
|
+
},
|
|
72
|
+
// 80-auth.sql, auth_link()
|
|
73
|
+
'sql-access.identity_args': {
|
|
74
|
+
code: 'invalid_data',
|
|
75
|
+
ru: 'identity: вид (TELEGRAM, GOOGLE, …) и идентификатор обязательны',
|
|
76
|
+
},
|
|
77
|
+
// 80-auth.sql, auth_revoke_credential()
|
|
78
|
+
'sql-access.last_service_key': {
|
|
79
|
+
code: 'acl_denied',
|
|
80
|
+
ru: 'последний действующий ключ сервиса не отзывается: сначала выпустите новый',
|
|
81
|
+
},
|
|
82
|
+
// 80-auth.sql, auth_switch()
|
|
83
|
+
'sql-access.switch_impersonating': {
|
|
84
|
+
code: 'acl_denied',
|
|
85
|
+
ru: 'auth.switch — для собственной сессии, не при имперсонации',
|
|
86
|
+
},
|
|
87
|
+
};
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
export declare const sqlCore: {
|
|
2
|
+
'sql-core.no_membership': {
|
|
3
|
+
code: "tenant_denied";
|
|
4
|
+
ru: string;
|
|
5
|
+
};
|
|
6
|
+
'sql-core.account_not_id': {
|
|
7
|
+
code: "acl_denied";
|
|
8
|
+
ru: string;
|
|
9
|
+
};
|
|
10
|
+
'sql-core.no_impersonate_right': {
|
|
11
|
+
code: "acl_denied";
|
|
12
|
+
ru: string;
|
|
13
|
+
};
|
|
14
|
+
'sql-core.impersonation_no_account': {
|
|
15
|
+
code: "target_not_found";
|
|
16
|
+
ru: string;
|
|
17
|
+
hint: string;
|
|
18
|
+
};
|
|
19
|
+
'sql-core.impersonation_denied': {
|
|
20
|
+
code: "acl_denied";
|
|
21
|
+
ru: string;
|
|
22
|
+
};
|
|
23
|
+
'sql-core.tenant_not_id': {
|
|
24
|
+
code: "tenant_denied";
|
|
25
|
+
ru: string;
|
|
26
|
+
};
|
|
27
|
+
'sql-core.bad_api_key': {
|
|
28
|
+
code: "no_session";
|
|
29
|
+
ru: string;
|
|
30
|
+
hint: string;
|
|
31
|
+
};
|
|
32
|
+
'sql-core.pattern_trailing_backslash': {
|
|
33
|
+
code: "invalid_class";
|
|
34
|
+
ru: string;
|
|
35
|
+
};
|
|
36
|
+
'sql-core.pattern_escape_in_set': {
|
|
37
|
+
code: "invalid_class";
|
|
38
|
+
ru: string;
|
|
39
|
+
};
|
|
40
|
+
'sql-core.pattern_word_boundary': {
|
|
41
|
+
code: "invalid_class";
|
|
42
|
+
ru: string;
|
|
43
|
+
};
|
|
44
|
+
'sql-core.pattern_unicode_property': {
|
|
45
|
+
code: "invalid_class";
|
|
46
|
+
ru: string;
|
|
47
|
+
};
|
|
48
|
+
'sql-core.pattern_backreference': {
|
|
49
|
+
code: "invalid_class";
|
|
50
|
+
ru: string;
|
|
51
|
+
};
|
|
52
|
+
'sql-core.pattern_named_group': {
|
|
53
|
+
code: "invalid_class";
|
|
54
|
+
ru: string;
|
|
55
|
+
};
|
|
56
|
+
'sql-core.schema_node_not_object': {
|
|
57
|
+
code: "invalid_class";
|
|
58
|
+
ru: string;
|
|
59
|
+
};
|
|
60
|
+
'sql-core.keyword_unsupported': {
|
|
61
|
+
code: "invalid_class";
|
|
62
|
+
ru: string;
|
|
63
|
+
};
|
|
64
|
+
'sql-core.unknown_type': {
|
|
65
|
+
code: "invalid_class";
|
|
66
|
+
ru: string;
|
|
67
|
+
};
|
|
68
|
+
'sql-core.enum_objects_in_any_of': {
|
|
69
|
+
code: "invalid_class";
|
|
70
|
+
ru: string;
|
|
71
|
+
};
|
|
72
|
+
'sql-core.format_unsupported': {
|
|
73
|
+
code: "invalid_class";
|
|
74
|
+
ru: string;
|
|
75
|
+
};
|
|
76
|
+
'sql-core.format_in_any_of': {
|
|
77
|
+
code: "invalid_class";
|
|
78
|
+
ru: string;
|
|
79
|
+
};
|
|
80
|
+
'sql-core.string_length_in_any_of': {
|
|
81
|
+
code: "invalid_class";
|
|
82
|
+
ru: string;
|
|
83
|
+
};
|
|
84
|
+
'sql-core.unique_items_in_any_of': {
|
|
85
|
+
code: "invalid_class";
|
|
86
|
+
ru: string;
|
|
87
|
+
};
|
|
88
|
+
'sql-core.min_properties_in_any_of': {
|
|
89
|
+
code: "invalid_class";
|
|
90
|
+
ru: string;
|
|
91
|
+
};
|
|
92
|
+
'sql-core.issue_string_too_short': {
|
|
93
|
+
code: "invalid_data";
|
|
94
|
+
ru: string;
|
|
95
|
+
};
|
|
96
|
+
'sql-core.issue_string_too_long': {
|
|
97
|
+
code: "invalid_data";
|
|
98
|
+
ru: string;
|
|
99
|
+
};
|
|
100
|
+
'sql-core.issue_unique_items': {
|
|
101
|
+
code: "invalid_data";
|
|
102
|
+
ru: string;
|
|
103
|
+
};
|
|
104
|
+
'sql-core.issue_date': {
|
|
105
|
+
code: "invalid_data";
|
|
106
|
+
ru: string;
|
|
107
|
+
};
|
|
108
|
+
'sql-core.issue_property_count': {
|
|
109
|
+
code: "invalid_data";
|
|
110
|
+
ru: string;
|
|
111
|
+
};
|
|
112
|
+
'sql-core.issue_enum': {
|
|
113
|
+
code: "invalid_data";
|
|
114
|
+
ru: string;
|
|
115
|
+
};
|
|
116
|
+
'sql-core.issue_additional': {
|
|
117
|
+
code: "invalid_data";
|
|
118
|
+
ru: string;
|
|
119
|
+
};
|
|
120
|
+
'sql-core.issue_rule': {
|
|
121
|
+
code: "invalid_data";
|
|
122
|
+
ru: string;
|
|
123
|
+
};
|
|
124
|
+
'sql-core.issue_schema': {
|
|
125
|
+
code: "invalid_data";
|
|
126
|
+
ru: string;
|
|
127
|
+
};
|
|
128
|
+
'sql-core.parent_not_found': {
|
|
129
|
+
code: "invalid_class";
|
|
130
|
+
ru: string;
|
|
131
|
+
};
|
|
132
|
+
'sql-core.inheritance_cycle': {
|
|
133
|
+
code: "invalid_class";
|
|
134
|
+
ru: string;
|
|
135
|
+
};
|
|
136
|
+
'sql-core.class_metaschema': {
|
|
137
|
+
code: "invalid_data";
|
|
138
|
+
ru: string;
|
|
139
|
+
};
|
|
140
|
+
'sql-core.meta_too_large': {
|
|
141
|
+
code: "invalid_class";
|
|
142
|
+
ru: string;
|
|
143
|
+
};
|
|
144
|
+
'sql-core.key_field_type': {
|
|
145
|
+
code: "invalid_class";
|
|
146
|
+
ru: string;
|
|
147
|
+
};
|
|
148
|
+
'sql-core.key_end_type': {
|
|
149
|
+
code: "invalid_class";
|
|
150
|
+
ru: string;
|
|
151
|
+
};
|
|
152
|
+
'sql-core.key_unknown_name': {
|
|
153
|
+
code: "invalid_class";
|
|
154
|
+
ru: string;
|
|
155
|
+
};
|
|
156
|
+
'sql-core.unset_required_end': {
|
|
157
|
+
code: "invalid_class";
|
|
158
|
+
ru: string;
|
|
159
|
+
};
|
|
160
|
+
'sql-core.system_history_off': {
|
|
161
|
+
code: "invalid_class";
|
|
162
|
+
ru: string;
|
|
163
|
+
};
|
|
164
|
+
};
|