@tstdl/base 0.93.38 → 0.93.40
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/audit/audit.model.d.ts +1 -1
- package/audit/audit.model.js +3 -3
- package/audit/auditor.js +6 -3
- package/audit/drizzle/0001_previous_network.sql +2 -0
- package/audit/drizzle/meta/0001_snapshot.json +195 -0
- package/audit/drizzle/meta/_journal.json +7 -0
- package/orm/server/drizzle/schema-converter.d.ts +1 -0
- package/orm/server/drizzle/schema-converter.js +9 -2
- package/package.json +1 -1
- package/test/drizzle/0001_closed_the_captain.sql +2 -0
- package/test/drizzle/meta/0001_snapshot.json +117 -0
- package/test/drizzle/meta/_journal.json +7 -0
package/audit/audit.model.d.ts
CHANGED
|
@@ -82,7 +82,7 @@ export declare class AuditEvent<Details extends UndefinableJsonObject = Undefina
|
|
|
82
82
|
/**
|
|
83
83
|
* The (if possible unique) identifier of the actor who performed the action.
|
|
84
84
|
*/
|
|
85
|
-
actor: string;
|
|
85
|
+
actor: string | null;
|
|
86
86
|
/**
|
|
87
87
|
* The type of the impersonator, if applicable.
|
|
88
88
|
*/
|
package/audit/audit.model.js
CHANGED
|
@@ -35,7 +35,7 @@ export class RequestDetails {
|
|
|
35
35
|
sessionId;
|
|
36
36
|
}
|
|
37
37
|
__decorate([
|
|
38
|
-
StringProperty(),
|
|
38
|
+
StringProperty({ nullable: true }),
|
|
39
39
|
__metadata("design:type", Object)
|
|
40
40
|
], RequestDetails.prototype, "path", void 0);
|
|
41
41
|
__decorate([
|
|
@@ -179,8 +179,8 @@ __decorate([
|
|
|
179
179
|
__metadata("design:type", String)
|
|
180
180
|
], AuditEvent.prototype, "actorType", void 0);
|
|
181
181
|
__decorate([
|
|
182
|
-
StringProperty(),
|
|
183
|
-
__metadata("design:type",
|
|
182
|
+
StringProperty({ nullable: true }),
|
|
183
|
+
__metadata("design:type", Object)
|
|
184
184
|
], AuditEvent.prototype, "actor", void 0);
|
|
185
185
|
__decorate([
|
|
186
186
|
Enumeration(ActorType, { nullable: true }),
|
package/audit/auditor.js
CHANGED
|
@@ -16,10 +16,10 @@ import { DatabaseConfig, EntityRepositoryConfig, injectRepository, isInTransacti
|
|
|
16
16
|
import { toArray } from '../utils/array/index.js';
|
|
17
17
|
import { Memoize } from '../utils/function/memoize.js';
|
|
18
18
|
import { filterNullishFromRecord, filterUndefinedFromRecord, objectKeys } from '../utils/object/object.js';
|
|
19
|
-
import { assertDefinedPass, isArray, isNotArray, isObject, isString } from '../utils/type-guards.js';
|
|
19
|
+
import { assertDefinedPass, assertNotNullOrUndefined, isArray, isNotArray, isObject, isString } from '../utils/type-guards.js';
|
|
20
20
|
import { AuditEvent } from './audit.model.js';
|
|
21
21
|
import { AuditModuleConfig } from './module.js';
|
|
22
|
-
import { AuditOutcome, AuditSeverity } from './types.js';
|
|
22
|
+
import { ActorType, AuditOutcome, AuditSeverity } from './types.js';
|
|
23
23
|
const { runInAuditorCreationContext, getCurrentAuditorCreationContext, isInAuditorCreationContext } = createContextProvider('AuditorCreation');
|
|
24
24
|
const severityLogLevelMap = {
|
|
25
25
|
[AuditSeverity.Info]: 'info',
|
|
@@ -140,6 +140,9 @@ let Auditor = Auditor_1 = class Auditor {
|
|
|
140
140
|
details,
|
|
141
141
|
});
|
|
142
142
|
this.#logger[severityLogLevelMap[severity]](logMessage, logContext);
|
|
143
|
+
if ((mergedData.actorType != ActorType.Anonymous) && (mergedData.actorType != ActorType.System)) {
|
|
144
|
+
assertNotNullOrUndefined(mergedData.actor, 'Audit actor is required for non-anonymous/system actors.');
|
|
145
|
+
}
|
|
143
146
|
await this.#repository.insert({
|
|
144
147
|
timestamp: TRANSACTION_TIMESTAMP,
|
|
145
148
|
tenantId: mergedData.tenantId ?? null,
|
|
@@ -149,7 +152,7 @@ let Auditor = Auditor_1 = class Auditor {
|
|
|
149
152
|
outcome,
|
|
150
153
|
severity,
|
|
151
154
|
actorType: assertDefinedPass(mergedData.actorType, 'Audit actorType is required'),
|
|
152
|
-
actor:
|
|
155
|
+
actor: mergedData.actor ?? null,
|
|
153
156
|
impersonatorType: mergedData.impersonatorType ?? null,
|
|
154
157
|
impersonator: mergedData.impersonator ?? null,
|
|
155
158
|
targetType: assertDefinedPass(mergedData.targetType, 'Audit targetType is required'),
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "12d8d2c6-0f8e-4958-a036-cd42c36f2b1f",
|
|
3
|
+
"prevId": "8f6c87f8-1692-49bd-9bd4-09dc9d0bdcd4",
|
|
4
|
+
"version": "7",
|
|
5
|
+
"dialect": "postgresql",
|
|
6
|
+
"tables": {
|
|
7
|
+
"audit.event": {
|
|
8
|
+
"name": "event",
|
|
9
|
+
"schema": "audit",
|
|
10
|
+
"columns": {
|
|
11
|
+
"id": {
|
|
12
|
+
"name": "id",
|
|
13
|
+
"type": "uuid",
|
|
14
|
+
"primaryKey": true,
|
|
15
|
+
"notNull": true,
|
|
16
|
+
"default": "gen_random_uuid()"
|
|
17
|
+
},
|
|
18
|
+
"timestamp": {
|
|
19
|
+
"name": "timestamp",
|
|
20
|
+
"type": "timestamp with time zone",
|
|
21
|
+
"primaryKey": false,
|
|
22
|
+
"notNull": true
|
|
23
|
+
},
|
|
24
|
+
"tenant_id": {
|
|
25
|
+
"name": "tenant_id",
|
|
26
|
+
"type": "uuid",
|
|
27
|
+
"primaryKey": false,
|
|
28
|
+
"notNull": false
|
|
29
|
+
},
|
|
30
|
+
"correlation_id": {
|
|
31
|
+
"name": "correlation_id",
|
|
32
|
+
"type": "uuid",
|
|
33
|
+
"primaryKey": false,
|
|
34
|
+
"notNull": false
|
|
35
|
+
},
|
|
36
|
+
"module": {
|
|
37
|
+
"name": "module",
|
|
38
|
+
"type": "text",
|
|
39
|
+
"primaryKey": false,
|
|
40
|
+
"notNull": true
|
|
41
|
+
},
|
|
42
|
+
"action": {
|
|
43
|
+
"name": "action",
|
|
44
|
+
"type": "text",
|
|
45
|
+
"primaryKey": false,
|
|
46
|
+
"notNull": true
|
|
47
|
+
},
|
|
48
|
+
"outcome": {
|
|
49
|
+
"name": "outcome",
|
|
50
|
+
"type": "audit_outcome",
|
|
51
|
+
"typeSchema": "audit",
|
|
52
|
+
"primaryKey": false,
|
|
53
|
+
"notNull": true
|
|
54
|
+
},
|
|
55
|
+
"severity": {
|
|
56
|
+
"name": "severity",
|
|
57
|
+
"type": "audit_severity",
|
|
58
|
+
"typeSchema": "audit",
|
|
59
|
+
"primaryKey": false,
|
|
60
|
+
"notNull": true
|
|
61
|
+
},
|
|
62
|
+
"actor_type": {
|
|
63
|
+
"name": "actor_type",
|
|
64
|
+
"type": "actor_type",
|
|
65
|
+
"typeSchema": "audit",
|
|
66
|
+
"primaryKey": false,
|
|
67
|
+
"notNull": true
|
|
68
|
+
},
|
|
69
|
+
"actor": {
|
|
70
|
+
"name": "actor",
|
|
71
|
+
"type": "text",
|
|
72
|
+
"primaryKey": false,
|
|
73
|
+
"notNull": false
|
|
74
|
+
},
|
|
75
|
+
"impersonator_type": {
|
|
76
|
+
"name": "impersonator_type",
|
|
77
|
+
"type": "actor_type",
|
|
78
|
+
"typeSchema": "audit",
|
|
79
|
+
"primaryKey": false,
|
|
80
|
+
"notNull": false
|
|
81
|
+
},
|
|
82
|
+
"impersonator": {
|
|
83
|
+
"name": "impersonator",
|
|
84
|
+
"type": "text",
|
|
85
|
+
"primaryKey": false,
|
|
86
|
+
"notNull": false
|
|
87
|
+
},
|
|
88
|
+
"target_type": {
|
|
89
|
+
"name": "target_type",
|
|
90
|
+
"type": "text",
|
|
91
|
+
"primaryKey": false,
|
|
92
|
+
"notNull": true
|
|
93
|
+
},
|
|
94
|
+
"target_id": {
|
|
95
|
+
"name": "target_id",
|
|
96
|
+
"type": "uuid",
|
|
97
|
+
"primaryKey": false,
|
|
98
|
+
"notNull": true
|
|
99
|
+
},
|
|
100
|
+
"network_path": {
|
|
101
|
+
"name": "network_path",
|
|
102
|
+
"type": "text",
|
|
103
|
+
"primaryKey": false,
|
|
104
|
+
"notNull": false
|
|
105
|
+
},
|
|
106
|
+
"network_ip_address": {
|
|
107
|
+
"name": "network_ip_address",
|
|
108
|
+
"type": "text",
|
|
109
|
+
"primaryKey": false,
|
|
110
|
+
"notNull": false
|
|
111
|
+
},
|
|
112
|
+
"network_user_agent": {
|
|
113
|
+
"name": "network_user_agent",
|
|
114
|
+
"type": "text",
|
|
115
|
+
"primaryKey": false,
|
|
116
|
+
"notNull": false
|
|
117
|
+
},
|
|
118
|
+
"network_session_id": {
|
|
119
|
+
"name": "network_session_id",
|
|
120
|
+
"type": "uuid",
|
|
121
|
+
"primaryKey": false,
|
|
122
|
+
"notNull": false
|
|
123
|
+
},
|
|
124
|
+
"changes_before": {
|
|
125
|
+
"name": "changes_before",
|
|
126
|
+
"type": "jsonb",
|
|
127
|
+
"primaryKey": false,
|
|
128
|
+
"notNull": false
|
|
129
|
+
},
|
|
130
|
+
"changes_after": {
|
|
131
|
+
"name": "changes_after",
|
|
132
|
+
"type": "jsonb",
|
|
133
|
+
"primaryKey": false,
|
|
134
|
+
"notNull": false
|
|
135
|
+
},
|
|
136
|
+
"details": {
|
|
137
|
+
"name": "details",
|
|
138
|
+
"type": "jsonb",
|
|
139
|
+
"primaryKey": false,
|
|
140
|
+
"notNull": false
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
"indexes": {},
|
|
144
|
+
"foreignKeys": {},
|
|
145
|
+
"compositePrimaryKeys": {},
|
|
146
|
+
"uniqueConstraints": {},
|
|
147
|
+
"policies": {},
|
|
148
|
+
"checkConstraints": {},
|
|
149
|
+
"isRLSEnabled": false
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"enums": {
|
|
153
|
+
"audit.actor_type": {
|
|
154
|
+
"name": "actor_type",
|
|
155
|
+
"schema": "audit",
|
|
156
|
+
"values": [
|
|
157
|
+
"anonymous",
|
|
158
|
+
"system",
|
|
159
|
+
"api-key",
|
|
160
|
+
"user"
|
|
161
|
+
]
|
|
162
|
+
},
|
|
163
|
+
"audit.audit_outcome": {
|
|
164
|
+
"name": "audit_outcome",
|
|
165
|
+
"schema": "audit",
|
|
166
|
+
"values": [
|
|
167
|
+
"pending",
|
|
168
|
+
"success",
|
|
169
|
+
"cancelled",
|
|
170
|
+
"failure",
|
|
171
|
+
"denied"
|
|
172
|
+
]
|
|
173
|
+
},
|
|
174
|
+
"audit.audit_severity": {
|
|
175
|
+
"name": "audit_severity",
|
|
176
|
+
"schema": "audit",
|
|
177
|
+
"values": [
|
|
178
|
+
"info",
|
|
179
|
+
"warn",
|
|
180
|
+
"error",
|
|
181
|
+
"critical"
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"schemas": {},
|
|
186
|
+
"sequences": {},
|
|
187
|
+
"roles": {},
|
|
188
|
+
"policies": {},
|
|
189
|
+
"views": {},
|
|
190
|
+
"_meta": {
|
|
191
|
+
"columns": {},
|
|
192
|
+
"schemas": {},
|
|
193
|
+
"tables": {}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -11,5 +11,6 @@ export declare function getColumnDefinitions(table: PgTableWithColumns<any>): Co
|
|
|
11
11
|
export declare function getColumnDefinitionsMap(table: PgTableWithColumns<any>): ColumnDefinitionsMap;
|
|
12
12
|
export declare function _getDrizzleTableFromType<T extends EntityType, S extends string>(type: T, fallbackSchemaName?: S): PgTableFromType<T, S>;
|
|
13
13
|
export declare function registerEnum(enumeration: Enumeration, name: string): void;
|
|
14
|
+
export declare function getEnumName(enumeration: Enumeration): string | undefined;
|
|
14
15
|
export declare function getPgEnum(schema: string | PgSchema, enumeration: Enumeration, context?: ConverterContext): PgEnum<[string, ...string[]]>;
|
|
15
16
|
export {};
|
|
@@ -328,9 +328,16 @@ const enums = new MultiKeyMap();
|
|
|
328
328
|
export function registerEnum(enumeration, name) {
|
|
329
329
|
enumNames.set(enumeration, toSnakeCase(name));
|
|
330
330
|
}
|
|
331
|
+
export function getEnumName(enumeration) {
|
|
332
|
+
const baseName = enumNames.get(enumeration) ?? tryGetEnumName(enumeration);
|
|
333
|
+
if (isUndefined(baseName)) {
|
|
334
|
+
return undefined;
|
|
335
|
+
}
|
|
336
|
+
return toSnakeCase(baseName);
|
|
337
|
+
}
|
|
331
338
|
export function getPgEnum(schema, enumeration, context) {
|
|
332
339
|
const dbSchema = isString(schema) ? getDbSchema(schema) : schema;
|
|
333
|
-
const enumName =
|
|
340
|
+
const enumName = getEnumName(enumeration);
|
|
334
341
|
if (isUndefined(enumName)) {
|
|
335
342
|
const errorMessage = 'Enum is not registered. Please register it using `databaseSchema.getEnum(MyEnum)` before use.';
|
|
336
343
|
if (isDefined(context)) {
|
|
@@ -340,7 +347,7 @@ export function getPgEnum(schema, enumeration, context) {
|
|
|
340
347
|
}
|
|
341
348
|
const values = (isArray(enumeration) ? enumeration : enumValues(enumeration))
|
|
342
349
|
.map((value) => value.toString());
|
|
343
|
-
const dbEnum = dbSchema.enum(
|
|
350
|
+
const dbEnum = dbSchema.enum(enumName, values);
|
|
344
351
|
if (enums.has([dbSchema.schemaName, enumeration])) {
|
|
345
352
|
enums.set([dbSchema.schemaName, enumeration], dbEnum);
|
|
346
353
|
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
DROP INDEX "test"."test_parade_idx";--> statement-breakpoint
|
|
2
|
+
CREATE INDEX "test_parade_idx" ON "test"."test" USING bm25 ("id","language","title","content","tags",(("title" || ' ' || "content" || ' ' || "tags")::pdb.simple('alias=search_text')),(('foo')::pdb.simple('alias=foo'))) WITH (key_field='id');
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "68a0bdde-47d3-4390-b409-27a74dd269f3",
|
|
3
|
+
"prevId": "bbffc0f2-678b-42e9-8121-1731a04b8987",
|
|
4
|
+
"version": "7",
|
|
5
|
+
"dialect": "postgresql",
|
|
6
|
+
"tables": {
|
|
7
|
+
"test.test": {
|
|
8
|
+
"name": "test",
|
|
9
|
+
"schema": "test",
|
|
10
|
+
"columns": {
|
|
11
|
+
"id": {
|
|
12
|
+
"name": "id",
|
|
13
|
+
"type": "uuid",
|
|
14
|
+
"primaryKey": true,
|
|
15
|
+
"notNull": true,
|
|
16
|
+
"default": "gen_random_uuid()"
|
|
17
|
+
},
|
|
18
|
+
"title": {
|
|
19
|
+
"name": "title",
|
|
20
|
+
"type": "text",
|
|
21
|
+
"primaryKey": false,
|
|
22
|
+
"notNull": true
|
|
23
|
+
},
|
|
24
|
+
"content": {
|
|
25
|
+
"name": "content",
|
|
26
|
+
"type": "text",
|
|
27
|
+
"primaryKey": false,
|
|
28
|
+
"notNull": true
|
|
29
|
+
},
|
|
30
|
+
"tags": {
|
|
31
|
+
"name": "tags",
|
|
32
|
+
"type": "text",
|
|
33
|
+
"primaryKey": false,
|
|
34
|
+
"notNull": true
|
|
35
|
+
},
|
|
36
|
+
"language": {
|
|
37
|
+
"name": "language",
|
|
38
|
+
"type": "text",
|
|
39
|
+
"primaryKey": false,
|
|
40
|
+
"notNull": true
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"indexes": {
|
|
44
|
+
"test_parade_idx": {
|
|
45
|
+
"name": "test_parade_idx",
|
|
46
|
+
"columns": [
|
|
47
|
+
{
|
|
48
|
+
"expression": "id",
|
|
49
|
+
"isExpression": false,
|
|
50
|
+
"asc": true,
|
|
51
|
+
"nulls": "last"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"expression": "\"language\"",
|
|
55
|
+
"asc": true,
|
|
56
|
+
"isExpression": true,
|
|
57
|
+
"nulls": "last"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"expression": "\"title\"",
|
|
61
|
+
"asc": true,
|
|
62
|
+
"isExpression": true,
|
|
63
|
+
"nulls": "last"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"expression": "\"content\"",
|
|
67
|
+
"asc": true,
|
|
68
|
+
"isExpression": true,
|
|
69
|
+
"nulls": "last"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"expression": "\"tags\"",
|
|
73
|
+
"asc": true,
|
|
74
|
+
"isExpression": true,
|
|
75
|
+
"nulls": "last"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"expression": "((\"title\" || ' ' || \"content\" || ' ' || \"tags\")::pdb.simple('alias=search_text'))",
|
|
79
|
+
"asc": true,
|
|
80
|
+
"isExpression": true,
|
|
81
|
+
"nulls": "last"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"expression": "(('foo')::pdb.simple('alias=foo'))",
|
|
85
|
+
"asc": true,
|
|
86
|
+
"isExpression": true,
|
|
87
|
+
"nulls": "last"
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"isUnique": false,
|
|
91
|
+
"concurrently": false,
|
|
92
|
+
"method": "bm25",
|
|
93
|
+
"with": {
|
|
94
|
+
"key_field": "'id'"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"foreignKeys": {},
|
|
99
|
+
"compositePrimaryKeys": {},
|
|
100
|
+
"uniqueConstraints": {},
|
|
101
|
+
"policies": {},
|
|
102
|
+
"checkConstraints": {},
|
|
103
|
+
"isRLSEnabled": false
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"enums": {},
|
|
107
|
+
"schemas": {},
|
|
108
|
+
"sequences": {},
|
|
109
|
+
"roles": {},
|
|
110
|
+
"policies": {},
|
|
111
|
+
"views": {},
|
|
112
|
+
"_meta": {
|
|
113
|
+
"columns": {},
|
|
114
|
+
"schemas": {},
|
|
115
|
+
"tables": {}
|
|
116
|
+
}
|
|
117
|
+
}
|