@forestadmin/datasource-sql 1.2.3 → 1.2.5
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.js +8 -3
- package/dist/introspection/introspector.js +6 -6
- package/dist/introspection/types.d.ts +3 -3
- package/dist/orm-builder/helpers/relation-extractor.d.ts +1 -0
- package/dist/orm-builder/helpers/relation-extractor.js +5 -2
- package/dist/orm-builder/helpers/sequelize-type.js +6 -5
- package/dist/orm-builder/model.d.ts +6 -0
- package/dist/orm-builder/model.js +49 -14
- package/package.json +1 -1
|
@@ -36,10 +36,15 @@ class SqlTypeConverter {
|
|
|
36
36
|
*/
|
|
37
37
|
async getArrayType(tableName, columnName) {
|
|
38
38
|
// Get the type of the elements in the array from the database
|
|
39
|
-
const [{ udtName, dataType, charLength, rawEnumValues }] = await this.sequelize.query(`SELECT
|
|
39
|
+
const [{ udtName, dataType, charLength, schema, rawEnumValues }] = await this.sequelize.query(`SELECT
|
|
40
40
|
e.udt_name AS "udtName",
|
|
41
41
|
e.data_type AS "dataType",
|
|
42
42
|
e.character_maximum_length as "charLength",
|
|
43
|
+
(
|
|
44
|
+
SELECT ns.nspname
|
|
45
|
+
FROM pg_catalog.pg_namespace ns JOIN pg_catalog.pg_type t ON ns.oid = t.typnamespace
|
|
46
|
+
WHERE t.typname = e.udt_name
|
|
47
|
+
) as "schema",
|
|
43
48
|
(
|
|
44
49
|
SELECT array_agg(en.enumlabel)
|
|
45
50
|
FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum en ON t.oid = en.enumtypid
|
|
@@ -59,7 +64,7 @@ class SqlTypeConverter {
|
|
|
59
64
|
const queryInterface = this.sequelize.getQueryInterface();
|
|
60
65
|
const queryGen = queryInterface.queryGenerator;
|
|
61
66
|
const enumValues = queryGen.fromArray(rawEnumValues);
|
|
62
|
-
subType = { type: 'enum', name: udtName, values: enumValues };
|
|
67
|
+
subType = { type: 'enum', schema, name: udtName, values: enumValues };
|
|
63
68
|
}
|
|
64
69
|
else {
|
|
65
70
|
const dataTypeWithLength = charLength ? `${dataType}(${charLength})` : dataType;
|
|
@@ -132,4 +137,4 @@ class SqlTypeConverter {
|
|
|
132
137
|
}
|
|
133
138
|
exports.default = SqlTypeConverter;
|
|
134
139
|
SqlTypeConverter.enumRegex = /ENUM\((.*)\)/i;
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLXR5cGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaGVscGVycy9zcWwtdHlwZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBcUU7QUFJckUsTUFBcUIsZ0JBQWdCO0lBSW5DLFlBQVksU0FBb0I7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsU0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsVUFBNkI7UUFFN0IsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRWxELEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztnQkFDOUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXRDO2dCQUNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUN4RCxXQUFXLENBQUMsVUFBNkI7UUFDL0MsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUN0QyxnQkFBZ0I7WUFDaEIsT0FBTyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUM5QyxDQUFDLENBQUMsMERBQTBEO29C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
|
|
@@ -56,24 +56,25 @@ class Introspector {
|
|
|
56
56
|
]);
|
|
57
57
|
// Create columns
|
|
58
58
|
const columns = Object.entries(columnDescriptions).map(([name, description]) => {
|
|
59
|
-
const indexes = tableIndexes.filter(i => i.fields.find(f => f.attribute === name));
|
|
60
59
|
const references = tableReferences.filter(r => r.columnName === name);
|
|
61
|
-
const options = { name, description,
|
|
60
|
+
const options = { name, description, references };
|
|
62
61
|
return this.getColumn(sequelize, logger, tableName, options);
|
|
63
62
|
});
|
|
64
63
|
return {
|
|
65
64
|
name: tableName,
|
|
66
65
|
columns: (await Promise.all(columns)).filter(Boolean),
|
|
66
|
+
unique: tableIndexes
|
|
67
|
+
.filter(i => i.unique || i.primary)
|
|
68
|
+
.map(i => i.fields.map(f => f.attribute)),
|
|
67
69
|
};
|
|
68
70
|
}
|
|
69
71
|
static async getColumn(sequelize, logger, tableName, options) {
|
|
70
|
-
const { name, description,
|
|
72
|
+
const { name, description, references } = options;
|
|
71
73
|
const dialect = sequelize.getDialect();
|
|
72
74
|
const typeConverter = new sql_type_converter_1.default(sequelize);
|
|
73
75
|
try {
|
|
74
76
|
const type = await typeConverter.convert(tableName, name, description);
|
|
75
77
|
const defaultValue = new default_value_parser_1.default(dialect).parse(description.defaultValue, type);
|
|
76
|
-
const unique = !!indexes.find(i => i.fields.length === 1 && i.fields[0].attribute === name && i.unique);
|
|
77
78
|
// Workaround autoincrement flag not being properly set when using postgres
|
|
78
79
|
const autoIncrement = Boolean(description.autoIncrement || description.defaultValue?.match?.(/^nextval\(.+\)$/));
|
|
79
80
|
return {
|
|
@@ -82,7 +83,6 @@ class Introspector {
|
|
|
82
83
|
defaultValue: autoIncrement ? null : defaultValue,
|
|
83
84
|
name,
|
|
84
85
|
allowNull: description.allowNull,
|
|
85
|
-
unique,
|
|
86
86
|
primaryKey: description.primaryKey,
|
|
87
87
|
constraints: references.map(r => ({
|
|
88
88
|
table: r.referencedTableName,
|
|
@@ -96,4 +96,4 @@ class Introspector {
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
exports.default = Introspector;
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaW50cm9zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0EscUNBU2tCO0FBQ2xCLDBGQUFnRTtBQUNoRSxzRkFBNEQ7QUFHNUQsTUFBcUIsWUFBWTtJQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFvQixFQUFFLE1BQWU7UUFDM0QsSUFBSTtZQUNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV2RCxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsUUFBUyxDQUE4QixDQUFDLElBQUksRUFBRTtnQkFDNUMsS0FBSywwQkFBMEI7b0JBQzdCLE1BQU0sSUFBSSx3QkFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkMsS0FBSyw0QkFBNEI7b0JBQy9CLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLEtBQUssaUNBQWlDO29CQUNwQyxNQUFNLElBQUksK0JBQXNCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLGdDQUFnQztvQkFDbkMsTUFBTSxJQUFJLDhCQUFxQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0MsS0FBSyw0QkFBNEI7b0JBQy9CLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLEtBQUssd0NBQXdDO29CQUMz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
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { AbstractDataType, AbstractDataTypeConstructor, QueryInterface } from 'sequelize/types';
|
|
2
|
-
export type SequelizeIndex = Awaited<ReturnType<QueryInterface['showIndex']>>[number];
|
|
3
2
|
export type SequelizeColumn = Awaited<ReturnType<QueryInterface['describeTable']>>[number];
|
|
4
3
|
export type SequelizeColumnType = AbstractDataType | AbstractDataTypeConstructor;
|
|
5
4
|
export type SequelizeReference = Awaited<ReturnType<QueryInterface['getForeignKeyReferencesForTable']>>[number];
|
|
@@ -13,25 +12,26 @@ export type ColumnType = {
|
|
|
13
12
|
} | {
|
|
14
13
|
type: 'enum';
|
|
15
14
|
/**
|
|
16
|
-
* When using postgres, name of the type of this enum (e.g. "enum_users_role")
|
|
15
|
+
* When using postgres, schema and name of the type of this enum (e.g. "enum_users_role")
|
|
17
16
|
*
|
|
18
17
|
* This is needed when the enum is used in an array, because sequelize needs to cast when
|
|
19
18
|
* inserting into that column.
|
|
20
19
|
* As this is not needed for enums which are not used in arrays, and requires extra
|
|
21
20
|
* introspection queries, it is filled only when needed.
|
|
22
21
|
*/
|
|
22
|
+
schema?: string;
|
|
23
23
|
name?: string;
|
|
24
24
|
/** list of values that the enum can take */
|
|
25
25
|
values: string[];
|
|
26
26
|
};
|
|
27
27
|
export type Table = {
|
|
28
28
|
name: string;
|
|
29
|
+
unique: string[][];
|
|
29
30
|
columns: {
|
|
30
31
|
name: string;
|
|
31
32
|
type: ColumnType;
|
|
32
33
|
defaultValue: unknown;
|
|
33
34
|
allowNull: boolean;
|
|
34
|
-
unique: boolean;
|
|
35
35
|
autoIncrement: boolean;
|
|
36
36
|
primaryKey: boolean;
|
|
37
37
|
constraints: {
|
|
@@ -23,7 +23,7 @@ class RelationExtractor {
|
|
|
23
23
|
// Skip HasMany to junction tables
|
|
24
24
|
if (!this.isJunctionTable(table))
|
|
25
25
|
relations.push({
|
|
26
|
-
type: column.
|
|
26
|
+
type: this.isUnique(table, column.name) ? 'HasOne' : 'HasMany',
|
|
27
27
|
from: constraint.table,
|
|
28
28
|
to: table.name,
|
|
29
29
|
originKey: column.name,
|
|
@@ -64,6 +64,9 @@ class RelationExtractor {
|
|
|
64
64
|
static isJunctionTable(table) {
|
|
65
65
|
return table.columns.filter(c => c.primaryKey && c.constraints.length === 1).length === 2;
|
|
66
66
|
}
|
|
67
|
+
static isUnique(table, columnName) {
|
|
68
|
+
return table.unique.some(u => u.length === 1 && u[0] === columnName);
|
|
69
|
+
}
|
|
67
70
|
}
|
|
68
71
|
exports.default = RelationExtractor;
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb24tZXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29ybS1idWlsZGVyL2hlbHBlcnMvcmVsYXRpb24tZXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBcUIsaUJBQWlCO0lBQ3BDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBaUIsRUFBRSxNQUFlO1FBQ3JELE1BQU0sU0FBUyxHQUFlLEVBQUUsQ0FBQztRQUVqQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbkQsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQVk7UUFDN0MsTUFBTSxTQUFTLEdBQWUsRUFBRSxDQUFDO1FBRWpDLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNsQyxLQUFLLE1BQU0sVUFBVSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7Z0JBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDaEIsRUFBRSxFQUFFLFVBQVUsQ0FBQyxLQUFLO29CQUNwQixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ3ZCLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxNQUFNO2lCQUNwQyxDQUFDLENBQUM7Z0JBRUgsa0NBQWtDO2dCQUNsQyxJ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
|
|
@@ -15,7 +15,7 @@ class SequelizeTypeFactory {
|
|
|
15
15
|
// This should prevent side-effects on most cases if the custom type fails to mimic the
|
|
16
16
|
// default one and cause issues, while still allowing to use custom types when required.
|
|
17
17
|
return dialect === 'postgres' && type.name && type.name !== `enum_${table}_${columnName}`
|
|
18
|
-
? this.makeCustomEnumType(type.name, type.values)
|
|
18
|
+
? this.makeCustomEnumType(type.schema, type.name, type.values)
|
|
19
19
|
: sequelize_1.DataTypes.ENUM(...type.values);
|
|
20
20
|
case 'array':
|
|
21
21
|
return sequelize_1.DataTypes.ARRAY(this.makeType(dialect, type.subType, table, columnName));
|
|
@@ -34,13 +34,14 @@ class SequelizeTypeFactory {
|
|
|
34
34
|
* @see https://github.com/sequelize/sequelize/blob/v6.28.0/src/dialects/postgres/data-types.js#L491
|
|
35
35
|
* @see https://github.com/sequelize/sequelize/blob/v6.28.0/src/utils.js#L555
|
|
36
36
|
*/
|
|
37
|
-
static makeCustomEnumType(name, values) {
|
|
37
|
+
static makeCustomEnumType(schema, name, values) {
|
|
38
38
|
var _a;
|
|
39
|
+
const key = `${schema ? `"${schema}".` : ''}"${name}"`;
|
|
39
40
|
const Type = (_a = class extends sequelize_1.DataTypes.ABSTRACT {
|
|
40
41
|
constructor() {
|
|
41
42
|
super();
|
|
42
43
|
this.isDataSourceSqlEnum = true;
|
|
43
|
-
this.key =
|
|
44
|
+
this.key = key;
|
|
44
45
|
// Steal the validate method from the ENUM type
|
|
45
46
|
this.validate = sequelize_1.DataTypes.ENUM.prototype.validate;
|
|
46
47
|
this.values = values;
|
|
@@ -54,10 +55,10 @@ class SequelizeTypeFactory {
|
|
|
54
55
|
// Setting this tells sequelize the name of the type in the database.
|
|
55
56
|
// This is used, most notably, when casting values (which happens when the enum is used in
|
|
56
57
|
// arrays)
|
|
57
|
-
_a.key =
|
|
58
|
+
_a.key = key,
|
|
58
59
|
_a);
|
|
59
60
|
return new Type();
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
exports.default = SequelizeTypeFactory;
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVsaXplLXR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3JtLWJ1aWxkZXIvaGVscGVycy9zZXF1ZWxpemUtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRCQUE0QjtBQUM1Qix5Q0FBeUM7QUFDekMseUNBQXNDO0FBSXRDLE1BQXFCLG9CQUFvQjtJQUN2QyxNQUFNLENBQUMsUUFBUSxDQUNiLE9BQWUsRUFDZixJQUFnQixFQUNoQixLQUFhLEVBQ2IsVUFBa0I7UUFFbEIsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssUUFBUTtnQkFDWCxJQUFJLHFCQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFBRSxPQUFPLHFCQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUV0RCxLQUFLLE1BQU07Z0JBQ1QsNkRBQTZEO2dCQUM3RCx1RkFBdUY7Z0JBQ3ZGLHdGQUF3RjtnQkFDeEYsT0FBTyxPQUFPLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEtBQUssSUFBSSxVQUFVLEVBQUU7b0JBQ3ZGLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQzlELENBQUMsQ0FBQyxxQkFBUyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVyQyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxxQkFBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRWxGO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNLLE1BQU0sQ0FBQyxrQkFBa0IsQ0FDL0IsTUFBYyxFQUNkLElBQVksRUFDWixNQUFnQjs7UUFFaEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUV2RCxNQUFNLElBQUksU0FBRyxLQUFNLFNBQVEscUJBQVMsQ0FBQyxRQUFRO2dCQWtCM0M7b0JBQ0UsS0FBSyxFQUFFLENBQUM7b0JBZEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDO29CQU0zQixRQUFHLEdBQUcsR0FBRyxDQUFDO29CQWNuQiwrQ0FBK0M7b0JBQy9DLGFBQVEsR0FBRyxxQkFBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO29CQUwzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUM1QixDQUFDO2FBSUY7WUExQkMscUZBQXFGO1lBQ3JGLDREQUE0RDtZQUM1RCxzREFBc0Q7WUFDdEMsc0JBQW1CLEdBQUcsSUFBSztZQUczQyxxRUFBcUU7WUFDckUsMEZBQTBGO1lBQzFGLFVBQVU7WUFDTSxNQUFHLEdBQUcsR0FBSTtlQWlCM0IsQ0FBQztRQUVGLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUE3RUQsdUNBNkVDIn0=
|
|
@@ -4,6 +4,12 @@ import { Table } from '../introspection/types';
|
|
|
4
4
|
export default class ModelBuilder {
|
|
5
5
|
static defineModels(sequelize: Sequelize, logger: Logger, tables: Table[]): void;
|
|
6
6
|
private static defineModel;
|
|
7
|
+
private static buildModelAttributes;
|
|
8
|
+
/**
|
|
9
|
+
* When the primary key is missing, we attempt to find a column that may act as such.
|
|
10
|
+
* This enables us to support tables that have no primary key.
|
|
11
|
+
*/
|
|
12
|
+
private static guessPrimaryKeyInPlace;
|
|
7
13
|
private static hasTimestamps;
|
|
8
14
|
private static isParanoid;
|
|
9
15
|
}
|
|
@@ -11,22 +11,12 @@ class ModelBuilder {
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
static defineModel(sequelize, logger, table) {
|
|
14
|
-
const modelAttrs = {};
|
|
15
14
|
const hasTimestamps = this.hasTimestamps(table);
|
|
16
15
|
const isParanoid = this.isParanoid(table);
|
|
17
16
|
const dialect = sequelize.getDialect();
|
|
18
|
-
|
|
19
|
-
const isExplicit = !(hasTimestamps && (column.name === 'updatedAt' || column.name === 'createdAt')) &&
|
|
20
|
-
!(isParanoid && column.name === 'deletedAt');
|
|
21
|
-
// Clone object, because sequelize modifies it.
|
|
22
|
-
if (isExplicit)
|
|
23
|
-
modelAttrs[column.name] = {
|
|
24
|
-
...column,
|
|
25
|
-
type: sequelize_type_1.default.makeType(dialect, column.type, table.name, column.name),
|
|
26
|
-
};
|
|
27
|
-
}
|
|
17
|
+
const attributes = this.buildModelAttributes(logger, table, hasTimestamps, isParanoid, dialect);
|
|
28
18
|
try {
|
|
29
|
-
const model = sequelize.define(table.name,
|
|
19
|
+
const model = sequelize.define(table.name, attributes, {
|
|
30
20
|
tableName: table.name,
|
|
31
21
|
timestamps: hasTimestamps,
|
|
32
22
|
paranoid: isParanoid,
|
|
@@ -34,14 +24,59 @@ class ModelBuilder {
|
|
|
34
24
|
// @see https://sequelize.org/docs/v6/other-topics/legacy/#primary-keys
|
|
35
25
|
// Tell sequelize NOT to invent primary keys when we don't provide them.
|
|
36
26
|
// (Note that this does not seem to work)
|
|
37
|
-
if (!
|
|
27
|
+
if (!attributes.id && model.getAttributes().id) {
|
|
38
28
|
model.removeAttribute('id');
|
|
39
29
|
}
|
|
40
30
|
}
|
|
41
31
|
catch (e) {
|
|
32
|
+
// In practice, now that we added the primary key guessing, this should not happen anymore.
|
|
33
|
+
// But we keep it here just in case.
|
|
42
34
|
logger?.('Warn', `Skipping table "${table.name}" because of error: ${e.message}`);
|
|
43
35
|
}
|
|
44
36
|
}
|
|
37
|
+
static buildModelAttributes(logger, table, hasTimestamps, isParanoid, dialect) {
|
|
38
|
+
const modelAttrs = {};
|
|
39
|
+
for (const column of table.columns) {
|
|
40
|
+
const isExplicit = !(hasTimestamps && (column.name === 'updatedAt' || column.name === 'createdAt')) &&
|
|
41
|
+
!(isParanoid && column.name === 'deletedAt');
|
|
42
|
+
// Clone object, because sequelize modifies it.
|
|
43
|
+
if (isExplicit)
|
|
44
|
+
modelAttrs[column.name] = {
|
|
45
|
+
...column,
|
|
46
|
+
type: sequelize_type_1.default.makeType(dialect, column.type, table.name, column.name),
|
|
47
|
+
unique: table.unique.some(u => u.length === 1 && u[0] === column.name),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// If there is no primary key, we try to guess one.
|
|
51
|
+
if (!table.columns.some(c => c.primaryKey)) {
|
|
52
|
+
this.guessPrimaryKeyInPlace(logger, table, modelAttrs);
|
|
53
|
+
}
|
|
54
|
+
return modelAttrs;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* When the primary key is missing, we attempt to find a column that may act as such.
|
|
58
|
+
* This enables us to support tables that have no primary key.
|
|
59
|
+
*/
|
|
60
|
+
static guessPrimaryKeyInPlace(logger, table, attributes) {
|
|
61
|
+
// Try to find a column named "id".
|
|
62
|
+
let primaryKeys = table.columns.some(c => c.name === 'id') ? ['id'] : [];
|
|
63
|
+
// If there is no id column, look at unique indexes, and use the shortest one.
|
|
64
|
+
// (hopefully only one column, but this can also be a composite key for many-to-many tables)
|
|
65
|
+
if (!primaryKeys.length && table.unique.length) {
|
|
66
|
+
[primaryKeys] = [...table.unique].sort((a, b) => a.length - b.length);
|
|
67
|
+
}
|
|
68
|
+
// If all the columns have contraints (e.g. foreign keys), use all of them as a composite key.
|
|
69
|
+
if (!primaryKeys.length &&
|
|
70
|
+
table.columns.length === 2 &&
|
|
71
|
+
table.columns.every(c => c.constraints.length)) {
|
|
72
|
+
primaryKeys = table.columns.map(c => c.name);
|
|
73
|
+
}
|
|
74
|
+
for (const column of primaryKeys)
|
|
75
|
+
attributes[column].primaryKey = true;
|
|
76
|
+
if (primaryKeys.length) {
|
|
77
|
+
logger?.('Warn', `Table "${table.name}" has no primary key. Using "${primaryKeys.join(', ')}".`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
45
80
|
static hasTimestamps(table) {
|
|
46
81
|
return (!!table.columns.find(c => c.name === 'createdAt') &&
|
|
47
82
|
!!table.columns.find(c => c.name === 'updatedAt'));
|
|
@@ -51,4 +86,4 @@ class ModelBuilder {
|
|
|
51
86
|
}
|
|
52
87
|
}
|
|
53
88
|
exports.default = ModelBuilder;
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JtLWJ1aWxkZXIvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSw4RUFBNEQ7QUFHNUQsTUFBcUIsWUFBWTtJQUMvQixNQUFNLENBQUMsWUFBWSxDQUFDLFNBQW9CLEVBQUUsTUFBYyxFQUFFLE1BQWU7UUFDdkUsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBb0IsRUFBRSxNQUFjLEVBQUUsS0FBWTtRQUMzRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFaEcsSUFBSTtZQUNGLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ3JELFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDckIsVUFBVSxFQUFFLGFBQWE7Z0JBQ3pCLFFBQVEsRUFBRSxVQUFVO2FBQ3JCLENBQUMsQ0FBQztZQUVILHVFQUF1RTtZQUN2RSx3RUFBd0U7WUFDeEUseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0I7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsMkZBQTJGO1lBQzNGLG9DQUFvQztZQUNwQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEtBQUssQ0FBQyxJQUFJLHVCQUF1QixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUNuRjtJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsb0JBQW9CLENBQ2pDLE1BQWMsRUFDZCxLQUFZLEVBQ1osYUFBc0IsRUFDdEIsVUFBbUIsRUFDbkIsT0FBZTtRQUVmLE1BQU0sVUFBVSxHQUFvQixFQUFFLENBQUM7UUFFdkMsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ2xDLE1BQU0sVUFBVSxHQUNkLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO2dCQUNoRixDQUFDLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUM7WUFFL0MsK0NBQStDO1lBQy9DLElBQUksVUFBVTtnQkFDWixVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHO29CQUN4QixHQUFHLE1BQU07b0JBQ1QsSUFBSSxFQUFFLHdCQUFvQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ2xGLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDO2lCQUN2RSxDQUFDO1NBQ0w7UUFFRCxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFjLEVBQUUsS0FBWSxFQUFFLFVBQTJCO1FBQzdGLG1DQUFtQztRQUNuQyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUV6RSw4RUFBOEU7UUFDOUUsNEZBQTRGO1FBQzVGLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQzlDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2RTtRQUVELDhGQUE4RjtRQUM5RixJQUNFLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDbkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUMxQixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQzlDO1lBQ0EsV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlDO1FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxXQUFXO1lBQzdCLFVBQVUsQ0FBQyxNQUFNLENBQWlDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUV4RSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDdEIsTUFBTSxFQUFFLENBQ04sTUFBTSxFQUNOLFVBQVUsS0FBSyxDQUFDLElBQUksZ0NBQWdDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDL0UsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBWTtRQUN2QyxPQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUM7WUFDakQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQVk7UUFDcEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRjtBQTVHRCwrQkE0R0MifQ==
|