@cuboapp/api-backend 3.0.15 → 4.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/dist/constants/index.d.ts +35 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/core/index.d.ts +77 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/crdt/index.d.ts +45 -0
- package/dist/crdt/index.d.ts.map +1 -0
- package/dist/dialects/index.d.ts +21 -0
- package/dist/dialects/index.d.ts.map +1 -0
- package/dist/helpers/convert.d.ts +11 -0
- package/dist/helpers/convert.d.ts.map +1 -0
- package/dist/helpers/data.d.ts +5 -0
- package/dist/helpers/data.d.ts.map +1 -0
- package/dist/helpers/index.d.ts +42 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/withes.d.ts +10 -0
- package/dist/helpers/withes.d.ts.map +1 -0
- package/dist/hooks/constants.d.ts +7 -0
- package/dist/hooks/constants.d.ts.map +1 -0
- package/dist/hooks/define.d.ts +63 -0
- package/dist/hooks/define.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/subscribe.d.ts +83 -0
- package/dist/hooks/subscribe.d.ts.map +1 -0
- package/dist/hooks/types.d.ts +60 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/query/compile.d.ts +14 -0
- package/dist/query/compile.d.ts.map +1 -0
- package/dist/query/index.d.ts +3 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/types.d.ts +78 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/types/basic.d.ts +60 -0
- package/dist/types/basic.d.ts.map +1 -0
- package/dist/types/db.d.ts +58 -0
- package/dist/types/db.d.ts.map +1 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +31 -21
- package/src/constants/index.ts +30 -20
- package/src/core/index.ts +6 -5
- package/src/crdt/index.ts +67 -13
- package/src/helpers/data.ts +14 -2
- package/src/helpers/index.ts +101 -46
- package/src/helpers/withes.ts +1 -1
- package/src/hooks/index.ts +1 -0
- package/src/hooks/subscribe.ts +160 -0
- package/src/hooks/types.ts +6 -3
- package/src/types/basic.ts +2 -2
- package/src/types/db.ts +1 -1
- package/.prettierrc +0 -8
- package/tsconfig.build.json +0 -4
- package/tsconfig.json +0 -22
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CuboEntityField } from '@cuboapp/types';
|
|
2
|
+
export declare const CUBO_CRUD_QUERY_KEY_REGEX: RegExp;
|
|
3
|
+
export declare const CUBO_CRUD_QUERY_SYMBOL_NOT = "not";
|
|
4
|
+
/**
|
|
5
|
+
* Separates the field names in an ANY-OF query key: `?a|b=<value>` means "`a` matches OR `b` matches".
|
|
6
|
+
*
|
|
7
|
+
* Every other condition in a query is AND-ed, which is right for filtering — each parameter narrows
|
|
8
|
+
* the result. But some questions are genuinely about a row's relationship to a value regardless of
|
|
9
|
+
* WHICH column records it: a document involving an organization has it as either the sender or the
|
|
10
|
+
* receiver, and asking for both as separate parameters would return the documents where it is both.
|
|
11
|
+
*
|
|
12
|
+
* One condition, several columns — not a general boolean expression language. That keeps the query
|
|
13
|
+
* string readable and keeps the SQL to a single parenthesised OR, so it still AND-s with everything
|
|
14
|
+
* else exactly as a plain key does.
|
|
15
|
+
*/
|
|
16
|
+
export declare const CUBO_CRUD_QUERY_SYMBOL_OR = "|";
|
|
17
|
+
export declare const CUBO_CRUD_DEFAULT_PAGE_LIMIT = 25;
|
|
18
|
+
export declare const CUBO_CRUD_MAX_PAGE_LIMIT = 500;
|
|
19
|
+
export declare const CUBO_CRUD_ACTION: readonly ["create", "read", "update", "delete"];
|
|
20
|
+
export declare const CUBO_CRUD_QUERY_CONDITION: {
|
|
21
|
+
EQ: string;
|
|
22
|
+
EX: string;
|
|
23
|
+
LIKE: string;
|
|
24
|
+
ILIKE: string;
|
|
25
|
+
IN: string;
|
|
26
|
+
NIN: string;
|
|
27
|
+
GT: string;
|
|
28
|
+
LT: string;
|
|
29
|
+
GTE: string;
|
|
30
|
+
LTE: string;
|
|
31
|
+
BTW: string;
|
|
32
|
+
};
|
|
33
|
+
export declare const CUBO_CRUD_DEFAULT_FIELDS: Pick<CuboEntityField, 'type' | 'alias' | 'extra'>[];
|
|
34
|
+
export declare const CUBO_CRUD_DEFAULT_FIELDS_ALIASES: string[];
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAIhD,eAAO,MAAM,yBAAyB,QAAqB,CAAA;AAE3D,eAAO,MAAM,0BAA0B,QAAQ,CAAA;AAE/C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,eAAO,MAAM,4BAA4B,KAAK,CAAA;AAC9C,eAAO,MAAM,wBAAwB,MAAM,CAAA;AAE3C,eAAO,MAAM,gBAAgB,iDAAkD,CAAA;AAE/E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;CAYrC,CAAA;AAED,eAAO,MAAM,wBAAwB,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,EAyCvF,CAAA;AAED,eAAO,MAAM,gCAAgC,UAA+C,CAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { CuboApiEntitiesMap } from '@cuboapp/types';
|
|
2
|
+
import { CuboCrdtAdapter } from '../crdt';
|
|
3
|
+
import { ApiHelpers } from '../helpers';
|
|
4
|
+
import { CuboQuery } from '../query';
|
|
5
|
+
import { CuboBackendApiAuth, CuboBackendApiOptions, CuboCrudGetManyResponse, CuboCrudMethodOptions, CuboCrudRequest } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* CUBO Backend API — метаданные-ориентированный CRUD-движок.
|
|
8
|
+
*
|
|
9
|
+
* Перерисованная архитектура:
|
|
10
|
+
* - типизированный query-DSL (../query) поверх «строкового» движка;
|
|
11
|
+
* - ИММУТАБЕЛЬНЫЕ query-опции: на каждый вызов строится новый объект, хуки
|
|
12
|
+
* `before*` возвращают патч, который мёржится в новый объект — состояние
|
|
13
|
+
* больше не «протекает» между вложенными вызовами;
|
|
14
|
+
* - пакетные операции createMany/updateMany/deleteMany одним запросом + транзакция;
|
|
15
|
+
* - корректные read-back'и внутри транзакции (write-соединение, тот же tx);
|
|
16
|
+
* - встроенная поддержка cubo-crdt (../crdt) для сущностей с entity.crdt;
|
|
17
|
+
* - диалекты Postgres/MySQL (../dialects); s3-хелперы удалены.
|
|
18
|
+
*/
|
|
19
|
+
export declare class CuboBackendApi<T extends CuboApiEntitiesMap<T>, A extends unknown = unknown> {
|
|
20
|
+
options: CuboBackendApiOptions<T, A>;
|
|
21
|
+
constructor(options: CuboBackendApiOptions<T, A>);
|
|
22
|
+
auth: CuboBackendApiAuth;
|
|
23
|
+
helpers: ApiHelpers<T, A>;
|
|
24
|
+
crdt?: CuboCrdtAdapter<T, A>;
|
|
25
|
+
private debounces;
|
|
26
|
+
init(): Promise<void>;
|
|
27
|
+
destroy(): Promise<void>;
|
|
28
|
+
/** Back-compat: вернуть «голую» транзакцию write-соединения. */
|
|
29
|
+
transaction(): Promise<import("sequelize").Transaction>;
|
|
30
|
+
/**
|
|
31
|
+
* Выполнить fn в транзакции с авто-commit/rollback. Внутри fn все CRUD-вызовы
|
|
32
|
+
* должны получать opts.transaction (и тогда read-back'и пойдут в write-соединение).
|
|
33
|
+
*/
|
|
34
|
+
withTransaction<R>(fn: (tx: any) => Promise<R>): Promise<R>;
|
|
35
|
+
find<K extends Extract<keyof T, string>>(alias: K, query?: CuboQuery<T[K]>, opts?: CuboCrudMethodOptions): Promise<CuboCrudGetManyResponse<T[K]>>;
|
|
36
|
+
findOne<K extends Extract<keyof T, string>>(alias: K, query?: CuboQuery<T[K]>, opts?: CuboCrudMethodOptions): Promise<T[K]>;
|
|
37
|
+
create<K extends Extract<keyof T, string>>(alias: K, body: Partial<T[K]>, opts?: CuboCrudMethodOptions): Promise<T[K]>;
|
|
38
|
+
update<K extends Extract<keyof T, string>>(alias: K, id: number, body: Partial<T[K]>, opts?: CuboCrudMethodOptions): Promise<T[K]>;
|
|
39
|
+
remove<K extends Extract<keyof T, string>>(alias: K, id: number, opts?: CuboCrudMethodOptions): Promise<boolean>;
|
|
40
|
+
getMany<K extends Extract<keyof T, string> = Extract<keyof T, string>>(entityAlias: K, req?: CuboCrudRequest, opts?: CuboCrudMethodOptions): Promise<CuboCrudGetManyResponse<T[K]>>;
|
|
41
|
+
getOne<K extends Extract<keyof T, string> = Extract<keyof T, string>>(entityAlias: K, req: CuboCrudRequest, opts?: CuboCrudMethodOptions): Promise<T[K] | undefined>;
|
|
42
|
+
createOne<K extends Extract<keyof T, string> = Extract<keyof T, string>>(entityAlias: K, req: CuboCrudRequest, opts?: CuboCrudMethodOptions): Promise<T[K]>;
|
|
43
|
+
updateOne<K extends Extract<keyof T, string> = Extract<keyof T, string>>(entityAlias: K, req: CuboCrudRequest, opts?: CuboCrudMethodOptions): Promise<T[K] | undefined>;
|
|
44
|
+
deleteOne<K extends Extract<keyof T, string>>(entityAlias: K, req: CuboCrudRequest, opts?: CuboCrudMethodOptions): Promise<boolean>;
|
|
45
|
+
/** Пакетное создание одним INSERT (+ транзакция). Возвращает созданные строки. */
|
|
46
|
+
createMany<K extends Extract<keyof T, string>>(entityAlias: K, rows: Partial<T[K]>[], opts?: CuboCrudMethodOptions): Promise<T[K][]>;
|
|
47
|
+
/** Пакетное обновление: один UPDATE по id IN (...). Возвращает обновлённые строки. */
|
|
48
|
+
updateMany<K extends Extract<keyof T, string>>(entityAlias: K, req: CuboCrudRequest, opts?: CuboCrudMethodOptions): Promise<T[K][]>;
|
|
49
|
+
/** Пакетное (мягкое) удаление: один UPDATE по id IN (...). Возвращает кол-во. */
|
|
50
|
+
deleteMany<K extends Extract<keyof T, string>>(entityAlias: K, req: CuboCrudRequest, opts?: CuboCrudMethodOptions): Promise<number>;
|
|
51
|
+
request<R>(url: string, opts?: RequestInit & {
|
|
52
|
+
debug?: boolean;
|
|
53
|
+
withAuth?: boolean;
|
|
54
|
+
withoutContentType?: boolean;
|
|
55
|
+
}): Promise<R>;
|
|
56
|
+
private getEntity;
|
|
57
|
+
private get pkKey();
|
|
58
|
+
private get pkType();
|
|
59
|
+
private excluded;
|
|
60
|
+
/** read-back внутри write-транзакции должен идти в write-соединение и тем же tx. */
|
|
61
|
+
private connForRead;
|
|
62
|
+
/** Опции для внутренних read-back'ов: без наследования queryOptions и без хуков чтения. */
|
|
63
|
+
private readBackOpts;
|
|
64
|
+
/**
|
|
65
|
+
* Контекст хука. `queryOptions` передаётся ССЫЛКОЙ на per-call рабочую копию
|
|
66
|
+
* (свежий cloneDeep на каждый вызов), поэтому хук может либо мутировать её,
|
|
67
|
+
* либо вернуть свой объект — а накопления/протечки между вызовами нет.
|
|
68
|
+
*/
|
|
69
|
+
private ctx;
|
|
70
|
+
/** Вливает raw-условия из query-опций в find-query. */
|
|
71
|
+
private applyRawQueryOptions;
|
|
72
|
+
private crdtPush;
|
|
73
|
+
/** Многострочный INSERT. Postgres -> RETURNING; MySQL -> последовательные autoincrement id. */
|
|
74
|
+
private insertMany;
|
|
75
|
+
private updateWhereIds;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CuboCrdtServer, CuboCrdtServerDocumentOrigin } from '@cuboapp/crdt';
|
|
2
|
+
import { CuboApiEntitiesMap, CuboEntity } from '@cuboapp/types';
|
|
3
|
+
import type { WsServer, WsServerSocket } from '@cuboapp/ws';
|
|
4
|
+
import type { CuboBackendApi } from '../core';
|
|
5
|
+
/** Тип фабрики, импортируемый только как тип (рантайм-зависимость опциональна). */
|
|
6
|
+
type CreateCrdtServer = typeof import('@cuboapp/crdt')['createCrdtServer'];
|
|
7
|
+
/**
|
|
8
|
+
* Встроенный адаптер cubo-crdt. Инкапсулирует всю обвязку, которую раньше
|
|
9
|
+
* приходилось писать в каждом приложении руками (old.ts):
|
|
10
|
+
* - fetchRows: подписка тянет строки через api.getMany
|
|
11
|
+
* - storeRow: дебаунс-сохранение состояния дока обратно в БД через api.updateOne
|
|
12
|
+
* - checkRowIsSutable: фильтрация строк под подписку (augmentation.filterRowForCrdtEvent)
|
|
13
|
+
* - push create/update/delete: автоматически из CRUD-методов ядра
|
|
14
|
+
*
|
|
15
|
+
* Включается одной опцией `crdt: { ws }` у CuboBackendApi и работает для всех
|
|
16
|
+
* сущностей с флагом `entity.crdt === true`.
|
|
17
|
+
*/
|
|
18
|
+
export declare class CuboCrdtAdapter<T extends CuboApiEntitiesMap<T>, A> {
|
|
19
|
+
private api;
|
|
20
|
+
private ws;
|
|
21
|
+
private debug;
|
|
22
|
+
readonly server: CuboCrdtServer<T, A>;
|
|
23
|
+
constructor(api: CuboBackendApi<T, A>, ws: WsServer, createCrdtServer: CreateCrdtServer, debug?: boolean);
|
|
24
|
+
/**
|
|
25
|
+
* Авторизация клиента, владеющего подпиской.
|
|
26
|
+
*
|
|
27
|
+
* `checkRowIsSutable` получает только подписку (в ней есть client_id), а права живут на сокете —
|
|
28
|
+
* поэтому ищем сокет в реестре ws. Нужно для аугментаций, которые прячут строки по правам: гидрация
|
|
29
|
+
* подписки идёт через getMany с auth и такие строки не отдаст, а живой пуш без этого отдал бы.
|
|
30
|
+
*/
|
|
31
|
+
private authOf;
|
|
32
|
+
init(): Promise<void>;
|
|
33
|
+
destroy(): Promise<void>;
|
|
34
|
+
addClient(client: WsServerSocket<{
|
|
35
|
+
auth?: A;
|
|
36
|
+
}>): void;
|
|
37
|
+
removeClient(client: WsServerSocket): void;
|
|
38
|
+
/** Поддерживается ли CRDT для сущности. */
|
|
39
|
+
isSupported(entity: CuboEntity): boolean;
|
|
40
|
+
pushCreate(entity: CuboEntity, row: any): void;
|
|
41
|
+
pushUpdate(entity: CuboEntity, row: any): void;
|
|
42
|
+
pushDelete(entity: CuboEntity, row: any, origin?: CuboCrdtServerDocumentOrigin): void;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crdt/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,4BAA4B,EAG7B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAG3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,mFAAmF;AACnF,KAAK,gBAAgB,GAAG,cAAc,eAAe,CAAC,CAAC,kBAAkB,CAAC,CAAA;AAc1E;;;;;;;;;;GAUG;AACH,qBAAa,eAAe,CAAC,CAAC,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAI3D,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,EAAE;IAEV,OAAO,CAAC,KAAK;IANf,SAAgB,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAGlC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EACzB,EAAE,EAAE,QAAQ,EACpB,gBAAgB,EAAE,gBAAgB,EAC1B,KAAK,UAAQ;IAoDvB;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;IAOD,IAAI;IAIJ,OAAO;IAKb,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;QAAE,IAAI,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC;IAI9C,YAAY,CAAC,MAAM,EAAE,cAAc;IAI1C,2CAA2C;IACpC,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAKxC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG;IAKvC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG;IAevC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,4BAA4B;CAItF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Слой диалектов БД. Раньше SQL-генерация была заточена под Postgres
|
|
3
|
+
* (`ilike`, `returning`). Теперь различия спрятаны за интерфейсом CuboDialect,
|
|
4
|
+
* и движок одинаково работает с Postgres и MySQL.
|
|
5
|
+
*
|
|
6
|
+
* Сам @cuboapp/database уже умеет insert/update/delete под оба диалекта;
|
|
7
|
+
* здесь покрываются различия SELECT-билдера (в первую очередь ILIKE и
|
|
8
|
+
* пакетные insert/update).
|
|
9
|
+
*/
|
|
10
|
+
export type CuboDialectName = 'postgres' | 'mysql';
|
|
11
|
+
export interface CuboDialect {
|
|
12
|
+
name: CuboDialectName;
|
|
13
|
+
/** Регистронезависимый LIKE. Postgres — нативный ILIKE; MySQL — LOWER() LIKE LOWER(). */
|
|
14
|
+
ilike(field: string, param: string, isNot: boolean): string;
|
|
15
|
+
/** Поддерживает ли RETURNING (Postgres). У MySQL — insertId / lastval. */
|
|
16
|
+
supportsReturning: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const postgresDialect: CuboDialect;
|
|
19
|
+
export declare const mysqlDialect: CuboDialect;
|
|
20
|
+
export declare function getDialect(name?: string | null): CuboDialect;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dialects/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,CAAA;AAElD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAA;IAErB,yFAAyF;IACzF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IAE3D,0EAA0E;IAC1E,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAED,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,WAI1B,CAAA;AAED,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAE5D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CuboApiEntitiesMap, CuboEntity } from '@cuboapp/types';
|
|
2
|
+
import { CuboCrudFindQuery, CuboCrudRequest } from '../types';
|
|
3
|
+
import { ApiHelpers } from '.';
|
|
4
|
+
export declare class ApiHelpersConvert<T extends CuboApiEntitiesMap<T>> {
|
|
5
|
+
helpers: ApiHelpers<T>;
|
|
6
|
+
constructor(helpers: ApiHelpers<T>);
|
|
7
|
+
prepareAll(req: CuboCrudRequest, entity: CuboEntity, rows: any[], query?: Partial<CuboCrudFindQuery>): Promise<any[]>;
|
|
8
|
+
prepareOne(req: CuboCrudRequest, entity: CuboEntity, row: any, query?: Partial<CuboCrudFindQuery>): Promise<any>;
|
|
9
|
+
private prepareFieldValue;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=convert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/helpers/convert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAmB,MAAM,gBAAgB,CAAA;AAIhF,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAA;AAE9B,qBAAa,iBAAiB,CAAC,CAAC,SAAS,kBAAkB,CAAC,CAAC,CAAC;IACzC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;gBAAtB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAE5B,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAQrH,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAsE9G,OAAO,CAAC,iBAAiB;CAsB1B"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { CuboApiEntitiesMap, CuboEntityField } from '@cuboapp/types';
|
|
2
|
+
export declare class ApiHelpersData<T extends CuboApiEntitiesMap<T>> {
|
|
3
|
+
prepare(type: 'create' | 'update' | 'delete', fields: CuboEntityField[], dto?: any, performer_id?: string): any;
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/helpers/data.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAKpE,qBAAa,cAAc,CAAC,CAAC,SAAS,kBAAkB,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM;CAkJjH"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Database } from '@cuboapp/database';
|
|
2
|
+
import { CuboApiEntitiesMap, CuboEntity, CuboEntityField, CuboEntityFieldExtra, CuboEntityFieldType } from '@cuboapp/types';
|
|
3
|
+
import type { CuboBackendApi } from '../core';
|
|
4
|
+
import { CuboDialect } from '../dialects';
|
|
5
|
+
import { CuboBackendApiDbConnectionType, CuboCrudFindQuery, CuboCrudRequest } from '../types';
|
|
6
|
+
import { ApiHelpersConvert } from './convert';
|
|
7
|
+
import { ApiHelpersData } from './data';
|
|
8
|
+
import { ApiHelpersWithes } from './withes';
|
|
9
|
+
export declare class ApiHelpers<T extends CuboApiEntitiesMap<T>, A = unknown> {
|
|
10
|
+
api: CuboBackendApi<T, A>;
|
|
11
|
+
constructor(api: CuboBackendApi<T, A>);
|
|
12
|
+
withes: ApiHelpersWithes<T>;
|
|
13
|
+
convert: ApiHelpersConvert<T>;
|
|
14
|
+
data: ApiHelpersData<T>;
|
|
15
|
+
/** Текущий диалект БД (postgres по умолчанию). */
|
|
16
|
+
get dialect(): CuboDialect;
|
|
17
|
+
private cache;
|
|
18
|
+
private fetching;
|
|
19
|
+
private connections;
|
|
20
|
+
private connecting;
|
|
21
|
+
getCached(alias: string, cb: (force: boolean) => Promise<any>, force?: boolean): any;
|
|
22
|
+
clearFieldConditionValue(field: CuboEntityField | {
|
|
23
|
+
type: CuboEntityFieldType;
|
|
24
|
+
alias: string;
|
|
25
|
+
extra?: CuboEntityFieldExtra;
|
|
26
|
+
}, value: any): {
|
|
27
|
+
value: any;
|
|
28
|
+
is_not: boolean;
|
|
29
|
+
condition: string;
|
|
30
|
+
};
|
|
31
|
+
prepareConditionSql(field: string, replacement: string, value: any, condition: string, is_not: boolean): {
|
|
32
|
+
conditions: string[];
|
|
33
|
+
replacements: Record<string, any>;
|
|
34
|
+
};
|
|
35
|
+
dropConnection(type: CuboBackendApiDbConnectionType): Promise<void>;
|
|
36
|
+
getConnection(type: CuboBackendApiDbConnectionType, create?: boolean): Promise<Database>;
|
|
37
|
+
transaction(type: CuboBackendApiDbConnectionType): Promise<import("sequelize").Transaction>;
|
|
38
|
+
getEntityByAlias(alias: keyof T): Promise<CuboEntity | undefined>;
|
|
39
|
+
getEntityById(id: string): Promise<CuboEntity | undefined>;
|
|
40
|
+
createFindQuery(req: CuboCrudRequest, entity: CuboEntity, queryDto?: Partial<CuboCrudFindQuery>, isCount?: boolean): Promise<Partial<CuboCrudFindQuery>>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAkB,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAG3H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAU7C,OAAO,EAAE,WAAW,EAAc,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE3C,qBAAa,UAAU,CAAC,CAAC,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO;IAC/C,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;gBAAzB,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAErC,MAAM,sBAAgC;IACtC,OAAO,uBAAiC;IACxC,IAAI,oBAA0B;IAErC,kDAAkD;IAClD,IAAW,OAAO,IAAI,WAAW,CAEhC;IAED,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,WAAW,CAAgE;IACnF,OAAO,CAAC,UAAU,CAAwC;IAEnD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,UAAQ;IAsB5E,wBAAwB,CAC7B,KAAK,EAAE,eAAe,GAAG;QAAE,IAAI,EAAE,mBAAmB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,oBAAoB,CAAA;KAAE,EACnG,KAAK,EAAE,GAAG;;;;;IAmML,mBAAmB,CACxB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,GACd;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE;IAkFjD,cAAc,CAAC,IAAI,EAAE,8BAA8B;IAOnD,aAAa,CAAC,IAAI,EAAE,8BAA8B,EAAE,MAAM,UAAO;IA+BjE,WAAW,CAAC,IAAI,EAAE,8BAA8B;IAMhD,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAIjE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAI1D,eAAe,CAC1B,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,UAAU,EAClB,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACrC,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAiKvC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CuboApiEntitiesMap, CuboEntity } from '@cuboapp/types';
|
|
2
|
+
import { CuboCrudFindQuery, CuboCrudMethodOptions, CuboCrudRequest } from '../types';
|
|
3
|
+
import { ApiHelpers } from '.';
|
|
4
|
+
export declare class ApiHelpersWithes<T extends CuboApiEntitiesMap<T>> {
|
|
5
|
+
private helpers;
|
|
6
|
+
constructor(helpers: ApiHelpers<T>);
|
|
7
|
+
private getKeyWithes;
|
|
8
|
+
prepare(req: CuboCrudRequest, entity: CuboEntity, opts?: CuboCrudMethodOptions): Promise<Partial<CuboCrudFindQuery>>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=withes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withes.d.ts","sourceRoot":"","sources":["../../src/helpers/withes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAiC,UAAU,EAAmB,MAAM,gBAAgB,CAAA;AAI/G,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,eAAe,EAA+C,MAAM,UAAU,CAAA;AAEjI,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAA;AAE9B,qBAAa,gBAAgB,CAAC,CAAC,SAAS,kBAAkB,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;YAE5B,YAAY;IAsNb,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;CA4ElI"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Единый источник правды по именам хуков. Раньше список ключей `excludeHooks`
|
|
3
|
+
* дублировался руками в типе CuboCrudMethodOptions и легко рассинхронизировался.
|
|
4
|
+
*/
|
|
5
|
+
export declare const CUBO_HOOKS: readonly ["beforeGetMany", "afterGetMany", "beforeGetOne", "afterGetOne", "beforeCreate", "afterCreate", "beforeUpdate", "afterUpdate", "beforeDelete", "afterDelete", "afterCrdtCreate", "afterCrdtUpdate", "baseHooks"];
|
|
6
|
+
export type CuboHookName = (typeof CUBO_HOOKS)[number];
|
|
7
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/hooks/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,UAAU,2NAcb,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { CuboApiEntitiesMap } from '@cuboapp/types';
|
|
2
|
+
import { CuboAugmentation, CuboAugmentationsStore } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Identity-хелпер: фиксирует тип строки сущности (и auth) ОДИН раз, после чего
|
|
5
|
+
* в каждом хуке `ctx` выводится контекстно — аннотировать `CuboHookCtx<...>`
|
|
6
|
+
* больше не нужно.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* export const taskAugmentation = defineAugmentation<Task, Auth>({
|
|
10
|
+
* async beforeGetMany({ req, queryOptions }) { // ← всё типизировано без аннотаций
|
|
11
|
+
* // ctx.queryOptions уже нормализован: массивы/объекты гарантированно есть,
|
|
12
|
+
* // можно сразу мутировать без `|| []` / `|| {}`
|
|
13
|
+
* if (req.query?.company_id) queryOptions.replacements.company_id = Number(req.query.company_id)
|
|
14
|
+
* return queryOptions
|
|
15
|
+
* }
|
|
16
|
+
* })
|
|
17
|
+
*/
|
|
18
|
+
export declare function defineAugmentation<R, A = unknown>(augmentation: CuboAugmentation<R, A>): CuboAugmentation<R, A>;
|
|
19
|
+
/** Тип функции-хука аугментации по ключу `K` (без `undefined`). */
|
|
20
|
+
export type CuboAugmentationHook<R, A, K extends keyof CuboAugmentation<R, A>> = NonNullable<CuboAugmentation<R, A>[K]>;
|
|
21
|
+
/**
|
|
22
|
+
* Identity-хелпер для ОДНОГО хука: фиксирует тип строки (R) и auth (A), а тип
|
|
23
|
+
* `callback` выводится из переданного `key` — например, для `'beforeGetMany'`
|
|
24
|
+
* это будет ровно сигнатура `beforeGetMany`. Возвращает типизированную функцию
|
|
25
|
+
* хука: её можно положить в нужный ключ аугментации или переиспользовать.
|
|
26
|
+
*
|
|
27
|
+
* Реализовано перегрузками (overloads): один вызов, R/A задаются явно, нужная
|
|
28
|
+
* сигнатура выбирается по строковому литералу `key`.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* const beforeGetMany = defineAugmentationHook<Task, Auth>('beforeGetMany', ({ req, queryOptions }) => {
|
|
32
|
+
* if (req.query?.company_id) queryOptions.conditions.push('t1.company_id = :company_id')
|
|
33
|
+
* return queryOptions
|
|
34
|
+
* })
|
|
35
|
+
*
|
|
36
|
+
* export const taskAugmentation: CuboAugmentation<Task, Auth> = { beforeGetMany }
|
|
37
|
+
*/
|
|
38
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'beforeGetMany', callback: CuboAugmentationHook<R, A, 'beforeGetMany'>): CuboAugmentationHook<R, A, 'beforeGetMany'>;
|
|
39
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'beforeGetOne', callback: CuboAugmentationHook<R, A, 'beforeGetOne'>): CuboAugmentationHook<R, A, 'beforeGetOne'>;
|
|
40
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'beforeCreate', callback: CuboAugmentationHook<R, A, 'beforeCreate'>): CuboAugmentationHook<R, A, 'beforeCreate'>;
|
|
41
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'beforeUpdate', callback: CuboAugmentationHook<R, A, 'beforeUpdate'>): CuboAugmentationHook<R, A, 'beforeUpdate'>;
|
|
42
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'beforeDelete', callback: CuboAugmentationHook<R, A, 'beforeDelete'>): CuboAugmentationHook<R, A, 'beforeDelete'>;
|
|
43
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'afterGetMany', callback: CuboAugmentationHook<R, A, 'afterGetMany'>): CuboAugmentationHook<R, A, 'afterGetMany'>;
|
|
44
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'afterGetOne', callback: CuboAugmentationHook<R, A, 'afterGetOne'>): CuboAugmentationHook<R, A, 'afterGetOne'>;
|
|
45
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'afterCreate', callback: CuboAugmentationHook<R, A, 'afterCreate'>): CuboAugmentationHook<R, A, 'afterCreate'>;
|
|
46
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'afterUpdate', callback: CuboAugmentationHook<R, A, 'afterUpdate'>): CuboAugmentationHook<R, A, 'afterUpdate'>;
|
|
47
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'afterDelete', callback: CuboAugmentationHook<R, A, 'afterDelete'>): CuboAugmentationHook<R, A, 'afterDelete'>;
|
|
48
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'afterCrdtCreate', callback: CuboAugmentationHook<R, A, 'afterCrdtCreate'>): CuboAugmentationHook<R, A, 'afterCrdtCreate'>;
|
|
49
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'afterCrdtUpdate', callback: CuboAugmentationHook<R, A, 'afterCrdtUpdate'>): CuboAugmentationHook<R, A, 'afterCrdtUpdate'>;
|
|
50
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'can', callback: CuboAugmentationHook<R, A, 'can'>): CuboAugmentationHook<R, A, 'can'>;
|
|
51
|
+
export declare function defineAugmentationHook<R, A = unknown>(key: 'filterRowForCrdtEvent', callback: CuboAugmentationHook<R, A, 'filterRowForCrdtEvent'>): CuboAugmentationHook<R, A, 'filterRowForCrdtEvent'>;
|
|
52
|
+
/**
|
|
53
|
+
* То же, но сразу для всей карты аугментаций. Внутри каждой сущности `ctx`
|
|
54
|
+
* хуков типизируется по её строке автоматически.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* export const augmentations = defineAugmentations<Entities, Auth>({
|
|
58
|
+
* task: { async beforeGetMany({ req, queryOptions }) { ... } },
|
|
59
|
+
* user: { async afterGetOne({ row }) { ... } }
|
|
60
|
+
* })
|
|
61
|
+
*/
|
|
62
|
+
export declare function defineAugmentations<T extends CuboApiEntitiesMap<T>, A = unknown>(store: Partial<CuboAugmentationsStore<T, A>>): Partial<CuboAugmentationsStore<T, A>>;
|
|
63
|
+
//# sourceMappingURL=define.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/hooks/define.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscribing a module backend to its declared hooks (hooks.md §5).
|
|
3
|
+
*
|
|
4
|
+
* A module's hooks are declared on its version, next to the entities they belong to. This is the
|
|
5
|
+
* other half: the running build telling the core "I am alive, I am this version, and these are the
|
|
6
|
+
* tuples I actually implement". The core binds the declarations to this process, works out which
|
|
7
|
+
* accounts that touches — a module backend serves every account it is installed in and deliberately
|
|
8
|
+
* cannot enumerate them — and compiles the chain.
|
|
9
|
+
*
|
|
10
|
+
* What a module backend has to write is one call:
|
|
11
|
+
*
|
|
12
|
+
* const stop = subscribeHooks({
|
|
13
|
+
* apiUrl: process.env.CUBO_API_URL!,
|
|
14
|
+
* token: process.env.CUBO_TOKEN!,
|
|
15
|
+
* version: process.env.CUBO_MODULE_VERSION!,
|
|
16
|
+
* baseUrl: 'http://flowers-be:9100',
|
|
17
|
+
* implemented: tuplesFrom(READS, ENRICH, AFTER, VIRTUAL_FIELDS)
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* and call `stop()` on shutdown. Everything else — the renewal interval, the TTL contract, the boot
|
|
21
|
+
* diff, the graceful unsubscribe — lives here so no module has to reimplement a protocol.
|
|
22
|
+
*/
|
|
23
|
+
/** How often to renew. The core treats a subscription older than 30s as dead, so this has slack. */
|
|
24
|
+
export declare const SUBSCRIBE_INTERVAL_MS = 10000;
|
|
25
|
+
export interface SubscribeOptions {
|
|
26
|
+
/** The core API base url, e.g. `http://cubo-api:4000`. */
|
|
27
|
+
apiUrl: string;
|
|
28
|
+
/** This service's `cubo-module-service` token — the same one `/auth/me` accepts. */
|
|
29
|
+
token: string;
|
|
30
|
+
/** The module VERSION id this build implements. Hooks are a contract with one specific build. */
|
|
31
|
+
version: string;
|
|
32
|
+
/**
|
|
33
|
+
* Where this service can be reached, e.g. `http://flowers-be:9100`.
|
|
34
|
+
*
|
|
35
|
+
* Honoured only for the module owner's own account. Everywhere else the core resolves the endpoint
|
|
36
|
+
* from the deployment record instead — the hook url is where the instance sends a live,
|
|
37
|
+
* identity-scoped credential, so it must not be settable by whoever holds this token.
|
|
38
|
+
*/
|
|
39
|
+
baseUrl?: string;
|
|
40
|
+
/** The tuples this build implements: `entity:method:phase`. See `hookTuples`. */
|
|
41
|
+
implemented: string[];
|
|
42
|
+
/** Called with the core's boot diff on every successful subscribe. */
|
|
43
|
+
onDiff?: (diff: SubscribeDiff) => void;
|
|
44
|
+
/** Called when a renewal fails. Default logs; the loop keeps trying. */
|
|
45
|
+
onError?: (error: unknown) => void;
|
|
46
|
+
fetchImpl?: typeof fetch;
|
|
47
|
+
}
|
|
48
|
+
export interface SubscribeDiff {
|
|
49
|
+
declared: string[];
|
|
50
|
+
/** Declared but not implemented by this build. */
|
|
51
|
+
missing: string[];
|
|
52
|
+
/** The subset of `missing` the module marked required — every write on those will fail closed. */
|
|
53
|
+
missing_required: string[];
|
|
54
|
+
/** Implemented but never declared. Harmless (the core will not call them) but usually an oversight. */
|
|
55
|
+
undeclared: string[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Turn a module's dispatch maps into the tuple list the core diffs against.
|
|
59
|
+
*
|
|
60
|
+
* Module backends key their handlers by `entity:method` and split before/after by route, which is the
|
|
61
|
+
* convention the declaration format was lifted FROM — so the tuples can be derived from the code
|
|
62
|
+
* rather than maintained beside it. Anything derived cannot drift.
|
|
63
|
+
*/
|
|
64
|
+
export declare function hookTuples(maps: {
|
|
65
|
+
/** Read rewrites — before-phase on the methods each key names. */
|
|
66
|
+
before?: Record<string, unknown>;
|
|
67
|
+
/** Response shaping / write effects — after-phase. */
|
|
68
|
+
after?: Record<string, unknown>;
|
|
69
|
+
/** Entities whose write bodies are stripped before the engine sees them: create + update, before. */
|
|
70
|
+
virtualFields?: string[] | Record<string, unknown>;
|
|
71
|
+
}): string[];
|
|
72
|
+
export interface Subscription {
|
|
73
|
+
/** Unsubscribe and stop renewing. Safe to call more than once. */
|
|
74
|
+
stop: () => Promise<void>;
|
|
75
|
+
/** Force a renewal now — useful in tests, and after a deploy changes what is implemented. */
|
|
76
|
+
renew: () => Promise<SubscribeDiff | null>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Start the subscribe loop. Returns immediately; the first renewal runs in the background so a slow
|
|
80
|
+
* or unreachable core cannot hold up the service's own boot.
|
|
81
|
+
*/
|
|
82
|
+
export declare function subscribeHooks(options: SubscribeOptions): Subscription;
|
|
83
|
+
//# sourceMappingURL=subscribe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/hooks/subscribe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,oGAAoG;AACpG,eAAO,MAAM,qBAAqB,QAAS,CAAA;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAA;IACd,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAA;IACb,iGAAiG;IACjG,OAAO,EAAE,MAAM,CAAA;IACf;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iFAAiF;IACjF,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,sEAAsE;IACtE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;IACtC,wEAAwE;IACxE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,kDAAkD;IAClD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,kGAAkG;IAClG,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,uGAAuG;IACvG,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,qGAAqG;IACrG,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnD,GAAG,MAAM,EAAE,CAUX;AAED,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,6FAA6F;IAC7F,KAAK,EAAE,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;CAC3C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CA8DtE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { CuboApiEntitiesMap, CuboEntity } from '@cuboapp/types';
|
|
2
|
+
import { CuboCrudAction, CuboCrudGetManyResponse, CuboCrudRequest } from '../types/basic';
|
|
3
|
+
import { CuboCrudQueryOptions, CuboCrudQueryOptionsInput } from '../types/db';
|
|
4
|
+
export type MaybePromise<X> = X | Promise<X>;
|
|
5
|
+
/**
|
|
6
|
+
* Контекст хука. `queryOptions` — это per-call РАБОЧАЯ КОПИЯ опций: каждый вызов
|
|
7
|
+
* получает свой свежий объект, так что состояние НЕ «накапливается» и не
|
|
8
|
+
* протекает между вызовами (внутренние getOne после create/update чужие опции
|
|
9
|
+
* не наследуют). Хук может либо мутировать эту копию, либо вернуть свой объект
|
|
10
|
+
* опций — движок возьмёт возвращённое значение (если оно есть), иначе текущую
|
|
11
|
+
* (возможно, изменённую) копию.
|
|
12
|
+
*/
|
|
13
|
+
export type CuboHookCtx<R, A = unknown> = {
|
|
14
|
+
entity: CuboEntity;
|
|
15
|
+
req: CuboCrudRequest;
|
|
16
|
+
auth?: A;
|
|
17
|
+
performer_id?: string;
|
|
18
|
+
queryOptions: CuboCrudQueryOptions;
|
|
19
|
+
};
|
|
20
|
+
export interface CuboAugmentation<R, A = unknown> {
|
|
21
|
+
beforeGetMany?(ctx: CuboHookCtx<R, A>): MaybePromise<CuboCrudQueryOptionsInput | void>;
|
|
22
|
+
beforeGetOne?(ctx: CuboHookCtx<R, A>): MaybePromise<CuboCrudQueryOptionsInput | void>;
|
|
23
|
+
beforeCreate?(ctx: CuboHookCtx<R, A>): MaybePromise<CuboCrudQueryOptionsInput | void>;
|
|
24
|
+
beforeUpdate?(ctx: CuboHookCtx<R, A> & {
|
|
25
|
+
row: R;
|
|
26
|
+
}): MaybePromise<CuboCrudQueryOptionsInput | void>;
|
|
27
|
+
beforeDelete?(ctx: CuboHookCtx<R, A> & {
|
|
28
|
+
row: R;
|
|
29
|
+
}): MaybePromise<CuboCrudQueryOptionsInput | void>;
|
|
30
|
+
afterGetMany?(ctx: CuboHookCtx<R, A> & {
|
|
31
|
+
result: CuboCrudGetManyResponse<R>;
|
|
32
|
+
}): MaybePromise<CuboCrudGetManyResponse<R>>;
|
|
33
|
+
afterGetOne?(ctx: CuboHookCtx<R, A> & {
|
|
34
|
+
row: R;
|
|
35
|
+
}): MaybePromise<R | undefined>;
|
|
36
|
+
afterCreate?(ctx: CuboHookCtx<R, A> & {
|
|
37
|
+
row: R;
|
|
38
|
+
}): MaybePromise<R>;
|
|
39
|
+
afterUpdate?(ctx: CuboHookCtx<R, A> & {
|
|
40
|
+
row: R;
|
|
41
|
+
prev: R;
|
|
42
|
+
}): MaybePromise<R>;
|
|
43
|
+
afterDelete?(ctx: CuboHookCtx<R, A> & {
|
|
44
|
+
row: R;
|
|
45
|
+
}): MaybePromise<boolean>;
|
|
46
|
+
afterCrdtCreate?(ctx: CuboHookCtx<R, A> & {
|
|
47
|
+
row: R;
|
|
48
|
+
}): MaybePromise<void>;
|
|
49
|
+
afterCrdtUpdate?(ctx: CuboHookCtx<R, A> & {
|
|
50
|
+
row: R;
|
|
51
|
+
}): MaybePromise<void>;
|
|
52
|
+
can?(action: CuboCrudAction, ctx: CuboHookCtx<R, A> & {
|
|
53
|
+
row?: R;
|
|
54
|
+
}): MaybePromise<boolean>;
|
|
55
|
+
filterRowForCrdtEvent?(row: R, filters: Record<string, any>, auth?: A): boolean;
|
|
56
|
+
}
|
|
57
|
+
export type CuboAugmentationsStore<T extends CuboApiEntitiesMap<T>, A = unknown> = {
|
|
58
|
+
[K in Extract<keyof T, string>]?: CuboAugmentation<T[K], A>;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,QAAQ,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CuboCompiledQuery, CuboQuery } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Компилирует типизированный CuboQuery<R> в плоский «строковый» запрос движка
|
|
4
|
+
* (CuboCrudRequest.query). Чистая функция: на каждый вызов создаётся новый
|
|
5
|
+
* объект — query-опции иммутабельны по построению, ничего не «накапливается».
|
|
6
|
+
*
|
|
7
|
+
* Поддержка операторов через flat-DSL:
|
|
8
|
+
* eq/ne/gt/gte/lt/lte/in/nin/like/ilike/between/isNull/not.
|
|
9
|
+
* Диапазон gte+lte на одном поле автоматически сворачивается в between.
|
|
10
|
+
* Экзотические комбинации (>1 оператора, не сводящиеся к диапазону) —
|
|
11
|
+
* через escape-hatch `raw` в CuboCrudMethodOptions.queryOptions.
|
|
12
|
+
*/
|
|
13
|
+
export declare function compileQuery<R>(query?: CuboQuery<R>): CuboCompiledQuery;
|
|
14
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/query/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAU,SAAS,EAAsB,MAAM,SAAS,CAAA;AAElF;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAkCvE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA"}
|