letopis 0.20.3 → 1.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.en.md +368 -0
- package/AGENT-CHEATSHEET.md +354 -0
- package/CHANGELOG.md +348 -0
- package/MIGRATION.md +190 -0
- package/README.en.md +1937 -0
- package/README.md +1493 -3466
- package/dist/acl.d.ts +26 -50
- package/dist/acl.js +22 -267
- package/dist/admin.d.ts +138 -0
- package/dist/admin.js +170 -0
- package/dist/auth.d.ts +120 -73
- package/dist/auth.js +121 -306
- package/dist/cache.d.ts +73 -0
- package/dist/cache.js +148 -0
- package/dist/chain.d.ts +124 -191
- package/dist/chain.js +369 -551
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +164 -0
- package/dist/demo/booking.d.ts +289 -0
- package/dist/demo/booking.js +159 -0
- package/dist/errors.d.ts +29 -0
- package/dist/errors.js +70 -0
- package/dist/import.d.ts +179 -0
- package/dist/import.js +792 -0
- package/dist/index.d.ts +172 -26
- package/dist/index.js +304 -178
- package/dist/jsonschema.d.ts +22 -0
- package/dist/jsonschema.js +167 -0
- package/dist/load.d.ts +76 -0
- package/dist/load.js +884 -0
- package/dist/model.d.ts +166 -0
- package/dist/model.js +224 -0
- package/dist/ops.d.ts +7 -6
- package/dist/ops.js +7 -51
- package/dist/pglite.d.ts +22 -0
- package/dist/pglite.js +45 -0
- package/dist/registry.d.ts +57 -0
- package/dist/registry.js +82 -0
- package/dist/sql.d.ts +59 -142
- package/dist/sql.js +568 -654
- package/dist/sync.d.ts +31 -0
- package/dist/sync.js +108 -0
- package/dist/tx.d.ts +129 -8
- package/dist/tx.js +300 -73
- package/dist/typed.d.ts +97 -0
- package/dist/typed.js +1 -0
- package/dist/types.d.ts +71 -250
- package/dist/types.js +27 -108
- package/dist/up.d.ts +140 -47
- package/dist/up.js +339 -267
- package/dist/uuid.d.ts +21 -6
- package/dist/uuid.js +48 -64
- package/dist/validate.d.ts +24 -0
- package/dist/validate.js +251 -0
- package/dist/watch.d.ts +62 -0
- package/dist/watch.js +168 -0
- package/dist/write.d.ts +117 -74
- package/dist/write.js +658 -720
- package/llms.txt +26 -0
- package/package.json +49 -19
- package/sql/10-core.sql +136 -0
- package/sql/15-errors.sql +60 -0
- package/sql/20-context.sql +153 -0
- package/sql/30-validate.sql +423 -0
- package/sql/40-class.sql +259 -0
- package/sql/50-acl.sql +539 -0
- package/sql/60-write.sql +1369 -0
- package/sql/70-read.sql +245 -0
- package/sql/80-auth.sql +827 -0
- package/sql/90-time.sql +957 -0
- package/sql/95-seed.system.sql +178 -0
- package/sql/99-revision.sql +3 -0
- package/sql/README.md +56 -0
- package/sql/seed.booking.sql +39 -112
- package/dist/schema.d.ts +0 -15
- package/dist/schema.js +0 -351
- package/dist/sessions.d.ts +0 -32
- package/dist/sessions.js +0 -114
- package/dist/tables.d.ts +0 -105
- package/dist/tables.js +0 -248
- package/docker/Dockerfile +0 -40
- package/docker/start.sh +0 -18
- package/scripts/check-docs.mjs +0 -375
- package/scripts/gen-api-contract.mjs +0 -226
- package/scripts/gen-types.mjs +0 -350
- package/scripts/release-notes.mjs +0 -76
- package/scripts/schema-sync.mjs +0 -185
- package/sql/ddl.sql +0 -600
- package/sql/seed.auth.sql +0 -73
package/dist/up.d.ts
CHANGED
|
@@ -1,56 +1,149 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
/**
|
|
1
|
+
import postgres from 'postgres';
|
|
2
|
+
import { type PgliteOptions, type PgliteServer } from './pglite.js';
|
|
3
|
+
export declare const SYSTEM_ID = "2eba6d0a-1edd-4bb6-a85a-a703dab49035";
|
|
4
|
+
export declare const SCHEMA_VERSION = "v2";
|
|
5
|
+
export interface InstallOptions {
|
|
6
|
+
/** Полное имя схемы с версией, например `v2.salon`. */
|
|
7
7
|
schema: string;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
/** Имя docker-образа; при отсутствии соберётся из пакованного Dockerfile. Default 'letopis-db'. */
|
|
13
|
-
image?: string;
|
|
14
|
-
/**
|
|
15
|
-
* Где держать данные PG: путь на хосте (bind mount, на Windows/NTFS — на свой риск)
|
|
16
|
-
* либо имя docker-volume. Default — named volume 'letopis-pgdata' (кроссплатформенно;
|
|
17
|
-
* переживает пересоздание контейнера).
|
|
18
|
-
*/
|
|
19
|
-
dataDir?: string;
|
|
20
|
-
/** Хост-порт Redis контейнера. Default 16379. */
|
|
21
|
-
redisPort?: number;
|
|
8
|
+
owner?: string;
|
|
9
|
+
app?: string;
|
|
10
|
+
/** Константа установки: разрешён ли reset (план, §2.2). По умолчанию выключен. */
|
|
11
|
+
allowReset?: boolean;
|
|
22
12
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* без сидов, годится только чтобы поставить движок — connect не переживёт.
|
|
13
|
+
* Константа установки: политика хранения истории для классов без своей (план, §2.11), например
|
|
14
|
+
* `{ all: '1 day', daily: '1 week', weekly: '1 month', monthly: '1 year', yearly: 'forever' }`.
|
|
15
|
+
* Не задана — история хранится вся.
|
|
27
16
|
*/
|
|
28
|
-
|
|
29
|
-
/**
|
|
17
|
+
history?: HistoryPolicy;
|
|
18
|
+
/** Номер последнего накатываемого файла — для пошаговых тестов. */
|
|
19
|
+
upTo?: number;
|
|
20
|
+
/** Сиды после ядра: имена lib/sql/seed.<имя>.sql (например 'booking') или пути к своим файлам .sql. */
|
|
21
|
+
seeds?: string[];
|
|
22
|
+
/** Обновление (upgrade): ревизия схемы до наката — миграции lib/sql/migrate/ с номером выше неё. */
|
|
23
|
+
migrateFrom?: number;
|
|
24
|
+
/** Каталог миграций (по умолчанию lib/sql/migrate). */
|
|
25
|
+
migrationsDir?: string;
|
|
26
|
+
/** Свой ключ сервиса: зарегистрировать, если такого ещё нет (вместо выпуска случайного). */
|
|
27
|
+
serviceKey?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Политика хранения истории (§2.11): сроки ярусов по возрастанию, 'forever' — бессрочно. */
|
|
30
|
+
export interface HistoryPolicy {
|
|
31
|
+
all: string;
|
|
32
|
+
daily?: string;
|
|
33
|
+
weekly?: string;
|
|
34
|
+
monthly?: string;
|
|
35
|
+
yearly?: string;
|
|
36
|
+
/** Часовой пояс границ периодов (по умолчанию UTC). */
|
|
37
|
+
tz?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface InstallResult {
|
|
40
|
+
schema: string;
|
|
41
|
+
owner: string;
|
|
42
|
+
app: string;
|
|
43
|
+
/** Ключ сервисного аккаунта; выдаётся только при первой установке (или зарегистрированный свой), дальше — null. */
|
|
44
|
+
serviceKey: string | null;
|
|
45
|
+
/** Применённые миграции. */
|
|
46
|
+
migrations: string[];
|
|
47
|
+
}
|
|
48
|
+
export declare const quoteIdent: (name: string) => string;
|
|
49
|
+
/** Файлы ядра по номеру: `10-core.sql` … `99-revision.sql`; сиды демо-домена сюда не входят. */
|
|
50
|
+
export declare function engineFiles(upTo?: number): Promise<string[]>;
|
|
51
|
+
export declare function substitute(text: string, vars: Record<string, string>): string;
|
|
52
|
+
export declare function install(sql: postgres.Sql, opts: InstallOptions): Promise<InstallResult>;
|
|
53
|
+
/** Миграции с номером выше ревизии from и не выше DDL_REVISION: `0004-описание.sql`, по номеру. */
|
|
54
|
+
export declare function migrationFiles(dir: string, from: number): Promise<string[]>;
|
|
55
|
+
export interface UpOptions extends Omit<InstallOptions, 'schema' | 'upTo' | 'migrateFrom'> {
|
|
56
|
+
/** Администраторская строка подключения (роль-установщик). */
|
|
57
|
+
dsn?: string;
|
|
58
|
+
/** Готовый пул postgres.js вместо dsn (база уже существует). */
|
|
59
|
+
sql?: postgres.Sql;
|
|
60
|
+
/** Схема: полное имя v2.<имя> или только <имя> — версия структуры подставится сама. */
|
|
61
|
+
schema: string;
|
|
62
|
+
/** Удалить схему и поставить заново. ДАННЫЕ СХЕМЫ ТЕРЯЮТСЯ. */
|
|
30
63
|
fresh?: boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Перекатить `ddl.sql` на СУЩЕСТВУЮЩУЮ схему (сиды не трогаются, данные целы).
|
|
33
|
-
* Так доезжают аддитивные правки движка: схема, накатанная старой либой, не имеет новых
|
|
34
|
-
* функций/триггеров (например `purge`/`purge_account` из 0.19.0) и падает сырым
|
|
35
|
-
* «function … does not exist». О расхождении предупреждает `connect()` (см. `DDL_REVISION`).
|
|
36
|
-
* Идемпотентно; на несуществующей схеме — обычный первый накат.
|
|
37
|
-
*/
|
|
64
|
+
/** Обновить схему отставшей ревизии: миграции и повторный накат; данные сохраняются. */
|
|
38
65
|
upgrade?: boolean;
|
|
39
|
-
/** Без
|
|
66
|
+
/** Без сообщений в консоль. */
|
|
40
67
|
quiet?: boolean;
|
|
41
|
-
/**
|
|
68
|
+
/** Сколько ждать базу, мс (по умолчанию 60 000). */
|
|
42
69
|
waitTimeoutMs?: number;
|
|
70
|
+
/**
|
|
71
|
+
* База для разработки без PostgreSQL (решение 6 точки А): PGlite с pgcrypto через pglite-socket;
|
|
72
|
+
* одно соединение — connect({ dsn: r.pglite.dsn, listen: false, max: 1 }); не для гонок и CI.
|
|
73
|
+
*/
|
|
74
|
+
pglite?: boolean | PgliteOptions;
|
|
75
|
+
/** Арендатор и его первый пользователь — без своего сида (createTenant). */
|
|
76
|
+
tenant?: TenantOptions;
|
|
77
|
+
}
|
|
78
|
+
export interface UpResult extends InstallResult {
|
|
79
|
+
/** Схемы не было — поставлена. */
|
|
80
|
+
created: boolean;
|
|
81
|
+
/** Схема была отставшей ревизии — обновлена. */
|
|
82
|
+
upgraded: boolean;
|
|
83
|
+
/** Ревизия движка после наката. */
|
|
84
|
+
revision: number;
|
|
85
|
+
/** Таблицы, для которых выполнен ANALYZE (статистики не было). */
|
|
86
|
+
analyzed: string[];
|
|
87
|
+
/** up({ pglite }): запущенный PGlite — строка подключения и остановка. */
|
|
88
|
+
pglite?: PgliteServer;
|
|
89
|
+
/** up({ tenant }): арендатор (и его первый пользователь с сессией). */
|
|
90
|
+
tenant?: TenantResult;
|
|
91
|
+
}
|
|
92
|
+
type Ping = {
|
|
93
|
+
ok: true;
|
|
94
|
+
} | {
|
|
95
|
+
ok: false;
|
|
96
|
+
kind: 'no-server' | 'no-database' | 'starting' | 'fatal';
|
|
97
|
+
err: unknown;
|
|
98
|
+
};
|
|
99
|
+
/** Проба сервера: ok | нет сервера | нет базы | запускается | роковая ошибка (неверный пароль). */
|
|
100
|
+
export declare function pgPing(dsn: string): Promise<Ping>;
|
|
101
|
+
/** Создать базу строки подключения, если её нет (гонка параллельных up() — 42P04 — не ошибка). */
|
|
102
|
+
export declare function ensureDatabase(dsn: string, log?: (m: string) => void): Promise<boolean>;
|
|
103
|
+
/** Версия сервера и кодировка базы: PostgreSQL 18+ и UTF8 (casefold и pg_unicode_fast требуют UTF8). */
|
|
104
|
+
export declare function checkServer(versionNum: number, encoding: string): void;
|
|
105
|
+
/** Ревизия движка схемы по комментарию 'letopis ddl_revision=N'; схемы нет — null. */
|
|
106
|
+
export declare function schemaRevision(sql: postgres.Sql, schema: string): Promise<number | null>;
|
|
107
|
+
/**
|
|
108
|
+
* Поставить или обновить установку letopis. Схема есть и её ревизия совпадает — повторный накат
|
|
109
|
+
* (идемпотентный); ревизия отстала — только с upgrade: true; новее библиотеки — отказ.
|
|
110
|
+
*/
|
|
111
|
+
export declare function up(opts: UpOptions): Promise<UpResult>;
|
|
112
|
+
export interface TenantOptions {
|
|
113
|
+
/** Имя арендатора (аккаунт в System; id — v5 от «tenant:<имя>», как у letopis import --tenant). */
|
|
114
|
+
name: string;
|
|
115
|
+
/** Правило арендатора «аутентифицированным можно всё» (READ, WRITE, DELETE; по умолчанию да). */
|
|
116
|
+
grantAll?: boolean;
|
|
117
|
+
/** Первый пользователь: аккаунт, членство в арендаторе с ролями roles, пароль и сессия в арендаторе. */
|
|
118
|
+
user?: {
|
|
119
|
+
name: string;
|
|
120
|
+
login: string;
|
|
121
|
+
password: string;
|
|
122
|
+
kind?: string;
|
|
123
|
+
ttl?: string;
|
|
124
|
+
/** Роли членства (по умолчанию ['owner']); роли уже существующего членства повтор не меняет. */
|
|
125
|
+
roles?: string[];
|
|
126
|
+
};
|
|
43
127
|
}
|
|
44
|
-
export interface
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
128
|
+
export interface TenantResult {
|
|
129
|
+
/** id аккаунта-арендатора. */
|
|
130
|
+
tenant: string;
|
|
131
|
+
/** id аккаунта пользователя (если задан). */
|
|
132
|
+
user: string | null;
|
|
133
|
+
/** Токен сессии пользователя в арендаторе: connect({ token }) (если задан пользователь). */
|
|
134
|
+
token: string | null;
|
|
135
|
+
/** Арендатор создан этим вызовом (повтор с тем же именем — false). */
|
|
136
|
+
created: boolean;
|
|
53
137
|
}
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
-
|
|
138
|
+
/**
|
|
139
|
+
* Арендатор и его первый пользователь — то, что раньше делал свой сид функциями владельца
|
|
140
|
+
* (sys_create, sys_grant_all). Нужно администраторское подключение (роль может стать владельцем);
|
|
141
|
+
* всё — одной транзакцией от владельца. Повтор с тем же именем и логином ничего не дублирует:
|
|
142
|
+
* id — v5 от имени и логина, существующие строки пропускаются (пароль и роли членства не меняются),
|
|
143
|
+
* сессия выдаётся заново. Удалённые арендатор, аккаунт пользователя или членство (строки нет, а
|
|
144
|
+
* журнал id есть) — отказ invalid_data, транзакция откатывается целиком: повтор не воскрешает то,
|
|
145
|
+
* что удалил администратор (up({ tenant }) идёт при каждом запуске), а sys_create пишет только
|
|
146
|
+
* версию 1 — её занимает история; вернуть строку — restore() цепочкой.
|
|
147
|
+
*/
|
|
148
|
+
export declare function createTenant(sql: postgres.Sql, schema: string, opts: TenantOptions, owner?: string): Promise<TenantResult>;
|
|
149
|
+
export {};
|