@forestadmin/datasource-sequelize 1.0.0-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.
@@ -0,0 +1,16 @@
1
+ import { ModelDefined } from 'sequelize';
2
+ import { AggregateResult, Aggregation, BaseCollection, Caller, DataSource, Filter, Logger, PaginatedFilter, Projection, RecordData } from '@forestadmin/datasource-toolkit';
3
+ export default class SequelizeCollection extends BaseCollection {
4
+ protected model: ModelDefined<any, any>;
5
+ private col;
6
+ private fn;
7
+ private aggregationUtils;
8
+ private queryConverter;
9
+ constructor(name: string, datasource: DataSource, model: ModelDefined<any, any>, logger?: Logger);
10
+ create(caller: Caller, data: RecordData[]): Promise<RecordData[]>;
11
+ list(caller: Caller, filter: PaginatedFilter, projection: Projection): Promise<RecordData[]>;
12
+ update(caller: Caller, filter: Filter, patch: RecordData): Promise<void>;
13
+ delete(caller: Caller, filter: Filter): Promise<void>;
14
+ aggregate(caller: Caller, filter: Filter, aggregation: Aggregation, limit?: number): Promise<AggregateResult[]>;
15
+ }
16
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1,100 @@
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 aggregation_1 = __importDefault(require("./utils/aggregation"));
8
+ const model_to_collection_schema_converter_1 = __importDefault(require("./utils/model-to-collection-schema-converter"));
9
+ const query_converter_1 = __importDefault(require("./utils/query-converter"));
10
+ const serializer_1 = __importDefault(require("./utils/serializer"));
11
+ const error_handler_1 = __importDefault(require("./utils/error-handler"));
12
+ class SequelizeCollection extends datasource_toolkit_1.BaseCollection {
13
+ constructor(name, datasource,
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ model, logger) {
16
+ super(name, datasource);
17
+ if (!model)
18
+ throw new Error('Invalid (null) model instance.');
19
+ this.model = model;
20
+ this.col = this.model.sequelize.col;
21
+ this.fn = this.model.sequelize.fn;
22
+ this.aggregationUtils = new aggregation_1.default(this.model);
23
+ this.queryConverter = new query_converter_1.default(this.model);
24
+ const modelSchema = model_to_collection_schema_converter_1.default.convert(this.model, logger);
25
+ this.enableCount();
26
+ this.addFields(modelSchema.fields);
27
+ this.addSegments(modelSchema.segments);
28
+ }
29
+ async create(caller, data) {
30
+ const records = await (0, error_handler_1.default)('create', () => this.model.bulkCreate(data));
31
+ return records.map(record => serializer_1.default.serialize(record.get({ plain: true })));
32
+ }
33
+ async list(caller, filter, projection) {
34
+ let include = this.queryConverter.getIncludeWithAttributesFromProjection(projection);
35
+ if (filter.conditionTree) {
36
+ include = include.concat(this.queryConverter.getIncludeFromProjection(filter.conditionTree.projection));
37
+ }
38
+ if (filter.sort) {
39
+ include = include.concat(this.queryConverter.getIncludeFromProjection(filter.sort.projection));
40
+ }
41
+ const query = {
42
+ attributes: projection.columns,
43
+ where: this.queryConverter.getWhereFromConditionTree(filter.conditionTree),
44
+ include,
45
+ limit: filter.page?.limit,
46
+ offset: filter.page?.skip,
47
+ order: this.queryConverter.getOrderFromSort(filter.sort),
48
+ subQuery: false,
49
+ };
50
+ const records = await this.model.findAll(query);
51
+ return records.map(record => serializer_1.default.serialize(record.get({ plain: true })));
52
+ }
53
+ async update(caller, filter, patch) {
54
+ const options = {
55
+ where: await this.queryConverter.getWhereFromConditionTreeToByPassInclude(filter.conditionTree),
56
+ fields: Object.keys(patch),
57
+ };
58
+ await (0, error_handler_1.default)('update', () => this.model.update(patch, options));
59
+ }
60
+ async delete(caller, filter) {
61
+ const options = {
62
+ where: await this.queryConverter.getWhereFromConditionTreeToByPassInclude(filter.conditionTree),
63
+ };
64
+ await (0, error_handler_1.default)('delete', () => this.model.destroy(options));
65
+ }
66
+ async aggregate(caller, filter, aggregation, limit) {
67
+ let aggregationField = aggregation.field;
68
+ if (aggregation.operation === 'Count' || !aggregationField) {
69
+ aggregationField = '*';
70
+ }
71
+ else {
72
+ aggregationField = this.aggregationUtils.quoteField(aggregationField);
73
+ }
74
+ const aggregationFunction = this.fn(aggregation.operation.toUpperCase(), this.col(aggregationField));
75
+ const aggregationAttribute = [
76
+ aggregationFunction,
77
+ this.aggregationUtils.aggregateFieldName,
78
+ ];
79
+ const { groups, attributes: groupAttributes } = this.aggregationUtils.getGroupAndAttributesFromAggregation(aggregation.groups);
80
+ let include = this.queryConverter.getIncludeFromProjection(aggregation.projection);
81
+ if (filter.conditionTree) {
82
+ include = include.concat(this.queryConverter.getIncludeFromProjection(filter.conditionTree.projection));
83
+ }
84
+ const order = this.aggregationUtils.getOrder(aggregationFunction);
85
+ const query = {
86
+ attributes: [...groupAttributes, aggregationAttribute],
87
+ group: groups,
88
+ where: this.queryConverter.getWhereFromConditionTree(filter.conditionTree),
89
+ include,
90
+ limit,
91
+ order: [order],
92
+ subQuery: false,
93
+ raw: true,
94
+ };
95
+ const rows = await this.model.findAll(query);
96
+ return this.aggregationUtils.computeResult(rows, aggregation.groups);
97
+ }
98
+ }
99
+ exports.default = SequelizeCollection;
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsd0VBV3lDO0FBRXpDLHNFQUFtRDtBQUNuRCx3SEFBMEU7QUFDMUUsOEVBQXFEO0FBQ3JELG9FQUE0QztBQUM1QywwRUFBaUQ7QUFFakQsTUFBcUIsbUJBQW9CLFNBQVEsbUNBQWM7SUFTN0QsWUFDRSxJQUFZLEVBQ1osVUFBc0I7SUFDdEIsOERBQThEO0lBQzlELEtBQTZCLEVBQzdCLE1BQWU7UUFFZixLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRTlELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHFCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUkseUJBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckQsTUFBTSxXQUFXLEdBQUcsOENBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENB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
@@ -0,0 +1,15 @@
1
+ import { BaseDataSource, Logger } from '@forestadmin/datasource-toolkit';
2
+ import { Sequelize } from 'sequelize';
3
+ import SequelizeCollection from './collection';
4
+ export default class SequelizeDataSource extends BaseDataSource<SequelizeCollection> {
5
+ /**
6
+ * We can't directly use the Sequelize version we install in the package.json
7
+ * as the customer's version may be different.
8
+ * To ensure compatibility, we need to only import types from Sequelize,
9
+ * and use the customer sequelize version to deal with the data manipulation.
10
+ */
11
+ protected sequelize: Sequelize;
12
+ constructor(sequelize: Sequelize, logger?: Logger);
13
+ protected createCollections(models: Sequelize['models'], logger?: Logger): void;
14
+ }
15
+ //# sourceMappingURL=datasource.d.ts.map
@@ -0,0 +1,34 @@
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 collection_1 = __importDefault(require("./collection"));
8
+ class SequelizeDataSource extends datasource_toolkit_1.BaseDataSource {
9
+ constructor(sequelize, logger) {
10
+ super();
11
+ /**
12
+ * We can't directly use the Sequelize version we install in the package.json
13
+ * as the customer's version may be different.
14
+ * To ensure compatibility, we need to only import types from Sequelize,
15
+ * and use the customer sequelize version to deal with the data manipulation.
16
+ */
17
+ this.sequelize = null;
18
+ if (!sequelize)
19
+ throw new Error('Invalid (null) Sequelize instance.');
20
+ this.sequelize = sequelize;
21
+ this.createCollections(this.sequelize.models, logger);
22
+ }
23
+ createCollections(models, logger) {
24
+ Object.values(models)
25
+ // avoid schema reordering
26
+ .sort((modelA, modelB) => (modelA.name > modelB.name ? 1 : -1))
27
+ .forEach(model => {
28
+ const collection = new collection_1.default(model.name, this, model, logger);
29
+ this.addCollection(collection);
30
+ });
31
+ }
32
+ }
33
+ exports.default = SequelizeDataSource;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBQXlFO0FBR3pFLDhEQUErQztBQUUvQyxNQUFxQixtQkFBb0IsU0FBUSxtQ0FBbUM7SUFTbEYsWUFBWSxTQUFvQixFQUFFLE1BQWU7UUFDL0MsS0FBSyxFQUFFLENBQUM7UUFUVjs7Ozs7V0FLRztRQUNPLGNBQVMsR0FBYyxJQUFJLENBQUM7UUFLcEMsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxNQUEyQixFQUFFLE1BQWU7UUFDdEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbkIsMEJBQTBCO2FBQ3pCLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2YsTUFBTSxVQUFVLEdBQUcsSUFBSSxvQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDRjtBQTVCRCxzQ0E0QkMifQ==
@@ -0,0 +1,7 @@
1
+ import { DataSourceFactory } from '@forestadmin/datasource-toolkit';
2
+ import { Sequelize } from 'sequelize';
3
+ export { default as SequelizeCollection } from './collection';
4
+ export { default as SequelizeDataSource } from './datasource';
5
+ export { default as TypeConverter } from './utils/type-converter';
6
+ export declare function createSequelizeDataSource(connection: Sequelize): DataSourceFactory;
7
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
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
+ exports.createSequelizeDataSource = exports.TypeConverter = exports.SequelizeDataSource = exports.SequelizeCollection = void 0;
7
+ const datasource_1 = __importDefault(require("./datasource"));
8
+ var collection_1 = require("./collection");
9
+ Object.defineProperty(exports, "SequelizeCollection", { enumerable: true, get: function () { return __importDefault(collection_1).default; } });
10
+ var datasource_2 = require("./datasource");
11
+ Object.defineProperty(exports, "SequelizeDataSource", { enumerable: true, get: function () { return __importDefault(datasource_2).default; } });
12
+ var type_converter_1 = require("./utils/type-converter");
13
+ Object.defineProperty(exports, "TypeConverter", { enumerable: true, get: function () { return __importDefault(type_converter_1).default; } });
14
+ function createSequelizeDataSource(connection) {
15
+ return async (logger) => new datasource_1.default(connection, logger);
16
+ }
17
+ exports.createSequelizeDataSource = createSequelizeDataSource;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsOERBQStDO0FBRS9DLDJDQUE4RDtBQUFyRCxrSUFBQSxPQUFPLE9BQXVCO0FBQ3ZDLDJDQUE4RDtBQUFyRCxrSUFBQSxPQUFPLE9BQXVCO0FBQ3ZDLHlEQUFrRTtBQUF6RCxnSUFBQSxPQUFPLE9BQWlCO0FBRWpDLFNBQWdCLHlCQUF5QixDQUFDLFVBQXFCO0lBQzdELE9BQU8sS0FBSyxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxvQkFBbUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUZELDhEQUVDIn0=
@@ -0,0 +1,20 @@
1
+ import { AggregateResult, Aggregation } from '@forestadmin/datasource-toolkit';
2
+ import { GroupOption, Model, ModelDefined, ProjectionAlias } from 'sequelize';
3
+ import { Fn } from 'sequelize/types/utils';
4
+ export default class AggregationUtils {
5
+ private model;
6
+ private dialect;
7
+ private col;
8
+ private dateAggregationConverter;
9
+ readonly aggregateFieldName = "__aggregate__";
10
+ constructor(model: ModelDefined<any, any>);
11
+ private getGroupFieldName;
12
+ quoteField(field: string): string;
13
+ getGroupAndAttributesFromAggregation(aggregationQueryGroup: Aggregation['groups']): {
14
+ groups: GroupOption;
15
+ attributes: ProjectionAlias[];
16
+ };
17
+ getOrder(aggregationFunction: Fn): [string | Fn | import("sequelize/types/utils").Col | import("sequelize/types/utils").Literal, string];
18
+ computeResult(rows: Model<any, any>[], aggregationQueryGroup: Aggregation['groups']): AggregateResult[];
19
+ }
20
+ //# sourceMappingURL=aggregation.d.ts.map
@@ -0,0 +1,78 @@
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 date_aggregation_converter_1 = __importDefault(require("./date-aggregation-converter"));
8
+ const serializer_1 = __importDefault(require("./serializer"));
9
+ const un_ambigous_1 = __importDefault(require("./un-ambigous"));
10
+ class AggregationUtils {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ constructor(model) {
13
+ this.aggregateFieldName = '__aggregate__';
14
+ this.model = model;
15
+ this.dialect = this.model.sequelize.getDialect();
16
+ this.col = this.model.sequelize.col;
17
+ this.dateAggregationConverter = new date_aggregation_converter_1.default(this.model.sequelize);
18
+ }
19
+ getGroupFieldName(groupField) {
20
+ return `${groupField}__grouped__`;
21
+ }
22
+ quoteField(field) {
23
+ try {
24
+ const safeField = (0, un_ambigous_1.default)(this.model, field, true);
25
+ return this.model.sequelize.getQueryInterface().quoteIdentifiers(safeField);
26
+ }
27
+ catch {
28
+ throw new datasource_toolkit_1.ValidationError(`Invalid access: "${field}" on "${this.model.name}" does not exist.`);
29
+ }
30
+ }
31
+ getGroupAndAttributesFromAggregation(aggregationQueryGroup) {
32
+ const attributes = [];
33
+ const groups = aggregationQueryGroup?.map(group => {
34
+ const { field } = group;
35
+ const groupFieldName = this.getGroupFieldName(field);
36
+ const groupField = this.quoteField(field);
37
+ if (group.operation) {
38
+ const groupFunction = this.dateAggregationConverter.convertToDialect(groupField, group.operation);
39
+ attributes.push([groupFunction, groupFieldName]);
40
+ return this.dialect === 'mssql' ? groupFunction : groupFieldName;
41
+ }
42
+ attributes.push([this.col(groupField), groupFieldName]);
43
+ return this.dialect === 'mssql' ? groupField : groupFieldName;
44
+ });
45
+ return { groups, attributes };
46
+ }
47
+ getOrder(aggregationFunction) {
48
+ let order;
49
+ // FIXME handle properly order
50
+ switch (this.dialect) {
51
+ case 'postgres':
52
+ order = [this.col(this.aggregateFieldName), 'DESC NULLS LAST'];
53
+ break;
54
+ case 'mssql':
55
+ order = [aggregationFunction, 'DESC'];
56
+ break;
57
+ default:
58
+ order = [this.col(this.aggregateFieldName), 'DESC'];
59
+ }
60
+ return order;
61
+ }
62
+ computeResult(
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ rows, aggregationQueryGroup) {
65
+ return rows.map(aggregate => {
66
+ const aggregateResult = {
67
+ value: aggregate[this.aggregateFieldName],
68
+ group: {},
69
+ };
70
+ aggregationQueryGroup?.forEach(({ field }) => {
71
+ aggregateResult.group[field] = serializer_1.default.serializeValue(aggregate[this.getGroupFieldName(field)]);
72
+ });
73
+ return aggregateResult;
74
+ });
75
+ }
76
+ }
77
+ exports.default = AggregationUtils;
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYWdncmVnYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFBZ0c7QUFZaEcsOEZBQW9FO0FBQ3BFLDhEQUFzQztBQUN0QyxnRUFBNEM7QUFFNUMsTUFBcUIsZ0JBQWdCO0lBVW5DLDhEQUE4RDtJQUM5RCxZQUFZLEtBQTZCO1FBSGhDLHVCQUFrQixHQUFHLGVBQWUsQ0FBQztRQUk1QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBYSxDQUFDO1FBQzVELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBRXBDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLG9DQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFVBQWtCO1FBQzFDLE9BQU8sR0FBRyxVQUFVLGFBQWEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSTtZQUNGLE1BQU0sU0FBUyxHQUFHLElBQUEscUJBQWUsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUzRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDN0U7UUFBQyxNQUFNO1lBQ04sTUFBTSxJQUFJLG9DQUFlLENBQ3ZCLG9CQUFvQixLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLG1CQUFtQixDQUNyRSxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lB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
@@ -0,0 +1,16 @@
1
+ import { Fn } from 'sequelize/types/utils';
2
+ import { Sequelize } from 'sequelize';
3
+ import { DateOperation } from '@forestadmin/datasource-toolkit';
4
+ export default class DateAggregationConverter {
5
+ private dialect;
6
+ private fn;
7
+ private col;
8
+ private literal;
9
+ constructor(sequelize: Sequelize);
10
+ private convertPostgres;
11
+ private convertMssql;
12
+ private convertMysql;
13
+ private convertSqlite;
14
+ convertToDialect(field: string, operation: DateOperation): Fn;
15
+ }
16
+ //# sourceMappingURL=date-aggregation-converter.d.ts.map
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class DateAggregationConverter {
4
+ constructor(sequelize) {
5
+ this.dialect = sequelize.getDialect();
6
+ this.fn = sequelize.fn;
7
+ this.col = sequelize.col;
8
+ this.literal = sequelize.literal;
9
+ }
10
+ convertPostgres(field, operation) {
11
+ const aggregateFunction = this.fn('DATE_TRUNC', operation.toLocaleLowerCase(), this.col(field));
12
+ return this.fn('TO_CHAR', aggregateFunction, 'YYYY-MM-DD');
13
+ }
14
+ convertMssql(field, operation) {
15
+ let dateToConvert;
16
+ switch (operation) {
17
+ case 'Year':
18
+ dateToConvert = this.fn('DATEFROMPARTS', this.fn('DATEPART', this.literal('YEAR'), this.col(field)), '01', '01');
19
+ break;
20
+ case 'Month':
21
+ dateToConvert = this.fn('DATEFROMPARTS', this.fn('DATEPART', this.literal('YEAR'), this.col(field)), this.fn('DATEPART', this.literal('MONTH'), this.col(field)), '01');
22
+ break;
23
+ case 'Week':
24
+ dateToConvert = this.fn('DATEADD', this.literal('DAY'), this.literal(`-DATEPART(dw, ${field})+2`), this.col(field));
25
+ break;
26
+ case 'Day':
27
+ dateToConvert = this.col(field);
28
+ break;
29
+ default:
30
+ throw new Error(`Unknown Date operation: "${operation}"`);
31
+ }
32
+ // eslint-disable-next-line max-len
33
+ // https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15
34
+ return this.fn('CONVERT', this.literal('varchar(10)'), dateToConvert, 23);
35
+ }
36
+ convertMysql(field, operation) {
37
+ let format = '%Y-%m-%d';
38
+ let dateToConvert = this.col(field);
39
+ switch (operation) {
40
+ case 'Year':
41
+ format = '%Y-01-01';
42
+ break;
43
+ case 'Month':
44
+ format = '%Y-%m-01';
45
+ break;
46
+ case 'Week':
47
+ dateToConvert = this.fn('DATE_SUB', this.col(field), this.literal(`INTERVAL(WEEKDAY(${field})) DAY`));
48
+ break;
49
+ case 'Day':
50
+ break;
51
+ default:
52
+ throw new Error(`Unknown Date operation: "${operation}"`);
53
+ }
54
+ return this.fn('DATE_FORMAT', dateToConvert, format);
55
+ }
56
+ convertSqlite(field, operation) {
57
+ if (operation === 'Week') {
58
+ return this.fn('DATE', this.col(field), 'weekday 0');
59
+ }
60
+ let format;
61
+ switch (operation) {
62
+ case 'Year':
63
+ format = '%Y-01-01';
64
+ break;
65
+ case 'Month':
66
+ format = '%Y-%m-01';
67
+ break;
68
+ case 'Day':
69
+ format = '%Y-%m-%d';
70
+ break;
71
+ default:
72
+ throw new Error(`Unknown Date operation: "${operation}"`);
73
+ }
74
+ return this.fn('STRFTIME', format, this.col(field));
75
+ }
76
+ convertToDialect(field, operation) {
77
+ switch (this.dialect) {
78
+ case 'postgres':
79
+ return this.convertPostgres(field, operation);
80
+ case 'mssql':
81
+ return this.convertMssql(field, operation);
82
+ case 'mariadb':
83
+ case 'mysql':
84
+ return this.convertMysql(field, operation);
85
+ case 'sqlite':
86
+ return this.convertSqlite(field, operation);
87
+ default:
88
+ throw new Error(`Unsupported dialect: "${this.dialect}"`);
89
+ }
90
+ }
91
+ }
92
+ exports.default = DateAggregationConverter;
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1hZ2dyZWdhdGlvbi1jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZGF0ZS1hZ2dyZWdhdGlvbi1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxNQUFxQix3QkFBd0I7SUFNM0MsWUFBWSxTQUFvQjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQWEsQ0FBQztRQUNqRCxJQUFJLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNuQyxDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQWEsRUFBRSxTQUF3QjtRQUM3RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVoRyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxZQUFZLENBQUMsS0FBYSxFQUFFLFNBQXdCO1FBQzFELElBQUksYUFBdUIsQ0FBQztRQUU1QixRQUFRLFNBQVMsRUFBRTtZQUNqQixLQUFLLE1BQU07Z0JBQ1QsYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQ3JCLGVBQWUsRUFDZixJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDMUQsSUFBSSxFQUNKLElBQUksQ0FDTCxDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLE9BQU87Z0JBQ1YsYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQ3JCLGVBQWUsRUFDZixJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDMUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQzNELElBQUksQ0FDTCxDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQ3JCLFNBQVMsRUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixLQUFLLEtBQUssQ0FBQyxFQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUNoQixDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLEtBQUs7Z0JBQ1IsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsbUNBQW1DO1FBQ25DLCtIQUErSDtRQUMvSCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBYSxFQUFFLFNBQXdCO1FBQzFELElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUN4QixJQUFJLGFBQWEsR0FBYSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlDLFFBQVEsU0FBUyxFQUFFO1lBQ2pCLEtBQUssTUFBTTtnQkFDVCxNQUFNLEdBQUcsVUFBVSxDQUFDO2dCQUNwQixNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLE1BQU0sR0FBRyxVQUFVLENBQUM7Z0JBQ3BCLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQ3JCLFVBQVUsRUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEtBQUssUUFBUSxDQUFDLENBQ2hELENBQUM7Z0JBQ0YsTUFBTTtZQUNSLEtBQUssS0FBSztnQkFDUixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUM3RDtRQUVELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxhQUFhLENBQUMsS0FBYSxFQUFFLFNBQXdCO1FBQzNELElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLE1BQWMsQ0FBQztRQUVuQixRQUFRLFNBQVMsRUFBRTtZQUNqQixLQUFLLE1BQU07Z0JBQ1QsTUFBTSxHQUFHLFVBQVUsQ0FBQztnQkFDcEIsTUFBTTtZQUNSLEtBQUssT0FBTztnQkFDVixNQUFNLEdBQUcsVUFBVSxDQUFDO2dCQUNwQixNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLE1BQU0sR0FBRyxVQUFVLENBQUM7Z0JBQ3BCLE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFhLEVBQUUsU0FBd0I7UUFDdEQsUUFBUSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3BCLEtBQUssVUFBVTtnQkFDYixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2hELEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRTdDLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFN0MsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFOUM7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDN0Q7SUFDSCxDQUFDO0NBQ0Y7QUFoSUQsMkNBZ0lDIn0=
@@ -0,0 +1,4 @@
1
+ declare type Callback<T> = () => T;
2
+ export default function handleErrors<T>(method: 'create' | 'update' | 'delete', callback: Callback<T>): Promise<T>;
3
+ export {};
4
+ //# sourceMappingURL=error-handler.d.ts.map
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const sequelize_1 = require("sequelize");
4
+ const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
5
+ async function handleErrors(method, callback) {
6
+ try {
7
+ const result = await callback();
8
+ return result;
9
+ }
10
+ catch (e) {
11
+ if (e instanceof sequelize_1.UniqueConstraintError) {
12
+ const message = 'The query violates a unicity constraint in the database. ' +
13
+ 'Please ensure that you are not duplicating information across records.';
14
+ throw new datasource_toolkit_1.ValidationError(message);
15
+ }
16
+ if (e instanceof sequelize_1.ForeignKeyConstraintError) {
17
+ let message = 'The query violates a foreign key constraint in the database. ';
18
+ if (method === 'create' || method === 'update') {
19
+ message += 'Please ensure that you are not linking to a relation which was deleted.';
20
+ }
21
+ else {
22
+ message += 'Please ensure that no records are linked to the one that you wish to delete.';
23
+ }
24
+ throw new datasource_toolkit_1.ValidationError(message);
25
+ }
26
+ throw e;
27
+ }
28
+ }
29
+ exports.default = handleErrors;
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9lcnJvci1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQTZFO0FBQzdFLHdFQUFrRTtBQUluRCxLQUFLLFVBQVUsWUFBWSxDQUN4QyxNQUFzQyxFQUN0QyxRQUFxQjtJQUVyQixJQUFJO1FBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLEVBQUUsQ0FBQztRQUVoQyxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixJQUFJLENBQUMsWUFBWSxpQ0FBcUIsRUFBRTtZQUN0QyxNQUFNLE9BQU8sR0FDWCwyREFBMkQ7Z0JBQzNELHdFQUF3RSxDQUFDO1lBRTNFLE1BQU0sSUFBSSxvQ0FBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxDQUFDLFlBQVkscUNBQXlCLEVBQUU7WUFDMUMsSUFBSSxPQUFPLEdBQUcsK0RBQStELENBQUM7WUFFOUUsSUFBSSxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7Z0JBQzlDLE9BQU8sSUFBSSx5RUFBeUUsQ0FBQzthQUN0RjtpQkFBTTtnQkFDTCxPQUFPLElBQUksOEVBQThFLENBQUM7YUFDM0Y7WUFFRCxNQUFNLElBQUksb0NBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztRQUVELE1BQU0sQ0FBQyxDQUFDO0tBQ1Q7QUFDSCxDQUFDO0FBL0JELCtCQStCQyJ9
@@ -0,0 +1,10 @@
1
+ import { ModelDefined } from 'sequelize';
2
+ import { CollectionSchema, Logger } from '@forestadmin/datasource-toolkit';
3
+ export default class ModelToCollectionSchemaConverter {
4
+ private static convertAssociation;
5
+ private static convertAssociations;
6
+ private static convertAttribute;
7
+ private static convertAttributes;
8
+ static convert(model: ModelDefined<any, any>, logger: Logger): CollectionSchema;
9
+ }
10
+ //# sourceMappingURL=model-to-collection-schema-converter.d.ts.map
@@ -0,0 +1,122 @@
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 type_converter_1 = __importDefault(require("./type-converter"));
8
+ class ModelToCollectionSchemaConverter {
9
+ static convertAssociation(
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ association) {
12
+ switch (association.associationType) {
13
+ case sequelize_1.BelongsTo.name:
14
+ return {
15
+ foreignCollection: association.target.name,
16
+ foreignKey: association.foreignKey,
17
+ foreignKeyTarget: association.targetKey,
18
+ type: 'ManyToOne',
19
+ };
20
+ case sequelize_1.BelongsToMany.name:
21
+ return {
22
+ foreignCollection: association.target.name,
23
+ throughCollection: association.through.model.name,
24
+ originKey: association.foreignKey,
25
+ originKeyTarget: association.sourceKey,
26
+ foreignKey: association.otherKey,
27
+ foreignKeyTarget: association.targetKey,
28
+ type: 'ManyToMany',
29
+ };
30
+ case sequelize_1.HasMany.name:
31
+ return {
32
+ foreignCollection: association.target.name,
33
+ originKey: association.foreignKey,
34
+ originKeyTarget: association.sourceKey,
35
+ type: 'OneToMany',
36
+ };
37
+ case sequelize_1.HasOne.name:
38
+ return {
39
+ foreignCollection: association.target.name,
40
+ originKey: association.foreignKey,
41
+ originKeyTarget: association.sourceKey,
42
+ type: 'OneToOne',
43
+ };
44
+ default:
45
+ throw new Error(`Unsupported association: "${association.associationType}".`);
46
+ }
47
+ }
48
+ static convertAssociations(modelName, associations, logger) {
49
+ const schemaAssociations = {};
50
+ if (associations) {
51
+ Object.entries(associations).forEach(([name, association]) => {
52
+ try {
53
+ schemaAssociations[name] = this.convertAssociation(association);
54
+ }
55
+ catch (error) {
56
+ logger?.('Warn', `Skipping association '${modelName}.${name}' (${error.message})`);
57
+ }
58
+ });
59
+ }
60
+ return schemaAssociations;
61
+ }
62
+ static convertAttribute(attribute) {
63
+ const sequelizeColumnType = attribute.type;
64
+ const columnType = type_converter_1.default.fromDataType(sequelizeColumnType);
65
+ const filterOperators = type_converter_1.default.operatorsForColumnType(columnType);
66
+ const column = {
67
+ columnType,
68
+ filterOperators,
69
+ type: 'Column',
70
+ validation: [],
71
+ isReadOnly: attribute.autoIncrement,
72
+ isSortable: true,
73
+ };
74
+ if (attribute.allowNull === false &&
75
+ !column.isReadOnly &&
76
+ !attribute.defaultValue &&
77
+ // eslint-disable-next-line no-underscore-dangle
78
+ !attribute._autoGenerated) {
79
+ column.validation.push({ operator: 'Present' });
80
+ }
81
+ if (attribute.primaryKey)
82
+ column.isPrimaryKey = true;
83
+ if (attribute.defaultValue !== null &&
84
+ attribute.defaultValue !== undefined &&
85
+ (columnType === 'Json' || typeof attribute.defaultValue !== 'object')) {
86
+ column.defaultValue = attribute.defaultValue;
87
+ }
88
+ if (attribute.values) {
89
+ column.enumValues = [...attribute.values];
90
+ }
91
+ return column;
92
+ }
93
+ static convertAttributes(modelName, attributes, logger) {
94
+ const fields = {};
95
+ Object.entries(attributes).forEach(([name, attribute]) => {
96
+ try {
97
+ fields[name] = this.convertAttribute(attribute);
98
+ }
99
+ catch (error) {
100
+ logger?.('Warn', `Skipping column '${modelName}.${name}' (${error.message})`);
101
+ }
102
+ });
103
+ return fields;
104
+ }
105
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
106
+ static convert(model, logger) {
107
+ if (!model)
108
+ throw new Error('Invalid (null) model.');
109
+ return {
110
+ actions: {},
111
+ countable: true,
112
+ fields: {
113
+ ...this.convertAttributes(model.name, model.getAttributes(), logger),
114
+ ...this.convertAssociations(model.name, model.associations, logger),
115
+ },
116
+ searchable: false,
117
+ segments: [],
118
+ };
119
+ }
120
+ }
121
+ exports.default = ModelToCollectionSchemaConverter;
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtdG8tY29sbGVjdGlvbi1zY2hlbWEtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL21vZGVsLXRvLWNvbGxlY3Rpb24tc2NoZW1hLWNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlDQVdtQjtBQVVuQixzRUFBNkM7QUFFN0MsTUFBcUIsZ0NBQWdDO0lBQzNDLE1BQU0sQ0FBQyxrQkFBa0I7SUFDL0IsOERBQThEO0lBQzlELFdBQTBEO1FBRTFELFFBQVEsV0FBVyxDQUFDLGVBQWUsRUFBRTtZQUNuQyxLQUFLLHFCQUFTLENBQUMsSUFBSTtnQkFDakIsT0FBTztvQkFDTCxpQkFBaUIsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUk7b0JBQzFDLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVTtvQkFDbEMsZ0JBQWdCLEVBQUcsV0FBZ0QsQ0FBQyxTQUFTO29CQUM3RSxJQUFJLEVBQUUsV0FBVztpQkFDbEIsQ0FBQztZQUNKLEtBQUsseUJBQWEsQ0FBQyxJQUFJO2dCQUNyQixPQUFPO29CQUNMLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSTtvQkFDMUMsaUJBQWlCLEVBQUcsV0FBNkIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUk7b0JBQ3BFLFNBQVMsRUFBRyxXQUE2QixDQUFDLFVBQVU7b0JBQ3BELGVBQWUsRUFBRyxXQUE2QixDQUFDLFNBQVM7b0JBQ3pELFVBQVUsRUFBRyxXQUE2QixDQUFDLFFBQVE7b0JBQ25ELGdCQUFnQixFQUFHLFdBQTZCLENBQUMsU0FBUztvQkFDMUQsSUFBSSxFQUFFLFlBQVk7aUJBQ25CLENBQUM7WUFDSixLQUFLLG1CQUFPLENBQUMsSUFBSTtnQkFDZixPQUFPO29CQUNMLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSTtvQkFDMUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxVQUFVO29C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
@@ -0,0 +1,19 @@
1
+ import { ConditionTree, Projection, Sort } from '@forestadmin/datasource-toolkit';
2
+ import { IncludeOptions, ModelDefined, OrderItem, WhereOptions } from 'sequelize';
3
+ export default class QueryConverter {
4
+ private model;
5
+ private dialect;
6
+ private col;
7
+ private fn;
8
+ private where;
9
+ constructor(model: ModelDefined<unknown, unknown>);
10
+ private asArray;
11
+ private makeWhereClause;
12
+ getWhereFromConditionTreeToByPassInclude(conditionTree?: ConditionTree): Promise<WhereOptions>;
13
+ getWhereFromConditionTree(conditionTree?: ConditionTree): WhereOptions;
14
+ private computeIncludeFromProjection;
15
+ getIncludeFromProjection(projection: Projection): IncludeOptions[];
16
+ getIncludeWithAttributesFromProjection(projection: Projection): IncludeOptions[];
17
+ getOrderFromSort(sort: Sort): OrderItem[];
18
+ }
19
+ //# sourceMappingURL=query-converter.d.ts.map