@forestadmin/datasource-sql 1.11.2 → 1.12.0
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/decorators/sql-datasource.d.ts +10 -0
- package/dist/decorators/sql-datasource.js +25 -0
- package/dist/decorators/view-decorator.d.ts +8 -0
- package/dist/decorators/view-decorator.js +28 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +15 -12
- package/dist/introspection/dialects/dialect.interface.d.ts +1 -0
- package/dist/introspection/dialects/mssql-dialect.d.ts +2 -1
- package/dist/introspection/dialects/mssql-dialect.js +16 -1
- package/dist/introspection/dialects/mysql-dialect/index.d.ts +2 -1
- package/dist/introspection/dialects/mysql-dialect/index.js +11 -1
- package/dist/introspection/dialects/postgresql-dialect/index.d.ts +2 -1
- package/dist/introspection/dialects/postgresql-dialect/index.js +13 -1
- package/dist/introspection/dialects/sqlite-dialect.d.ts +2 -1
- package/dist/introspection/dialects/sqlite-dialect.js +10 -1
- package/dist/introspection/helpers/sql-type-converter.d.ts +1 -1
- package/dist/introspection/helpers/sql-type-converter.js +3 -3
- package/dist/introspection/introspector.d.ts +6 -3
- package/dist/introspection/introspector.js +56 -29
- package/dist/introspection/list-collections-from-introspection.d.ts +2 -2
- package/dist/introspection/list-collections-from-introspection.js +6 -4
- package/dist/introspection/types.d.ts +5 -4
- package/dist/orm-builder/model.d.ts +3 -3
- package/dist/orm-builder/model.js +18 -8
- package/dist/orm-builder/relations.d.ts +2 -2
- package/dist/orm-builder/relations.js +4 -4
- package/package.json +2 -2
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SequelizeDataSource } from '@forestadmin/datasource-sequelize';
|
|
2
|
+
import { Collection, DataSourceDecorator } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
import { Table } from '../introspection/types';
|
|
4
|
+
export default class SqlDatasource extends DataSourceDecorator<Collection> {
|
|
5
|
+
private readonly viewNames;
|
|
6
|
+
constructor(childDataSource: SequelizeDataSource, views: Table[]);
|
|
7
|
+
getCollection(name: string): Collection;
|
|
8
|
+
close(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=sql-datasource.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
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 datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
+
const view_decorator_1 = __importDefault(require("./view-decorator"));
|
|
8
|
+
class SqlDatasource extends datasource_toolkit_1.DataSourceDecorator {
|
|
9
|
+
constructor(childDataSource, views) {
|
|
10
|
+
super(childDataSource, view_decorator_1.default);
|
|
11
|
+
this.viewNames = new Set();
|
|
12
|
+
this.viewNames = new Set(views?.map(({ name }) => name));
|
|
13
|
+
}
|
|
14
|
+
getCollection(name) {
|
|
15
|
+
const collection = this.childDataSource.getCollection(name);
|
|
16
|
+
if (!this.viewNames.has(name))
|
|
17
|
+
return collection;
|
|
18
|
+
return super.getCollection(name);
|
|
19
|
+
}
|
|
20
|
+
async close() {
|
|
21
|
+
await this.childDataSource.close();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.default = SqlDatasource;
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLWRhdGFzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVjb3JhdG9ycy9zcWwtZGF0YXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLHdFQUFrRjtBQUVsRixzRUFBNkM7QUFHN0MsTUFBcUIsYUFBYyxTQUFRLHdDQUErQjtJQUd4RSxZQUFZLGVBQW9DLEVBQUUsS0FBYztRQUM5RCxLQUFLLENBQUMsZUFBZSxFQUFFLHdCQUFhLENBQUMsQ0FBQztRQUh2QixjQUFTLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFLbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRVEsYUFBYSxDQUFDLElBQVk7UUFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sVUFBVSxDQUFDO1FBRWpELE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsTUFBTyxJQUFJLENBQUMsZUFBdUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0NBQ0Y7QUFwQkQsZ0NBb0JDIn0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CollectionDecorator, CollectionSchema } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
export default class ViewDecorator extends CollectionDecorator {
|
|
3
|
+
protected refineSchema(subSchema: CollectionSchema): CollectionSchema;
|
|
4
|
+
create(): Promise<never>;
|
|
5
|
+
update(): Promise<never>;
|
|
6
|
+
delete(): Promise<never>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=view-decorator.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
4
|
+
class ViewDecorator extends datasource_toolkit_1.CollectionDecorator {
|
|
5
|
+
refineSchema(subSchema) {
|
|
6
|
+
return {
|
|
7
|
+
...subSchema,
|
|
8
|
+
fields: Object.entries(subSchema.fields).reduce((fields, [fieldName, fieldSchema]) => ({
|
|
9
|
+
...fields,
|
|
10
|
+
[fieldName]: {
|
|
11
|
+
...fieldSchema,
|
|
12
|
+
isReadOnly: true,
|
|
13
|
+
},
|
|
14
|
+
}), {}),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async create() {
|
|
18
|
+
throw new datasource_toolkit_1.UnprocessableError('View is read-only');
|
|
19
|
+
}
|
|
20
|
+
async update() {
|
|
21
|
+
throw new datasource_toolkit_1.UnprocessableError('View is read-only');
|
|
22
|
+
}
|
|
23
|
+
async delete() {
|
|
24
|
+
throw new datasource_toolkit_1.UnprocessableError('View is read-only');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = ViewDecorator;
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVjb3JhdG9ycy92aWV3LWRlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdFQUl5QztBQUV6QyxNQUFxQixhQUFjLFNBQVEsd0NBQW1CO0lBQ3pDLFlBQVksQ0FBQyxTQUEyQjtRQUN6RCxPQUFPO1lBQ0wsR0FBRyxTQUFTO1lBRVosTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDN0MsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDLEdBQUcsTUFBTTtnQkFDVCxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNYLEdBQUcsV0FBVztvQkFDZCxVQUFVLEVBQUUsSUFBSTtpQkFDakI7YUFDRixDQUFDLEVBQ0YsRUFBRSxDQUNIO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFUSxLQUFLLENBQUMsTUFBTTtRQUNuQixNQUFNLElBQUksdUNBQWtCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRVEsS0FBSyxDQUFDLE1BQU07UUFDbkIsTUFBTSxJQUFJLHVDQUFrQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVRLEtBQUssQ0FBQyxNQUFNO1FBQ25CLE1BQU0sSUFBSSx1Q0FBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQTdCRCxnQ0E2QkMifQ==
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type { Introspection, IntrospectionWithoutSource, Table } from './introspection/types';
|
|
2
1
|
import type { PlainConnectionOptions, PlainConnectionOptionsOrUri, SslMode } from './types';
|
|
3
2
|
import type { DataSourceFactory, Logger } from '@forestadmin/datasource-toolkit';
|
|
4
3
|
import { Sequelize } from 'sequelize';
|
|
5
4
|
import listCollectionsFromIntrospection from './introspection/list-collections-from-introspection';
|
|
6
|
-
|
|
7
|
-
export declare function
|
|
5
|
+
import { LatestIntrospection, LegacyIntrospection, Table } from './introspection/types';
|
|
6
|
+
export declare function introspect(uriOrOptions: PlainConnectionOptionsOrUri, logger?: Logger): Promise<LatestIntrospection>;
|
|
7
|
+
export declare function buildSequelizeInstance(uriOrOptions: PlainConnectionOptionsOrUri, logger: Logger, introspection?: LegacyIntrospection): Promise<Sequelize>;
|
|
8
8
|
export declare function createSqlDataSource(uriOrOptions: PlainConnectionOptionsOrUri, options?: {
|
|
9
|
-
introspection
|
|
9
|
+
introspection?: LegacyIntrospection;
|
|
10
10
|
}): DataSourceFactory;
|
|
11
11
|
/** Preprocess the connection options so that they can be cached for faster connections */
|
|
12
12
|
export declare function preprocessOptions(uriOrOptions: PlainConnectionOptionsOrUri): Promise<PlainConnectionOptions>;
|
|
13
13
|
export * from './connection/errors';
|
|
14
|
-
export type { PlainConnectionOptionsOrUri as ConnectionOptions, Table, SslMode, Introspection };
|
|
14
|
+
export type { PlainConnectionOptionsOrUri as ConnectionOptions, Table, SslMode, LatestIntrospection as Introspection, };
|
|
15
15
|
export { listCollectionsFromIntrospection };
|
|
16
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,7 @@ exports.listCollectionsFromIntrospection = exports.preprocessOptions = exports.c
|
|
|
21
21
|
const datasource_sequelize_1 = require("@forestadmin/datasource-sequelize");
|
|
22
22
|
const connection_1 = __importDefault(require("./connection"));
|
|
23
23
|
const connection_options_1 = __importDefault(require("./connection/connection-options"));
|
|
24
|
+
const sql_datasource_1 = __importDefault(require("./decorators/sql-datasource"));
|
|
24
25
|
const introspector_1 = __importDefault(require("./introspection/introspector"));
|
|
25
26
|
const list_collections_from_introspection_1 = __importDefault(require("./introspection/list-collections-from-introspection"));
|
|
26
27
|
exports.listCollectionsFromIntrospection = list_collections_from_introspection_1.default;
|
|
@@ -38,28 +39,30 @@ async function introspect(uriOrOptions, logger) {
|
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
41
|
exports.introspect = introspect;
|
|
41
|
-
async function
|
|
42
|
-
const options = new connection_options_1.default(uriOrOptions, logger);
|
|
43
|
-
let sequelize;
|
|
42
|
+
async function buildModelsAndRelations(sequelize, logger, introspection) {
|
|
44
43
|
try {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
relations_1.default.defineRelations(sequelize, logger, tables);
|
|
44
|
+
const latestIntrospection = await introspector_1.default.migrateOrIntrospect(sequelize, logger, introspection);
|
|
45
|
+
model_1.default.defineModels(sequelize, logger, latestIntrospection);
|
|
46
|
+
relations_1.default.defineRelations(sequelize, logger, latestIntrospection);
|
|
47
|
+
return latestIntrospection;
|
|
50
48
|
}
|
|
51
49
|
catch (error) {
|
|
52
50
|
await sequelize?.close();
|
|
53
51
|
throw error;
|
|
54
52
|
}
|
|
53
|
+
}
|
|
54
|
+
async function buildSequelizeInstance(uriOrOptions, logger, introspection) {
|
|
55
|
+
const options = new connection_options_1.default(uriOrOptions, logger);
|
|
56
|
+
const sequelize = await (0, connection_1.default)(options);
|
|
57
|
+
await buildModelsAndRelations(sequelize, logger, introspection);
|
|
55
58
|
return sequelize;
|
|
56
59
|
}
|
|
57
60
|
exports.buildSequelizeInstance = buildSequelizeInstance;
|
|
58
61
|
function createSqlDataSource(uriOrOptions, options) {
|
|
59
62
|
return async (logger) => {
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
return new datasource_sequelize_1.SequelizeDataSource(sequelize, logger);
|
|
63
|
+
const sequelize = await (0, connection_1.default)(new connection_options_1.default(uriOrOptions, logger));
|
|
64
|
+
const latestIntrospection = await buildModelsAndRelations(sequelize, logger, options?.introspection);
|
|
65
|
+
return new sql_datasource_1.default(new datasource_sequelize_1.SequelizeDataSource(sequelize, logger), latestIntrospection.views);
|
|
63
66
|
};
|
|
64
67
|
}
|
|
65
68
|
exports.createSqlDataSource = createSqlDataSource;
|
|
@@ -69,4 +72,4 @@ async function preprocessOptions(uriOrOptions) {
|
|
|
69
72
|
}
|
|
70
73
|
exports.preprocessOptions = preprocessOptions;
|
|
71
74
|
__exportStar(require("./connection/errors"), exports);
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSw0RUFBd0U7QUFHeEUsOERBQW1DO0FBQ25DLHlGQUFnRTtBQUNoRSxpRkFBd0Q7QUFDeEQsZ0ZBQXdEO0FBQ3hELDhIQUFtRztBQW9GMUYsMkNBcEZGLDZDQUFnQyxDQW9GRTtBQWxGekMsZ0VBQStDO0FBQy9DLHdFQUFzRDtBQUUvQyxLQUFLLFVBQVUsVUFBVSxDQUM5QixZQUF5QyxFQUN6QyxNQUFlO0lBRWYsTUFBTSxPQUFPLEdBQUcsSUFBSSw0QkFBaUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUQsSUFBSSxTQUFvQixDQUFDO0lBRXpCLElBQUk7UUFDRixTQUFTLEdBQUcsTUFBTSxJQUFBLG9CQUFPLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkMsT0FBTyxNQUFNLHNCQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUN6RDtZQUFTO1FBQ1IsTUFBTSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7S0FDMUI7QUFDSCxDQUFDO0FBZEQsZ0NBY0M7QUFFRCxLQUFLLFVBQVUsdUJBQXVCLENBQ3BDLFNBQW9CLEVBQ3BCLE1BQWMsRUFDZCxhQUFrQztJQUVsQyxJQUFJO1FBQ0YsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLHNCQUFZLENBQUMsbUJBQW1CLENBQ2hFLFNBQVMsRUFDVCxNQUFNLEVBQ04sYUFBYSxDQUNkLENBQUM7UUFDRixlQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNsRSxtQkFBZSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFeEUsT0FBTyxtQkFBbUIsQ0FBQztLQUM1QjtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsTUFBTSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxLQUFLLENBQUM7S0FDYjtBQUNILENBQUM7QUFFTSxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLFlBQXlDLEVBQ3pDLE1BQWMsRUFDZCxhQUFtQztJQUVuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLDRCQUFpQixDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1RCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsb0JBQU8sRUFBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxNQUFNLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFaEUsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQVZELHdEQVVDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQ2pDLFlBQXlDLEVBQ3pDLE9BQWlEO0lBRWpELE9BQU8sS0FBSyxFQUFFLE1BQWMsRUFBRSxFQUFFO1FBQzlCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSxvQkFBTyxFQUFDLElBQUksNEJBQWlCLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0UsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLHVCQUF1QixDQUN2RCxTQUFTLEVBQ1QsTUFBTSxFQUNOLE9BQU8sRUFBRSxhQUFhLENBQ3ZCLENBQUM7UUFFRixPQUFPLElBQUksd0JBQWEsQ0FBQyxJQUFJLDBDQUFtQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRyxDQUFDLENBQUM7QUFDSixDQUFDO0FBZEQsa0RBY0M7QUFFRCwwRkFBMEY7QUFDbkYsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxZQUF5QztJQUV6QyxPQUFPLElBQUksNEJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztBQUN4RSxDQUFDO0FBSkQsOENBSUM7QUFFRCxzREFBb0MifQ==
|
|
@@ -8,6 +8,7 @@ export type ColumnDescription = Omit<SequelizeColumn, 'defaultValue'> & {
|
|
|
8
8
|
};
|
|
9
9
|
export default interface IntrospectionDialect {
|
|
10
10
|
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
11
|
+
listViews(sequelize: Sequelize): Promise<SequelizeTableIdentifier[]>;
|
|
11
12
|
getDefaultSchema(sequelize: Sequelize): string;
|
|
12
13
|
getTableIdentifier(tableIdentifier: SequelizeTableIdentifier): SequelizeTableIdentifier;
|
|
13
14
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Sequelize } from 'sequelize';
|
|
2
2
|
import IntrospectionDialect, { ColumnDescription } from './dialect.interface';
|
|
3
|
-
import { SequelizeTableIdentifier } from '../type-overrides';
|
|
3
|
+
import { SequelizeTableIdentifier, SequelizeWithOptions } from '../type-overrides';
|
|
4
4
|
export default class MsSQLDialect implements IntrospectionDialect {
|
|
5
5
|
getDefaultSchema(): string;
|
|
6
6
|
getTableIdentifier(tableIdentifier: SequelizeTableIdentifier): SequelizeTableIdentifier;
|
|
7
|
+
listViews(sequelize: SequelizeWithOptions): Promise<SequelizeTableIdentifier[]>;
|
|
7
8
|
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
8
9
|
private getColumnDescription;
|
|
9
10
|
/**
|
|
@@ -8,6 +8,21 @@ class MsSQLDialect {
|
|
|
8
8
|
getTableIdentifier(tableIdentifier) {
|
|
9
9
|
return tableIdentifier;
|
|
10
10
|
}
|
|
11
|
+
async listViews(sequelize) {
|
|
12
|
+
return sequelize.query(`
|
|
13
|
+
SELECT
|
|
14
|
+
SCHEMA_NAME(schema_id) AS [schema],
|
|
15
|
+
Name as [tableName]
|
|
16
|
+
FROM sys.views
|
|
17
|
+
|
|
18
|
+
`, {
|
|
19
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
20
|
+
replacements: {
|
|
21
|
+
databaseName: sequelize.getDatabaseName(),
|
|
22
|
+
schema: sequelize.options.schema || this.getDefaultSchema(),
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
11
26
|
async listColumns(tableNames, sequelize) {
|
|
12
27
|
if (!sequelize.getDatabaseName()) {
|
|
13
28
|
throw new Error('Database name is required. Please check your connection settings.');
|
|
@@ -154,4 +169,4 @@ class MsSQLDialect {
|
|
|
154
169
|
}
|
|
155
170
|
}
|
|
156
171
|
exports.default = MsSQLDialect;
|
|
157
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNzcWwtZGlhbGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnRyb3NwZWN0aW9uL2RpYWxlY3RzL21zc3FsLWRpYWxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBa0Q7QUFpQmxELE1BQXFCLFlBQVk7SUFDL0IsZ0JBQWdCO1FBQ2QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsa0JBQWtCLENBQUMsZUFBeUM7UUFDMUQsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBK0I7UUFDN0MsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUNwQjs7Ozs7O0tBTUQsRUFDQztZQUNFLElBQUksRUFBRSxzQkFBVSxDQUFDLE1BQU07WUFDdkIsWUFBWSxFQUFFO2dCQUNaLFlBQVksRUFBRSxTQUFTLENBQUMsZUFBZSxFQUFFO2dCQUN6QyxNQUFNLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2FBQzVEO1NBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQ2YsVUFBc0MsRUFDdEMsU0FBb0I7UUFFcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLG1FQUFtRSxDQUFDLENBQUM7U0FDdEY7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU07WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVO2FBQzlCLEdBQUcsQ0FDRixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNYLGdDQUFnQyxLQUFLOzJDQUNKLEtBQUs7Y0FDbEMsQ0FDUDthQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRW5CLE1BQU0sS0FBSyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBd0NKLFVBQVUsRUFBRSxDQUFDO1FBRXZCLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQ3BDLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUIsR0FBRyxHQUFHO1lBQ04sQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLFNBQVM7WUFDMUMsQ0FBQyxhQUFhLEtBQUssRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sSUFBSSxLQUFLO1NBQ2xELENBQUMsRUFDRjtZQUNFLFFBQVEsRUFBRSxTQUFTLENBQUMsZUFBZSxFQUFFO1NBQ3RDLENBQ0YsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBVyxLQUFLLEVBQUU7WUFDckQsWUFBWTtZQUNaLElBQUksRUFBRSxzQkFBVSxDQUFDLE1BQU07WUFDdkIsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDLENBQUM7UUFFSCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxPQUFPO2lCQUNYLE1BQU0sQ0FDTCxNQUFNLENBQUMsRUFBRSxDQUNQLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FDeEY7aUJBQ0EsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsUUFBa0I7UUFDN0MsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV2QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1NBQ3ZFO1FBRUQsTUFBTSxlQUFlLEdBQW9CO1lBQ3ZDLElBQUk7WUFDSixTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU0sS0FBSyxLQUFLO1lBQ3BDLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsS0FBSyxhQUFhO1lBQ2pELFlBQVksRUFBRSxRQUFRLENBQUMsT0FBTztZQUM5QixhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVUsS0FBSyxDQUFDO1lBQ3hDLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztRQUVGLE1BQU0sRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXRGLE9BQU87WUFDTCxHQUFHLGVBQWU7WUFDbEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLFlBQVk7WUFDWixxQkFBcUI7WUFDckIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSyxlQUFlLENBQUMsV0FBNEI7UUFJbEQsSUFDRSxXQUFXLENBQUMsWUFBWSxLQUFLLElBQUk7WUFDakMsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFDMUMsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFDeEM7WUFDQSwyQkFBMkI7WUFDM0IsT0FBTztnQkFDTCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIscUJBQXFCLEVBQUUsS0FBSzthQUM3QixDQUFDO1NBQ0g7UUFFRCxNQUFNLDhCQUE4QixHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdFLElBQ0UsOEJBQThCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUMvQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQzVDO1lBQ0EsT0FBTztnQkFDTCxZQUFZLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEYscUJBQXFCLEVBQUUsS0FBSzthQUM3QixDQUFDO1NBQ0g7UUFFRCxJQUNFLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFDOUMsOEJBQThCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUM1QztZQUNBLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BGLHFCQUFxQixFQUFFLEtBQUs7YUFDN0IsQ0FBQztTQUNIO1FBRUQsSUFDRSw4QkFBOEIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQzlDLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDNUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNsRTtZQUNBLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELHFCQUFxQixFQUFFLEtBQUs7YUFDN0IsQ0FBQztTQUNIO1FBRUQsSUFBSSw4QkFBOEIsS0FBSyxNQUFNLEVBQUU7WUFDN0MsT0FBTztnQkFDTCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIscUJBQXFCLEVBQUUsS0FBSzthQUM3QixDQUFDO1NBQ0g7UUFFRCxPQUFPO1lBQ0wsWUFBWSxFQUFFLDhCQUE4QjtZQUM1QyxxQkFBcUIsRUFBRSxJQUFJO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBYTtRQUN4QyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQXJORCwrQkFxTkMifQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Sequelize } from 'sequelize';
|
|
2
|
-
import { SequelizeTableIdentifier } from '../../type-overrides';
|
|
2
|
+
import { SequelizeTableIdentifier, SequelizeWithOptions } from '../../type-overrides';
|
|
3
3
|
import IntrospectionDialect, { ColumnDescription } from '../dialect.interface';
|
|
4
4
|
export type MySQLDBColumn = {
|
|
5
5
|
Table: string;
|
|
@@ -15,6 +15,7 @@ export default class MySQLDialect implements IntrospectionDialect {
|
|
|
15
15
|
getDefaultSchema(sequelize: Sequelize): string;
|
|
16
16
|
getTableIdentifier(tableIdentifier: SequelizeTableIdentifier): SequelizeTableIdentifier;
|
|
17
17
|
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
18
|
+
listViews(sequelize: SequelizeWithOptions): Promise<SequelizeTableIdentifier[]>;
|
|
18
19
|
private getColumnDescription;
|
|
19
20
|
/**
|
|
20
21
|
* Fixes the default behavior of Sequelize that does not allow us to
|
|
@@ -43,6 +43,16 @@ class MySQLDialect {
|
|
|
43
43
|
return tableColumns.map(c => this.getColumnDescription(c));
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
|
+
async listViews(sequelize) {
|
|
47
|
+
const dbName = sequelize.getDatabaseName();
|
|
48
|
+
return sequelize.query(`SELECT TABLE_NAME as "tableName"
|
|
49
|
+
FROM information_schema.tables
|
|
50
|
+
WHERE TABLE_TYPE LIKE 'VIEW'
|
|
51
|
+
AND TABLE_SCHEMA = :dbName;`, {
|
|
52
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
53
|
+
replacements: { dbName },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
46
56
|
getColumnDescription(dbColumn) {
|
|
47
57
|
const type = dbColumn.Type.startsWith('enum')
|
|
48
58
|
? dbColumn.Type.replace(/^enum/, 'ENUM')
|
|
@@ -97,4 +107,4 @@ class MySQLDialect {
|
|
|
97
107
|
}
|
|
98
108
|
}
|
|
99
109
|
exports.default = MySQLDialect;
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9kaWFsZWN0cy9teXNxbC1kaWFsZWN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQWtEO0FBRWxELDhEQUFxQztBQW1CckMsTUFBcUIsWUFBWTtJQUMvQixnQkFBZ0IsQ0FBQyxTQUFvQjtRQUNuQyxPQUFPLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsZUFBeUM7UUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQ2YsVUFBc0MsRUFDdEMsU0FBb0I7UUFFcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLG1FQUFtRSxDQUFDLENBQUM7U0FDdEY7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU07WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFcEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUNuQzs7Ozs7Ozs7Ozs7OztPQWFDLEVBQ0Q7WUFDRSxJQUFJLEVBQUUsc0JBQVUsQ0FBQyxNQUFNO1lBQ3ZCLFlBQVksRUFBRTtnQkFDWixZQUFZLEVBQUUsU0FBUyxDQUFDLGVBQWUsRUFBRTtnQkFDekMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2FBQzdDO1NBQ0YsQ0FDRixDQUFDO1FBRUYsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxD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
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Sequelize } from 'sequelize';
|
|
2
|
-
import { SequelizeTableIdentifier } from '../../type-overrides';
|
|
2
|
+
import { SequelizeTableIdentifier, SequelizeWithOptions } from '../../type-overrides';
|
|
3
3
|
import IntrospectionDialect, { ColumnDescription } from '../dialect.interface';
|
|
4
4
|
export default class PostgreSQLDialect implements IntrospectionDialect {
|
|
5
5
|
getDefaultSchema(): string;
|
|
6
6
|
getTableIdentifier(tableIdentifier: SequelizeTableIdentifier): SequelizeTableIdentifier;
|
|
7
7
|
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
8
|
+
listViews(sequelize: SequelizeWithOptions): Promise<SequelizeTableIdentifier[]>;
|
|
8
9
|
private getColumnDescription;
|
|
9
10
|
/**
|
|
10
11
|
* Fixes the default behavior of Sequelize that does not allow us to
|
|
@@ -94,6 +94,18 @@ class PostgreSQLDialect {
|
|
|
94
94
|
.map(column => this.getColumnDescription(column));
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
|
+
async listViews(sequelize) {
|
|
98
|
+
const schema = sequelize.options.schema || this.getDefaultSchema();
|
|
99
|
+
return sequelize.query(`
|
|
100
|
+
SELECT table_name as "tableName", table_schema as "schema"
|
|
101
|
+
FROM information_schema.views
|
|
102
|
+
WHERE table_schema = :schema
|
|
103
|
+
AND table_catalog = :database;
|
|
104
|
+
`, {
|
|
105
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
106
|
+
replacements: { schema, database: sequelize.getDatabaseName() },
|
|
107
|
+
});
|
|
108
|
+
}
|
|
97
109
|
getColumnDescription(dbColumn) {
|
|
98
110
|
const type = dbColumn.Type.toUpperCase();
|
|
99
111
|
const elementType = dbColumn.ElementType?.toUpperCase() === 'USER-DEFINED'
|
|
@@ -170,4 +182,4 @@ class PostgreSQLDialect {
|
|
|
170
182
|
}
|
|
171
183
|
}
|
|
172
184
|
exports.default = PostgreSQLDialect;
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9kaWFsZWN0cy9wb3N0Z3Jlc3FsLWRpYWxlY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBa0Q7QUFFbEQsZ0VBQXVDO0FBdUJ2QyxNQUFxQixpQkFBaUI7SUFDcEMsZ0JBQWdCO1FBQ2QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGtCQUFrQixDQUFDLGVBQXlDO1FBQzFELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUNmLFVBQXNDLEVBQ3RDLFNBQW9CO1FBRXBCLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO1NBQ3RGO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVO2FBQzlCLEdBQUcsQ0FDRixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNYLGdDQUFnQyxLQUFLOzJDQUNKLEtBQUs7Y0FDbEMsQ0FDUDthQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRW5CLCtEQUErRDtRQUMvRCxvQ0FBb0M7UUFDcEMsTUFBTSxLQUFLLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBK0NKLFVBQVU7O0tBRW5CLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUNwQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsR0FBRztZQUNOLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FB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
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Sequelize } from 'sequelize';
|
|
2
2
|
import IntrospectionDialect, { ColumnDescription } from './dialect.interface';
|
|
3
|
-
import { SequelizeTableIdentifier } from '../type-overrides';
|
|
3
|
+
import { SequelizeTableIdentifier, SequelizeWithOptions } from '../type-overrides';
|
|
4
4
|
export default class SQLiteDialect implements IntrospectionDialect {
|
|
5
5
|
getDefaultSchema(): string;
|
|
6
6
|
getTableIdentifier(tableIdentifier: SequelizeTableIdentifier): SequelizeTableIdentifier;
|
|
7
|
+
listViews(sequelize: SequelizeWithOptions): Promise<SequelizeTableIdentifier[]>;
|
|
7
8
|
listColumns(tableNames: SequelizeTableIdentifier[], sequelize: Sequelize): Promise<ColumnDescription[][]>;
|
|
8
9
|
private listColumnsForTable;
|
|
9
10
|
private mapDefaultValue;
|
|
@@ -8,6 +8,15 @@ class SQLiteDialect {
|
|
|
8
8
|
getTableIdentifier(tableIdentifier) {
|
|
9
9
|
return tableIdentifier;
|
|
10
10
|
}
|
|
11
|
+
async listViews(sequelize) {
|
|
12
|
+
return sequelize.query(`
|
|
13
|
+
SELECT name as 'tableName'
|
|
14
|
+
FROM sqlite_master
|
|
15
|
+
WHERE type = 'view';
|
|
16
|
+
`, {
|
|
17
|
+
type: sequelize_1.QueryTypes.SELECT,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
11
20
|
listColumns(tableNames, sequelize) {
|
|
12
21
|
if (!tableNames?.length)
|
|
13
22
|
return Promise.resolve([]);
|
|
@@ -66,4 +75,4 @@ class SQLiteDialect {
|
|
|
66
75
|
}
|
|
67
76
|
}
|
|
68
77
|
exports.default = SQLiteDialect;
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsaXRlLWRpYWxlY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9kaWFsZWN0cy9zcWxpdGUtZGlhbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFrRDtBQWNsRCxNQUFxQixhQUFhO0lBQ2hDLGdCQUFnQjtRQUNkLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxlQUF5QztRQUMxRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUErQjtRQUM3QyxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQ3BCOzs7O0tBSUQsRUFDQztZQUNFLElBQUksRUFBRSxzQkFBVSxDQUFDLE1BQU07U0FDeEIsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVcsQ0FDVCxVQUFzQyxFQUN0QyxTQUFvQjtRQUVwQixJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU07WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFcEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUMvQixlQUF5QyxFQUN6QyxTQUFvQjtRQUVwQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQzdDLFNBQVMsQ0FBQyxLQUFLLENBQVcsK0JBQStCLEVBQUU7Z0JBQ3pELElBQUksRUFBRSxzQkFBVSxDQUFDLE1BQU07Z0JBQ3ZCLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFO2FBQ3ZELENBQUM7WUFDRixTQUFTLENBQUMsS0FBSyxDQUFVLHlEQUF5RCxFQUFFO2dCQUNsRixJQUFJLEVBQUUsc0JBQVUsQ0FBQyxNQUFNO2dCQUN2QixZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRTthQUN2RCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFdEMsT0FBTztnQkFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVU7Z0JBQ3pDLFVBQVU7Z0JBQ1YseURBQXlEO2dCQUN6RCx3Q0FBd0M7Z0JBQ3hDLGFBQWEsRUFBRSxVQUFVLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7Z0JBQzFELE9BQU8sRUFBRSxJQUFJO2dCQUNiLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLFVBQVUsRUFBRSxJQUFJO2FBQ2pCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBZ0I7UUFJdEMsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRTtZQUM3RSxPQUFPO2dCQUNMLFlBQVksRUFBRSxJQUFJO2dCQUNsQixxQkFBcUIsRUFBRSxLQUFLO2FBQzdCLENBQUM7U0FDSDtRQUVELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUUsT0FBTztnQkFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7Z0JBQ2hFLHFCQUFxQixFQUFFLEtBQUs7YUFDN0IsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1lBQzVDLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUMvQixxQkFBcUIsRUFBRSxLQUFLO2FBQzdCLENBQUM7U0FDSDtRQUVELE9BQU87WUFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDL0IscUJBQXFCLEVBQUUsSUFBSTtTQUM1QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBOUZELGdDQThGQyJ9
|
|
@@ -11,7 +11,7 @@ export default class SqlTypeConverter {
|
|
|
11
11
|
* Note that we don't need to write multiple SQL queries, because arrays are only supported by
|
|
12
12
|
* Postgres
|
|
13
13
|
*/
|
|
14
|
-
private static
|
|
14
|
+
private static getArrayTypeForPostgres;
|
|
15
15
|
private static getScalarType;
|
|
16
16
|
private static typeMatch;
|
|
17
17
|
private static typeStartsWith;
|
|
@@ -4,7 +4,7 @@ class SqlTypeConverter {
|
|
|
4
4
|
static async convert(tableIdentifier, columnInfo) {
|
|
5
5
|
switch (columnInfo.type) {
|
|
6
6
|
case 'ARRAY':
|
|
7
|
-
return this.
|
|
7
|
+
return this.getArrayTypeForPostgres(tableIdentifier, columnInfo);
|
|
8
8
|
case 'USER-DEFINED':
|
|
9
9
|
case this.typeMatch(columnInfo.type, SqlTypeConverter.enumRegex):
|
|
10
10
|
return this.getEnumType(columnInfo);
|
|
@@ -24,7 +24,7 @@ class SqlTypeConverter {
|
|
|
24
24
|
* Note that we don't need to write multiple SQL queries, because arrays are only supported by
|
|
25
25
|
* Postgres
|
|
26
26
|
*/
|
|
27
|
-
static async
|
|
27
|
+
static async getArrayTypeForPostgres(tableIdentifier, columnDescription) {
|
|
28
28
|
let subType;
|
|
29
29
|
if (columnDescription.enumValues?.length) {
|
|
30
30
|
subType = {
|
|
@@ -121,4 +121,4 @@ class SqlTypeConverter {
|
|
|
121
121
|
}
|
|
122
122
|
exports.default = SqlTypeConverter;
|
|
123
123
|
SqlTypeConverter.enumRegex = /ENUM\((.*)\)/i;
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLXR5cGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaGVscGVycy9zcWwtdHlwZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxNQUFxQixnQkFBZ0I7SUFHbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2xCLGVBQXlDLEVBQ3pDLFVBQTZCO1FBRTdCLFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUN2QixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRW5FLEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztnQkFDOUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXRDO2dCQUNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUN4RCxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQTZCO1FBQ3RELE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSxNQUFNLEdBQUcsQ0FBQztZQUN0QyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQ2pELENBQUMsQ0FBQywwREFBMEQ7Z0JBQzFELEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUMxQyxlQUF5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
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { Logger } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { Sequelize } from 'sequelize';
|
|
3
|
-
import {
|
|
3
|
+
import { LatestIntrospection, LegacyIntrospection } from './types';
|
|
4
4
|
export default class Introspector {
|
|
5
5
|
static readonly FORMAT_VERSION = 1;
|
|
6
6
|
static readonly SOURCE = "@forestadmin/datasource-sql";
|
|
7
|
-
static
|
|
8
|
-
static
|
|
7
|
+
static migrateOrIntrospect(sequelize: Sequelize, logger?: Logger, introspection?: LegacyIntrospection): Promise<LatestIntrospection>;
|
|
8
|
+
static introspect(sequelize: Sequelize, logger?: Logger): Promise<LatestIntrospection>;
|
|
9
|
+
static getIntrospectionInLatestFormat(introspection?: LegacyIntrospection): LatestIntrospection | undefined;
|
|
9
10
|
private static migrateIntrospectionInLatestFormat;
|
|
10
11
|
/** Get names of all tables in the public schema of the db */
|
|
11
12
|
private static getTableNames;
|
|
12
13
|
private static getTables;
|
|
13
14
|
/** Instrospect a single table */
|
|
14
15
|
private static getTable;
|
|
16
|
+
private static getTableReferences;
|
|
15
17
|
private static getColumn;
|
|
16
18
|
/**
|
|
17
19
|
* Remove references to entities that are not present in the schema
|
|
@@ -19,5 +21,6 @@ export default class Introspector {
|
|
|
19
21
|
*/
|
|
20
22
|
private static sanitizeInPlace;
|
|
21
23
|
private static logBrokenRelationship;
|
|
24
|
+
private static getViews;
|
|
22
25
|
}
|
|
23
26
|
//# sourceMappingURL=introspector.d.ts.map
|
|
@@ -7,12 +7,19 @@ const dialect_factory_1 = __importDefault(require("./dialects/dialect-factory"))
|
|
|
7
7
|
const default_value_parser_1 = __importDefault(require("./helpers/default-value-parser"));
|
|
8
8
|
const sql_type_converter_1 = __importDefault(require("./helpers/sql-type-converter"));
|
|
9
9
|
class Introspector {
|
|
10
|
+
static async migrateOrIntrospect(sequelize, logger, introspection) {
|
|
11
|
+
const latestIntrospection = this.getIntrospectionInLatestFormat(introspection);
|
|
12
|
+
if (latestIntrospection)
|
|
13
|
+
return latestIntrospection;
|
|
14
|
+
return this.introspect(sequelize, logger);
|
|
15
|
+
}
|
|
10
16
|
static async introspect(sequelize, logger) {
|
|
11
17
|
const dialect = (0, dialect_factory_1.default)(sequelize.getDialect());
|
|
12
18
|
const tableNames = await this.getTableNames(dialect, sequelize);
|
|
13
19
|
const tables = await this.getTables(dialect, tableNames, sequelize, logger);
|
|
20
|
+
const views = await this.getViews(dialect, sequelize, logger);
|
|
14
21
|
this.sanitizeInPlace(tables, logger);
|
|
15
|
-
return { tables, version: this.FORMAT_VERSION, source: this.SOURCE };
|
|
22
|
+
return { tables, views, version: this.FORMAT_VERSION, source: this.SOURCE };
|
|
16
23
|
}
|
|
17
24
|
static getIntrospectionInLatestFormat(introspection) {
|
|
18
25
|
const formattedIntrospection = this.migrateIntrospectionInLatestFormat(introspection);
|
|
@@ -34,26 +41,22 @@ class Introspector {
|
|
|
34
41
|
return formattedIntrospection;
|
|
35
42
|
}
|
|
36
43
|
static migrateIntrospectionInLatestFormat(introspection) {
|
|
37
|
-
if (!introspection)
|
|
44
|
+
if (!introspection)
|
|
38
45
|
return undefined;
|
|
39
|
-
}
|
|
40
46
|
// First version of introspection: just an array of tables
|
|
41
47
|
if (Array.isArray(introspection)) {
|
|
42
48
|
return {
|
|
43
49
|
tables: introspection,
|
|
50
|
+
views: [],
|
|
44
51
|
version: this.FORMAT_VERSION,
|
|
45
52
|
source: this.SOURCE,
|
|
46
53
|
};
|
|
47
54
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
source: this.SOURCE,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
return introspection;
|
|
55
|
+
return {
|
|
56
|
+
...introspection,
|
|
57
|
+
source: introspection.source || this.SOURCE,
|
|
58
|
+
views: introspection.views || [],
|
|
59
|
+
};
|
|
57
60
|
}
|
|
58
61
|
/** Get names of all tables in the public schema of the db */
|
|
59
62
|
static async getTableNames(dialect, sequelize) {
|
|
@@ -89,23 +92,10 @@ class Introspector {
|
|
|
89
92
|
// Plus it has some bugs with schema handling in postgresql that forces us to be sure that
|
|
90
93
|
// the table identifier is correct on our side
|
|
91
94
|
const tableIdentifierForQuery = dialect.getTableIdentifier(tableIdentifier);
|
|
92
|
-
const [tableIndexes,
|
|
95
|
+
const [tableIndexes, references] = await Promise.all([
|
|
93
96
|
queryInterface.showIndex(tableIdentifierForQuery),
|
|
94
|
-
|
|
97
|
+
this.getTableReferences(tableIdentifier, tableIdentifierForQuery, queryInterface),
|
|
95
98
|
]);
|
|
96
|
-
const references = tableReferences
|
|
97
|
-
.map(tableReference => ({
|
|
98
|
-
...tableReference,
|
|
99
|
-
tableName: typeof tableReference.tableName === 'string'
|
|
100
|
-
? tableReference.tableName
|
|
101
|
-
: // On SQLite, the query interface returns an object with a tableName property
|
|
102
|
-
tableReference.tableName.tableName,
|
|
103
|
-
}))
|
|
104
|
-
.filter(
|
|
105
|
-
// There is a bug right now with sequelize on postgresql: returned association
|
|
106
|
-
// are not filtered on the schema. So we have to filter them manually.
|
|
107
|
-
// Should be fixed with Sequelize v7
|
|
108
|
-
r => r.tableName === tableIdentifier.tableName && r.tableSchema === tableIdentifier.schema);
|
|
109
99
|
const columns = await Promise.all(columnDescriptions.map(async (columnDescription) => {
|
|
110
100
|
const columnReferences = references.filter(r => r.columnName === columnDescription.name);
|
|
111
101
|
const options = {
|
|
@@ -124,6 +114,22 @@ class Introspector {
|
|
|
124
114
|
.map(i => i.fields.map(f => f.attribute)),
|
|
125
115
|
};
|
|
126
116
|
}
|
|
117
|
+
static async getTableReferences(tableIdentifier, tableIdentifierForQuery, queryInterface) {
|
|
118
|
+
const tableReferences = await queryInterface.getForeignKeyReferencesForTable(tableIdentifierForQuery);
|
|
119
|
+
return tableReferences
|
|
120
|
+
.map(tableReference => ({
|
|
121
|
+
...tableReference,
|
|
122
|
+
tableName: typeof tableReference.tableName === 'string'
|
|
123
|
+
? tableReference.tableName
|
|
124
|
+
: // On SQLite, the query interface returns an object with a tableName property
|
|
125
|
+
tableReference.tableName.tableName,
|
|
126
|
+
}))
|
|
127
|
+
.filter(
|
|
128
|
+
// There is a bug right now with sequelize on postgresql: returned association
|
|
129
|
+
// are not filtered on the schema. So we have to filter them manually.
|
|
130
|
+
// Should be fixed with Sequelize v7
|
|
131
|
+
r => r.tableName === tableIdentifier.tableName && r.tableSchema === tableIdentifier.schema);
|
|
132
|
+
}
|
|
127
133
|
static async getColumn(sequelize, logger, tableIdentifier, options) {
|
|
128
134
|
const { name, description, references } = options;
|
|
129
135
|
try {
|
|
@@ -155,7 +161,7 @@ class Introspector {
|
|
|
155
161
|
*/
|
|
156
162
|
static sanitizeInPlace(tables, logger) {
|
|
157
163
|
for (const table of tables) {
|
|
158
|
-
// Remove unique indexes which
|
|
164
|
+
// Remove unique indexes which depend on columns that are not present in the table.
|
|
159
165
|
table.unique = table.unique.filter(unique => unique.every(column => table.columns.find(c => c.name === column)));
|
|
160
166
|
for (const column of table.columns) {
|
|
161
167
|
const references = column.constraints || [];
|
|
@@ -177,8 +183,29 @@ class Introspector {
|
|
|
177
183
|
`Failed to load constraints on relation on table '${tableName}' referencing '${constraint.table}.${constraint.column}'. The relation will be ignored.`);
|
|
178
184
|
});
|
|
179
185
|
}
|
|
186
|
+
static async getViews(dialect, sequelize, logger) {
|
|
187
|
+
const viewNames = await dialect.listViews(sequelize);
|
|
188
|
+
const allColumns = await dialect.listColumns(viewNames, sequelize);
|
|
189
|
+
return Promise.all(viewNames.map(async (viewName, index) => {
|
|
190
|
+
const viewColumns = allColumns[index];
|
|
191
|
+
const columns = await Promise.all(viewColumns.map(async (columnDescription) => {
|
|
192
|
+
const options = {
|
|
193
|
+
name: columnDescription.name,
|
|
194
|
+
description: columnDescription,
|
|
195
|
+
references: [],
|
|
196
|
+
};
|
|
197
|
+
return this.getColumn(sequelize, logger, viewName, options);
|
|
198
|
+
}));
|
|
199
|
+
return {
|
|
200
|
+
name: viewName.tableName,
|
|
201
|
+
schema: viewName.schema,
|
|
202
|
+
columns: columns.filter(Boolean),
|
|
203
|
+
unique: [],
|
|
204
|
+
};
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
180
207
|
}
|
|
181
208
|
exports.default = Introspector;
|
|
182
209
|
Introspector.FORMAT_VERSION = 1;
|
|
183
210
|
Introspector.SOURCE = '@forestadmin/datasource-sql';
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaW50cm9zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0EsaUZBQXFFO0FBRXJFLDBGQUFnRTtBQUNoRSxzRkFBNEQ7QUFTNUQsTUFBcUIsWUFBWTtJQUkvQixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFvQixFQUFFLE1BQWU7UUFDM0QsTUFBTSxPQUFPLEdBQUcsSUFBQSx5QkFBMkIsRUFBQyxTQUFTLENBQUMsVUFBVSxFQUFhLENBQUMsQ0FBQztRQUUvRSxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQWlDLENBQUMsQ0FBQztRQUN4RixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxNQUFNLENBQUMsOEJBQThCLENBQ25DLGFBQW9FO1FBRXBFLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXRGLElBQUksc0JBQXNCLElBQUksc0JBQXNCLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDM0UsTUFBTSxJQUFJLEtBQUs7WUFDYixtQ0FBbUM7WUFDbkMsa0dBQWtHLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUNuSSxDQUFDO1NBQ0g7UUFFRCxJQUFJLHNCQUFzQixJQUFJLHNCQUFzQixD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
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaW50cm9zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0EsaUZBQXFFO0FBRXJFLDBGQUFnRTtBQUNoRSxzRkFBNEQ7QUFTNUQsTUFBcUIsWUFBWTtJQUkvQixNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUM5QixTQUFvQixFQUNwQixNQUFlLEVBQ2YsYUFBbUM7UUFFbkMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFL0UsSUFBSSxtQkFBbUI7WUFBRSxPQUFPLG1CQUFtQixDQUFDO1FBRXBELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQW9CLEVBQUUsTUFBZTtRQUMzRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUEyQixFQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQWEsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsU0FBaUMsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1RSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQWlDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFdEYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFj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
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default function listCollectionsFromIntrospection(introspection:
|
|
1
|
+
import { LegacyIntrospection } from './types';
|
|
2
|
+
export default function listCollectionsFromIntrospection(introspection: LegacyIntrospection): string[];
|
|
3
3
|
//# sourceMappingURL=list-collections-from-introspection.d.ts.map
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const introspector_1 = __importDefault(require("./introspector"));
|
|
3
7
|
function listCollectionsFromIntrospection(introspection) {
|
|
4
8
|
if (!introspection) {
|
|
5
9
|
return [];
|
|
6
10
|
}
|
|
7
|
-
|
|
8
|
-
const tables = Array.isArray(introspection) ? introspection : introspection.tables;
|
|
9
|
-
return tables.map(table => table.name);
|
|
11
|
+
return introspector_1.default.getIntrospectionInLatestFormat(introspection).tables.map(table => table.name);
|
|
10
12
|
}
|
|
11
13
|
exports.default = listCollectionsFromIntrospection;
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1jb2xsZWN0aW9ucy1mcm9tLWludHJvc3BlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50cm9zcGVjdGlvbi9saXN0LWNvbGxlY3Rpb25zLWZyb20taW50cm9zcGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtFQUEwQztBQUcxQyxTQUF3QixnQ0FBZ0MsQ0FDdEQsYUFBa0M7SUFFbEMsSUFBSSxDQUFDLGFBQWEsRUFBRTtRQUNsQixPQUFPLEVBQUUsQ0FBQztLQUNYO0lBRUQsT0FBTyxzQkFBWSxDQUFDLDhCQUE4QixDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEcsQ0FBQztBQVJELG1EQVFDIn0=
|
|
@@ -38,11 +38,12 @@ export type Table = {
|
|
|
38
38
|
}[];
|
|
39
39
|
}[];
|
|
40
40
|
};
|
|
41
|
-
export type
|
|
41
|
+
export type ObjectIntrospection = {
|
|
42
42
|
tables: Table[];
|
|
43
43
|
version: number;
|
|
44
|
+
source?: '@forestadmin/datasource-sql';
|
|
45
|
+
views?: Table[];
|
|
44
46
|
};
|
|
45
|
-
export type
|
|
46
|
-
|
|
47
|
-
};
|
|
47
|
+
export type LegacyIntrospection = ObjectIntrospection | Table[];
|
|
48
|
+
export type LatestIntrospection = Required<ObjectIntrospection>;
|
|
48
49
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Logger } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { Sequelize } from 'sequelize';
|
|
3
|
-
import {
|
|
3
|
+
import { LatestIntrospection } from '../introspection/types';
|
|
4
4
|
export default class ModelBuilder {
|
|
5
|
-
static defineModels(sequelize: Sequelize, logger: Logger,
|
|
6
|
-
private static
|
|
5
|
+
static defineModels(sequelize: Sequelize, logger: Logger, introspection: LatestIntrospection): void;
|
|
6
|
+
private static defineModelFromTable;
|
|
7
7
|
private static buildModelAttributes;
|
|
8
8
|
/**
|
|
9
9
|
* When the primary key is missing, we attempt to find a column that may act as such.
|
|
@@ -6,12 +6,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const sequelize_1 = require("sequelize");
|
|
7
7
|
const sequelize_type_1 = __importDefault(require("./helpers/sequelize-type"));
|
|
8
8
|
class ModelBuilder {
|
|
9
|
-
static defineModels(sequelize, logger,
|
|
10
|
-
for (const table of tables) {
|
|
11
|
-
this.
|
|
9
|
+
static defineModels(sequelize, logger, introspection) {
|
|
10
|
+
for (const table of introspection.tables) {
|
|
11
|
+
this.defineModelFromTable(sequelize, logger, table);
|
|
12
|
+
}
|
|
13
|
+
for (const table of introspection.views) {
|
|
14
|
+
this.defineModelFromTable(sequelize, logger, { ...table, view: true });
|
|
12
15
|
}
|
|
13
16
|
}
|
|
14
|
-
static
|
|
17
|
+
static defineModelFromTable(sequelize, logger, table) {
|
|
15
18
|
const hasTimestamps = this.hasTimestamps(table);
|
|
16
19
|
const isParanoid = this.isParanoid(table);
|
|
17
20
|
const dialect = sequelize.getDialect();
|
|
@@ -75,22 +78,29 @@ class ModelBuilder {
|
|
|
75
78
|
*/
|
|
76
79
|
static guessPrimaryKeyInPlace(logger, table, attributes) {
|
|
77
80
|
// Try to find a column named "id".
|
|
78
|
-
|
|
81
|
+
const columnId = table.columns.find(c => c.name.toLowerCase() === 'id')?.name;
|
|
82
|
+
let primaryKeys = columnId ? [columnId] : [];
|
|
79
83
|
// If there is no id column, look at unique indexes, and use the shortest one.
|
|
80
84
|
// (hopefully only one column, but this can also be a composite key for many-to-many tables)
|
|
81
85
|
if (!primaryKeys.length && table.unique.length) {
|
|
82
86
|
[primaryKeys] = [...table.unique].sort((a, b) => a.length - b.length);
|
|
83
87
|
}
|
|
84
|
-
// If all the columns have
|
|
88
|
+
// If all the columns have constraints (e.g. foreign keys), use all of them as a composite key.
|
|
85
89
|
if (!primaryKeys.length &&
|
|
86
90
|
table.columns.length === 2 &&
|
|
87
91
|
table.columns.every(c => c.constraints.length)) {
|
|
88
92
|
primaryKeys = table.columns.map(c => c.name);
|
|
89
93
|
}
|
|
94
|
+
// in case of views, it may occur that there is no primary key defined
|
|
95
|
+
// in this case, we just pick an arbitrary colum, since it will be read-only anyway
|
|
96
|
+
if (!primaryKeys.length && table.view) {
|
|
97
|
+
primaryKeys = Object.keys(attributes).slice(0, 1);
|
|
98
|
+
}
|
|
90
99
|
for (const column of primaryKeys) {
|
|
91
100
|
attributes[column].primaryKey = true;
|
|
92
101
|
}
|
|
93
|
-
|
|
102
|
+
// View does not have primary key, so we don't need to warn about it. It is the normal behavior.
|
|
103
|
+
if (primaryKeys.length && !table.view) {
|
|
94
104
|
logger?.('Warn', `Table "${table.name}" has no primary key. Using "${primaryKeys.join(', ')}".`);
|
|
95
105
|
}
|
|
96
106
|
}
|
|
@@ -103,4 +113,4 @@ class ModelBuilder {
|
|
|
103
113
|
}
|
|
104
114
|
}
|
|
105
115
|
exports.default = ModelBuilder;
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JtLWJ1aWxkZXIvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSx5Q0FBK0Q7QUFJL0QsOEVBQTREO0FBSzVELE1BQXFCLFlBQVk7SUFDL0IsTUFBTSxDQUFDLFlBQVksQ0FDakIsU0FBb0IsRUFDcEIsTUFBYyxFQUNkLGFBQWtDO1FBRWxDLEtBQUssTUFBTSxLQUFLLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtZQUN4QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNyRDtRQUVELEtBQUssTUFBTSxLQUFLLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRTtZQUN2QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3hFO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDakMsU0FBb0IsRUFDcEIsTUFBYyxFQUNkLEtBQWtCO1FBRWxCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVoRyxJQUFJO1lBQ0YsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDckQsU0FBUyxFQUFF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
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Logger } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { Sequelize } from 'sequelize';
|
|
3
|
-
import {
|
|
3
|
+
import { LatestIntrospection } from '../introspection/types';
|
|
4
4
|
export default class RelationBuilder {
|
|
5
|
-
static defineRelations(sequelize: Sequelize, logger: Logger,
|
|
5
|
+
static defineRelations(sequelize: Sequelize, logger: Logger, introspection: LatestIntrospection): void;
|
|
6
6
|
private static defineTableRelations;
|
|
7
7
|
private static defineRelation;
|
|
8
8
|
}
|
|
@@ -6,9 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const relation_extractor_1 = __importDefault(require("./helpers/relation-extractor"));
|
|
7
7
|
const relation_name_generator_1 = __importDefault(require("./helpers/relation-name-generator"));
|
|
8
8
|
class RelationBuilder {
|
|
9
|
-
static defineRelations(sequelize, logger,
|
|
10
|
-
for (const table of tables) {
|
|
11
|
-
this.defineTableRelations(sequelize, logger, table, tables);
|
|
9
|
+
static defineRelations(sequelize, logger, introspection) {
|
|
10
|
+
for (const table of [...introspection.tables, ...introspection.views]) {
|
|
11
|
+
this.defineTableRelations(sequelize, logger, table, introspection.tables);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
static defineTableRelations(sequelize, logger, table, tables) {
|
|
@@ -61,4 +61,4 @@ class RelationBuilder {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
exports.default = RelationBuilder;
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29ybS1idWlsZGVyL3JlbGF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUlBLHNGQUE2RDtBQUM3RCxnR0FBc0U7QUFJdEUsTUFBcUIsZUFBZTtJQUNsQyxNQUFNLENBQUMsZUFBZSxDQUNwQixTQUFvQixFQUNwQixNQUFjLEVBQ2QsYUFBa0M7UUFFbEMsS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDakMsU0FBb0IsRUFDcEIsTUFBYyxFQUNkLEtBQVksRUFDWixNQUFlO1FBRWYsTUFBTSxTQUFTLEdBQUcsNEJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEUsTUFBTSxhQUFhLEdBQUcsaUNBQXFCLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXJGLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkQsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWhDLElBQUk7Z0JBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzlDO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLHNCQUFzQixLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQzVGO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFvQixFQUFFLFFBQWtCLEVBQUUsRUFBVTtRQUNoRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVqRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ2pDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO2dCQUNqQyxFQUFFO2dCQUNGLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtnQkFDL0IsU0FBUyxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0I7YUFDckMsQ0FBQyxDQUFDO1NBQ0o7YUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3RDLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUMvQixFQUFFO2dCQUNGLFVBQVUsRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDOUIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxlQUFlO2FBQ3BDLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLGVBQWUsRUFBRTtZQUM1QyxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRTtnQkFDckMsRUFBRTtnQkFDRixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87Z0JBQ3pCLFFBQVEsRUFBRSxRQUFRLENBQUMsVUFBVTtnQkFDN0IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxTQUFTO2dCQUM5QixTQUFTLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtnQkFDcEMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxlQUFlO2FBQ3BDLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNyQyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDOUIsRUFBRTtnQkFDRixVQUFVLEVBQUUsUUFBUSxDQUFDLFNBQVM7Z0JBQzlCLFNBQVMsRUFBRSxRQUFRLENBQUMsZUFBZTthQUNwQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Q0FDRjtBQWhFRCxrQ0FnRUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/datasource-sql",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
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.
|
|
15
|
+
"@forestadmin/datasource-sequelize": "1.8.0",
|
|
16
16
|
"@forestadmin/datasource-toolkit": "1.32.2",
|
|
17
17
|
"pluralize": "^8.0.0",
|
|
18
18
|
"sequelize": "^6.28.0",
|