@forestadmin/datasource-sql 1.7.34 → 1.7.35
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/helpers/sql-type-converter.d.ts +2 -2
- package/dist/introspection/helpers/sql-type-converter.js +13 -5
- package/dist/introspection/introspector.js +36 -21
- package/dist/introspection/type-overrides.d.ts +4 -0
- package/dist/introspection/types.d.ts +1 -0
- package/dist/orm-builder/model.js +2 -1
- package/package.json +1 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Sequelize } from 'sequelize';
|
|
2
|
-
import { SequelizeColumn } from '../type-overrides';
|
|
2
|
+
import { SequelizeColumn, SequelizeTableIdentifier } from '../type-overrides';
|
|
3
3
|
import { ColumnType } from '../types';
|
|
4
4
|
export default class SqlTypeConverter {
|
|
5
5
|
private static readonly enumRegex;
|
|
6
6
|
private readonly sequelize;
|
|
7
7
|
constructor(sequelize: Sequelize);
|
|
8
|
-
convert(
|
|
8
|
+
convert(tableIdentifier: SequelizeTableIdentifier, columnName: string, columnInfo: SequelizeColumn): Promise<ColumnType>;
|
|
9
9
|
/** Get the type of an enum from sequelize column description */
|
|
10
10
|
private getEnumType;
|
|
11
11
|
/**
|
|
@@ -5,10 +5,10 @@ class SqlTypeConverter {
|
|
|
5
5
|
constructor(sequelize) {
|
|
6
6
|
this.sequelize = sequelize;
|
|
7
7
|
}
|
|
8
|
-
async convert(
|
|
8
|
+
async convert(tableIdentifier, columnName, columnInfo) {
|
|
9
9
|
switch (columnInfo.type) {
|
|
10
10
|
case 'ARRAY':
|
|
11
|
-
return this.getArrayType(
|
|
11
|
+
return this.getArrayType(tableIdentifier, columnName);
|
|
12
12
|
case 'USER-DEFINED':
|
|
13
13
|
case this.typeMatch(columnInfo.type, SqlTypeConverter.enumRegex):
|
|
14
14
|
return this.getEnumType(columnInfo);
|
|
@@ -34,7 +34,7 @@ class SqlTypeConverter {
|
|
|
34
34
|
* Note that we don't need to write multiple SQL queries, because arrays are only supported by
|
|
35
35
|
* Postgres
|
|
36
36
|
*/
|
|
37
|
-
async getArrayType(
|
|
37
|
+
async getArrayType(tableIdentifier, columnName) {
|
|
38
38
|
// Get the type of the elements in the array from the database
|
|
39
39
|
const [{ udtName, dataType, charLength, schema, rawEnumValues }] = await this.sequelize.query(`SELECT
|
|
40
40
|
e.udt_name AS "udtName",
|
|
@@ -56,9 +56,17 @@ class SqlTypeConverter {
|
|
|
56
56
|
c.table_schema = e.object_schema AND
|
|
57
57
|
c.table_name = e.object_name AND
|
|
58
58
|
'TABLE' = e.object_type AND
|
|
59
|
+
(:schema IS NULL OR c.table_schema = :schema) AND
|
|
59
60
|
c.dtd_identifier = e.collection_type_identifier
|
|
60
61
|
)
|
|
61
|
-
WHERE table_name = :tableName AND c.column_name = :columnName;`.replace(/\s+/g, ' '), {
|
|
62
|
+
WHERE table_name = :tableName AND c.column_name = :columnName;`.replace(/\s+/g, ' '), {
|
|
63
|
+
replacements: {
|
|
64
|
+
tableName: tableIdentifier.tableName,
|
|
65
|
+
schema: tableIdentifier.schema || null,
|
|
66
|
+
columnName,
|
|
67
|
+
},
|
|
68
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
69
|
+
});
|
|
62
70
|
let subType;
|
|
63
71
|
if (rawEnumValues !== null) {
|
|
64
72
|
const queryInterface = this.sequelize.getQueryInterface();
|
|
@@ -147,4 +155,4 @@ class SqlTypeConverter {
|
|
|
147
155
|
}
|
|
148
156
|
exports.default = SqlTypeConverter;
|
|
149
157
|
SqlTypeConverter.enumRegex = /ENUM\((.*)\)/i;
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLXR5cGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaGVscGVycy9zcWwtdHlwZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBa0Q7QUFLbEQsTUFBcUIsZ0JBQWdCO0lBSW5DLFlBQVksU0FBb0I7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsZUFBeUMsRUFDekMsVUFBa0IsRUFDbEIsVUFBMkI7UUFFM0IsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRXhELEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztnQkFDOUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXRDO2dCQUNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUN4RCxXQUFXLENBQUMsVUFBMkI7UUFDN0MsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUN0QyxnQkFBZ0I7WUFDaEIsT0FBTyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUM5QyxDQUFDLENBQUMsMERBQTBEO29C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
|
|
@@ -16,43 +16,47 @@ class Introspector {
|
|
|
16
16
|
}
|
|
17
17
|
/** Get names of all tables in the public schema of the db */
|
|
18
18
|
static async getTableNames(sequelize) {
|
|
19
|
-
const
|
|
19
|
+
const tableIdentifiers = await sequelize
|
|
20
20
|
.getQueryInterface()
|
|
21
21
|
.showAllTables();
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
// returns a list of object for both mariadb & mssql
|
|
22
|
+
// Sometimes sequelize returns only strings,
|
|
23
|
+
// and sometimes objects with a tableName and schema property.
|
|
25
24
|
// @see https://github.com/sequelize/sequelize/blob/main/src/dialects/mariadb/query.js#L295
|
|
26
|
-
return
|
|
25
|
+
return tableIdentifiers.map(tableIdentifier => typeof tableIdentifier === 'string' ? { tableName: tableIdentifier } : tableIdentifier);
|
|
27
26
|
}
|
|
28
27
|
/** Instrospect a single table */
|
|
29
|
-
static async getTable(sequelize, logger,
|
|
28
|
+
static async getTable(sequelize, logger, tableIdentifier) {
|
|
30
29
|
const queryInterface = sequelize.getQueryInterface();
|
|
31
30
|
const [columnDescriptions, tableIndexes, tableReferences] = await Promise.all([
|
|
32
|
-
queryInterface.describeTable(
|
|
33
|
-
queryInterface.showIndex(
|
|
34
|
-
queryInterface.getForeignKeyReferencesForTable(
|
|
31
|
+
queryInterface.describeTable(tableIdentifier),
|
|
32
|
+
queryInterface.showIndex(tableIdentifier),
|
|
33
|
+
queryInterface.getForeignKeyReferencesForTable(tableIdentifier),
|
|
35
34
|
]);
|
|
36
|
-
await this.detectBrokenRelationship(
|
|
35
|
+
await this.detectBrokenRelationship(tableIdentifier, sequelize, tableReferences, logger);
|
|
37
36
|
const columns = await Promise.all(Object.entries(columnDescriptions).map(async ([name, description]) => {
|
|
38
|
-
const references = tableReferences.filter(
|
|
37
|
+
const references = tableReferences.filter(
|
|
38
|
+
// There is a bug right now with sequelize on postgresql: returned association
|
|
39
|
+
// are not filtered on the schema. So we have to filter them manually.
|
|
40
|
+
// Should be fixed with Sequelize v7
|
|
41
|
+
r => r.columnName === name && r.tableSchema === tableIdentifier.schema);
|
|
39
42
|
const options = { name, description, references };
|
|
40
|
-
return this.getColumn(sequelize, logger,
|
|
43
|
+
return this.getColumn(sequelize, logger, tableIdentifier, options);
|
|
41
44
|
}));
|
|
42
45
|
return {
|
|
43
|
-
name: tableName,
|
|
46
|
+
name: tableIdentifier.tableName,
|
|
47
|
+
schema: tableIdentifier.schema,
|
|
44
48
|
columns: columns.filter(Boolean),
|
|
45
49
|
unique: tableIndexes
|
|
46
50
|
.filter(i => i.unique || i.primary)
|
|
47
51
|
.map(i => i.fields.map(f => f.attribute)),
|
|
48
52
|
};
|
|
49
53
|
}
|
|
50
|
-
static async getColumn(sequelize, logger,
|
|
54
|
+
static async getColumn(sequelize, logger, tableIdentifier, options) {
|
|
51
55
|
const { name, description, references } = options;
|
|
52
56
|
const dialect = sequelize.getDialect();
|
|
53
57
|
const typeConverter = new sql_type_converter_1.default(sequelize);
|
|
54
58
|
try {
|
|
55
|
-
const type = await typeConverter.convert(
|
|
59
|
+
const type = await typeConverter.convert(tableIdentifier, name, description);
|
|
56
60
|
const parser = new default_value_parser_1.default(dialect);
|
|
57
61
|
// Workaround autoincrement flag not being properly set when using postgres
|
|
58
62
|
const autoIncrement = Boolean(description.autoIncrement || description.defaultValue?.match?.(/^nextval\(.+\)$/));
|
|
@@ -73,7 +77,7 @@ class Introspector {
|
|
|
73
77
|
};
|
|
74
78
|
}
|
|
75
79
|
catch (e) {
|
|
76
|
-
logger?.('Warn', `Skipping column ${tableName}.${name} (${e.message})`);
|
|
80
|
+
logger?.('Warn', `Skipping column ${tableIdentifier.tableName}.${name} (${e.message})`);
|
|
77
81
|
}
|
|
78
82
|
}
|
|
79
83
|
/**
|
|
@@ -94,19 +98,30 @@ class Introspector {
|
|
|
94
98
|
}
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
|
-
static async detectBrokenRelationship(
|
|
101
|
+
static async detectBrokenRelationship(tableIdentifier, sequelize, tableReferences, logger) {
|
|
98
102
|
let constraintNamesForForeignKey = [];
|
|
99
103
|
const dialect = sequelize.getDialect();
|
|
100
104
|
if (dialect === 'sqlite') {
|
|
101
105
|
constraintNamesForForeignKey = await sequelize.query(`SELECT "from" as constraint_name, :tableName as table_name
|
|
102
106
|
from pragma_foreign_key_list(:tableName);`, {
|
|
103
|
-
replacements: { tableName },
|
|
107
|
+
replacements: { tableName: tableIdentifier.tableName },
|
|
104
108
|
type: sequelize_1.QueryTypes.SELECT,
|
|
105
109
|
});
|
|
106
110
|
}
|
|
107
111
|
else {
|
|
108
|
-
constraintNamesForForeignKey = await sequelize.query(`
|
|
109
|
-
|
|
112
|
+
constraintNamesForForeignKey = await sequelize.query(`
|
|
113
|
+
SELECT constraint_name, table_name
|
|
114
|
+
FROM information_schema.table_constraints
|
|
115
|
+
WHERE table_name = :tableName
|
|
116
|
+
AND constraint_type = 'FOREIGN KEY'
|
|
117
|
+
AND (:schema IS NULL OR table_schema = :schema);
|
|
118
|
+
`, {
|
|
119
|
+
replacements: {
|
|
120
|
+
tableName: tableIdentifier.tableName,
|
|
121
|
+
schema: tableIdentifier.schema || null,
|
|
122
|
+
},
|
|
123
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
124
|
+
});
|
|
110
125
|
}
|
|
111
126
|
this.logBrokenRelationship(constraintNamesForForeignKey, tableReferences, logger);
|
|
112
127
|
}
|
|
@@ -129,4 +144,4 @@ class Introspector {
|
|
|
129
144
|
}
|
|
130
145
|
}
|
|
131
146
|
exports.default = Introspector;
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaW50cm9zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EseUNBQTJEO0FBRTNELDBGQUFnRTtBQUNoRSxzRkFBNEQ7QUFTNUQsTUFBcUIsWUFBWTtJQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFvQixFQUFFLE1BQWU7UUFDM0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsNkRBQTZEO0lBQ3JELE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQW9CO1FBQ3JELE1BQU0sZ0JBQWdCLEdBQXVDLE1BQU0sU0FBUzthQUN6RSxpQkFBaUIsRUFBRTthQUNuQixhQUFhLEVBQUUsQ0FBQztRQUVuQiw0Q0FBNEM7UUFDNUMsOERBQThEO1FBQzlELDJGQUEyRjtRQUMzRixPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUM1QyxPQUFPLGVBQWUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQ3ZGLENBQUM7SUFDSixDQUFDO0lBRUQsaUNBQWlDO0lBQ3pCLE1B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
|
|
@@ -12,6 +12,10 @@ export interface SequelizeIndex {
|
|
|
12
12
|
export interface SequelizeColumn extends ColumnDescription {
|
|
13
13
|
special?: string[];
|
|
14
14
|
}
|
|
15
|
+
export interface SequelizeTableIdentifier {
|
|
16
|
+
tableName: string;
|
|
17
|
+
schema?: string;
|
|
18
|
+
}
|
|
15
19
|
export type SequelizeColumnType = AbstractDataType | AbstractDataTypeConstructor;
|
|
16
20
|
export type SequelizeReference = {
|
|
17
21
|
constraintName: string;
|
|
@@ -21,6 +21,7 @@ class ModelBuilder {
|
|
|
21
21
|
tableName: table.name,
|
|
22
22
|
timestamps: hasTimestamps,
|
|
23
23
|
paranoid: isParanoid,
|
|
24
|
+
schema: table.schema,
|
|
24
25
|
});
|
|
25
26
|
// @see https://sequelize.org/docs/v6/other-topics/legacy/#primary-keys
|
|
26
27
|
// Tell sequelize NOT to invent primary keys when we don't provide them.
|
|
@@ -91,4 +92,4 @@ class ModelBuilder {
|
|
|
91
92
|
}
|
|
92
93
|
}
|
|
93
94
|
exports.default = ModelBuilder;
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JtLWJ1aWxkZXIvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSx5Q0FBdUQ7QUFHdkQsOEVBQTREO0FBRzVELE1BQXFCLFlBQVk7SUFDL0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFvQixFQUFFLE1BQWMsRUFBRSxNQUFlO1FBQ3ZFLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO1lBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQW9CLEVBQUUsTUFBYyxFQUFFLEtBQVk7UUFDM0UsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWhHLElBQUk7WUFDRixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNyRCxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ3JCLFVBQVUsRUFBRSxhQUFhO2dCQUN6QixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2FBQ3JCLENBQUMsQ0FBQztZQUVILHVFQUF1RTtZQUN2RSx3RUFBd0U7WUFDeEUseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyxVQUFVLENB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
|