letopis 1.4.2 → 2.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 +329 -281
- package/CHANGELOG.md +418 -0
- package/README.md +572 -1053
- package/dist/acl.d.ts +78 -1
- package/dist/acl.js +264 -13
- package/dist/admin.d.ts +10 -141
- package/dist/admin.js +24 -184
- package/dist/auth.d.ts +2 -2
- package/dist/auth.js +5 -15
- package/dist/cache.d.ts +8 -1
- package/dist/cache.js +30 -8
- package/dist/chain.d.ts +18 -41
- package/dist/chain.js +165 -203
- package/dist/cli.js +45 -90
- 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 +59 -13
- package/dist/errors.js +190 -29
- package/dist/index.d.ts +52 -70
- package/dist/index.js +189 -122
- package/dist/internal.d.ts +5 -0
- package/dist/jsonschema.js +18 -17
- package/dist/load.d.ts +20 -12
- package/dist/load.js +207 -181
- package/dist/mcp.d.ts +5 -7
- package/dist/mcp.js +168 -214
- package/dist/messages/access.d.ts +90 -0
- package/dist/messages/access.js +113 -0
- package/dist/messages/api.d.ts +171 -0
- package/dist/messages/api.js +215 -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 +95 -0
- package/dist/messages/index.js +118 -0
- package/dist/messages/mcp.d.ts +306 -0
- package/dist/messages/mcp.js +387 -0
- package/dist/messages/model.d.ts +233 -0
- package/dist/messages/model.js +283 -0
- package/dist/messages/query.d.ts +131 -0
- package/dist/messages/query.js +158 -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 +150 -0
- package/dist/messages/sql-core.js +181 -0
- package/dist/messages/sql-time.d.ts +71 -0
- package/dist/messages/sql-time.js +88 -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 +405 -0
- package/dist/messages/write.js +509 -0
- package/dist/model.d.ts +73 -60
- package/dist/model.js +20 -29
- 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 +7 -1
- package/dist/sql.js +101 -85
- package/dist/sync.d.ts +9 -3
- package/dist/sync.js +40 -17
- package/dist/tx.d.ts +11 -1
- package/dist/tx.js +32 -11
- package/dist/typed.d.ts +240 -45
- package/dist/types.d.ts +15 -90
- package/dist/types.js +12 -14
- package/dist/up.d.ts +53 -32
- package/dist/up.js +180 -74
- package/dist/uuid.js +5 -5
- package/dist/validate.d.ts +13 -1
- package/dist/validate.js +61 -29
- package/dist/watch.d.ts +5 -16
- package/dist/watch.js +23 -77
- package/dist/write.d.ts +9 -16
- package/dist/write.js +102 -185
- package/llms.txt +22 -25
- package/package.json +2 -9
- package/sql/10-core.sql +7 -50
- package/sql/15-errors.sql +64 -10
- package/sql/20-context.sql +7 -6
- package/sql/30-validate.sql +35 -27
- package/sql/40-class.sql +20 -114
- 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 +23 -27
- package/sql/90-time.sql +77 -944
- package/sql/95-seed.system.sql +7 -14
- package/sql/99-revision.sql +2 -1
- package/sql/README.md +32 -24
- package/sql/migrate/README.md +14 -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
package/dist/types.js
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
5
|
* Ревизия схемы, которую знает эта версия пакета, — номер версии SQL-части letopis (таблиц и функций в схеме установки).
|
|
6
|
-
* После `up()` у схемы та же ревизия (`r.revision`); схему отставшей ревизии `up()` обновляет только с
|
|
7
|
-
* а `connect()` о ней предупреждает.
|
|
6
|
+
* После `up()` у схемы та же ревизия (`r.revision`); схему отставшей ревизии 2.x `up()` обновляет только с
|
|
7
|
+
* `upgrade: true`, а `connect()` о ней предупреждает.
|
|
8
8
|
*/
|
|
9
|
-
export const DDL_REVISION =
|
|
9
|
+
export const DDL_REVISION = 8;
|
|
10
10
|
/**
|
|
11
11
|
* Классы, строки которых меняют права и схему: их запись повышает счётчик прав (загрузчик), а сигнал
|
|
12
12
|
* сбрасывает весь кэш результатов и пропуска прав. Тот же список — в триггерах базы (60-write.sql).
|
|
@@ -16,28 +16,26 @@ export const ACL_CLASS_NAMES = ['rule', 'Resource', 'member', 'Account', 'Class'
|
|
|
16
16
|
// Методы цепочки — единственный источник зарезервированных имён (план, §2.14, этап 3, п. 10)
|
|
17
17
|
// ---------------------------------------------------------------------------
|
|
18
18
|
/**
|
|
19
|
-
* Имена методов цепочки: модификаторы, терминалы, глаголы записи и слоты концов, а также `then
|
|
20
|
-
*
|
|
19
|
+
* Имена методов цепочки: модификаторы, терминалы, глаголы записи и слоты концов, а также `then`. После шага цепочки эти
|
|
20
|
+
* имена библиотека не ищет среди классов; все они входят в `RESERVED_CLASS_NAMES`.
|
|
21
21
|
*/
|
|
22
22
|
export const CHAIN_METHODS = [
|
|
23
23
|
'then', 'entity', 'paths', 'rows', 'first', 'ids', 'count', 'limit', 'offset', 'sort', 'asOf', 'withDeleted',
|
|
24
24
|
'deep', 'exact', 'sum', 'avg', 'min', 'max', 'countBy', 'after', 'versions', 'create', 'update', 'upsert', 'set',
|
|
25
|
-
'unset', 'add', 'remove', 'delete', '
|
|
26
|
-
'forUpdate', 'cache', 'rekey', 'run', 'execute', 'account', 'diff', 'blame',
|
|
25
|
+
'unset', 'add', 'remove', 'delete', 'restore', 'alias', 'tags', 'owner', 'forUpdate', 'cache',
|
|
27
26
|
];
|
|
28
27
|
/** Свойства корня db (и транзакции db.begin()). */
|
|
29
28
|
export const DB_METHODS = [
|
|
30
|
-
'as', 'begin', 'commit', 'rollback', 'lock', 'batch', 'watch', 'close', 'registry', 'sql', 'load',
|
|
31
|
-
'maintain', '
|
|
32
|
-
'token', 'tenant', 'reloadSchema', 'accounts', 'credentials', 'resources', 'rules', 'compact',
|
|
33
|
-
'trimHistory', 'rekeyClass', 'cache', 'projector', 'rebuildAggregates',
|
|
29
|
+
'as', 'begin', 'commit', 'rollback', 'lock', 'batch', 'watch', 'close', 'registry', 'sql', 'load',
|
|
30
|
+
'maintain', 'auth', 'acl', 'idOf', 'refresh', 'transaction', 'flushSignals', 'schema', 'token', 'tenant', 'cache',
|
|
34
31
|
];
|
|
35
32
|
/** Свойства батча db.batch(name). */
|
|
36
|
-
export const BATCH_METHODS = ['discard', 'size'];
|
|
33
|
+
export const BATCH_METHODS = ['run', 'discard', 'size'];
|
|
37
34
|
/**
|
|
38
35
|
* Имена методов цепочки, корня `db` и батча. Там, где имя занято методом, библиотека не ищет его среди классов, и шаг с
|
|
39
|
-
* таким именем до класса не
|
|
40
|
-
*
|
|
36
|
+
* таким именем до класса не дойдёт. Хаб с таким именем отклоняют `hub()`, `syncModels` и база, связь (`link`) — база
|
|
37
|
+
* (`invalid_class`; план 2.0, этап 4, п. 2); хаб, заведённый мимо проверки базы, `up()` оставляет и называет в
|
|
38
|
+
* предупреждении.
|
|
41
39
|
*/
|
|
42
40
|
export const RESERVED_CLASS_NAMES = [...new Set([...CHAIN_METHODS, ...DB_METHODS, ...BATCH_METHODS])];
|
|
43
41
|
/** Метка операторов фильтра (символ не пересекается с данными). */
|
package/dist/up.d.ts
CHANGED
|
@@ -3,22 +3,23 @@ import { type PgliteOptions, type PgliteServer } from './pglite.js';
|
|
|
3
3
|
import { type SignalMode } from './signals.js';
|
|
4
4
|
export declare const SYSTEM_ID = "2eba6d0a-1edd-4bb6-a85a-a703dab49035";
|
|
5
5
|
export declare const SCHEMA_VERSION = "v2";
|
|
6
|
+
/**
|
|
7
|
+
* Первая ревизия движка 2.0 (план 2.0, редакция 2): схема ниже неё — letopis 1.x или схема без штампа ревизии. Её
|
|
8
|
+
* `up()` не обновляет, а `connect()` к ней не подключается: 2.0 ставится только заново (`up({ fresh: true })`), данные
|
|
9
|
+
* 1.x не переносятся. Накат миграций `up({ upgrade })` — в пределах 2.x, от этой ревизии до `DDL_REVISION`.
|
|
10
|
+
*/
|
|
11
|
+
export declare const FIRST_REVISION = 8;
|
|
12
|
+
/**
|
|
13
|
+
* Отказ на схеме letopis 1.x (план 2.0, 7.10 №5): ревизия из комментария схемы ниже `FIRST_REVISION` — 7 и ниже у 1.x,
|
|
14
|
+
* 0 — штампа ревизии нет. `up()` зовёт её до любых изменений (до общей части `install()`), `connect()` — до входа по
|
|
15
|
+
* ключу: функции схемы 1.x не вызываются.
|
|
16
|
+
*/
|
|
17
|
+
export declare function refuse1x(schema: string, rev: number): void;
|
|
6
18
|
export interface InstallOptions {
|
|
7
19
|
/** Полное имя схемы с версией, например `v2.salon`. */
|
|
8
20
|
schema: string;
|
|
9
21
|
owner?: string;
|
|
10
22
|
app?: string;
|
|
11
|
-
/**
|
|
12
|
-
* Разрешить `db.reset()` и `maintain({ now })` — для тестовых установок и стендов; по умолчанию запрещено. Значение
|
|
13
|
-
* задаётся при установке и хранится в схеме: каждый `up()` записывает его заново (план, §2.2).
|
|
14
|
-
*/
|
|
15
|
-
allowReset?: boolean;
|
|
16
|
-
/**
|
|
17
|
-
* Политика хранения истории для классов без своей, например
|
|
18
|
-
* `{ all: '1 day', daily: '1 week', weekly: '1 month', monthly: '1 year', yearly: 'forever' }`; не задана — история
|
|
19
|
-
* хранится вся. Значение задаётся при установке и хранится в схеме: каждый `up()` записывает его заново (план, §2.11).
|
|
20
|
-
*/
|
|
21
|
-
history?: HistoryPolicy;
|
|
22
23
|
/** Номер последнего накатываемого файла — для пошаговых тестов. */
|
|
23
24
|
upTo?: number;
|
|
24
25
|
/** Сиды после ядра: имена lib/sql/seed.<имя>.sql (например 'booking') или пути к своим файлам .sql. */
|
|
@@ -37,20 +38,10 @@ export interface InstallOptions {
|
|
|
37
38
|
/**
|
|
38
39
|
* Что видно в сигналах базы (`NOTIFY`): `'class'` (у новой схемы по умолчанию) — имя класса; `'tenant'` — имя класса и
|
|
39
40
|
* псевдоним арендатора (токен); `'opaque'` — только псевдонимы класса и арендатора; `'none'` — сигналов нет.
|
|
40
|
-
* Режим хранится в схеме: `up()` без опции его не
|
|
41
|
+
* Режим хранится в схеме: `up()` без опции его не меняет.
|
|
41
42
|
*/
|
|
42
43
|
signals?: SignalMode;
|
|
43
44
|
}
|
|
44
|
-
/** Политика хранения истории (§2.11): сроки ярусов по возрастанию, 'forever' — бессрочно. */
|
|
45
|
-
export interface HistoryPolicy {
|
|
46
|
-
all: string;
|
|
47
|
-
daily?: string;
|
|
48
|
-
weekly?: string;
|
|
49
|
-
monthly?: string;
|
|
50
|
-
yearly?: string;
|
|
51
|
-
/** Часовой пояс границ периодов (по умолчанию UTC). */
|
|
52
|
-
tz?: string;
|
|
53
|
-
}
|
|
54
45
|
export interface InstallResult {
|
|
55
46
|
schema: string;
|
|
56
47
|
owner: string;
|
|
@@ -75,8 +66,9 @@ export interface EngineStamp {
|
|
|
75
66
|
sql: string;
|
|
76
67
|
}
|
|
77
68
|
/**
|
|
78
|
-
* Штамп движка этого пакета. Хэш — по исходному тексту файлов ядра до подстановок (переводы строк — LF)
|
|
79
|
-
*
|
|
69
|
+
* Штамп движка этого пакета. Хэш — по исходному тексту файлов ядра до подстановок (переводы строк — LF) и по каталогу
|
|
70
|
+
* сообщений базы (разделы sql-*, подстановка @MESSAGES@): одна и та же сборка даёт один штамп при любых опциях
|
|
71
|
+
* установки, а версия пакета без правок SQL и этих разделов штамп не меняет.
|
|
80
72
|
*/
|
|
81
73
|
export declare function engineStamp(): Promise<EngineStamp>;
|
|
82
74
|
/** Сравнение версий semver (метаданные сборки не учитываются): меньше нуля, ноль, больше нуля. */
|
|
@@ -101,14 +93,14 @@ export interface UpOptions extends Omit<InstallOptions, 'schema' | 'upTo' | 'mig
|
|
|
101
93
|
schema: string;
|
|
102
94
|
/** Удалить схему и поставить заново. ДАННЫЕ СХЕМЫ ТЕРЯЮТСЯ. */
|
|
103
95
|
fresh?: boolean;
|
|
104
|
-
/** Обновить схему отставшей
|
|
96
|
+
/** Обновить схему отставшей ревизии 2.x: миграции и повторный накат; данные сохраняются. */
|
|
105
97
|
upgrade?: boolean;
|
|
106
98
|
/** Без сообщений в консоль. */
|
|
107
99
|
quiet?: boolean;
|
|
108
100
|
/** Сколько ждать базу, мс (по умолчанию 60 000). */
|
|
109
101
|
waitTimeoutMs?: number;
|
|
110
102
|
/**
|
|
111
|
-
* Запустить PGlite — PostgreSQL прямо в процессе Node — для разработки без своего
|
|
103
|
+
* Запустить PGlite — PostgreSQL прямо в процессе Node — для разработки без своего сервера;
|
|
112
104
|
* подключение к нему — `connect({ dsn: r.pglite.dsn, schema: r.schema, listen: false, max: 1, allowBypassRls: true })`.
|
|
113
105
|
* Соединение у PGlite одно, поэтому одновременные транзакции и гонки на нём не проверить: для таких тестов и в CI нужен
|
|
114
106
|
* настоящий PostgreSQL.
|
|
@@ -119,6 +111,19 @@ export interface UpOptions extends Omit<InstallOptions, 'schema' | 'upTo' | 'mig
|
|
|
119
111
|
* кладёт итог в `r.tenant` — свой сид для этого не нужен.
|
|
120
112
|
*/
|
|
121
113
|
tenant?: TenantOptions;
|
|
114
|
+
/**
|
|
115
|
+
* Роль приложения с логином (план 2.0, этап 3): заводится или получает новый пароль и членство в роли приложения
|
|
116
|
+
* (`letopis_app`). Имя и пароль квотирует база (`format` с `%I` и `%L`). Привилегированную роль — суперпользователя,
|
|
117
|
+
* с `CREATEROLE`, `CREATEDB`, `REPLICATION`, `BYPASSRLS`, роль-владельца или её члена — up() не трогает
|
|
118
|
+
* (`invalid_data`). Строка подключения роли — `r.login.dsn`: с ней и `connect({ admin })` малое приложение работает
|
|
119
|
+
* одним процессом.
|
|
120
|
+
*/
|
|
121
|
+
login?: LoginOptions;
|
|
122
|
+
}
|
|
123
|
+
/** Роль приложения up({ login }). */
|
|
124
|
+
export interface LoginOptions {
|
|
125
|
+
user: string;
|
|
126
|
+
password: string;
|
|
122
127
|
}
|
|
123
128
|
export interface UpResult extends InstallResult {
|
|
124
129
|
/** Схемы не было — поставлена. */
|
|
@@ -127,13 +132,28 @@ export interface UpResult extends InstallResult {
|
|
|
127
132
|
upgraded: boolean;
|
|
128
133
|
/** Ревизия движка после наката. */
|
|
129
134
|
revision: number;
|
|
130
|
-
/**
|
|
135
|
+
/**
|
|
136
|
+
* Таблицы, у которых статистики не было и ANALYZE от роли владельца её собрал; оставшиеся без статистики — в
|
|
137
|
+
* `warnings`.
|
|
138
|
+
*/
|
|
131
139
|
analyzed: string[];
|
|
132
140
|
/** up({ pglite }): запущенный PGlite — строка подключения и остановка. */
|
|
133
141
|
pglite?: PgliteServer;
|
|
134
142
|
/** up({ tenant }): арендатор (и его первый пользователь с сессией). */
|
|
135
143
|
tenant?: TenantResult;
|
|
136
|
-
/**
|
|
144
|
+
/**
|
|
145
|
+
* up({ login }): роль приложения — заведена (`created`) или получила новый пароль; `dsn` — строка подключения роли
|
|
146
|
+
* (из `dsn` установки или PGlite; при готовом пуле `sql` её нет).
|
|
147
|
+
*/
|
|
148
|
+
login?: {
|
|
149
|
+
user: string;
|
|
150
|
+
created: boolean;
|
|
151
|
+
dsn?: string;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Предупреждения (версия сервера, таблицы без статистики, хабы с зарезервированными именами); без quiet каждое уже
|
|
155
|
+
* напечатано через console.warn.
|
|
156
|
+
*/
|
|
137
157
|
warnings: string[];
|
|
138
158
|
}
|
|
139
159
|
type Ping = {
|
|
@@ -152,18 +172,19 @@ export declare function ensureDatabase(dsn: string, log?: (m: string) => void):
|
|
|
152
172
|
* иначе отказ. Возвращает предупреждения: с чем установка работает, но рискует.
|
|
153
173
|
*/
|
|
154
174
|
export declare function checkServer(versionNum: number, encoding: string): string[];
|
|
155
|
-
/** Ревизия движка схемы по комментарию 'letopis ddl_revision=N'; схемы нет — null. */
|
|
175
|
+
/** Ревизия движка схемы по комментарию 'letopis ddl_revision=N'; схемы нет — null, штампа ревизии нет — 0. */
|
|
156
176
|
export declare function schemaRevision(sql: Pick<postgres.Sql, 'unsafe'>, schema: string): Promise<number | null>;
|
|
157
177
|
/**
|
|
158
178
|
* Ставит или обновляет установку letopis в схеме. Если схема уже есть и её ревизия та же, что у пакета, `up()` выполняет
|
|
159
179
|
* повторный накат: заново ставит функции, не трогая данные, — поэтому его можно вызывать при каждом запуске приложения.
|
|
160
|
-
* Схему отставшей ревизии `up()` обновляет только с `upgrade: true`, а на схеме новее пакета отказывает.
|
|
180
|
+
* Схему отставшей ревизии 2.x `up()` обновляет только с `upgrade: true`, а на схеме новее пакета отказывает. Схему без
|
|
181
|
+
* штампа ревизии не трогает и отказывает (`invalid_data`): заново её ставит `up({ fresh: true })`.
|
|
161
182
|
*/
|
|
162
183
|
export declare function up(opts: UpOptions): Promise<UpResult>;
|
|
163
184
|
export interface TenantOptions {
|
|
164
185
|
/**
|
|
165
186
|
* Имя арендатора — его аккаунта в System. Из имени вычисляется id арендатора, поэтому одно имя — всегда один и тот же
|
|
166
|
-
*
|
|
187
|
+
* арендатор.
|
|
167
188
|
*/
|
|
168
189
|
name: string;
|
|
169
190
|
/** Правило арендатора «аутентифицированным можно всё» (READ, WRITE, DELETE; по умолчанию да). */
|
|
@@ -175,7 +196,7 @@ export interface TenantOptions {
|
|
|
175
196
|
password: string;
|
|
176
197
|
/**
|
|
177
198
|
* Вид пароля (по умолчанию PASSWORD) — как у auth.setPassword: `^[A-Z][A-Z0-9_]{1,31}$`, не служебный вид (SESSION,
|
|
178
|
-
* APIKEY, KEYSECRET, OTP, TOTP, KEY,
|
|
199
|
+
* APIKEY, KEYSECRET, OTP, TOTP, KEY, LOCK); иначе invalid_data.
|
|
179
200
|
*/
|
|
180
201
|
kind?: string;
|
|
181
202
|
ttl?: string;
|