@hexaijs/postgres 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +318 -0
  3. package/dist/config/index.d.ts +3 -0
  4. package/dist/config/index.d.ts.map +1 -0
  5. package/dist/config/index.js +19 -0
  6. package/dist/config/index.js.map +1 -0
  7. package/dist/config/postgres-config-spec.d.ts +32 -0
  8. package/dist/config/postgres-config-spec.d.ts.map +1 -0
  9. package/dist/config/postgres-config-spec.js +49 -0
  10. package/dist/config/postgres-config-spec.js.map +1 -0
  11. package/dist/config/postgres-config.d.ts +59 -0
  12. package/dist/config/postgres-config.d.ts.map +1 -0
  13. package/dist/config/postgres-config.js +181 -0
  14. package/dist/config/postgres-config.js.map +1 -0
  15. package/dist/helpers.d.ts +57 -0
  16. package/dist/helpers.d.ts.map +1 -0
  17. package/dist/helpers.js +276 -0
  18. package/dist/helpers.js.map +1 -0
  19. package/dist/index.d.ts +7 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +29 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/postgres-event-store.d.ts +18 -0
  24. package/dist/postgres-event-store.d.ts.map +1 -0
  25. package/dist/postgres-event-store.js +83 -0
  26. package/dist/postgres-event-store.js.map +1 -0
  27. package/dist/postgres-unit-of-work.d.ts +17 -0
  28. package/dist/postgres-unit-of-work.d.ts.map +1 -0
  29. package/dist/postgres-unit-of-work.js +251 -0
  30. package/dist/postgres-unit-of-work.js.map +1 -0
  31. package/dist/run-hexai-migrations.d.ts +3 -0
  32. package/dist/run-hexai-migrations.d.ts.map +1 -0
  33. package/dist/run-hexai-migrations.js +17 -0
  34. package/dist/run-hexai-migrations.js.map +1 -0
  35. package/dist/run-migrations.d.ts +11 -0
  36. package/dist/run-migrations.d.ts.map +1 -0
  37. package/dist/run-migrations.js +202 -0
  38. package/dist/run-migrations.js.map +1 -0
  39. package/dist/test-fixtures/config.d.ts +5 -0
  40. package/dist/test-fixtures/config.d.ts.map +1 -0
  41. package/dist/test-fixtures/config.js +14 -0
  42. package/dist/test-fixtures/config.js.map +1 -0
  43. package/dist/test-fixtures/hooks.d.ts +8 -0
  44. package/dist/test-fixtures/hooks.d.ts.map +1 -0
  45. package/dist/test-fixtures/hooks.js +77 -0
  46. package/dist/test-fixtures/hooks.js.map +1 -0
  47. package/dist/test-fixtures/index.d.ts +3 -0
  48. package/dist/test-fixtures/index.d.ts.map +1 -0
  49. package/dist/test-fixtures/index.js +19 -0
  50. package/dist/test-fixtures/index.js.map +1 -0
  51. package/dist/test.d.ts +11 -0
  52. package/dist/test.d.ts.map +1 -0
  53. package/dist/test.js +41 -0
  54. package/dist/test.js.map +1 -0
  55. package/dist/types.d.ts +14 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +11 -0
  58. package/dist/types.js.map +1 -0
  59. package/migrations/01_postgres_event_store/migration.sql +10 -0
  60. package/package.json +67 -0
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostgresConfig = void 0;
4
+ class PostgresConfig {
5
+ host;
6
+ database;
7
+ user;
8
+ port;
9
+ password;
10
+ pool;
11
+ constructor(config) {
12
+ this.database = config.database;
13
+ this.password = config.password;
14
+ this.host = config.host ?? "localhost";
15
+ this.user = config.user ?? "postgres";
16
+ this.port = config.port ?? 5432;
17
+ this.pool = config.pool;
18
+ }
19
+ static fromUrl(value) {
20
+ return new PostgresConfig(PostgresConfig.parseUrl(value));
21
+ }
22
+ /**
23
+ * Creates a PostgresConfig from environment variables.
24
+ *
25
+ * @param prefix - Environment variable prefix
26
+ * @param options - Loading options (mode: "url" | "fields")
27
+ * @throws Error if required environment variables are not set
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * // URL mode (default): reads ASSIGNMENT_DB_URL
32
+ * const config = PostgresConfig.fromEnv("ASSIGNMENT_DB");
33
+ *
34
+ * // Fields mode: reads POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DATABASE, POSTGRES_USER, POSTGRES_PASSWORD
35
+ * const config = PostgresConfig.fromEnv("POSTGRES", { mode: "fields" });
36
+ * ```
37
+ */
38
+ static fromEnv(prefix, options) {
39
+ const mode = options?.mode ?? "url";
40
+ if (mode === "url") {
41
+ const envKey = `${prefix}_URL`;
42
+ const url = process.env[envKey];
43
+ if (!url) {
44
+ throw new Error(`Environment variable ${envKey} is not set`);
45
+ }
46
+ return PostgresConfig.fromUrl(url);
47
+ }
48
+ // fields mode
49
+ const database = process.env[`${prefix}_DATABASE`];
50
+ if (!database) {
51
+ throw new Error(`Environment variable ${prefix}_DATABASE is not set`);
52
+ }
53
+ return new PostgresConfig({
54
+ database,
55
+ host: process.env[`${prefix}_HOST`],
56
+ port: process.env[`${prefix}_PORT`]
57
+ ? parseInt(process.env[`${prefix}_PORT`])
58
+ : undefined,
59
+ user: process.env[`${prefix}_USER`],
60
+ password: process.env[`${prefix}_PASSWORD`],
61
+ });
62
+ }
63
+ static parseUrl(value) {
64
+ const regex = /postgres(ql)?:\/\/(?<user>[^:/]+)(:(?<password>[^@]+))?@(?<host>[^:/]+)(:(?<port>\d+))?\/(?<database>.+)/;
65
+ const matches = value.match(regex);
66
+ if (!matches?.groups) {
67
+ throw new Error(`Invalid postgres url: ${value}`);
68
+ }
69
+ const { user, password, host, port, database } = matches.groups;
70
+ return {
71
+ host,
72
+ database,
73
+ user,
74
+ port: port ? parseInt(port) : 5432,
75
+ password,
76
+ };
77
+ }
78
+ withDatabase(database) {
79
+ return new PostgresConfig({
80
+ host: this.host,
81
+ database,
82
+ user: this.user,
83
+ port: this.port,
84
+ password: this.password,
85
+ pool: this.pool,
86
+ });
87
+ }
88
+ withUser(user) {
89
+ return new PostgresConfig({
90
+ host: this.host,
91
+ database: this.database,
92
+ user,
93
+ port: this.port,
94
+ password: this.password,
95
+ pool: this.pool,
96
+ });
97
+ }
98
+ withPassword(password) {
99
+ return new PostgresConfig({
100
+ host: this.host,
101
+ database: this.database,
102
+ user: this.user,
103
+ port: this.port,
104
+ password,
105
+ pool: this.pool,
106
+ });
107
+ }
108
+ withHost(host) {
109
+ return new PostgresConfig({
110
+ host,
111
+ database: this.database,
112
+ user: this.user,
113
+ port: this.port,
114
+ password: this.password,
115
+ pool: this.pool,
116
+ });
117
+ }
118
+ withPort(port) {
119
+ return new PostgresConfig({
120
+ host: this.host,
121
+ database: this.database,
122
+ user: this.user,
123
+ port,
124
+ password: this.password,
125
+ pool: this.pool,
126
+ });
127
+ }
128
+ withPoolSize(size) {
129
+ return new PostgresConfig({
130
+ host: this.host,
131
+ database: this.database,
132
+ user: this.user,
133
+ port: this.port,
134
+ password: this.password,
135
+ pool: { ...this.pool, size },
136
+ });
137
+ }
138
+ withConnectionTimeout(connectionTimeout) {
139
+ return new PostgresConfig({
140
+ host: this.host,
141
+ database: this.database,
142
+ user: this.user,
143
+ port: this.port,
144
+ password: this.password,
145
+ pool: { ...this.pool, connectionTimeout },
146
+ });
147
+ }
148
+ withIdleTimeout(idleTimeout) {
149
+ return new PostgresConfig({
150
+ host: this.host,
151
+ database: this.database,
152
+ user: this.user,
153
+ port: this.port,
154
+ password: this.password,
155
+ pool: { ...this.pool, idleTimeout },
156
+ });
157
+ }
158
+ toString() {
159
+ let url = `postgres://${this.user}`;
160
+ if (this.password) {
161
+ url += `:${this.password}`;
162
+ }
163
+ url += `@${this.host}:${this.port}/${this.database}`;
164
+ const queryParams = [];
165
+ if (this.pool?.size !== undefined) {
166
+ queryParams.push(`pool_size=${this.pool.size}`);
167
+ }
168
+ if (this.pool?.connectionTimeout !== undefined) {
169
+ queryParams.push(`connection_timeout=${this.pool.connectionTimeout}`);
170
+ }
171
+ if (this.pool?.idleTimeout !== undefined) {
172
+ queryParams.push(`idle_timeout=${this.pool.idleTimeout}`);
173
+ }
174
+ if (queryParams.length > 0) {
175
+ url += `?${queryParams.join("&")}`;
176
+ }
177
+ return url;
178
+ }
179
+ }
180
+ exports.PostgresConfig = PostgresConfig;
181
+ //# sourceMappingURL=postgres-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-config.js","sourceRoot":"","sources":["../../src/config/postgres-config.ts"],"names":[],"mappings":";;;AAiBA,MAAa,cAAc;IACP,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,IAAI,CAAS;IACb,IAAI,CAAS;IACb,QAAQ,CAAU;IAClB,IAAI,CAAe;IAEnC,YAAY,MAOX;QACG,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,OAAO,CAAC,KAAa;QAC/B,OAAO,IAAI,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACI,MAAM,CAAC,OAAO,CACjB,MAAc,EACd,OAAwB;QAExB,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC;QAEpC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;YAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEhC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,aAAa,CAAC,CAAC;YACjE,CAAC;YAED,OAAO,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,cAAc;QACd,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACX,wBAAwB,MAAM,sBAAsB,CACvD,CAAC;QACN,CAAC;QAED,OAAO,IAAI,cAAc,CAAC;YACtB,QAAQ;YACR,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC;YACnC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC;gBAC/B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,OAAO,CAAE,CAAC;gBAC1C,CAAC,CAAC,SAAS;YACf,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC;YACnC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,WAAW,CAAC;SAC9C,CAAC,CAAC;IACP,CAAC;IAEO,MAAM,CAAC,QAAQ,CAAC,KAAa;QACjC,MAAM,KAAK,GACP,0GAA0G,CAAC;QAE/G,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEhE,OAAO;YACH,IAAI;YACJ,QAAQ;YACR,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YAClC,QAAQ;SACX,CAAC;IACN,CAAC;IAEM,YAAY,CAAC,QAAgB;QAChC,OAAO,IAAI,cAAc,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ;YACR,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;SAClB,CAAC,CAAC;IACP,CAAC;IAEM,QAAQ,CAAC,IAAY;QACxB,OAAO,IAAI,cAAc,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;SAClB,CAAC,CAAC;IACP,CAAC;IAEM,YAAY,CAAC,QAAgB;QAChC,OAAO,IAAI,cAAc,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ;YACR,IAAI,EAAE,IAAI,CAAC,IAAI;SAClB,CAAC,CAAC;IACP,CAAC;IAEM,QAAQ,CAAC,IAAY;QACxB,OAAO,IAAI,cAAc,CAAC;YACtB,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;SAClB,CAAC,CAAC;IACP,CAAC;IAEM,QAAQ,CAAC,IAAY;QACxB,OAAO,IAAI,cAAc,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;SAClB,CAAC,CAAC;IACP,CAAC;IAEM,YAAY,CAAC,IAAY;QAC5B,OAAO,IAAI,cAAc,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;SAC/B,CAAC,CAAC;IACP,CAAC;IAEM,qBAAqB,CAAC,iBAAyB;QAClD,OAAO,IAAI,cAAc,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE;SAC5C,CAAC,CAAC;IACP,CAAC;IAEM,eAAe,CAAC,WAAmB;QACtC,OAAO,IAAI,cAAc,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;SACtC,CAAC,CAAC;IACP,CAAC;IAEM,QAAQ;QACX,IAAI,GAAG,GAAG,cAAc,IAAI,CAAC,IAAI,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC;QACD,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAErD,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAChC,WAAW,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAC7C,WAAW,CAAC,IAAI,CACZ,sBAAsB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CACtD,CAAC;QACN,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;YACvC,WAAW,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,GAAG,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;CACJ;AAxND,wCAwNC"}
@@ -0,0 +1,57 @@
1
+ import * as pg from "pg";
2
+ import { PostgresConfig } from "./config";
3
+ export declare class ClientWrapper {
4
+ protected client: pg.Client;
5
+ getClient(): pg.Client;
6
+ constructor(urlOrClient: PostgresConfig | string | pg.Client);
7
+ protected withClient<T = unknown>(work: (client: pg.Client) => Promise<T>): Promise<T>;
8
+ query<R = any>(query: string, params?: any[]): Promise<Array<R>>;
9
+ close(): Promise<void>;
10
+ }
11
+ export declare class DatabaseManager extends ClientWrapper {
12
+ createDatabase(name: string): Promise<void>;
13
+ dropDatabase(name: string): Promise<void>;
14
+ }
15
+ export declare class MigrationManager extends ClientWrapper {
16
+ private namespace?;
17
+ tableManager: TableManager;
18
+ private static readonly MIGRATION_TABLE;
19
+ private static withNamespace;
20
+ private static stripNamespace;
21
+ private static hasNamespace;
22
+ constructor(urlOrClient: string | pg.Client, namespace?: string | undefined);
23
+ open(): Promise<void>;
24
+ ensureMigrationTableCreated(): Promise<void>;
25
+ getAppliedMigrations(): Promise<string[]>;
26
+ private stripNamespaceFromMigrations;
27
+ applyMigrations(migrations: Array<{
28
+ name: string;
29
+ sql: string;
30
+ }>): Promise<void>;
31
+ private markMigrationsAsApplied;
32
+ getMigrationsToApply(dir: string): Promise<Array<{
33
+ name: string;
34
+ sql: string;
35
+ }>>;
36
+ private getMigrationsFromFileSystem;
37
+ }
38
+ export declare class TableManager extends ClientWrapper {
39
+ getTableSchema(tableName: string): Promise<Array<{
40
+ column: string;
41
+ type: string;
42
+ }>>;
43
+ tableExists(tableName: string): Promise<boolean>;
44
+ createTable(name: string, columns: Array<{
45
+ name: string;
46
+ property: string;
47
+ }>): Promise<void>;
48
+ dropTable(name: string): Promise<void>;
49
+ truncateTable(name: string): Promise<void>;
50
+ truncateAllTables(): Promise<void>;
51
+ dropAllTables(): Promise<void>;
52
+ private getTableNames;
53
+ }
54
+ export declare function runInsideTransaction<T = unknown>(client: pg.Client, fn: (client: pg.Client) => Promise<T>): Promise<T>;
55
+ export declare function ensureConnection(client: pg.Client): Promise<void>;
56
+ export declare function isDatabaseError(e: any): e is pg.DatabaseError;
57
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,276 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.TableManager = exports.MigrationManager = exports.DatabaseManager = exports.ClientWrapper = void 0;
40
+ exports.runInsideTransaction = runInsideTransaction;
41
+ exports.ensureConnection = ensureConnection;
42
+ exports.isDatabaseError = isDatabaseError;
43
+ const promises_1 = __importDefault(require("node:fs/promises"));
44
+ const node_path_1 = __importDefault(require("node:path"));
45
+ const pg = __importStar(require("pg"));
46
+ const config_1 = require("./config");
47
+ class ClientWrapper {
48
+ client;
49
+ getClient() {
50
+ return this.client;
51
+ }
52
+ constructor(urlOrClient) {
53
+ if (urlOrClient instanceof config_1.PostgresConfig ||
54
+ typeof urlOrClient === "string") {
55
+ this.client = new pg.Client({
56
+ connectionString: urlOrClient.toString(),
57
+ });
58
+ }
59
+ else {
60
+ this.client = urlOrClient;
61
+ }
62
+ }
63
+ async withClient(work) {
64
+ await ensureConnection(this.client);
65
+ return work(this.client);
66
+ }
67
+ async query(query, params) {
68
+ const result = await this.withClient((client) => client.query(query, params));
69
+ return result.rows;
70
+ }
71
+ async close() {
72
+ await this.client.end();
73
+ }
74
+ }
75
+ exports.ClientWrapper = ClientWrapper;
76
+ class DatabaseManager extends ClientWrapper {
77
+ async createDatabase(name) {
78
+ const exists = await this.query(`SELECT 1 FROM pg_database WHERE datname = '${name}'`);
79
+ if (exists.length === 0) {
80
+ await this.client.query(`CREATE DATABASE ${name}`);
81
+ }
82
+ }
83
+ async dropDatabase(name) {
84
+ await this.query(`DROP DATABASE IF EXISTS ${name}`);
85
+ }
86
+ }
87
+ exports.DatabaseManager = DatabaseManager;
88
+ class MigrationManager extends ClientWrapper {
89
+ namespace;
90
+ tableManager;
91
+ static MIGRATION_TABLE = [
92
+ "hexai__migrations",
93
+ [
94
+ {
95
+ name: "name",
96
+ property: "VARCHAR(255) NOT NULL",
97
+ },
98
+ {
99
+ name: "applied_at",
100
+ property: "TIMESTAMP NOT NULL DEFAULT NOW()",
101
+ },
102
+ ],
103
+ ];
104
+ static withNamespace(namespace, name) {
105
+ return namespace ? `${namespace}__${name}` : name;
106
+ }
107
+ static stripNamespace(namespace, name) {
108
+ return namespace ? name.replace(`${namespace}__`, "") : name;
109
+ }
110
+ static hasNamespace(namespace, name) {
111
+ return namespace ? name.startsWith(`${namespace}__`) : false;
112
+ }
113
+ constructor(urlOrClient, namespace) {
114
+ super(urlOrClient);
115
+ this.namespace = namespace;
116
+ this.tableManager = new TableManager(this.client);
117
+ }
118
+ async open() {
119
+ await this.ensureMigrationTableCreated();
120
+ }
121
+ async ensureMigrationTableCreated() {
122
+ const exists = await this.tableManager.tableExists(MigrationManager.MIGRATION_TABLE[0]);
123
+ if (exists) {
124
+ return;
125
+ }
126
+ await this.tableManager.createTable(...MigrationManager.MIGRATION_TABLE);
127
+ }
128
+ async getAppliedMigrations() {
129
+ const queryResult = await this.query(`SELECT name FROM hexai__migrations ORDER BY applied_at ASC;`);
130
+ let migrations = queryResult.map((row) => row.name);
131
+ migrations = this.stripNamespaceFromMigrations(migrations);
132
+ return migrations;
133
+ }
134
+ stripNamespaceFromMigrations(migrations) {
135
+ if (!this.namespace) {
136
+ return migrations;
137
+ }
138
+ return migrations
139
+ .filter((name) => MigrationManager.hasNamespace(this.namespace, name))
140
+ .map((name) => MigrationManager.stripNamespace(this.namespace, name));
141
+ }
142
+ async applyMigrations(migrations) {
143
+ const client = this.getClient();
144
+ await runInsideTransaction(client, async () => {
145
+ for (const migration of migrations) {
146
+ await Promise.all([
147
+ this.query(migration.sql),
148
+ this.markMigrationsAsApplied(migration.name),
149
+ ]);
150
+ }
151
+ });
152
+ }
153
+ async markMigrationsAsApplied(...migrations) {
154
+ for (const migration of migrations) {
155
+ await this.query(`INSERT INTO hexai__migrations (name) VALUES ($1);`, [migration]);
156
+ }
157
+ }
158
+ async getMigrationsToApply(dir) {
159
+ const migrations = await this.getMigrationsFromFileSystem(dir);
160
+ const appliedMigrations = await this.getAppliedMigrations();
161
+ // check that all applied migrations are in the migrations directory
162
+ for (const appliedMigration of appliedMigrations) {
163
+ if (!migrations.includes(appliedMigration)) {
164
+ throw new Error(`Applied migration ${appliedMigration} not found in migrations directory`);
165
+ }
166
+ }
167
+ const prevMaxMigrationIndex = Math.max(...migrations.map((name) => appliedMigrations.indexOf(name)));
168
+ const migrationsToApply = migrations.slice(prevMaxMigrationIndex + 1);
169
+ return Promise.all(migrationsToApply.map(async (migrationDir) => {
170
+ const migrationPath = node_path_1.default.join(dir, migrationDir, "migration.sql");
171
+ const sql = await promises_1.default.readFile(migrationPath, "utf-8");
172
+ return {
173
+ name: MigrationManager.withNamespace(this.namespace, migrationDir),
174
+ sql,
175
+ };
176
+ }));
177
+ }
178
+ async getMigrationsFromFileSystem(dir) {
179
+ const migrationDirs = (await promises_1.default.readdir(dir, { withFileTypes: true }))
180
+ .filter((dirent) => dirent.isDirectory())
181
+ .map((dirent) => dirent.name)
182
+ .sort();
183
+ return migrationDirs;
184
+ }
185
+ }
186
+ exports.MigrationManager = MigrationManager;
187
+ class TableManager extends ClientWrapper {
188
+ async getTableSchema(tableName) {
189
+ const result = await this.query(`
190
+ SELECT
191
+ column_name AS column,
192
+ data_type AS type
193
+ FROM information_schema.columns
194
+ WHERE table_name = '${tableName}';
195
+ `);
196
+ return result.map((row) => ({
197
+ column: row.column,
198
+ type: row.type,
199
+ }));
200
+ }
201
+ async tableExists(tableName) {
202
+ const result = await this.query(`
203
+ SELECT
204
+ table_name
205
+ FROM information_schema.tables
206
+ WHERE table_name = '${tableName}';
207
+ `);
208
+ return result.length > 0;
209
+ }
210
+ async createTable(name, columns) {
211
+ if (await this.tableExists(name)) {
212
+ return;
213
+ }
214
+ const query = `
215
+ CREATE TABLE ${name} (
216
+ ${columns
217
+ .map((column) => `${column.name} ${column.property}`)
218
+ .join(", ")}
219
+ );
220
+ `;
221
+ await this.query(query);
222
+ }
223
+ async dropTable(name) {
224
+ await this.query(`DROP TABLE IF EXISTS "${name}";`);
225
+ }
226
+ async truncateTable(name) {
227
+ await this.query(`TRUNCATE TABLE "${name}" RESTART IDENTITY CASCADE;`);
228
+ }
229
+ async truncateAllTables() {
230
+ const tables = await this.getTableNames();
231
+ await Promise.all(tables.map((table) => this.truncateTable(table)));
232
+ }
233
+ async dropAllTables() {
234
+ const tables = await this.getTableNames();
235
+ await Promise.all(tables.map((table) => this.dropTable(table)));
236
+ }
237
+ async getTableNames() {
238
+ const result = await this.query(`
239
+ SELECT table_name
240
+ FROM information_schema.tables
241
+ WHERE table_schema = 'public'
242
+ AND table_type = 'BASE TABLE';
243
+ `);
244
+ return result.map((row) => row.table_name);
245
+ }
246
+ }
247
+ exports.TableManager = TableManager;
248
+ async function runInsideTransaction(client, fn) {
249
+ await client.query("BEGIN");
250
+ try {
251
+ const result = await fn(client);
252
+ await client.query("COMMIT");
253
+ return result;
254
+ }
255
+ catch (e) {
256
+ await client.query("ROLLBACK");
257
+ throw e;
258
+ }
259
+ }
260
+ async function ensureConnection(client) {
261
+ try {
262
+ await client.connect();
263
+ }
264
+ catch (e) {
265
+ if (e.message.includes("already")) {
266
+ // ignore
267
+ }
268
+ else {
269
+ throw e;
270
+ }
271
+ }
272
+ }
273
+ function isDatabaseError(e) {
274
+ return e instanceof Error && "code" in e;
275
+ }
276
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from "./postgres-unit-of-work";
2
+ export * from "./run-migrations";
3
+ export * from "./run-hexai-migrations";
4
+ export { ClientWrapper, DatabaseManager, TableManager, ensureConnection, } from "./helpers";
5
+ export * from "./postgres-event-store";
6
+ export * from "./config";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EACH,aAAa,EACb,eAAe,EACf,YAAY,EACZ,gBAAgB,GACnB,MAAM,WAAW,CAAC;AACnB,cAAc,wBAAwB,CAAC;AAGvC,cAAc,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ensureConnection = exports.TableManager = exports.DatabaseManager = exports.ClientWrapper = void 0;
18
+ __exportStar(require("./postgres-unit-of-work"), exports);
19
+ __exportStar(require("./run-migrations"), exports);
20
+ __exportStar(require("./run-hexai-migrations"), exports);
21
+ var helpers_1 = require("./helpers");
22
+ Object.defineProperty(exports, "ClientWrapper", { enumerable: true, get: function () { return helpers_1.ClientWrapper; } });
23
+ Object.defineProperty(exports, "DatabaseManager", { enumerable: true, get: function () { return helpers_1.DatabaseManager; } });
24
+ Object.defineProperty(exports, "TableManager", { enumerable: true, get: function () { return helpers_1.TableManager; } });
25
+ Object.defineProperty(exports, "ensureConnection", { enumerable: true, get: function () { return helpers_1.ensureConnection; } });
26
+ __exportStar(require("./postgres-event-store"), exports);
27
+ // Config exports
28
+ __exportStar(require("./config"), exports);
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,mDAAiC;AACjC,yDAAuC;AACvC,qCAKmB;AAJf,wGAAA,aAAa,OAAA;AACb,0GAAA,eAAe,OAAA;AACf,uGAAA,YAAY,OAAA;AACZ,2GAAA,gBAAgB,OAAA;AAEpB,yDAAuC;AAEvC,iBAAiB;AACjB,2CAAyB"}
@@ -0,0 +1,18 @@
1
+ import { Client, PoolClient } from "pg";
2
+ import { Message, EventStore, EventStoreFetchResult, StoredEvent } from "@hexaijs/core";
3
+ type PgClient = Client | PoolClient;
4
+ export interface PostgresEventStoreConfig {
5
+ tableName?: string;
6
+ }
7
+ export declare class PostgresEventStore implements EventStore {
8
+ private readonly client;
9
+ private readonly tableName;
10
+ constructor(client: PgClient, config?: PostgresEventStoreConfig);
11
+ store(event: Message): Promise<StoredEvent>;
12
+ storeAll(events: Message[]): Promise<StoredEvent[]>;
13
+ fetch(afterPosition: number, limit?: number): Promise<EventStoreFetchResult>;
14
+ getLastPosition(): Promise<number>;
15
+ private deserializeRow;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=postgres-event-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-event-store.d.ts","sourceRoot":"","sources":["../src/postgres-event-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EACH,OAAO,EACP,UAAU,EACV,qBAAqB,EACrB,WAAW,EACd,MAAM,eAAe,CAAC;AAEvB,KAAK,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAKpC,MAAM,WAAW,wBAAwB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,qBAAa,kBAAmB,YAAW,UAAU;IAI7C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAH3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGd,MAAM,EAAE,QAAQ,EACjC,MAAM,GAAE,wBAA6B;IAKnC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAoB3C,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAkCnD,KAAK,CACP,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC;IA4B3B,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAQxC,OAAO,CAAC,cAAc;CAWzB"}