@zmdb/postgres 1.0.0-beta.1
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 +674 -0
- package/README.md +111 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +14 -0
- package/dist/constants.js.map +1 -0
- package/dist/driver.d.ts +27 -0
- package/dist/driver.d.ts.map +1 -0
- package/dist/driver.js +266 -0
- package/dist/driver.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect.d.ts +8 -0
- package/dist/introspect.d.ts.map +1 -0
- package/dist/introspect.js +489 -0
- package/dist/introspect.js.map +1 -0
- package/dist/migrations.d.ts +7 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +452 -0
- package/dist/migrations.js.map +1 -0
- package/dist/outbox.d.ts +6 -0
- package/dist/outbox.d.ts.map +1 -0
- package/dist/outbox.js +33 -0
- package/dist/outbox.js.map +1 -0
- package/package.json +59 -0
- package/src/constants.ts +14 -0
- package/src/driver.ts +331 -0
- package/src/index.ts +105 -0
- package/src/introspect.ts +645 -0
- package/src/migrations.ts +576 -0
- package/src/outbox.ts +42 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { UnsupportedFeatureError, } from '@zmdb/sql';
|
|
2
|
+
import {} from '@zmdb/sql/schema-objects';
|
|
3
|
+
import { POSTGRES_TYPES } from './constants.js';
|
|
4
|
+
const EXTENSION_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
5
|
+
const INDEX_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
6
|
+
const INDEX_OPTIONS = {
|
|
7
|
+
btree: [],
|
|
8
|
+
hash: [],
|
|
9
|
+
gin: [],
|
|
10
|
+
gist: [],
|
|
11
|
+
brin: [],
|
|
12
|
+
ivfflat: ['lists'],
|
|
13
|
+
hnsw: ['m', 'ef_construction'],
|
|
14
|
+
};
|
|
15
|
+
function quoteIdentifier(identifier) {
|
|
16
|
+
return `"${identifier.replaceAll('"', '""')}"`;
|
|
17
|
+
}
|
|
18
|
+
function quoteLiteral(value) {
|
|
19
|
+
return `'${value.replaceAll("'", "''")}'`;
|
|
20
|
+
}
|
|
21
|
+
function qualifiedTable(schema, table) {
|
|
22
|
+
return schema === undefined ? quoteIdentifier(table) : `${quoteIdentifier(schema)}.${quoteIdentifier(table)}`;
|
|
23
|
+
}
|
|
24
|
+
function extensionTypeDdl(type) {
|
|
25
|
+
if (!EXTENSION_IDENTIFIER.test(type.name)) {
|
|
26
|
+
throw new TypeError(`extension type name ${JSON.stringify(type.name)} is not a SQL identifier`);
|
|
27
|
+
}
|
|
28
|
+
const rendered = (type.args ?? []).map(argument => {
|
|
29
|
+
if (typeof argument === 'number' && Number.isFinite(argument))
|
|
30
|
+
return String(argument);
|
|
31
|
+
if (typeof argument === 'string' && EXTENSION_IDENTIFIER.test(argument))
|
|
32
|
+
return argument;
|
|
33
|
+
throw new TypeError(`extension type ${type.name} argument ${JSON.stringify(argument)} must be a finite number or SQL identifier`);
|
|
34
|
+
});
|
|
35
|
+
return `${type.name}${rendered.length === 0 ? '' : `(${rendered.join(',')})`}`;
|
|
36
|
+
}
|
|
37
|
+
function scalarType(types, type) {
|
|
38
|
+
const values = types;
|
|
39
|
+
return values[type] ?? type;
|
|
40
|
+
}
|
|
41
|
+
function postgresDdlType(types, column) {
|
|
42
|
+
if (typeof column.type !== 'string')
|
|
43
|
+
return extensionTypeDdl(column.type);
|
|
44
|
+
const mapped = scalarType(types, column.type);
|
|
45
|
+
if (column.type === 'varchar' && column.length !== undefined && mapped === 'VARCHAR') {
|
|
46
|
+
return `${mapped}(${column.length})`;
|
|
47
|
+
}
|
|
48
|
+
return mapped;
|
|
49
|
+
}
|
|
50
|
+
function columnDdl(types, column, key = {
|
|
51
|
+
inline: column.primaryKey,
|
|
52
|
+
tableLevel: false,
|
|
53
|
+
}) {
|
|
54
|
+
const primaryKey = key.inline ? ' PRIMARY KEY' : '';
|
|
55
|
+
const notNull = !key.inline && (!column.nullable || key.tableLevel) ? ' NOT NULL' : '';
|
|
56
|
+
return `${quoteIdentifier(column.name)} ${postgresDdlType(types, column)}${primaryKey}${notNull}`;
|
|
57
|
+
}
|
|
58
|
+
function primaryKeyDdl(columns) {
|
|
59
|
+
return `PRIMARY KEY (${columns.map(quoteIdentifier).join(', ')})`;
|
|
60
|
+
}
|
|
61
|
+
function referentialActionDdl(action) {
|
|
62
|
+
return action.toUpperCase();
|
|
63
|
+
}
|
|
64
|
+
function foreignKeyDdl(foreignKey) {
|
|
65
|
+
const columns = foreignKey.columns.map(quoteIdentifier).join(', ');
|
|
66
|
+
const targetColumns = foreignKey.targetColumns.map(quoteIdentifier).join(', ');
|
|
67
|
+
return (`FOREIGN KEY (${columns}) REFERENCES ${quoteIdentifier(foreignKey.targetTable)} (${targetColumns}) ` +
|
|
68
|
+
`ON DELETE ${referentialActionDdl(foreignKey.onDelete)} ` +
|
|
69
|
+
`ON UPDATE ${referentialActionDdl(foreignKey.onUpdate)}`);
|
|
70
|
+
}
|
|
71
|
+
function createTableDdl(types, operation) {
|
|
72
|
+
const inline = operation.primaryKey.length === 1 ? operation.primaryKey[0] : undefined;
|
|
73
|
+
const tableLevel = operation.primaryKey.length > 1 ? new Set(operation.primaryKey) : undefined;
|
|
74
|
+
const definitions = operation.columns.map(column => columnDdl(types, column, {
|
|
75
|
+
inline: column.name === inline,
|
|
76
|
+
tableLevel: tableLevel?.has(column.name) === true,
|
|
77
|
+
}));
|
|
78
|
+
if (operation.primaryKey.length > 1)
|
|
79
|
+
definitions.push(primaryKeyDdl(operation.primaryKey));
|
|
80
|
+
return `CREATE TABLE ${quoteIdentifier(operation.table)} (${definitions.join(', ')})`;
|
|
81
|
+
}
|
|
82
|
+
function alterPrimaryKeyDdl(table, from, to) {
|
|
83
|
+
const clauses = [];
|
|
84
|
+
if (from.length > 0)
|
|
85
|
+
clauses.push(`DROP CONSTRAINT ${quoteIdentifier(`${table}_pkey`)}`);
|
|
86
|
+
if (to.length > 0)
|
|
87
|
+
clauses.push(`ADD ${primaryKeyDdl(to)}`);
|
|
88
|
+
if (clauses.length === 0)
|
|
89
|
+
throw new Error(`primary key change for "${table}" has no before or after columns`);
|
|
90
|
+
return `ALTER TABLE ${quoteIdentifier(table)} ${clauses.join(', ')}`;
|
|
91
|
+
}
|
|
92
|
+
function addForeignKeyDdl(table, foreignKey) {
|
|
93
|
+
return (`ALTER TABLE ${quoteIdentifier(table)} ADD CONSTRAINT ${quoteIdentifier(foreignKey.name)} ` +
|
|
94
|
+
foreignKeyDdl(foreignKey));
|
|
95
|
+
}
|
|
96
|
+
function dropForeignKeyDdl(table, name) {
|
|
97
|
+
return `ALTER TABLE ${quoteIdentifier(table)} DROP CONSTRAINT ${quoteIdentifier(name)}`;
|
|
98
|
+
}
|
|
99
|
+
function createExtensionDdl(definition) {
|
|
100
|
+
const schema = definition.schema === undefined ? '' : ` WITH SCHEMA ${quoteIdentifier(definition.schema)}`;
|
|
101
|
+
const version = definition.version === undefined ? '' : ` VERSION ${quoteLiteral(definition.version)}`;
|
|
102
|
+
return `CREATE EXTENSION IF NOT EXISTS ${quoteIdentifier(definition.name)}${schema}${version}`;
|
|
103
|
+
}
|
|
104
|
+
function isIndexMethod(value) {
|
|
105
|
+
return Object.hasOwn(INDEX_OPTIONS, value);
|
|
106
|
+
}
|
|
107
|
+
function indexMethod(value, definition) {
|
|
108
|
+
if (value === undefined)
|
|
109
|
+
return undefined;
|
|
110
|
+
if (typeof value === 'string' && isIndexMethod(value))
|
|
111
|
+
return value;
|
|
112
|
+
throw new TypeError(`invalid index method ${JSON.stringify(value)} ("${definition.name}")`);
|
|
113
|
+
}
|
|
114
|
+
function indexOptions(definition, method) {
|
|
115
|
+
const options = definition.with;
|
|
116
|
+
if (options === undefined || Object.keys(options).length === 0)
|
|
117
|
+
return '';
|
|
118
|
+
if (method === undefined) {
|
|
119
|
+
throw new TypeError(`index options require a method ("${definition.name}")`);
|
|
120
|
+
}
|
|
121
|
+
const allowed = INDEX_OPTIONS[method];
|
|
122
|
+
for (const key of Object.keys(options)) {
|
|
123
|
+
if (!allowed.includes(key)) {
|
|
124
|
+
throw new TypeError(`${method} does not take the option \`${key}\` ("${definition.name}"); ` +
|
|
125
|
+
`${method} options are (${allowed.join(', ')})`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const rendered = [];
|
|
129
|
+
for (const key of allowed) {
|
|
130
|
+
const value = options[key];
|
|
131
|
+
if (value === undefined)
|
|
132
|
+
continue;
|
|
133
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
134
|
+
throw new TypeError(`${method} option \`${key}\` must be a non-negative integer ("${definition.name}")`);
|
|
135
|
+
}
|
|
136
|
+
rendered.push(`${key} = ${value}`);
|
|
137
|
+
}
|
|
138
|
+
return rendered.length === 0 ? '' : ` WITH (${rendered.join(', ')})`;
|
|
139
|
+
}
|
|
140
|
+
function isExpressionColumn(column) {
|
|
141
|
+
return Object.hasOwn(column, 'expr');
|
|
142
|
+
}
|
|
143
|
+
function renderIndexColumn(column, definition) {
|
|
144
|
+
if (typeof column === 'string')
|
|
145
|
+
return quoteIdentifier(column);
|
|
146
|
+
const expression = isExpressionColumn(column);
|
|
147
|
+
const value = expression ? column.expr : column.column;
|
|
148
|
+
const rendered = expression ? value : quoteIdentifier(value);
|
|
149
|
+
if (column.opclass === undefined)
|
|
150
|
+
return rendered;
|
|
151
|
+
if (!INDEX_IDENTIFIER.test(column.opclass)) {
|
|
152
|
+
throw new TypeError(`index operator class ${JSON.stringify(column.opclass)} is not a SQL identifier ("${definition.name}")`);
|
|
153
|
+
}
|
|
154
|
+
return `${rendered} ${column.opclass}`;
|
|
155
|
+
}
|
|
156
|
+
function createIndexDdl(definition) {
|
|
157
|
+
const method = indexMethod(definition.method, definition);
|
|
158
|
+
if (definition.unique === true && method !== undefined && method !== 'btree') {
|
|
159
|
+
throw new UnsupportedFeatureError(`unique ${method} index`, 'postgres', `postgres does not support a unique ${method} index ("${definition.name}" on "${definition.table}")`);
|
|
160
|
+
}
|
|
161
|
+
const columns = definition.columns.map(column => renderIndexColumn(column, definition)).join(', ');
|
|
162
|
+
const unique = definition.unique === true ? 'UNIQUE ' : '';
|
|
163
|
+
const using = method === undefined ? '' : ` USING ${method}`;
|
|
164
|
+
const where = definition.where === undefined ? '' : ` WHERE ${definition.where}`;
|
|
165
|
+
return (`CREATE ${unique}INDEX ${quoteIdentifier(definition.name)} ON ${quoteIdentifier(definition.table)}` +
|
|
166
|
+
`${using} (${columns})${indexOptions(definition, method)}${where}`);
|
|
167
|
+
}
|
|
168
|
+
function createViewDdl(definition) {
|
|
169
|
+
const materialized = definition.materialized === true ? 'MATERIALIZED ' : '';
|
|
170
|
+
return `CREATE ${materialized}VIEW ${quoteIdentifier(definition.name)} AS ${definition.select}`;
|
|
171
|
+
}
|
|
172
|
+
function dropViewDdl(name, materialized) {
|
|
173
|
+
return `DROP ${materialized === true ? 'MATERIALIZED ' : ''}VIEW IF EXISTS ${quoteIdentifier(name)}`;
|
|
174
|
+
}
|
|
175
|
+
function createSequenceDdl(definition) {
|
|
176
|
+
let ddl = `CREATE SEQUENCE ${quoteIdentifier(definition.name)}`;
|
|
177
|
+
if (definition.start !== undefined)
|
|
178
|
+
ddl += ` START ${definition.start}`;
|
|
179
|
+
if (definition.increment !== undefined)
|
|
180
|
+
ddl += ` INCREMENT ${definition.increment}`;
|
|
181
|
+
return ddl;
|
|
182
|
+
}
|
|
183
|
+
function generatedColumnDdl(column) {
|
|
184
|
+
const stored = column.stored === true ? ' STORED' : '';
|
|
185
|
+
return `${quoteIdentifier(column.name)} ${column.type} GENERATED ALWAYS AS (${column.expression})${stored}`;
|
|
186
|
+
}
|
|
187
|
+
function createPolicyDdl(policy) {
|
|
188
|
+
const command = policy.command ?? 'ALL';
|
|
189
|
+
return (`CREATE POLICY ${quoteIdentifier(policy.name)} ON ${quoteIdentifier(policy.table)} ` +
|
|
190
|
+
`FOR ${command} USING (${policy.using})`);
|
|
191
|
+
}
|
|
192
|
+
function routineLabel(definition) {
|
|
193
|
+
return `${definition.kind} ${quoteIdentifier(definition.name)}`;
|
|
194
|
+
}
|
|
195
|
+
function assertRoutineSupported(definition) {
|
|
196
|
+
for (const parameter of definition.params) {
|
|
197
|
+
if (parameter.mode === 'out' || parameter.mode === 'inout') {
|
|
198
|
+
throw new UnsupportedFeatureError(`postgres routine ${routineLabel(definition)} has unsupported ${parameter.mode} parameter ${quoteIdentifier(parameter.name)}`, 'postgres');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function routineTypeDdl(types, type) {
|
|
203
|
+
if (type === 'void')
|
|
204
|
+
return 'VOID';
|
|
205
|
+
return scalarType(types, type === 'serial' ? 'integer' : type);
|
|
206
|
+
}
|
|
207
|
+
function routineParametersDdl(types, definition) {
|
|
208
|
+
return definition.params
|
|
209
|
+
.map(parameter => `${quoteIdentifier(parameter.name)} ${routineTypeDdl(types, parameter.type)}`)
|
|
210
|
+
.join(', ');
|
|
211
|
+
}
|
|
212
|
+
function routineReturns(types, definition) {
|
|
213
|
+
if (definition.kind === 'procedure') {
|
|
214
|
+
if (definition.returns !== undefined) {
|
|
215
|
+
throw new TypeError(`${routineLabel(definition)} cannot declare a return type`);
|
|
216
|
+
}
|
|
217
|
+
return '';
|
|
218
|
+
}
|
|
219
|
+
if (definition.returns === undefined) {
|
|
220
|
+
throw new TypeError(`${routineLabel(definition)} must declare a return type`);
|
|
221
|
+
}
|
|
222
|
+
const setof = definition.returns.setof === true ? 'SETOF ' : '';
|
|
223
|
+
return ` RETURNS ${setof}${routineTypeDdl(types, definition.returns.type)}`;
|
|
224
|
+
}
|
|
225
|
+
function dollarQuoteTag(body) {
|
|
226
|
+
for (let suffix = 0;; suffix++) {
|
|
227
|
+
const tag = suffix === 0 ? '$zmdb$' : `$zmdb${suffix}$`;
|
|
228
|
+
if (!body.includes(tag))
|
|
229
|
+
return tag;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function createRoutineDdl(types, definition) {
|
|
233
|
+
assertRoutineSupported(definition);
|
|
234
|
+
const kind = definition.kind.toUpperCase();
|
|
235
|
+
const head = `${kind} ${quoteIdentifier(definition.name)}(${routineParametersDdl(types, definition)})`;
|
|
236
|
+
const language = definition.language ?? 'plpgsql';
|
|
237
|
+
const tag = dollarQuoteTag(definition.body);
|
|
238
|
+
return (`CREATE OR REPLACE ${head}${routineReturns(types, definition)} ` +
|
|
239
|
+
`LANGUAGE ${language} AS ${tag}\n${definition.body}\n${tag}`);
|
|
240
|
+
}
|
|
241
|
+
function dropRoutineDdl(types, definition) {
|
|
242
|
+
assertRoutineSupported(definition);
|
|
243
|
+
const signature = definition.params.map(parameter => routineTypeDdl(types, parameter.type)).join(', ');
|
|
244
|
+
return `DROP ${definition.kind.toUpperCase()} IF EXISTS ${quoteIdentifier(definition.name)}(${signature})`;
|
|
245
|
+
}
|
|
246
|
+
function sameRoutineSignature(previous, next) {
|
|
247
|
+
if (previous.kind !== next.kind || previous.name !== next.name || previous.params.length !== next.params.length) {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
if (previous.params.some((parameter, index) => parameter.type !== next.params[index]?.type)) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
if (previous.kind === 'procedure')
|
|
254
|
+
return true;
|
|
255
|
+
return previous.returns?.type === next.returns?.type && previous.returns?.setof === next.returns?.setof;
|
|
256
|
+
}
|
|
257
|
+
function replaceRoutineStatements(types, previous, next) {
|
|
258
|
+
const create = createRoutineDdl(types, next);
|
|
259
|
+
return previous === undefined || sameRoutineSignature(previous, next)
|
|
260
|
+
? [create]
|
|
261
|
+
: [dropRoutineDdl(types, previous), create];
|
|
262
|
+
}
|
|
263
|
+
function schemaObjectStatements(types, operation) {
|
|
264
|
+
switch (operation.kind) {
|
|
265
|
+
case 'create_index':
|
|
266
|
+
return [createIndexDdl(operation.definition)];
|
|
267
|
+
case 'check_constraint':
|
|
268
|
+
return [
|
|
269
|
+
`ALTER TABLE ${quoteIdentifier(operation.table)} ADD CONSTRAINT ` +
|
|
270
|
+
`${quoteIdentifier(operation.name)} CHECK (${operation.expression})`,
|
|
271
|
+
];
|
|
272
|
+
case 'create_view':
|
|
273
|
+
return [createViewDdl(operation.definition)];
|
|
274
|
+
case 'drop_view':
|
|
275
|
+
return [dropViewDdl(operation.name, operation.materialized)];
|
|
276
|
+
case 'create_sequence':
|
|
277
|
+
return [createSequenceDdl(operation.definition)];
|
|
278
|
+
case 'generated_column':
|
|
279
|
+
return [generatedColumnDdl(operation.definition)];
|
|
280
|
+
case 'create_schema':
|
|
281
|
+
return [`CREATE SCHEMA ${quoteIdentifier(operation.name)}`];
|
|
282
|
+
case 'enable_rls':
|
|
283
|
+
return [`ALTER TABLE ${quoteIdentifier(operation.table)} ENABLE ROW LEVEL SECURITY`];
|
|
284
|
+
case 'create_policy':
|
|
285
|
+
return [createPolicyDdl(operation.definition)];
|
|
286
|
+
case 'create_extension':
|
|
287
|
+
return [createExtensionDdl(operation.definition)];
|
|
288
|
+
case 'create_routine':
|
|
289
|
+
return [createRoutineDdl(types, operation.definition)];
|
|
290
|
+
case 'drop_routine':
|
|
291
|
+
return [dropRoutineDdl(types, operation.definition)];
|
|
292
|
+
case 'replace_routine':
|
|
293
|
+
return replaceRoutineStatements(types, operation.previous, operation.next);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
function emitUp(types, operation) {
|
|
297
|
+
switch (operation.kind) {
|
|
298
|
+
case 'create_extension':
|
|
299
|
+
return createExtensionDdl(operation);
|
|
300
|
+
case 'create_table':
|
|
301
|
+
return createTableDdl(types, operation);
|
|
302
|
+
case 'drop_table':
|
|
303
|
+
return `DROP TABLE ${quoteIdentifier(operation.table)}`;
|
|
304
|
+
case 'add_column':
|
|
305
|
+
return `ALTER TABLE ${quoteIdentifier(operation.table)} ADD COLUMN ` + columnDdl(types, operation.column);
|
|
306
|
+
case 'drop_column':
|
|
307
|
+
return `ALTER TABLE ${quoteIdentifier(operation.table)} DROP COLUMN ` + quoteIdentifier(operation.column);
|
|
308
|
+
case 'alter_column_type':
|
|
309
|
+
return (`ALTER TABLE ${quoteIdentifier(operation.table)} ALTER COLUMN ` +
|
|
310
|
+
`${quoteIdentifier(operation.column)} TYPE ` +
|
|
311
|
+
postgresDdlType(types, {
|
|
312
|
+
name: operation.column,
|
|
313
|
+
type: operation.to,
|
|
314
|
+
nullable: true,
|
|
315
|
+
primaryKey: false,
|
|
316
|
+
}));
|
|
317
|
+
case 'alter_primary_key':
|
|
318
|
+
return alterPrimaryKeyDdl(operation.table, operation.from, operation.to);
|
|
319
|
+
case 'add_foreign_key':
|
|
320
|
+
return addForeignKeyDdl(operation.table, operation.fk);
|
|
321
|
+
case 'drop_foreign_key':
|
|
322
|
+
return dropForeignKeyDdl(operation.table, operation.name);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
function emitDown(types, operation) {
|
|
326
|
+
switch (operation.kind) {
|
|
327
|
+
case 'create_extension':
|
|
328
|
+
throw new Error(`extension "${operation.name}" is not dropped automatically; write a hand-authored migration after checking dependants`);
|
|
329
|
+
case 'create_table':
|
|
330
|
+
return `DROP TABLE ${quoteIdentifier(operation.table)}`;
|
|
331
|
+
case 'drop_table':
|
|
332
|
+
return `CREATE TABLE ${quoteIdentifier(operation.table)} ()`;
|
|
333
|
+
case 'add_column':
|
|
334
|
+
return `ALTER TABLE ${quoteIdentifier(operation.table)} DROP COLUMN ` + quoteIdentifier(operation.column.name);
|
|
335
|
+
case 'drop_column':
|
|
336
|
+
return `ALTER TABLE ${quoteIdentifier(operation.table)} ADD COLUMN ` + quoteIdentifier(operation.column);
|
|
337
|
+
case 'alter_column_type':
|
|
338
|
+
return (`ALTER TABLE ${quoteIdentifier(operation.table)} ALTER COLUMN ` +
|
|
339
|
+
`${quoteIdentifier(operation.column)} TYPE ` +
|
|
340
|
+
postgresDdlType(types, {
|
|
341
|
+
name: operation.column,
|
|
342
|
+
type: operation.from,
|
|
343
|
+
nullable: true,
|
|
344
|
+
primaryKey: false,
|
|
345
|
+
}));
|
|
346
|
+
case 'alter_primary_key':
|
|
347
|
+
return alterPrimaryKeyDdl(operation.table, operation.to, operation.from);
|
|
348
|
+
case 'add_foreign_key':
|
|
349
|
+
return dropForeignKeyDdl(operation.table, operation.fk.name);
|
|
350
|
+
case 'drop_foreign_key':
|
|
351
|
+
throw new Error(`foreign key "${operation.name}" on "${operation.table}" cannot be recreated automatically because the drop operation ` +
|
|
352
|
+
'does not carry its columns or referential actions; write the down migration by hand');
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function migrationConnection(name, driver, options = {}) {
|
|
356
|
+
const table = qualifiedTable(options.schema, options.table ?? '_zmdb_migrations');
|
|
357
|
+
const execute = (text, parameters = []) => driver.execute({ text, parameters });
|
|
358
|
+
const appliedMigrations = async () => {
|
|
359
|
+
const rows = await execute(`SELECT version, name, checksum FROM ${table} ORDER BY version`);
|
|
360
|
+
return rows.map((row, index) => {
|
|
361
|
+
const version = row['version'];
|
|
362
|
+
const migrationName = row['name'];
|
|
363
|
+
const checksum = row['checksum'];
|
|
364
|
+
if ((typeof version !== 'number' && typeof version !== 'bigint' && typeof version !== 'string') ||
|
|
365
|
+
typeof migrationName !== 'string' ||
|
|
366
|
+
(checksum !== null && typeof checksum !== 'string')) {
|
|
367
|
+
throw new TypeError(`migration ledger row ${String(index)} has an invalid version, name or checksum`);
|
|
368
|
+
}
|
|
369
|
+
const numericVersion = Number(version);
|
|
370
|
+
if (!Number.isSafeInteger(numericVersion)) {
|
|
371
|
+
throw new TypeError(`migration ledger row ${String(index)} version is not a safe integer`);
|
|
372
|
+
}
|
|
373
|
+
return { version: numericVersion, name: migrationName, checksum };
|
|
374
|
+
});
|
|
375
|
+
};
|
|
376
|
+
const transaction = async (run) => {
|
|
377
|
+
if (driver.transaction === undefined) {
|
|
378
|
+
throw new Error(`${name} migrations require a transactional driver; the driver must pin every callback query to one client`);
|
|
379
|
+
}
|
|
380
|
+
return driver.transaction(transactionDriver => run(migrationConnection(name, transactionDriver, options)));
|
|
381
|
+
};
|
|
382
|
+
return {
|
|
383
|
+
name,
|
|
384
|
+
transactionalDdl: true,
|
|
385
|
+
async exec(sql) {
|
|
386
|
+
await execute(sql);
|
|
387
|
+
},
|
|
388
|
+
async appliedVersions() {
|
|
389
|
+
return (await appliedMigrations()).map(row => row.version);
|
|
390
|
+
},
|
|
391
|
+
appliedMigrations,
|
|
392
|
+
async recordApplied(version, migrationName, checksum) {
|
|
393
|
+
await execute(`INSERT INTO ${table} (version, name, applied_at, checksum) VALUES ($1, $2, $3, $4)`, [
|
|
394
|
+
version,
|
|
395
|
+
migrationName,
|
|
396
|
+
Date.now(),
|
|
397
|
+
checksum ?? null,
|
|
398
|
+
]);
|
|
399
|
+
},
|
|
400
|
+
async recordReverted(version) {
|
|
401
|
+
await execute(`DELETE FROM ${table} WHERE version = $1`, [version]);
|
|
402
|
+
},
|
|
403
|
+
async ensureVersionTable() {
|
|
404
|
+
await execute(`CREATE TABLE IF NOT EXISTS ${table} (` +
|
|
405
|
+
'version BIGINT PRIMARY KEY, name TEXT NOT NULL, applied_at BIGINT NOT NULL, checksum TEXT)');
|
|
406
|
+
await execute(`ALTER TABLE ${table} ALTER COLUMN version TYPE BIGINT`);
|
|
407
|
+
try {
|
|
408
|
+
await execute(`SELECT checksum FROM ${table} WHERE 1 = 0`);
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
await execute(`ALTER TABLE ${table} ADD COLUMN checksum TEXT`);
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
checksum: migrationChecksum,
|
|
415
|
+
transaction,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
async function migrationChecksum(sql) {
|
|
419
|
+
const bytes = new TextEncoder().encode(sql);
|
|
420
|
+
const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', bytes));
|
|
421
|
+
const hex = Array.from(digest, byte => byte.toString(16).padStart(2, '0')).join('');
|
|
422
|
+
return `sha256:${hex}`;
|
|
423
|
+
}
|
|
424
|
+
export function postgresFamilyMigrations(name, options = {}) {
|
|
425
|
+
const types = Object.freeze({
|
|
426
|
+
...POSTGRES_TYPES,
|
|
427
|
+
...options.types,
|
|
428
|
+
});
|
|
429
|
+
return Object.freeze({
|
|
430
|
+
name,
|
|
431
|
+
foreignKeyMode: 'deferred',
|
|
432
|
+
embedded: false,
|
|
433
|
+
validateSnapshot(_snapshot) { },
|
|
434
|
+
validatePlan(_plan) { },
|
|
435
|
+
ddlType(column) {
|
|
436
|
+
return postgresDdlType(types, column);
|
|
437
|
+
},
|
|
438
|
+
emitUp(operation) {
|
|
439
|
+
return emitUp(types, operation);
|
|
440
|
+
},
|
|
441
|
+
emitDown(operation) {
|
|
442
|
+
return emitDown(types, operation);
|
|
443
|
+
},
|
|
444
|
+
emitSchemaObject(operation) {
|
|
445
|
+
return schemaObjectStatements(types, operation);
|
|
446
|
+
},
|
|
447
|
+
connection(driver, tableOptions) {
|
|
448
|
+
return migrationConnection(name, driver, tableOptions);
|
|
449
|
+
},
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
|
package/dist/outbox.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Migration } from '@zmdb/migrations';
|
|
2
|
+
export declare const POSTGRES_OUTBOX_TABLE = "zmdb_outbox";
|
|
3
|
+
export declare function postgresOutboxTableDdl(): string;
|
|
4
|
+
export declare function postgresOutboxPendingIndexDdl(): string;
|
|
5
|
+
export declare function postgresOutboxMigration(version: number): Migration;
|
|
6
|
+
//# sourceMappingURL=outbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAMnD,wBAAgB,sBAAsB,IAAI,MAAM,CAgB/C;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAMtD;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAOlE"}
|
package/dist/outbox.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const POSTGRES_OUTBOX_TABLE = 'zmdb_outbox';
|
|
2
|
+
function quoteIdentifier(identifier) {
|
|
3
|
+
return `"${identifier.replaceAll('"', '""')}"`;
|
|
4
|
+
}
|
|
5
|
+
export function postgresOutboxTableDdl() {
|
|
6
|
+
const table = quoteIdentifier(POSTGRES_OUTBOX_TABLE);
|
|
7
|
+
const column = quoteIdentifier;
|
|
8
|
+
return (`CREATE TABLE ${table} (` +
|
|
9
|
+
`${column('id')} TEXT PRIMARY KEY, ` +
|
|
10
|
+
`${column('topic')} TEXT NOT NULL, ` +
|
|
11
|
+
`${column('payload')} TEXT NOT NULL, ` +
|
|
12
|
+
`${column('status')} TEXT NOT NULL DEFAULT 'pending', ` +
|
|
13
|
+
`${column('attempts')} INTEGER NOT NULL DEFAULT 0, ` +
|
|
14
|
+
`${column('created_at')} TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, ` +
|
|
15
|
+
`${column('lease_owner')} TEXT NOT NULL DEFAULT '', ` +
|
|
16
|
+
`${column('lease_until')} TIMESTAMPTZ NOT NULL DEFAULT '1970-01-01T00:00:00.000Z', ` +
|
|
17
|
+
`${column('delivered_at')} TIMESTAMPTZ, ` +
|
|
18
|
+
`${column('last_error')} TEXT)`);
|
|
19
|
+
}
|
|
20
|
+
export function postgresOutboxPendingIndexDdl() {
|
|
21
|
+
return (`CREATE INDEX ${quoteIdentifier('zmdb_outbox_pending')} ON ${quoteIdentifier(POSTGRES_OUTBOX_TABLE)} ` +
|
|
22
|
+
`(${quoteIdentifier('status')}, ${quoteIdentifier('lease_until')}, ${quoteIdentifier('created_at')}) ` +
|
|
23
|
+
"WHERE status = 'pending'");
|
|
24
|
+
}
|
|
25
|
+
export function postgresOutboxMigration(version) {
|
|
26
|
+
return {
|
|
27
|
+
version,
|
|
28
|
+
name: 'create_zmdb_outbox',
|
|
29
|
+
up: `${postgresOutboxTableDdl()}; ${postgresOutboxPendingIndexDdl()}`,
|
|
30
|
+
down: `DROP TABLE ${quoteIdentifier(POSTGRES_OUTBOX_TABLE)}`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=outbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAEnD,SAAS,eAAe,CAAC,UAAkB;IACzC,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,KAAK,GAAG,eAAe,CAAC,qBAAqB,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,eAAe,CAAC;IAC/B,OAAO,CACL,gBAAgB,KAAK,IAAI;QACzB,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB;QACpC,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB;QACpC,GAAG,MAAM,CAAC,SAAS,CAAC,kBAAkB;QACtC,GAAG,MAAM,CAAC,QAAQ,CAAC,oCAAoC;QACvD,GAAG,MAAM,CAAC,UAAU,CAAC,+BAA+B;QACpD,GAAG,MAAM,CAAC,YAAY,CAAC,mDAAmD;QAC1E,GAAG,MAAM,CAAC,aAAa,CAAC,6BAA6B;QACrD,GAAG,MAAM,CAAC,aAAa,CAAC,4DAA4D;QACpF,GAAG,MAAM,CAAC,cAAc,CAAC,gBAAgB;QACzC,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAChC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,OAAO,CACL,gBAAgB,eAAe,CAAC,qBAAqB,CAAC,OAAO,eAAe,CAAC,qBAAqB,CAAC,GAAG;QACtG,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,eAAe,CAAC,aAAa,CAAC,KAAK,eAAe,CAAC,YAAY,CAAC,IAAI;QACtG,0BAA0B,CAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO;QACL,OAAO;QACP,IAAI,EAAE,oBAAoB;QAC1B,EAAE,EAAE,GAAG,sBAAsB,EAAE,KAAK,6BAA6B,EAAE,EAAE;QACrE,IAAI,EAAE,cAAc,eAAe,CAAC,qBAAqB,CAAC,EAAE;KAC7D,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zmdb/postgres",
|
|
3
|
+
"version": "1.0.0-beta.1",
|
|
4
|
+
"description": "The complete PostgreSQL vertical for zmdb: dialect, migrations, catalog introspection, node-postgres driver, cursors, and cancellation.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"database",
|
|
7
|
+
"migrations",
|
|
8
|
+
"orm",
|
|
9
|
+
"postgres",
|
|
10
|
+
"postgresql",
|
|
11
|
+
"typescript",
|
|
12
|
+
"zmdb"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/ambasta/zmdb#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/ambasta/zmdb/issues"
|
|
17
|
+
},
|
|
18
|
+
"license": "GPL-3.0-or-later",
|
|
19
|
+
"author": "zmdb contributors",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/ambasta/zmdb.git",
|
|
23
|
+
"directory": "packages/postgres"
|
|
24
|
+
},
|
|
25
|
+
"type": "module",
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public",
|
|
35
|
+
"tag": "beta"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "node ../../scripts/build-package.mjs",
|
|
39
|
+
"test": "vitest run"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@zmdb/migrations": "1.0.0-beta.1"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@zmdb/orm": "1.0.0-beta.1",
|
|
46
|
+
"@zmdb/sql": "1.0.0-beta.1",
|
|
47
|
+
"pg": "^8.23.0"
|
|
48
|
+
},
|
|
49
|
+
"peerDependenciesMeta": {
|
|
50
|
+
"pg": {
|
|
51
|
+
"optional": true
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=26"
|
|
56
|
+
},
|
|
57
|
+
"main": "./dist/index.js",
|
|
58
|
+
"types": "./dist/index.d.ts"
|
|
59
|
+
}
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type DialectTypeMap } from '@zmdb/sql';
|
|
2
|
+
|
|
3
|
+
export const POSTGRES_TYPES: DialectTypeMap = Object.freeze({
|
|
4
|
+
serial: 'SERIAL',
|
|
5
|
+
integer: 'INTEGER',
|
|
6
|
+
bigint: 'BIGINT',
|
|
7
|
+
numeric: 'NUMERIC',
|
|
8
|
+
text: 'TEXT',
|
|
9
|
+
varchar: 'VARCHAR',
|
|
10
|
+
boolean: 'BOOLEAN',
|
|
11
|
+
timestamp: 'TIMESTAMPTZ',
|
|
12
|
+
json: 'JSONB',
|
|
13
|
+
jsonEnum: 'TEXT',
|
|
14
|
+
});
|