prostgles-server 4.2.611 → 4.2.612
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/Audit/AuditTable.d.ts +12 -1
- package/dist/Audit/AuditTable.d.ts.map +1 -1
- package/dist/Audit/AuditTable.js +12 -1
- package/dist/Audit/AuditTable.js.map +1 -1
- package/dist/Audit/AuditTypes.d.ts +1 -2
- package/dist/Audit/AuditTypes.d.ts.map +1 -1
- package/dist/Audit/getAuditTriggerConfig.d.ts.map +1 -1
- package/dist/Audit/getAuditTriggerConfig.js +12 -4
- package/dist/Audit/getAuditTriggerConfig.js.map +1 -1
- package/dist/Audit/parseAuditConfig.d.ts.map +1 -1
- package/dist/Audit/parseAuditConfig.js +0 -4
- package/dist/Audit/parseAuditConfig.js.map +1 -1
- package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts +8 -0
- package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts.map +1 -1
- package/lib/Audit/AuditTable.ts +12 -1
- package/lib/Audit/AuditTypes.ts +1 -2
- package/lib/Audit/getAuditTriggerConfig.ts +12 -4
- package/lib/Audit/parseAuditConfig.ts +0 -4
- package/lib/TableConfig/TableRowFromColumnDefinitions.ts +18 -12
- package/package.json +1 -1
|
@@ -4,7 +4,6 @@ export declare const AUDIT_TABLE_COLUMN_DEFINITIONS: {
|
|
|
4
4
|
readonly created_at: "TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()";
|
|
5
5
|
readonly schema_name: "TEXT NOT NULL";
|
|
6
6
|
readonly table_name: "TEXT NOT NULL";
|
|
7
|
-
readonly entity_type: "TEXT NOT NULL";
|
|
8
7
|
readonly operation: {
|
|
9
8
|
readonly enum: readonly ["INSERT", "UPDATE", "DELETE"];
|
|
10
9
|
};
|
|
@@ -13,6 +12,18 @@ export declare const AUDIT_TABLE_COLUMN_DEFINITIONS: {
|
|
|
13
12
|
readonly old_row: "JSONB";
|
|
14
13
|
readonly new_row: "JSONB";
|
|
15
14
|
readonly actor: "JSONB";
|
|
15
|
+
readonly db_context: {
|
|
16
|
+
readonly jsonbSchema: {
|
|
17
|
+
readonly type: {
|
|
18
|
+
readonly transaction_id: "string";
|
|
19
|
+
readonly transaction_started_at: "string";
|
|
20
|
+
readonly statement_started_at: "string";
|
|
21
|
+
readonly current_role: "string";
|
|
22
|
+
readonly session_user: "string";
|
|
23
|
+
readonly application_name: "string";
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
};
|
|
16
27
|
};
|
|
17
28
|
export type AuditTableRow = TableRowFromColumnDefinitions<typeof AUDIT_TABLE_COLUMN_DEFINITIONS>;
|
|
18
29
|
export declare const AUDIT_TABLE_COLUMNS: (keyof AuditTableRow)[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuditTable.d.ts","sourceRoot":"","sources":["../../lib/Audit/AuditTable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAElG,eAAO,MAAM,8BAA8B
|
|
1
|
+
{"version":3,"file":"AuditTable.d.ts","sourceRoot":"","sources":["../../lib/Audit/AuditTable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAElG,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;CAuBjC,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,6BAA6B,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACjG,eAAO,MAAM,mBAAmB,EAE3B,CAAC,MAAM,aAAa,CAAC,EAAE,CAAC"}
|
package/dist/Audit/AuditTable.js
CHANGED
|
@@ -6,13 +6,24 @@ exports.AUDIT_TABLE_COLUMN_DEFINITIONS = {
|
|
|
6
6
|
created_at: "TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()",
|
|
7
7
|
schema_name: "TEXT NOT NULL",
|
|
8
8
|
table_name: "TEXT NOT NULL",
|
|
9
|
-
entity_type: "TEXT NOT NULL",
|
|
10
9
|
operation: { enum: ["INSERT", "UPDATE", "DELETE"] },
|
|
11
10
|
old_id: "JSONB",
|
|
12
11
|
new_id: "JSONB",
|
|
13
12
|
old_row: "JSONB",
|
|
14
13
|
new_row: "JSONB",
|
|
15
14
|
actor: "JSONB",
|
|
15
|
+
db_context: {
|
|
16
|
+
jsonbSchema: {
|
|
17
|
+
type: {
|
|
18
|
+
transaction_id: "string",
|
|
19
|
+
transaction_started_at: "string",
|
|
20
|
+
statement_started_at: "string",
|
|
21
|
+
current_role: "string",
|
|
22
|
+
session_user: "string",
|
|
23
|
+
application_name: "string",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
16
27
|
};
|
|
17
28
|
exports.AUDIT_TABLE_COLUMNS = Object.keys(exports.AUDIT_TABLE_COLUMN_DEFINITIONS);
|
|
18
29
|
//# sourceMappingURL=AuditTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuditTable.js","sourceRoot":"","sources":["../../lib/Audit/AuditTable.ts"],"names":[],"mappings":";;;AAEa,QAAA,8BAA8B,GAAG;IAC5C,EAAE,EAAE,uBAAuB;IAC3B,UAAU,EAAE,gDAAgD;IAC5D,WAAW,EAAE,eAAe;IAC5B,UAAU,EAAE,eAAe;IAC3B,
|
|
1
|
+
{"version":3,"file":"AuditTable.js","sourceRoot":"","sources":["../../lib/Audit/AuditTable.ts"],"names":[],"mappings":";;;AAEa,QAAA,8BAA8B,GAAG;IAC5C,EAAE,EAAE,uBAAuB;IAC3B,UAAU,EAAE,gDAAgD;IAC5D,WAAW,EAAE,eAAe;IAC5B,UAAU,EAAE,eAAe;IAC3B,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;IACnD,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,OAAO;IACd,UAAU,EAAE;QACV,WAAW,EAAE;YACX,IAAI,EAAE;gBACJ,cAAc,EAAE,QAAQ;gBACxB,sBAAsB,EAAE,QAAQ;gBAChC,oBAAoB,EAAE,QAAQ;gBAC9B,YAAY,EAAE,QAAQ;gBACtB,YAAY,EAAE,QAAQ;gBACtB,gBAAgB,EAAE,QAAQ;aAC3B;SACF;KACF;CACO,CAAC;AAGE,QAAA,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAC5C,sCAA8B,CACJ,CAAC"}
|
|
@@ -5,7 +5,6 @@ export type SchemaConfigColumnName<S, T extends SchemaConfigTableName<S>> = [
|
|
|
5
5
|
columns: infer C;
|
|
6
6
|
} ? Extract<keyof C, string> : never : never;
|
|
7
7
|
export type SchemaConfigAuditTableOptions<S, T extends SchemaConfigTableName<S>> = {
|
|
8
|
-
entityType?: string;
|
|
9
8
|
/** Defaults to all primary-key columns. Required for tables without a primary key. */
|
|
10
9
|
idColumns?: readonly SchemaConfigColumnName<S, T>[];
|
|
11
10
|
excludeColumns?: readonly SchemaConfigColumnName<S, T>[];
|
|
@@ -22,7 +21,7 @@ export type SchemaConfigAudit<S = void> = {
|
|
|
22
21
|
/** Omitted/empty means all eligible tables in schemaFilter. Cannot mix enabled and disabled entries. */
|
|
23
22
|
tables?: SchemaConfigAuditIncludedTables<S> | SchemaConfigAuditExcludedTables<S>;
|
|
24
23
|
};
|
|
25
|
-
/** Validated audit targets with all column
|
|
24
|
+
/** Validated audit targets with all column defaults resolved. */
|
|
26
25
|
export type ResolvedAuditConfig = {
|
|
27
26
|
tableName: string;
|
|
28
27
|
tables: Record<string, Required<SchemaConfigAuditTableOptions<void, string>>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuditTypes.d.ts","sourceRoot":"","sources":["../../lib/Audit/AuditTypes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GACrD,MAAM,GACN,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7B,MAAM,MAAM,sBAAsB,CAAC,CAAC,EAAE,CAAC,SAAS,qBAAqB,CAAC,CAAC,CAAC,IAAI;IAC1E,CAAC;CACF,SAAS,CAAC,IAAI,CAAC,GACZ,MAAM,GACN,CAAC,SAAS,MAAM,CAAC,GACf,CAAC,CAAC,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,MAAM,CAAC,CAAA;CAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GACxB,KAAK,GACP,KAAK,CAAC;AAEZ,MAAM,MAAM,6BAA6B,CACvC,CAAC,EACD,CAAC,SAAS,qBAAqB,CAAC,CAAC,CAAC,IAChC;IACF,
|
|
1
|
+
{"version":3,"file":"AuditTypes.d.ts","sourceRoot":"","sources":["../../lib/Audit/AuditTypes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GACrD,MAAM,GACN,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7B,MAAM,MAAM,sBAAsB,CAAC,CAAC,EAAE,CAAC,SAAS,qBAAqB,CAAC,CAAC,CAAC,IAAI;IAC1E,CAAC;CACF,SAAS,CAAC,IAAI,CAAC,GACZ,MAAM,GACN,CAAC,SAAS,MAAM,CAAC,GACf,CAAC,CAAC,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,MAAM,CAAC,CAAA;CAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GACxB,KAAK,GACP,KAAK,CAAC;AAEZ,MAAM,MAAM,6BAA6B,CACvC,CAAC,EACD,CAAC,SAAS,qBAAqB,CAAC,CAAC,CAAC,IAChC;IACF,sFAAsF;IACtF,SAAS,CAAC,EAAE,SAAS,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACpD,cAAc,CAAC,EAAE,SAAS,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;CAC1D,CAAC;AACF,MAAM,MAAM,+BAA+B,CAAC,CAAC,IAAI;KAC9C,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,6BAA6B,CAAC,CAAC,EAAE,CAAC,CAAC;CAC1E,CAAC;AACF,MAAM,MAAM,+BAA+B,CAAC,CAAC,IAAI;KAC9C,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;CACpC,CAAC;AACF,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,IAAI,IAAI;IACxC,mFAAmF;IACnF,SAAS,EAAE,MAAM,CAAC;IAClB,wGAAwG;IACxG,MAAM,CAAC,EACL,+BAA+B,CAAC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC,CAAC,CAAC;CAC3E,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,6BAA6B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CAC/E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAuditTriggerConfig.d.ts","sourceRoot":"","sources":["../../lib/Audit/getAuditTriggerConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,eAAO,MAAM,qBAAqB,GAAI,OAAO,mBAAmB,KAAG,
|
|
1
|
+
{"version":3,"file":"getAuditTriggerConfig.d.ts","sourceRoot":"","sources":["../../lib/Audit/getAuditTriggerConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,eAAO,MAAM,qBAAqB,GAAI,OAAO,mBAAmB,KAAG,WA8ClE,CAAC"}
|
|
@@ -7,7 +7,7 @@ const getAuditTableConfig_1 = require("./getAuditTableConfig");
|
|
|
7
7
|
const getAuditTriggerConfig = (audit) => {
|
|
8
8
|
const result = {};
|
|
9
9
|
for (const [name, options] of Object.entries(audit.tables)) {
|
|
10
|
-
const {
|
|
10
|
+
const { idColumns: ids, excludeColumns: excluded } = options;
|
|
11
11
|
const functionName = (0, getAuditTableConfig_1.getAuditWriterName)(audit.tableName, name);
|
|
12
12
|
result[name] = {
|
|
13
13
|
triggers: {
|
|
@@ -32,9 +32,17 @@ const getAuditTriggerConfig = (audit) => {
|
|
|
32
32
|
after_row := after_row - excluded;
|
|
33
33
|
END IF;
|
|
34
34
|
IF TG_OP = 'UPDATE' AND before_row IS NOT DISTINCT FROM after_row THEN RETURN NULL; END IF;
|
|
35
|
-
INSERT INTO ${(0, prostgles_types_1.asName)(audit.tableName)} (schema_name, table_name,
|
|
36
|
-
VALUES (TG_TABLE_SCHEMA, TG_TABLE_NAME,
|
|
37
|
-
nullif(current_setting('prostgles.user', true), '')::jsonb
|
|
35
|
+
INSERT INTO ${(0, prostgles_types_1.asName)(audit.tableName)} (schema_name, table_name, operation, old_id, new_id, old_row, new_row, actor, db_context)
|
|
36
|
+
VALUES (TG_TABLE_SCHEMA, TG_TABLE_NAME, TG_OP, before_id, after_id, before_row, after_row,
|
|
37
|
+
nullif(current_setting('prostgles.user', true), '')::jsonb,
|
|
38
|
+
jsonb_build_object(
|
|
39
|
+
'transaction_id', pg_current_xact_id()::text,
|
|
40
|
+
'transaction_started_at', transaction_timestamp(),
|
|
41
|
+
'statement_started_at', statement_timestamp(),
|
|
42
|
+
'current_role', current_role,
|
|
43
|
+
'session_user', session_user,
|
|
44
|
+
'application_name', current_setting('application_name')
|
|
45
|
+
));
|
|
38
46
|
RETURN NULL;
|
|
39
47
|
END;`,
|
|
40
48
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAuditTriggerConfig.js","sourceRoot":"","sources":["../../lib/Audit/getAuditTriggerConfig.ts"],"names":[],"mappings":";;;AAAA,2CAAgC;AAChC,qDAAyC;AAGzC,+DAA+E;AAExE,MAAM,qBAAqB,GAAG,CAAC,KAA0B,EAAe,EAAE;IAC/E,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"getAuditTriggerConfig.js","sourceRoot":"","sources":["../../lib/Audit/getAuditTriggerConfig.ts"],"names":[],"mappings":";;;AAAA,2CAAgC;AAChC,qDAAyC;AAGzC,+DAA+E;AAExE,MAAM,qBAAqB,GAAG,CAAC,KAA0B,EAAe,EAAE;IAC/E,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAC7D,MAAM,YAAY,GAAG,IAAA,wCAAkB,EAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE;gBACR,GAAG,IAAA,wCAAkB,EAAC,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,CAAC;gBACpD,CAAC,YAAY,CAAC,EAAE;oBACd,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;oBACvC,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;;kCAEiB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;uCAChC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;0BAavD,IAAA,wBAAM,EAAC,KAAK,CAAC,SAAS,CAAC;;;;;;;;;;;;eAYlC;iBACN;aACF;SACF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AA9CW,QAAA,qBAAqB,yBA8ChC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseAuditConfig.d.ts","sourceRoot":"","sources":["../../lib/Audit/parseAuditConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,GAAI,MAAM,SAAS,KAAG,mBAAmB,GAAG,
|
|
1
|
+
{"version":3,"file":"parseAuditConfig.d.ts","sourceRoot":"","sources":["../../lib/Audit/parseAuditConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,GAAI,MAAM,SAAS,KAAG,mBAAmB,GAAG,SA4DxE,CAAC"}
|
|
@@ -53,11 +53,7 @@ const parseAuditConfig = (prgl) => {
|
|
|
53
53
|
if (ids.some((c) => excluded.includes(c))) {
|
|
54
54
|
throw new Error(`Audit identity columns cannot be excluded: ${table.name}`);
|
|
55
55
|
}
|
|
56
|
-
if (options.entityType !== undefined && !options.entityType) {
|
|
57
|
-
throw new Error(`Invalid audit entityType for ${table.name}`);
|
|
58
|
-
}
|
|
59
56
|
result[table.name] = {
|
|
60
|
-
entityType: options.entityType ?? table.name,
|
|
61
57
|
idColumns: [...ids],
|
|
62
58
|
excludeColumns: [...excluded],
|
|
63
59
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseAuditConfig.js","sourceRoot":"","sources":["../../lib/Audit/parseAuditConfig.ts"],"names":[],"mappings":";;;AAAA,qDAAuD;AAGvD,0CAAyC;AAEzC,8EAA8E;AACvE,MAAM,gBAAgB,GAAG,CAAC,IAAe,EAAmC,EAAE;IACnF,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IAC5B,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,4DAA4D,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,MAAM,GAAkC,EAAE,CAAC;IAEjD,MAAM,OAAO,GAAG,IAAA,4BAAU,EAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAC3D,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAA,0BAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,SAAS;QAExE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;QACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3F,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAA,eAAO,EAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,IAAI,wBAAwB,CAAC,CAAC;QACzF,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;YACnC,IACE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM;gBAClC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAC9D,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,8CAA8C,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,
|
|
1
|
+
{"version":3,"file":"parseAuditConfig.js","sourceRoot":"","sources":["../../lib/Audit/parseAuditConfig.ts"],"names":[],"mappings":";;;AAAA,qDAAuD;AAGvD,0CAAyC;AAEzC,8EAA8E;AACvE,MAAM,gBAAgB,GAAG,CAAC,IAAe,EAAmC,EAAE;IACnF,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IAC5B,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,4DAA4D,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,MAAM,GAAkC,EAAE,CAAC;IAEjD,MAAM,OAAO,GAAG,IAAA,4BAAU,EAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAC3D,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAA,0BAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,SAAS;QAExE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;QACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3F,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAA,eAAO,EAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,IAAI,wBAAwB,CAAC,CAAC;QACzF,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;YACnC,IACE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM;gBAClC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAC9D,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,8CAA8C,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;YACnB,SAAS,EAAE,CAAC,GAAG,GAAG,CAAC;YACnB,cAAc,EAAE,CAAC,GAAG,QAAQ,CAAC;SAC9B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACxD,CAAC,CAAC;AA5DW,QAAA,gBAAgB,oBA4D3B"}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
+
import type { JSONB } from "prostgles-types";
|
|
1
2
|
/** Row types for the column definitions used by managed tables. */
|
|
2
3
|
export type TableRowFromColumnDefinitions<T extends Record<string, string | {
|
|
3
4
|
enum: readonly (string | number)[];
|
|
4
5
|
nullable?: boolean;
|
|
6
|
+
} | {
|
|
7
|
+
jsonbSchema: JSONB.JSONBSchema;
|
|
8
|
+
nullable?: boolean;
|
|
5
9
|
}>> = {
|
|
6
10
|
[K in keyof T]: T[K] extends {
|
|
11
|
+
jsonbSchema: infer S extends JSONB.JSONBSchema;
|
|
12
|
+
} ? JSONB.GetType<S> | (T[K] extends {
|
|
13
|
+
nullable: true;
|
|
14
|
+
} ? null : never) : T[K] extends {
|
|
7
15
|
enum: readonly (infer V)[];
|
|
8
16
|
} ? V | (T[K] extends {
|
|
9
17
|
nullable: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableRowFromColumnDefinitions.d.ts","sourceRoot":"","sources":["../../lib/TableConfig/TableRowFromColumnDefinitions.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,MAAM,6BAA6B,CACvC,CAAC,SAAS,MAAM,CACd,MAAM,
|
|
1
|
+
{"version":3,"file":"TableRowFromColumnDefinitions.d.ts","sourceRoot":"","sources":["../../lib/TableConfig/TableRowFromColumnDefinitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,mEAAmE;AACnE,MAAM,MAAM,6BAA6B,CACvC,CAAC,SAAS,MAAM,CACd,MAAM,EACJ,MAAM,GACN;IAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1D;IAAE,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CACzD,IACC;KACD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,WAAW,EAAE,MAAM,CAAC,SAAS,KAAK,CAAC,WAAW,CAAA;KAAE,GAC3E,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,GAAG,IAAI,GAAG,KAAK,CAAC,GACnE,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;KAAE,GACzC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,GAAG,IAAI,GAAG,KAAK,CAAC,GAClD,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,MAAM,EAAE,GAC1B,MAAM,GACN,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,MAAM,EAAE,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,MAAM,CAAC,GACb,CAAC,CAAC,CAAC,CAAC,CAAC,SACH,GAAG,MAAM,YAAY,MAAM,EAAE,GAAG,GAAG,MAAM,cAAc,MAAM,EAAE,GAC7D,KAAK,GACL,IAAI,CAAC;CAClB,CAAC"}
|
package/lib/Audit/AuditTable.ts
CHANGED
|
@@ -5,13 +5,24 @@ export const AUDIT_TABLE_COLUMN_DEFINITIONS = {
|
|
|
5
5
|
created_at: "TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()",
|
|
6
6
|
schema_name: "TEXT NOT NULL",
|
|
7
7
|
table_name: "TEXT NOT NULL",
|
|
8
|
-
entity_type: "TEXT NOT NULL",
|
|
9
8
|
operation: { enum: ["INSERT", "UPDATE", "DELETE"] },
|
|
10
9
|
old_id: "JSONB",
|
|
11
10
|
new_id: "JSONB",
|
|
12
11
|
old_row: "JSONB",
|
|
13
12
|
new_row: "JSONB",
|
|
14
13
|
actor: "JSONB",
|
|
14
|
+
db_context: {
|
|
15
|
+
jsonbSchema: {
|
|
16
|
+
type: {
|
|
17
|
+
transaction_id: "string",
|
|
18
|
+
transaction_started_at: "string",
|
|
19
|
+
statement_started_at: "string",
|
|
20
|
+
current_role: "string",
|
|
21
|
+
session_user: "string",
|
|
22
|
+
application_name: "string",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
15
26
|
} as const;
|
|
16
27
|
|
|
17
28
|
export type AuditTableRow = TableRowFromColumnDefinitions<typeof AUDIT_TABLE_COLUMN_DEFINITIONS>;
|
package/lib/Audit/AuditTypes.ts
CHANGED
|
@@ -15,7 +15,6 @@ export type SchemaConfigAuditTableOptions<
|
|
|
15
15
|
S,
|
|
16
16
|
T extends SchemaConfigTableName<S>,
|
|
17
17
|
> = {
|
|
18
|
-
entityType?: string;
|
|
19
18
|
/** Defaults to all primary-key columns. Required for tables without a primary key. */
|
|
20
19
|
idColumns?: readonly SchemaConfigColumnName<S, T>[];
|
|
21
20
|
excludeColumns?: readonly SchemaConfigColumnName<S, T>[];
|
|
@@ -34,7 +33,7 @@ export type SchemaConfigAudit<S = void> = {
|
|
|
34
33
|
SchemaConfigAuditIncludedTables<S> | SchemaConfigAuditExcludedTables<S>;
|
|
35
34
|
};
|
|
36
35
|
|
|
37
|
-
/** Validated audit targets with all column
|
|
36
|
+
/** Validated audit targets with all column defaults resolved. */
|
|
38
37
|
export type ResolvedAuditConfig = {
|
|
39
38
|
tableName: string;
|
|
40
39
|
tables: Record<string, Required<SchemaConfigAuditTableOptions<void, string>>>;
|
|
@@ -7,7 +7,7 @@ import { getAuditProtection, getAuditWriterName } from "./getAuditTableConfig";
|
|
|
7
7
|
export const getAuditTriggerConfig = (audit: ResolvedAuditConfig): TableConfig => {
|
|
8
8
|
const result: TableConfig = {};
|
|
9
9
|
for (const [name, options] of Object.entries(audit.tables)) {
|
|
10
|
-
const {
|
|
10
|
+
const { idColumns: ids, excludeColumns: excluded } = options;
|
|
11
11
|
const functionName = getAuditWriterName(audit.tableName, name);
|
|
12
12
|
result[name] = {
|
|
13
13
|
triggers: {
|
|
@@ -32,9 +32,17 @@ export const getAuditTriggerConfig = (audit: ResolvedAuditConfig): TableConfig =
|
|
|
32
32
|
after_row := after_row - excluded;
|
|
33
33
|
END IF;
|
|
34
34
|
IF TG_OP = 'UPDATE' AND before_row IS NOT DISTINCT FROM after_row THEN RETURN NULL; END IF;
|
|
35
|
-
INSERT INTO ${asName(audit.tableName)} (schema_name, table_name,
|
|
36
|
-
VALUES (TG_TABLE_SCHEMA, TG_TABLE_NAME,
|
|
37
|
-
nullif(current_setting('prostgles.user', true), '')::jsonb
|
|
35
|
+
INSERT INTO ${asName(audit.tableName)} (schema_name, table_name, operation, old_id, new_id, old_row, new_row, actor, db_context)
|
|
36
|
+
VALUES (TG_TABLE_SCHEMA, TG_TABLE_NAME, TG_OP, before_id, after_id, before_row, after_row,
|
|
37
|
+
nullif(current_setting('prostgles.user', true), '')::jsonb,
|
|
38
|
+
jsonb_build_object(
|
|
39
|
+
'transaction_id', pg_current_xact_id()::text,
|
|
40
|
+
'transaction_started_at', transaction_timestamp(),
|
|
41
|
+
'statement_started_at', statement_timestamp(),
|
|
42
|
+
'current_role', current_role,
|
|
43
|
+
'session_user', session_user,
|
|
44
|
+
'application_name', current_setting('application_name')
|
|
45
|
+
));
|
|
38
46
|
RETURN NULL;
|
|
39
47
|
END;`,
|
|
40
48
|
},
|
|
@@ -58,11 +58,7 @@ export const parseAuditConfig = (prgl: Prostgles): ResolvedAuditConfig | undefin
|
|
|
58
58
|
if (ids.some((c) => excluded.includes(c))) {
|
|
59
59
|
throw new Error(`Audit identity columns cannot be excluded: ${table.name}`);
|
|
60
60
|
}
|
|
61
|
-
if (options.entityType !== undefined && !options.entityType) {
|
|
62
|
-
throw new Error(`Invalid audit entityType for ${table.name}`);
|
|
63
|
-
}
|
|
64
61
|
result[table.name] = {
|
|
65
|
-
entityType: options.entityType ?? table.name,
|
|
66
62
|
idColumns: [...ids],
|
|
67
63
|
excludeColumns: [...excluded],
|
|
68
64
|
};
|
|
@@ -1,19 +1,25 @@
|
|
|
1
|
+
import type { JSONB } from "prostgles-types";
|
|
2
|
+
|
|
1
3
|
/** Row types for the column definitions used by managed tables. */
|
|
2
4
|
export type TableRowFromColumnDefinitions<
|
|
3
5
|
T extends Record<
|
|
4
6
|
string,
|
|
5
|
-
|
|
7
|
+
| string
|
|
8
|
+
| { enum: readonly (string | number)[]; nullable?: boolean }
|
|
9
|
+
| { jsonbSchema: JSONB.JSONBSchema; nullable?: boolean }
|
|
6
10
|
>,
|
|
7
11
|
> = {
|
|
8
|
-
[K in keyof T]: T[K] extends {
|
|
9
|
-
?
|
|
10
|
-
:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
?
|
|
14
|
-
: string
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
[K in keyof T]: T[K] extends { jsonbSchema: infer S extends JSONB.JSONBSchema }
|
|
13
|
+
? JSONB.GetType<S> | (T[K] extends { nullable: true } ? null : never)
|
|
14
|
+
: T[K] extends { enum: readonly (infer V)[] }
|
|
15
|
+
? V | (T[K] extends { nullable: true } ? null : never)
|
|
16
|
+
: | (T[K] extends `BYTEA${string}`
|
|
17
|
+
? Buffer
|
|
18
|
+
: T[K] extends `JSONB${string}`
|
|
19
|
+
? Record<string, unknown>
|
|
20
|
+
: string)
|
|
21
|
+
| (T[K] extends
|
|
22
|
+
`${string} NOT NULL${string}` | `${string}PRIMARY KEY${string}`
|
|
23
|
+
? never
|
|
24
|
+
: null);
|
|
19
25
|
};
|