@forestadmin/datasource-sql 1.2.0 → 1.2.2
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/index.js +2 -2
- package/dist/introspection/errors.d.ts +25 -0
- package/dist/introspection/errors.js +53 -0
- package/dist/introspection/helpers/sql-type-converter.d.ts +12 -6
- package/dist/introspection/helpers/sql-type-converter.js +85 -51
- package/dist/introspection/introspector.js +28 -3
- package/dist/introspection/types.d.ts +12 -1
- package/dist/orm-builder/helpers/sequelize-type.d.ts +13 -1
- package/dist/orm-builder/helpers/sequelize-type.js +47 -5
- package/dist/orm-builder/model.js +3 -2
- package/package.json +2 -2
- package/dist/introspection/helpers/array-type-getter.d.ts +0 -12
- package/dist/introspection/helpers/array-type-getter.js +0 -61
package/dist/index.js
CHANGED
|
@@ -30,7 +30,7 @@ function createEmptySequelize(uriOrOptions, logger) {
|
|
|
30
30
|
async function introspect(uriOrOptions, logger) {
|
|
31
31
|
const sequelize = createEmptySequelize(uriOrOptions, logger);
|
|
32
32
|
const tables = await introspector_1.default.introspect(sequelize, logger);
|
|
33
|
-
sequelize.close();
|
|
33
|
+
await sequelize.close();
|
|
34
34
|
return tables;
|
|
35
35
|
}
|
|
36
36
|
exports.introspect = introspect;
|
|
@@ -49,4 +49,4 @@ function createSqlDataSource(uriOrOptions, options) {
|
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
exports.createSqlDataSource = createSqlDataSource;
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBSUEsNEVBQXdFO0FBQ3hFLHlDQUFzQztBQUV0QyxnRkFBd0Q7QUFDeEQsZ0VBQStDO0FBQy9DLHdFQUFzRDtBQUV0RCxTQUFTLG9CQUFvQixDQUFDLFlBQStCLEVBQUUsTUFBYztJQUMzRSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQ2IsbUJBQW1CLFlBQVksNkNBQTZDO1lBQzFFLHNDQUFzQyxDQUN6QyxDQUFDO0lBRUosTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RixJQUFJLFNBQW9CLENBQUM7SUFFekIsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7UUFDcEMsU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0tBQ3REO1NBQU0sSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFO1FBQzNCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxZQUFZLENBQUM7UUFDekMsU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0tBQ3pEO1NBQU07UUFDTCxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEVBQUUsR0FBRyxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztLQUN6RDtJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFTSxLQUFLLFVBQVUsVUFBVSxDQUM5QixZQUErQixFQUMvQixNQUFlO0lBRWYsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRXhCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFURCxnQ0FTQztBQUVNLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsWUFBK0IsRUFDL0IsTUFBYyxFQUNkLGFBQXVCO0lBRXZCLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3RCxNQUFNLE1BQU0sR0FBRyxhQUFhLElBQUksQ0FBQyxNQUFNLHNCQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRW5GLGVBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRCxtQkFBZSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFaRCx3REFZQztBQUVELFNBQWdCLG1CQUFtQixDQUNqQyxZQUErQixFQUMvQixPQUFvQztJQUVwQyxPQUFPLEtBQUssRUFBRSxNQUFjLEVBQUUsRUFBRTtRQUM5QixNQUFNLFNBQVMsR0FBRyxNQUFNLHNCQUFzQixDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRTdGLE9BQU8sSUFBSSwwQ0FBbUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVRELGtEQVNDIn0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare class ConnectionError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class HostNotFoundError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class ConnectionRefusedError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class HostNotReachableError extends Error {
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class AccessDeniedError extends Error {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
export declare class InvalidConnectionError extends Error {
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
19
|
+
export declare class ConnectionAcquireTimeoutError extends Error {
|
|
20
|
+
constructor(message: string);
|
|
21
|
+
}
|
|
22
|
+
export declare class ConnectionTimedOutError extends Error {
|
|
23
|
+
constructor(message: string);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectionTimedOutError = exports.ConnectionAcquireTimeoutError = exports.InvalidConnectionError = exports.AccessDeniedError = exports.HostNotReachableError = exports.ConnectionRefusedError = exports.HostNotFoundError = exports.ConnectionError = void 0;
|
|
4
|
+
// eslint-disable-next-line max-classes-per-file
|
|
5
|
+
class ConnectionError extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(`Connection error: ${message}`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.ConnectionError = ConnectionError;
|
|
11
|
+
class HostNotFoundError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(`Host not found error: ${message}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.HostNotFoundError = HostNotFoundError;
|
|
17
|
+
class ConnectionRefusedError extends Error {
|
|
18
|
+
constructor(message) {
|
|
19
|
+
super(`Connection refused error: ${message}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.ConnectionRefusedError = ConnectionRefusedError;
|
|
23
|
+
class HostNotReachableError extends Error {
|
|
24
|
+
constructor(message) {
|
|
25
|
+
super(`Host not reachable: ${message}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.HostNotReachableError = HostNotReachableError;
|
|
29
|
+
class AccessDeniedError extends Error {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(`Access denied: ${message}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.AccessDeniedError = AccessDeniedError;
|
|
35
|
+
class InvalidConnectionError extends Error {
|
|
36
|
+
constructor(message) {
|
|
37
|
+
super(`Invalid connection: ${message}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.InvalidConnectionError = InvalidConnectionError;
|
|
41
|
+
class ConnectionAcquireTimeoutError extends Error {
|
|
42
|
+
constructor(message) {
|
|
43
|
+
super(`Connection acquire timeout: ${message}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.ConnectionAcquireTimeoutError = ConnectionAcquireTimeoutError;
|
|
47
|
+
class ConnectionTimedOutError extends Error {
|
|
48
|
+
constructor(message) {
|
|
49
|
+
super(`Connection timed out: ${message}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.ConnectionTimedOutError = ConnectionTimedOutError;
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUFnRDtBQUNoRCxNQUFhLGVBQWdCLFNBQVEsS0FBSztJQUN4QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLHFCQUFxQixPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQUpELDBDQUlDO0FBQ0QsTUFBYSxpQkFBa0IsU0FBUSxLQUFLO0lBQzFDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMseUJBQXlCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBSkQsOENBSUM7QUFDRCxNQUFhLHNCQUF1QixTQUFRLEtBQUs7SUFDL0MsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyw2QkFBNkIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFKRCx3REFJQztBQUNELE1BQWEscUJBQXNCLFNBQVEsS0FBSztJQUM5QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLHVCQUF1QixPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQUpELHNEQUlDO0FBRUQsTUFBYSxpQkFBa0IsU0FBUSxLQUFLO0lBQzFDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsa0JBQWtCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBSkQsOENBSUM7QUFDRCxNQUFhLHNCQUF1QixTQUFRLEtBQUs7SUFDL0MsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyx1QkFBdUIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFKRCx3REFJQztBQUVELE1BQWEsNkJBQThCLFNBQVEsS0FBSztJQUN0RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLCtCQUErQixPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQUpELHNFQUlDO0FBRUQsTUFBYSx1QkFBd0IsU0FBUSxLQUFLO0lBQ2hELFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMseUJBQXlCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBSkQsMERBSUMifQ==
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { ColumnDescription, Sequelize } from 'sequelize';
|
|
2
2
|
import { ColumnType } from '../types';
|
|
3
3
|
export default class SqlTypeConverter {
|
|
4
|
-
private readonly enumRegex;
|
|
5
|
-
private readonly
|
|
4
|
+
private static readonly enumRegex;
|
|
5
|
+
private readonly sequelize;
|
|
6
6
|
constructor(sequelize: Sequelize);
|
|
7
|
+
convert(tableName: string, columnName: string, columnInfo: ColumnDescription): Promise<ColumnType>;
|
|
8
|
+
/** Get the type of an enum from sequelize column description */
|
|
9
|
+
private getEnumType;
|
|
10
|
+
/**
|
|
11
|
+
* Get the type of an array from sequelize column description
|
|
12
|
+
* Note that we don't need to write multiple SQL queries, because arrays are only supported by
|
|
13
|
+
* Postgres
|
|
14
|
+
*/
|
|
15
|
+
private getArrayType;
|
|
16
|
+
private getScalarType;
|
|
7
17
|
private typeMatch;
|
|
8
18
|
private typeStartsWith;
|
|
9
19
|
private typeContains;
|
|
10
|
-
private convertToEnum;
|
|
11
|
-
private getTypeForUserDefined;
|
|
12
|
-
private getTypeForArray;
|
|
13
|
-
convert(tableName: string, columnName: string, columnInfo: ColumnDescription): Promise<ColumnType>;
|
|
14
20
|
}
|
|
15
21
|
//# sourceMappingURL=sql-type-converter.d.ts.map
|
|
@@ -1,50 +1,80 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
3
|
+
const sequelize_1 = require("sequelize");
|
|
7
4
|
class SqlTypeConverter {
|
|
8
5
|
constructor(sequelize) {
|
|
9
|
-
this.
|
|
10
|
-
this.arrayTypeGetter = new array_type_getter_1.default(sequelize);
|
|
6
|
+
this.sequelize = sequelize;
|
|
11
7
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
8
|
+
async convert(tableName, columnName, columnInfo) {
|
|
9
|
+
switch (columnInfo.type) {
|
|
10
|
+
case 'ARRAY':
|
|
11
|
+
return this.getArrayType(tableName, columnName);
|
|
12
|
+
case 'USER-DEFINED':
|
|
13
|
+
case this.typeMatch(columnInfo.type, SqlTypeConverter.enumRegex):
|
|
14
|
+
return this.getEnumType(columnInfo);
|
|
15
|
+
default:
|
|
16
|
+
return { type: 'scalar', subType: this.getScalarType(columnInfo.type) };
|
|
17
|
+
}
|
|
20
18
|
}
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
/** Get the type of an enum from sequelize column description */
|
|
20
|
+
getEnumType(columnInfo) {
|
|
21
|
+
if (columnInfo.type === 'USER-DEFINED') {
|
|
22
|
+
// Postgres enum
|
|
23
|
+
return columnInfo?.special?.length > 0
|
|
24
|
+
? { type: 'enum', values: columnInfo.special }
|
|
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];
|
|
23
30
|
return { type: 'enum', values: enumOptions.replace(/'/g, '').split(',') };
|
|
24
31
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Get the type of an array from sequelize column description
|
|
34
|
+
* Note that we don't need to write multiple SQL queries, because arrays are only supported by
|
|
35
|
+
* Postgres
|
|
36
|
+
*/
|
|
37
|
+
async getArrayType(tableName, columnName) {
|
|
38
|
+
// Get the type of the elements in the array from the database
|
|
39
|
+
const [{ udtName, dataType, charLength, rawEnumValues }] = await this.sequelize.query(`SELECT
|
|
40
|
+
e.udt_name AS "udtName",
|
|
41
|
+
e.data_type AS "dataType",
|
|
42
|
+
e.character_maximum_length as "charLength",
|
|
43
|
+
(
|
|
44
|
+
SELECT array_agg(en.enumlabel)
|
|
45
|
+
FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum en ON t.oid = en.enumtypid
|
|
46
|
+
WHERE t.typname = e.udt_name
|
|
47
|
+
) AS "rawEnumValues"
|
|
48
|
+
FROM INFORMATION_SCHEMA.columns c
|
|
49
|
+
LEFT JOIN INFORMATION_SCHEMA.element_types e ON (
|
|
50
|
+
c.table_catalog = e.object_catalog AND
|
|
51
|
+
c.table_schema = e.object_schema AND
|
|
52
|
+
c.table_name = e.object_name AND
|
|
53
|
+
'TABLE' = e.object_type AND
|
|
54
|
+
c.dtd_identifier = e.collection_type_identifier
|
|
55
|
+
)
|
|
56
|
+
WHERE table_name = :tableName AND c.column_name = :columnName;`.replace(/\s+/g, ' '), { replacements: { tableName, columnName }, type: sequelize_1.QueryTypes.SELECT });
|
|
57
|
+
let subType;
|
|
58
|
+
if (rawEnumValues !== null) {
|
|
59
|
+
const queryInterface = this.sequelize.getQueryInterface();
|
|
60
|
+
const queryGen = queryInterface.queryGenerator;
|
|
61
|
+
const enumValues = queryGen.fromArray(rawEnumValues);
|
|
62
|
+
subType = { type: 'enum', name: udtName, values: enumValues };
|
|
29
63
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const columnInfo = { type, special };
|
|
36
|
-
const arrayType = await this.convert(tableName, columnName, columnInfo);
|
|
37
|
-
return { type: 'array', subType: arrayType };
|
|
64
|
+
else {
|
|
65
|
+
const dataTypeWithLength = charLength ? `${dataType}(${charLength})` : dataType;
|
|
66
|
+
subType = { type: 'scalar', subType: this.getScalarType(dataTypeWithLength) };
|
|
67
|
+
}
|
|
68
|
+
return { type: 'array', subType };
|
|
38
69
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
switch (type) {
|
|
70
|
+
getScalarType(type) {
|
|
71
|
+
switch (type.toUpperCase()) {
|
|
42
72
|
case 'JSON':
|
|
43
|
-
return
|
|
73
|
+
return 'JSON';
|
|
44
74
|
case 'TINYINT(1)': // MYSQL bool
|
|
45
75
|
case 'BIT': // NOTICE: MSSQL type.
|
|
46
76
|
case 'BOOLEAN':
|
|
47
|
-
return
|
|
77
|
+
return 'BOOLEAN';
|
|
48
78
|
case 'CHARACTER VARYING':
|
|
49
79
|
case 'TEXT':
|
|
50
80
|
case 'NTEXT': // MSSQL type
|
|
@@ -52,16 +82,12 @@ class SqlTypeConverter {
|
|
|
52
82
|
case this.typeContains(type, 'VARCHAR'):
|
|
53
83
|
case this.typeContains(type, 'CHAR'):
|
|
54
84
|
case 'NVARCHAR': // NOTICE: MSSQL type.
|
|
55
|
-
return
|
|
56
|
-
case 'USER-DEFINED':
|
|
57
|
-
return this.getTypeForUserDefined(columnInfo);
|
|
58
|
-
case this.typeMatch(type, this.enumRegex):
|
|
59
|
-
return this.convertToEnum(type);
|
|
85
|
+
return 'STRING';
|
|
60
86
|
case 'UNIQUEIDENTIFIER':
|
|
61
87
|
case 'UUID':
|
|
62
|
-
return
|
|
88
|
+
return 'UUID';
|
|
63
89
|
case 'JSONB':
|
|
64
|
-
return
|
|
90
|
+
return 'JSONB';
|
|
65
91
|
case 'INTEGER':
|
|
66
92
|
case 'SERIAL':
|
|
67
93
|
case 'BIGSERIAL':
|
|
@@ -69,33 +95,41 @@ class SqlTypeConverter {
|
|
|
69
95
|
case this.typeStartsWith(type, 'SMALLINT'):
|
|
70
96
|
case this.typeStartsWith(type, 'TINYINT'):
|
|
71
97
|
case this.typeStartsWith(type, 'MEDIUMINT'):
|
|
72
|
-
return
|
|
98
|
+
return 'NUMBER';
|
|
73
99
|
case this.typeStartsWith(type, 'BIGINT'):
|
|
74
|
-
return
|
|
100
|
+
return 'BIGINT';
|
|
75
101
|
case this.typeContains(type, 'FLOAT'):
|
|
76
|
-
return
|
|
102
|
+
return 'FLOAT';
|
|
77
103
|
case 'NUMERIC':
|
|
78
104
|
case 'REAL':
|
|
79
105
|
case 'DOUBLE':
|
|
80
106
|
case 'DOUBLE PRECISION':
|
|
81
107
|
case this.typeContains(type, 'DECIMAL'):
|
|
82
|
-
return
|
|
108
|
+
return 'DOUBLE';
|
|
83
109
|
case 'DATE':
|
|
84
|
-
return
|
|
110
|
+
return 'DATEONLY';
|
|
85
111
|
case this.typeStartsWith(type, 'DATETIME'):
|
|
86
112
|
case this.typeStartsWith(type, 'TIMESTAMP'):
|
|
87
|
-
return
|
|
113
|
+
return 'DATE';
|
|
88
114
|
case 'TIME':
|
|
89
115
|
case 'TIME WITHOUT TIME ZONE':
|
|
90
|
-
return
|
|
91
|
-
case 'ARRAY':
|
|
92
|
-
return this.getTypeForArray(tableName, columnName);
|
|
116
|
+
return 'TIME';
|
|
93
117
|
case 'INET':
|
|
94
|
-
return
|
|
118
|
+
return 'INET';
|
|
95
119
|
default:
|
|
96
120
|
throw new Error(`Unsupported type: ${type}`);
|
|
97
121
|
}
|
|
98
122
|
}
|
|
123
|
+
typeMatch(type, value) {
|
|
124
|
+
return (type.match(value) || {}).input;
|
|
125
|
+
}
|
|
126
|
+
typeStartsWith(type, value) {
|
|
127
|
+
return this.typeMatch(type, new RegExp(`^${value}.*`, 'i'));
|
|
128
|
+
}
|
|
129
|
+
typeContains(type, value) {
|
|
130
|
+
return this.typeMatch(type, new RegExp(`${value}.*`, 'i'));
|
|
131
|
+
}
|
|
99
132
|
}
|
|
100
133
|
exports.default = SqlTypeConverter;
|
|
101
|
-
|
|
134
|
+
SqlTypeConverter.enumRegex = /ENUM\((.*)\)/i;
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLXR5cGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaGVscGVycy9zcWwtdHlwZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBcUU7QUFJckUsTUFBcUIsZ0JBQWdCO0lBSW5DLFlBQVksU0FBb0I7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsU0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsVUFBNkI7UUFFN0IsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRWxELEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztnQkFDOUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXRDO2dCQUNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUN4RCxXQUFXLENBQUMsVUFBNkI7UUFDL0MsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUN0QyxnQkFBZ0I7WUFDaEIsT0FBTyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUM5QyxDQUFDLENBQUMsMERBQTBEO29C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
|
|
@@ -3,12 +3,37 @@ 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 errors_1 = require("./errors");
|
|
6
7
|
const default_value_parser_1 = __importDefault(require("./helpers/default-value-parser"));
|
|
7
8
|
const sql_type_converter_1 = __importDefault(require("./helpers/sql-type-converter"));
|
|
8
9
|
class Introspector {
|
|
9
10
|
static async introspect(sequelize, logger) {
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
try {
|
|
12
|
+
const tableNames = await this.getTableNames(sequelize);
|
|
13
|
+
return await Promise.all(tableNames.map(name => this.getTable(sequelize, logger, name)));
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
switch (e.name) {
|
|
17
|
+
case 'SequelizeConnectionError':
|
|
18
|
+
throw new errors_1.ConnectionError(e.message);
|
|
19
|
+
case 'SequelizeHostNotFoundError':
|
|
20
|
+
throw new errors_1.HostNotFoundError(e.message);
|
|
21
|
+
case 'SequelizeConnectionRefusedError':
|
|
22
|
+
throw new errors_1.ConnectionRefusedError(e.message);
|
|
23
|
+
case 'SequelizeHostNotReachableError':
|
|
24
|
+
throw new errors_1.HostNotReachableError(e.message);
|
|
25
|
+
case 'SequelizeAccessDeniedError':
|
|
26
|
+
throw new errors_1.AccessDeniedError(e.message);
|
|
27
|
+
case 'SequelizeConnectionAcquireTimeoutError':
|
|
28
|
+
throw new errors_1.ConnectionAcquireTimeoutError(e.message);
|
|
29
|
+
case 'SequelizeConnectionTimedOutError':
|
|
30
|
+
throw new errors_1.ConnectionTimedOutError(e.message);
|
|
31
|
+
case 'SequelizeInvalidConnectionError':
|
|
32
|
+
throw new errors_1.InvalidConnectionError(e.message);
|
|
33
|
+
default:
|
|
34
|
+
throw new errors_1.ConnectionError(e.message);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
12
37
|
}
|
|
13
38
|
/** Get names of all tables in the public schema of the db */
|
|
14
39
|
static async getTableNames(sequelize) {
|
|
@@ -71,4 +96,4 @@ class Introspector {
|
|
|
71
96
|
}
|
|
72
97
|
}
|
|
73
98
|
exports.default = Introspector;
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaW50cm9zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0EscUNBU2tCO0FBQ2xCLDBGQUFnRTtBQUNoRSxzRkFBNEQ7QUFHNUQsTUFBcUIsWUFBWTtJQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFvQixFQUFFLE1BQWU7UUFDM0QsSUFBSTtZQUNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV2RCxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsUUFBUyxDQUE4QixDQUFDLElBQUksRUFBRTtnQkFDNUMsS0FBSywwQkFBMEI7b0JBQzdCLE1BQU0sSUFBSSx3QkFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkMsS0FBSyw0QkFBNEI7b0JBQy9CLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLEtBQUssaUNBQWlDO29CQUNwQyxNQUFNLElBQUksK0JBQXNCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLGdDQUFnQztvQkFDbkMsTUFBTSxJQUFJLDhCQUFxQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0MsS0FBSyw0QkFBNEI7b0JBQy9CLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLEtBQUssd0NBQXdDO29CQUMz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
|
|
@@ -3,14 +3,25 @@ export type SequelizeIndex = Awaited<ReturnType<QueryInterface['showIndex']>>[nu
|
|
|
3
3
|
export type SequelizeColumn = Awaited<ReturnType<QueryInterface['describeTable']>>[number];
|
|
4
4
|
export type SequelizeColumnType = AbstractDataType | AbstractDataTypeConstructor;
|
|
5
5
|
export type SequelizeReference = Awaited<ReturnType<QueryInterface['getForeignKeyReferencesForTable']>>[number];
|
|
6
|
+
export type ScalarSubType = 'BIGINT' | 'BOOLEAN' | 'DATE' | 'DATEONLY' | 'DOUBLE' | 'FLOAT' | 'INET' | 'JSON' | 'JSONB' | 'NUMBER' | 'STRING' | 'TIME' | 'UUID';
|
|
6
7
|
export type ColumnType = {
|
|
7
8
|
type: 'scalar';
|
|
8
|
-
subType:
|
|
9
|
+
subType: ScalarSubType;
|
|
9
10
|
} | {
|
|
10
11
|
type: 'array';
|
|
11
12
|
subType: ColumnType;
|
|
12
13
|
} | {
|
|
13
14
|
type: 'enum';
|
|
15
|
+
/**
|
|
16
|
+
* When using postgres, name of the type of this enum (e.g. "enum_users_role")
|
|
17
|
+
*
|
|
18
|
+
* This is needed when the enum is used in an array, because sequelize needs to cast when
|
|
19
|
+
* inserting into that column.
|
|
20
|
+
* As this is not needed for enums which are not used in arrays, and requires extra
|
|
21
|
+
* introspection queries, it is filled only when needed.
|
|
22
|
+
*/
|
|
23
|
+
name?: string;
|
|
24
|
+
/** list of values that the enum can take */
|
|
14
25
|
values: string[];
|
|
15
26
|
};
|
|
16
27
|
export type Table = {
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { ColumnType, SequelizeColumnType } from '../../introspection/types';
|
|
2
2
|
export default class SequelizeTypeFactory {
|
|
3
|
-
static
|
|
3
|
+
static makeType(dialect: string, type: ColumnType, table: string, columnName: string): SequelizeColumnType;
|
|
4
|
+
/**
|
|
5
|
+
* This workaround is needed because when inserting records in a table with an Array<Enum> column,
|
|
6
|
+
* sequelize will try to cast the value to the enum type.
|
|
7
|
+
*
|
|
8
|
+
* This will fail if the database that sequelize is connected to was not initially created by
|
|
9
|
+
* sequelize, because the enum type is unlikely to have the name that sequelize expects.
|
|
10
|
+
*
|
|
11
|
+
* @see https://community.forestadmin.com/t/postgresql-enum-type-does-not-exist-error-wrong-enum-type-name/5931
|
|
12
|
+
* @see https://github.com/sequelize/sequelize/blob/v6.28.0/src/dialects/postgres/data-types.js#L491
|
|
13
|
+
* @see https://github.com/sequelize/sequelize/blob/v6.28.0/src/utils.js#L555
|
|
14
|
+
*/
|
|
15
|
+
private static makeCustomEnumType;
|
|
4
16
|
}
|
|
5
17
|
//# sourceMappingURL=sequelize-type.d.ts.map
|
|
@@ -1,21 +1,63 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable max-len */
|
|
4
|
+
/* eslint-disable max-classes-per-file */
|
|
3
5
|
const sequelize_1 = require("sequelize");
|
|
4
6
|
class SequelizeTypeFactory {
|
|
5
|
-
static
|
|
7
|
+
static makeType(dialect, type, table, columnName) {
|
|
6
8
|
switch (type.type) {
|
|
7
9
|
case 'scalar':
|
|
8
10
|
if (sequelize_1.DataTypes[type.subType])
|
|
9
11
|
return sequelize_1.DataTypes[type.subType];
|
|
10
12
|
throw new Error(`Unexpected type: ${type.subType}`);
|
|
11
13
|
case 'enum':
|
|
12
|
-
|
|
14
|
+
// Use a custom type only if the name is not the default one.
|
|
15
|
+
// This should prevent side-effects on most cases if the custom type fails to mimic the
|
|
16
|
+
// default one and cause issues, while still allowing to use custom types when required.
|
|
17
|
+
return dialect === 'postgres' && type.name && type.name !== `enum_${table}_${columnName}`
|
|
18
|
+
? this.makeCustomEnumType(type.name, type.values)
|
|
19
|
+
: sequelize_1.DataTypes.ENUM(...type.values);
|
|
13
20
|
case 'array':
|
|
14
|
-
return sequelize_1.DataTypes.ARRAY(this.
|
|
21
|
+
return sequelize_1.DataTypes.ARRAY(this.makeType(dialect, type.subType, table, columnName));
|
|
15
22
|
default:
|
|
16
|
-
throw new Error();
|
|
23
|
+
throw new Error('Invalid type');
|
|
17
24
|
}
|
|
18
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* This workaround is needed because when inserting records in a table with an Array<Enum> column,
|
|
28
|
+
* sequelize will try to cast the value to the enum type.
|
|
29
|
+
*
|
|
30
|
+
* This will fail if the database that sequelize is connected to was not initially created by
|
|
31
|
+
* sequelize, because the enum type is unlikely to have the name that sequelize expects.
|
|
32
|
+
*
|
|
33
|
+
* @see https://community.forestadmin.com/t/postgresql-enum-type-does-not-exist-error-wrong-enum-type-name/5931
|
|
34
|
+
* @see https://github.com/sequelize/sequelize/blob/v6.28.0/src/dialects/postgres/data-types.js#L491
|
|
35
|
+
* @see https://github.com/sequelize/sequelize/blob/v6.28.0/src/utils.js#L555
|
|
36
|
+
*/
|
|
37
|
+
static makeCustomEnumType(name, values) {
|
|
38
|
+
var _a;
|
|
39
|
+
const Type = (_a = class extends sequelize_1.DataTypes.ABSTRACT {
|
|
40
|
+
constructor() {
|
|
41
|
+
super();
|
|
42
|
+
this.isDataSourceSqlEnum = true;
|
|
43
|
+
this.key = name;
|
|
44
|
+
// Steal the validate method from the ENUM type
|
|
45
|
+
this.validate = sequelize_1.DataTypes.ENUM.prototype.validate;
|
|
46
|
+
this.values = values;
|
|
47
|
+
this.options = { values };
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
// Markers to tell @forestadmin/datasource-sequelize to consider this type as an enum
|
|
51
|
+
// when transforming sequelize models to forest collections.
|
|
52
|
+
// Otherwise, we would get the "Skipping column" error
|
|
53
|
+
_a.isDataSourceSqlEnum = true,
|
|
54
|
+
// Setting this tells sequelize the name of the type in the database.
|
|
55
|
+
// This is used, most notably, when casting values (which happens when the enum is used in
|
|
56
|
+
// arrays)
|
|
57
|
+
_a.key = name,
|
|
58
|
+
_a);
|
|
59
|
+
return new Type();
|
|
60
|
+
}
|
|
19
61
|
}
|
|
20
62
|
exports.default = SequelizeTypeFactory;
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVsaXplLXR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3JtLWJ1aWxkZXIvaGVscGVycy9zZXF1ZWxpemUtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRCQUE0QjtBQUM1Qix5Q0FBeUM7QUFDekMseUNBQXNDO0FBSXRDLE1BQXFCLG9CQUFvQjtJQUN2QyxNQUFNLENBQUMsUUFBUSxDQUNiLE9BQWUsRUFDZixJQUFnQixFQUNoQixLQUFhLEVBQ2IsVUFBa0I7UUFFbEIsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssUUFBUTtnQkFDWCxJQUFJLHFCQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFBRSxPQUFPLHFCQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUV0RCxLQUFLLE1BQU07Z0JBQ1QsNkRBQTZEO2dCQUM3RCx1RkFBdUY7Z0JBQ3ZGLHdGQUF3RjtnQkFDeEYsT0FBTyxPQUFPLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEtBQUssSUFBSSxVQUFVLEVBQUU7b0JBQ3ZGLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUNqRCxDQUFDLENBQUMscUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFckMsS0FBSyxPQUFPO2dCQUNWLE9BQU8scUJBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUVsRjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBWSxFQUFFLE1BQWdCOztRQUM5RCxNQUFNLElBQUksU0FBRyxLQUFNLFNBQVEscUJBQVMsQ0FBQyxRQUFRO2dCQWtCM0M7b0JBQ0UsS0FBSyxFQUFFLENBQUM7b0JBZEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDO29CQU0zQixRQUFHLEdBQUcsSUFBSSxDQUFDO29CQWNwQiwrQ0FBK0M7b0JBQy9DLGFBQVEsR0FBRyxxQkFBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO29CQUwzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUM1QixDQUFDO2FBSUY7WUExQkMscUZBQXFGO1lBQ3JGLDREQUE0RDtZQUM1RCxzREFBc0Q7WUFDdEMsc0JBQW1CLEdBQUcsSUFBSztZQUczQyxxRUFBcUU7WUFDckUsMEZBQTBGO1lBQzFGLFVBQVU7WUFDTSxNQUFHLEdBQUcsSUFBSztlQWlCNUIsQ0FBQztRQUVGLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUF2RUQsdUNBdUVDIn0=
|
|
@@ -14,6 +14,7 @@ class ModelBuilder {
|
|
|
14
14
|
const modelAttrs = {};
|
|
15
15
|
const hasTimestamps = this.hasTimestamps(table);
|
|
16
16
|
const isParanoid = this.isParanoid(table);
|
|
17
|
+
const dialect = sequelize.getDialect();
|
|
17
18
|
for (const column of table.columns) {
|
|
18
19
|
const isExplicit = !(hasTimestamps && (column.name === 'updatedAt' || column.name === 'createdAt')) &&
|
|
19
20
|
!(isParanoid && column.name === 'deletedAt');
|
|
@@ -21,7 +22,7 @@ class ModelBuilder {
|
|
|
21
22
|
if (isExplicit)
|
|
22
23
|
modelAttrs[column.name] = {
|
|
23
24
|
...column,
|
|
24
|
-
type: sequelize_type_1.default.
|
|
25
|
+
type: sequelize_type_1.default.makeType(dialect, column.type, table.name, column.name),
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
28
|
try {
|
|
@@ -50,4 +51,4 @@ class ModelBuilder {
|
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
53
|
exports.default = ModelBuilder;
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JtLWJ1aWxkZXIvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSw4RUFBNEQ7QUFHNUQsTUFBcUIsWUFBWTtJQUMvQixNQUFNLENBQUMsWUFBWSxDQUFDLFNBQW9CLEVBQUUsTUFBYyxFQUFFLE1BQWU7UUFDdkUsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBb0IsRUFBRSxNQUFjLEVBQUUsS0FBWTtRQUMzRSxNQUFNLFVBQVUsR0FBb0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFdkMsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ2xDLE1BQU0sVUFBVSxHQUNkLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO2dCQUNoRixDQUFDLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUM7WUFFL0MsK0NBQStDO1lBQy9DLElBQUksVUFBVTtnQkFDWixVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHO29CQUN4QixHQUFHLE1BQU07b0JBQ1QsSUFBSSxFQUFFLHdCQUFvQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7aUJBQ25GLENBQUM7U0FDTDtRQUVELElBQUk7WUFDRixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNyRCxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ3JCLFVBQVUsRUFBRSxhQUFhO2dCQUN6QixRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDLENBQUM7WUFFSCx1RUFBdUU7WUFDdkUsd0VBQXdFO1lBQ3hFLHlDQUF5QztZQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM5QyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdCO1NBQ0Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsS0FBSyxDQUFDLElBQUksdUJBQXVCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ25GO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBWTtRQUN2QyxPQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUM7WUFDakQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQVk7UUFDcEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRjtBQXRERCwrQkFzREMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/datasource-sql",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"directory": "packages/datasource-sql"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@forestadmin/datasource-sequelize": "1.2.
|
|
15
|
+
"@forestadmin/datasource-sequelize": "1.2.11",
|
|
16
16
|
"@forestadmin/datasource-toolkit": "1.3.0",
|
|
17
17
|
"pluralize": "^8.0.0",
|
|
18
18
|
"sequelize": "^6.28.0"
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Sequelize } from 'sequelize';
|
|
2
|
-
export default class ArrayTypeGetter {
|
|
3
|
-
private readonly sequelize;
|
|
4
|
-
private readonly fromArray;
|
|
5
|
-
private readonly query;
|
|
6
|
-
constructor(sequelize: Sequelize);
|
|
7
|
-
getType(tableName: string, columnName: string): Promise<{
|
|
8
|
-
type: string;
|
|
9
|
-
special: string[];
|
|
10
|
-
}>;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=array-type-getter.d.ts.map
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const sequelize_1 = require("sequelize");
|
|
4
|
-
class ArrayTypeGetter {
|
|
5
|
-
constructor(sequelize) {
|
|
6
|
-
this.query = `
|
|
7
|
-
SELECT
|
|
8
|
-
(
|
|
9
|
-
CASE
|
|
10
|
-
WHEN e.udt_name = 'hstore' THEN e.udt_name
|
|
11
|
-
ELSE e.data_type
|
|
12
|
-
END
|
|
13
|
-
) || (
|
|
14
|
-
CASE
|
|
15
|
-
WHEN e.character_maximum_length IS NOT NULL THEN '(' || e.character_maximum_length || ')'
|
|
16
|
-
ELSE ''
|
|
17
|
-
END
|
|
18
|
-
) as "type",
|
|
19
|
-
(
|
|
20
|
-
SELECT
|
|
21
|
-
array_agg(en.enumlabel)
|
|
22
|
-
FROM
|
|
23
|
-
pg_catalog.pg_type t
|
|
24
|
-
JOIN pg_catalog.pg_enum en ON t.oid = en.enumtypid
|
|
25
|
-
WHERE
|
|
26
|
-
t.typname = e.udt_name
|
|
27
|
-
) AS "special"
|
|
28
|
-
FROM
|
|
29
|
-
INFORMATION_SCHEMA.columns c
|
|
30
|
-
LEFT JOIN INFORMATION_SCHEMA.element_types e ON (
|
|
31
|
-
(
|
|
32
|
-
c.table_catalog,
|
|
33
|
-
c.table_schema,
|
|
34
|
-
c.table_name,
|
|
35
|
-
'TABLE',
|
|
36
|
-
c.dtd_identifier
|
|
37
|
-
) = (
|
|
38
|
-
e.object_catalog,
|
|
39
|
-
e.object_schema,
|
|
40
|
-
e.object_name,
|
|
41
|
-
e.object_type,
|
|
42
|
-
e.collection_type_identifier
|
|
43
|
-
)
|
|
44
|
-
)
|
|
45
|
-
WHERE
|
|
46
|
-
table_name = :tableName
|
|
47
|
-
AND c.column_name = :columnName
|
|
48
|
-
;
|
|
49
|
-
`;
|
|
50
|
-
this.sequelize = sequelize;
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
-
this.fromArray = this.sequelize.getQueryInterface().queryGenerator.fromArray;
|
|
53
|
-
}
|
|
54
|
-
async getType(tableName, columnName) {
|
|
55
|
-
const replacements = { tableName, columnName };
|
|
56
|
-
const [{ type, special }] = await this.sequelize.query(this.query, { replacements, type: sequelize_1.QueryTypes.SELECT });
|
|
57
|
-
return { type: type.toUpperCase(), special: special ? this.fromArray(special) : [] };
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
exports.default = ArrayTypeGetter;
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdHlwZS1nZXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9oZWxwZXJzL2FycmF5LXR5cGUtZ2V0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQWtEO0FBRWxELE1BQXFCLGVBQWU7SUFnRGxDLFlBQVksU0FBb0I7UUE3Q2YsVUFBSyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkN4QixDQUFDO1FBR0EsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsOERBQThEO1FBQzlELElBQUksQ0FBQyxTQUFTLEdBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGNBQXNCLENBQUMsU0FBUyxDQUFDO0lBQ3hGLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUNYLFNBQWlCLEVBQ2pCLFVBQWtCO1FBRWxCLE1BQU0sWUFBWSxHQUFHLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQ3BELElBQUksQ0FBQyxLQUFLLEVBQ1YsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLHNCQUFVLENBQUMsTUFBTSxFQUFFLENBQzFDLENBQUM7UUFFRixPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUN2RixDQUFDO0NBQ0Y7QUFsRUQsa0NBa0VDIn0=
|