@forestadmin/datasource-sql 1.0.0-beta.9 → 1.0.1-alpha.1
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.d.ts +8 -2
- package/dist/index.js +36 -3
- package/dist/{utils → introspection/helpers}/array-type-getter.d.ts +0 -0
- package/dist/{utils → introspection/helpers}/array-type-getter.js +1 -1
- package/dist/introspection/helpers/default-value-parser.d.ts +12 -0
- package/dist/introspection/helpers/default-value-parser.js +78 -0
- package/dist/{utils → introspection/helpers}/sql-type-converter.d.ts +3 -2
- package/dist/introspection/helpers/sql-type-converter.js +101 -0
- package/dist/introspection/introspector.d.ts +12 -0
- package/dist/introspection/introspector.js +74 -0
- package/dist/introspection/types.d.ts +32 -0
- package/dist/introspection/types.js +3 -0
- package/dist/orm-builder/helpers/relation-extractor.d.ts +9 -0
- package/dist/orm-builder/helpers/relation-extractor.js +69 -0
- package/dist/orm-builder/helpers/relation-name-generator.d.ts +8 -0
- package/dist/orm-builder/helpers/relation-name-generator.js +61 -0
- package/dist/orm-builder/helpers/sequelize-type.d.ts +5 -0
- package/dist/orm-builder/helpers/sequelize-type.js +21 -0
- package/dist/orm-builder/model.d.ts +10 -0
- package/dist/orm-builder/model.js +53 -0
- package/dist/orm-builder/relations.d.ts +9 -0
- package/dist/orm-builder/relations.js +64 -0
- package/dist/orm-builder/types.d.ts +11 -0
- package/dist/orm-builder/types.js +3 -0
- package/package.json +6 -6
- package/CHANGELOG.md +0 -97
- package/dist/datasource.d.ts +0 -14
- package/dist/datasource.js +0 -79
- package/dist/utils/default-value-parser.d.ts +0 -11
- package/dist/utils/default-value-parser.js +0 -78
- package/dist/utils/sql-type-converter.js +0 -105
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import { DataSourceFactory, Logger } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { Sequelize } from 'sequelize';
|
|
3
|
+
import { Table } from './introspection/types';
|
|
4
|
+
export declare function introspect(connectionUri: string, logger?: Logger): Promise<Table[]>;
|
|
5
|
+
export declare function buildSequelizeInstance(connectionUri: string, logger: Logger, introspection?: Table[]): Promise<Sequelize>;
|
|
6
|
+
export declare function createSqlDataSource(connectionUri: string, options?: {
|
|
7
|
+
introspection: Table[];
|
|
8
|
+
}): DataSourceFactory;
|
|
3
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,39 @@ 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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
exports.createSqlDataSource = exports.buildSequelizeInstance = exports.introspect = void 0;
|
|
7
|
+
const sequelize_1 = require("sequelize");
|
|
8
|
+
const datasource_sequelize_1 = require("@forestadmin/datasource-sequelize");
|
|
9
|
+
const introspector_1 = __importDefault(require("./introspection/introspector"));
|
|
10
|
+
const model_1 = __importDefault(require("./orm-builder/model"));
|
|
11
|
+
const relations_1 = __importDefault(require("./orm-builder/relations"));
|
|
12
|
+
function createEmptySequelize(connectionUri, logger) {
|
|
13
|
+
if (!/.*:\/\//g.test(connectionUri))
|
|
14
|
+
throw new Error(`Connection Uri "${connectionUri}" provided to SQL data source is not valid.` +
|
|
15
|
+
' Should be <dialect>://<connection>.');
|
|
16
|
+
const logging = (sql) => logger?.('Debug', sql.substring(sql.indexOf(':') + 2));
|
|
17
|
+
return new sequelize_1.Sequelize(connectionUri, { logging });
|
|
18
|
+
}
|
|
19
|
+
async function introspect(connectionUri, logger) {
|
|
20
|
+
const sequelize = createEmptySequelize(connectionUri, logger);
|
|
21
|
+
const tables = await introspector_1.default.introspect(sequelize, logger);
|
|
22
|
+
sequelize.close();
|
|
23
|
+
return tables;
|
|
24
|
+
}
|
|
25
|
+
exports.introspect = introspect;
|
|
26
|
+
async function buildSequelizeInstance(connectionUri, logger, introspection) {
|
|
27
|
+
const sequelize = createEmptySequelize(connectionUri, logger);
|
|
28
|
+
const tables = introspection ?? (await introspector_1.default.introspect(sequelize, logger));
|
|
29
|
+
model_1.default.defineModels(sequelize, logger, tables);
|
|
30
|
+
relations_1.default.defineRelations(sequelize, logger, tables);
|
|
31
|
+
return sequelize;
|
|
32
|
+
}
|
|
33
|
+
exports.buildSequelizeInstance = buildSequelizeInstance;
|
|
34
|
+
function createSqlDataSource(connectionUri, options) {
|
|
35
|
+
return async (logger) => {
|
|
36
|
+
const sequelize = await buildSequelizeInstance(connectionUri, logger, options?.introspection);
|
|
37
|
+
return new datasource_sequelize_1.SequelizeDataSource(sequelize, logger);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
exports.createSqlDataSource = createSqlDataSource;
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EseUNBQXNDO0FBQ3RDLDRFQUF3RTtBQUd4RSxnRkFBd0Q7QUFDeEQsZ0VBQStDO0FBQy9DLHdFQUFzRDtBQUV0RCxTQUFTLG9CQUFvQixDQUFDLGFBQXFCLEVBQUUsTUFBYztJQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FDYixtQkFBbUIsYUFBYSw2Q0FBNkM7WUFDM0Usc0NBQXNDLENBQ3pDLENBQUM7SUFFSixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXhGLE9BQU8sSUFBSSxxQkFBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVNLEtBQUssVUFBVSxVQUFVLENBQUMsYUFBcUIsRUFBRSxNQUFlO0lBQ3JFLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5RCxNQUFNLE1BQU0sR0FBRyxNQUFNLHNCQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFbEIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQU5ELGdDQU1DO0FBRU0sS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxhQUFxQixFQUNyQixNQUFjLEVBQ2QsYUFBdUI7SUFFdkIsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlELE1BQU0sTUFBTSxHQUFHLGFBQWEsSUFBSSxDQUFDLE1BQU0sc0JBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFbkYsZUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELG1CQUFlLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQVpELHdEQVlDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQ2pDLGFBQXFCLEVBQ3JCLE9BQW9DO0lBRXBDLE9BQU8sS0FBSyxFQUFFLE1BQWMsRUFBRSxFQUFFO1FBQzlCLE1BQU0sU0FBUyxHQUFHLE1BQU0sc0JBQXNCLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFOUYsT0FBTyxJQUFJLDBDQUFtQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUM7QUFDSixDQUFDO0FBVEQsa0RBU0MifQ==
|
|
File without changes
|
|
@@ -64,4 +64,4 @@ class ArrayTypeGetter {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
exports.default = ArrayTypeGetter;
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdHlwZS1nZXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9oZWxwZXJzL2FycmF5LXR5cGUtZ2V0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQWtEO0FBRWxELE1BQXFCLGVBQWU7SUFnRGxDLFlBQVksU0FBb0I7UUE3Q2YsVUFBSyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkN4QixDQUFDO1FBR0EsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsOERBQThEO1FBQzlELElBQUksQ0FBQyxTQUFTLEdBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGNBQXNCLENBQUMsU0FBUyxDQUFDO0lBQ3hGLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUNYLFNBQWlCLEVBQ2pCLFVBQWtCO1FBRWxCLE1BQU0sWUFBWSxHQUFHLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBRS9DLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNqRSxZQUFZO1lBQ1osSUFBSSxFQUFFLHNCQUFVLENBQUMsTUFBTTtTQUN4QixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDeEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUNoRCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdEVELGtDQXNFQyJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Dialect } from 'sequelize';
|
|
2
|
+
import { ColumnType } from '../types';
|
|
3
|
+
export default class DefaultValueParser {
|
|
4
|
+
private readonly dialect;
|
|
5
|
+
constructor(dialect: Dialect);
|
|
6
|
+
parse(expression: any, columnType: ColumnType): unknown;
|
|
7
|
+
private parseGeneric;
|
|
8
|
+
private sanitizeExpression;
|
|
9
|
+
private literalUnlessMatch;
|
|
10
|
+
private parseNumber;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=default-value-parser.d.ts.map
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const sequelize_1 = require("sequelize");
|
|
4
|
+
class DefaultValueParser {
|
|
5
|
+
constructor(dialect) {
|
|
6
|
+
this.dialect = dialect;
|
|
7
|
+
}
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
parse(expression, columnType) {
|
|
10
|
+
if (expression === null || expression === undefined)
|
|
11
|
+
return undefined;
|
|
12
|
+
if (typeof expression === 'string' && expression.startsWith('NULL'))
|
|
13
|
+
return null;
|
|
14
|
+
// FA backend not handle correctly
|
|
15
|
+
if (columnType.type === 'array')
|
|
16
|
+
return undefined;
|
|
17
|
+
try {
|
|
18
|
+
const result = this.parseGeneric(expression, columnType);
|
|
19
|
+
return result !== undefined ? result : (0, sequelize_1.literal)(expression);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
return (0, sequelize_1.literal)(expression);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
|
+
parseGeneric(expression, columnType) {
|
|
27
|
+
let sanitizedExpression = expression;
|
|
28
|
+
// sanitize string
|
|
29
|
+
if (typeof expression === 'string') {
|
|
30
|
+
sanitizedExpression = this.sanitizeExpression(expression);
|
|
31
|
+
}
|
|
32
|
+
if (columnType.type === 'enum') {
|
|
33
|
+
return sanitizedExpression;
|
|
34
|
+
}
|
|
35
|
+
switch (columnType.subType) {
|
|
36
|
+
case 'BOOLEAN':
|
|
37
|
+
return [true, 'true', 'TRUE', "b'1'", '1'].includes(sanitizedExpression);
|
|
38
|
+
case 'NUMBER':
|
|
39
|
+
case 'BIGINT':
|
|
40
|
+
case 'FLOAT':
|
|
41
|
+
case 'DOUBLE':
|
|
42
|
+
return this.parseNumber(sanitizedExpression);
|
|
43
|
+
case 'DATE':
|
|
44
|
+
case 'DATEONLY':
|
|
45
|
+
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);
|
|
46
|
+
case 'STRING':
|
|
47
|
+
return sanitizedExpression;
|
|
48
|
+
case 'JSON':
|
|
49
|
+
case 'JSONB':
|
|
50
|
+
return JSON.parse(sanitizedExpression);
|
|
51
|
+
default:
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
sanitizeExpression(expression) {
|
|
56
|
+
let sanitizedExpression = expression;
|
|
57
|
+
if (/^'.*'$/.test(sanitizedExpression)) {
|
|
58
|
+
sanitizedExpression = expression.substring(1, expression.length - 1);
|
|
59
|
+
}
|
|
60
|
+
if (this.dialect === 'mssql') {
|
|
61
|
+
// Sequelize send default values with weird char at the beginning (`(Ndefault value`)
|
|
62
|
+
sanitizedExpression = sanitizedExpression.replace(/\(N/, '');
|
|
63
|
+
while (/^\(.*\)$/.test(sanitizedExpression)) {
|
|
64
|
+
sanitizedExpression = sanitizedExpression.substring(1, sanitizedExpression.length - 1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return sanitizedExpression;
|
|
68
|
+
}
|
|
69
|
+
literalUnlessMatch(regexp, expression) {
|
|
70
|
+
return regexp.test(expression) ? expression : (0, sequelize_1.literal)(expression);
|
|
71
|
+
}
|
|
72
|
+
parseNumber(expression) {
|
|
73
|
+
const result = Number.parseFloat(expression);
|
|
74
|
+
return Number.isNaN(result) ? (0, sequelize_1.literal)(expression) : result;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.default = DefaultValueParser;
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC12YWx1ZS1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9oZWxwZXJzL2RlZmF1bHQtdmFsdWUtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQTZDO0FBSTdDLE1BQXFCLGtCQUFrQjtJQUdyQyxZQUFZLE9BQWdCO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCw4REFBOEQ7SUFDOUQsS0FBSyxDQUFDLFVBQWUsRUFBRSxVQUFzQjtRQUMzQyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUV0RSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWpGLGtDQUFrQztRQUNsQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssT0FBTztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRWxELElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUV6RCxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBQSxtQkFBTyxFQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzVEO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLElBQUEsbUJBQU8sRUFBQyxVQUFVLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFRCw4REFBOEQ7SUFDdEQsWUFBWSxDQUFDLFVBQWUsRUFBRSxVQUFzQjtRQUMxRCxJQUFJLG1CQUFtQixHQUFHLFVBQVUsQ0FBQztRQUVyQyxrQkFBa0I7UUFDbEIsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUU7WUFD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
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ColumnDescription, Sequelize } from 'sequelize';
|
|
2
|
+
import { ColumnType } from '../types';
|
|
2
3
|
export default class SqlTypeConverter {
|
|
3
4
|
private readonly enumRegex;
|
|
4
5
|
private readonly arrayTypeGetter;
|
|
@@ -9,6 +10,6 @@ export default class SqlTypeConverter {
|
|
|
9
10
|
private convertToEnum;
|
|
10
11
|
private getTypeForUserDefined;
|
|
11
12
|
private getTypeForArray;
|
|
12
|
-
convert(tableName: string, columnName: string, columnInfo: ColumnDescription): Promise<
|
|
13
|
+
convert(tableName: string, columnName: string, columnInfo: ColumnDescription): Promise<ColumnType>;
|
|
13
14
|
}
|
|
14
15
|
//# sourceMappingURL=sql-type-converter.d.ts.map
|
|
@@ -0,0 +1,101 @@
|
|
|
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 array_type_getter_1 = __importDefault(require("./array-type-getter"));
|
|
7
|
+
class SqlTypeConverter {
|
|
8
|
+
constructor(sequelize) {
|
|
9
|
+
this.enumRegex = /ENUM\((.*)\)/i;
|
|
10
|
+
this.arrayTypeGetter = new array_type_getter_1.default(sequelize);
|
|
11
|
+
}
|
|
12
|
+
typeMatch(type, value) {
|
|
13
|
+
return (type.match(value) || {}).input;
|
|
14
|
+
}
|
|
15
|
+
typeStartsWith(type, value) {
|
|
16
|
+
return this.typeMatch(type, new RegExp(`^${value}.*`, 'i'));
|
|
17
|
+
}
|
|
18
|
+
typeContains(type, value) {
|
|
19
|
+
return this.typeMatch(type, new RegExp(`${value}.*`, 'i'));
|
|
20
|
+
}
|
|
21
|
+
convertToEnum(type) {
|
|
22
|
+
const enumOptions = this.enumRegex.exec(type)?.[1];
|
|
23
|
+
return { type: 'enum', values: enumOptions.replace(/'/g, '').split(',') };
|
|
24
|
+
}
|
|
25
|
+
getTypeForUserDefined(columnInfo) {
|
|
26
|
+
const { special } = columnInfo;
|
|
27
|
+
if (special && special.length > 0) {
|
|
28
|
+
return { type: 'enum', values: special };
|
|
29
|
+
}
|
|
30
|
+
// User-defined enum with no values will default to string
|
|
31
|
+
return { type: 'scalar', subType: 'STRING' };
|
|
32
|
+
}
|
|
33
|
+
async getTypeForArray(tableName, columnName) {
|
|
34
|
+
const { type, special } = await this.arrayTypeGetter.getType(tableName, columnName);
|
|
35
|
+
const columnInfo = { type, special };
|
|
36
|
+
const arrayType = await this.convert(tableName, columnName, columnInfo);
|
|
37
|
+
return { type: 'array', subType: arrayType };
|
|
38
|
+
}
|
|
39
|
+
async convert(tableName, columnName, columnInfo) {
|
|
40
|
+
const { type } = columnInfo;
|
|
41
|
+
switch (type) {
|
|
42
|
+
case 'JSON':
|
|
43
|
+
return { type: 'scalar', subType: 'JSON' };
|
|
44
|
+
case 'TINYINT(1)': // MYSQL bool
|
|
45
|
+
case 'BIT': // NOTICE: MSSQL type.
|
|
46
|
+
case 'BOOLEAN':
|
|
47
|
+
return { type: 'scalar', subType: 'BOOLEAN' };
|
|
48
|
+
case 'CHARACTER VARYING':
|
|
49
|
+
case 'TEXT':
|
|
50
|
+
case 'NTEXT': // MSSQL type
|
|
51
|
+
case this.typeContains(type, 'TEXT'):
|
|
52
|
+
case this.typeContains(type, 'VARCHAR'):
|
|
53
|
+
case this.typeContains(type, 'CHAR'):
|
|
54
|
+
case 'NVARCHAR': // NOTICE: MSSQL type.
|
|
55
|
+
return { type: 'scalar', subType: 'STRING' };
|
|
56
|
+
case 'USER-DEFINED':
|
|
57
|
+
return this.getTypeForUserDefined(columnInfo);
|
|
58
|
+
case this.typeMatch(type, this.enumRegex):
|
|
59
|
+
return this.convertToEnum(type);
|
|
60
|
+
case 'UNIQUEIDENTIFIER':
|
|
61
|
+
case 'UUID':
|
|
62
|
+
return { type: 'scalar', subType: 'UUID' };
|
|
63
|
+
case 'JSONB':
|
|
64
|
+
return { type: 'scalar', subType: 'JSONB' };
|
|
65
|
+
case 'INTEGER':
|
|
66
|
+
case 'SERIAL':
|
|
67
|
+
case 'BIGSERIAL':
|
|
68
|
+
case this.typeStartsWith(type, 'INT'):
|
|
69
|
+
case this.typeStartsWith(type, 'SMALLINT'):
|
|
70
|
+
case this.typeStartsWith(type, 'TINYINT'):
|
|
71
|
+
case this.typeStartsWith(type, 'MEDIUMINT'):
|
|
72
|
+
return { type: 'scalar', subType: 'NUMBER' };
|
|
73
|
+
case this.typeStartsWith(type, 'BIGINT'):
|
|
74
|
+
return { type: 'scalar', subType: 'BIGINT' };
|
|
75
|
+
case this.typeContains(type, 'FLOAT'):
|
|
76
|
+
return { type: 'scalar', subType: 'FLOAT' };
|
|
77
|
+
case 'NUMERIC':
|
|
78
|
+
case 'REAL':
|
|
79
|
+
case 'DOUBLE':
|
|
80
|
+
case 'DOUBLE PRECISION':
|
|
81
|
+
case this.typeContains(type, 'DECIMAL'):
|
|
82
|
+
return { type: 'scalar', subType: 'DOUBLE' };
|
|
83
|
+
case 'DATE':
|
|
84
|
+
return { type: 'scalar', subType: 'DATEONLY' };
|
|
85
|
+
case this.typeStartsWith(type, 'DATETIME'):
|
|
86
|
+
case this.typeStartsWith(type, 'TIMESTAMP'):
|
|
87
|
+
return { type: 'scalar', subType: 'DATE' };
|
|
88
|
+
case 'TIME':
|
|
89
|
+
case 'TIME WITHOUT TIME ZONE':
|
|
90
|
+
return { type: 'scalar', subType: 'TIME' };
|
|
91
|
+
case 'ARRAY':
|
|
92
|
+
return this.getTypeForArray(tableName, columnName);
|
|
93
|
+
case 'INET':
|
|
94
|
+
return { type: 'scalar', subType: 'INET' };
|
|
95
|
+
default:
|
|
96
|
+
throw new Error(`Unsupported type: ${type}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.default = SqlTypeConverter;
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLXR5cGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaGVscGVycy9zcWwtdHlwZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSw0RUFBa0Q7QUFFbEQsTUFBcUIsZ0JBQWdCO0lBSW5DLFlBQVksU0FBb0I7UUFIZixjQUFTLEdBQUcsZUFBZSxDQUFDO1FBSTNDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSwyQkFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTyxTQUFTLENBQUMsSUFBWSxFQUFFLEtBQXNCO1FBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBRU8sY0FBYyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ2hELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxZQUFZLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDOUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFZO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxVQUE2QjtRQUN6RCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDO1FBRS9CLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztTQUMxQztRQUVELDBEQUEwRDtRQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBaUIsRUFBRSxVQUFrQjtRQUNqRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBdUIsQ0FBQztRQUMxRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsU0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsVUFBNkI7UUFFN0IsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQztRQUU1QixRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssTUFBTTtnQkFDVCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDN0MsS0FBSyxZQUFZLENBQUMsQ0FBQyxhQUFhO1lBQ2hDLEtBQUssS0FBSyxDQUFDLENBQUMsc0JBQXNCO1lBQ2xDLEtBQUssU0FBUztnQkFDWixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDaEQsS0FBSyxtQkFBbUIsQ0FBQztZQUN6QixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssT0FBTyxDQUFDLENBQUMsYUFBYTtZQUMzQixLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNyQyxLQUFLLFVBQVUsRUFBRSxzQkFBc0I7Z0JBQ3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUMvQyxLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hELEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDdkMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLEtBQUssa0JBQWtCLENBQUM7WUFDeEIsS0FBSyxNQUFNO2dCQUNULE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM3QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzlDLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDM0MsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxQyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQztnQkFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQy9DLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO2dCQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDL0MsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7Z0JBQ25DLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUM5QyxLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLGtCQUFrQixDQUFDO1lBQ3hCLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO2dCQUNyQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDL0MsS0FBSyxNQUFNO2dCQUNULE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUNqRCxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDO2dCQUN6QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDN0MsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLHdCQUF3QjtnQkFDM0IsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzdDLEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELEtBQUssTUFBTTtnQkFDVCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDN0M7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNoRDtJQUNILENBQUM7Q0FDRjtBQTlHRCxtQ0E4R0MifQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Sequelize } from 'sequelize';
|
|
2
|
+
import { Logger } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
import { Table } from './types';
|
|
4
|
+
export default class Introspector {
|
|
5
|
+
static introspect(sequelize: Sequelize, logger?: Logger): Promise<Table[]>;
|
|
6
|
+
/** Get names of all tables in the public schema of the db */
|
|
7
|
+
private static getTableNames;
|
|
8
|
+
/** Instrospect a single table */
|
|
9
|
+
private static getTable;
|
|
10
|
+
private static getColumn;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=introspector.d.ts.map
|
|
@@ -0,0 +1,74 @@
|
|
|
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 default_value_parser_1 = __importDefault(require("./helpers/default-value-parser"));
|
|
7
|
+
const sql_type_converter_1 = __importDefault(require("./helpers/sql-type-converter"));
|
|
8
|
+
class Introspector {
|
|
9
|
+
static async introspect(sequelize, logger) {
|
|
10
|
+
const tableNames = await this.getTableNames(sequelize);
|
|
11
|
+
return Promise.all(tableNames.map(name => this.getTable(sequelize, logger, name)));
|
|
12
|
+
}
|
|
13
|
+
/** Get names of all tables in the public schema of the db */
|
|
14
|
+
static async getTableNames(sequelize) {
|
|
15
|
+
const names = await sequelize
|
|
16
|
+
.getQueryInterface()
|
|
17
|
+
.showAllTables();
|
|
18
|
+
// Fixes Sequelize behavior incorrectly implemented.
|
|
19
|
+
// Types indicate that showAllTables() should return a list of string, but it
|
|
20
|
+
// returns a list of object for both mariadb & mssql
|
|
21
|
+
// @see https://github.com/sequelize/sequelize/blob/main/src/dialects/mariadb/query.js#L295
|
|
22
|
+
return names.map(name => (typeof name === 'string' ? name : name?.tableName));
|
|
23
|
+
}
|
|
24
|
+
/** Instrospect a single table */
|
|
25
|
+
static async getTable(sequelize, logger, tableName) {
|
|
26
|
+
// Load columns descriptions, indexes and references of the current table.
|
|
27
|
+
const [columnDescriptions, tableIndexes, tableReferences] = await Promise.all([
|
|
28
|
+
sequelize.getQueryInterface().describeTable(tableName),
|
|
29
|
+
sequelize.getQueryInterface().showIndex(tableName),
|
|
30
|
+
sequelize.getQueryInterface().getForeignKeyReferencesForTable(tableName),
|
|
31
|
+
]);
|
|
32
|
+
// Create columns
|
|
33
|
+
const columns = Object.entries(columnDescriptions).map(([name, description]) => {
|
|
34
|
+
const indexes = tableIndexes.filter(i => i.fields.find(f => f.attribute === name));
|
|
35
|
+
const references = tableReferences.filter(r => r.columnName === name);
|
|
36
|
+
const options = { name, description, indexes, references };
|
|
37
|
+
return this.getColumn(sequelize, logger, tableName, options);
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
name: tableName,
|
|
41
|
+
columns: (await Promise.all(columns)).filter(Boolean),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
static async getColumn(sequelize, logger, tableName, options) {
|
|
45
|
+
const { name, description, indexes, references } = options;
|
|
46
|
+
const dialect = sequelize.getDialect();
|
|
47
|
+
const typeConverter = new sql_type_converter_1.default(sequelize);
|
|
48
|
+
try {
|
|
49
|
+
const type = await typeConverter.convert(tableName, name, description);
|
|
50
|
+
const defaultValue = new default_value_parser_1.default(dialect).parse(description.defaultValue, type);
|
|
51
|
+
const unique = !!indexes.find(i => i.fields.length === 1 && i.fields[0].attribute === name && i.unique);
|
|
52
|
+
// Workaround autoincrement flag not being properly set when using postgres
|
|
53
|
+
const autoIncrement = Boolean(description.autoIncrement || description.defaultValue?.match?.(/^nextval\(.+\)$/));
|
|
54
|
+
return {
|
|
55
|
+
type,
|
|
56
|
+
autoIncrement,
|
|
57
|
+
defaultValue: autoIncrement ? null : defaultValue,
|
|
58
|
+
name,
|
|
59
|
+
allowNull: description.allowNull,
|
|
60
|
+
unique,
|
|
61
|
+
primaryKey: description.primaryKey,
|
|
62
|
+
constraints: references.map(r => ({
|
|
63
|
+
table: r.referencedTableName,
|
|
64
|
+
column: r.referencedColumnName,
|
|
65
|
+
})),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
logger?.('Warn', `Skipping column ${tableName}.${name} (${e.message})`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.default = Introspector;
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaW50cm9zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBSUEsMEZBQWdFO0FBQ2hFLHNGQUE0RDtBQUU1RCxNQUFxQixZQUFZO0lBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQW9CLEVBQUUsTUFBZTtRQUMzRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdkQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCw2REFBNkQ7SUFDckQsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBb0I7UUFDckQsTUFBTSxLQUFLLEdBQXVDLE1BQU0sU0FBUzthQUM5RCxpQkFBaUIsRUFBRTthQUNuQixhQUFhLEVBQUUsQ0FBQztRQUVuQixvREFBb0Q7UUFDcEQsNkVBQTZFO1FBQzdFLG9EQUFvRDtRQUNwRCwyRkFBMkY7UUFDM0YsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVELGlDQUFpQztJQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDM0IsU0FBb0IsRUFDcEIsTUFBYyxFQUNkLFNBQWlCO1FBRWpCLDBFQUEwRTtRQUMxRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLGVBQWUs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
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AbstractDataType, AbstractDataTypeConstructor, QueryInterface } from 'sequelize/types';
|
|
2
|
+
export declare type SequelizeIndex = Awaited<ReturnType<QueryInterface['showIndex']>>[number];
|
|
3
|
+
export declare type SequelizeColumn = Awaited<ReturnType<QueryInterface['describeTable']>>[number];
|
|
4
|
+
export declare type SequelizeColumnType = AbstractDataType | AbstractDataTypeConstructor;
|
|
5
|
+
export declare type SequelizeReference = Awaited<ReturnType<QueryInterface['getForeignKeyReferencesForTable']>>[number];
|
|
6
|
+
export declare type ColumnType = {
|
|
7
|
+
type: 'scalar';
|
|
8
|
+
subType: 'BIGINT' | 'BOOLEAN' | 'DATE' | 'DATEONLY' | 'DOUBLE' | 'FLOAT' | 'INET' | 'JSON' | 'JSONB' | 'NUMBER' | 'STRING' | 'TIME' | 'UUID';
|
|
9
|
+
} | {
|
|
10
|
+
type: 'array';
|
|
11
|
+
subType: ColumnType;
|
|
12
|
+
} | {
|
|
13
|
+
type: 'enum';
|
|
14
|
+
values: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare type Table = {
|
|
17
|
+
name: string;
|
|
18
|
+
columns: {
|
|
19
|
+
name: string;
|
|
20
|
+
type: ColumnType;
|
|
21
|
+
defaultValue: unknown;
|
|
22
|
+
allowNull: boolean;
|
|
23
|
+
unique: boolean;
|
|
24
|
+
autoIncrement: boolean;
|
|
25
|
+
primaryKey: boolean;
|
|
26
|
+
constraints: {
|
|
27
|
+
table: string;
|
|
28
|
+
column: string;
|
|
29
|
+
}[];
|
|
30
|
+
}[];
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50cm9zcGVjdGlvbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Relation } from '../types';
|
|
2
|
+
import { Table } from '../../introspection/types';
|
|
3
|
+
export default class RelationExtractor {
|
|
4
|
+
static listRelations(tableName: string, tables: Table[]): Relation[];
|
|
5
|
+
private static listDirectRelations;
|
|
6
|
+
private static listIndirectRelations;
|
|
7
|
+
private static isJunctionTable;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=relation-extractor.d.ts.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class RelationExtractor {
|
|
4
|
+
static listRelations(tableName, tables) {
|
|
5
|
+
const relations = [];
|
|
6
|
+
for (const table of tables) {
|
|
7
|
+
relations.push(...this.listDirectRelations(table));
|
|
8
|
+
relations.push(...this.listIndirectRelations(table));
|
|
9
|
+
}
|
|
10
|
+
return relations.filter(r => r.from === tableName);
|
|
11
|
+
}
|
|
12
|
+
static listDirectRelations(table) {
|
|
13
|
+
const relations = [];
|
|
14
|
+
for (const column of table.columns) {
|
|
15
|
+
for (const constraint of column.constraints) {
|
|
16
|
+
relations.push({
|
|
17
|
+
type: 'BelongsTo',
|
|
18
|
+
from: table.name,
|
|
19
|
+
to: constraint.table,
|
|
20
|
+
foreignKey: column.name,
|
|
21
|
+
foreignKeyTarget: constraint.column,
|
|
22
|
+
});
|
|
23
|
+
// Skip HasMany to junction tables
|
|
24
|
+
if (!this.isJunctionTable(table))
|
|
25
|
+
relations.push({
|
|
26
|
+
type: column.unique ? 'HasOne' : 'HasMany',
|
|
27
|
+
from: constraint.table,
|
|
28
|
+
to: table.name,
|
|
29
|
+
originKey: column.name,
|
|
30
|
+
originKeyTarget: constraint.column,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return relations;
|
|
35
|
+
}
|
|
36
|
+
static listIndirectRelations(table) {
|
|
37
|
+
const relations = [];
|
|
38
|
+
const columns = table.columns.filter(c => c.primaryKey && c.constraints.length === 1);
|
|
39
|
+
if (this.isJunctionTable(table)) {
|
|
40
|
+
const [column1, column2] = columns;
|
|
41
|
+
relations.push({
|
|
42
|
+
type: 'BelongsToMany',
|
|
43
|
+
from: column1.constraints[0].table,
|
|
44
|
+
to: column2.constraints[0].table,
|
|
45
|
+
through: table.name,
|
|
46
|
+
originKey: column1.name,
|
|
47
|
+
foreignKey: column2.name,
|
|
48
|
+
originKeyTarget: column1.constraints[0].column,
|
|
49
|
+
foreignKeyTarget: column2.constraints[0].column,
|
|
50
|
+
});
|
|
51
|
+
relations.push({
|
|
52
|
+
type: 'BelongsToMany',
|
|
53
|
+
from: column2.constraints[0].table,
|
|
54
|
+
to: column1.constraints[0].table,
|
|
55
|
+
through: table.name,
|
|
56
|
+
originKey: column2.name,
|
|
57
|
+
foreignKey: column1.name,
|
|
58
|
+
originKeyTarget: column2.constraints[0].column,
|
|
59
|
+
foreignKeyTarget: column1.constraints[0].column,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return relations;
|
|
63
|
+
}
|
|
64
|
+
static isJunctionTable(table) {
|
|
65
|
+
return table.columns.filter(c => c.primaryKey && c.constraints.length === 1).length === 2;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.default = RelationExtractor;
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb24tZXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29ybS1idWlsZGVyL2hlbHBlcnMvcmVsYXRpb24tZXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBcUIsaUJBQWlCO0lBQ3BDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBaUIsRUFBRSxNQUFlO1FBQ3JELE1BQU0sU0FBUyxHQUFlLEVBQUUsQ0FBQztRQUVqQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbkQsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQVk7UUFDN0MsTUFBTSxTQUFTLEdBQWUsRUFBRSxDQUFDO1FBRWpDLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNsQyxLQUFLLE1BQU0sVUFBVSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7Z0JBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDaEIsRUFBRSxFQUFFLFVBQVUsQ0FBQyxLQUFLO29CQUNwQixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ3ZCLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxNQUFNO2lCQUNwQyxDQUFDLENBQUM7Z0JBRUgsa0NBQWtDO2dCQUNsQyxJ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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Relation } from '../types';
|
|
2
|
+
import { Table } from '../../introspection/types';
|
|
3
|
+
export default class RelationNameGenerator {
|
|
4
|
+
static getUniqueRelationNames(table: Table, relations: Relation[]): string[];
|
|
5
|
+
private static getSimpleName;
|
|
6
|
+
private static getUniqueName;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=relation-name-generator.d.ts.map
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const pluralize_1 = require("pluralize");
|
|
4
|
+
class RelationNameGenerator {
|
|
5
|
+
static getUniqueRelationNames(table, relations) {
|
|
6
|
+
var _a;
|
|
7
|
+
const names = relations.map(this.getSimpleName);
|
|
8
|
+
// Search for duplicates
|
|
9
|
+
const indexesByName = {};
|
|
10
|
+
for (let i = 0; i < names.length; i += 1) {
|
|
11
|
+
indexesByName[_a = names[i]] ?? (indexesByName[_a] = []);
|
|
12
|
+
indexesByName[names[i]].push(i);
|
|
13
|
+
}
|
|
14
|
+
// When a duplicate is found, use long names for all of them
|
|
15
|
+
for (const [name, indexes] of Object.entries(indexesByName)) {
|
|
16
|
+
// Legit conflicts we need to handle
|
|
17
|
+
const conflictsWithColumn = !!table.columns.find(c => c.name === name);
|
|
18
|
+
const conflictsWithOtherRelation = indexes.length > 1;
|
|
19
|
+
// Workaround sequelize bugs
|
|
20
|
+
// @see https://github.com/sequelize/sequelize/issues/8263
|
|
21
|
+
const conflictsWithTable = name === table.name;
|
|
22
|
+
const conflictsWithThroughTable = relations.find(r => r.through === name);
|
|
23
|
+
if (conflictsWithColumn ||
|
|
24
|
+
conflictsWithTable ||
|
|
25
|
+
conflictsWithOtherRelation ||
|
|
26
|
+
conflictsWithThroughTable) {
|
|
27
|
+
for (const index of indexes) {
|
|
28
|
+
names[index] = this.getUniqueName(relations[index]);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return names;
|
|
33
|
+
}
|
|
34
|
+
static getSimpleName(relation) {
|
|
35
|
+
const { foreignKey } = relation;
|
|
36
|
+
let name = relation.to;
|
|
37
|
+
if (foreignKey?.length > 3 && foreignKey?.endsWith('_id'))
|
|
38
|
+
name = foreignKey.substring(0, foreignKey.length - 3);
|
|
39
|
+
if (foreignKey?.length > 2 && foreignKey?.endsWith('Id'))
|
|
40
|
+
name = foreignKey.substring(0, foreignKey.length - 2);
|
|
41
|
+
return relation.type === 'HasMany' || relation.type === 'BelongsToMany'
|
|
42
|
+
? (0, pluralize_1.plural)(name)
|
|
43
|
+
: (0, pluralize_1.singular)(name);
|
|
44
|
+
}
|
|
45
|
+
static getUniqueName(relation) {
|
|
46
|
+
switch (relation.type) {
|
|
47
|
+
case 'BelongsTo':
|
|
48
|
+
return `${(0, pluralize_1.singular)(relation.to)}_through_${relation.foreignKey}`;
|
|
49
|
+
case 'HasOne':
|
|
50
|
+
return `${(0, pluralize_1.singular)(relation.to)}_through_${relation.from}_${relation.originKey}`;
|
|
51
|
+
case 'BelongsToMany':
|
|
52
|
+
return `${(0, pluralize_1.plural)(relation.to)}_through_${relation.through}`;
|
|
53
|
+
case 'HasMany':
|
|
54
|
+
return `${(0, pluralize_1.plural)(relation.to)}_through_${relation.from}_${relation.originKey}`;
|
|
55
|
+
default:
|
|
56
|
+
throw new Error(`Invalid relation type ${relation.type}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.default = RelationNameGenerator;
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb24tbmFtZS1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3JtLWJ1aWxkZXIvaGVscGVycy9yZWxhdGlvbi1uYW1lLWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUE2QztBQUs3QyxNQUFxQixxQkFBcUI7SUFDeEMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQVksRUFBRSxTQUFxQjs7UUFDL0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFaEQsd0JBQXdCO1FBQ3hCLE1BQU0sYUFBYSxHQUE2QixFQUFFLENBQUM7UUFFbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QyxhQUFhLE1BQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUF0QixhQUFhLE9BQWUsRUFBRSxFQUFDO1lBQy9CLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakM7UUFFRCw0REFBNEQ7UUFDNUQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDM0Qsb0NBQW9DO1lBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztZQUN2RSxNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRXRELDRCQUE0QjtZQUM1QiwwREFBMEQ7WUFDMUQsTUFBTSxrQkFBa0IsR0FB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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const sequelize_1 = require("sequelize");
|
|
4
|
+
class SequelizeTypeFactory {
|
|
5
|
+
static makeSequelizeType(type) {
|
|
6
|
+
switch (type.type) {
|
|
7
|
+
case 'scalar':
|
|
8
|
+
if (sequelize_1.DataTypes[type.subType])
|
|
9
|
+
return sequelize_1.DataTypes[type.subType];
|
|
10
|
+
throw new Error(`Unexpected type: ${type.subType}`);
|
|
11
|
+
case 'enum':
|
|
12
|
+
return sequelize_1.DataTypes.ENUM(...type.values);
|
|
13
|
+
case 'array':
|
|
14
|
+
return sequelize_1.DataTypes.ARRAY(this.makeSequelizeType(type.subType));
|
|
15
|
+
default:
|
|
16
|
+
throw new Error();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.default = SequelizeTypeFactory;
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVsaXplLXR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvb3JtLWJ1aWxkZXIvaGVscGVycy9zZXF1ZWxpemUtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFzQztBQUl0QyxNQUFxQixvQkFBb0I7SUFDdkMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQWdCO1FBQ3ZDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqQixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxxQkFBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7b0JBQUUsT0FBTyxxQkFBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFdEQsS0FBSyxNQUFNO2dCQUNULE9BQU8scUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFeEMsS0FBSyxPQUFPO2dCQUNWLE9BQU8scUJBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBRS9EO2dCQUNFLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7Q0FDRjtBQWpCRCx1Q0FpQkMifQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Logger } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { Sequelize } from 'sequelize';
|
|
3
|
+
import { Table } from '../introspection/types';
|
|
4
|
+
export default class ModelBuilder {
|
|
5
|
+
static defineModels(sequelize: Sequelize, logger: Logger, tables: Table[]): void;
|
|
6
|
+
private static defineModel;
|
|
7
|
+
private static hasTimestamps;
|
|
8
|
+
private static isParanoid;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
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_type_1 = __importDefault(require("./helpers/sequelize-type"));
|
|
7
|
+
class ModelBuilder {
|
|
8
|
+
static defineModels(sequelize, logger, tables) {
|
|
9
|
+
for (const table of tables) {
|
|
10
|
+
this.defineModel(sequelize, logger, table);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
static defineModel(sequelize, logger, table) {
|
|
14
|
+
const modelAttrs = {};
|
|
15
|
+
const hasTimestamps = this.hasTimestamps(table);
|
|
16
|
+
const isParanoid = this.isParanoid(table);
|
|
17
|
+
for (const column of table.columns) {
|
|
18
|
+
const isExplicit = !(hasTimestamps && (column.name === 'updatedAt' || column.name === 'createdAt')) &&
|
|
19
|
+
!(isParanoid && column.name === 'deletedAt');
|
|
20
|
+
// Clone object, because sequelize modifies it.
|
|
21
|
+
if (isExplicit)
|
|
22
|
+
modelAttrs[column.name] = {
|
|
23
|
+
...column,
|
|
24
|
+
type: sequelize_type_1.default.makeSequelizeType(column.type),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const model = sequelize.define(table.name, modelAttrs, {
|
|
29
|
+
tableName: table.name,
|
|
30
|
+
timestamps: hasTimestamps,
|
|
31
|
+
paranoid: isParanoid,
|
|
32
|
+
});
|
|
33
|
+
// @see https://sequelize.org/docs/v6/other-topics/legacy/#primary-keys
|
|
34
|
+
// Tell sequelize NOT to invent primary keys when we don't provide them.
|
|
35
|
+
// (Note that this does not seem to work)
|
|
36
|
+
if (!modelAttrs.id && model.getAttributes().id) {
|
|
37
|
+
model.removeAttribute('id');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
logger?.('Warn', `Skipping table "${table.name}" because of error: ${e.message}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
static hasTimestamps(table) {
|
|
45
|
+
return (!!table.columns.find(c => c.name === 'createdAt') &&
|
|
46
|
+
!!table.columns.find(c => c.name === 'updatedAt'));
|
|
47
|
+
}
|
|
48
|
+
static isParanoid(table) {
|
|
49
|
+
return !!table.columns.find(c => c.name === 'deletedAt');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.default = ModelBuilder;
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JtLWJ1aWxkZXIvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSw4RUFBNEQ7QUFFNUQsTUFBcUIsWUFBWTtJQUMvQixNQUFNLENBQUMsWUFBWSxDQUFDLFNBQW9CLEVBQUUsTUFBYyxFQUFFLE1BQWU7UUFDdkUsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBb0IsRUFBRSxNQUFjLEVBQUUsS0FBWTtRQUMzRSxNQUFNLFVBQVUsR0FBb0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxQyxLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDbEMsTUFBTSxVQUFVLEdBQ2QsQ0FBQyxDQUFDLGFBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUM7Z0JBQ2hGLENBQUMsQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQztZQUUvQywrQ0FBK0M7WUFDL0MsSUFBSSxVQUFVO2dCQUNaLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUc7b0JBQ3hCLEdBQUcsTUFBTTtvQkFDVCxJQUFJLEVBQUUsd0JBQW9CLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztpQkFDMUQsQ0FBQztTQUNMO1FBRUQsSUFBSTtZQUNGLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ3JELFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDckIsVUFBVSxFQUFFLGFBQWE7Z0JBQ3pCLFFBQVEsRUFBRSxVQUFVO2FBQ3JCLENBQUMsQ0FBQztZQUVILHVFQUF1RTtZQUN2RSx3RUFBd0U7WUFDeEUseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0I7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLG1CQUFtQixLQUFLLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDbkY7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFZO1FBQ3ZDLE9BQU8sQ0FDTCxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQztZQUNqRCxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUNsRCxDQUFDO0lBQ0osQ0FBQztJQUVPLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBWTtRQUNwQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBckRELCtCQXFEQyJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Logger } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { Sequelize } from 'sequelize';
|
|
3
|
+
import { Table } from '../introspection/types';
|
|
4
|
+
export default class RelationBuilder {
|
|
5
|
+
static defineRelations(sequelize: Sequelize, logger: Logger, tables: Table[]): void;
|
|
6
|
+
private static defineTableRelations;
|
|
7
|
+
private static defineRelation;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=relations.d.ts.map
|
|
@@ -0,0 +1,64 @@
|
|
|
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 relation_extractor_1 = __importDefault(require("./helpers/relation-extractor"));
|
|
7
|
+
const relation_name_generator_1 = __importDefault(require("./helpers/relation-name-generator"));
|
|
8
|
+
class RelationBuilder {
|
|
9
|
+
static defineRelations(sequelize, logger, tables) {
|
|
10
|
+
for (const table of tables) {
|
|
11
|
+
this.defineTableRelations(sequelize, logger, table, tables);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
static defineTableRelations(sequelize, logger, table, tables) {
|
|
15
|
+
const relations = relation_extractor_1.default.listRelations(table.name, tables);
|
|
16
|
+
const relationNames = relation_name_generator_1.default.getUniqueRelationNames(table, relations);
|
|
17
|
+
for (const [index, relation] of relations.entries()) {
|
|
18
|
+
const as = relationNames[index];
|
|
19
|
+
try {
|
|
20
|
+
this.defineRelation(sequelize, relation, as);
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
logger?.('Warn', `Skipping relation "${table.name}.${as}" because of error: ${e.message}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
static defineRelation(sequelize, relation, as) {
|
|
28
|
+
const sourceModel = sequelize.model(relation.from);
|
|
29
|
+
const targetModel = sequelize.model(relation.to);
|
|
30
|
+
if (relation.type === 'BelongsTo') {
|
|
31
|
+
sourceModel.belongsTo(targetModel, {
|
|
32
|
+
as,
|
|
33
|
+
foreignKey: relation.foreignKey,
|
|
34
|
+
targetKey: relation.foreignKeyTarget,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else if (relation.type === 'HasMany') {
|
|
38
|
+
sourceModel.hasMany(targetModel, {
|
|
39
|
+
as,
|
|
40
|
+
foreignKey: relation.originKey,
|
|
41
|
+
sourceKey: relation.originKeyTarget,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else if (relation.type === 'BelongsToMany') {
|
|
45
|
+
sourceModel.belongsToMany(targetModel, {
|
|
46
|
+
as,
|
|
47
|
+
through: relation.through,
|
|
48
|
+
otherKey: relation.foreignKey,
|
|
49
|
+
foreignKey: relation.originKey,
|
|
50
|
+
targetKey: relation.foreignKeyTarget,
|
|
51
|
+
sourceKey: relation.originKeyTarget,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else if (relation.type === 'HasOne') {
|
|
55
|
+
sourceModel.hasOne(targetModel, {
|
|
56
|
+
as,
|
|
57
|
+
foreignKey: relation.originKey,
|
|
58
|
+
sourceKey: relation.originKeyTarget,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.default = RelationBuilder;
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29ybS1idWlsZGVyL3JlbGF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQU1BLHNGQUE2RDtBQUM3RCxnR0FBc0U7QUFFdEUsTUFBcUIsZUFBZTtJQUNsQyxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQW9CLEVBQUUsTUFBYyxFQUFFLE1BQWU7UUFDMUUsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7WUFDMUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDakMsU0FBb0IsRUFDcEIsTUFBYyxFQUNkLEtBQVksRUFDWixNQUFlO1FBRWYsTUFBTSxTQUFTLEdBQUcsNEJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEUsTUFBTSxhQUFhLEdBQUcsaUNBQXFCLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXJGLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkQsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWhDLElBQUk7Z0JBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzlDO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLHNCQUFzQixLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQzVGO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFvQixFQUFFLFFBQWtCLEVBQUUsRUFBVTtRQUNoRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVqRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ2pDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO2dCQUNqQyxFQUFFO2dCQUNGLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtnQkFDL0IsU0FBUyxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0I7YUFDckMsQ0FBQyxDQUFDO1NBQ0o7YUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3RDLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUMvQixFQUFFO2dCQUNGLFVBQVUsRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDOUIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxlQUFlO2FBQ3BDLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLGVBQWUsRUFBRTtZQUM1QyxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRTtnQkFDckMsRUFBRTtnQkFDRixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87Z0JBQ3pCLFFBQVEsRUFBRSxRQUFRLENBQUMsVUFBVTtnQkFDN0IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxTQUFTO2dCQUM5QixTQUFTLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtnQkFDcEMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxlQUFlO2FBQ3BDLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNyQyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDOUIsRUFBRTtnQkFDRixVQUFVLEVBQUUsUUFBUSxDQUFDLFNBQVM7Z0JBQzlCLFNBQVMsRUFBRSxRQUFRLENBQUMsZUFBZTthQUNwQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Q0FDRjtBQTVERCxrQ0E0REMifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare type Relation = {
|
|
2
|
+
type: 'BelongsTo' | 'HasOne' | 'BelongsToMany' | 'HasMany';
|
|
3
|
+
from: string;
|
|
4
|
+
to: string;
|
|
5
|
+
through?: string;
|
|
6
|
+
foreignKey?: string;
|
|
7
|
+
originKey?: string;
|
|
8
|
+
foreignKeyTarget?: string;
|
|
9
|
+
originKeyTarget?: string;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JtLWJ1aWxkZXIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/datasource-sql",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1-alpha.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -12,9 +12,10 @@
|
|
|
12
12
|
"directory": "packages/datasource-sql"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@forestadmin/datasource-sequelize": "1.0.
|
|
16
|
-
"@forestadmin/datasource-toolkit": "1.0.
|
|
17
|
-
"
|
|
15
|
+
"@forestadmin/datasource-sequelize": "1.0.1-alpha.1",
|
|
16
|
+
"@forestadmin/datasource-toolkit": "1.0.1-alpha.1",
|
|
17
|
+
"pluralize": "^8.0.0",
|
|
18
|
+
"sequelize": "6.21.3"
|
|
18
19
|
},
|
|
19
20
|
"files": [
|
|
20
21
|
"dist/**/*.js",
|
|
@@ -28,7 +29,6 @@
|
|
|
28
29
|
"test": "jest"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
|
-
"lodash": "^4.17.21"
|
|
32
|
-
"sequelize": "6.18.0"
|
|
32
|
+
"lodash": "^4.17.21"
|
|
33
33
|
}
|
|
34
34
|
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
# @forestadmin/datasource-sql [1.0.0-beta.9](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sql@1.0.0-beta.8...@forestadmin/datasource-sql@1.0.0-beta.9) (2022-04-20)
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
### Dependencies
|
|
8
|
-
|
|
9
|
-
* **@forestadmin/datasource-sequelize:** upgraded to 1.0.0-beta.7
|
|
10
|
-
|
|
11
|
-
# @forestadmin/datasource-sql [1.0.0-beta.8](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sql@1.0.0-beta.7...@forestadmin/datasource-sql@1.0.0-beta.8) (2022-04-19)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
### Dependencies
|
|
18
|
-
|
|
19
|
-
* **@forestadmin/datasource-sequelize:** upgraded to 1.0.0-beta.6
|
|
20
|
-
* **@forestadmin/datasource-toolkit:** upgraded to 1.0.0-beta.5
|
|
21
|
-
|
|
22
|
-
# @forestadmin/datasource-sql [1.0.0-beta.7](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sql@1.0.0-beta.6...@forestadmin/datasource-sql@1.0.0-beta.7) (2022-04-19)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
### Dependencies
|
|
29
|
-
|
|
30
|
-
* **@forestadmin/datasource-sequelize:** upgraded to 1.0.0-beta.5
|
|
31
|
-
|
|
32
|
-
# @forestadmin/datasource-sql [1.0.0-beta.6](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sql@1.0.0-beta.5...@forestadmin/datasource-sql@1.0.0-beta.6) (2022-04-15)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
### Features
|
|
36
|
-
|
|
37
|
-
* **datasource sql:** handle primitive fields and default values ([#215](https://github.com/ForestAdmin/agent-nodejs/issues/215)) ([59a56da](https://github.com/ForestAdmin/agent-nodejs/commit/59a56da2721f39d0487b14d72b11d71b38b83a1f))
|
|
38
|
-
|
|
39
|
-
# @forestadmin/datasource-sql [1.0.0-beta.5](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sql@1.0.0-beta.4...@forestadmin/datasource-sql@1.0.0-beta.5) (2022-04-15)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
### Dependencies
|
|
46
|
-
|
|
47
|
-
* **@forestadmin/datasource-sequelize:** upgraded to 1.0.0-beta.4
|
|
48
|
-
* **@forestadmin/datasource-toolkit:** upgraded to 1.0.0-beta.4
|
|
49
|
-
|
|
50
|
-
# @forestadmin/datasource-sql [1.0.0-beta.4](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sql@1.0.0-beta.3...@forestadmin/datasource-sql@1.0.0-beta.4) (2022-04-15)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
### Bug Fixes
|
|
54
|
-
|
|
55
|
-
* switched from qiwi to dhoulb version of msr ([020c3e0](https://github.com/ForestAdmin/agent-nodejs/commit/020c3e04c64164c3f26aae293989db7842f82e8c))
|
|
56
|
-
|
|
57
|
-
# @forestadmin/datasource-sql [1.0.0-beta.3](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sql@1.0.0-beta.2...@forestadmin/datasource-sql@1.0.0-beta.3) (2022-04-15)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
### Bug Fixes
|
|
61
|
-
|
|
62
|
-
* correct versions in package.json of all datasources ([540d395](https://github.com/ForestAdmin/agent-nodejs/commit/540d395bc5e42bdd7edb3dce5806ade8554f3d7a))
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
### Dependencies
|
|
69
|
-
|
|
70
|
-
* **@forestadmin/datasource-sequelize:** upgraded to 1.0.0-beta.3
|
|
71
|
-
|
|
72
|
-
# @forestadmin/datasource-sql [1.0.0-beta.2](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sql@1.0.0-beta.1...@forestadmin/datasource-sql@1.0.0-beta.2) (2022-04-15)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
### Dependencies
|
|
79
|
-
|
|
80
|
-
* **@forestadmin/datasource-sequelize:** upgraded to 1.0.0-beta.2
|
|
81
|
-
* **@forestadmin/datasource-toolkit:** upgraded to 1.0.0-beta.3
|
|
82
|
-
|
|
83
|
-
# @forestadmin/datasource-sql 1.0.0-beta.1 (2022-04-15)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
### Bug Fixes
|
|
87
|
-
|
|
88
|
-
* enable npm, git and github distribution ([bd91825](https://github.com/ForestAdmin/agent-nodejs/commit/bd91825f4d185874a259da28b0f7a6c7f557196d))
|
|
89
|
-
* fix semantic release ([3a2fa73](https://github.com/ForestAdmin/agent-nodejs/commit/3a2fa738af84a50b9563db6ac039c922b77f55cc))
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
### Dependencies
|
|
96
|
-
|
|
97
|
-
* **@forestadmin/datasource-sequelize:** upgraded to 1.0.0-beta.1
|
package/dist/datasource.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { SequelizeDataSource } from '@forestadmin/datasource-sequelize';
|
|
2
|
-
export default class SqlDataSource extends SequelizeDataSource {
|
|
3
|
-
private readonly queryInterface;
|
|
4
|
-
private readonly defaultValueParser;
|
|
5
|
-
private readonly sqlTypeConverter;
|
|
6
|
-
constructor(connectionUri: string);
|
|
7
|
-
build(): Promise<void>;
|
|
8
|
-
private defineModels;
|
|
9
|
-
private hasTimestamps;
|
|
10
|
-
private removeTimeStampColumns;
|
|
11
|
-
private isParanoid;
|
|
12
|
-
private removeParanoidColumn;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=datasource.d.ts.map
|
package/dist/datasource.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
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 datasource_sequelize_1 = require("@forestadmin/datasource-sequelize");
|
|
8
|
-
const default_value_parser_1 = __importDefault(require("./utils/default-value-parser"));
|
|
9
|
-
const sql_type_converter_1 = __importDefault(require("./utils/sql-type-converter"));
|
|
10
|
-
class SqlDataSource extends datasource_sequelize_1.SequelizeDataSource {
|
|
11
|
-
constructor(connectionUri) {
|
|
12
|
-
super(new sequelize_1.Sequelize(connectionUri, { logging: false }));
|
|
13
|
-
this.queryInterface = this.sequelize.getQueryInterface();
|
|
14
|
-
this.defaultValueParser = new default_value_parser_1.default(this.sequelize.getDialect());
|
|
15
|
-
this.sqlTypeConverter = new sql_type_converter_1.default(this.sequelize);
|
|
16
|
-
}
|
|
17
|
-
async build() {
|
|
18
|
-
const tableNames = await this.queryInterface.showAllTables();
|
|
19
|
-
await this.defineModels(tableNames);
|
|
20
|
-
this.createCollections(this.sequelize.models);
|
|
21
|
-
}
|
|
22
|
-
async defineModels(tableNames) {
|
|
23
|
-
return Promise.all(tableNames.map(async (tableName) => {
|
|
24
|
-
const colmumnDescriptions = await this.queryInterface.describeTable(tableName);
|
|
25
|
-
const fieldDescriptions = await Promise.all(Object.entries(colmumnDescriptions).map(async ([columnName, colmumnDescription]) => {
|
|
26
|
-
const type = await this.sqlTypeConverter.convert(tableName, columnName, colmumnDescription);
|
|
27
|
-
let defaultValue = this.defaultValueParser.parse(colmumnDescription.defaultValue, type);
|
|
28
|
-
if (colmumnDescription.primaryKey && defaultValue) {
|
|
29
|
-
defaultValue = null;
|
|
30
|
-
colmumnDescription.autoIncrement = true;
|
|
31
|
-
}
|
|
32
|
-
return [
|
|
33
|
-
columnName,
|
|
34
|
-
{
|
|
35
|
-
...colmumnDescription,
|
|
36
|
-
type,
|
|
37
|
-
defaultValue,
|
|
38
|
-
},
|
|
39
|
-
];
|
|
40
|
-
}));
|
|
41
|
-
let modelDefinition = Object.fromEntries(fieldDescriptions);
|
|
42
|
-
const columnNames = Object.keys(modelDefinition);
|
|
43
|
-
const hasTimestamps = this.hasTimestamps(columnNames);
|
|
44
|
-
const isParanoid = this.isParanoid(columnNames);
|
|
45
|
-
if (hasTimestamps) {
|
|
46
|
-
modelDefinition = this.removeTimeStampColumns(modelDefinition);
|
|
47
|
-
}
|
|
48
|
-
if (isParanoid) {
|
|
49
|
-
modelDefinition = this.removeParanoidColumn(modelDefinition);
|
|
50
|
-
}
|
|
51
|
-
this.sequelize.define(tableName, modelDefinition, {
|
|
52
|
-
tableName,
|
|
53
|
-
timestamps: hasTimestamps,
|
|
54
|
-
paranoid: isParanoid,
|
|
55
|
-
});
|
|
56
|
-
}));
|
|
57
|
-
}
|
|
58
|
-
hasTimestamps(columnNames) {
|
|
59
|
-
const hasCreatedAt = columnNames.includes('createdAt');
|
|
60
|
-
const hasUpdatedAt = columnNames.includes('updatedAt');
|
|
61
|
-
return hasCreatedAt && hasUpdatedAt;
|
|
62
|
-
}
|
|
63
|
-
removeTimeStampColumns(modelDefinition) {
|
|
64
|
-
const copy = { ...modelDefinition };
|
|
65
|
-
delete copy.createdAt;
|
|
66
|
-
delete copy.updatedAt;
|
|
67
|
-
return copy;
|
|
68
|
-
}
|
|
69
|
-
isParanoid(columnNames) {
|
|
70
|
-
return columnNames.includes('deletedAt');
|
|
71
|
-
}
|
|
72
|
-
removeParanoidColumn(modelDefinition) {
|
|
73
|
-
const copy = { ...modelDefinition };
|
|
74
|
-
delete copy.deletedAt;
|
|
75
|
-
return copy;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
exports.default = SqlDataSource;
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQWdGO0FBRWhGLDRFQUF3RTtBQUV4RSx3RkFBOEQ7QUFDOUQsb0ZBQTBEO0FBRTFELE1BQXFCLGFBQWMsU0FBUSwwQ0FBbUI7SUFLNUQsWUFBWSxhQUFxQjtRQUMvQixLQUFLLENBQUMsSUFBSSxxQkFBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksOEJBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQWEsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLDRCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFN0QsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQW9CO1FBQzdDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FDaEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsU0FBUyxFQUFDLEVBQUU7WUFDL0IsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxD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
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { AbstractDataType, AbstractDataTypeConstructor, Dialect } from 'sequelize';
|
|
2
|
-
export default class DefaultValueParser {
|
|
3
|
-
private readonly dialect;
|
|
4
|
-
constructor(dialect: Dialect);
|
|
5
|
-
parse(expression: any, type: AbstractDataType | AbstractDataTypeConstructor): unknown;
|
|
6
|
-
private parseGeneric;
|
|
7
|
-
private sanitizeExpression;
|
|
8
|
-
private literalUnlessMatch;
|
|
9
|
-
private parseNumber;
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=default-value-parser.d.ts.map
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const sequelize_1 = require("sequelize");
|
|
4
|
-
class DefaultValueParser {
|
|
5
|
-
constructor(dialect) {
|
|
6
|
-
this.dialect = dialect;
|
|
7
|
-
}
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
-
parse(expression, type) {
|
|
10
|
-
if (expression === null || expression === undefined)
|
|
11
|
-
return undefined;
|
|
12
|
-
if (typeof expression === 'string' && expression.startsWith('NULL'))
|
|
13
|
-
return null;
|
|
14
|
-
// FA backend not handle correctly
|
|
15
|
-
if (type instanceof sequelize_1.DataTypes.ARRAY) {
|
|
16
|
-
return undefined;
|
|
17
|
-
}
|
|
18
|
-
try {
|
|
19
|
-
const result = this.parseGeneric(expression, type);
|
|
20
|
-
return result !== undefined ? result : (0, sequelize_1.literal)(expression);
|
|
21
|
-
}
|
|
22
|
-
catch (e) {
|
|
23
|
-
return (0, sequelize_1.literal)(expression);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
parseGeneric(
|
|
27
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
-
expression, type) {
|
|
29
|
-
let sanitizedExpression = expression;
|
|
30
|
-
// sanitize string
|
|
31
|
-
if (typeof expression === 'string') {
|
|
32
|
-
sanitizedExpression = this.sanitizeExpression(expression);
|
|
33
|
-
}
|
|
34
|
-
if (type instanceof sequelize_1.DataTypes.ENUM) {
|
|
35
|
-
return sanitizedExpression;
|
|
36
|
-
}
|
|
37
|
-
switch (type) {
|
|
38
|
-
case sequelize_1.DataTypes.BOOLEAN:
|
|
39
|
-
return [true, 'true', 'TRUE', "b'1'", '1'].includes(sanitizedExpression);
|
|
40
|
-
case sequelize_1.DataTypes.NUMBER:
|
|
41
|
-
case sequelize_1.DataTypes.BIGINT:
|
|
42
|
-
case sequelize_1.DataTypes.FLOAT:
|
|
43
|
-
case sequelize_1.DataTypes.DOUBLE:
|
|
44
|
-
return this.parseNumber(sanitizedExpression);
|
|
45
|
-
case sequelize_1.DataTypes.DATE:
|
|
46
|
-
case sequelize_1.DataTypes.DATEONLY:
|
|
47
|
-
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);
|
|
48
|
-
case sequelize_1.DataTypes.STRING:
|
|
49
|
-
return sanitizedExpression;
|
|
50
|
-
case sequelize_1.DataTypes.JSON:
|
|
51
|
-
case sequelize_1.DataTypes.JSONB:
|
|
52
|
-
return JSON.parse(sanitizedExpression);
|
|
53
|
-
default:
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
sanitizeExpression(expression) {
|
|
58
|
-
let sanitizedExpression = expression;
|
|
59
|
-
if (/^'.*'$/.test(sanitizedExpression)) {
|
|
60
|
-
sanitizedExpression = expression.substring(1, expression.length - 1);
|
|
61
|
-
}
|
|
62
|
-
if (this.dialect === 'mssql') {
|
|
63
|
-
while (/^\(.*\)$/.test(sanitizedExpression)) {
|
|
64
|
-
sanitizedExpression = sanitizedExpression.substring(1, sanitizedExpression.length - 1);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return sanitizedExpression;
|
|
68
|
-
}
|
|
69
|
-
literalUnlessMatch(regexp, expression) {
|
|
70
|
-
return regexp.test(expression) ? expression : (0, sequelize_1.literal)(expression);
|
|
71
|
-
}
|
|
72
|
-
parseNumber(expression) {
|
|
73
|
-
const result = Number.parseFloat(expression);
|
|
74
|
-
return Number.isNaN(result) ? (0, sequelize_1.literal)(expression) : result;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
exports.default = DefaultValueParser;
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC12YWx1ZS1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZGVmYXVsdC12YWx1ZS1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FNbUI7QUFFbkIsTUFBcUIsa0JBQWtCO0lBR3JDLFlBQVksT0FBZ0I7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxLQUFLLENBQUMsVUFBZSxFQUFFLElBQW9EO1FBQ3pFLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRXRFLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFakYsa0NBQWtDO1FBQ2xDLElBQUksSUFBSSxZQUFZLHFCQUFTLENBQUMsS0FBSyxFQUFFO1lBQ25DLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsSUFBSTtZQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRW5ELE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFBLG1CQUFPLEVBQUMsVUFBVSxDQUFDLENBQUM7U0FDNUQ7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sSUFBQSxtQkFBTyxFQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVPLFlBQVk7SUFDbEIsOERBQThEO0lBQzlELFVBQWUsRUFDZixJQUFvRDtRQUVwRCxJQUFJLG1CQUFtQixHQUFHLFVBQVUsQ0FBQztRQUVyQyxrQkFBa0I7UUFDbEIsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUU7WUFDbEMsbUJB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
|
|
@@ -1,105 +0,0 @@
|
|
|
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 array_type_getter_1 = __importDefault(require("./array-type-getter"));
|
|
8
|
-
class SqlTypeConverter {
|
|
9
|
-
constructor(sequelize) {
|
|
10
|
-
this.enumRegex = /ENUM\((.*)\)/i;
|
|
11
|
-
this.arrayTypeGetter = new array_type_getter_1.default(sequelize);
|
|
12
|
-
}
|
|
13
|
-
typeMatch(type, value) {
|
|
14
|
-
return (type.match(value) || {}).input;
|
|
15
|
-
}
|
|
16
|
-
typeStartsWith(type, value) {
|
|
17
|
-
return this.typeMatch(type, new RegExp(`^${value}.*`, 'i'));
|
|
18
|
-
}
|
|
19
|
-
typeContains(type, value) {
|
|
20
|
-
return this.typeMatch(type, new RegExp(`${value}.*`, 'i'));
|
|
21
|
-
}
|
|
22
|
-
convertToEnum(type) {
|
|
23
|
-
const enumOptions = this.enumRegex.exec(type)?.[1];
|
|
24
|
-
return sequelize_1.DataTypes.ENUM(...enumOptions.replace(/'/g, '').split(','));
|
|
25
|
-
}
|
|
26
|
-
getTypeForUserDefined(columnInfo) {
|
|
27
|
-
const { special } = columnInfo;
|
|
28
|
-
if (special && special.length > 0) {
|
|
29
|
-
return sequelize_1.DataTypes.ENUM(...special);
|
|
30
|
-
}
|
|
31
|
-
// User-defined enum with no values will default to string
|
|
32
|
-
return sequelize_1.DataTypes.STRING;
|
|
33
|
-
}
|
|
34
|
-
async getTypeForArray(tableName, columnName) {
|
|
35
|
-
const { type, special } = await this.arrayTypeGetter.getType(tableName, columnName);
|
|
36
|
-
const arrayType = await this.convert(tableName, columnName, {
|
|
37
|
-
type,
|
|
38
|
-
special,
|
|
39
|
-
});
|
|
40
|
-
return sequelize_1.DataTypes.ARRAY(arrayType);
|
|
41
|
-
}
|
|
42
|
-
async convert(tableName, columnName, columnInfo) {
|
|
43
|
-
const { type } = columnInfo;
|
|
44
|
-
switch (type) {
|
|
45
|
-
case 'JSON':
|
|
46
|
-
return sequelize_1.DataTypes.JSON;
|
|
47
|
-
case 'TINYINT(1)': // MYSQL bool
|
|
48
|
-
case 'BIT': // NOTICE: MSSQL type.
|
|
49
|
-
case 'BOOLEAN':
|
|
50
|
-
return sequelize_1.DataTypes.BOOLEAN;
|
|
51
|
-
case 'CHARACTER VARYING':
|
|
52
|
-
case 'TEXT':
|
|
53
|
-
case 'NTEXT': // MSSQL type
|
|
54
|
-
case this.typeContains(type, 'TEXT'):
|
|
55
|
-
case this.typeContains(type, 'VARCHAR'):
|
|
56
|
-
case this.typeContains(type, 'CHAR'):
|
|
57
|
-
case 'NVARCHAR': // NOTICE: MSSQL type.
|
|
58
|
-
return sequelize_1.DataTypes.STRING;
|
|
59
|
-
case 'USER-DEFINED':
|
|
60
|
-
return this.getTypeForUserDefined(columnInfo);
|
|
61
|
-
case this.typeMatch(type, this.enumRegex):
|
|
62
|
-
return this.convertToEnum(type);
|
|
63
|
-
case 'UNIQUEIDENTIFIER':
|
|
64
|
-
case 'UUID':
|
|
65
|
-
return sequelize_1.DataTypes.UUID;
|
|
66
|
-
case 'JSONB':
|
|
67
|
-
return sequelize_1.DataTypes.JSONB;
|
|
68
|
-
case 'INTEGER':
|
|
69
|
-
case 'SERIAL':
|
|
70
|
-
case 'BIGSERIAL':
|
|
71
|
-
case this.typeStartsWith(type, 'INT'):
|
|
72
|
-
case this.typeStartsWith(type, 'SMALLINT'):
|
|
73
|
-
case this.typeStartsWith(type, 'TINYINT'):
|
|
74
|
-
case this.typeStartsWith(type, 'MEDIUMINT'):
|
|
75
|
-
return sequelize_1.DataTypes.NUMBER;
|
|
76
|
-
case this.typeStartsWith(type, 'BIGINT'):
|
|
77
|
-
return sequelize_1.DataTypes.BIGINT;
|
|
78
|
-
case this.typeContains(type, 'FLOAT'):
|
|
79
|
-
return sequelize_1.DataTypes.FLOAT;
|
|
80
|
-
case 'NUMERIC':
|
|
81
|
-
case 'REAL':
|
|
82
|
-
case 'DOUBLE':
|
|
83
|
-
case 'DOUBLE PRECISION':
|
|
84
|
-
case this.typeContains(type, 'DECIMAL'):
|
|
85
|
-
return sequelize_1.DataTypes.DOUBLE;
|
|
86
|
-
case 'DATE':
|
|
87
|
-
return sequelize_1.DataTypes.DATEONLY;
|
|
88
|
-
case this.typeStartsWith(type, 'DATETIME'):
|
|
89
|
-
case this.typeStartsWith(type, 'TIMESTAMP'):
|
|
90
|
-
return sequelize_1.DataTypes.DATE;
|
|
91
|
-
case 'TIME':
|
|
92
|
-
case 'TIME WITHOUT TIME ZONE':
|
|
93
|
-
return sequelize_1.DataTypes.TIME;
|
|
94
|
-
case 'ARRAY':
|
|
95
|
-
return this.getTypeForArray(tableName, columnName);
|
|
96
|
-
case 'INET':
|
|
97
|
-
return sequelize_1.DataTypes.INET;
|
|
98
|
-
default:
|
|
99
|
-
// TODO put logging warning
|
|
100
|
-
console.warn(type, columnInfo);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
exports.default = SqlTypeConverter;
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLXR5cGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3NxbC10eXBlLWNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlDQU9tQjtBQUVuQiw0RUFBa0Q7QUFFbEQsTUFBcUIsZ0JBQWdCO0lBSW5DLFlBQVksU0FBb0I7UUFIZixjQUFTLEdBQUcsZUFBZSxDQUFDO1FBSTNDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSwyQkFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTyxTQUFTLENBQUMsSUFBWSxFQUFFLEtBQXNCO1FBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBRU8sY0FBYyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ2hELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxZQUFZLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDOUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFZO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkQsT0FBTyxxQkFBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxD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
|