@forestadmin/datasource-sql 1.7.41 → 1.7.43
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/introspection/dialects/dialect-factory.d.ts +4 -0
- package/dist/introspection/dialects/dialect-factory.js +28 -0
- package/dist/introspection/dialects/dialect.interface.d.ts +12 -0
- package/dist/introspection/dialects/dialect.interface.js +3 -0
- package/dist/introspection/dialects/mariadb-dialect.d.ts +8 -0
- package/dist/introspection/dialects/mariadb-dialect.js +40 -0
- package/dist/introspection/dialects/mssql-dialect.d.ts +14 -0
- package/dist/introspection/dialects/mssql-dialect.js +150 -0
- package/dist/introspection/dialects/mysql-dialect/index.d.ts +26 -0
- package/dist/introspection/dialects/mysql-dialect/index.js +93 -0
- package/dist/introspection/dialects/mysql-dialect/parse-enum.d.ts +5 -0
- package/dist/introspection/dialects/mysql-dialect/parse-enum.js +44 -0
- package/dist/introspection/dialects/postgresql-dialect/index.d.ts +20 -0
- package/dist/introspection/dialects/postgresql-dialect/index.js +153 -0
- package/dist/introspection/dialects/postgresql-dialect/parse-array.d.ts +5 -0
- package/dist/introspection/dialects/postgresql-dialect/parse-array.js +39 -0
- package/dist/introspection/dialects/sqlite-dialect.d.ts +9 -0
- package/dist/introspection/dialects/sqlite-dialect.js +63 -0
- package/dist/introspection/helpers/default-value-parser.d.ts +4 -9
- package/dist/introspection/helpers/default-value-parser.js +15 -48
- package/dist/introspection/helpers/sql-type-converter.d.ts +3 -2
- package/dist/introspection/helpers/sql-type-converter.js +5 -11
- package/dist/introspection/introspector.d.ts +1 -1
- package/dist/introspection/introspector.js +51 -78
- package/dist/introspection/type-overrides.d.ts +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const mariadb_dialect_1 = __importDefault(require("./mariadb-dialect"));
|
|
7
|
+
const mssql_dialect_1 = __importDefault(require("./mssql-dialect"));
|
|
8
|
+
const mysql_dialect_1 = __importDefault(require("./mysql-dialect"));
|
|
9
|
+
const postgresql_dialect_1 = __importDefault(require("./postgresql-dialect"));
|
|
10
|
+
const sqlite_dialect_1 = __importDefault(require("./sqlite-dialect"));
|
|
11
|
+
function introspectionDialectFactory(dialect) {
|
|
12
|
+
switch (dialect) {
|
|
13
|
+
case 'postgres':
|
|
14
|
+
return new postgresql_dialect_1.default();
|
|
15
|
+
case 'mssql':
|
|
16
|
+
return new mssql_dialect_1.default();
|
|
17
|
+
case 'mysql':
|
|
18
|
+
return new mysql_dialect_1.default();
|
|
19
|
+
case 'mariadb':
|
|
20
|
+
return new mariadb_dialect_1.default();
|
|
21
|
+
case 'sqlite':
|
|
22
|
+
return new sqlite_dialect_1.default();
|
|
23
|
+
default:
|
|
24
|
+
throw new Error(`Unsupported dialect: ${dialect}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = introspectionDialectFactory;
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGVjdC1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vZGlhbGVjdHMvZGlhbGVjdC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0Esd0VBQStDO0FBQy9DLG9FQUEyQztBQUMzQyxvRUFBMkM7QUFDM0MsOEVBQXFEO0FBQ3JELHNFQUE2QztBQUU3QyxTQUF3QiwyQkFBMkIsQ0FBQyxPQUFnQjtJQUNsRSxRQUFRLE9BQU8sRUFBRTtRQUNmLEtBQUssVUFBVTtZQUNiLE9BQU8sSUFBSSw0QkFBaUIsRUFBRSxDQUFDO1FBQ2pDLEtBQUssT0FBTztZQUNWLE9BQU8sSUFBSSx1QkFBWSxFQUFFLENBQUM7UUFDNUIsS0FBSyxPQUFPO1lBQ1YsT0FBTyxJQUFJLHVCQUFZLEVBQUUsQ0FBQztRQUM1QixLQUFLLFNBQVM7WUFDWixPQUFPLElBQUkseUJBQWMsRUFBRSxDQUFDO1FBQzlCLEtBQUssUUFBUTtZQUNYLE9BQU8sSUFBSSx3QkFBYSxFQUFFLENBQUM7UUFDN0I7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixPQUFPLEVBQUUsQ0FBQyxDQUFDO0tBQ3REO0FBQ0gsQ0FBQztBQWZELDhDQWVDIn0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Sequelize } from 'sequelize';
|
|
2
|
+
import { SequelizeColumn, SequelizeTableIdentifier } from '../type-overrides';
|
|
3
|
+
export type ColumnDescription = Omit<SequelizeColumn, 'defaultValue'> & {
|
|
4
|
+
name: string;
|
|
5
|
+
isLiteralDefaultValue: boolean;
|
|
6
|
+
enumValues: string[] | null;
|
|
7
|
+
defaultValue: string | null;
|
|
8
|
+
};
|
|
9
|
+
export default interface IntrospectionDialect {
|
|
10
|
+
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=dialect.interface.d.ts.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGVjdC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9kaWFsZWN0cy9kaWFsZWN0LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import MySQLDialect, { MySQLDBColumn } from './mysql-dialect';
|
|
2
|
+
export default class MariadbDialect extends MySQLDialect {
|
|
3
|
+
protected mapDefaultValue(dbColumn: MySQLDBColumn): {
|
|
4
|
+
defaultValue: string;
|
|
5
|
+
isLiteralDefaultValue: boolean;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=mariadb-dialect.d.ts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const mysql_dialect_1 = __importDefault(require("./mysql-dialect"));
|
|
7
|
+
class MariadbDialect extends mysql_dialect_1.default {
|
|
8
|
+
mapDefaultValue(dbColumn) {
|
|
9
|
+
if (dbColumn.Default === null || dbColumn.Default?.toLowerCase() === 'null') {
|
|
10
|
+
return {
|
|
11
|
+
defaultValue: null,
|
|
12
|
+
isLiteralDefaultValue: false,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
if (dbColumn.Default?.startsWith("'") && dbColumn.Default?.endsWith("'")) {
|
|
16
|
+
if (dbColumn.Type === 'text') {
|
|
17
|
+
return {
|
|
18
|
+
defaultValue: dbColumn.Default.slice(1, -1).replace(/\\(.)/g, '$1'),
|
|
19
|
+
isLiteralDefaultValue: false,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
defaultValue: dbColumn.Default.slice(1, -1).replace(/''/g, "'").replace(/\\\\/g, '\\'),
|
|
24
|
+
isLiteralDefaultValue: false,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (!Number.isNaN(Number(dbColumn.Default))) {
|
|
28
|
+
return {
|
|
29
|
+
defaultValue: dbColumn.Default,
|
|
30
|
+
isLiteralDefaultValue: false,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
defaultValue: dbColumn.Default,
|
|
35
|
+
isLiteralDefaultValue: true,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.default = MariadbDialect;
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyaWFkYi1kaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vZGlhbGVjdHMvbWFyaWFkYi1kaWFsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0VBQThEO0FBRTlELE1BQXFCLGNBQWUsU0FBUSx1QkFBWTtJQUNuQyxlQUFlLENBQUMsUUFBdUI7UUFJeEQsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRTtZQUMzRSxPQUFPO2dCQUNMLFlBQVksRUFBRSxJQUFJO2dCQUNsQixxQkFBcUIsRUFBRSxLQUFLO2FBQzdCLENBQUM7U0FDSDtRQUVELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEUsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDNUIsT0FBTztvQkFDTCxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7b0JBQ25FLHFCQUFxQixFQUFFLEtBQUs7aUJBQzdCLENBQUM7YUFDSDtZQUVELE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7Z0JBQ3RGLHFCQUFxQixFQUFFLEtBQUs7YUFDN0IsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFO1lBQzNDLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFFBQVEsQ0FBQyxPQUFPO2dCQUM5QixxQkFBcUIsRUFBRSxLQUFLO2FBQzdCLENBQUM7U0FDSDtRQUVELE9BQU87WUFDTCxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDOUIscUJBQXFCLEVBQUUsSUFBSTtTQUM1QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdENELGlDQXNDQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Sequelize } from 'sequelize';
|
|
2
|
+
import IntrospectionDialect, { ColumnDescription } from './dialect.interface';
|
|
3
|
+
import { SequelizeTableIdentifier } from '../type-overrides';
|
|
4
|
+
export default class MsSQLDialect implements IntrospectionDialect {
|
|
5
|
+
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
6
|
+
private getColumnDescription;
|
|
7
|
+
/**
|
|
8
|
+
* Fixes the default behavior of Sequelize that does not allow us to
|
|
9
|
+
* detect if a value is a function call or a constant value
|
|
10
|
+
*/
|
|
11
|
+
private mapDefaultValue;
|
|
12
|
+
private extractConstantValue;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mssql-dialect.d.ts.map
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const sequelize_1 = require("sequelize");
|
|
4
|
+
class MsSQLDialect {
|
|
5
|
+
async listColumns(tableNames, sequelize) {
|
|
6
|
+
if (!sequelize.getDatabaseName())
|
|
7
|
+
throw new Error('Database name is required. Please check your connection settings.');
|
|
8
|
+
if (!tableNames?.length)
|
|
9
|
+
return Promise.resolve([]);
|
|
10
|
+
const conditions = `(${tableNames
|
|
11
|
+
.map((_, index) => `(c.table_schema = :schemaName${index}
|
|
12
|
+
AND c.table_name = :tableName${index}
|
|
13
|
+
)`)
|
|
14
|
+
.join(' OR ')})`;
|
|
15
|
+
const query = `
|
|
16
|
+
SELECT
|
|
17
|
+
c.TABLE_SCHEMA AS 'Schema',
|
|
18
|
+
c.TABLE_NAME AS 'Table',
|
|
19
|
+
c.COLUMN_NAME AS 'Name',
|
|
20
|
+
c.DATA_TYPE AS 'Type',
|
|
21
|
+
c.CHARACTER_MAXIMUM_LENGTH AS 'Length',
|
|
22
|
+
c.IS_NULLABLE as 'IsNull',
|
|
23
|
+
COLUMN_DEFAULT AS 'Default',
|
|
24
|
+
pk.CONSTRAINT_TYPE AS 'Constraint',
|
|
25
|
+
COLUMNPROPERTY(
|
|
26
|
+
OBJECT_ID('['+c.TABLE_SCHEMA+'].['+c.TABLE_NAME+']'),
|
|
27
|
+
c.COLUMN_NAME, 'IsIdentity'
|
|
28
|
+
) as 'IsIdentity',
|
|
29
|
+
CAST(prop.value AS NVARCHAR) AS 'Comment'
|
|
30
|
+
FROM INFORMATION_SCHEMA.TABLES t
|
|
31
|
+
INNER JOIN INFORMATION_SCHEMA.COLUMNS c
|
|
32
|
+
ON t.TABLE_NAME = c.TABLE_NAME
|
|
33
|
+
AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
|
|
34
|
+
LEFT JOIN (
|
|
35
|
+
SELECT tc.table_schema, tc.table_name,
|
|
36
|
+
cu.column_name, tc.CONSTRAINT_TYPE
|
|
37
|
+
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
|
|
38
|
+
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
|
|
39
|
+
ON tc.table_schema=cu.table_schema
|
|
40
|
+
AND tc.table_name=cu.table_name
|
|
41
|
+
AND tc.constraint_name=cu.constraint_name
|
|
42
|
+
AND tc.CONSTRAINT_TYPE='PRIMARY KEY'
|
|
43
|
+
) pk
|
|
44
|
+
ON pk.table_schema=c.table_schema
|
|
45
|
+
AND pk.table_name=c.table_name
|
|
46
|
+
AND pk.column_name=c.column_name
|
|
47
|
+
INNER JOIN sys.columns AS sc
|
|
48
|
+
ON sc.object_id = OBJECT_ID('['+t.table_schema + '].[' + t.table_name+']')
|
|
49
|
+
AND sc.name = c.column_name
|
|
50
|
+
LEFT JOIN sys.extended_properties prop ON prop.major_id = sc.object_id
|
|
51
|
+
AND prop.minor_id = sc.column_id
|
|
52
|
+
AND prop.name = 'MS_Description'
|
|
53
|
+
WHERE
|
|
54
|
+
t.TABLE_CATALOG = :database
|
|
55
|
+
AND ${conditions}`;
|
|
56
|
+
const replacements = tableNames.reduce((acc, tableName, index) => ({
|
|
57
|
+
...acc,
|
|
58
|
+
[`tableName${index}`]: tableName.tableName,
|
|
59
|
+
[`schemaName${index}`]: tableName.schema || 'dbo',
|
|
60
|
+
}), {
|
|
61
|
+
database: sequelize.getDatabaseName(),
|
|
62
|
+
});
|
|
63
|
+
const results = await sequelize.query(query, {
|
|
64
|
+
replacements,
|
|
65
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
66
|
+
logging: false,
|
|
67
|
+
});
|
|
68
|
+
return tableNames.map(tableName => {
|
|
69
|
+
return results
|
|
70
|
+
.filter(column => column.Table === tableName.tableName && column.Schema === (tableName.schema || 'dbo'))
|
|
71
|
+
.map(column => this.getColumnDescription(column));
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
getColumnDescription(dbColumn) {
|
|
75
|
+
let type = dbColumn.Type.toUpperCase();
|
|
76
|
+
if (type.includes('CHAR')) {
|
|
77
|
+
type = `${type}(${dbColumn.Length === -1 ? 'MAX' : dbColumn.Length})`;
|
|
78
|
+
}
|
|
79
|
+
const sequelizeColumn = {
|
|
80
|
+
type,
|
|
81
|
+
allowNull: dbColumn.IsNull === 'YES',
|
|
82
|
+
comment: dbColumn.Comment,
|
|
83
|
+
primaryKey: dbColumn.Constraint === 'PRIMARY KEY',
|
|
84
|
+
defaultValue: dbColumn.Default,
|
|
85
|
+
autoIncrement: dbColumn.IsIdentity === 1,
|
|
86
|
+
special: [],
|
|
87
|
+
};
|
|
88
|
+
const { defaultValue, isLiteralDefaultValue } = this.mapDefaultValue(sequelizeColumn);
|
|
89
|
+
return {
|
|
90
|
+
...sequelizeColumn,
|
|
91
|
+
name: dbColumn.Name,
|
|
92
|
+
defaultValue,
|
|
93
|
+
isLiteralDefaultValue,
|
|
94
|
+
enumValues: null,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Fixes the default behavior of Sequelize that does not allow us to
|
|
99
|
+
* detect if a value is a function call or a constant value
|
|
100
|
+
*/
|
|
101
|
+
mapDefaultValue(description) {
|
|
102
|
+
if (description.defaultValue === null ||
|
|
103
|
+
!description.defaultValue?.startsWith('(') ||
|
|
104
|
+
!description.defaultValue?.endsWith(')')) {
|
|
105
|
+
// Strange case if not null
|
|
106
|
+
return {
|
|
107
|
+
defaultValue: null,
|
|
108
|
+
isLiteralDefaultValue: false,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const defaultValueWithoutParenthesis = description.defaultValue.slice(1, -1);
|
|
112
|
+
if (defaultValueWithoutParenthesis.startsWith("N'") &&
|
|
113
|
+
defaultValueWithoutParenthesis.endsWith("'")) {
|
|
114
|
+
return {
|
|
115
|
+
defaultValue: this.extractConstantValue(defaultValueWithoutParenthesis.slice(2, -1)),
|
|
116
|
+
isLiteralDefaultValue: false,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (defaultValueWithoutParenthesis.startsWith("'") &&
|
|
120
|
+
defaultValueWithoutParenthesis.endsWith("'")) {
|
|
121
|
+
return {
|
|
122
|
+
defaultValue: this.extractConstantValue(defaultValueWithoutParenthesis.slice(1, -1)),
|
|
123
|
+
isLiteralDefaultValue: false,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
if (defaultValueWithoutParenthesis.startsWith('(') &&
|
|
127
|
+
defaultValueWithoutParenthesis.endsWith(')') &&
|
|
128
|
+
!Number.isNaN(Number(defaultValueWithoutParenthesis.slice(1, -1)))) {
|
|
129
|
+
return {
|
|
130
|
+
defaultValue: defaultValueWithoutParenthesis.slice(1, -1),
|
|
131
|
+
isLiteralDefaultValue: false,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (defaultValueWithoutParenthesis === 'NULL') {
|
|
135
|
+
return {
|
|
136
|
+
defaultValue: null,
|
|
137
|
+
isLiteralDefaultValue: false,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
defaultValue: defaultValueWithoutParenthesis,
|
|
142
|
+
isLiteralDefaultValue: true,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
extractConstantValue(value) {
|
|
146
|
+
return value.replace(/''/g, "'");
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.default = MsSQLDialect;
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNzcWwtZGlhbGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRyb3NwZWN0aW9uL2RpYWxlY3RzL21zc3FsLWRpYWxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBa0Q7QUFpQmxELE1BQXFCLFlBQVk7SUFDL0IsS0FBSyxDQUFDLFdBQVcsQ0FDZixVQUFzQyxFQUN0QyxTQUFvQjtRQUVwQixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRTtZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXBELE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVTthQUM5QixHQUFHLENBQ0YsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDWCxnQ0FBZ0MsS0FBSzsyQ0FDSixLQUFLO2NBQ2xDLENBQ1A7YUFDQSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUVuQixNQUFNLEtBQUssR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQXdDSixVQUFVLEVBQUUsQ0FBQztRQUV2QixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUNwQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsR0FBRztZQUNOLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQzFDLENBQUMsYUFBYSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLElBQUksS0FBSztTQUNsRCxDQUFDLEVBQ0Y7WUFDRSxRQUFRLEVBQUUsU0FBUyxDQUFDLGVBQWUsRUFBRTtTQUN0QyxDQUNGLENBQUM7UUFFRixN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
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Sequelize } from 'sequelize';
|
|
2
|
+
import { SequelizeTableIdentifier } from '../../type-overrides';
|
|
3
|
+
import IntrospectionDialect, { ColumnDescription } from '../dialect.interface';
|
|
4
|
+
export type MySQLDBColumn = {
|
|
5
|
+
Table: string;
|
|
6
|
+
Field: string;
|
|
7
|
+
Default: string;
|
|
8
|
+
Null: 'YES' | 'NO';
|
|
9
|
+
Type: string;
|
|
10
|
+
Extra: string;
|
|
11
|
+
Comment: string;
|
|
12
|
+
Key: string;
|
|
13
|
+
};
|
|
14
|
+
export default class MySQLDialect implements IntrospectionDialect {
|
|
15
|
+
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
16
|
+
private getColumnDescription;
|
|
17
|
+
/**
|
|
18
|
+
* Fixes the default behavior of Sequelize that does not allow us to
|
|
19
|
+
* detect if a value is a function call or a constant value
|
|
20
|
+
*/
|
|
21
|
+
protected mapDefaultValue(dbColumn: MySQLDBColumn): {
|
|
22
|
+
defaultValue: string;
|
|
23
|
+
isLiteralDefaultValue: boolean;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const sequelize_1 = require("sequelize");
|
|
7
|
+
const parse_enum_1 = __importDefault(require("./parse-enum"));
|
|
8
|
+
class MySQLDialect {
|
|
9
|
+
async listColumns(tableNames, sequelize) {
|
|
10
|
+
if (!sequelize.getDatabaseName())
|
|
11
|
+
throw new Error('Database name is required. Please check your connection settings.');
|
|
12
|
+
if (!tableNames?.length)
|
|
13
|
+
return Promise.resolve([]);
|
|
14
|
+
const columns = await sequelize.query(`
|
|
15
|
+
SELECT TABLE_NAME AS 'Table',
|
|
16
|
+
COLUMN_NAME AS 'Field',
|
|
17
|
+
COLUMN_DEFAULT AS 'Default',
|
|
18
|
+
IS_NULLABLE AS 'Null',
|
|
19
|
+
COLUMN_TYPE AS 'Type',
|
|
20
|
+
EXTRA AS 'Extra',
|
|
21
|
+
COLUMN_COMMENT AS 'Comment',
|
|
22
|
+
COLUMN_KEY AS 'Key'
|
|
23
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
|
24
|
+
WHERE TABLE_SCHEMA = :databaseName
|
|
25
|
+
AND TABLE_NAME IN (:tableNames)
|
|
26
|
+
ORDER BY TABLE_NAME, ORDINAL_POSITION
|
|
27
|
+
`, {
|
|
28
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
29
|
+
replacements: {
|
|
30
|
+
databaseName: sequelize.getDatabaseName(),
|
|
31
|
+
tableNames: tableNames.map(t => t.tableName),
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
return tableNames.map(table => {
|
|
35
|
+
const tableColumns = columns.filter(c => c.Table === table.tableName);
|
|
36
|
+
return tableColumns.map(c => this.getColumnDescription(c));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
getColumnDescription(dbColumn) {
|
|
40
|
+
const type = dbColumn.Type.startsWith('enum')
|
|
41
|
+
? dbColumn.Type.replace(/^enum/, 'ENUM')
|
|
42
|
+
: dbColumn.Type.toUpperCase();
|
|
43
|
+
const sequelizeColumn = {
|
|
44
|
+
type,
|
|
45
|
+
allowNull: dbColumn.Null === 'YES',
|
|
46
|
+
comment: dbColumn.Comment || null,
|
|
47
|
+
primaryKey: dbColumn.Key === 'PRI',
|
|
48
|
+
defaultValue: dbColumn.Default,
|
|
49
|
+
autoIncrement: dbColumn.Extra?.toLowerCase() === 'auto_increment',
|
|
50
|
+
};
|
|
51
|
+
const { defaultValue, isLiteralDefaultValue } = this.mapDefaultValue(dbColumn);
|
|
52
|
+
return {
|
|
53
|
+
...sequelizeColumn,
|
|
54
|
+
name: dbColumn.Field,
|
|
55
|
+
defaultValue,
|
|
56
|
+
isLiteralDefaultValue,
|
|
57
|
+
enumValues: (0, parse_enum_1.default)(type),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Fixes the default behavior of Sequelize that does not allow us to
|
|
62
|
+
* detect if a value is a function call or a constant value
|
|
63
|
+
*/
|
|
64
|
+
mapDefaultValue(dbColumn) {
|
|
65
|
+
if (dbColumn.Default === null) {
|
|
66
|
+
return {
|
|
67
|
+
defaultValue: null,
|
|
68
|
+
isLiteralDefaultValue: false,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const extra = dbColumn.Extra?.toUpperCase();
|
|
72
|
+
if (extra?.includes('DEFAULT_GENERATED') || extra?.includes('AUTO_INCREMENT')) {
|
|
73
|
+
return {
|
|
74
|
+
defaultValue: dbColumn.Default,
|
|
75
|
+
isLiteralDefaultValue: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// For MySQL 5
|
|
79
|
+
if (dbColumn.Type?.toLowerCase() === 'datetime' &&
|
|
80
|
+
dbColumn.Default?.toLowerCase() === 'current_timestamp') {
|
|
81
|
+
return {
|
|
82
|
+
defaultValue: dbColumn.Default,
|
|
83
|
+
isLiteralDefaultValue: true,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
defaultValue: dbColumn.Default,
|
|
88
|
+
isLiteralDefaultValue: false,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.default = MySQLDialect;
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9kaWFsZWN0cy9teXNxbC1kaWFsZWN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQWtEO0FBRWxELDhEQUFxQztBQWVyQyxNQUFxQixZQUFZO0lBQy9CLEtBQUssQ0FBQyxXQUFXLENBQ2YsVUFBc0MsRUFDdEMsU0FBb0I7UUFFcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTTtZQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVwRCxNQUFNLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQ25DOzs7Ozs7Ozs7Ozs7O09BYUMsRUFDRDtZQUNFLElBQUksRUFBRSxzQkFBVSxDQUFDLE1BQU07WUFDdkIsWUFBWSxFQUFFO2dCQUNaLFlBQVksRUFBRSxTQUFTLENBQUMsZUFBZSxFQUFFO2dCQUN6QyxVQUFVLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7YUFDN0M7U0FDRixDQUNGLENBQUM7UUFFRixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDNUIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXRFLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFFBQXVCO1FBQ2xELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUMzQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztZQUN4QyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVoQyxNQUFNLGVBQWUsR0FBb0I7WUFDdkMsSUFBSTtZQUNKLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLLEtBQUs7WUFDbEMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksSUFBSTtZQUNqQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxLQUFLO1lBQ2xDLFlBQVksRUFBRSxRQUFRLENBQUMsT0FBTztZQUM5QixhQUFhLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxnQkFBZ0I7U0FDbEUsQ0FBQztRQUVGLE1BQU0sRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9FLE9BQU87WUFDTCxHQUFHLGVBQWU7WUFDbEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLFlBQVk7WUFDWixxQkFBcUI7WUFDckIsVUFBVSxFQUFFLElBQUEsb0JBQVMsRUFBQyxJQUFJLENBQUM7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDTyxlQUFlLENBQUMsUUFBdUI7UUFJL0MsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtZQUM3QixPQUFPO2dCQUNMLFlBQVksRUFBRSxJQUFJO2dCQUNsQixxQkFBcUIsRUFBRSxLQUFLO2FBQzdCLENBQUM7U0FDSDtRQUVELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFFNUMsSUFBSSxLQUFLLEVBQUUsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksS0FBSyxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQzdFLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFFBQVEsQ0FBQyxPQUFPO2dCQUM5QixxQkFBcUIsRUFBRSxJQUFJO2FBQzVCLENBQUM7U0FDSDtRQUVELGNBQWM7UUFDZCxJQUNFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssVUFBVTtZQUMzQyxRQUFRLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLG1CQUFtQixFQUN2RDtZQUNBLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFFBQVEsQ0FBQyxPQUFPO2dCQUM5QixxQkFBcUIsRUFBRSxJQUFJO2FBQzVCLENBQUM7U0FDSDtRQUVELE9BQU87WUFDTCxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDOUIscUJBQXFCLEVBQUUsS0FBSztTQUM3QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBekdELCtCQXlHQyJ9
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* "ENUM('enum1','enum2')" returns ['enum1', 'enum2']]
|
|
5
|
+
*/
|
|
6
|
+
function parseEnum(type) {
|
|
7
|
+
if (!type?.startsWith('ENUM('))
|
|
8
|
+
return null;
|
|
9
|
+
const values = type.slice(5, -1);
|
|
10
|
+
let buffer = '';
|
|
11
|
+
let isInValue = false;
|
|
12
|
+
const list = [];
|
|
13
|
+
for (let i = 0; i < values.length; i += 1) {
|
|
14
|
+
const currentChar = values[i];
|
|
15
|
+
if (currentChar === "'") {
|
|
16
|
+
if (!isInValue) {
|
|
17
|
+
isInValue = true;
|
|
18
|
+
}
|
|
19
|
+
else if (values[i + 1] === "'") {
|
|
20
|
+
buffer += "'";
|
|
21
|
+
i += 1;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
isInValue = false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else if (currentChar === '\\') {
|
|
28
|
+
buffer += values[i + 1];
|
|
29
|
+
i += 1;
|
|
30
|
+
}
|
|
31
|
+
else if (!isInValue && currentChar === ',') {
|
|
32
|
+
list.push(buffer);
|
|
33
|
+
buffer = '';
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
buffer += currentChar;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (buffer.length)
|
|
40
|
+
list.push(buffer);
|
|
41
|
+
return list;
|
|
42
|
+
}
|
|
43
|
+
exports.default = parseEnum;
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbnRyb3NwZWN0aW9uL2RpYWxlY3RzL215c3FsLWRpYWxlY3QvcGFyc2UtZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOztHQUVHO0FBQ0gsU0FBd0IsU0FBUyxDQUFDLElBQW1CO0lBQ25ELElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN0QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7SUFFaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN6QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUIsSUFBSSxXQUFXLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2QsU0FBUyxHQUFHLElBQUksQ0FBQzthQUNsQjtpQkFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUNoQyxNQUFNLElBQUksR0FBRyxDQUFDO2dCQUNkLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDUjtpQkFBTTtnQkFDTCxTQUFTLEdBQUcsS0FBSyxDQUFDO2FBQ25CO1NBQ0Y7YUFBTSxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7WUFDL0IsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNSO2FBQU0sSUFBSSxDQUFDLFNBQVMsSUFBSSxXQUFXLEtBQUssR0FBRyxFQUFFO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsTUFBTSxHQUFHLEVBQUUsQ0FBQztTQUNiO2FBQU07WUFDTCxNQUFNLElBQUksV0FBVyxDQUFDO1NBQ3ZCO0tBQ0Y7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNO1FBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVyQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFuQ0QsNEJBbUNDIn0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Sequelize } from 'sequelize';
|
|
2
|
+
import { SequelizeTableIdentifier } from '../../type-overrides';
|
|
3
|
+
import IntrospectionDialect, { ColumnDescription } from '../dialect.interface';
|
|
4
|
+
export default class PostgreSQLDialect implements IntrospectionDialect {
|
|
5
|
+
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
6
|
+
private getColumnDescription;
|
|
7
|
+
/**
|
|
8
|
+
* Fixes the default behavior of Sequelize that does not allow us to
|
|
9
|
+
* detect if a value is a function call or a constant value
|
|
10
|
+
*/
|
|
11
|
+
private mapDefaultValue;
|
|
12
|
+
/**
|
|
13
|
+
* Fixes the default behavior from Sequelize that does not support
|
|
14
|
+
* default values containing "::"
|
|
15
|
+
* And we don't want to make the same mistake with other characters
|
|
16
|
+
* ex: ''rabbit'::character varying' returns 'rabbit'
|
|
17
|
+
*/
|
|
18
|
+
private extractConstantValue;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const sequelize_1 = require("sequelize");
|
|
7
|
+
const parse_array_1 = __importDefault(require("./parse-array"));
|
|
8
|
+
class PostgreSQLDialect {
|
|
9
|
+
async listColumns(tableNames, sequelize) {
|
|
10
|
+
if (!sequelize.getDatabaseName())
|
|
11
|
+
throw new Error('Database name is required. Please check your connection settings.');
|
|
12
|
+
if (!tableNames?.length)
|
|
13
|
+
return [];
|
|
14
|
+
const conditions = `(${tableNames
|
|
15
|
+
.map((_, index) => `(c.table_schema = :schemaName${index}
|
|
16
|
+
AND c.table_name = :tableName${index}
|
|
17
|
+
)`)
|
|
18
|
+
.join(' OR ')})`;
|
|
19
|
+
// Query inspired by Sequelize, but adapted for multiple tables
|
|
20
|
+
// and support of multiple databases
|
|
21
|
+
const query = `
|
|
22
|
+
SELECT
|
|
23
|
+
c.table_schema as "Schema",
|
|
24
|
+
c.table_name as "Table",
|
|
25
|
+
c.column_name as "Field",
|
|
26
|
+
pk.constraint_type as "Constraint",
|
|
27
|
+
c.column_default as "Default",
|
|
28
|
+
c.is_nullable as "Null",
|
|
29
|
+
c.identity_generation as "Identity",
|
|
30
|
+
(CASE WHEN c.udt_name = 'hstore' THEN c.udt_name ELSE c.data_type END)
|
|
31
|
+
|| (CASE WHEN c.character_maximum_length IS NOT NULL
|
|
32
|
+
THEN '(' || c.character_maximum_length || ')'
|
|
33
|
+
ELSE '' END) as "Type",
|
|
34
|
+
(SELECT array_agg(e.enumlabel)
|
|
35
|
+
FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum e ON t.oid=e.enumtypid
|
|
36
|
+
WHERE t.typname=c.udt_name
|
|
37
|
+
) AS "Special",
|
|
38
|
+
(SELECT pgd.description
|
|
39
|
+
FROM pg_catalog.pg_statio_all_tables AS st
|
|
40
|
+
INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid)
|
|
41
|
+
WHERE c.ordinal_position=pgd.objsubid AND c.table_name=st.relname
|
|
42
|
+
) AS "Comment"
|
|
43
|
+
FROM
|
|
44
|
+
information_schema.columns c
|
|
45
|
+
LEFT JOIN (
|
|
46
|
+
SELECT tc.table_schema, tc.table_name,
|
|
47
|
+
cu.column_name, tc.constraint_type
|
|
48
|
+
FROM information_schema.TABLE_CONSTRAINTS tc
|
|
49
|
+
JOIN information_schema.KEY_COLUMN_USAGE cu
|
|
50
|
+
ON tc.table_schema=cu.table_schema
|
|
51
|
+
AND tc.table_name=cu.table_name
|
|
52
|
+
AND tc.constraint_name=cu.constraint_name
|
|
53
|
+
AND tc.constraint_type='PRIMARY KEY'
|
|
54
|
+
AND tc.constraint_catalog=:database
|
|
55
|
+
) pk ON pk.table_schema=c.table_schema
|
|
56
|
+
AND pk.table_name=c.table_name
|
|
57
|
+
AND pk.column_name=c.column_name
|
|
58
|
+
WHERE c.table_catalog = :database
|
|
59
|
+
AND ${conditions}
|
|
60
|
+
ORDER BY c.table_schema, c.table_name, c.ordinal_position;
|
|
61
|
+
`;
|
|
62
|
+
const replacements = tableNames.reduce((acc, tableName, index) => ({
|
|
63
|
+
...acc,
|
|
64
|
+
[`tableName${index}`]: tableName.tableName,
|
|
65
|
+
[`schemaName${index}`]: tableName.schema || 'public',
|
|
66
|
+
}), {
|
|
67
|
+
database: sequelize.getDatabaseName(),
|
|
68
|
+
});
|
|
69
|
+
const results = await sequelize.query(query, {
|
|
70
|
+
replacements,
|
|
71
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
72
|
+
logging: false,
|
|
73
|
+
});
|
|
74
|
+
return tableNames.map(tableName => {
|
|
75
|
+
return results
|
|
76
|
+
.filter(column => column.Table === tableName.tableName &&
|
|
77
|
+
column.Schema === (tableName.schema || 'public'))
|
|
78
|
+
.map(column => this.getColumnDescription(column));
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
getColumnDescription(dbColumn) {
|
|
82
|
+
const type = dbColumn.Type.toUpperCase();
|
|
83
|
+
const sequelizeColumn = {
|
|
84
|
+
type,
|
|
85
|
+
allowNull: dbColumn.Null === 'YES',
|
|
86
|
+
comment: dbColumn.Comment,
|
|
87
|
+
special: (0, parse_array_1.default)(dbColumn.Special),
|
|
88
|
+
primaryKey: dbColumn.Constraint === 'PRIMARY KEY',
|
|
89
|
+
defaultValue: dbColumn.Default,
|
|
90
|
+
// Supabase databases do not expose a default value for auto-increment columns
|
|
91
|
+
// but Identity is set to "BY DEFAULT" in this case
|
|
92
|
+
autoIncrement: Boolean(dbColumn.Default?.startsWith('nextval(')) || dbColumn.Identity !== null,
|
|
93
|
+
};
|
|
94
|
+
const { defaultValue, isLiteralDefaultValue } = this.mapDefaultValue(sequelizeColumn);
|
|
95
|
+
return {
|
|
96
|
+
...sequelizeColumn,
|
|
97
|
+
name: dbColumn.Field,
|
|
98
|
+
defaultValue,
|
|
99
|
+
isLiteralDefaultValue,
|
|
100
|
+
enumValues: sequelizeColumn.special,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Fixes the default behavior of Sequelize that does not allow us to
|
|
105
|
+
* detect if a value is a function call or a constant value
|
|
106
|
+
*/
|
|
107
|
+
mapDefaultValue(description) {
|
|
108
|
+
if (description.type === 'BOOLEAN' && !description.defaultValue) {
|
|
109
|
+
return { defaultValue: 'false', isLiteralDefaultValue: false };
|
|
110
|
+
}
|
|
111
|
+
if (description.defaultValue === null || description.defaultValue?.startsWith('NULL::')) {
|
|
112
|
+
return { defaultValue: null, isLiteralDefaultValue: false };
|
|
113
|
+
}
|
|
114
|
+
if (['true', 'false'].includes(description.defaultValue)) {
|
|
115
|
+
return { defaultValue: description.defaultValue, isLiteralDefaultValue: false };
|
|
116
|
+
}
|
|
117
|
+
if (description.defaultValue && !Number.isNaN(Number(description.defaultValue))) {
|
|
118
|
+
return { defaultValue: description.defaultValue, isLiteralDefaultValue: false };
|
|
119
|
+
}
|
|
120
|
+
if (description.defaultValue.startsWith("'")) {
|
|
121
|
+
const constantValue = this.extractConstantValue(description.defaultValue);
|
|
122
|
+
return { defaultValue: constantValue, isLiteralDefaultValue: false };
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
defaultValue: description.defaultValue,
|
|
126
|
+
isLiteralDefaultValue: true,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Fixes the default behavior from Sequelize that does not support
|
|
131
|
+
* default values containing "::"
|
|
132
|
+
* And we don't want to make the same mistake with other characters
|
|
133
|
+
* ex: ''rabbit'::character varying' returns 'rabbit'
|
|
134
|
+
*/
|
|
135
|
+
extractConstantValue(value) {
|
|
136
|
+
let buffer = '';
|
|
137
|
+
for (let i = 1; i < value.length; i += 1) {
|
|
138
|
+
const char = value[i];
|
|
139
|
+
if (char === "'") {
|
|
140
|
+
if (value[i + 1] === "'") {
|
|
141
|
+
i += 1;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
return buffer;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
buffer += char;
|
|
148
|
+
}
|
|
149
|
+
throw new Error(`Invalid constant value: ${value}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.default = PostgreSQLDialect;
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9kaWFsZWN0cy9wb3N0Z3Jlc3FsLWRpYWxlY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBa0Q7QUFFbEQsZ0VBQXVDO0FBaUJ2QyxNQUFxQixpQkFBaUI7SUFDcEMsS0FBSyxDQUFDLFdBQVcsQ0FDZixVQUFzQyxFQUN0QyxTQUFvQjtRQUVwQixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRTtZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVO2FBQzlCLEdBQUcsQ0FDRixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNYLGdDQUFnQyxLQUFLOzJDQUNKLEtBQUs7Y0FDbEMsQ0FDUDthQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRW5CLCtEQUErRDtRQUMvRCxvQ0FBb0M7UUFDcEMsTUFBTSxLQUFLLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBc0NKLFVBQVU7O0tBRW5CLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUNwQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsR0FBRztZQUNOLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQzFDLENBQUMsYUFBYSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLElBQUksUUFBUTtTQUNyRCxDQUFDLEVBQ0Y7WUFDRSxRQUFRLEVBQUUsU0FBUyxDQUFDLGVBQWUsRUFB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
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* '{1,2,"cat", "dog"}' returns ['1', '2', 'cat', 'dog']
|
|
5
|
+
*/
|
|
6
|
+
function parseArray(value) {
|
|
7
|
+
if (!value?.length || !value.startsWith('{') || !value.endsWith('}'))
|
|
8
|
+
return null;
|
|
9
|
+
const values = value.slice(1, -1);
|
|
10
|
+
const list = [];
|
|
11
|
+
let isInValue = false;
|
|
12
|
+
let buffer = '';
|
|
13
|
+
for (let i = 0; i < values.length; i += 1) {
|
|
14
|
+
const currentChar = values[i];
|
|
15
|
+
if (currentChar === '\\') {
|
|
16
|
+
buffer += values[i + 1];
|
|
17
|
+
i += 1;
|
|
18
|
+
}
|
|
19
|
+
else if (currentChar === "'" && values[i + 1] === "'") {
|
|
20
|
+
buffer += "'";
|
|
21
|
+
i += 1;
|
|
22
|
+
}
|
|
23
|
+
else if (currentChar === '"') {
|
|
24
|
+
isInValue = !isInValue;
|
|
25
|
+
}
|
|
26
|
+
else if (currentChar === ',' && !isInValue) {
|
|
27
|
+
list.push(buffer);
|
|
28
|
+
buffer = '';
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
buffer += currentChar;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (buffer.length)
|
|
35
|
+
list.push(buffer);
|
|
36
|
+
return list;
|
|
37
|
+
}
|
|
38
|
+
exports.default = parseArray;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtYXJyYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9kaWFsZWN0cy9wb3N0Z3Jlc3FsLWRpYWxlY3QvcGFyc2UtYXJyYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7R0FFRztBQUNILFNBQXdCLFVBQVUsQ0FBQyxLQUFvQjtJQUNyRCxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWxGLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN0QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN6QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUIsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDUjthQUFNLElBQUksV0FBVyxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUN2RCxNQUFNLElBQUksR0FBRyxDQUFDO1lBQ2QsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNSO2FBQU0sSUFBSSxXQUFXLEtBQUssR0FBRyxFQUFFO1lBQzlCLFNBQVMsR0FBRyxDQUFDLFNBQVMsQ0FBQztTQUN4QjthQUFNLElBQUksV0FBVyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDYjthQUFNO1lBQ0wsTUFBTSxJQUFJLFdBQVcsQ0FBQztTQUN2QjtLQUNGO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTTtRQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFckMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBL0JELDZCQStCQyJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Sequelize } from 'sequelize';
|
|
2
|
+
import IntrospectionDialect, { ColumnDescription } from './dialect.interface';
|
|
3
|
+
import { SequelizeTableIdentifier } from '../type-overrides';
|
|
4
|
+
export default class SQLiteDialect implements IntrospectionDialect {
|
|
5
|
+
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
6
|
+
private listColumnsForTable;
|
|
7
|
+
private mapDefaultValue;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=sqlite-dialect.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const sequelize_1 = require("sequelize");
|
|
4
|
+
class SQLiteDialect {
|
|
5
|
+
listColumns(tableNames, sequelize) {
|
|
6
|
+
if (!tableNames?.length)
|
|
7
|
+
return Promise.resolve([]);
|
|
8
|
+
return Promise.all(tableNames.map(tableName => this.listColumnsForTable(tableName, sequelize)));
|
|
9
|
+
}
|
|
10
|
+
async listColumnsForTable(tableIdentifier, sequelize) {
|
|
11
|
+
const [columns, [{ sql }]] = await Promise.all([
|
|
12
|
+
sequelize.query(`PRAGMA table_info(:tableName)`, {
|
|
13
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
14
|
+
replacements: { tableName: tableIdentifier.tableName },
|
|
15
|
+
}),
|
|
16
|
+
sequelize.query(`SELECT sql FROM sqlite_master WHERE tbl_name=:tableName`, {
|
|
17
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
18
|
+
replacements: { tableName: tableIdentifier.tableName },
|
|
19
|
+
}),
|
|
20
|
+
]);
|
|
21
|
+
return columns.map(column => {
|
|
22
|
+
const primaryKey = Boolean(column.pk);
|
|
23
|
+
return {
|
|
24
|
+
name: column.name,
|
|
25
|
+
type: column.type,
|
|
26
|
+
allowNull: !column.notnull && !primaryKey,
|
|
27
|
+
primaryKey,
|
|
28
|
+
// Not bullet proof, but that's all we can do with SQLite
|
|
29
|
+
// without starting to parse SQL queries
|
|
30
|
+
autoIncrement: primaryKey && sql.includes(`AUTOINCREMENT`),
|
|
31
|
+
comment: null,
|
|
32
|
+
...this.mapDefaultValue(column),
|
|
33
|
+
enumValues: null,
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
mapDefaultValue(column) {
|
|
38
|
+
if (column.dflt_value === null || column.dflt_value?.toUpperCase() === 'NULL') {
|
|
39
|
+
return {
|
|
40
|
+
defaultValue: null,
|
|
41
|
+
isLiteralDefaultValue: false,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (column.dflt_value?.startsWith("'") && column.dflt_value?.endsWith("'")) {
|
|
45
|
+
return {
|
|
46
|
+
defaultValue: column.dflt_value.slice(1, -1).replace(/''/g, "'"),
|
|
47
|
+
isLiteralDefaultValue: false,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (!Number.isNaN(Number(column.dflt_value))) {
|
|
51
|
+
return {
|
|
52
|
+
defaultValue: column.dflt_value,
|
|
53
|
+
isLiteralDefaultValue: false,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
defaultValue: column.dflt_value,
|
|
58
|
+
isLiteralDefaultValue: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.default = SQLiteDialect;
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsaXRlLWRpYWxlY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9kaWFsZWN0cy9zcWxpdGUtZGlhbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFrRDtBQWNsRCxNQUFxQixhQUFhO0lBQ2hDLFdBQVcsQ0FDVCxVQUFzQyxFQUN0QyxTQUFvQjtRQUVwQixJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU07WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFcEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUMvQixlQUF5QyxFQUN6QyxTQUFvQjtRQUVwQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQzdDLFNBQVMsQ0FBQyxLQUFLLENBQVcsK0JBQStCLEVBQUU7Z0JBQ3pELElBQUksRUFBRSxzQkFBVSxDQUFDLE1BQU07Z0JBQ3ZCLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFO2FBQ3ZELENBQUM7WUFDRixTQUFTLENBQUMsS0FBSyxDQUFVLHlEQUF5RCxFQUFFO2dCQUNsRixJQUFJLEVBQUUsc0JBQVUsQ0FBQyxNQUFNO2dCQUN2QixZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRTthQUN2RCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFdEMsT0FBTztnQkFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVU7Z0JBQ3pDLFVBQVU7Z0JBQ1YseURBQXlEO2dCQUN6RCx3Q0FBd0M7Z0JBQ3hDLGFBQWEsRUFBRSxVQUFVLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7Z0JBQzFELE9BQU8sRUFBRSxJQUFJO2dCQUNiLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLFVBQVUsRUFBRSxJQUFJO2FBQ2pCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBZ0I7UUFJdEMsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRTtZQUM3RSxPQUFPO2dCQUNMLFlBQVksRUFBRSxJQUFJO2dCQUNsQixxQkFBcUIsRUFBRSxLQUFLO2FBQzdCLENBQUM7U0FDSDtRQUVELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUUsT0FBTztnQkFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7Z0JBQ2hFLHFCQUFxQixFQUFFLEtBQUs7YUFDN0IsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1lBQzVDLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUMvQixxQkFBcUIsRUFBRSxLQUFLO2FBQzdCLENBQUM7U0FDSDtRQUVELE9BQU87WUFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDL0IscUJBQXFCLEVBQUUsSUFBSTtTQUM1QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBekVELGdDQXlFQyJ9
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ColumnDescription } from '../dialects/dialect.interface';
|
|
2
2
|
import { ColumnType } from '../types';
|
|
3
3
|
export default class DefaultValueParser {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
isLiteral(expression: any, columnType: ColumnType): boolean;
|
|
8
|
-
private parseGeneric;
|
|
9
|
-
private sanitizeExpression;
|
|
10
|
-
private literalUnlessMatch;
|
|
11
|
-
private parseNumber;
|
|
4
|
+
static parse(column: Pick<ColumnDescription, 'defaultValue' | 'isLiteralDefaultValue' | 'enumValues'>, columnType: ColumnType): unknown;
|
|
5
|
+
private static parseGeneric;
|
|
6
|
+
private static parseNumber;
|
|
12
7
|
}
|
|
13
8
|
//# sourceMappingURL=default-value-parser.d.ts.map
|
|
@@ -2,81 +2,48 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const sequelize_1 = require("sequelize");
|
|
4
4
|
class DefaultValueParser {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
-
parse(expression, columnType) {
|
|
10
|
-
if (expression === null || expression === undefined)
|
|
5
|
+
static parse(column, columnType) {
|
|
6
|
+
if (column.defaultValue === null || column.defaultValue === undefined)
|
|
11
7
|
return undefined;
|
|
12
|
-
if (typeof expression === 'string' && expression.startsWith('NULL'))
|
|
13
|
-
return null;
|
|
14
|
-
// FA backend not handle correctly
|
|
15
8
|
if (columnType.type === 'array')
|
|
16
9
|
return undefined;
|
|
10
|
+
if (column.isLiteralDefaultValue)
|
|
11
|
+
return (0, sequelize_1.literal)(column.defaultValue);
|
|
17
12
|
try {
|
|
18
|
-
const result = this.parseGeneric(
|
|
19
|
-
return result !== undefined ? result : (0, sequelize_1.literal)(
|
|
13
|
+
const result = this.parseGeneric(column, columnType);
|
|
14
|
+
return result !== undefined ? result : (0, sequelize_1.literal)(column.defaultValue);
|
|
20
15
|
}
|
|
21
16
|
catch (e) {
|
|
22
|
-
return (0, sequelize_1.literal)(
|
|
17
|
+
return (0, sequelize_1.literal)(column.defaultValue);
|
|
23
18
|
}
|
|
24
19
|
}
|
|
25
|
-
|
|
26
|
-
isLiteral(expression, columnType) {
|
|
27
|
-
return this.parse(expression, columnType)?.constructor.name === 'Literal';
|
|
28
|
-
}
|
|
29
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
-
parseGeneric(expression, columnType) {
|
|
31
|
-
let sanitizedExpression = expression;
|
|
32
|
-
// sanitize string
|
|
33
|
-
if (typeof expression === 'string') {
|
|
34
|
-
sanitizedExpression = this.sanitizeExpression(expression);
|
|
35
|
-
}
|
|
20
|
+
static parseGeneric(column, columnType) {
|
|
36
21
|
if (columnType.type === 'enum') {
|
|
37
|
-
return
|
|
22
|
+
return column.defaultValue;
|
|
38
23
|
}
|
|
39
24
|
switch (columnType.subType) {
|
|
40
25
|
case 'BOOLEAN':
|
|
41
|
-
return [true, 'true', 'TRUE', "b'1'", '1'].includes(
|
|
26
|
+
return [true, 'true', 'TRUE', "b'1'", '1'].includes(column.defaultValue);
|
|
42
27
|
case 'NUMBER':
|
|
43
28
|
case 'BIGINT':
|
|
44
29
|
case 'FLOAT':
|
|
45
30
|
case 'DOUBLE':
|
|
46
|
-
return this.parseNumber(
|
|
31
|
+
return this.parseNumber(column.defaultValue);
|
|
47
32
|
case 'DATE':
|
|
48
33
|
case 'DATEONLY':
|
|
49
|
-
return this.literalUnlessMatch(/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})|(\d{4}-\d{2}-\d{2})|(\d{2}:\d{2}:\d{2})$/, sanitizedExpression);
|
|
50
34
|
case 'STRING':
|
|
51
|
-
return
|
|
35
|
+
return column.defaultValue;
|
|
52
36
|
case 'JSON':
|
|
53
37
|
case 'JSONB':
|
|
54
|
-
return JSON.parse(
|
|
38
|
+
return JSON.parse(column.defaultValue);
|
|
55
39
|
default:
|
|
56
40
|
return undefined;
|
|
57
41
|
}
|
|
58
42
|
}
|
|
59
|
-
|
|
60
|
-
let sanitizedExpression = expression;
|
|
61
|
-
if (/^'.*'$/.test(sanitizedExpression)) {
|
|
62
|
-
sanitizedExpression = expression.substring(1, expression.length - 1);
|
|
63
|
-
}
|
|
64
|
-
if (this.dialect === 'mssql') {
|
|
65
|
-
// Sequelize send default values with weird char at the beginning (`(Ndefault value`)
|
|
66
|
-
sanitizedExpression = sanitizedExpression.replace(/\(N/, '');
|
|
67
|
-
while (/^\(.*\)$/.test(sanitizedExpression)) {
|
|
68
|
-
sanitizedExpression = sanitizedExpression.substring(1, sanitizedExpression.length - 1);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return sanitizedExpression;
|
|
72
|
-
}
|
|
73
|
-
literalUnlessMatch(regexp, expression) {
|
|
74
|
-
return regexp.test(expression) ? expression : (0, sequelize_1.literal)(expression);
|
|
75
|
-
}
|
|
76
|
-
parseNumber(expression) {
|
|
43
|
+
static parseNumber(expression) {
|
|
77
44
|
const result = Number.parseFloat(expression);
|
|
78
45
|
return Number.isNaN(result) ? (0, sequelize_1.literal)(expression) : result;
|
|
79
46
|
}
|
|
80
47
|
}
|
|
81
48
|
exports.default = DefaultValueParser;
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC12YWx1ZS1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9oZWxwZXJzL2RlZmF1bHQtdmFsdWUtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQW9DO0FBS3BDLE1BQXFCLGtCQUFrQjtJQUNyQyxNQUFNLENBQUMsS0FBSyxDQUNWLE1BQXdGLEVBQ3hGLFVBQXNCO1FBRXRCLElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFFeEYsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU87WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUVsRCxJQUFJLE1BQU0sQ0FBQyxxQkFBcUI7WUFBRSxPQUFPLElBQUEsbUJBQU8sRUFBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdEUsSUFBSTtZQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRXJELE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFBLG1CQUFPLEVBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JFO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLElBQUEsbUJBQU8sRUFBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLFlBQVksQ0FDekIsTUFBd0YsRUFDeEYsVUFBc0I7UUFFdEIsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUM5QixPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUM7U0FDNUI7UUFFRCxRQUFRLFVBQVUsQ0FBQyxPQUFPLEVBQUU7WUFDMUIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUUzRSxLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUUvQyxLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssUUFBUTtnQkFDWCxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFFN0IsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUV6QztnQkFDRSxPQUFPLFNBQVMsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQWtCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0MsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLG1CQUFPLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUF6REQscUNBeURDIn0=
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Sequelize } from 'sequelize';
|
|
2
|
-
import {
|
|
2
|
+
import { ColumnDescription } from '../dialects/dialect.interface';
|
|
3
|
+
import { SequelizeTableIdentifier } from '../type-overrides';
|
|
3
4
|
import { ColumnType } from '../types';
|
|
4
5
|
export default class SqlTypeConverter {
|
|
5
6
|
private static readonly enumRegex;
|
|
6
7
|
private readonly sequelize;
|
|
7
8
|
constructor(sequelize: Sequelize);
|
|
8
|
-
convert(tableIdentifier: SequelizeTableIdentifier, columnName: string, columnInfo:
|
|
9
|
+
convert(tableIdentifier: SequelizeTableIdentifier, columnName: string, columnInfo: ColumnDescription): Promise<ColumnType>;
|
|
9
10
|
/** Get the type of an enum from sequelize column description */
|
|
10
11
|
private getEnumType;
|
|
11
12
|
/**
|
|
@@ -18,16 +18,10 @@ class SqlTypeConverter {
|
|
|
18
18
|
}
|
|
19
19
|
/** Get the type of an enum from sequelize column description */
|
|
20
20
|
getEnumType(columnInfo) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
: // User-defined enum with no values will default to string
|
|
26
|
-
{ type: 'scalar', subType: 'STRING' };
|
|
27
|
-
}
|
|
28
|
-
// Other SGDB
|
|
29
|
-
const enumOptions = SqlTypeConverter.enumRegex.exec(columnInfo.type)?.[1];
|
|
30
|
-
return { type: 'enum', values: enumOptions.replace(/'/g, '').split(',') };
|
|
21
|
+
return columnInfo.enumValues?.length > 0
|
|
22
|
+
? { type: 'enum', values: columnInfo.enumValues }
|
|
23
|
+
: // User-defined enum with no values will default to string
|
|
24
|
+
{ type: 'scalar', subType: 'STRING' };
|
|
31
25
|
}
|
|
32
26
|
/**
|
|
33
27
|
* Get the type of an array from sequelize column description
|
|
@@ -155,4 +149,4 @@ class SqlTypeConverter {
|
|
|
155
149
|
}
|
|
156
150
|
exports.default = SqlTypeConverter;
|
|
157
151
|
SqlTypeConverter.enumRegex = /ENUM\((.*)\)/i;
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLXR5cGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaGVscGVycy9zcWwtdHlwZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBa0Q7QUFNbEQsTUFBcUIsZ0JBQWdCO0lBSW5DLFlBQVksU0FBb0I7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsZUFBeUMsRUFDekMsVUFBa0IsRUFDbEIsVUFBNkI7UUFFN0IsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRXhELEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztnQkFDOUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXRDO2dCQUNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUN4RCxXQUFXLENBQUMsVUFBNkI7UUFDL0MsT0FBTyxVQUFVLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDakQsQ0FBQyxDQUFDLDBEQUEwRDtnQkFDMUQsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztJ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
|
|
@@ -7,6 +7,7 @@ export default class Introspector {
|
|
|
7
7
|
private static getTableNames;
|
|
8
8
|
private static getDefaultSchema;
|
|
9
9
|
private static getTableIdentifier;
|
|
10
|
+
private static getTables;
|
|
10
11
|
/** Instrospect a single table */
|
|
11
12
|
private static getTable;
|
|
12
13
|
private static getColumn;
|
|
@@ -15,7 +16,6 @@ export default class Introspector {
|
|
|
15
16
|
* (happens when we skip entities because of errors)
|
|
16
17
|
*/
|
|
17
18
|
private static sanitizeInPlace;
|
|
18
|
-
private static detectBrokenRelationship;
|
|
19
19
|
private static logBrokenRelationship;
|
|
20
20
|
}
|
|
21
21
|
//# sourceMappingURL=introspector.d.ts.map
|
|
@@ -3,22 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
6
|
+
const dialect_factory_1 = __importDefault(require("./dialects/dialect-factory"));
|
|
7
7
|
const default_value_parser_1 = __importDefault(require("./helpers/default-value-parser"));
|
|
8
8
|
const sql_type_converter_1 = __importDefault(require("./helpers/sql-type-converter"));
|
|
9
9
|
class Introspector {
|
|
10
10
|
static async introspect(sequelize, logger) {
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
const diff = tableNamesAndSchemas.filter(name => !validTableNames.includes(name));
|
|
15
|
-
logger?.('Warn', `Skipping table(s): ${diff
|
|
16
|
-
.map(tableNameAndSchema => `'${tableNameAndSchema.tableName}'`)
|
|
17
|
-
.join(', ')}. MSSQL tables with dots are not supported`);
|
|
18
|
-
}
|
|
19
|
-
const promises = validTableNames.map(name => this.getTable(sequelize, logger, name));
|
|
20
|
-
const tables = await Promise.all(promises);
|
|
21
|
-
this.sanitizeInPlace(tables);
|
|
11
|
+
const tableNames = await this.getTableNames(sequelize);
|
|
12
|
+
const tables = await this.getTables(tableNames, sequelize, logger);
|
|
13
|
+
this.sanitizeInPlace(tables, logger);
|
|
22
14
|
return tables;
|
|
23
15
|
}
|
|
24
16
|
/** Get names of all tables in the public schema of the db */
|
|
@@ -66,27 +58,46 @@ class Introspector {
|
|
|
66
58
|
return { tableName: tableIdentifier.tableName };
|
|
67
59
|
}
|
|
68
60
|
}
|
|
61
|
+
static async getTables(tableNames, sequelize, logger) {
|
|
62
|
+
const dialect = (0, dialect_factory_1.default)(sequelize.getDialect());
|
|
63
|
+
const tablesColumns = await dialect.listColumns(tableNames, sequelize);
|
|
64
|
+
return Promise.all(tableNames.map((tableIdentifier, index) => {
|
|
65
|
+
const columnDescriptions = tablesColumns[index];
|
|
66
|
+
return this.getTable(sequelize, tableIdentifier, columnDescriptions, logger);
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
69
|
/** Instrospect a single table */
|
|
70
|
-
static async getTable(sequelize,
|
|
70
|
+
static async getTable(sequelize, tableIdentifier, columnDescriptions, logger) {
|
|
71
71
|
const queryInterface = sequelize.getQueryInterface();
|
|
72
72
|
// Sequelize is not consistent in the way it handles table identifiers either when it returns
|
|
73
73
|
// it, when it uses it internally, or when it is passed as an argument.
|
|
74
74
|
// Plus it has some bugs with schema handling in postgresql that forces us to be sure that
|
|
75
75
|
// the table identifier is correct on our side
|
|
76
76
|
const tableIdentifierForQuery = Introspector.getTableIdentifier(tableIdentifier, sequelize);
|
|
77
|
-
const [
|
|
78
|
-
queryInterface.describeTable(tableIdentifierForQuery),
|
|
77
|
+
const [tableIndexes, tableReferences] = await Promise.all([
|
|
79
78
|
queryInterface.showIndex(tableIdentifierForQuery),
|
|
80
79
|
queryInterface.getForeignKeyReferencesForTable(tableIdentifierForQuery),
|
|
81
80
|
]);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
81
|
+
const references = tableReferences
|
|
82
|
+
.map(tableReference => ({
|
|
83
|
+
...tableReference,
|
|
84
|
+
tableName: typeof tableReference.tableName === 'string'
|
|
85
|
+
? tableReference.tableName
|
|
86
|
+
: // On SQLite, the query interface returns an object with a tableName property
|
|
87
|
+
tableReference.tableName.tableName,
|
|
88
|
+
}))
|
|
89
|
+
.filter(
|
|
90
|
+
// There is a bug right now with sequelize on postgresql: returned association
|
|
91
|
+
// are not filtered on the schema. So we have to filter them manually.
|
|
92
|
+
// Should be fixed with Sequelize v7
|
|
93
|
+
r => r.tableName === tableIdentifier.tableName && r.tableSchema === tableIdentifier.schema);
|
|
94
|
+
const columns = await Promise.all(columnDescriptions.map(async (columnDescription) => {
|
|
95
|
+
const columnReferences = references.filter(r => r.columnName === columnDescription.name);
|
|
96
|
+
const options = {
|
|
97
|
+
name: columnDescription.name,
|
|
98
|
+
description: columnDescription,
|
|
99
|
+
references: columnReferences,
|
|
100
|
+
};
|
|
90
101
|
return this.getColumn(sequelize, logger, tableIdentifier, options);
|
|
91
102
|
}));
|
|
92
103
|
return {
|
|
@@ -100,20 +111,16 @@ class Introspector {
|
|
|
100
111
|
}
|
|
101
112
|
static async getColumn(sequelize, logger, tableIdentifier, options) {
|
|
102
113
|
const { name, description, references } = options;
|
|
103
|
-
const dialect = sequelize.getDialect();
|
|
104
114
|
const typeConverter = new sql_type_converter_1.default(sequelize);
|
|
105
115
|
try {
|
|
106
116
|
const type = await typeConverter.convert(tableIdentifier, name, description);
|
|
107
|
-
const parser = new default_value_parser_1.default(dialect);
|
|
108
|
-
// Workaround autoincrement flag not being properly set when using postgres
|
|
109
|
-
const autoIncrement = Boolean(description.autoIncrement || description.defaultValue?.match?.(/^nextval\(.+\)$/));
|
|
110
117
|
return {
|
|
111
118
|
type,
|
|
112
|
-
autoIncrement,
|
|
113
|
-
defaultValue:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
119
|
+
autoIncrement: description.autoIncrement,
|
|
120
|
+
defaultValue: description.autoIncrement
|
|
121
|
+
? null
|
|
122
|
+
: default_value_parser_1.default.parse(description, type),
|
|
123
|
+
isLiteralDefaultValue: description.isLiteralDefaultValue,
|
|
117
124
|
name,
|
|
118
125
|
allowNull: description.allowNull,
|
|
119
126
|
primaryKey: description.primaryKey,
|
|
@@ -131,64 +138,30 @@ class Introspector {
|
|
|
131
138
|
* Remove references to entities that are not present in the schema
|
|
132
139
|
* (happens when we skip entities because of errors)
|
|
133
140
|
*/
|
|
134
|
-
static sanitizeInPlace(tables) {
|
|
141
|
+
static sanitizeInPlace(tables, logger) {
|
|
135
142
|
for (const table of tables) {
|
|
136
143
|
// Remove unique indexes which depennd on columns that are not present in the table.
|
|
137
144
|
table.unique = table.unique.filter(unique => unique.every(column => table.columns.find(c => c.name === column)));
|
|
138
145
|
for (const column of table.columns) {
|
|
146
|
+
const references = column.constraints || [];
|
|
139
147
|
// Remove references to tables that are not present in the schema.
|
|
140
|
-
column.constraints =
|
|
148
|
+
column.constraints = references.filter(constraint => {
|
|
141
149
|
const refTable = tables.find(t => t.name === constraint.table);
|
|
142
150
|
const refColumn = refTable?.columns.find(c => c.name === constraint.column);
|
|
143
151
|
return refTable && refColumn;
|
|
144
152
|
});
|
|
153
|
+
this.logBrokenRelationship(references, column.constraints, table.name, logger);
|
|
145
154
|
}
|
|
146
155
|
}
|
|
147
156
|
}
|
|
148
|
-
static
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
type: sequelize_1.QueryTypes.SELECT,
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
constraintNamesForForeignKey = await sequelize.query(`
|
|
160
|
-
SELECT constraint_name, table_name
|
|
161
|
-
FROM information_schema.table_constraints
|
|
162
|
-
WHERE table_name = :tableName
|
|
163
|
-
AND constraint_type = 'FOREIGN KEY'
|
|
164
|
-
AND (:schema IS NULL OR table_schema = :schema);
|
|
165
|
-
`, {
|
|
166
|
-
replacements: {
|
|
167
|
-
tableName: tableIdentifier.tableName,
|
|
168
|
-
schema: tableIdentifier.schema || null,
|
|
169
|
-
},
|
|
170
|
-
type: sequelize_1.QueryTypes.SELECT,
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
this.logBrokenRelationship(constraintNamesForForeignKey, tableReferences, logger);
|
|
174
|
-
}
|
|
175
|
-
static logBrokenRelationship(constraintNamesForForeignKey, tableReferences, logger) {
|
|
176
|
-
if (constraintNamesForForeignKey.length !== tableReferences.length) {
|
|
177
|
-
const constraintNames = new Set(constraintNamesForForeignKey.map(c => ({ constraint_name: c.constraint_name, table_name: c.table_name })));
|
|
178
|
-
tableReferences.forEach(({ constraintName }) => {
|
|
179
|
-
constraintNames.forEach(obj => {
|
|
180
|
-
if (obj.constraint_name === constraintName) {
|
|
181
|
-
constraintNames.delete(obj);
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
constraintNames.forEach(obj => {
|
|
186
|
-
logger?.('Error',
|
|
187
|
-
// eslint-disable-next-line max-len
|
|
188
|
-
`Failed to load constraints on relation '${obj.constraint_name}' on table '${obj.table_name}'. The relation will be ignored.`);
|
|
189
|
-
});
|
|
190
|
-
}
|
|
157
|
+
static logBrokenRelationship(allConstraints, sanitizedConstraints, tableName, logger) {
|
|
158
|
+
const missingConstraints = allConstraints.filter(constraint => !sanitizedConstraints.includes(constraint));
|
|
159
|
+
missingConstraints.forEach(constraint => {
|
|
160
|
+
logger?.('Error',
|
|
161
|
+
// eslint-disable-next-line max-len
|
|
162
|
+
`Failed to load constraints on relation on table '${tableName}' referencing '${constraint.table}.${constraint.column}'. The relation will be ignored.`);
|
|
163
|
+
});
|
|
191
164
|
}
|
|
192
165
|
}
|
|
193
166
|
exports.default = Introspector;
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaW50cm9zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0EsaUZBQXFFO0FBRXJFLDBGQUFnRTtBQUNoRSxzRkFBNEQ7QUFTNUQsTUFBcUIsWUFBWTtJQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFvQixFQUFFLE1BQWU7UUFDM0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQWlDLENBQUMsQ0FBQztRQUMvRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVuRSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVyQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsNkRBQTZEO0lBQ3JELE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUNoQyxTQUErQjtRQUUvQixNQUFNLGdCQUFnQixHQUF1QyxNQUFNLFNBQVM7YUFDekUsaUJBQWlCLEVBQUU7YUFDbkIsYUFBYSxFQUFFLENBQUM7UUFFbkIsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXJGLDRDQUE0QztRQUM1Qyw4REFBOEQ7UUFDOUQsMkZBQTJGO1FBQzNGLE9BQU8sQ0FDTCxnQkFBZ0I7YUFDYixHQUFHLENBQUMsQ0FBQyxlQUFrRCxFQUFFLEVBQUUsQ0FDMUQsT0FBTyxlQUFlLEtBQUssUUFBUTtZQUNqQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUU7WUFDekQsQ0FBQyxDQUFDO2dCQUNFLE1BQU0sRUFB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
|
|
@@ -21,7 +21,7 @@ export type SequelizeReference = {
|
|
|
21
21
|
constraintName: string;
|
|
22
22
|
constraintSchema: string;
|
|
23
23
|
constraintCatalog: string;
|
|
24
|
-
tableName: string;
|
|
24
|
+
tableName: string | SequelizeTableIdentifier;
|
|
25
25
|
tableSchema: string;
|
|
26
26
|
tableCatalog: string;
|
|
27
27
|
columnName: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/datasource-sql",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.43",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"directory": "packages/datasource-sql"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@forestadmin/datasource-sequelize": "1.5.
|
|
16
|
-
"@forestadmin/datasource-toolkit": "1.29.
|
|
15
|
+
"@forestadmin/datasource-sequelize": "1.5.26",
|
|
16
|
+
"@forestadmin/datasource-toolkit": "1.29.1",
|
|
17
17
|
"pluralize": "^8.0.0",
|
|
18
18
|
"sequelize": "^6.28.0",
|
|
19
19
|
"socks": "^2.7.1",
|