@event-nest/postgresql 4.0.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -3
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/lib/module-providers.js +63 -13
- package/src/lib/module-providers.js.map +1 -1
- package/src/lib/postgresql-module-options.d.ts +20 -3
- package/src/lib/schema-configuration.d.ts +7 -1
- package/src/lib/schema-configuration.js +13 -1
- package/src/lib/schema-configuration.js.map +1 -1
- package/src/lib/storage/postgresql-event-store.d.ts +8 -14
- package/src/lib/storage/postgresql-event-store.js +47 -37
- package/src/lib/storage/postgresql-event-store.js.map +1 -1
- package/src/lib/storage/postgresql-snapshot-store.d.ts +11 -0
- package/src/lib/storage/postgresql-snapshot-store.js +52 -0
- package/src/lib/storage/postgresql-snapshot-store.js.map +1 -0
- package/src/lib/storage/snapshot-row.d.ts +7 -0
- package/src/lib/storage/snapshot-row.js +3 -0
- package/src/lib/storage/snapshot-row.js.map +1 -0
- package/src/lib/table-initializer.js +28 -2
- package/src/lib/table-initializer.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@event-nest/postgresql",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Event sourcing module for NestJS using PostgreSQL. It uses SQL tables and transactions to store events",
|
|
6
6
|
"author": "Nick Tsitlakidis",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"postgresql"
|
|
23
23
|
],
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@nestjs/common": "
|
|
25
|
+
"@nestjs/common": "^10.0.0 || ^11.0.0",
|
|
26
26
|
"@nestjs/core": "^10.0.0 || ^11.0.0",
|
|
27
27
|
"pg": "^8.14.1",
|
|
28
28
|
"reflect-metadata": "^0.1.12 || ^0.2.0",
|
|
@@ -35,7 +35,8 @@
|
|
|
35
35
|
"es-toolkit": "^1.32.0",
|
|
36
36
|
"knex": "^3.1.0",
|
|
37
37
|
"tslib": "^2.3.0",
|
|
38
|
-
"@event-nest/core": "
|
|
38
|
+
"@event-nest/core": "5.0.0"
|
|
39
39
|
},
|
|
40
|
+
"packageManager": "pnpm@10.29.2",
|
|
40
41
|
"types": "./src/index.d.ts"
|
|
41
42
|
}
|
package/src/index.d.ts
CHANGED
package/src/index.js
CHANGED
|
@@ -3,5 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./lib/event-nest-postgresql.module"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./lib/postgresql-module-options"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./lib/schema-configuration"), exports);
|
|
6
7
|
tslib_1.__exportStar(require("./lib/storage/postgresql-event-store"), exports);
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/postgresql/src/index.ts"],"names":[],"mappings":";;;AAAA,6EAAmD;AACnD,0EAAgD;AAChD,+EAAqD"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/postgresql/src/index.ts"],"names":[],"mappings":";;;AAAA,6EAAmD;AACnD,0EAAgD;AAChD,qEAA2C;AAC3C,+EAAqD"}
|
|
@@ -6,11 +6,18 @@ const es_toolkit_1 = require("es-toolkit");
|
|
|
6
6
|
const knex_1 = require("knex");
|
|
7
7
|
const schema_configuration_1 = require("./schema-configuration");
|
|
8
8
|
const postgresql_event_store_1 = require("./storage/postgresql-event-store");
|
|
9
|
+
const postgresql_snapshot_store_1 = require("./storage/postgresql-snapshot-store");
|
|
9
10
|
const table_initializer_1 = require("./table-initializer");
|
|
10
11
|
const KNEX_CONNECTION = Symbol("EVENT_NEST_KNEX_CONNECTION");
|
|
11
12
|
class ModuleProviders {
|
|
12
13
|
static create(options) {
|
|
13
14
|
return [
|
|
15
|
+
{
|
|
16
|
+
provide: schema_configuration_1.SchemaConfiguration,
|
|
17
|
+
useFactory: () => {
|
|
18
|
+
return new schema_configuration_1.SchemaConfiguration(options.schemaName, options.aggregatesTableName, options.eventsTableName, options.snapshotTableName);
|
|
19
|
+
}
|
|
20
|
+
},
|
|
14
21
|
{
|
|
15
22
|
provide: core_1.DomainEventEmitter,
|
|
16
23
|
useFactory: () => {
|
|
@@ -22,17 +29,31 @@ class ModuleProviders {
|
|
|
22
29
|
useValue: buildKnexConnection(options)
|
|
23
30
|
},
|
|
24
31
|
{
|
|
25
|
-
inject: [
|
|
32
|
+
inject: [KNEX_CONNECTION, schema_configuration_1.SchemaConfiguration],
|
|
33
|
+
provide: core_1.SNAPSHOT_STORE,
|
|
34
|
+
useFactory: (knexConnection, schemaConfiguration) => {
|
|
35
|
+
const { snapshotStrategy, snapshotTableName } = options;
|
|
36
|
+
if (Boolean(snapshotStrategy) !== Boolean(snapshotTableName)) {
|
|
37
|
+
throw new Error("To use snapshots, both 'snapshotStrategy' and 'snapshotTableName' must be provided.");
|
|
38
|
+
}
|
|
39
|
+
if (!snapshotTableName || !snapshotStrategy) {
|
|
40
|
+
return new core_1.NoOpSnapshotStore();
|
|
41
|
+
}
|
|
42
|
+
return new postgresql_snapshot_store_1.PostgreSQLSnapshotStore(snapshotStrategy, schemaConfiguration.schemaAwareSnapshotTable, knexConnection);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
inject: [core_1.DomainEventEmitter, KNEX_CONNECTION, core_1.SNAPSHOT_STORE, schema_configuration_1.SchemaConfiguration],
|
|
26
47
|
provide: core_1.EVENT_STORE,
|
|
27
|
-
useFactory: (eventEmitter, knexConnection) => {
|
|
28
|
-
return new postgresql_event_store_1.PostgreSQLEventStore(eventEmitter,
|
|
48
|
+
useFactory: (eventEmitter, knexConnection, snapshotStore, schemaConfiguration) => {
|
|
49
|
+
return new postgresql_event_store_1.PostgreSQLEventStore(eventEmitter, snapshotStore, schemaConfiguration, knexConnection);
|
|
29
50
|
}
|
|
30
51
|
},
|
|
31
52
|
{
|
|
32
|
-
inject: [KNEX_CONNECTION],
|
|
53
|
+
inject: [KNEX_CONNECTION, schema_configuration_1.SchemaConfiguration],
|
|
33
54
|
provide: table_initializer_1.TableInitializer,
|
|
34
|
-
useFactory: (knexConnection) => {
|
|
35
|
-
return new table_initializer_1.TableInitializer(
|
|
55
|
+
useFactory: (knexConnection, schemaConfiguration) => {
|
|
56
|
+
return new table_initializer_1.TableInitializer(schemaConfiguration, (0, es_toolkit_1.isNil)(options.ensureTablesExist) ? false : options.ensureTablesExist, knexConnection);
|
|
36
57
|
}
|
|
37
58
|
}
|
|
38
59
|
];
|
|
@@ -45,6 +66,13 @@ class ModuleProviders {
|
|
|
45
66
|
return await options.useFactory(...parameters);
|
|
46
67
|
}
|
|
47
68
|
};
|
|
69
|
+
const schemaConfigurationProvider = {
|
|
70
|
+
inject: ["EVENT_NEST_PG_OPTIONS"],
|
|
71
|
+
provide: schema_configuration_1.SchemaConfiguration,
|
|
72
|
+
useFactory: (options) => {
|
|
73
|
+
return new schema_configuration_1.SchemaConfiguration(options.schemaName, options.aggregatesTableName, options.eventsTableName, options.snapshotTableName);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
48
76
|
const emitterProvider = {
|
|
49
77
|
inject: ["EVENT_NEST_PG_OPTIONS"],
|
|
50
78
|
provide: core_1.DomainEventEmitter,
|
|
@@ -60,20 +88,42 @@ class ModuleProviders {
|
|
|
60
88
|
}
|
|
61
89
|
};
|
|
62
90
|
const eventStoreProvider = {
|
|
63
|
-
inject: [
|
|
91
|
+
inject: [core_1.DomainEventEmitter, KNEX_CONNECTION, core_1.SNAPSHOT_STORE, schema_configuration_1.SchemaConfiguration],
|
|
64
92
|
provide: core_1.EVENT_STORE,
|
|
65
|
-
useFactory: (
|
|
66
|
-
return new postgresql_event_store_1.PostgreSQLEventStore(emitter,
|
|
93
|
+
useFactory: (emitter, knexConnection, snapshotStore, schemaConfiguration) => {
|
|
94
|
+
return new postgresql_event_store_1.PostgreSQLEventStore(emitter, snapshotStore, schemaConfiguration, knexConnection);
|
|
67
95
|
}
|
|
68
96
|
};
|
|
69
97
|
const tableInitializerProvider = {
|
|
70
|
-
inject: [KNEX_CONNECTION, "EVENT_NEST_PG_OPTIONS"],
|
|
98
|
+
inject: [KNEX_CONNECTION, "EVENT_NEST_PG_OPTIONS", schema_configuration_1.SchemaConfiguration],
|
|
71
99
|
provide: table_initializer_1.TableInitializer,
|
|
72
|
-
useFactory: (knexConnection, options) => {
|
|
73
|
-
return new table_initializer_1.TableInitializer(
|
|
100
|
+
useFactory: (knexConnection, options, schemaConfiguration) => {
|
|
101
|
+
return new table_initializer_1.TableInitializer(schemaConfiguration, (0, es_toolkit_1.isNil)(options.ensureTablesExist) ? false : options.ensureTablesExist, knexConnection);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const snapshotStoreProvider = {
|
|
105
|
+
inject: ["EVENT_NEST_PG_OPTIONS", KNEX_CONNECTION, schema_configuration_1.SchemaConfiguration],
|
|
106
|
+
provide: core_1.SNAPSHOT_STORE,
|
|
107
|
+
useFactory: (options, knexConnection, schemaConfiguration) => {
|
|
108
|
+
const { snapshotStrategy, snapshotTableName } = options;
|
|
109
|
+
if (Boolean(snapshotStrategy) !== Boolean(snapshotTableName)) {
|
|
110
|
+
throw new Error("To use snapshots, both 'snapshotStrategy' and 'snapshotTableName' must be provided.");
|
|
111
|
+
}
|
|
112
|
+
if (!snapshotTableName || !snapshotStrategy) {
|
|
113
|
+
return new core_1.NoOpSnapshotStore();
|
|
114
|
+
}
|
|
115
|
+
return new postgresql_snapshot_store_1.PostgreSQLSnapshotStore(snapshotStrategy, schemaConfiguration.schemaAwareSnapshotTable, knexConnection);
|
|
74
116
|
}
|
|
75
117
|
};
|
|
76
|
-
return [
|
|
118
|
+
return [
|
|
119
|
+
optionsProvider,
|
|
120
|
+
knexProvider,
|
|
121
|
+
emitterProvider,
|
|
122
|
+
eventStoreProvider,
|
|
123
|
+
tableInitializerProvider,
|
|
124
|
+
snapshotStoreProvider,
|
|
125
|
+
schemaConfigurationProvider
|
|
126
|
+
];
|
|
77
127
|
}
|
|
78
128
|
}
|
|
79
129
|
exports.ModuleProviders = ModuleProviders;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-providers.js","sourceRoot":"","sources":["../../../../../libs/postgresql/src/lib/module-providers.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"module-providers.js","sourceRoot":"","sources":["../../../../../libs/postgresql/src/lib/module-providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CoreModuleOptions } from "@event-nest/core";
|
|
1
|
+
import { CoreModuleOptions, SnapshotStrategy } from "@event-nest/core";
|
|
2
2
|
export interface ConnectionPoolOptions {
|
|
3
3
|
acquireTimeoutMillis?: number;
|
|
4
4
|
afterCreate?: Function;
|
|
@@ -20,7 +20,7 @@ export interface PostgreSQLModuleAsyncOptions {
|
|
|
20
20
|
inject?: any[];
|
|
21
21
|
useFactory: (...parameters: any[]) => PostgreSQLModuleOptions | Promise<PostgreSQLModuleOptions>;
|
|
22
22
|
}
|
|
23
|
-
export
|
|
23
|
+
export type PostgreSQLModuleOptions = CoreModuleOptions & (SnapshotsDisabled | SnapshotsEnabled) & {
|
|
24
24
|
/**
|
|
25
25
|
* The name of the table which will be used to store the aggregate root rows.
|
|
26
26
|
*/
|
|
@@ -53,8 +53,25 @@ export interface PostgreSQLModuleOptions extends CoreModuleOptions {
|
|
|
53
53
|
* provide a string representation of your certificate and set the rejectUnauthorized flag to true.
|
|
54
54
|
*/
|
|
55
55
|
ssl?: SslOptions;
|
|
56
|
-
}
|
|
56
|
+
};
|
|
57
57
|
export interface SslOptions {
|
|
58
58
|
certificate?: string;
|
|
59
59
|
rejectUnauthorized: boolean;
|
|
60
60
|
}
|
|
61
|
+
type SnapshotsDisabled = {
|
|
62
|
+
snapshotStrategy?: undefined;
|
|
63
|
+
snapshotTableName?: undefined;
|
|
64
|
+
};
|
|
65
|
+
type SnapshotsEnabled = {
|
|
66
|
+
/**
|
|
67
|
+
* The snapshot strategy to use for determining when snapshots should be created for aggregate roots.
|
|
68
|
+
* See {@link SnapshotStrategy} for more information.
|
|
69
|
+
*/
|
|
70
|
+
snapshotStrategy: SnapshotStrategy;
|
|
71
|
+
/**
|
|
72
|
+
* The name of the table which will be used to store the aggregate snapshots.
|
|
73
|
+
* You can omit this option if you do not want to use snapshots optimization.
|
|
74
|
+
*/
|
|
75
|
+
snapshotTableName: string;
|
|
76
|
+
};
|
|
77
|
+
export {};
|
|
@@ -5,7 +5,8 @@ export declare class SchemaConfiguration {
|
|
|
5
5
|
private readonly _schema;
|
|
6
6
|
private readonly _aggregatesTable;
|
|
7
7
|
private readonly _eventsTable;
|
|
8
|
-
|
|
8
|
+
private readonly _snapshotTable?;
|
|
9
|
+
constructor(_schema: string, _aggregatesTable: string, _eventsTable: string, _snapshotTable?: string | undefined);
|
|
9
10
|
get aggregatesTable(): string;
|
|
10
11
|
get eventsTable(): string;
|
|
11
12
|
get schema(): string;
|
|
@@ -17,4 +18,9 @@ export declare class SchemaConfiguration {
|
|
|
17
18
|
* The schema-aware events table name (schema.eventsTable)
|
|
18
19
|
*/
|
|
19
20
|
get schemaAwareEventsTable(): string;
|
|
21
|
+
/**
|
|
22
|
+
* The schema-aware snapshots table name (schema.snapshotTable)
|
|
23
|
+
*/
|
|
24
|
+
get schemaAwareSnapshotTable(): string | undefined;
|
|
25
|
+
get snapshotTable(): string | undefined;
|
|
20
26
|
}
|
|
@@ -5,10 +5,11 @@ exports.SchemaConfiguration = void 0;
|
|
|
5
5
|
* A configuration class which holds the schema, aggregates table, and events table names for the PostgreSQL database.
|
|
6
6
|
*/
|
|
7
7
|
class SchemaConfiguration {
|
|
8
|
-
constructor(_schema, _aggregatesTable, _eventsTable) {
|
|
8
|
+
constructor(_schema, _aggregatesTable, _eventsTable, _snapshotTable) {
|
|
9
9
|
this._schema = _schema;
|
|
10
10
|
this._aggregatesTable = _aggregatesTable;
|
|
11
11
|
this._eventsTable = _eventsTable;
|
|
12
|
+
this._snapshotTable = _snapshotTable;
|
|
12
13
|
}
|
|
13
14
|
get aggregatesTable() {
|
|
14
15
|
return this._aggregatesTable;
|
|
@@ -31,6 +32,17 @@ class SchemaConfiguration {
|
|
|
31
32
|
get schemaAwareEventsTable() {
|
|
32
33
|
return this._schema + "." + this._eventsTable;
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* The schema-aware snapshots table name (schema.snapshotTable)
|
|
37
|
+
*/
|
|
38
|
+
get schemaAwareSnapshotTable() {
|
|
39
|
+
if (!this._snapshotTable)
|
|
40
|
+
return undefined;
|
|
41
|
+
return this._schema + "." + this._snapshotTable;
|
|
42
|
+
}
|
|
43
|
+
get snapshotTable() {
|
|
44
|
+
return this._snapshotTable;
|
|
45
|
+
}
|
|
34
46
|
}
|
|
35
47
|
exports.SchemaConfiguration = SchemaConfiguration;
|
|
36
48
|
//# sourceMappingURL=schema-configuration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-configuration.js","sourceRoot":"","sources":["../../../../../libs/postgresql/src/lib/schema-configuration.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,mBAAmB;IAC5B,YACqB,OAAe,EACf,gBAAwB,EACxB,YAAoB;
|
|
1
|
+
{"version":3,"file":"schema-configuration.js","sourceRoot":"","sources":["../../../../../libs/postgresql/src/lib/schema-configuration.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,mBAAmB;IAC5B,YACqB,OAAe,EACf,gBAAwB,EACxB,YAAoB,EACpB,cAAuB;QAHvB,YAAO,GAAP,OAAO,CAAQ;QACf,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,mBAAc,GAAd,cAAc,CAAS;IACzC,CAAC;IAEJ,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAED,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,0BAA0B;QAC1B,OAAO,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,IAAI,sBAAsB;QACtB,OAAO,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,IAAI,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,SAAS,CAAC;QAC3C,OAAO,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;IACpD,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;CACJ;AA7CD,kDA6CC"}
|
|
@@ -1,27 +1,21 @@
|
|
|
1
|
-
import { AbstractEventStore, AggregateRoot, AggregateRootClass, DomainEventEmitter, StoredAggregateRoot, StoredEvent } from "@event-nest/core";
|
|
1
|
+
import { AbstractEventStore, AggregateRoot, AggregateRootClass, AggregateRootSnapshot, DomainEventEmitter, StoredAggregateRoot, StoredEvent } from "@event-nest/core";
|
|
2
2
|
import { knex } from "knex";
|
|
3
3
|
import { SchemaConfiguration } from "../schema-configuration";
|
|
4
|
+
import { PostgreSQLSnapshotStore } from "./postgresql-snapshot-store";
|
|
4
5
|
export declare class PostgreSQLEventStore extends AbstractEventStore {
|
|
5
6
|
private readonly _knexConnection;
|
|
6
7
|
private readonly _logger;
|
|
7
8
|
private readonly _schemaConfiguration;
|
|
8
|
-
constructor(eventEmitter: DomainEventEmitter,
|
|
9
|
-
/**
|
|
10
|
-
* @deprecated Use {@link schemaConfiguration} instead. It will be removed in version 5.x
|
|
11
|
-
*/
|
|
12
|
-
get aggregatesTableName(): string;
|
|
13
|
-
/**
|
|
14
|
-
* @deprecated Use {@link schemaConfiguration} instead. It will be removed in version 5.x
|
|
15
|
-
*/
|
|
16
|
-
get eventsTableName(): string;
|
|
9
|
+
constructor(eventEmitter: DomainEventEmitter, snapshotStore: PostgreSQLSnapshotStore, schemaConfiguration: SchemaConfiguration, _knexConnection: knex.Knex);
|
|
17
10
|
get schemaConfiguration(): SchemaConfiguration;
|
|
18
|
-
/**
|
|
19
|
-
* @deprecated Use {@link schemaConfiguration} instead. It will be removed in version 5.x
|
|
20
|
-
*/
|
|
21
|
-
get schemaName(): string;
|
|
22
11
|
findAggregateRootVersion(id: string): Promise<number>;
|
|
23
12
|
findByAggregateRootId<T extends AggregateRoot>(aggregateRootClass: AggregateRootClass<T>, id: string): Promise<Array<StoredEvent>>;
|
|
24
13
|
findByAggregateRootIds<T extends AggregateRoot>(aggregateRootClass: AggregateRootClass<T>, ids: string[]): Promise<Record<string, Array<StoredEvent>>>;
|
|
14
|
+
findWithSnapshot<T extends AggregateRoot>(aggregateRootClass: AggregateRootClass<T>, id: string): Promise<{
|
|
15
|
+
events: Array<StoredEvent>;
|
|
16
|
+
snapshot?: AggregateRootSnapshot<T>;
|
|
17
|
+
}>;
|
|
25
18
|
generateEntityId(): Promise<string>;
|
|
26
19
|
save(events: Array<StoredEvent>, aggregate: StoredAggregateRoot): Promise<Array<StoredEvent>>;
|
|
20
|
+
private findEvents;
|
|
27
21
|
}
|
|
@@ -5,35 +5,16 @@ const core_1 = require("@event-nest/core");
|
|
|
5
5
|
const common_1 = require("@nestjs/common");
|
|
6
6
|
const es_toolkit_1 = require("es-toolkit");
|
|
7
7
|
const node_crypto_1 = require("node:crypto");
|
|
8
|
-
const schema_configuration_1 = require("../schema-configuration");
|
|
9
8
|
class PostgreSQLEventStore extends core_1.AbstractEventStore {
|
|
10
|
-
constructor(eventEmitter,
|
|
11
|
-
super(eventEmitter);
|
|
9
|
+
constructor(eventEmitter, snapshotStore, schemaConfiguration, _knexConnection) {
|
|
10
|
+
super(eventEmitter, snapshotStore);
|
|
12
11
|
this._knexConnection = _knexConnection;
|
|
13
12
|
this._logger = new common_1.Logger(PostgreSQLEventStore.name);
|
|
14
|
-
this._schemaConfiguration =
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* @deprecated Use {@link schemaConfiguration} instead. It will be removed in version 5.x
|
|
18
|
-
*/
|
|
19
|
-
get aggregatesTableName() {
|
|
20
|
-
return this.schemaConfiguration.aggregatesTable;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* @deprecated Use {@link schemaConfiguration} instead. It will be removed in version 5.x
|
|
24
|
-
*/
|
|
25
|
-
get eventsTableName() {
|
|
26
|
-
return this.schemaConfiguration.eventsTable;
|
|
13
|
+
this._schemaConfiguration = schemaConfiguration;
|
|
27
14
|
}
|
|
28
15
|
get schemaConfiguration() {
|
|
29
16
|
return this._schemaConfiguration;
|
|
30
17
|
}
|
|
31
|
-
/**
|
|
32
|
-
* @deprecated Use {@link schemaConfiguration} instead. It will be removed in version 5.x
|
|
33
|
-
*/
|
|
34
|
-
get schemaName() {
|
|
35
|
-
return this.schemaConfiguration.schema;
|
|
36
|
-
}
|
|
37
18
|
async findAggregateRootVersion(id) {
|
|
38
19
|
const aggregate = await this._knexConnection(this._schemaConfiguration.schemaAwareAggregatesTable)
|
|
39
20
|
.select("version")
|
|
@@ -45,26 +26,12 @@ class PostgreSQLEventStore extends core_1.AbstractEventStore {
|
|
|
45
26
|
return aggregate.version;
|
|
46
27
|
}
|
|
47
28
|
async findByAggregateRootId(aggregateRootClass, id) {
|
|
48
|
-
const startedAt = Date.now();
|
|
49
29
|
const aggregateRootName = (0, core_1.getAggregateRootName)(aggregateRootClass);
|
|
50
30
|
if ((0, es_toolkit_1.isNil)(aggregateRootName)) {
|
|
51
31
|
this._logger.error(`Missing aggregate root name for class: ${aggregateRootClass.name}. Use the @AggregateRootName decorator.`);
|
|
52
32
|
throw new core_1.MissingAggregateRootNameException(aggregateRootClass.name);
|
|
53
33
|
}
|
|
54
|
-
|
|
55
|
-
.select("*")
|
|
56
|
-
.where({
|
|
57
|
-
aggregate_root_id: id,
|
|
58
|
-
aggregate_root_name: aggregateRootName
|
|
59
|
-
});
|
|
60
|
-
const duration = Date.now() - startedAt;
|
|
61
|
-
this._logger.debug(`Finding events for aggregate ${id} took ${duration}ms`);
|
|
62
|
-
if (rows.length > 0) {
|
|
63
|
-
return rows.map((row) => {
|
|
64
|
-
return core_1.StoredEvent.fromStorage(row.id, row.aggregate_root_id, row.event_name, row.created_at, row.aggregate_root_version, row.aggregate_root_name, row.payload);
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
return [];
|
|
34
|
+
return this.findEvents(id, aggregateRootName);
|
|
68
35
|
}
|
|
69
36
|
async findByAggregateRootIds(aggregateRootClass, ids) {
|
|
70
37
|
const aggregateRootName = (0, core_1.getAggregateRootName)(aggregateRootClass);
|
|
@@ -87,6 +54,30 @@ class PostgreSQLEventStore extends core_1.AbstractEventStore {
|
|
|
87
54
|
}
|
|
88
55
|
return grouped;
|
|
89
56
|
}
|
|
57
|
+
async findWithSnapshot(aggregateRootClass, id) {
|
|
58
|
+
const aggregateRootName = (0, core_1.getAggregateRootName)(aggregateRootClass);
|
|
59
|
+
if ((0, es_toolkit_1.isNil)(aggregateRootName)) {
|
|
60
|
+
this._logger.error(`Missing aggregate root name for class: ${aggregateRootClass.name}. Use the @AggregateRootName decorator.`);
|
|
61
|
+
throw new core_1.MissingAggregateRootNameException(aggregateRootClass.name);
|
|
62
|
+
}
|
|
63
|
+
const snapshotRevision = (0, core_1.getAggregateRootSnapshotRevision)(aggregateRootClass);
|
|
64
|
+
if ((0, es_toolkit_1.isNil)(snapshotRevision)) {
|
|
65
|
+
this._logger.error(`Missing snapshot revision for class: ${aggregateRootClass.name}. Use the @AggregateRootConfig decorator to set the snapshotRevision.`);
|
|
66
|
+
throw new core_1.AggregateClassNotSnapshotAwareException(aggregateRootName);
|
|
67
|
+
}
|
|
68
|
+
const snapshot = await this._snapshotStore.findLatestSnapshotByAggregateId(id);
|
|
69
|
+
if (!snapshot) {
|
|
70
|
+
return { events: await this.findByAggregateRootId(aggregateRootClass, id), snapshot: undefined };
|
|
71
|
+
}
|
|
72
|
+
if (snapshot.revision != snapshotRevision) {
|
|
73
|
+
throw new core_1.SnapshotRevisionMismatchException(aggregateRootName);
|
|
74
|
+
}
|
|
75
|
+
const events = await this.findEvents(id, aggregateRootName, snapshot.aggregateRootVersion);
|
|
76
|
+
return {
|
|
77
|
+
events,
|
|
78
|
+
snapshot: snapshot.payload
|
|
79
|
+
};
|
|
80
|
+
}
|
|
90
81
|
generateEntityId() {
|
|
91
82
|
return Promise.resolve((0, node_crypto_1.randomUUID)());
|
|
92
83
|
}
|
|
@@ -152,6 +143,25 @@ class PostgreSQLEventStore extends core_1.AbstractEventStore {
|
|
|
152
143
|
this._logger.debug(`Saving events for aggregate ${aggregate.id} took ${duration}ms`);
|
|
153
144
|
return events;
|
|
154
145
|
}
|
|
146
|
+
async findEvents(id, aggregateRootName, minVersion) {
|
|
147
|
+
const startedAt = Date.now();
|
|
148
|
+
let query = this._knexConnection(this._schemaConfiguration.schemaAwareEventsTable).select("*").where({
|
|
149
|
+
aggregate_root_id: id,
|
|
150
|
+
aggregate_root_name: aggregateRootName
|
|
151
|
+
});
|
|
152
|
+
if (!(0, es_toolkit_1.isNil)(minVersion)) {
|
|
153
|
+
query = query.andWhere("aggregate_root_version", ">", minVersion);
|
|
154
|
+
}
|
|
155
|
+
const rows = await query;
|
|
156
|
+
const duration = Date.now() - startedAt;
|
|
157
|
+
this._logger.debug(`Finding events for aggregate ${id} took ${duration}ms`);
|
|
158
|
+
if (rows.length > 0) {
|
|
159
|
+
return rows.map((row) => {
|
|
160
|
+
return core_1.StoredEvent.fromStorage(row.id, row.aggregate_root_id, row.event_name, row.created_at, row.aggregate_root_version, row.aggregate_root_name, row.payload);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
155
165
|
}
|
|
156
166
|
exports.PostgreSQLEventStore = PostgreSQLEventStore;
|
|
157
167
|
//# sourceMappingURL=postgresql-event-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql-event-store.js","sourceRoot":"","sources":["../../../../../../libs/postgresql/src/lib/storage/postgresql-event-store.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"postgresql-event-store.js","sourceRoot":"","sources":["../../../../../../libs/postgresql/src/lib/storage/postgresql-event-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AbstractSnapshotStore, SnapshotStrategy, StoredSnapshot } from "@event-nest/core";
|
|
2
|
+
import knex from "knex";
|
|
3
|
+
export declare class PostgreSQLSnapshotStore extends AbstractSnapshotStore {
|
|
4
|
+
private readonly schemaAwareSnapshotTable;
|
|
5
|
+
private readonly _knexConnection;
|
|
6
|
+
private readonly _logger;
|
|
7
|
+
constructor(snapshotStrategy: SnapshotStrategy, schemaAwareSnapshotTable: string, _knexConnection: knex.Knex);
|
|
8
|
+
findLatestSnapshotByAggregateId(id: string): Promise<StoredSnapshot | undefined>;
|
|
9
|
+
generateEntityId(): Promise<string>;
|
|
10
|
+
save(snapshot: StoredSnapshot): Promise<StoredSnapshot | undefined>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var PostgreSQLSnapshotStore_1;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PostgreSQLSnapshotStore = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const core_1 = require("@event-nest/core");
|
|
7
|
+
const common_1 = require("@nestjs/common");
|
|
8
|
+
const es_toolkit_1 = require("es-toolkit");
|
|
9
|
+
const knex_1 = require("knex");
|
|
10
|
+
const node_crypto_1 = require("node:crypto");
|
|
11
|
+
let PostgreSQLSnapshotStore = PostgreSQLSnapshotStore_1 = class PostgreSQLSnapshotStore extends core_1.AbstractSnapshotStore {
|
|
12
|
+
constructor(snapshotStrategy, schemaAwareSnapshotTable, _knexConnection) {
|
|
13
|
+
super(snapshotStrategy);
|
|
14
|
+
this.schemaAwareSnapshotTable = schemaAwareSnapshotTable;
|
|
15
|
+
this._knexConnection = _knexConnection;
|
|
16
|
+
this._logger = new common_1.Logger(PostgreSQLSnapshotStore_1.name);
|
|
17
|
+
}
|
|
18
|
+
async findLatestSnapshotByAggregateId(id) {
|
|
19
|
+
const row = await this._knexConnection(this.schemaAwareSnapshotTable)
|
|
20
|
+
.select("*")
|
|
21
|
+
.where("aggregate_root_id", id)
|
|
22
|
+
.orderBy("aggregate_root_version", "desc")
|
|
23
|
+
.first();
|
|
24
|
+
if ((0, es_toolkit_1.isNil)(row)) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return core_1.StoredSnapshot.create(row.id, row.aggregate_root_version, row.revision, row.payload, row.aggregate_root_id);
|
|
28
|
+
}
|
|
29
|
+
generateEntityId() {
|
|
30
|
+
return Promise.resolve((0, node_crypto_1.randomUUID)());
|
|
31
|
+
}
|
|
32
|
+
async save(snapshot) {
|
|
33
|
+
const snapshotRow = {
|
|
34
|
+
aggregate_root_id: snapshot.aggregateRootId,
|
|
35
|
+
aggregate_root_version: snapshot.aggregateRootVersion,
|
|
36
|
+
id: snapshot.id,
|
|
37
|
+
payload: JSON.stringify(snapshot.payload),
|
|
38
|
+
revision: snapshot.revision
|
|
39
|
+
};
|
|
40
|
+
const startedAt = Date.now();
|
|
41
|
+
await this._knexConnection(this.schemaAwareSnapshotTable).insert(snapshotRow);
|
|
42
|
+
const duration = Date.now() - startedAt;
|
|
43
|
+
this._logger.debug(`Saving snapshot for aggregate ${snapshot.id} took ${duration}ms`);
|
|
44
|
+
return snapshot;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
exports.PostgreSQLSnapshotStore = PostgreSQLSnapshotStore;
|
|
48
|
+
exports.PostgreSQLSnapshotStore = PostgreSQLSnapshotStore = PostgreSQLSnapshotStore_1 = tslib_1.__decorate([
|
|
49
|
+
(0, common_1.Injectable)(),
|
|
50
|
+
tslib_1.__metadata("design:paramtypes", [core_1.SnapshotStrategy, String, Function])
|
|
51
|
+
], PostgreSQLSnapshotStore);
|
|
52
|
+
//# sourceMappingURL=postgresql-snapshot-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql-snapshot-store.js","sourceRoot":"","sources":["../../../../../../libs/postgresql/src/lib/storage/postgresql-snapshot-store.ts"],"names":[],"mappings":";;;;;AAAA,2CAA2F;AAC3F,2CAAoD;AACpD,2CAAmC;AACnC,+BAAwB;AACxB,6CAAyC;AAKlC,IAAM,uBAAuB,+BAA7B,MAAM,uBAAwB,SAAQ,4BAAqB;IAG9D,YACI,gBAAkC,EACjB,wBAAgC,EAChC,eAA0B;QAE3C,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAHP,6BAAwB,GAAxB,wBAAwB,CAAQ;QAChC,oBAAe,GAAf,eAAe,CAAW;QAG3C,IAAI,CAAC,OAAO,GAAG,IAAI,eAAM,CAAC,yBAAuB,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,+BAA+B,CAAC,EAAU;QAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAc,IAAI,CAAC,wBAAwB,CAAC;aAC7E,MAAM,CAAC,GAAG,CAAC;aACX,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC;aAC9B,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC;aACzC,KAAK,EAAE,CAAC;QAEb,IAAI,IAAA,kBAAK,EAAC,GAAG,CAAC,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,OAAO,qBAAc,CAAC,MAAM,CACxB,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,sBAAsB,EAC1B,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,iBAAiB,CACxB,CAAC;IACN,CAAC;IAED,gBAAgB;QACZ,OAAO,OAAO,CAAC,OAAO,CAAC,IAAA,wBAAU,GAAE,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAwB;QAC/B,MAAM,WAAW,GAAgB;YAC7B,iBAAiB,EAAE,QAAQ,CAAC,eAAe;YAC3C,sBAAsB,EAAE,QAAQ,CAAC,oBAAoB;YACrD,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;YACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC9B,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,eAAe,CAAc,IAAI,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE3F,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iCAAiC,QAAQ,CAAC,EAAE,SAAS,QAAQ,IAAI,CAAC,CAAC;QAEtF,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ,CAAA;AArDY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;6CAKa,uBAAgB;GAJ7B,uBAAuB,CAqDnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-row.js","sourceRoot":"","sources":["../../../../../../libs/postgresql/src/lib/storage/snapshot-row.ts"],"names":[],"mappings":""}
|
|
@@ -25,13 +25,18 @@ let TableInitializer = TableInitializer_1 = class TableInitializer {
|
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
27
|
try {
|
|
28
|
-
const [hasAggregatesTable, hasEventsTable] = await Promise.all([
|
|
28
|
+
const [hasAggregatesTable, hasEventsTable, hasSnapshotTable] = await Promise.all([
|
|
29
29
|
this._knexConnection.schema
|
|
30
30
|
.withSchema(this._schemaConfiguration.schema)
|
|
31
31
|
.hasTable(this._schemaConfiguration.aggregatesTable),
|
|
32
32
|
this._knexConnection.schema
|
|
33
33
|
.withSchema(this._schemaConfiguration.schema)
|
|
34
|
-
.hasTable(this._schemaConfiguration.eventsTable)
|
|
34
|
+
.hasTable(this._schemaConfiguration.eventsTable),
|
|
35
|
+
this.schemaConfiguration.snapshotTable
|
|
36
|
+
? this._knexConnection.schema
|
|
37
|
+
.withSchema(this._schemaConfiguration.schema)
|
|
38
|
+
.hasTable(this.schemaConfiguration.snapshotTable)
|
|
39
|
+
: Promise.resolve(false)
|
|
35
40
|
]);
|
|
36
41
|
if (hasAggregatesTable) {
|
|
37
42
|
this._logger.log("Skipping aggregates table initialization. Table already exists");
|
|
@@ -66,6 +71,27 @@ let TableInitializer = TableInitializer_1 = class TableInitializer {
|
|
|
66
71
|
});
|
|
67
72
|
this._logger.log("Events table created successfully");
|
|
68
73
|
}
|
|
74
|
+
if (hasSnapshotTable) {
|
|
75
|
+
this._logger.log("Skipping snapshot table initialization. Table already exists");
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if (this._schemaConfiguration.snapshotTable) {
|
|
79
|
+
await this._knexConnection.schema
|
|
80
|
+
.withSchema(this._schemaConfiguration.schema)
|
|
81
|
+
.createTable(this._schemaConfiguration.snapshotTable, (table) => {
|
|
82
|
+
table.uuid("id").primary();
|
|
83
|
+
table.uuid("aggregate_root_id").notNullable();
|
|
84
|
+
table.integer("aggregate_root_version").notNullable();
|
|
85
|
+
table.jsonb("payload").notNullable();
|
|
86
|
+
table.integer("revision").notNullable();
|
|
87
|
+
table
|
|
88
|
+
.foreign("aggregate_root_id")
|
|
89
|
+
.references("id")
|
|
90
|
+
.inTable(this._schemaConfiguration.schemaAwareAggregatesTable);
|
|
91
|
+
});
|
|
92
|
+
this._logger.log("Snapshot table created successfully");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
69
95
|
}
|
|
70
96
|
catch (error) {
|
|
71
97
|
this._logger.error("Event Nest table initialization has failed. Tables will have to be created manually.", error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-initializer.js","sourceRoot":"","sources":["../../../../../libs/postgresql/src/lib/table-initializer.ts"],"names":[],"mappings":";;;;;AAAA,2CAA4E;AAC5E,+BAA4B;AAE5B,iEAA6D;AAGtD,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAEzB,YACqB,oBAAyC,EACzC,kBAA2B,EAC3B,eAA0B;QAF1B,yBAAoB,GAApB,oBAAoB,CAAqB;QACzC,uBAAkB,GAAlB,kBAAkB,CAAS;QAC3B,oBAAe,GAAf,eAAe,CAAW;QAJ9B,YAAO,GAAG,IAAI,eAAM,CAAC,kBAAgB,CAAC,IAAI,CAAC,CAAC;IAK1D,CAAC;IAEJ,IAAI,iBAAiB;QACjB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,sBAAsB;QACxB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;YAClG,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"table-initializer.js","sourceRoot":"","sources":["../../../../../libs/postgresql/src/lib/table-initializer.ts"],"names":[],"mappings":";;;;;AAAA,2CAA4E;AAC5E,+BAA4B;AAE5B,iEAA6D;AAGtD,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAEzB,YACqB,oBAAyC,EACzC,kBAA2B,EAC3B,eAA0B;QAF1B,yBAAoB,GAApB,oBAAoB,CAAqB;QACzC,uBAAkB,GAAlB,kBAAkB,CAAS;QAC3B,oBAAe,GAAf,eAAe,CAAW;QAJ9B,YAAO,GAAG,IAAI,eAAM,CAAC,kBAAgB,CAAC,IAAI,CAAC,CAAC;IAK1D,CAAC;IAEJ,IAAI,iBAAiB;QACjB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,sBAAsB;QACxB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;YAClG,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,CAAC,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC7E,IAAI,CAAC,eAAe,CAAC,MAAM;qBACtB,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;qBAC5C,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC;gBACxD,IAAI,CAAC,eAAe,CAAC,MAAM;qBACtB,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;qBAC5C,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;gBACpD,IAAI,CAAC,mBAAmB,CAAC,aAAa;oBAClC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM;yBACtB,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;yBAC5C,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC;oBACvD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;aAC/B,CAAC,CAAC;YAEH,IAAI,kBAAkB,EAAE,CAAC;gBACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;YACvF,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM;qBAC5B,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;qBAC5C,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC9D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBAC3B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC3C,CAAC,CAAC,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YAC9D,CAAC;YAED,IAAI,cAAc,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM;qBAC5B,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;qBAC5C,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC1D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC9C,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,WAAW,EAAE,CAAC;oBACtD,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,WAAW,EAAE,CAAC;oBAChD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;oBACvC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;oBACrC,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC7D,KAAK;yBACA,OAAO,CAAC,mBAAmB,CAAC;yBAC5B,UAAU,CAAC,IAAI,CAAC;yBAChB,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,0BAA0B,CAAC,CAAC;gBACvE,CAAC,CAAC,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YAC1D,CAAC;YAED,IAAI,gBAAgB,EAAE,CAAC;gBACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACJ,IAAI,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,CAAC;oBAC1C,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM;yBAC5B,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;yBAC5C,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;wBAC5D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;wBAC3B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,CAAC;wBAC9C,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,WAAW,EAAE,CAAC;wBACtD,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;wBACrC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;wBACxC,KAAK;6BACA,OAAO,CAAC,mBAAmB,CAAC;6BAC5B,UAAU,CAAC,IAAI,CAAC;6BAChB,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,0BAA0B,CAAC,CAAC;oBACvE,CAAC,CAAC,CAAC;oBACP,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBAC5D,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,KAAK,CACd,sFAAsF,EACtF,KAAK,CACR,CAAC;QACN,CAAC;IACL,CAAC;CACJ,CAAA;AAjGY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;6CAIkC,0CAAmB;GAHrD,gBAAgB,CAiG5B"}
|