@zyno-io/dk-server-foundation 26.412.2137 → 26.601.2229
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/dist/resources/proto/generated/devconsole/devconsole.js +1 -1
- package/dist/src/app/config.d.ts +1 -0
- package/dist/src/app/config.d.ts.map +1 -1
- package/dist/src/app/config.js +1 -1
- package/dist/src/app/config.js.map +1 -1
- package/dist/src/database/common.d.ts +3 -0
- package/dist/src/database/common.d.ts.map +1 -1
- package/dist/src/database/common.js +46 -1
- package/dist/src/database/common.js.map +1 -1
- package/dist/src/database/factory.d.ts +17 -0
- package/dist/src/database/factory.d.ts.map +1 -0
- package/dist/src/database/factory.js +53 -0
- package/dist/src/database/factory.js.map +1 -0
- package/dist/src/database/index.d.ts +2 -0
- package/dist/src/database/index.d.ts.map +1 -1
- package/dist/src/database/index.js +2 -0
- package/dist/src/database/index.js.map +1 -1
- package/dist/src/database/migration/MigrationResetCommand.d.ts.map +1 -1
- package/dist/src/database/migration/MigrationResetCommand.js +6 -20
- package/dist/src/database/migration/MigrationResetCommand.js.map +1 -1
- package/dist/src/database/migration/MigrationRunCommand.d.ts.map +1 -1
- package/dist/src/database/migration/MigrationRunCommand.js +2 -0
- package/dist/src/database/migration/MigrationRunCommand.js.map +1 -1
- package/dist/src/database/migration/create/MigrationCreateCommand.d.ts +2 -0
- package/dist/src/database/migration/create/MigrationCreateCommand.d.ts.map +1 -1
- package/dist/src/database/migration/create/MigrationCreateCommand.js +36 -11
- package/dist/src/database/migration/create/MigrationCreateCommand.js.map +1 -1
- package/dist/src/database/migration/create/builder-regenerator.d.ts +12 -0
- package/dist/src/database/migration/create/builder-regenerator.d.ts.map +1 -0
- package/dist/src/database/migration/create/builder-regenerator.js +308 -0
- package/dist/src/database/migration/create/builder-regenerator.js.map +1 -0
- package/dist/src/database/migration/create/comparator.js +33 -4
- package/dist/src/database/migration/create/comparator.js.map +1 -1
- package/dist/src/database/migration/create/db-reader.js +63 -9
- package/dist/src/database/migration/create/db-reader.js.map +1 -1
- package/dist/src/database/migration/create/ddl-generator.d.ts.map +1 -1
- package/dist/src/database/migration/create/ddl-generator.js +44 -206
- package/dist/src/database/migration/create/ddl-generator.js.map +1 -1
- package/dist/src/database/migration/create/entity-reader.js +47 -5
- package/dist/src/database/migration/create/entity-reader.js.map +1 -1
- package/dist/src/database/migration/create/file-generator.d.ts +2 -0
- package/dist/src/database/migration/create/file-generator.d.ts.map +1 -1
- package/dist/src/database/migration/create/file-generator.js +7 -2
- package/dist/src/database/migration/create/file-generator.js.map +1 -1
- package/dist/src/database/migration/create/schema-model.d.ts +9 -0
- package/dist/src/database/migration/create/schema-model.d.ts.map +1 -1
- package/dist/src/database/migration/create/schema-model.js +3 -3
- package/dist/src/database/mysql.d.ts.map +1 -1
- package/dist/src/database/mysql.js +5 -11
- package/dist/src/database/mysql.js.map +1 -1
- package/dist/src/database/postgres.d.ts +1 -0
- package/dist/src/database/postgres.d.ts.map +1 -1
- package/dist/src/database/postgres.js +1 -13
- package/dist/src/database/postgres.js.map +1 -1
- package/dist/src/database/schema/AlterBlueprint.d.ts +50 -0
- package/dist/src/database/schema/AlterBlueprint.d.ts.map +1 -0
- package/dist/src/database/schema/AlterBlueprint.js +88 -0
- package/dist/src/database/schema/AlterBlueprint.js.map +1 -0
- package/dist/src/database/schema/Blueprint.d.ts +16 -0
- package/dist/src/database/schema/Blueprint.d.ts.map +1 -0
- package/dist/src/database/schema/Blueprint.js +51 -0
- package/dist/src/database/schema/Blueprint.js.map +1 -0
- package/dist/src/database/schema/BlueprintBase.d.ts +65 -0
- package/dist/src/database/schema/BlueprintBase.d.ts.map +1 -0
- package/dist/src/database/schema/BlueprintBase.js +385 -0
- package/dist/src/database/schema/BlueprintBase.js.map +1 -0
- package/dist/src/database/schema/ColumnDefinition.d.ts +43 -0
- package/dist/src/database/schema/ColumnDefinition.d.ts.map +1 -0
- package/dist/src/database/schema/ColumnDefinition.js +117 -0
- package/dist/src/database/schema/ColumnDefinition.js.map +1 -0
- package/dist/src/database/schema/Schema.d.ts +32 -0
- package/dist/src/database/schema/Schema.d.ts.map +1 -0
- package/dist/src/database/schema/Schema.js +151 -0
- package/dist/src/database/schema/Schema.js.map +1 -0
- package/dist/src/database/schema/grammar/Grammar.d.ts +35 -0
- package/dist/src/database/schema/grammar/Grammar.d.ts.map +1 -0
- package/dist/src/database/schema/grammar/Grammar.js +36 -0
- package/dist/src/database/schema/grammar/Grammar.js.map +1 -0
- package/dist/src/database/schema/grammar/MySQLGrammar.d.ts +29 -0
- package/dist/src/database/schema/grammar/MySQLGrammar.d.ts.map +1 -0
- package/dist/src/database/schema/grammar/MySQLGrammar.js +199 -0
- package/dist/src/database/schema/grammar/MySQLGrammar.js.map +1 -0
- package/dist/src/database/schema/grammar/PostgresGrammar.d.ts +29 -0
- package/dist/src/database/schema/grammar/PostgresGrammar.d.ts.map +1 -0
- package/dist/src/database/schema/grammar/PostgresGrammar.js +233 -0
- package/dist/src/database/schema/grammar/PostgresGrammar.js.map +1 -0
- package/dist/src/database/schema/index.d.ts +9 -0
- package/dist/src/database/schema/index.d.ts.map +1 -0
- package/dist/src/database/schema/index.js +12 -0
- package/dist/src/database/schema/index.js.map +1 -0
- package/dist/src/database/types.d.ts +8 -0
- package/dist/src/database/types.d.ts.map +1 -1
- package/dist/src/database/types.js +3 -1
- package/dist/src/database/types.js.map +1 -1
- package/docs/content/cli.md +4 -1
- package/docs/content/configuration.md +6 -0
- package/docs/content/database.md +137 -0
- package/package.json +1 -1
- package/src/app/config.ts +2 -0
- package/src/database/common.ts +51 -0
- package/src/database/factory.ts +59 -0
- package/src/database/index.ts +2 -0
- package/src/database/migration/MigrationResetCommand.ts +6 -22
- package/src/database/migration/MigrationRunCommand.ts +2 -0
- package/src/database/migration/create/MigrationCreateCommand.ts +42 -12
- package/src/database/migration/create/builder-regenerator.ts +294 -0
- package/src/database/migration/create/comparator.ts +34 -4
- package/src/database/migration/create/db-reader.ts +60 -9
- package/src/database/migration/create/ddl-generator.ts +45 -212
- package/src/database/migration/create/entity-reader.ts +46 -5
- package/src/database/migration/create/file-generator.ts +5 -1
- package/src/database/migration/create/schema-model.ts +6 -0
- package/src/database/mysql.ts +7 -15
- package/src/database/postgres.ts +3 -17
- package/src/database/schema/AlterBlueprint.ts +92 -0
- package/src/database/schema/Blueprint.ts +43 -0
- package/src/database/schema/BlueprintBase.ts +425 -0
- package/src/database/schema/ColumnDefinition.ts +131 -0
- package/src/database/schema/Schema.ts +167 -0
- package/src/database/schema/grammar/Grammar.ts +62 -0
- package/src/database/schema/grammar/MySQLGrammar.ts +206 -0
- package/src/database/schema/grammar/PostgresGrammar.ts +243 -0
- package/src/database/schema/index.ts +8 -0
- package/src/database/types.ts +6 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PostgresGrammar = void 0;
|
|
4
|
+
function __assignType(fn, args) {
|
|
5
|
+
fn.__type = args;
|
|
6
|
+
return fn;
|
|
7
|
+
}
|
|
8
|
+
/*@ts-ignore*/
|
|
9
|
+
var { __ΩDialect } = require('../../dialect');
|
|
10
|
+
const dialect_1 = require("../../dialect");
|
|
11
|
+
/*@ts-ignore*/
|
|
12
|
+
var { __ΩTableSchema, __ΩIndexSchema, __ΩForeignKeySchema, __ΩColumnSchema } = require('../../migration/create/schema-model');
|
|
13
|
+
const Grammar_1 = require("./Grammar");
|
|
14
|
+
class PostgresGrammar extends Grammar_1.Grammar {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this.dialect = 'postgres';
|
|
18
|
+
}
|
|
19
|
+
quote(name) {
|
|
20
|
+
return (0, dialect_1.quoteId)('postgres', name);
|
|
21
|
+
}
|
|
22
|
+
qualifiedTable(name) {
|
|
23
|
+
if (this.pgSchema && this.pgSchema !== 'public') {
|
|
24
|
+
return `${this.quote(this.pgSchema)}.${this.quote(name)}`;
|
|
25
|
+
}
|
|
26
|
+
return this.quote(name);
|
|
27
|
+
}
|
|
28
|
+
qualifiedType(typeName) {
|
|
29
|
+
if (this.pgSchema && this.pgSchema !== 'public') {
|
|
30
|
+
return `${this.quote(this.pgSchema)}.${this.quote(typeName)}`;
|
|
31
|
+
}
|
|
32
|
+
return this.quote(typeName);
|
|
33
|
+
}
|
|
34
|
+
createTable(table) {
|
|
35
|
+
const lines = [];
|
|
36
|
+
const pkCols = table.columns.filter(__assignType(c => c.isPrimaryKey, ['c', '', 'P"2!"/"'])).map(__assignType(c => c.name, ['c', '', 'P"2!"/"']));
|
|
37
|
+
for (const col of table.columns) {
|
|
38
|
+
lines.push(` ${this.columnDef(col)}`);
|
|
39
|
+
}
|
|
40
|
+
if (pkCols.length > 0) {
|
|
41
|
+
const quoted = pkCols.map(__assignType(c => this.quote(c), ['c', '', 'P"2!"/"'])).join(', ');
|
|
42
|
+
lines.push(` PRIMARY KEY (${quoted})`);
|
|
43
|
+
}
|
|
44
|
+
return `CREATE TABLE ${this.qualifiedTable(table.name)} (\n${lines.join(',\n')}\n)`;
|
|
45
|
+
}
|
|
46
|
+
createIndex(tableName, idx) {
|
|
47
|
+
const unique = idx.unique ? 'UNIQUE ' : '';
|
|
48
|
+
// PG has no SPATIAL prefix; spatial flag is silently ignored
|
|
49
|
+
const cols = idx.columns.map(__assignType(c => this.quote(c), ['c', '', 'P"2!"/"'])).join(', ');
|
|
50
|
+
return `CREATE ${unique}INDEX ${this.quote(idx.name)} ON ${this.qualifiedTable(tableName)} (${cols})`;
|
|
51
|
+
}
|
|
52
|
+
addForeignKey(tableName, fk) {
|
|
53
|
+
const cols = fk.columns.map(__assignType(c => this.quote(c), ['c', '', 'P"2!"/"'])).join(', ');
|
|
54
|
+
const refCols = fk.referencedColumns.map(__assignType(c => this.quote(c), ['c', '', 'P"2!"/"'])).join(', ');
|
|
55
|
+
const onDelete = (0, Grammar_1.validateFkAction)(fk.onDelete, this.dialect);
|
|
56
|
+
const onUpdate = (0, Grammar_1.validateFkAction)(fk.onUpdate, this.dialect);
|
|
57
|
+
return (`ALTER TABLE ${this.qualifiedTable(tableName)} ADD CONSTRAINT ${this.quote(fk.name)} ` +
|
|
58
|
+
`FOREIGN KEY (${cols}) REFERENCES ${this.qualifiedTable(fk.referencedTable)} (${refCols}) ` +
|
|
59
|
+
`ON DELETE ${onDelete} ON UPDATE ${onUpdate}`);
|
|
60
|
+
}
|
|
61
|
+
createEnumType(typeName, values) {
|
|
62
|
+
const qualifiedName = this.qualifiedType(typeName);
|
|
63
|
+
const vals = values.map(__assignType(v => `'${(0, Grammar_1.escapeStr)(v)}'`, ['v', '', 'P"2!"/"'])).join(', ');
|
|
64
|
+
const schemaFilter = this.pgSchema && this.pgSchema !== 'public'
|
|
65
|
+
? ` AND typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '${(0, Grammar_1.escapeStr)(this.pgSchema)}')`
|
|
66
|
+
: '';
|
|
67
|
+
return [
|
|
68
|
+
[
|
|
69
|
+
`DO $$ BEGIN`,
|
|
70
|
+
`IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = '${(0, Grammar_1.escapeStr)(typeName)}'${schemaFilter}) THEN`,
|
|
71
|
+
` CREATE TYPE ${qualifiedName} AS ENUM (${vals});`,
|
|
72
|
+
`END IF;`,
|
|
73
|
+
`END $$`
|
|
74
|
+
].join('\n'),
|
|
75
|
+
`CREATE CAST (text AS ${qualifiedName}) WITH INOUT AS IMPLICIT`
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
dropTable(name) {
|
|
79
|
+
return `DROP TABLE ${this.qualifiedTable(name)}`;
|
|
80
|
+
}
|
|
81
|
+
dropTableIfExists(name) {
|
|
82
|
+
return `DROP TABLE IF EXISTS ${this.qualifiedTable(name)}`;
|
|
83
|
+
}
|
|
84
|
+
renameTable(from, to) {
|
|
85
|
+
return `ALTER TABLE ${this.qualifiedTable(from)} RENAME TO ${this.quote(to)}`;
|
|
86
|
+
}
|
|
87
|
+
addColumn(tableName, col) {
|
|
88
|
+
return `ALTER TABLE ${this.qualifiedTable(tableName)} ADD COLUMN ${this.columnDef(col)}`;
|
|
89
|
+
}
|
|
90
|
+
dropColumn(tableName, columnName) {
|
|
91
|
+
return `ALTER TABLE ${this.qualifiedTable(tableName)} DROP COLUMN ${this.quote(columnName)}`;
|
|
92
|
+
}
|
|
93
|
+
modifyColumn(tableName, col) {
|
|
94
|
+
const stmts = [];
|
|
95
|
+
const tbl = this.qualifiedTable(tableName);
|
|
96
|
+
const c = this.quote(col.name);
|
|
97
|
+
const typeDef = col.autoIncrement ? (col.type === 'bigint' ? 'BIGINT' : 'INTEGER') : this.typeDef(col);
|
|
98
|
+
stmts.push(`ALTER TABLE ${tbl} ALTER COLUMN ${c} TYPE ${typeDef}`);
|
|
99
|
+
stmts.push(`ALTER TABLE ${tbl} ALTER COLUMN ${c} ${col.nullable ? 'DROP NOT NULL' : 'SET NOT NULL'}`);
|
|
100
|
+
if (col.defaultExpression) {
|
|
101
|
+
stmts.push(`ALTER TABLE ${tbl} ALTER COLUMN ${c} SET DEFAULT ${col.defaultExpression}`);
|
|
102
|
+
}
|
|
103
|
+
else if (col.defaultValue !== undefined) {
|
|
104
|
+
stmts.push(`ALTER TABLE ${tbl} ALTER COLUMN ${c} SET DEFAULT ${renderPgDefault(col)}`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
stmts.push(`ALTER TABLE ${tbl} ALTER COLUMN ${c} DROP DEFAULT`);
|
|
108
|
+
}
|
|
109
|
+
return stmts;
|
|
110
|
+
}
|
|
111
|
+
renameColumn(tableName, from, to) {
|
|
112
|
+
return `ALTER TABLE ${this.qualifiedTable(tableName)} RENAME COLUMN ${this.quote(from)} TO ${this.quote(to)}`;
|
|
113
|
+
}
|
|
114
|
+
dropIndex(tableName, indexName) {
|
|
115
|
+
// Index names in PG are schema-qualified, not table-qualified
|
|
116
|
+
if (this.pgSchema && this.pgSchema !== 'public') {
|
|
117
|
+
return `DROP INDEX ${this.quote(this.pgSchema)}.${this.quote(indexName)}`;
|
|
118
|
+
}
|
|
119
|
+
return `DROP INDEX ${this.quote(indexName)}`;
|
|
120
|
+
}
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
122
|
+
renameIndex(_tableName, from, to) {
|
|
123
|
+
// Index names in PG are schema-qualified, not table-qualified; the new name is bare.
|
|
124
|
+
const qualifiedFrom = this.pgSchema && this.pgSchema !== 'public' ? `${this.quote(this.pgSchema)}.${this.quote(from)}` : this.quote(from);
|
|
125
|
+
return `ALTER INDEX ${qualifiedFrom} RENAME TO ${this.quote(to)}`;
|
|
126
|
+
}
|
|
127
|
+
dropForeignKey(tableName, constraintName) {
|
|
128
|
+
return `ALTER TABLE ${this.qualifiedTable(tableName)} DROP CONSTRAINT ${this.quote(constraintName)}`;
|
|
129
|
+
}
|
|
130
|
+
addPrimaryKey(tableName, columns) {
|
|
131
|
+
const cols = columns.map(__assignType(c => this.quote(c), ['c', '', 'P"2!"/"'])).join(', ');
|
|
132
|
+
return `ALTER TABLE ${this.qualifiedTable(tableName)} ADD PRIMARY KEY (${cols})`;
|
|
133
|
+
}
|
|
134
|
+
dropPrimaryKey(tableName, constraintName) {
|
|
135
|
+
const name = constraintName ?? `${tableName}_pkey`;
|
|
136
|
+
return `ALTER TABLE ${this.qualifiedTable(tableName)} DROP CONSTRAINT ${this.quote(name)}`;
|
|
137
|
+
}
|
|
138
|
+
columnType(col) {
|
|
139
|
+
return this.typeDef(col);
|
|
140
|
+
}
|
|
141
|
+
columnDef(col) {
|
|
142
|
+
let typeDef;
|
|
143
|
+
if (col.autoIncrement) {
|
|
144
|
+
typeDef = col.type === 'bigint' ? 'BIGSERIAL' : 'SERIAL';
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
typeDef = this.typeDef(col);
|
|
148
|
+
}
|
|
149
|
+
let def = `${this.quote(col.name)} ${typeDef}`;
|
|
150
|
+
if (!col.nullable && !col.autoIncrement)
|
|
151
|
+
def += ' NOT NULL';
|
|
152
|
+
if (!col.autoIncrement) {
|
|
153
|
+
if (col.defaultExpression) {
|
|
154
|
+
def += ` DEFAULT ${col.defaultExpression}`;
|
|
155
|
+
}
|
|
156
|
+
else if (col.defaultValue !== undefined) {
|
|
157
|
+
def += ` DEFAULT ${renderPgDefault(col)}`;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return def;
|
|
161
|
+
}
|
|
162
|
+
typeDef(col) {
|
|
163
|
+
switch (col.type) {
|
|
164
|
+
case 'varchar':
|
|
165
|
+
return col.size ? `VARCHAR(${col.size})` : 'VARCHAR';
|
|
166
|
+
case 'char':
|
|
167
|
+
return `CHAR(${col.size || 1})`;
|
|
168
|
+
case 'smallint':
|
|
169
|
+
return 'SMALLINT';
|
|
170
|
+
case 'int':
|
|
171
|
+
case 'integer':
|
|
172
|
+
return 'INTEGER';
|
|
173
|
+
case 'bigint':
|
|
174
|
+
return 'BIGINT';
|
|
175
|
+
case 'real':
|
|
176
|
+
case 'float':
|
|
177
|
+
return 'REAL';
|
|
178
|
+
case 'double precision':
|
|
179
|
+
case 'double':
|
|
180
|
+
return 'DOUBLE PRECISION';
|
|
181
|
+
case 'decimal':
|
|
182
|
+
case 'numeric':
|
|
183
|
+
if (col.size === undefined)
|
|
184
|
+
return 'NUMERIC';
|
|
185
|
+
return col.scale !== undefined ? `NUMERIC(${col.size},${col.scale})` : `NUMERIC(${col.size})`;
|
|
186
|
+
case 'boolean':
|
|
187
|
+
return 'BOOLEAN';
|
|
188
|
+
case 'date':
|
|
189
|
+
return 'DATE';
|
|
190
|
+
case 'timestamp':
|
|
191
|
+
return 'TIMESTAMP';
|
|
192
|
+
case 'timestamptz':
|
|
193
|
+
return 'TIMESTAMPTZ';
|
|
194
|
+
// PostgreSQL has no size-bounded text variants — they all collapse to TEXT.
|
|
195
|
+
case 'text':
|
|
196
|
+
case 'tinytext':
|
|
197
|
+
case 'mediumtext':
|
|
198
|
+
case 'longtext':
|
|
199
|
+
return 'TEXT';
|
|
200
|
+
case 'bytea':
|
|
201
|
+
return 'BYTEA';
|
|
202
|
+
case 'json':
|
|
203
|
+
return 'JSON';
|
|
204
|
+
case 'jsonb':
|
|
205
|
+
return 'JSONB';
|
|
206
|
+
case 'uuid':
|
|
207
|
+
return 'UUID';
|
|
208
|
+
case 'enum':
|
|
209
|
+
return col.enumTypeName ? this.qualifiedType(col.enumTypeName) : 'TEXT';
|
|
210
|
+
default:
|
|
211
|
+
return col.type.toUpperCase();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.PostgresGrammar = PostgresGrammar;
|
|
216
|
+
PostgresGrammar.__type = [() => Grammar_1.Grammar, () => __ΩDialect, 'dialect', function () { return 'postgres'; }, 'name', 'quote', 'qualifiedTable', 'typeName', 'qualifiedType', () => __ΩTableSchema, 'table', 'createTable', 'tableName', () => __ΩIndexSchema, 'idx', 'createIndex', () => __ΩForeignKeySchema, 'fk', 'addForeignKey', 'values', 'createEnumType', 'dropTable', 'dropTableIfExists', 'from', 'to', 'renameTable', () => __ΩColumnSchema, 'col', 'addColumn', 'columnName', 'dropColumn', () => __ΩColumnSchema, 'modifyColumn', 'renameColumn', 'indexName', 'dropIndex', '_tableName', 'renameIndex', 'constraintName', 'dropForeignKey', 'columns', 'addPrimaryKey', 'dropPrimaryKey', () => __ΩColumnSchema, 'columnType', () => __ΩColumnSchema, 'columnDef', () => __ΩColumnSchema, 'typeDef', 'PostgresGrammar', 'P7!n"3#9>$P&2%&0&P&2%&0\'P&2(&0)Pn*2+&0,P&2-n.2/&00P&2-n122&03P&2(&F24&F05P&2%&06P&2%&07P&28&29&0:P&2-n;2<&0=P&2-&2>&0?P&2-n@2<&F0AP&2-&28&29&0BP&2-&2C&0DP&2E&28&29&0FP&2-&2G&0HP&2-&F2I&0JP&2-&2G8&0KPnL2<&0MPnN2<&0OPnP2<&0Q;5wR'];
|
|
217
|
+
const PG_NUMERIC_TYPES = new Set(['smallint', 'int', 'integer', 'bigint', 'real', 'float', 'double', 'double precision', 'decimal', 'numeric']);
|
|
218
|
+
function renderPgDefault(col) {
|
|
219
|
+
const v = col.defaultValue;
|
|
220
|
+
if (v === null)
|
|
221
|
+
return 'NULL';
|
|
222
|
+
if (typeof v === 'boolean')
|
|
223
|
+
return v ? 'TRUE' : 'FALSE';
|
|
224
|
+
if (col.type === 'boolean') {
|
|
225
|
+
const s = String(v).toLowerCase();
|
|
226
|
+
return s === 'true' || s === '1' ? 'TRUE' : 'FALSE';
|
|
227
|
+
}
|
|
228
|
+
if (typeof v === 'number' || PG_NUMERIC_TYPES.has(col.type))
|
|
229
|
+
return String(v);
|
|
230
|
+
return `'${(0, Grammar_1.escapeStr)(String(v))}'`;
|
|
231
|
+
}
|
|
232
|
+
renderPgDefault.__type = [() => __ΩColumnSchema, 'col', 'renderPgDefault', 'Pn!2"&/#'];
|
|
233
|
+
//# sourceMappingURL=PostgresGrammar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostgresGrammar.js","sourceRoot":"","sources":["../../../../../src/database/schema/grammar/PostgresGrammar.ts"],"names":[],"mappings":";;;;;;;;6BAAiC,eAAe;AAAhD,2CAAiD;;uFACwB,qCAAqC;AAC9G,uCAAiE;AAEjE,MAAa,eAAgB,SAAQ,iBAAO;IAA5C;;QACa,YAAO,GAAY,UAAU,CAAC;KA+N1C;IA7NG,KAAK,CAAC,IAAY;QACd,OAAO,IAAA,iBAAO,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,cAAc,CAAC,IAAY;QACvB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa,CAAC,QAAgB;QAC1B,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,WAAW,CAAC,KAAkB;QAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,cAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,wBAAC,CAAC,GAAG,cAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,wBAAC,CAAC;QAE1E,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,cAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,gBAAgB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IACxF,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,GAAgB;QAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,6DAA6D;QAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,cAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,UAAU,MAAM,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC;IAC1G,CAAC;IAED,aAAa,CAAC,SAAiB,EAAE,EAAoB;QACjD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,cAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,cAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,IAAA,0BAAgB,EAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,IAAA,0BAAgB,EAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,CACH,eAAe,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;YACtF,gBAAgB,IAAI,gBAAgB,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,OAAO,IAAI;YAC3F,aAAa,QAAQ,cAAc,QAAQ,EAAE,CAChD,CAAC;IACN,CAAC;IAED,cAAc,CAAC,QAAgB,EAAE,MAAgB;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,cAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAA,mBAAS,EAAC,CAAC,CAAC,GAAG,wBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,YAAY,GACd,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;YACvC,CAAC,CAAC,sEAAsE,IAAA,mBAAS,EAAC,IAAI,CAAC,QAAQ,CAAC,IAAI;YACpG,CAAC,CAAC,EAAE,CAAC;QACb,OAAO;YACH;gBACI,aAAa;gBACb,yDAAyD,IAAA,mBAAS,EAAC,QAAQ,CAAC,IAAI,YAAY,QAAQ;gBACpG,mBAAmB,aAAa,aAAa,IAAI,IAAI;gBACrD,SAAS;gBACT,QAAQ;aACX,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,wBAAwB,aAAa,0BAA0B;SAClE,CAAC;IACN,CAAC;IAED,SAAS,CAAC,IAAY;QAClB,OAAO,cAAc,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IACrD,CAAC;IAED,iBAAiB,CAAC,IAAY;QAC1B,OAAO,wBAAwB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,WAAW,CAAC,IAAY,EAAE,EAAU;QAChC,OAAO,eAAe,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,SAAS,CAAC,SAAiB,EAAE,GAAiB;QAC1C,OAAO,eAAe,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7F,CAAC;IAED,UAAU,CAAC,SAAiB,EAAE,UAAkB;QAC5C,OAAO,eAAe,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;IACjG,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,GAAiB;QAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE/B,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvG,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,iBAAiB,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,iBAAiB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QACtG,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,iBAAiB,CAAC,gBAAgB,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC5F,CAAC;aAAM,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,iBAAiB,CAAC,gBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,IAAY,EAAE,EAAU;QACpD,OAAO,eAAe,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IAClH,CAAC;IAED,SAAS,CAAC,SAAiB,EAAE,SAAiB;QAC1C,8DAA8D;QAC9D,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,cAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9E,CAAC;QACD,OAAO,cAAc,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;IACjD,CAAC;IAED,6DAA6D;IAC7D,WAAW,CAAC,UAAkB,EAAE,IAAY,EAAE,EAAU;QACpD,qFAAqF;QACrF,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1I,OAAO,eAAe,aAAa,cAAc,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,cAAsB;QACpD,OAAO,eAAe,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,oBAAoB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;IACzG,CAAC;IAED,aAAa,CAAC,SAAiB,EAAE,OAAiB;QAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,cAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,OAAO,eAAe,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,qBAAqB,IAAI,GAAG,CAAC;IACrF,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,cAAuB;QACrD,MAAM,IAAI,GAAG,cAAc,IAAI,GAAG,SAAS,OAAO,CAAC;QACnD,OAAO,eAAe,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,oBAAoB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED,UAAU,CAAC,GAAiB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,GAAiB;QACvB,IAAI,OAAe,CAAC;QACpB,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACpB,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7D,CAAC;aAAM,CAAC;YACJ,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QAE/C,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,aAAa;YAAE,GAAG,IAAI,WAAW,CAAC;QAE5D,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;gBACxB,GAAG,IAAI,YAAY,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC/C,CAAC;iBAAM,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACxC,GAAG,IAAI,YAAY,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,CAAC;QACL,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAEO,OAAO,CAAC,GAAiB;QAC7B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,SAAS;gBACV,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YACzD,KAAK,MAAM;gBACP,OAAO,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;YACpC,KAAK,UAAU;gBACX,OAAO,UAAU,CAAC;YACtB,KAAK,KAAK,CAAC;YACX,KAAK,SAAS;gBACV,OAAO,SAAS,CAAC;YACrB,KAAK,QAAQ;gBACT,OAAO,QAAQ,CAAC;YACpB,KAAK,MAAM,CAAC;YACZ,KAAK,OAAO;gBACR,OAAO,MAAM,CAAC;YAClB,KAAK,kBAAkB,CAAC;YACxB,KAAK,QAAQ;gBACT,OAAO,kBAAkB,CAAC;YAC9B,KAAK,SAAS,CAAC;YACf,KAAK,SAAS;gBACV,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAC7C,OAAO,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC;YAClG,KAAK,SAAS;gBACV,OAAO,SAAS,CAAC;YACrB,KAAK,MAAM;gBACP,OAAO,MAAM,CAAC;YAClB,KAAK,WAAW;gBACZ,OAAO,WAAW,CAAC;YACvB,KAAK,aAAa;gBACd,OAAO,aAAa,CAAC;YACzB,4EAA4E;YAC5E,KAAK,MAAM,CAAC;YACZ,KAAK,UAAU,CAAC;YAChB,KAAK,YAAY,CAAC;YAClB,KAAK,UAAU;gBACX,OAAO,MAAM,CAAC;YAClB,KAAK,OAAO;gBACR,OAAO,OAAO,CAAC;YACnB,KAAK,MAAM;gBACP,OAAO,MAAM,CAAC;YAClB,KAAK,OAAO;gBACR,OAAO,OAAO,CAAC;YACnB,KAAK,MAAM;gBACP,OAAO,MAAM,CAAC;YAClB,KAAK,MAAM;gBACP,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5E;gBACI,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,CAAC;IACL,CAAC;;AA/NL,0CAgOC;qGA/N+B,UAAU;AAiO1C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAEhJ,SAAS,eAAe,CAAC,GAAiB;IACtC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC;IAC3B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAC9B,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACxD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './AlterBlueprint';
|
|
2
|
+
export * from './Blueprint';
|
|
3
|
+
export * from './BlueprintBase';
|
|
4
|
+
export * from './ColumnDefinition';
|
|
5
|
+
export * from './Schema';
|
|
6
|
+
export * from './grammar/Grammar';
|
|
7
|
+
export * from './grammar/MySQLGrammar';
|
|
8
|
+
export * from './grammar/PostgresGrammar';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/database/schema/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./AlterBlueprint"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./Blueprint"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./BlueprintBase"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./ColumnDefinition"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./Schema"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./grammar/Grammar"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./grammar/MySQLGrammar"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./grammar/PostgresGrammar"), exports);
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/database/schema/index.ts"],"names":[],"mappings":";;;AAAA,2DAAiC;AACjC,sDAA4B;AAC5B,0DAAgC;AAChC,6DAAmC;AACnC,mDAAyB;AACzB,4DAAkC;AAClC,iEAAuC;AACvC,oEAA0C"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { TypeAnnotation } from '@deepkit/core';
|
|
2
2
|
import { MySQL, Type, Validate, ValidatorError } from '@deepkit/type';
|
|
3
3
|
export declare type UuidString = string & TypeAnnotation<'dksf:type', 'uuid'>;
|
|
4
|
+
/**
|
|
5
|
+
* Unsigned integer column. Plain `number` maps to a signed INT; use this when the column is
|
|
6
|
+
* `INT UNSIGNED` (MySQL). On PostgreSQL it is an ordinary INT (no unsigned concept).
|
|
7
|
+
*/
|
|
8
|
+
export type UnsignedNumber = number & MySQL<{
|
|
9
|
+
type: 'int unsigned';
|
|
10
|
+
}>;
|
|
4
11
|
export declare class Coordinate {
|
|
5
12
|
x: number;
|
|
6
13
|
y: number;
|
|
@@ -15,6 +22,7 @@ declare function _validateLength(value: string, _type: Type, length: number): Va
|
|
|
15
22
|
export declare type Length<T extends number> = string & Validate<typeof _validateLength, T> & TypeAnnotation<'dksf:length', T>;
|
|
16
23
|
export {};
|
|
17
24
|
export declare type __ΩUuidString = any[];
|
|
25
|
+
export declare type __ΩUnsignedNumber = any[];
|
|
18
26
|
export declare type __ΩMySQLCoordinate = any[];
|
|
19
27
|
export declare type __ΩNullableMySQLCoordinate = any[];
|
|
20
28
|
export declare type __ΩLength = any[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/database/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEtE,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAE9E,qBAAa,UAAU;IACnB,CAAC,EAAG,MAAM,CAAC;IACX,CAAC,EAAG,MAAM,CAAC;CACd;AACD,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AACpE,MAAM,MAAM,uBAAuB,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAErF,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,8BAIlE;AACD,MAAM,CAAC,OAAO,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,GAAG,QAAQ,CAAC,OAAO,eAAe,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/database/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEtE,MAAM,CAAC,OAAO,MAAM,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAE9E;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,CAAC;AAEtE,qBAAa,UAAU;IACnB,CAAC,EAAG,MAAM,CAAC;IACX,CAAC,EAAG,MAAM,CAAC;CACd;AACD,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AACpE,MAAM,MAAM,uBAAuB,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAErF,iBAAS,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,8BAIlE;AACD,MAAM,CAAC,OAAO,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,GAAG,QAAQ,CAAC,OAAO,eAAe,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.__ΩLength = exports.__ΩNullableMySQLCoordinate = exports.__ΩMySQLCoordinate = exports.Coordinate = exports.__ΩUuidString = void 0;
|
|
3
|
+
exports.__ΩLength = exports.__ΩNullableMySQLCoordinate = exports.__ΩMySQLCoordinate = exports.Coordinate = exports.__ΩUnsignedNumber = exports.__ΩUuidString = void 0;
|
|
4
4
|
/*@ts-ignore*/
|
|
5
5
|
var { __ΩTypeAnnotation } = require('@deepkit/core');
|
|
6
6
|
/*@ts-ignore*/
|
|
@@ -8,6 +8,8 @@ var { __ΩMySQL, __ΩValidate } = require('@deepkit/type');
|
|
|
8
8
|
const type_1 = require("@deepkit/type");
|
|
9
9
|
const __ΩUuidString = [() => __ΩTypeAnnotation, "dksf:type", "uuid", 'UuidString', 'P&.".#o!#Kw$y'];
|
|
10
10
|
exports.__ΩUuidString = __ΩUuidString;
|
|
11
|
+
const __ΩUnsignedNumber = [() => __ΩMySQL, "int unsigned", 'type', 'UnsignedNumber', 'P\'P."4#Mo!"Kw$y'];
|
|
12
|
+
exports.__ΩUnsignedNumber = __ΩUnsignedNumber;
|
|
11
13
|
class Coordinate {
|
|
12
14
|
}
|
|
13
15
|
exports.Coordinate = Coordinate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/database/types.ts"],"names":[],"mappings":";;;;oCAA+B,eAAe;;wCACQ,eAAe;AAArE,wCAAsE
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/database/types.ts"],"names":[],"mappings":";;;;oCAA+B,eAAe;;wCACQ,eAAe;AAArE,wCAAsE;;;;;AAUtE,MAAa,UAAU;;AAAvB,gCAGC;;;;;;AAID,SAAS,eAAe,CAAC,KAAa,EAAE,KAAW,EAAE,MAAc;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACvD,OAAO,IAAI,qBAAc,CAAC,eAAe,EAAE,yBAAyB,MAAM,mBAAmB,CAAC,CAAC;IACnG,CAAC;AACL,CAAC"}
|
package/docs/content/cli.md
CHANGED
|
@@ -68,6 +68,9 @@ node app.js migration:create
|
|
|
68
68
|
|
|
69
69
|
# Non-interactive (CI-safe)
|
|
70
70
|
node app.js migration:create --non-interactive
|
|
71
|
+
|
|
72
|
+
# Emit dialect-specific raw SQL instead of dialect-portable schema-builder calls
|
|
73
|
+
node app.js migration:create --raw
|
|
71
74
|
```
|
|
72
75
|
|
|
73
76
|
Behavior:
|
|
@@ -76,7 +79,7 @@ Behavior:
|
|
|
76
79
|
2. Introspects the live database schema via `information_schema`
|
|
77
80
|
3. Compares the two and detects added/removed/modified tables, columns, indexes, foreign keys, primary key changes, and PostgreSQL enum types
|
|
78
81
|
4. In interactive mode, prompts to detect column renames (avoiding data loss from drop+add)
|
|
79
|
-
5.
|
|
82
|
+
5. **By default, emits dialect-portable `db.schema.create/alter` calls** so the generated migration runs on either MySQL or PostgreSQL. Pass `--raw` to fall back to the legacy dialect-specific SQL emitter.
|
|
80
83
|
6. Writes a timestamped migration file using `createMigration()` format
|
|
81
84
|
|
|
82
85
|
**Non-interactive mode**: Column renames cannot be detected without user input. Ambiguous changes (columns simultaneously added and removed on the same table) are treated as separate DROP/ADD operations, which may cause data loss. A warning is printed when this occurs.
|
|
@@ -22,6 +22,12 @@ Properties ending in `_SECRET` are treated as secrets by the config loader.
|
|
|
22
22
|
| `APP_ENV` | `string` | — | Application environment (`development`, `production`, etc.) |
|
|
23
23
|
| `PORT` | `number` | `3000` | HTTP server port |
|
|
24
24
|
|
|
25
|
+
### Database Selection
|
|
26
|
+
|
|
27
|
+
| Variable | Type | Default | Description |
|
|
28
|
+
| ------------ | -------------------------- | ------- | ------------------------------------------------------------------------------------------ |
|
|
29
|
+
| `DB_ADAPTER` | `'mysql'` \| `'postgres'` | — | Selects the database dialect when using `createDatabase(sharedConfig)` (see [Database](./database.md)). |
|
|
30
|
+
|
|
25
31
|
### MySQL Database
|
|
26
32
|
|
|
27
33
|
| Variable | Type | Default | Description |
|
package/docs/content/database.md
CHANGED
|
@@ -29,6 +29,25 @@ const app = createApp({
|
|
|
29
29
|
|
|
30
30
|
All other MySQL connection options are configured via environment variables (see [Configuration](./configuration.md)).
|
|
31
31
|
|
|
32
|
+
### Choosing the dialect at runtime — `createDatabase()`
|
|
33
|
+
|
|
34
|
+
For dialect-agnostic apps, use `createDatabase()` to select MySQL or PostgreSQL via configuration instead of importing one factory or the other.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { createDatabase } from '@zyno-io/dk-server-foundation';
|
|
38
|
+
|
|
39
|
+
// Reads DB_ADAPTER ('mysql' or 'postgres') from the environment at module load
|
|
40
|
+
class AppDB extends createDatabase({ enableLocksTable: true }, [User, Post, Comment]) {}
|
|
41
|
+
|
|
42
|
+
// Or be explicit (each form keeps its dialect-specific pool config)
|
|
43
|
+
class AppDB extends createDatabase('mysql', { connectionLimit: 20, enableLocksTable: true }, [User]) {}
|
|
44
|
+
class AppDB extends createDatabase('postgres', { max: 20, enableLocksTable: true }, [User]) {}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The shared form only accepts `enableLocksTable`; pool tuning is done via the `MYSQL_*` / `PG_*` env vars. The shared form requires `DB_ADAPTER` to be set and throws at call time if it isn't — use the explicit form when you don't want that dependency.
|
|
48
|
+
|
|
49
|
+
Both forms delegate to `createMySQLDatabase` or `createPostgresDatabase` and return the same kind of class — a subclass of `BaseDatabase`. The existing single-dialect factories remain available.
|
|
50
|
+
|
|
32
51
|
## Entity Creation
|
|
33
52
|
|
|
34
53
|
Type-safe entity creation with automatic inference of optional fields (auto-increment, nullable, or `HasDefault`).
|
|
@@ -340,6 +359,124 @@ class User {
|
|
|
340
359
|
}
|
|
341
360
|
```
|
|
342
361
|
|
|
362
|
+
## Schema Builder (multi-dialect)
|
|
363
|
+
|
|
364
|
+
`db.schema` is a Laravel-style fluent schema builder that emits dialect-appropriate SQL at runtime, so a single migration file works on both MySQL and PostgreSQL.
|
|
365
|
+
|
|
366
|
+
```typescript
|
|
367
|
+
export default createMigration(async db => {
|
|
368
|
+
await db.schema.create('users', t => {
|
|
369
|
+
t.id();
|
|
370
|
+
t.string('email', 255).notNull().unique();
|
|
371
|
+
t.string('name', 255).nullable();
|
|
372
|
+
t.boolean('active').notNull().default(false);
|
|
373
|
+
t.json('metadata').nullable();
|
|
374
|
+
t.enum('status', ['active', 'pending']).notNull().default('pending');
|
|
375
|
+
t.dateTime('createdAt').notNull().defaultRaw('CURRENT_TIMESTAMP');
|
|
376
|
+
t.dateTime('updatedAt').notNull().defaultRaw('CURRENT_TIMESTAMP').onUpdate('CURRENT_TIMESTAMP');
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
await db.schema.create('posts', t => {
|
|
380
|
+
t.id();
|
|
381
|
+
t.bigInteger('userId').unsigned().notNull();
|
|
382
|
+
t.string('title', 200).notNull();
|
|
383
|
+
t.text('body').nullable();
|
|
384
|
+
t.foreign('userId').references('id').on('users').onDelete('cascade');
|
|
385
|
+
t.index('userId');
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
// Escape hatches
|
|
389
|
+
await db.schema.raw(`UPDATE users SET active = TRUE WHERE id < 100`);
|
|
390
|
+
await db.schema.onlyOn('postgres', () => db.rawExecute(`CREATE EXTENSION IF NOT EXISTS pg_trgm`));
|
|
391
|
+
});
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Column types
|
|
395
|
+
|
|
396
|
+
| Method | MySQL | Postgres |
|
|
397
|
+
| ---------------------------------------------- | ----------------------------------------------------- | -------------------------------------------------------- |
|
|
398
|
+
| `id(name='id')` | `BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY` | `BIGSERIAL PRIMARY KEY` |
|
|
399
|
+
| `string(name, len=255)` | `VARCHAR(len)` | `VARCHAR(len)` |
|
|
400
|
+
| `char(name, len=1)` | `CHAR(len)` | `CHAR(len)` |
|
|
401
|
+
| `text(name)` | `TEXT` | `TEXT` |
|
|
402
|
+
| `tinyText(name)` | `TINYTEXT` | `TEXT` |
|
|
403
|
+
| `mediumText(name)` | `MEDIUMTEXT` | `TEXT` |
|
|
404
|
+
| `longText(name)` | `LONGTEXT` | `TEXT` |
|
|
405
|
+
| `tinyint`, `smallint`, `integer`, `bigInteger` | `TINYINT`, `SMALLINT`, `INT`, `BIGINT` | `SMALLINT`, `INTEGER`, `BIGINT` (`tinyint` → `SMALLINT`) |
|
|
406
|
+
| `boolean(name)` | `TINYINT(1)` | `BOOLEAN` |
|
|
407
|
+
| `float`, `double`, `decimal(name, p?, s?)` | `FLOAT`, `DOUBLE`, `DECIMAL(p,s)` | `REAL`, `DOUBLE PRECISION`, `NUMERIC(p,s)` |
|
|
408
|
+
| `date(name)` | `DATE` | `DATE` |
|
|
409
|
+
| `dateTime(name)` | `DATETIME` | `TIMESTAMP` |
|
|
410
|
+
| `timestamp(name)` | `TIMESTAMP` | `TIMESTAMP` |
|
|
411
|
+
| `timestamptz(name)` | `TIMESTAMP` | `TIMESTAMPTZ` |
|
|
412
|
+
| `binary(name, len=16)` | `BINARY(len)` | `BYTEA` |
|
|
413
|
+
| `blob(name)` | `BLOB` | `BYTEA` |
|
|
414
|
+
| `json(name)` | `JSON` | `JSON` |
|
|
415
|
+
| `jsonb(name)` | `JSON` | `JSONB` |
|
|
416
|
+
| `uuid(name)` | `BINARY(16)` (canonical) | `UUID` |
|
|
417
|
+
| `uuidString(name)` | `CHAR(36)` | `CHAR(36)` |
|
|
418
|
+
| `enum(name, values, typeName?)` | `ENUM(...)` inline | `CREATE TYPE` (deduped) + qualified ref |
|
|
419
|
+
| `point(name)` | `POINT` | **throws** (MySQL-only) |
|
|
420
|
+
|
|
421
|
+
### Modifiers
|
|
422
|
+
|
|
423
|
+
`.nullable()`, `.notNull()`, `.default(value)`, `.defaultRaw(expression)`, `.unsigned()` (MySQL-only, ignored on PG), `.onUpdate(expression)` (MySQL-only), `.autoIncrement()`, `.primary()`, `.unique(name?)`, `.index(name?)`, `.references(col).on(table).onDelete(action).onUpdate(action)`.
|
|
424
|
+
|
|
425
|
+
### Table-level
|
|
426
|
+
|
|
427
|
+
`.timestamps()` (createdAt + updatedAt with `CURRENT_TIMESTAMP`), `.primary([cols])` (composite PK), `.index(cols, name?)`, `.unique(cols, name?)`, `.spatialIndex(cols, name?)` (MySQL POINT), `.foreign(cols, name?).references(...).on(...)`.
|
|
428
|
+
|
|
429
|
+
### Schema operations
|
|
430
|
+
|
|
431
|
+
`db.schema.create(name, fn)`, `db.schema.alter(name, fn)`, `db.schema.drop(name)`, `db.schema.dropIfExists(name)`, `db.schema.rename(from, to)`, `db.schema.enumType(name, values)` (PG explicit type), `db.schema.raw(sql)`, `db.schema.onlyOn(dialect, fn)`.
|
|
432
|
+
|
|
433
|
+
### Introspection (for idempotent migrations)
|
|
434
|
+
|
|
435
|
+
```typescript
|
|
436
|
+
if (!(await db.schema.hasTable('users'))) {
|
|
437
|
+
/* ... */
|
|
438
|
+
}
|
|
439
|
+
if (await db.schema.hasColumn('users', 'phone')) {
|
|
440
|
+
/* ... */
|
|
441
|
+
}
|
|
442
|
+
if (await db.schema.hasIndex('users', 'users_email_unique')) {
|
|
443
|
+
/* ... */
|
|
444
|
+
}
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### Altering tables — `db.schema.alter()`
|
|
448
|
+
|
|
449
|
+
```typescript
|
|
450
|
+
await db.schema.alter('users', t => {
|
|
451
|
+
// Add columns (same syntax as create)
|
|
452
|
+
t.string('phone', 20).nullable();
|
|
453
|
+
t.boolean('archived').notNull().default(false);
|
|
454
|
+
|
|
455
|
+
// Modify an existing column (Laravel-style .change() suffix)
|
|
456
|
+
t.string('email', 500).notNull().change();
|
|
457
|
+
|
|
458
|
+
// Drop / rename columns
|
|
459
|
+
t.dropColumn('legacyField');
|
|
460
|
+
t.renameColumn('old_name', 'new_name');
|
|
461
|
+
|
|
462
|
+
// Indexes & foreign keys
|
|
463
|
+
t.index('phone');
|
|
464
|
+
t.dropUnique('users_email_unique');
|
|
465
|
+
t.foreign('orgId').references('id').on('orgs').onDelete('cascade');
|
|
466
|
+
t.dropForeign('users_old_fk');
|
|
467
|
+
|
|
468
|
+
// Primary key
|
|
469
|
+
t.dropPrimary();
|
|
470
|
+
t.primary(['a', 'b']);
|
|
471
|
+
});
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
Operations execute in dependency-safe order: drop FKs → drop indexes → drop PK → drop columns → rename columns → PG enum type prep → add columns → modify columns → add PK → add indexes → defer added FKs to flush. Added FKs are deferred (same as `create()`) so cross-table refs resolve.
|
|
475
|
+
|
|
476
|
+
### How FK ordering works
|
|
477
|
+
|
|
478
|
+
Inline FKs declared via `t.foreign(...)` are deferred and emitted as `ALTER TABLE ... ADD CONSTRAINT` after all `CREATE TABLE`s in the migration complete. The migration runner calls `db.schema.flush()` automatically; you can also call it manually if you need FKs applied mid-migration. PG enum types are deduplicated per-migration via the `enumTypeName` (so the same shared enum across two tables emits only one `CREATE TYPE` + `CREATE CAST`).
|
|
479
|
+
|
|
343
480
|
## Migrations
|
|
344
481
|
|
|
345
482
|
### Generating Migrations
|
package/package.json
CHANGED
package/src/app/config.ts
CHANGED
package/src/database/common.ts
CHANGED
|
@@ -32,6 +32,34 @@ DatabaseSession.prototype.addPostCommitHook = function (hook: () => Promise<void
|
|
|
32
32
|
this[PostCommitHooksSymbol]!.push(hook);
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
+
type LocksAdapterState = SQLDatabaseAdapter & { _enableLocksTable?: boolean; _locksTableInit?: Promise<void> };
|
|
36
|
+
|
|
37
|
+
async function ensureMysqlLocksTable(adapter: SQLDatabaseAdapter): Promise<void> {
|
|
38
|
+
const a = adapter as LocksAdapterState;
|
|
39
|
+
if (!a._enableLocksTable) return; // creator opted out
|
|
40
|
+
if (a._locksTableInit) {
|
|
41
|
+
await a._locksTableInit;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
a._locksTableInit = (async () => {
|
|
45
|
+
const conn = await adapter.connectionPool.getConnection();
|
|
46
|
+
try {
|
|
47
|
+
await conn.run(
|
|
48
|
+
`CREATE TABLE IF NOT EXISTS \`_locks\` (
|
|
49
|
+
\`key\` VARCHAR(255) NOT NULL PRIMARY KEY,
|
|
50
|
+
\`createdAt\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
51
|
+
\`lastTouched\` DATETIME
|
|
52
|
+
)`,
|
|
53
|
+
[]
|
|
54
|
+
);
|
|
55
|
+
await conn.run(`DELETE FROM _locks WHERE lastTouched < NOW() - INTERVAL 1 HOUR`, []);
|
|
56
|
+
} finally {
|
|
57
|
+
conn.release();
|
|
58
|
+
}
|
|
59
|
+
})();
|
|
60
|
+
await a._locksTableInit;
|
|
61
|
+
}
|
|
62
|
+
|
|
35
63
|
DatabaseSession.prototype.acquireSessionLock = async function (key: MutexKey | MutexKey[]) {
|
|
36
64
|
const flattenedKey = flattenMutexKey(key);
|
|
37
65
|
const adapter = this.adapter as SQLDatabaseAdapter;
|
|
@@ -47,6 +75,10 @@ DatabaseSession.prototype.acquireSessionLock = async function (key: MutexKey | M
|
|
|
47
75
|
// then we can use an in-transaction row level update so that a row-level lock is acquired
|
|
48
76
|
// this will be automatically released when the transaction is committed or rolled back
|
|
49
77
|
|
|
78
|
+
// Lazy-initialize the _locks table on first use (gated by createMySQLDatabase's enableLocksTable flag).
|
|
79
|
+
// This avoids a constructor-time fire-and-forget that would race with pool teardown for fast CLIs.
|
|
80
|
+
await ensureMysqlLocksTable(adapter);
|
|
81
|
+
|
|
50
82
|
// insert the lock row outside the transaction on a separate connection
|
|
51
83
|
const insertConn = await adapter.connectionPool.getConnection();
|
|
52
84
|
try {
|
|
@@ -84,6 +116,25 @@ export class BaseDatabase<A extends DatabaseAdapter = DatabaseAdapter> extends D
|
|
|
84
116
|
// override existing definition
|
|
85
117
|
declare query: <T extends OrmEntity>(type?: QueryClassType<T>, txn?: DatabaseSession<DatabaseAdapter>) => SQLDatabaseQuery<T>;
|
|
86
118
|
|
|
119
|
+
private _schema?: import('./schema').Schema;
|
|
120
|
+
|
|
121
|
+
/** Multi-dialect schema builder. See src/database/schema/. */
|
|
122
|
+
get schema(): import('./schema').Schema {
|
|
123
|
+
if (!this._schema) {
|
|
124
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
125
|
+
const { Schema, MySQLGrammar, PostgresGrammar } = require('./schema') as typeof import('./schema');
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
127
|
+
const { getDialect } = require('./dialect') as typeof import('./dialect');
|
|
128
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
129
|
+
const { getAppConfig } = require('../app/resolver') as typeof import('../app/resolver');
|
|
130
|
+
const dialect = getDialect(this.adapter as unknown as import('@deepkit/sql').SQLDatabaseAdapter);
|
|
131
|
+
const pgSchema = dialect === 'postgres' ? (getAppConfig().PG_SCHEMA ?? 'public') : 'public';
|
|
132
|
+
const grammar = dialect === 'postgres' ? new PostgresGrammar(pgSchema) : new MySQLGrammar(pgSchema);
|
|
133
|
+
this._schema = new Schema(this, grammar);
|
|
134
|
+
}
|
|
135
|
+
return this._schema;
|
|
136
|
+
}
|
|
137
|
+
|
|
87
138
|
async transaction<T>(callback: (session: DatabaseSession<A>) => Promise<T>): Promise<T> {
|
|
88
139
|
let session_: DatabaseSession<DatabaseAdapter> | undefined;
|
|
89
140
|
const result = await super.transaction(async session => {
|