@mikro-orm/knex 6.4.6-dev.9 → 7.0.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/AbstractSqlConnection.d.ts +15 -25
  2. package/AbstractSqlConnection.js +98 -126
  3. package/AbstractSqlDriver.d.ts +20 -13
  4. package/AbstractSqlDriver.js +73 -54
  5. package/AbstractSqlPlatform.d.ts +15 -3
  6. package/AbstractSqlPlatform.js +32 -11
  7. package/README.md +0 -2
  8. package/SqlEntityManager.d.ts +5 -6
  9. package/SqlEntityManager.js +5 -5
  10. package/SqlEntityRepository.d.ts +1 -6
  11. package/SqlEntityRepository.js +0 -6
  12. package/dialects/mssql/MsSqlNativeQueryBuilder.d.ts +12 -0
  13. package/dialects/mssql/MsSqlNativeQueryBuilder.js +161 -0
  14. package/dialects/mssql/index.d.ts +1 -1
  15. package/dialects/mssql/index.js +1 -1
  16. package/dialects/mysql/MySqlExceptionConverter.js +1 -0
  17. package/dialects/mysql/MySqlNativeQueryBuilder.d.ts +7 -0
  18. package/dialects/mysql/MySqlNativeQueryBuilder.js +81 -0
  19. package/dialects/mysql/MySqlPlatform.d.ts +5 -1
  20. package/dialects/mysql/MySqlPlatform.js +9 -1
  21. package/dialects/mysql/MySqlSchemaHelper.d.ts +6 -12
  22. package/dialects/mysql/MySqlSchemaHelper.js +42 -75
  23. package/dialects/mysql/index.d.ts +1 -3
  24. package/dialects/mysql/index.js +1 -3
  25. package/dialects/postgresql/PostgreSqlNativeQueryBuilder.d.ts +5 -0
  26. package/dialects/postgresql/PostgreSqlNativeQueryBuilder.js +12 -0
  27. package/dialects/postgresql/index.d.ts +1 -1
  28. package/dialects/postgresql/index.js +1 -1
  29. package/dialects/sqlite/BaseSqliteConnection.d.ts +0 -5
  30. package/dialects/sqlite/BaseSqliteConnection.js +4 -42
  31. package/dialects/sqlite/BaseSqlitePlatform.d.ts +15 -3
  32. package/dialects/sqlite/BaseSqlitePlatform.js +20 -4
  33. package/dialects/sqlite/SqliteExceptionConverter.d.ts +9 -0
  34. package/dialects/sqlite/SqliteExceptionConverter.js +55 -0
  35. package/dialects/sqlite/SqliteNativeQueryBuilder.d.ts +6 -0
  36. package/dialects/sqlite/SqliteNativeQueryBuilder.js +15 -0
  37. package/dialects/sqlite/SqliteSchemaHelper.d.ts +38 -0
  38. package/dialects/sqlite/SqliteSchemaHelper.js +384 -0
  39. package/dialects/sqlite/index.d.ts +3 -5
  40. package/dialects/sqlite/index.js +3 -5
  41. package/index.d.ts +1 -2
  42. package/index.js +3 -5
  43. package/index.mjs +10 -13
  44. package/package.json +4 -18
  45. package/query/CriteriaNodeFactory.js +5 -5
  46. package/query/NativeQueryBuilder.d.ts +108 -0
  47. package/query/NativeQueryBuilder.js +429 -0
  48. package/query/ObjectCriteriaNode.js +3 -3
  49. package/query/QueryBuilder.d.ts +30 -34
  50. package/query/QueryBuilder.js +112 -123
  51. package/query/QueryBuilderHelper.d.ts +27 -23
  52. package/query/QueryBuilderHelper.js +174 -168
  53. package/query/ScalarCriteriaNode.js +4 -0
  54. package/query/index.d.ts +1 -0
  55. package/query/index.js +1 -0
  56. package/schema/DatabaseSchema.js +9 -6
  57. package/schema/DatabaseTable.d.ts +2 -1
  58. package/schema/DatabaseTable.js +9 -5
  59. package/schema/SchemaComparator.d.ts +1 -2
  60. package/schema/SchemaComparator.js +31 -18
  61. package/schema/SchemaHelper.d.ts +27 -33
  62. package/schema/SchemaHelper.js +294 -184
  63. package/schema/SqlSchemaGenerator.d.ts +3 -9
  64. package/schema/SqlSchemaGenerator.js +105 -229
  65. package/typings.d.ts +7 -17
  66. package/MonkeyPatchable.d.ts +0 -18
  67. package/MonkeyPatchable.js +0 -60
  68. package/dialects/mssql/MsSqlColumnCompiler.d.ts +0 -4
  69. package/dialects/mssql/MsSqlColumnCompiler.js +0 -10
  70. package/dialects/mssql/MsSqlKnexDialect.d.ts +0 -6
  71. package/dialects/mssql/MsSqlKnexDialect.js +0 -22
  72. package/dialects/mssql/MsSqlQueryCompiler.d.ts +0 -12
  73. package/dialects/mssql/MsSqlQueryCompiler.js +0 -94
  74. package/dialects/mssql/MsSqlTableCompiler.d.ts +0 -9
  75. package/dialects/mssql/MsSqlTableCompiler.js +0 -40
  76. package/dialects/mysql/MariaDbKnexDialect.d.ts +0 -6
  77. package/dialects/mysql/MariaDbKnexDialect.js +0 -16
  78. package/dialects/mysql/MySqlColumnCompiler.d.ts +0 -7
  79. package/dialects/mysql/MySqlColumnCompiler.js +0 -26
  80. package/dialects/mysql/MySqlConnection.d.ts +0 -8
  81. package/dialects/mysql/MySqlConnection.js +0 -43
  82. package/dialects/mysql/MySqlKnexDialect.d.ts +0 -5
  83. package/dialects/mysql/MySqlKnexDialect.js +0 -17
  84. package/dialects/mysql/MySqlQueryCompiler.d.ts +0 -5
  85. package/dialects/mysql/MySqlQueryCompiler.js +0 -23
  86. package/dialects/postgresql/PostgreSqlKnexDialect.d.ts +0 -7
  87. package/dialects/postgresql/PostgreSqlKnexDialect.js +0 -20
  88. package/dialects/postgresql/PostgreSqlQueryCompiler.d.ts +0 -4
  89. package/dialects/postgresql/PostgreSqlQueryCompiler.js +0 -13
  90. package/dialects/postgresql/PostgreSqlTableCompiler.d.ts +0 -11
  91. package/dialects/postgresql/PostgreSqlTableCompiler.js +0 -89
  92. package/dialects/sqlite/BaseSqliteSchemaHelper.d.ts +0 -28
  93. package/dialects/sqlite/BaseSqliteSchemaHelper.js +0 -200
  94. package/dialects/sqlite/BetterSqliteKnexDialect.d.ts +0 -5
  95. package/dialects/sqlite/BetterSqliteKnexDialect.js +0 -15
  96. package/dialects/sqlite/LibSqlKnexDialect.d.ts +0 -11
  97. package/dialects/sqlite/LibSqlKnexDialect.js +0 -85
  98. package/dialects/sqlite/SqliteKnexDialect.d.ts +0 -8
  99. package/dialects/sqlite/SqliteKnexDialect.js +0 -67
  100. package/dialects/sqlite/SqliteTableCompiler.d.ts +0 -6
  101. package/dialects/sqlite/SqliteTableCompiler.js +0 -71
@@ -1,200 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BaseSqliteSchemaHelper = void 0;
4
- const SchemaHelper_1 = require("../../schema/SchemaHelper");
5
- class BaseSqliteSchemaHelper extends SchemaHelper_1.SchemaHelper {
6
- disableForeignKeysSQL() {
7
- return 'pragma foreign_keys = off;';
8
- }
9
- enableForeignKeysSQL() {
10
- return 'pragma foreign_keys = on;';
11
- }
12
- supportsSchemaConstraints() {
13
- return false;
14
- }
15
- getListTablesSQL() {
16
- return `select name as table_name from sqlite_master where type = 'table' and name != 'sqlite_sequence' and name != 'geometry_columns' and name != 'spatial_ref_sys' `
17
- + `union all select name as table_name from sqlite_temp_master where type = 'table' order by name`;
18
- }
19
- getDropDatabaseSQL(name) {
20
- if (name === ':memory:') {
21
- return '';
22
- }
23
- /* istanbul ignore next */
24
- return `drop database if exists ${this.platform.quoteIdentifier(name)}`;
25
- }
26
- getDropColumnsSQL(tableName, columns, schemaName) {
27
- /* istanbul ignore next */
28
- const name = this.platform.quoteIdentifier((schemaName && schemaName !== this.platform.getDefaultSchemaName() ? schemaName + '.' : '') + tableName);
29
- return columns.map(column => {
30
- return `alter table ${name} drop column ${this.platform.quoteIdentifier(column.name)}`;
31
- }).join(';\n');
32
- }
33
- parseTableDefinition(sql, cols) {
34
- const columns = {};
35
- // extract all columns definitions
36
- let columnsDef = sql.replaceAll('\n', '').match(new RegExp(`create table [\`"']?.*?[\`"']? \\((.*)\\)`, 'i'))?.[1];
37
- /* istanbul ignore else */
38
- if (columnsDef) {
39
- for (let i = cols.length - 1; i >= 0; i--) {
40
- const col = cols[i];
41
- const re = ` *, *[\`"']?${col.name}[\`"']? (.*)`;
42
- const columnDef = columnsDef.match(new RegExp(re, 'i'));
43
- /* istanbul ignore else */
44
- if (columnDef) {
45
- columns[col.name] = { name: col.name, definition: columnDef[1] };
46
- columnsDef = columnsDef.substring(0, columnDef.index);
47
- }
48
- }
49
- }
50
- return columns;
51
- }
52
- async getColumns(connection, tableName, schemaName) {
53
- const columns = await connection.execute(`pragma table_xinfo('${tableName}')`);
54
- const sql = `select sql from sqlite_master where type = ? and name = ?`;
55
- const tableDefinition = await connection.execute(sql, ['table', tableName], 'get');
56
- const composite = columns.reduce((count, col) => count + (col.pk ? 1 : 0), 0) > 1;
57
- // there can be only one, so naive check like this should be enough
58
- const hasAutoincrement = tableDefinition.sql.toLowerCase().includes('autoincrement');
59
- const columnDefinitions = this.parseTableDefinition(tableDefinition.sql, columns);
60
- return columns.map(col => {
61
- const mappedType = connection.getPlatform().getMappedType(col.type);
62
- let generated;
63
- if (col.hidden > 1) {
64
- /* istanbul ignore next */
65
- const storage = col.hidden === 2 ? 'virtual' : 'stored';
66
- const re = `(generated always)? as \\((.*)\\)( ${storage})?$`;
67
- const match = columnDefinitions[col.name].definition.match(re);
68
- if (match) {
69
- generated = `${match[2]} ${storage}`;
70
- }
71
- }
72
- return {
73
- name: col.name,
74
- type: col.type,
75
- default: col.dflt_value,
76
- nullable: !col.notnull,
77
- primary: !!col.pk,
78
- mappedType,
79
- unsigned: false,
80
- autoincrement: !composite && col.pk && this.platform.isNumericColumn(mappedType) && hasAutoincrement,
81
- generated,
82
- };
83
- });
84
- }
85
- async getEnumDefinitions(connection, checks, tableName, schemaName) {
86
- const sql = `select sql from sqlite_master where type = ? and name = ?`;
87
- const tableDefinition = await connection.execute(sql, ['table', tableName], 'get');
88
- const checkConstraints = [...tableDefinition.sql.match(/[`["'][^`\]"']+[`\]"'] text check \(.*?\)/gi) ?? []];
89
- return checkConstraints.reduce((o, item) => {
90
- // check constraints are defined as (note that last closing paren is missing):
91
- // `type` text check (`type` in ('local', 'global')
92
- const match = item.match(/[`["']([^`\]"']+)[`\]"'] text check \(.* \((.*)\)/i);
93
- /* istanbul ignore else */
94
- if (match) {
95
- o[match[1]] = match[2].split(',').map((item) => item.trim().match(/^\(?'(.*)'/)[1]);
96
- }
97
- return o;
98
- }, {});
99
- }
100
- async getPrimaryKeys(connection, indexes, tableName, schemaName) {
101
- const sql = `pragma table_info(\`${tableName}\`)`;
102
- const cols = await connection.execute(sql);
103
- return cols.filter(col => !!col.pk).map(col => col.name);
104
- }
105
- async getIndexes(connection, tableName, schemaName) {
106
- const sql = `pragma table_info(\`${tableName}\`)`;
107
- const cols = await connection.execute(sql);
108
- const indexes = await connection.execute(`pragma index_list(\`${tableName}\`)`);
109
- const ret = [];
110
- for (const col of cols.filter(c => c.pk)) {
111
- ret.push({
112
- columnNames: [col.name],
113
- keyName: 'primary',
114
- constraint: true,
115
- unique: true,
116
- primary: true,
117
- });
118
- }
119
- for (const index of indexes.filter(index => !this.isImplicitIndex(index.name))) {
120
- const res = await connection.execute(`pragma index_info(\`${index.name}\`)`);
121
- ret.push(...res.map(row => ({
122
- columnNames: [row.name],
123
- keyName: index.name,
124
- unique: !!index.unique,
125
- constraint: !!index.unique,
126
- primary: false,
127
- })));
128
- }
129
- return this.mapIndexes(ret);
130
- }
131
- async getChecks(connection, tableName, schemaName) {
132
- // Not supported at the moment.
133
- return [];
134
- }
135
- getForeignKeysSQL(tableName) {
136
- return `pragma foreign_key_list(\`${tableName}\`)`;
137
- }
138
- mapForeignKeys(fks, tableName) {
139
- return fks.reduce((ret, fk) => {
140
- ret[fk.from] = {
141
- constraintName: this.platform.getIndexName(tableName, [fk.from], 'foreign'),
142
- columnName: fk.from,
143
- columnNames: [fk.from],
144
- localTableName: tableName,
145
- referencedTableName: fk.table,
146
- referencedColumnName: fk.to,
147
- referencedColumnNames: [fk.to],
148
- updateRule: fk.on_update.toLowerCase(),
149
- deleteRule: fk.on_delete.toLowerCase(),
150
- };
151
- return ret;
152
- }, {});
153
- }
154
- getManagementDbName() {
155
- return '';
156
- }
157
- getCreateDatabaseSQL(name) {
158
- return '';
159
- }
160
- async databaseExists(connection, name) {
161
- const tables = await connection.execute(this.getListTablesSQL());
162
- return tables.length > 0;
163
- }
164
- /**
165
- * Implicit indexes will be ignored when diffing
166
- */
167
- isImplicitIndex(name) {
168
- // Ignore indexes with reserved names, e.g. autoindexes
169
- return name.startsWith('sqlite_');
170
- }
171
- async getAlterTable(changedTable, wrap) {
172
- const tempName = `${(changedTable.toTable.name)}__temp_alter`;
173
- const quotedName = this.platform.quoteIdentifier(changedTable.toTable.name);
174
- const quotedTempName = this.platform.quoteIdentifier(tempName);
175
- const createSql = await this.dump(this.createTable(changedTable.toTable), '');
176
- const [first, ...rest] = createSql.split('\n');
177
- const sql = [
178
- 'pragma foreign_keys = off;',
179
- first.replace(`create table ${quotedName}`, `create table ${quotedTempName}`),
180
- ];
181
- const columns = [];
182
- for (const column of changedTable.toTable.getColumns()) {
183
- const fromColumn = changedTable.fromTable.getColumn(column.name);
184
- /* istanbul ignore else */
185
- if (fromColumn) {
186
- columns.push(this.platform.quoteIdentifier(column.name));
187
- }
188
- else {
189
- columns.push(`null as ${this.platform.quoteIdentifier(column.name)}`);
190
- }
191
- }
192
- sql.push(`insert into ${quotedTempName} select ${columns.join(', ')} from ${quotedName};`);
193
- sql.push(`drop table ${quotedName};`);
194
- sql.push(`alter table ${quotedTempName} rename to ${quotedName};`);
195
- sql.push(...rest);
196
- sql.push('pragma foreign_keys = on;');
197
- return sql.join('\n');
198
- }
199
- }
200
- exports.BaseSqliteSchemaHelper = BaseSqliteSchemaHelper;
@@ -1,5 +0,0 @@
1
- import { MonkeyPatchable } from '../../MonkeyPatchable';
2
- export declare class BetterSqliteKnexDialect extends MonkeyPatchable.BetterSqlite3Dialect {
3
- _driver(): any;
4
- tableCompiler(): any;
5
- }
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BetterSqliteKnexDialect = void 0;
4
- const SqliteTableCompiler_1 = require("./SqliteTableCompiler");
5
- const MonkeyPatchable_1 = require("../../MonkeyPatchable");
6
- class BetterSqliteKnexDialect extends MonkeyPatchable_1.MonkeyPatchable.BetterSqlite3Dialect {
7
- _driver() {
8
- return require('better-sqlite3');
9
- }
10
- tableCompiler() {
11
- // eslint-disable-next-line prefer-rest-params
12
- return new SqliteTableCompiler_1.SqliteTableCompiler(this, ...arguments);
13
- }
14
- }
15
- exports.BetterSqliteKnexDialect = BetterSqliteKnexDialect;
@@ -1,11 +0,0 @@
1
- import { MonkeyPatchable } from '../../MonkeyPatchable';
2
- export declare class LibSqlKnexDialect extends MonkeyPatchable.BetterSqlite3Dialect {
3
- get driverName(): string;
4
- _driver(): any;
5
- _query(this: any, connection: any, obj: any): Promise<any>;
6
- acquireRawConnection(this: any): Promise<any>;
7
- tableCompiler(): any;
8
- validateConnection(connection: any): boolean;
9
- private getCallMethod;
10
- private isRunQuery;
11
- }
@@ -1,85 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LibSqlKnexDialect = void 0;
4
- const SqliteTableCompiler_1 = require("./SqliteTableCompiler");
5
- const MonkeyPatchable_1 = require("../../MonkeyPatchable");
6
- class LibSqlKnexDialect extends MonkeyPatchable_1.MonkeyPatchable.BetterSqlite3Dialect {
7
- get driverName() {
8
- return 'libsql';
9
- }
10
- _driver() {
11
- return require('libsql');
12
- }
13
- async _query(connection, obj) {
14
- /* istanbul ignore next */
15
- if (!obj.sql) {
16
- throw new Error('The query is empty');
17
- }
18
- /* istanbul ignore next */
19
- if (!connection) {
20
- throw new Error('No connection provided');
21
- }
22
- const callMethod = this.getCallMethod(obj);
23
- const statement = connection.prepare(obj.sql);
24
- const bindings = this._formatBindings(obj.bindings);
25
- const response = await statement[callMethod](bindings);
26
- obj.response = response;
27
- obj.context = {
28
- lastID: response.lastInsertRowid,
29
- changes: response.changes,
30
- };
31
- return obj;
32
- }
33
- async acquireRawConnection() {
34
- const connection = new this.driver(this.connectionSettings.filename, {
35
- ...this.connectionSettings,
36
- });
37
- connection.__created = Date.now();
38
- return connection;
39
- }
40
- tableCompiler() {
41
- // eslint-disable-next-line prefer-rest-params
42
- return new SqliteTableCompiler_1.SqliteTableCompiler(this, ...arguments);
43
- }
44
- validateConnection(connection) {
45
- if (connection.memory) {
46
- return true;
47
- }
48
- /* istanbul ignore next */
49
- return connection.__created > Date.now() - 10_000;
50
- }
51
- getCallMethod(obj) {
52
- if (obj.method === 'raw') {
53
- const query = obj.sql.trim().toLowerCase();
54
- if ((query.startsWith('insert into') || query.startsWith('update ')) && query.includes(' returning ')) {
55
- return 'all';
56
- }
57
- if (this.isRunQuery(query)) {
58
- return 'run';
59
- }
60
- }
61
- /* istanbul ignore next */
62
- switch (obj.method) {
63
- case 'insert':
64
- case 'update':
65
- return obj.returning ? 'all' : 'run';
66
- case 'counter':
67
- case 'del':
68
- return 'run';
69
- default:
70
- return 'all';
71
- }
72
- }
73
- isRunQuery(query) {
74
- query = query.trim().toLowerCase();
75
- /* istanbul ignore next */
76
- if ((query.startsWith('insert into') || query.startsWith('update ')) && query.includes(' returning ')) {
77
- return false;
78
- }
79
- return query.startsWith('insert into') ||
80
- query.startsWith('update') ||
81
- query.startsWith('delete') ||
82
- query.startsWith('truncate');
83
- }
84
- }
85
- exports.LibSqlKnexDialect = LibSqlKnexDialect;
@@ -1,8 +0,0 @@
1
- import { MonkeyPatchable } from '../../MonkeyPatchable';
2
- export declare class SqliteKnexDialect extends MonkeyPatchable.Sqlite3Dialect {
3
- tableCompiler(): any;
4
- processResponse(obj: any, runner: any): any;
5
- _query(connection: any, obj: any): Promise<unknown>;
6
- private getCallMethod;
7
- private isRunQuery;
8
- }
@@ -1,67 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SqliteKnexDialect = void 0;
4
- const SqliteTableCompiler_1 = require("./SqliteTableCompiler");
5
- const MonkeyPatchable_1 = require("../../MonkeyPatchable");
6
- class SqliteKnexDialect extends MonkeyPatchable_1.MonkeyPatchable.Sqlite3Dialect {
7
- tableCompiler() {
8
- // eslint-disable-next-line prefer-rest-params
9
- return new SqliteTableCompiler_1.SqliteTableCompiler(this, ...arguments);
10
- }
11
- processResponse(obj, runner) {
12
- if (obj.method === 'raw' && this.isRunQuery(obj.sql)) {
13
- return obj.response ?? obj.context;
14
- }
15
- return super.processResponse(obj, runner);
16
- }
17
- _query(connection, obj) {
18
- const callMethod = this.getCallMethod(obj);
19
- return new Promise((resolve, reject) => {
20
- /* istanbul ignore if */
21
- if (!connection?.[callMethod]) {
22
- return reject(new Error(`Error calling ${callMethod} on connection.`));
23
- }
24
- connection[callMethod](obj.sql, obj.bindings, function (err, response) {
25
- if (err) {
26
- return reject(err);
27
- }
28
- obj.response = response;
29
- obj.context = this;
30
- return resolve(obj);
31
- });
32
- });
33
- }
34
- getCallMethod(obj) {
35
- if (obj.method === 'raw') {
36
- const query = obj.sql.trim().toLowerCase();
37
- if ((query.startsWith('insert into') || query.startsWith('update ')) && query.includes(' returning ')) {
38
- return 'all';
39
- }
40
- if (this.isRunQuery(query)) {
41
- return 'run';
42
- }
43
- }
44
- /* istanbul ignore next */
45
- switch (obj.method) {
46
- case 'insert':
47
- case 'update':
48
- return obj.returning ? 'all' : 'run';
49
- case 'counter':
50
- case 'del':
51
- return 'run';
52
- default:
53
- return 'all';
54
- }
55
- }
56
- isRunQuery(query) {
57
- query = query.trim().toLowerCase();
58
- if ((query.startsWith('insert into') || query.startsWith('update ')) && query.includes(' returning ')) {
59
- return false;
60
- }
61
- return query.startsWith('insert into') ||
62
- query.startsWith('update') ||
63
- query.startsWith('delete') ||
64
- query.startsWith('truncate');
65
- }
66
- }
67
- exports.SqliteKnexDialect = SqliteKnexDialect;
@@ -1,6 +0,0 @@
1
- import type { Dictionary } from '@mikro-orm/core';
2
- import { MonkeyPatchable } from '../../MonkeyPatchable';
3
- export declare class SqliteTableCompiler extends MonkeyPatchable.Sqlite3DialectTableCompiler {
4
- foreign(this: any, foreignInfo: Dictionary): void;
5
- foreignKeys(this: any): string;
6
- }
@@ -1,71 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SqliteTableCompiler = void 0;
4
- const MonkeyPatchable_1 = require("../../MonkeyPatchable");
5
- class SqliteTableCompiler extends MonkeyPatchable_1.MonkeyPatchable.Sqlite3DialectTableCompiler {
6
- foreign(foreignInfo) {
7
- foreignInfo.column = Array.isArray(foreignInfo.column)
8
- ? foreignInfo.column
9
- : [foreignInfo.column];
10
- foreignInfo.column = foreignInfo.column.map((column) => this.client.customWrapIdentifier(column, (a) => a));
11
- foreignInfo.inTable = this.client.customWrapIdentifier(foreignInfo.inTable, (a) => a);
12
- foreignInfo.references = Array.isArray(foreignInfo.references)
13
- ? foreignInfo.references
14
- : [foreignInfo.references];
15
- foreignInfo.references = foreignInfo.references.map((column) => this.client.customWrapIdentifier(column, (a) => a));
16
- // quoted versions
17
- const column = this.formatter.columnize(foreignInfo.column);
18
- const inTable = this.formatter.columnize(foreignInfo.inTable);
19
- const references = this.formatter.columnize(foreignInfo.references);
20
- const keyName = this.formatter.columnize(foreignInfo.keyName);
21
- const addColumnQuery = this.sequence.find((query) => query.sql.includes(`add column ${column[0]}`));
22
- // no need for temp tables if we just add a column
23
- if (addColumnQuery) {
24
- /* istanbul ignore next */
25
- const onUpdate = foreignInfo.onUpdate ? ` on update ${foreignInfo.onUpdate}` : '';
26
- /* istanbul ignore next */
27
- const onDelete = foreignInfo.onDelete ? ` on delete ${foreignInfo.onDelete}` : '';
28
- addColumnQuery.sql += ` constraint ${keyName} references ${inTable} (${references})${onUpdate}${onDelete}`;
29
- return;
30
- }
31
- // eslint-disable-next-line @typescript-eslint/no-this-alias
32
- const compiler = this;
33
- if (this.method !== 'create' && this.method !== 'createIfNot') {
34
- this.pushQuery({
35
- sql: `PRAGMA table_info(${this.tableName()})`,
36
- statementsProducer(pragma, connection) {
37
- return compiler.client
38
- .ddl(compiler, pragma, connection)
39
- .foreign(foreignInfo);
40
- },
41
- });
42
- }
43
- }
44
- foreignKeys() {
45
- let sql = '';
46
- const foreignKeys = (this.grouped.alterTable || []).filter((o) => o.method === 'foreign');
47
- for (let i = 0, l = foreignKeys.length; i < l; i++) {
48
- const foreign = foreignKeys[i].args[0];
49
- const column = this.formatter.columnize(foreign.column);
50
- const references = this.formatter.columnize(foreign.references);
51
- const foreignTable = this.formatter.wrap(foreign.inTable);
52
- /* istanbul ignore next */
53
- let constraintName = foreign.keyName || '';
54
- if (constraintName) {
55
- constraintName = ' constraint ' + this.formatter.wrap(constraintName);
56
- }
57
- sql += `,${constraintName} foreign key(${column}) references ${foreignTable}(${references})`;
58
- if (foreign.onDelete) {
59
- sql += ` on delete ${foreign.onDelete}`;
60
- }
61
- if (foreign.onUpdate) {
62
- sql += ` on update ${foreign.onUpdate}`;
63
- }
64
- if (foreign.deferrable) {
65
- sql += ` deferrable initially ${foreign.deferrable}`;
66
- }
67
- }
68
- return sql;
69
- }
70
- }
71
- exports.SqliteTableCompiler = SqliteTableCompiler;