@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.
- package/LICENSE +21 -0
- package/README.md +318 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +19 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/postgres-config-spec.d.ts +32 -0
- package/dist/config/postgres-config-spec.d.ts.map +1 -0
- package/dist/config/postgres-config-spec.js +49 -0
- package/dist/config/postgres-config-spec.js.map +1 -0
- package/dist/config/postgres-config.d.ts +59 -0
- package/dist/config/postgres-config.d.ts.map +1 -0
- package/dist/config/postgres-config.js +181 -0
- package/dist/config/postgres-config.js.map +1 -0
- package/dist/helpers.d.ts +57 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +276 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/postgres-event-store.d.ts +18 -0
- package/dist/postgres-event-store.d.ts.map +1 -0
- package/dist/postgres-event-store.js +83 -0
- package/dist/postgres-event-store.js.map +1 -0
- package/dist/postgres-unit-of-work.d.ts +17 -0
- package/dist/postgres-unit-of-work.d.ts.map +1 -0
- package/dist/postgres-unit-of-work.js +251 -0
- package/dist/postgres-unit-of-work.js.map +1 -0
- package/dist/run-hexai-migrations.d.ts +3 -0
- package/dist/run-hexai-migrations.d.ts.map +1 -0
- package/dist/run-hexai-migrations.js +17 -0
- package/dist/run-hexai-migrations.js.map +1 -0
- package/dist/run-migrations.d.ts +11 -0
- package/dist/run-migrations.d.ts.map +1 -0
- package/dist/run-migrations.js +202 -0
- package/dist/run-migrations.js.map +1 -0
- package/dist/test-fixtures/config.d.ts +5 -0
- package/dist/test-fixtures/config.d.ts.map +1 -0
- package/dist/test-fixtures/config.js +14 -0
- package/dist/test-fixtures/config.js.map +1 -0
- package/dist/test-fixtures/hooks.d.ts +8 -0
- package/dist/test-fixtures/hooks.d.ts.map +1 -0
- package/dist/test-fixtures/hooks.js +77 -0
- package/dist/test-fixtures/hooks.js.map +1 -0
- package/dist/test-fixtures/index.d.ts +3 -0
- package/dist/test-fixtures/index.d.ts.map +1 -0
- package/dist/test-fixtures/index.js +19 -0
- package/dist/test-fixtures/index.js.map +1 -0
- package/dist/test.d.ts +11 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +41 -0
- package/dist/test.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/migrations/01_postgres_event_store/migration.sql +10 -0
- 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":"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"}
|
|
@@ -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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"}
|
package/dist/helpers.js
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|