@reprova/sdk 0.2.0 → 0.5.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/README.md +293 -11
- package/dist/context.d.ts +17 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +18 -0
- package/dist/context.js.map +1 -1
- package/dist/drizzle.d.ts +33 -0
- package/dist/drizzle.d.ts.map +1 -0
- package/dist/drizzle.js +194 -0
- package/dist/drizzle.js.map +1 -0
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/knex.d.ts +5 -0
- package/dist/knex.d.ts.map +1 -0
- package/dist/knex.js +83 -0
- package/dist/knex.js.map +1 -0
- package/dist/kysely.d.ts +22 -0
- package/dist/kysely.d.ts.map +1 -0
- package/dist/kysely.js +172 -0
- package/dist/kysely.js.map +1 -0
- package/dist/nest.d.ts +18 -0
- package/dist/nest.d.ts.map +1 -0
- package/dist/nest.js +94 -0
- package/dist/nest.js.map +1 -0
- package/dist/proto.gen.d.ts +75 -1
- package/dist/proto.gen.d.ts.map +1 -1
- package/dist/registry.d.ts +22 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +70 -0
- package/dist/registry.js.map +1 -0
- package/dist/sdk.d.ts +30 -4
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +482 -16
- package/dist/sdk.js.map +1 -1
- package/dist/sequelize.d.ts +5 -0
- package/dist/sequelize.d.ts.map +1 -0
- package/dist/sequelize.js +105 -0
- package/dist/sequelize.js.map +1 -0
- package/dist/typeorm.d.ts +2 -0
- package/dist/typeorm.d.ts.map +1 -0
- package/dist/typeorm.js +65 -0
- package/dist/typeorm.js.map +1 -0
- package/package.json +19 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC/G,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC/F,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAClG,cAAc,gBAAgB,CAAC;AAE/B,eAAO,MAAM,WAAW,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
export { Reprova, wrapResponse } from './sdk.js';
|
|
2
|
-
export { contextStorage, currentContext } from './context.js';
|
|
1
|
+
export { Reprova, wrapResponse, forwardAsyncErrors, replayErrorHandler } from './sdk.js';
|
|
2
|
+
export { contextStorage, currentContext, setAuthClaims } from './context.js';
|
|
3
3
|
export { createPrismaExtension } from './prisma.js';
|
|
4
|
+
export { createKyselyPlugin } from './kysely.js';
|
|
5
|
+
export { installSequelizeHooks } from './sequelize.js';
|
|
6
|
+
export { installTypeOrmSubscriber } from './typeorm.js';
|
|
7
|
+
export { installKnexHooks } from './knex.js';
|
|
8
|
+
export { createNestExceptionFilter } from './nest.js';
|
|
9
|
+
export { createDrizzleLogger, createDrizzleCache, createDrizzleFootprint } from './drizzle.js';
|
|
4
10
|
export * from './proto.gen.js';
|
|
5
11
|
export const SDK_VERSION = '0.1.0';
|
|
6
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAU/F,cAAc,gBAAgB,CAAC;AAE/B,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
|
package/dist/knex.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knex.d.ts","sourceRoot":"","sources":["../src/knex.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,kBAAkB;IAEjC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CAC1C;AAsCD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,GAAE,kBAAuB,GAAG,IAAI,CAqCnF"}
|
package/dist/knex.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { contextStorage } from './context.js';
|
|
2
|
+
const OP_BY_METHOD = {
|
|
3
|
+
select: 'select',
|
|
4
|
+
first: 'select',
|
|
5
|
+
pluck: 'select',
|
|
6
|
+
insert: 'insert',
|
|
7
|
+
update: 'update',
|
|
8
|
+
del: 'delete',
|
|
9
|
+
delete: 'delete',
|
|
10
|
+
};
|
|
11
|
+
function isRowArray(v) {
|
|
12
|
+
return Array.isArray(v) && v.length > 0 && typeof v[0] === 'object' && v[0] !== null;
|
|
13
|
+
}
|
|
14
|
+
function distinct(values) {
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
const out = [];
|
|
17
|
+
for (const v of values) {
|
|
18
|
+
if (!seen.has(v)) {
|
|
19
|
+
seen.add(v);
|
|
20
|
+
out.push(v);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
function extractRowPks(rows, pkCols) {
|
|
26
|
+
if (pkCols.length === 0)
|
|
27
|
+
return [];
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const row of rows) {
|
|
30
|
+
const vals = pkCols.map((c) => row[c]);
|
|
31
|
+
if (vals.some((v) => v === undefined || v === null))
|
|
32
|
+
continue;
|
|
33
|
+
out.push(vals.map((v) => String(v)).join(':'));
|
|
34
|
+
}
|
|
35
|
+
return distinct(out);
|
|
36
|
+
}
|
|
37
|
+
// Installs a footprint listener on a Knex instance. Also covers Objection.js
|
|
38
|
+
// models bound to this same instance.
|
|
39
|
+
export function installKnexHooks(knex, opts = {}) {
|
|
40
|
+
const primaryKey = opts.primaryKey ?? (() => ['id']);
|
|
41
|
+
try {
|
|
42
|
+
knex.on('query-response', (response, obj, builder) => {
|
|
43
|
+
try {
|
|
44
|
+
const ctx = contextStorage.getStore();
|
|
45
|
+
if (!ctx)
|
|
46
|
+
return;
|
|
47
|
+
const method = obj?.method ?? builder?._method;
|
|
48
|
+
const op = method ? OP_BY_METHOD[method] : undefined;
|
|
49
|
+
if (!op)
|
|
50
|
+
return; // schema/DDL/raw — skip
|
|
51
|
+
const table = builder?._single?.table;
|
|
52
|
+
if (typeof table !== 'string' || !table)
|
|
53
|
+
return;
|
|
54
|
+
let pks = [];
|
|
55
|
+
let count = 0;
|
|
56
|
+
if (isRowArray(response)) {
|
|
57
|
+
pks = extractRowPks(response, primaryKey(table));
|
|
58
|
+
count = response.length;
|
|
59
|
+
}
|
|
60
|
+
else if (Array.isArray(response)) {
|
|
61
|
+
// Primitive array — insert returning ids (partial on sqlite/mysql).
|
|
62
|
+
if (op === 'insert')
|
|
63
|
+
pks = distinct(response.filter((v) => v != null).map((v) => String(v)));
|
|
64
|
+
count = response.length;
|
|
65
|
+
}
|
|
66
|
+
else if (typeof response === 'number') {
|
|
67
|
+
count = response; // affected-row count from update/delete
|
|
68
|
+
}
|
|
69
|
+
const entry = {
|
|
70
|
+
model: table,
|
|
71
|
+
op,
|
|
72
|
+
pks,
|
|
73
|
+
count,
|
|
74
|
+
note: count === 0 ? 'returned 0 rows' : undefined,
|
|
75
|
+
};
|
|
76
|
+
ctx.footprint.push(entry);
|
|
77
|
+
}
|
|
78
|
+
catch { /* never break the query pipeline */ }
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch { /* never throw from install */ }
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=knex.js.map
|
package/dist/knex.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knex.js","sourceRoot":"","sources":["../src/knex.ts"],"names":[],"mappings":"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"}
|
package/dist/kysely.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface KyselyQueryId {
|
|
2
|
+
readonly queryId: string;
|
|
3
|
+
}
|
|
4
|
+
export interface KyselyPluginOptions {
|
|
5
|
+
primaryKey?: (table: string) => string[];
|
|
6
|
+
captureWhereShape?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface KyselyFootprintPlugin {
|
|
9
|
+
transformQuery<N extends {
|
|
10
|
+
kind: string;
|
|
11
|
+
}>(args: {
|
|
12
|
+
node: N;
|
|
13
|
+
queryId: KyselyQueryId;
|
|
14
|
+
}): N;
|
|
15
|
+
transformResult<R>(args: {
|
|
16
|
+
result: R;
|
|
17
|
+
queryId: KyselyQueryId;
|
|
18
|
+
}): Promise<R>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createKyselyPlugin(opts?: KyselyPluginOptions): KyselyFootprintPlugin;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=kysely.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely.d.ts","sourceRoot":"","sources":["../src/kysely.ts"],"names":[],"mappings":"AAmBA,UAAU,aAAa;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAOD,MAAM,WAAW,mBAAmB;IAKlC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAIzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAKD,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GAAG,CAAC,CAAC;IACzF,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC7E;AA6GD,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,mBAAwB,GAAG,qBAAqB,CAmExF"}
|
package/dist/kysely.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { contextStorage } from './context.js';
|
|
2
|
+
const OP_BY_KIND = {
|
|
3
|
+
SelectQueryNode: 'select',
|
|
4
|
+
InsertQueryNode: 'insert',
|
|
5
|
+
UpdateQueryNode: 'update',
|
|
6
|
+
DeleteQueryNode: 'delete',
|
|
7
|
+
MergeQueryNode: 'merge',
|
|
8
|
+
};
|
|
9
|
+
// TableNode → its identifier name; unwraps an AliasNode (`from('t as x')`).
|
|
10
|
+
function tableName(node) {
|
|
11
|
+
const n = node;
|
|
12
|
+
if (!n || typeof n !== 'object')
|
|
13
|
+
return undefined;
|
|
14
|
+
if (n.kind === 'AliasNode')
|
|
15
|
+
return tableName(n.node);
|
|
16
|
+
if (n.kind === 'TableNode') {
|
|
17
|
+
const table = n.table;
|
|
18
|
+
return table?.identifier?.name;
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
// The operation's principal table, read from the op-specific field.
|
|
23
|
+
function primaryTable(node) {
|
|
24
|
+
switch (node.kind) {
|
|
25
|
+
case 'SelectQueryNode':
|
|
26
|
+
case 'DeleteQueryNode': {
|
|
27
|
+
const from = node.from;
|
|
28
|
+
return tableName(from?.froms?.[0]);
|
|
29
|
+
}
|
|
30
|
+
case 'InsertQueryNode':
|
|
31
|
+
return tableName(node.into);
|
|
32
|
+
case 'UpdateQueryNode':
|
|
33
|
+
return tableName(node.table);
|
|
34
|
+
default:
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Every table referenced anywhere in the query (joins, subqueries, CTEs, …),
|
|
39
|
+
// in first-seen order. A bounded deep-walk — instrumentation must not blow the
|
|
40
|
+
// stack or hang on a pathological tree.
|
|
41
|
+
function collectTables(root) {
|
|
42
|
+
const found = [];
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
const stack = [root];
|
|
45
|
+
let budget = 5000;
|
|
46
|
+
while (stack.length && budget-- > 0) {
|
|
47
|
+
const cur = stack.pop();
|
|
48
|
+
if (!cur || typeof cur !== 'object')
|
|
49
|
+
continue;
|
|
50
|
+
const name = tableName(cur);
|
|
51
|
+
if (name && !seen.has(name)) {
|
|
52
|
+
seen.add(name);
|
|
53
|
+
found.push(name);
|
|
54
|
+
}
|
|
55
|
+
for (const v of Object.values(cur)) {
|
|
56
|
+
if (v && typeof v === 'object')
|
|
57
|
+
stack.push(v);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return found;
|
|
61
|
+
}
|
|
62
|
+
// Column NAMES referenced inside a WhereNode subtree — never values.
|
|
63
|
+
function whereColumns(whereNode) {
|
|
64
|
+
const cols = new Set();
|
|
65
|
+
const stack = [whereNode];
|
|
66
|
+
let budget = 5000;
|
|
67
|
+
while (stack.length && budget-- > 0) {
|
|
68
|
+
const cur = stack.pop();
|
|
69
|
+
if (!cur || typeof cur !== 'object')
|
|
70
|
+
continue;
|
|
71
|
+
const n = cur;
|
|
72
|
+
if (n.kind === 'ColumnNode') {
|
|
73
|
+
const col = n.column;
|
|
74
|
+
if (col?.name)
|
|
75
|
+
cols.add(col.name);
|
|
76
|
+
}
|
|
77
|
+
for (const v of Object.values(n)) {
|
|
78
|
+
if (v && typeof v === 'object')
|
|
79
|
+
stack.push(v);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return [...cols].sort();
|
|
83
|
+
}
|
|
84
|
+
function extractPks(rows, pkCols) {
|
|
85
|
+
if (pkCols.length === 0)
|
|
86
|
+
return [];
|
|
87
|
+
// A set: a join can return the same primary-table row many times, but the
|
|
88
|
+
// footprint records which DISTINCT rows were touched.
|
|
89
|
+
const seen = new Set();
|
|
90
|
+
const pks = [];
|
|
91
|
+
for (const row of rows) {
|
|
92
|
+
const vals = pkCols.map((c) => row[c]);
|
|
93
|
+
if (vals.some((v) => v === undefined))
|
|
94
|
+
continue; // column not selected — can't form a PK
|
|
95
|
+
const pk = vals.map((v) => String(v)).join(':');
|
|
96
|
+
if (!seen.has(pk)) {
|
|
97
|
+
seen.add(pk);
|
|
98
|
+
pks.push(pk);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return pks;
|
|
102
|
+
}
|
|
103
|
+
// Creates the Reprova Kysely footprint plugin.
|
|
104
|
+
// Usage: new Kysely({ dialect, plugins: [createKyselyPlugin()] })
|
|
105
|
+
export function createKyselyPlugin(opts = {}) {
|
|
106
|
+
const primaryKey = opts.primaryKey ?? (() => ['id']);
|
|
107
|
+
const captureWhereShape = opts.captureWhereShape !== false;
|
|
108
|
+
// Keyed by the queryId OBJECT shared across both hooks; a compiled-but-never-
|
|
109
|
+
// executed query is GC'd without leaking.
|
|
110
|
+
const pending = new WeakMap();
|
|
111
|
+
return {
|
|
112
|
+
transformQuery(args) {
|
|
113
|
+
try {
|
|
114
|
+
const node = args.node;
|
|
115
|
+
const op = OP_BY_KIND[node.kind];
|
|
116
|
+
if (op) {
|
|
117
|
+
const whereShape = captureWhereShape && node.where
|
|
118
|
+
? whereColumns(node.where).join(',') || undefined
|
|
119
|
+
: undefined;
|
|
120
|
+
pending.set(args.queryId, {
|
|
121
|
+
op,
|
|
122
|
+
primary: primaryTable(node),
|
|
123
|
+
tables: collectTables(node),
|
|
124
|
+
whereShape,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// A footprint failure must never alter the query — fall through.
|
|
130
|
+
}
|
|
131
|
+
return args.node;
|
|
132
|
+
},
|
|
133
|
+
async transformResult(args) {
|
|
134
|
+
try {
|
|
135
|
+
const meta = pending.get(args.queryId);
|
|
136
|
+
if (meta) {
|
|
137
|
+
pending.delete(args.queryId);
|
|
138
|
+
const ctx = contextStorage.getStore();
|
|
139
|
+
if (ctx) {
|
|
140
|
+
const result = args.result;
|
|
141
|
+
const rows = result.rows ?? [];
|
|
142
|
+
const affected = result.numAffectedRows != null ? Number(result.numAffectedRows) : undefined;
|
|
143
|
+
const count = rows.length || affected || 0;
|
|
144
|
+
const primary = meta.primary ?? '$unknown';
|
|
145
|
+
const entry = {
|
|
146
|
+
model: primary,
|
|
147
|
+
op: meta.op,
|
|
148
|
+
pks: extractPks(rows, primaryKey(primary)),
|
|
149
|
+
where_shape: meta.whereShape,
|
|
150
|
+
count,
|
|
151
|
+
note: count === 0 ? 'returned 0 rows' : undefined,
|
|
152
|
+
};
|
|
153
|
+
ctx.footprint.push(entry);
|
|
154
|
+
// Joined / subquery tables: recorded so the extractor knows they
|
|
155
|
+
// were touched, but without PKs (result columns can't be reliably
|
|
156
|
+
// attributed across a join).
|
|
157
|
+
for (const t of meta.tables) {
|
|
158
|
+
if (t === primary)
|
|
159
|
+
continue;
|
|
160
|
+
ctx.footprint.push({ model: t, op: meta.op, pks: [], count: 0, note: 'referenced (join/subquery)' });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Never break the result pipeline over a footprint error.
|
|
167
|
+
}
|
|
168
|
+
return args.result;
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=kysely.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely.js","sourceRoot":"","sources":["../src/kysely.ts"],"names":[],"mappings":"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"}
|
package/dist/nest.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface HttpArgumentsHostLike {
|
|
2
|
+
getResponse(): unknown;
|
|
3
|
+
}
|
|
4
|
+
export interface ArgumentsHostLike {
|
|
5
|
+
switchToHttp(): HttpArgumentsHostLike;
|
|
6
|
+
}
|
|
7
|
+
export interface ReprovaNestFilter {
|
|
8
|
+
catch(exception: unknown, host: ArgumentsHostLike): void;
|
|
9
|
+
}
|
|
10
|
+
export interface NestAppLike {
|
|
11
|
+
useGlobalFilters(...filters: ReprovaNestFilter[]): unknown;
|
|
12
|
+
}
|
|
13
|
+
export interface NestExceptionFilterOptions {
|
|
14
|
+
capture?: (err: Error) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function createNestExceptionFilter(opts?: NestExceptionFilterOptions): ReprovaNestFilter;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=nest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest.d.ts","sourceRoot":"","sources":["../src/nest.ts"],"names":[],"mappings":"AAgCA,UAAU,qBAAqB;IAC7B,WAAW,IAAI,OAAO,CAAC;CACxB;AACD,MAAM,WAAW,iBAAiB;IAChC,YAAY,IAAI,qBAAqB,CAAC;CACvC;AACD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC1D;AAID,MAAM,WAAW,WAAW;IAC1B,gBAAgB,CAAC,GAAG,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;CAC5D;AAED,MAAM,WAAW,0BAA0B;IAIzC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAkCD,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,0BAA+B,GAAG,iBAAiB,CA2DlG"}
|
package/dist/nest.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { parseStack } from './stack.js';
|
|
2
|
+
// Nest's HttpException contract, detected structurally: anything with
|
|
3
|
+
// getStatus() and getResponse() is treated as an intentional HTTP response
|
|
4
|
+
// (a 404, a validation 400, ...) exactly like Nest's own default filter does.
|
|
5
|
+
function isHttpExceptionLike(e) {
|
|
6
|
+
return (typeof e === 'object' &&
|
|
7
|
+
e !== null &&
|
|
8
|
+
typeof e.getStatus === 'function' &&
|
|
9
|
+
typeof e.getResponse === 'function');
|
|
10
|
+
}
|
|
11
|
+
function toError(exception) {
|
|
12
|
+
if (exception instanceof Error)
|
|
13
|
+
return exception;
|
|
14
|
+
return new Error(typeof exception === 'string' ? exception : JSON.stringify(exception));
|
|
15
|
+
}
|
|
16
|
+
// Express: res.status(n).json(body). Fastify: reply.status(n).send(body).
|
|
17
|
+
// Both expose status(); the payload method is feature-detected. Guarded —
|
|
18
|
+
// an exception filter must never itself throw.
|
|
19
|
+
function sendJson(res, status, body) {
|
|
20
|
+
try {
|
|
21
|
+
const r = res;
|
|
22
|
+
if (typeof r.status !== 'function')
|
|
23
|
+
return;
|
|
24
|
+
const chained = r.status(status);
|
|
25
|
+
if (typeof chained.json === 'function')
|
|
26
|
+
chained.json(body);
|
|
27
|
+
else if (typeof chained.send === 'function')
|
|
28
|
+
chained.send(body);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
/* never break the response path from inside the filter */
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function createNestExceptionFilter(opts = {}) {
|
|
35
|
+
// Same activation rule as replayErrorHandler: the CLI sets REPROVA_REPLAY=1
|
|
36
|
+
// when it boots the app for replay; checked once at construction.
|
|
37
|
+
const replay = process.env.REPROVA_REPLAY === '1';
|
|
38
|
+
return {
|
|
39
|
+
catch(exception, host) {
|
|
40
|
+
const httpEx = isHttpExceptionLike(exception);
|
|
41
|
+
let status = 500;
|
|
42
|
+
if (httpEx) {
|
|
43
|
+
try {
|
|
44
|
+
status = exception.getStatus();
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
status = 500;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const res = host.switchToHttp().getResponse();
|
|
51
|
+
const err = toError(exception);
|
|
52
|
+
// Replay contract (only for server-side failures — intentional 4xx
|
|
53
|
+
// responses replay as themselves): emit the structured error the CLI's
|
|
54
|
+
// verdict comparison expects, via the SAME parseStack used at capture.
|
|
55
|
+
if (replay && status >= 500) {
|
|
56
|
+
sendJson(res, 500, {
|
|
57
|
+
error: {
|
|
58
|
+
type: err.constructor?.name ?? err.name ?? 'Error',
|
|
59
|
+
message: err.message,
|
|
60
|
+
stack: parseStack(err),
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Capture server-side failures with the ORIGINAL exception. 4xx
|
|
66
|
+
// HttpExceptions are intentional control flow, exactly as Nest treats
|
|
67
|
+
// them — not captured (a silent 500 from elsewhere still gets the 5xx
|
|
68
|
+
// hook as backstop).
|
|
69
|
+
if (status >= 500 && opts.capture) {
|
|
70
|
+
try {
|
|
71
|
+
opts.capture(err);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* capture must never break the response */
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Respond the way Nest's own BaseExceptionFilter would have.
|
|
78
|
+
if (httpEx) {
|
|
79
|
+
let body;
|
|
80
|
+
try {
|
|
81
|
+
body = exception.getResponse();
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
body = { statusCode: status, message: err.message };
|
|
85
|
+
}
|
|
86
|
+
sendJson(res, status, typeof body === 'string' ? { statusCode: status, message: body } : body);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
sendJson(res, 500, { statusCode: 500, message: 'Internal server error' });
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=nest.js.map
|
package/dist/nest.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest.js","sourceRoot":"","sources":["../src/nest.ts"],"names":[],"mappings":"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"}
|
package/dist/proto.gen.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export interface CapturePayload {
|
|
2
|
-
trigger: 'unhandled_exception' | 'http_5xx' | 'manual_capture' | 'orm_error' | 'job_failure';
|
|
2
|
+
trigger: 'unhandled_exception' | 'http_5xx' | 'manual_capture' | 'orm_error' | 'job_failure' | 'frontend_error';
|
|
3
3
|
trace_id: string;
|
|
4
4
|
timestamp: string;
|
|
5
5
|
release: string;
|
|
@@ -38,6 +38,71 @@ export interface CapturePayload {
|
|
|
38
38
|
status: number;
|
|
39
39
|
response_body?: string;
|
|
40
40
|
recorded_for_replay: boolean;
|
|
41
|
+
duration_ms?: number;
|
|
42
|
+
outcome?: 'success' | 'timeout' | 'network_error';
|
|
43
|
+
}>;
|
|
44
|
+
browser?: {
|
|
45
|
+
page_url: string;
|
|
46
|
+
user_agent: string;
|
|
47
|
+
breadcrumbs?: Array<{
|
|
48
|
+
type: 'click' | 'navigation';
|
|
49
|
+
label: string;
|
|
50
|
+
offset_ms: number;
|
|
51
|
+
}>;
|
|
52
|
+
api_calls?: Array<{
|
|
53
|
+
method: string;
|
|
54
|
+
host: string;
|
|
55
|
+
path: string;
|
|
56
|
+
status: number;
|
|
57
|
+
trace_id: string;
|
|
58
|
+
duration_ms: number;
|
|
59
|
+
offset_ms: number;
|
|
60
|
+
}>;
|
|
61
|
+
replay?: {
|
|
62
|
+
format: 'rrweb';
|
|
63
|
+
encoding: 'gzip+base64' | 'base64';
|
|
64
|
+
data: string;
|
|
65
|
+
duration_ms?: number;
|
|
66
|
+
event_count?: number;
|
|
67
|
+
masked: unknown;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
concurrent_requests?: Array<{
|
|
71
|
+
trace_id: string;
|
|
72
|
+
offset_ms: number;
|
|
73
|
+
state: 'in_flight' | 'completed';
|
|
74
|
+
duration_ms?: number;
|
|
75
|
+
request: {
|
|
76
|
+
method: string;
|
|
77
|
+
path: string;
|
|
78
|
+
headers: Record<string, string>;
|
|
79
|
+
body: string;
|
|
80
|
+
auth_claims?: {};
|
|
81
|
+
};
|
|
82
|
+
data_footprint?: {
|
|
83
|
+
queries: Array<{
|
|
84
|
+
model: string;
|
|
85
|
+
op: string;
|
|
86
|
+
pks: Array<string>;
|
|
87
|
+
where_shape?: string;
|
|
88
|
+
count: number;
|
|
89
|
+
note?: string;
|
|
90
|
+
}>;
|
|
91
|
+
};
|
|
92
|
+
}>;
|
|
93
|
+
}
|
|
94
|
+
export interface DataAudit {
|
|
95
|
+
agent_id?: string;
|
|
96
|
+
ran_at: string;
|
|
97
|
+
duration_ms: number;
|
|
98
|
+
tables_scanned: number;
|
|
99
|
+
checks_run: number;
|
|
100
|
+
findings: Array<{
|
|
101
|
+
type: 'orphaned_fk' | 'not_valid_constraint_violation' | 'check_skipped';
|
|
102
|
+
table: string;
|
|
103
|
+
detail: string;
|
|
104
|
+
count?: number;
|
|
105
|
+
sample_pks?: Array<string>;
|
|
41
106
|
}>;
|
|
42
107
|
}
|
|
43
108
|
export interface Issue {
|
|
@@ -56,6 +121,7 @@ export interface JobPlan {
|
|
|
56
121
|
issue_id: string;
|
|
57
122
|
created_at: string;
|
|
58
123
|
expires_at: string;
|
|
124
|
+
captured_at?: string;
|
|
59
125
|
seed_rows: Record<string, Array<string>>;
|
|
60
126
|
walk_rules: {
|
|
61
127
|
max_rows: number;
|
|
@@ -66,6 +132,11 @@ export interface JobPlan {
|
|
|
66
132
|
anonymization_ruleset_id: string;
|
|
67
133
|
migration_id: string;
|
|
68
134
|
recipient_age_pubkey: string;
|
|
135
|
+
job_type?: 'reproduction' | 'clone';
|
|
136
|
+
clone_rules?: {
|
|
137
|
+
rows_per_table: number;
|
|
138
|
+
include_audit_findings: boolean;
|
|
139
|
+
};
|
|
69
140
|
}
|
|
70
141
|
export interface Manifest {
|
|
71
142
|
package_id: string;
|
|
@@ -74,6 +145,7 @@ export interface Manifest {
|
|
|
74
145
|
migration_id: string;
|
|
75
146
|
created_at: string;
|
|
76
147
|
anonymization_ruleset_id: string;
|
|
148
|
+
dialect?: 'postgres' | 'mysql' | 'mssql';
|
|
77
149
|
table_order: Array<string>;
|
|
78
150
|
row_counts: Record<string, number>;
|
|
79
151
|
row_count: number;
|
|
@@ -108,6 +180,8 @@ export interface ReplayVerdict {
|
|
|
108
180
|
local_release: string;
|
|
109
181
|
ran_by: string;
|
|
110
182
|
ran_at: string;
|
|
183
|
+
iterations?: number;
|
|
184
|
+
reproductions?: number;
|
|
111
185
|
}
|
|
112
186
|
export interface SignedJobPlan {
|
|
113
187
|
plan: string;
|
package/dist/proto.gen.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proto.gen.d.ts","sourceRoot":"","sources":["../src/proto.gen.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,qBAAqB,GAAG,UAAU,GAAG,gBAAgB,GAAG,WAAW,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"proto.gen.d.ts","sourceRoot":"","sources":["../src/proto.gen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ReprovaContext, FootprintQuery } from './context.js';
|
|
2
|
+
export declare function registerContext(ctx: ReprovaContext): void;
|
|
3
|
+
export declare function completeContext(ctx: ReprovaContext): void;
|
|
4
|
+
export interface ConcurrentRequestSnapshot {
|
|
5
|
+
trace_id: string;
|
|
6
|
+
offset_ms: number;
|
|
7
|
+
state: 'in_flight' | 'completed';
|
|
8
|
+
duration_ms?: number;
|
|
9
|
+
request: {
|
|
10
|
+
method: string;
|
|
11
|
+
path: string;
|
|
12
|
+
headers: Record<string, string>;
|
|
13
|
+
body: string;
|
|
14
|
+
auth_claims?: Record<string, unknown>;
|
|
15
|
+
};
|
|
16
|
+
data_footprint?: {
|
|
17
|
+
queries: FootprintQuery[];
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function snapshotCohort(failing: ReprovaContext): ConcurrentRequestSnapshot[];
|
|
21
|
+
export declare function resetRegistryForTests(): void;
|
|
22
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAyBnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAEzD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAQzD;AAID,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,GAAG,WAAW,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,CAAC;IACF,cAAc,CAAC,EAAE;QAAE,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;CAChD;AAOD,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,yBAAyB,EAAE,CAmBnF;AA2BD,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C"}
|