@yss123/cage-kernel 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +18 -2
- package/dist/brands.d.ts +32 -0
- package/dist/brands.js +35 -0
- package/dist/brands.js.map +1 -0
- package/dist/db/connect.d.ts +28 -0
- package/dist/db/connect.js +57 -0
- package/dist/db/connect.js.map +1 -0
- package/dist/db/ddl.d.ts +62 -0
- package/dist/db/ddl.js +454 -0
- package/dist/db/ddl.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +22 -0
- package/dist/db/migrate.js +87 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/rows.d.ts +10 -0
- package/dist/db/rows.js +56 -0
- package/dist/db/rows.js.map +1 -0
- package/dist/db/session.d.ts +4 -0
- package/dist/db/session.js +20 -0
- package/dist/db/session.js.map +1 -0
- package/dist/errors.d.ts +44 -0
- package/dist/errors.js +81 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +97 -0
- package/dist/kernel.js +440 -0
- package/dist/kernel.js.map +1 -0
- package/dist/mask.d.ts +13 -0
- package/dist/mask.js +62 -0
- package/dist/mask.js.map +1 -0
- package/dist/org.d.ts +46 -0
- package/dist/org.js +127 -0
- package/dist/org.js.map +1 -0
- package/dist/pipeline/idempotency.d.ts +10 -0
- package/dist/pipeline/idempotency.js +29 -0
- package/dist/pipeline/idempotency.js.map +1 -0
- package/dist/pipeline/load.d.ts +15 -0
- package/dist/pipeline/load.js +84 -0
- package/dist/pipeline/load.js.map +1 -0
- package/dist/primitives/aggregate.d.ts +75 -0
- package/dist/primitives/aggregate.js +67 -0
- package/dist/primitives/aggregate.js.map +1 -0
- package/dist/primitives/command.d.ts +101 -0
- package/dist/primitives/command.js +49 -0
- package/dist/primitives/command.js.map +1 -0
- package/dist/primitives/constraints.d.ts +36 -0
- package/dist/primitives/constraints.js +41 -0
- package/dist/primitives/constraints.js.map +1 -0
- package/dist/primitives/event.d.ts +31 -0
- package/dist/primitives/event.js +42 -0
- package/dist/primitives/event.js.map +1 -0
- package/dist/primitives/fields.d.ts +107 -0
- package/dist/primitives/fields.js +122 -0
- package/dist/primitives/fields.js.map +1 -0
- package/dist/primitives/flow.d.ts +126 -0
- package/dist/primitives/flow.js +90 -0
- package/dist/primitives/flow.js.map +1 -0
- package/dist/primitives/states.d.ts +19 -0
- package/dist/primitives/states.js +37 -0
- package/dist/primitives/states.js.map +1 -0
- package/dist/read.d.ts +47 -0
- package/dist/read.js +170 -0
- package/dist/read.js.map +1 -0
- package/dist/registry.d.ts +71 -0
- package/dist/registry.js +151 -0
- package/dist/registry.js.map +1 -0
- package/dist/scope/index.d.ts +42 -0
- package/dist/scope/index.js +90 -0
- package/dist/scope/index.js.map +1 -0
- package/dist/telemetry.d.ts +11 -0
- package/dist/telemetry.js +35 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/util/names.d.ts +9 -0
- package/dist/util/names.js +38 -0
- package/dist/util/names.js.map +1 -0
- package/dist/worker/consumers.d.ts +29 -0
- package/dist/worker/consumers.js +79 -0
- package/dist/worker/consumers.js.map +1 -0
- package/dist/worker/index.d.ts +36 -0
- package/dist/worker/index.js +120 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/outbox.d.ts +38 -0
- package/dist/worker/outbox.js +121 -0
- package/dist/worker/outbox.js.map +1 -0
- package/dist/worker/scheduler.d.ts +7 -0
- package/dist/worker/scheduler.js +77 -0
- package/dist/worker/scheduler.js.map +1 -0
- package/package.json +58 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"states.js","sourceRoot":"","sources":["../../src/primitives/states.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAWzC;;GAEG;AACH,MAAM,UAAU,MAAM,CAAyB,GAAG,IAAwC;IACxF,MAAM,GAAG,GAAG,IAAiB,CAAC;IAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAoC,CAAC;IACxG,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAChF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,CAAC,MAAM,CAAC,EAAE,IAAa;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QACtC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAM;KAC1C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAU;IACjC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAK,CAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC"}
|
package/dist/read.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type Transaction } from 'kysely';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { Kernel } from './kernel.js';
|
|
4
|
+
import { type AnyAggregate } from './primitives/aggregate.js';
|
|
5
|
+
import type { AnyQuery } from './primitives/flow.js';
|
|
6
|
+
import type { Ctx } from './types.js';
|
|
7
|
+
export interface ListParams {
|
|
8
|
+
page?: number | string;
|
|
9
|
+
pageSize?: number | string;
|
|
10
|
+
/** 排序:字段名,前面加 - 表示倒序,例如 -createdAt */
|
|
11
|
+
sort?: string;
|
|
12
|
+
createdAfter?: string;
|
|
13
|
+
createdBefore?: string;
|
|
14
|
+
/** 其他键:字段等值过滤;status 可以逗号分隔多个 */
|
|
15
|
+
[field: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface Page<T> {
|
|
18
|
+
items: T[];
|
|
19
|
+
total: number;
|
|
20
|
+
page: number;
|
|
21
|
+
pageSize: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class ReadSide {
|
|
24
|
+
private readonly k;
|
|
25
|
+
constructor(k: Kernel);
|
|
26
|
+
/** 读侧账号上的只读事务,已写入会话变量 */
|
|
27
|
+
tx<T>(ctx: Ctx, fn: (tx: Transaction<any>) => Promise<T>): Promise<T>;
|
|
28
|
+
private agg;
|
|
29
|
+
private need;
|
|
30
|
+
/** 明文读取敏感字段要写读审计 */
|
|
31
|
+
private auditUnmask;
|
|
32
|
+
get(a: AnyAggregate | string, id: string, ctx: Ctx): Promise<Record<string, any>>;
|
|
33
|
+
list(a: AnyAggregate | string, params: ListParams, ctx: Ctx): Promise<Page<Record<string, any>>>;
|
|
34
|
+
private listIn;
|
|
35
|
+
/** 导出:就是读,走安全视图,自然带范围和脱敏;需要 聚合.export 能力,并写读审计 */
|
|
36
|
+
export(a: AnyAggregate | string, params: ListParams, ctx: Ctx): Promise<{
|
|
37
|
+
filename: string;
|
|
38
|
+
contentType: string;
|
|
39
|
+
body: string;
|
|
40
|
+
rows: number;
|
|
41
|
+
}>;
|
|
42
|
+
/** 执行 query 声明:需要 reads 里每个聚合的 read 能力;手写 SQL 用 :name 占位,全部参数化 */
|
|
43
|
+
run(q: AnyQuery | string, raw: unknown, ctx: Ctx): Promise<Record<string, any>[]>;
|
|
44
|
+
}
|
|
45
|
+
/** :name 占位 → 参数化 SQL(:: 类型转换不受影响) */
|
|
46
|
+
export declare function compileNamedSql(text: string, input: Record<string, unknown>): import("kysely").RawBuilder<Record<string, unknown>>;
|
|
47
|
+
export declare const listParamsSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
package/dist/read.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// 读侧:只用读侧账号,只查 safe 模式下的安全视图;内核在只读事务开头写会话变量,
|
|
2
|
+
// 行级策略和掩码由数据库兜底。忘了设置上下文时一条都查不到。
|
|
3
|
+
import { sql } from 'kysely';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { viewRowToObject } from './db/rows.js';
|
|
6
|
+
import { setSessionVars } from './db/session.js';
|
|
7
|
+
import { cageError } from './errors.js';
|
|
8
|
+
import { hiddenFields, sensitiveFields } from './primitives/aggregate.js';
|
|
9
|
+
import { snake } from './util/names.js';
|
|
10
|
+
const SYS = { id: 'id', status: 'status', version: 'version', createdAt: 'created_at', updatedAt: 'updated_at' };
|
|
11
|
+
const RESERVED = new Set(['page', 'pageSize', 'sort', 'createdAfter', 'createdBefore']);
|
|
12
|
+
function coerce(kind, v) {
|
|
13
|
+
if (typeof v !== 'string')
|
|
14
|
+
return v;
|
|
15
|
+
if (kind === 'int' || kind === 'number')
|
|
16
|
+
return Number(v);
|
|
17
|
+
if (kind === 'bool')
|
|
18
|
+
return v === 'true';
|
|
19
|
+
return v;
|
|
20
|
+
}
|
|
21
|
+
export class ReadSide {
|
|
22
|
+
k;
|
|
23
|
+
constructor(k) {
|
|
24
|
+
this.k = k;
|
|
25
|
+
}
|
|
26
|
+
/** 读侧账号上的只读事务,已写入会话变量 */
|
|
27
|
+
async tx(ctx, fn) {
|
|
28
|
+
return this.k.readDb
|
|
29
|
+
.transaction()
|
|
30
|
+
.setAccessMode('read only')
|
|
31
|
+
.execute(async (tx) => {
|
|
32
|
+
await setSessionVars(tx, ctx);
|
|
33
|
+
return fn(tx);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
agg(a) {
|
|
37
|
+
const agg = typeof a === 'string' ? this.k.registry.aggregate(a) : a;
|
|
38
|
+
if (!agg)
|
|
39
|
+
throw cageError('NOT_FOUND');
|
|
40
|
+
return agg;
|
|
41
|
+
}
|
|
42
|
+
need(ctx, cap) {
|
|
43
|
+
if (!ctx.actor || ctx.actor.kind === 'anonymous')
|
|
44
|
+
throw cageError('UNAUTHENTICATED');
|
|
45
|
+
if (!ctx.capabilities.has(cap))
|
|
46
|
+
throw cageError('FORBIDDEN', { capability: cap });
|
|
47
|
+
}
|
|
48
|
+
/** 明文读取敏感字段要写读审计 */
|
|
49
|
+
async auditUnmask(agg, ctx, ids, kind) {
|
|
50
|
+
const kinds = [...new Set(Object.values(sensitiveFields(agg)))].filter((x) => ctx.unmask.includes(`${agg.name}.${x}`) || ctx.unmask.includes(`*.${x}`));
|
|
51
|
+
if (kind === 'read' && kinds.length === 0)
|
|
52
|
+
return;
|
|
53
|
+
await this.k.writeAudit(this.k.app, {
|
|
54
|
+
tenantId: ctx.tenantId, actor: ctx.actor?.id ?? 'anonymous', actorKind: ctx.actor?.kind ?? 'anonymous',
|
|
55
|
+
onBehalfOf: ctx.onBehalfOf ?? null, source: ctx.source, kind: 'read',
|
|
56
|
+
capability: `${agg.name}.${kind}`, command: null, aggregate: agg.name,
|
|
57
|
+
aggregateId: ids.length === 1 ? ids[0] : null, result: 'ok',
|
|
58
|
+
diff: { unmasked: kinds, rows: ids.length }, requestId: ctx.requestId ?? null, client: ctx.client ?? null,
|
|
59
|
+
}).catch((e) => this.k.log.warn({ err: String(e) }, '读审计写入失败'));
|
|
60
|
+
}
|
|
61
|
+
async get(a, id, ctx) {
|
|
62
|
+
const agg = this.agg(a);
|
|
63
|
+
this.need(ctx, `${agg.name}.read`);
|
|
64
|
+
if (!/^[0-9a-f-]{36}$/i.test(id))
|
|
65
|
+
throw cageError('NOT_FOUND');
|
|
66
|
+
const row = await this.tx(ctx, (tx) => tx.selectFrom(`safe.${agg.table.name}`).selectAll().where('id', '=', id).executeTakeFirst());
|
|
67
|
+
if (!row)
|
|
68
|
+
throw cageError('NOT_FOUND');
|
|
69
|
+
void this.auditUnmask(agg, ctx, [id], 'read');
|
|
70
|
+
return viewRowToObject(row);
|
|
71
|
+
}
|
|
72
|
+
async list(a, params, ctx) {
|
|
73
|
+
const agg = this.agg(a);
|
|
74
|
+
this.need(ctx, `${agg.name}.read`);
|
|
75
|
+
const res = await this.tx(ctx, (tx) => this.listIn(tx, agg, params, 200));
|
|
76
|
+
void this.auditUnmask(agg, ctx, res.items.map((r) => r.id), 'read');
|
|
77
|
+
return res;
|
|
78
|
+
}
|
|
79
|
+
async listIn(tx, agg, params, maxPageSize) {
|
|
80
|
+
const page = Math.max(1, Number(params.page ?? 1) || 1);
|
|
81
|
+
const pageSize = Math.min(maxPageSize, Math.max(1, Number(params.pageSize ?? 20) || 20));
|
|
82
|
+
const hidden = new Set(hiddenFields(agg));
|
|
83
|
+
const view = `safe.${agg.table.name}`;
|
|
84
|
+
const apply = (q) => {
|
|
85
|
+
for (const [k, v] of Object.entries(params)) {
|
|
86
|
+
if (RESERVED.has(k) || v === undefined || v === '')
|
|
87
|
+
continue;
|
|
88
|
+
const f = agg.fields[k];
|
|
89
|
+
const col = SYS[k] ?? (f && !hidden.has(k) && f.sql !== 'jsonb' && !f.sensitiveKind ? snake(k) : undefined);
|
|
90
|
+
if (!col)
|
|
91
|
+
throw cageError('INVALID_INPUT', [{ path: k, message: `不能按 ${k} 过滤` }]);
|
|
92
|
+
if (k === 'status' && typeof v === 'string' && v.includes(','))
|
|
93
|
+
q = q.where('status', 'in', v.split(','));
|
|
94
|
+
else
|
|
95
|
+
q = q.where(sql.ref(col), '=', coerce(f?.kind ?? 'text', v));
|
|
96
|
+
}
|
|
97
|
+
if (params.status === undefined)
|
|
98
|
+
q = q.where('status', '<>', 'deleted');
|
|
99
|
+
if (params.createdAfter)
|
|
100
|
+
q = q.where('created_at', '>=', new Date(String(params.createdAfter)));
|
|
101
|
+
if (params.createdBefore)
|
|
102
|
+
q = q.where('created_at', '<', new Date(String(params.createdBefore)));
|
|
103
|
+
return q;
|
|
104
|
+
};
|
|
105
|
+
let q = apply(tx.selectFrom(view).selectAll());
|
|
106
|
+
const sortKey = typeof params.sort === 'string' && params.sort ? params.sort.replace(/^-/, '') : 'createdAt';
|
|
107
|
+
const sortCol = SYS[sortKey] ?? (agg.fields[sortKey] && !hidden.has(sortKey) ? snake(sortKey) : undefined);
|
|
108
|
+
if (!sortCol)
|
|
109
|
+
throw cageError('INVALID_INPUT', [{ path: 'sort', message: `不能按 ${sortKey} 排序` }]);
|
|
110
|
+
const desc = typeof params.sort === 'string' ? params.sort.startsWith('-') : true;
|
|
111
|
+
q = q.orderBy(sql.ref(sortCol), desc ? 'desc' : 'asc').orderBy('id').limit(pageSize).offset((page - 1) * pageSize);
|
|
112
|
+
const rows = await q.execute();
|
|
113
|
+
const cnt = await apply(tx.selectFrom(view).select(sql `count(*)::int`.as('n'))).executeTakeFirst();
|
|
114
|
+
return { items: rows.map(viewRowToObject), total: Number(cnt?.n ?? 0), page, pageSize };
|
|
115
|
+
}
|
|
116
|
+
/** 导出:就是读,走安全视图,自然带范围和脱敏;需要 聚合.export 能力,并写读审计 */
|
|
117
|
+
async export(a, params, ctx) {
|
|
118
|
+
const agg = this.agg(a);
|
|
119
|
+
this.need(ctx, `${agg.name}.export`);
|
|
120
|
+
const res = await this.tx(ctx, (tx) => this.listIn(tx, agg, { ...params, page: 1, pageSize: 10000 }, 10000));
|
|
121
|
+
const cols = ['id', ...Object.keys(agg.fields).filter((k) => !hiddenFields(agg).includes(k)), 'status', 'version', 'createdAt', 'updatedAt'];
|
|
122
|
+
const cell = (v) => {
|
|
123
|
+
const s = v === null || v === undefined ? '' : typeof v === 'object' ? JSON.stringify(v) : String(v);
|
|
124
|
+
// 防 CSV 公式注入
|
|
125
|
+
const safe = /^[=+\-@\t\r]/.test(s) ? `'${s}` : s;
|
|
126
|
+
return /[",\n]/.test(safe) ? `"${safe.replace(/"/g, '""')}"` : safe;
|
|
127
|
+
};
|
|
128
|
+
const body = [cols.join(','), ...res.items.map((r) => cols.map((c) => cell(r[c])).join(','))].join('\n');
|
|
129
|
+
await this.auditUnmask(agg, ctx, res.items.map((r) => r.id), 'export');
|
|
130
|
+
return { filename: `${agg.table.name}.csv`, contentType: 'text/csv; charset=utf-8', body: '' + body, rows: res.items.length };
|
|
131
|
+
}
|
|
132
|
+
/** 执行 query 声明:需要 reads 里每个聚合的 read 能力;手写 SQL 用 :name 占位,全部参数化 */
|
|
133
|
+
async run(q, raw, ctx) {
|
|
134
|
+
const query = typeof q === 'string' ? this.k.registry.queries.find((x) => x.name === q) : q;
|
|
135
|
+
if (!query)
|
|
136
|
+
throw cageError('NOT_FOUND');
|
|
137
|
+
for (const a of query.reads)
|
|
138
|
+
this.need(ctx, `${a.name}.read`);
|
|
139
|
+
const parsed = query.input.safeParse(raw ?? {});
|
|
140
|
+
if (!parsed.success)
|
|
141
|
+
throw cageError('INVALID_INPUT', parsed.error.issues.map((i) => ({ path: i.path.join('.'), message: i.message })));
|
|
142
|
+
const input = parsed.data;
|
|
143
|
+
const rows = await this.tx(ctx, async (tx) => {
|
|
144
|
+
if (query.build)
|
|
145
|
+
return (await query.build(tx, input).execute());
|
|
146
|
+
const compiled = compileNamedSql(query.sql, input);
|
|
147
|
+
const r = await compiled.execute(tx);
|
|
148
|
+
return r.rows;
|
|
149
|
+
});
|
|
150
|
+
return rows.map(viewRowToObject);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** :name 占位 → 参数化 SQL(:: 类型转换不受影响) */
|
|
154
|
+
export function compileNamedSql(text, input) {
|
|
155
|
+
const parts = [];
|
|
156
|
+
const re = /(?<![:\w]):([a-zA-Z_][a-zA-Z0-9_]*)/g;
|
|
157
|
+
let last = 0;
|
|
158
|
+
let m;
|
|
159
|
+
while ((m = re.exec(text))) {
|
|
160
|
+
parts.push(sql.raw(text.slice(last, m.index)));
|
|
161
|
+
if (!(m[1] in input))
|
|
162
|
+
throw cageError('INVALID_INPUT', [{ path: m[1], message: `缺少查询参数 ${m[1]}` }]);
|
|
163
|
+
parts.push(sql `${input[m[1]]}`);
|
|
164
|
+
last = m.index + m[0].length;
|
|
165
|
+
}
|
|
166
|
+
parts.push(sql.raw(text.slice(last)));
|
|
167
|
+
return sql `${sql.join(parts, sql.raw(''))}`;
|
|
168
|
+
}
|
|
169
|
+
export const listParamsSchema = z.record(z.string(), z.unknown());
|
|
170
|
+
//# sourceMappingURL=read.js.map
|
package/dist/read.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { CONNECTOR, INBOUND, OUTBOUND, ROUTE } from './brands.js';
|
|
2
|
+
import { type AnyAggregate } from './primitives/aggregate.js';
|
|
3
|
+
import type { AnyCommand } from './primitives/command.js';
|
|
4
|
+
import type { AnyEvent } from './primitives/event.js';
|
|
5
|
+
import type { AnyQuery, AnyReaction, Approval, Job } from './primitives/flow.js';
|
|
6
|
+
export interface RegisteredCommand {
|
|
7
|
+
readonly cmd: AnyCommand;
|
|
8
|
+
/** 命令名(导出名或显式 name) */
|
|
9
|
+
readonly name: string;
|
|
10
|
+
/** 能力点:聚合名.命令名 */
|
|
11
|
+
readonly capability: string;
|
|
12
|
+
readonly exportName: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CatalogEntry {
|
|
15
|
+
capability: string;
|
|
16
|
+
kind: 'command' | 'read' | 'export' | 'unmask' | 'system';
|
|
17
|
+
aggregate?: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
/** 命令的调用方限制,管理界面据此提示 */
|
|
20
|
+
invokedBy?: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
export interface RuntimeExtension {
|
|
23
|
+
kind: 'CONNECTOR' | 'OUTBOUND' | 'INBOUND' | 'ROUTE';
|
|
24
|
+
name: string;
|
|
25
|
+
value: any;
|
|
26
|
+
}
|
|
27
|
+
export interface Registry {
|
|
28
|
+
readonly aggregates: readonly AnyAggregate[];
|
|
29
|
+
readonly commands: readonly RegisteredCommand[];
|
|
30
|
+
readonly events: readonly AnyEvent[];
|
|
31
|
+
readonly reactions: readonly {
|
|
32
|
+
r: AnyReaction;
|
|
33
|
+
name: string;
|
|
34
|
+
}[];
|
|
35
|
+
readonly queries: readonly AnyQuery[];
|
|
36
|
+
readonly approvals: readonly {
|
|
37
|
+
a: Approval;
|
|
38
|
+
name: string;
|
|
39
|
+
}[];
|
|
40
|
+
readonly jobs: readonly Job[];
|
|
41
|
+
readonly extensions: readonly RuntimeExtension[];
|
|
42
|
+
readonly systemDdl: readonly string[];
|
|
43
|
+
aggregate(name: string): AnyAggregate | undefined;
|
|
44
|
+
/** 按能力点或命令对象找命令 */
|
|
45
|
+
command(ref: string | AnyCommand): RegisteredCommand | undefined;
|
|
46
|
+
capabilityOf(cmd: AnyCommand): string;
|
|
47
|
+
/** 任意原语对象的导出名 */
|
|
48
|
+
nameOf(v: object): string | undefined;
|
|
49
|
+
reactionsFor(eventName: string): {
|
|
50
|
+
r: AnyReaction;
|
|
51
|
+
name: string;
|
|
52
|
+
}[];
|
|
53
|
+
approvalFor(aggName: string): {
|
|
54
|
+
a: Approval;
|
|
55
|
+
name: string;
|
|
56
|
+
} | undefined;
|
|
57
|
+
approvalByProcess(process: string): {
|
|
58
|
+
a: Approval;
|
|
59
|
+
name: string;
|
|
60
|
+
} | undefined;
|
|
61
|
+
capabilityCatalog(): CatalogEntry[];
|
|
62
|
+
/** 带 CONSUMERS 标记的声明对象(连接器出站映射等) */
|
|
63
|
+
consumerProviders(): any[];
|
|
64
|
+
}
|
|
65
|
+
export interface RegistryOptions {
|
|
66
|
+
/** 框架额外的系统能力点,例如 Sys.audit.read */
|
|
67
|
+
extraCapabilities?: CatalogEntry[];
|
|
68
|
+
}
|
|
69
|
+
/** 遍历一个或多个 domain 模块的导出,建立注册表。 */
|
|
70
|
+
export declare function buildRegistry(domains: object | object[], opts?: RegistryOptions): Registry;
|
|
71
|
+
export { CONNECTOR, INBOUND, OUTBOUND, ROUTE };
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// 注册表:遍历 domain 包的导出,靠品牌标记识别原语,用导出名给命令和反应命名。
|
|
2
|
+
import { CONSUMERS, CONNECTOR, INBOUND, OUTBOUND, ROUTE, SYSTEM_DDL, brandOf } from './brands.js';
|
|
3
|
+
import { declError } from './errors.js';
|
|
4
|
+
import { sensitiveFields } from './primitives/aggregate.js';
|
|
5
|
+
/** 遍历一个或多个 domain 模块的导出,建立注册表。 */
|
|
6
|
+
export function buildRegistry(domains, opts = {}) {
|
|
7
|
+
const mods = Array.isArray(domains) ? domains : [domains];
|
|
8
|
+
const names = new Map();
|
|
9
|
+
const aggregates = [];
|
|
10
|
+
const commands = [];
|
|
11
|
+
const events = [];
|
|
12
|
+
const reactions = [];
|
|
13
|
+
const queries = [];
|
|
14
|
+
const approvals = [];
|
|
15
|
+
const jobs = [];
|
|
16
|
+
const extensions = [];
|
|
17
|
+
const systemDdl = [];
|
|
18
|
+
for (const mod of mods) {
|
|
19
|
+
for (const [exportName, v] of Object.entries(mod)) {
|
|
20
|
+
if (!v || (typeof v !== 'object' && typeof v !== 'function'))
|
|
21
|
+
continue;
|
|
22
|
+
if (names.has(v))
|
|
23
|
+
continue; // 同一个对象被重复导出:保留第一个名字
|
|
24
|
+
const brand = brandOf(v);
|
|
25
|
+
if (!brand)
|
|
26
|
+
continue;
|
|
27
|
+
names.set(v, exportName);
|
|
28
|
+
switch (brand) {
|
|
29
|
+
case 'AGGREGATE':
|
|
30
|
+
if (aggregates.some((a) => a.name === v.name)) {
|
|
31
|
+
throw declError('CAGE-REG-002', `聚合名重复:${v.name}`);
|
|
32
|
+
}
|
|
33
|
+
aggregates.push(v);
|
|
34
|
+
break;
|
|
35
|
+
case 'COMMAND': {
|
|
36
|
+
const cmd = v;
|
|
37
|
+
const name = cmd.name ?? exportName;
|
|
38
|
+
commands.push({ cmd, name, capability: `${cmd.agg.name}.${name}`, exportName });
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
case 'EVENT':
|
|
42
|
+
events.push(v);
|
|
43
|
+
break;
|
|
44
|
+
case 'REACTION':
|
|
45
|
+
reactions.push({ r: v, name: v.name ?? exportName });
|
|
46
|
+
break;
|
|
47
|
+
case 'QUERY':
|
|
48
|
+
queries.push(v);
|
|
49
|
+
break;
|
|
50
|
+
case 'APPROVAL':
|
|
51
|
+
approvals.push({ a: v, name: exportName });
|
|
52
|
+
break;
|
|
53
|
+
case 'JOB':
|
|
54
|
+
jobs.push(v);
|
|
55
|
+
break;
|
|
56
|
+
case 'CONNECTOR':
|
|
57
|
+
case 'OUTBOUND':
|
|
58
|
+
case 'INBOUND':
|
|
59
|
+
case 'ROUTE':
|
|
60
|
+
extensions.push({ kind: brand, name: exportName, value: v });
|
|
61
|
+
break;
|
|
62
|
+
default:
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
const ddl = v[SYSTEM_DDL];
|
|
66
|
+
if (typeof ddl === 'function') {
|
|
67
|
+
const text = String(ddl());
|
|
68
|
+
if (!systemDdl.includes(text))
|
|
69
|
+
systemDdl.push(text);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ---- 一致性校验:引用的东西都必须被导出,否则抽取器和内核看不到 ----
|
|
74
|
+
const aggSet = new Set(aggregates);
|
|
75
|
+
const caps = new Set();
|
|
76
|
+
for (const c of commands) {
|
|
77
|
+
if (!aggSet.has(c.cmd.agg))
|
|
78
|
+
throw declError('CAGE-REG-001', `命令 ${c.capability} 所属的聚合 ${c.cmd.agg.name} 没有从 domain 导出`);
|
|
79
|
+
if (caps.has(c.capability))
|
|
80
|
+
throw declError('CAGE-REG-003', `能力点重复:${c.capability},可用 command({ name }) 区分`);
|
|
81
|
+
caps.add(c.capability);
|
|
82
|
+
for (const [alias, a] of Object.entries(c.cmd.reads)) {
|
|
83
|
+
if (!aggSet.has(a))
|
|
84
|
+
throw declError('CAGE-REG-001', `命令 ${c.capability} 的 reads.${alias} 引用的聚合没有导出`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const cmdSet = new Set(commands.map((c) => c.cmd));
|
|
88
|
+
for (const { r, name } of reactions) {
|
|
89
|
+
if (!cmdSet.has(r.command))
|
|
90
|
+
throw declError('CAGE-REG-001', `反应 ${name} 调用的命令没有从 domain 导出`);
|
|
91
|
+
}
|
|
92
|
+
for (const { a, name } of approvals) {
|
|
93
|
+
if (!cmdSet.has(a.onApproved) || !cmdSet.has(a.onRejected)) {
|
|
94
|
+
throw declError('CAGE-REG-001', `审批绑定 ${name} 的结论命令没有从 domain 导出`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
for (const j of jobs) {
|
|
98
|
+
for (const c of j.calls)
|
|
99
|
+
if (!cmdSet.has(c))
|
|
100
|
+
throw declError('CAGE-REG-001', `任务 ${j.name} 调用的命令没有导出`);
|
|
101
|
+
}
|
|
102
|
+
const queryNames = new Set();
|
|
103
|
+
for (const q of queries) {
|
|
104
|
+
if (queryNames.has(q.name))
|
|
105
|
+
throw declError('CAGE-REG-002', `查询名重复:${q.name}`);
|
|
106
|
+
queryNames.add(q.name);
|
|
107
|
+
}
|
|
108
|
+
const byCap = new Map(commands.map((c) => [c.capability, c]));
|
|
109
|
+
const byCmd = new Map(commands.map((c) => [c.cmd, c]));
|
|
110
|
+
const byAgg = new Map(aggregates.map((a) => [a.name, a]));
|
|
111
|
+
const registry = {
|
|
112
|
+
aggregates, commands, events, reactions, queries, approvals, jobs, extensions, systemDdl,
|
|
113
|
+
aggregate: (name) => byAgg.get(name),
|
|
114
|
+
command: (ref) => (typeof ref === 'string' ? byCap.get(ref) : byCmd.get(ref)),
|
|
115
|
+
capabilityOf: (cmd) => {
|
|
116
|
+
const c = byCmd.get(cmd);
|
|
117
|
+
if (!c)
|
|
118
|
+
throw declError('CAGE-REG-001', `命令(${cmd.agg.name})没有从 domain 导出,无法确定能力点`);
|
|
119
|
+
return c.capability;
|
|
120
|
+
},
|
|
121
|
+
nameOf: (v) => names.get(v),
|
|
122
|
+
reactionsFor: (eventName) => reactions.filter((x) => x.r.event.name === eventName),
|
|
123
|
+
approvalFor: (aggName) => approvals.find((x) => x.a.agg.name === aggName),
|
|
124
|
+
approvalByProcess: (process) => approvals.find((x) => x.a.process === process),
|
|
125
|
+
capabilityCatalog: () => {
|
|
126
|
+
const out = [];
|
|
127
|
+
for (const a of aggregates) {
|
|
128
|
+
out.push({ capability: `${a.name}.read`, kind: 'read', aggregate: a.name, description: `查看${a.description ?? a.name}` });
|
|
129
|
+
out.push({ capability: `${a.name}.export`, kind: 'export', aggregate: a.name, description: `导出${a.description ?? a.name}` });
|
|
130
|
+
for (const kind of new Set(Object.values(sensitiveFields(a)))) {
|
|
131
|
+
out.push({ capability: `${a.name}.unmask.${kind}`, kind: 'unmask', aggregate: a.name, description: `查看 ${a.name} 的 ${kind} 明文` });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
for (const c of commands) {
|
|
135
|
+
out.push({
|
|
136
|
+
capability: c.capability, kind: 'command', aggregate: c.cmd.agg.name,
|
|
137
|
+
description: c.cmd.description, invokedBy: c.cmd.invokedBy,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// 框架系统能力:审计查询、异步任务运维(内核拥有审计表和 outbox)
|
|
141
|
+
out.push({ capability: 'Sys.audit.read', kind: 'system', description: '查询审计记录' }, { capability: 'Sys.ops.read', kind: 'system', description: '查看异步任务、死信、第三方同步记录' }, { capability: 'Sys.ops.manage', kind: 'system', description: '重放或丢弃死信、启停定时任务' });
|
|
142
|
+
for (const e of opts.extraCapabilities ?? [])
|
|
143
|
+
out.push(e);
|
|
144
|
+
return out.sort((x, y) => x.capability.localeCompare(y.capability));
|
|
145
|
+
},
|
|
146
|
+
consumerProviders: () => extensions.map((e) => e.value).filter((v) => typeof v?.[CONSUMERS] === 'function'),
|
|
147
|
+
};
|
|
148
|
+
return Object.freeze(registry);
|
|
149
|
+
}
|
|
150
|
+
export { CONNECTOR, INBOUND, OUTBOUND, ROUTE };
|
|
151
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type RawBuilder } from 'kysely';
|
|
2
|
+
import type { Combinator, Ctx, ScopeGrant } from '../types.js';
|
|
3
|
+
export interface ScopeSpec {
|
|
4
|
+
/** 部门字段(dept、deptSubtree、deptSet 依赖它) */
|
|
5
|
+
readonly deptField?: string;
|
|
6
|
+
/** 创建人字段(self 依赖它) */
|
|
7
|
+
readonly ownerField?: string;
|
|
8
|
+
/** 声明时给出的建议组合子,仅用于文档与状态图 */
|
|
9
|
+
readonly hint?: Combinator;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 范围声明:
|
|
13
|
+
* scope.deptSubtree('deptId') 部门字段是 deptId,创建人字段自动识别 createdBy
|
|
14
|
+
* scope.self('createdBy') 只有创建人字段
|
|
15
|
+
* scope.of({ dept: 'deptId', owner: 'ownerId' })
|
|
16
|
+
* scope.none() 没有部门和创建人字段(只能授予 all)
|
|
17
|
+
*/
|
|
18
|
+
export declare const scope: {
|
|
19
|
+
self: (ownerField?: string) => ScopeSpec;
|
|
20
|
+
dept: (deptField: string, ownerField?: string) => ScopeSpec;
|
|
21
|
+
deptSubtree: (deptField: string, ownerField?: string) => ScopeSpec;
|
|
22
|
+
deptSet: (deptField: string, ownerField?: string) => ScopeSpec;
|
|
23
|
+
all: () => ScopeSpec;
|
|
24
|
+
of: (f: {
|
|
25
|
+
dept?: string;
|
|
26
|
+
owner?: string;
|
|
27
|
+
}) => ScopeSpec;
|
|
28
|
+
none: () => ScopeSpec;
|
|
29
|
+
};
|
|
30
|
+
/** 没有任何授权时按「仅本人」处理(默认拒绝的一部分) */
|
|
31
|
+
export declare const DEFAULT_GRANTS: ScopeGrant[];
|
|
32
|
+
export declare function grantsFor(ctx: Ctx, aggName: string): ScopeGrant[];
|
|
33
|
+
/** 把一个组合子翻译成参数化 SQL 条件。字段名用 sql.ref 引用,值全部参数化,没有字符串拼接。 */
|
|
34
|
+
export declare function compileGrant(s: ScopeSpec, g: ScopeGrant, ctx: Ctx, alias?: string): RawBuilder<boolean>;
|
|
35
|
+
/** 多个授权取并集:用 OR 连接;外层始终加租户条件。 */
|
|
36
|
+
export declare function compileScope(s: ScopeSpec, aggName: string, ctx: Ctx, alias?: string): RawBuilder<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* 内存判定:与 SQL 翻译语义一致。deptSubtree 需要知道记录所在部门的祖先路径,由调用方提供。
|
|
39
|
+
*/
|
|
40
|
+
export declare function scopeMatches(s: ScopeSpec, aggName: string, ctx: Ctx, row: Record<string, unknown> & {
|
|
41
|
+
tenantId?: string;
|
|
42
|
+
}, deptAncestorsOf?: (deptId: string) => string | undefined): boolean;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// 数据范围:聚合声明「哪个字段是部门、哪个字段是创建人」,授权数据决定用哪个组合子。
|
|
2
|
+
// 每个组合子都有 SQL 翻译(compileScope)和内存判定(scopeMatches),两者语义一致。
|
|
3
|
+
import { sql } from 'kysely';
|
|
4
|
+
import { snake } from '../util/names.js';
|
|
5
|
+
function spec(hint, deptField, ownerField) {
|
|
6
|
+
return Object.freeze({ deptField, ownerField, hint });
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 范围声明:
|
|
10
|
+
* scope.deptSubtree('deptId') 部门字段是 deptId,创建人字段自动识别 createdBy
|
|
11
|
+
* scope.self('createdBy') 只有创建人字段
|
|
12
|
+
* scope.of({ dept: 'deptId', owner: 'ownerId' })
|
|
13
|
+
* scope.none() 没有部门和创建人字段(只能授予 all)
|
|
14
|
+
*/
|
|
15
|
+
export const scope = {
|
|
16
|
+
self: (ownerField = 'createdBy') => spec('self', undefined, ownerField),
|
|
17
|
+
dept: (deptField, ownerField) => spec('dept', deptField, ownerField),
|
|
18
|
+
deptSubtree: (deptField, ownerField) => spec('deptSubtree', deptField, ownerField),
|
|
19
|
+
deptSet: (deptField, ownerField) => spec('deptSet', deptField, ownerField),
|
|
20
|
+
all: () => spec('all'),
|
|
21
|
+
of: (f) => spec(undefined, f.dept, f.owner),
|
|
22
|
+
none: () => spec(undefined),
|
|
23
|
+
};
|
|
24
|
+
/** 没有任何授权时按「仅本人」处理(默认拒绝的一部分) */
|
|
25
|
+
export const DEFAULT_GRANTS = [{ combinator: 'self' }];
|
|
26
|
+
export function grantsFor(ctx, aggName) {
|
|
27
|
+
const g = ctx.scopes[aggName] ?? ctx.scopes['*'];
|
|
28
|
+
return g && g.length > 0 ? g : DEFAULT_GRANTS;
|
|
29
|
+
}
|
|
30
|
+
/** 把一个组合子翻译成参数化 SQL 条件。字段名用 sql.ref 引用,值全部参数化,没有字符串拼接。 */
|
|
31
|
+
export function compileGrant(s, g, ctx, alias) {
|
|
32
|
+
const col = (field) => sql.ref(alias ? `${alias}.${snake(field)}` : snake(field));
|
|
33
|
+
switch (g.combinator) {
|
|
34
|
+
case 'all':
|
|
35
|
+
return sql `true`;
|
|
36
|
+
case 'self': {
|
|
37
|
+
const who = ctx.userId ?? ctx.onBehalfOf ?? null;
|
|
38
|
+
return s.ownerField && who ? sql `${col(s.ownerField)} = ${who}` : sql `false`;
|
|
39
|
+
}
|
|
40
|
+
case 'dept':
|
|
41
|
+
return s.deptField && ctx.deptId ? sql `${col(s.deptField)} = ${ctx.deptId}` : sql `false`;
|
|
42
|
+
case 'deptSubtree':
|
|
43
|
+
return s.deptField && ctx.deptPath
|
|
44
|
+
? sql `${col(s.deptField)} in (select d.id from sys.dept d where d.tenant_id = ${ctx.tenantId} and d.ancestors like ${ctx.deptPath + '%'})`
|
|
45
|
+
: sql `false`;
|
|
46
|
+
case 'deptSet':
|
|
47
|
+
return s.deptField && g.deptIds && g.deptIds.length > 0
|
|
48
|
+
? sql `${col(s.deptField)} = any(${g.deptIds}::uuid[])`
|
|
49
|
+
: sql `false`;
|
|
50
|
+
default:
|
|
51
|
+
throw new Error('[CAGE-SCOPE-001] 未知的范围组合子');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** 多个授权取并集:用 OR 连接;外层始终加租户条件。 */
|
|
55
|
+
export function compileScope(s, aggName, ctx, alias) {
|
|
56
|
+
const grants = grantsFor(ctx, aggName);
|
|
57
|
+
const parts = grants.map((g) => compileGrant(s, g, ctx, alias));
|
|
58
|
+
const tenantCol = sql.ref(alias ? `${alias}.tenant_id` : 'tenant_id');
|
|
59
|
+
return sql `(${tenantCol} = ${ctx.tenantId} and (${sql.join(parts, sql ` or `)}))`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 内存判定:与 SQL 翻译语义一致。deptSubtree 需要知道记录所在部门的祖先路径,由调用方提供。
|
|
63
|
+
*/
|
|
64
|
+
export function scopeMatches(s, aggName, ctx, row, deptAncestorsOf) {
|
|
65
|
+
if (row.tenantId !== undefined && row.tenantId !== ctx.tenantId)
|
|
66
|
+
return false;
|
|
67
|
+
return grantsFor(ctx, aggName).some((g) => {
|
|
68
|
+
switch (g.combinator) {
|
|
69
|
+
case 'all':
|
|
70
|
+
return true;
|
|
71
|
+
case 'self': {
|
|
72
|
+
const who = ctx.userId ?? ctx.onBehalfOf ?? null;
|
|
73
|
+
return !!s.ownerField && !!who && row[s.ownerField] === who;
|
|
74
|
+
}
|
|
75
|
+
case 'dept':
|
|
76
|
+
return !!s.deptField && !!ctx.deptId && row[s.deptField] === ctx.deptId;
|
|
77
|
+
case 'deptSubtree': {
|
|
78
|
+
if (!s.deptField || !ctx.deptPath)
|
|
79
|
+
return false;
|
|
80
|
+
const anc = deptAncestorsOf?.(String(row[s.deptField]));
|
|
81
|
+
return !!anc && anc.startsWith(ctx.deptPath);
|
|
82
|
+
}
|
|
83
|
+
case 'deptSet':
|
|
84
|
+
return !!s.deptField && !!g.deptIds?.includes(String(row[s.deptField]));
|
|
85
|
+
default:
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scope/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function step<T>(name: string, fn: () => Promise<T>): Promise<T>;
|
|
2
|
+
export declare function traceCarrier(): Record<string, string>;
|
|
3
|
+
export declare function withCarrier<T>(carrier: Record<string, string> | null | undefined, fn: () => Promise<T>): Promise<T>;
|
|
4
|
+
export interface Logger {
|
|
5
|
+
info(obj: object | string, msg?: string): void;
|
|
6
|
+
warn(obj: object | string, msg?: string): void;
|
|
7
|
+
error(obj: object | string, msg?: string): void;
|
|
8
|
+
debug?(obj: object | string, msg?: string): void;
|
|
9
|
+
}
|
|
10
|
+
export declare const consoleLogger: Logger;
|
|
11
|
+
export declare const silentLogger: Logger;
|