@goatlab/fluent 0.7.6 → 0.7.11

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.
Files changed (86) hide show
  1. package/dist/BaseConnector.d.ts +8 -31
  2. package/dist/BaseConnector.js +11 -104
  3. package/dist/FluentConnectorInterface.d.ts +17 -0
  4. package/dist/FluentConnectorInterface.js +2 -0
  5. package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +8 -12
  6. package/dist/TypeOrmConnector/TypeOrmConnector.js +183 -546
  7. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.d.ts +7 -0
  8. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js +148 -0
  9. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.d.ts +6 -0
  10. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js +34 -0
  11. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.d.ts +4 -0
  12. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js +12 -0
  13. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.d.ts +6 -0
  14. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js +166 -0
  15. package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.d.ts +8 -0
  16. package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js +200 -0
  17. package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.d.ts +6 -0
  18. package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js +207 -0
  19. package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +164 -0
  20. package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +3 -3
  21. package/dist/TypeOrmConnector/test/basic/goat.entity.js +1 -1
  22. package/dist/TypeOrmConnector/test/docker/docker.d.ts +1 -1
  23. package/dist/TypeOrmConnector/test/docker/docker.js +3 -4
  24. package/dist/TypeOrmConnector/test/docker/mongo.d.ts +16 -0
  25. package/dist/TypeOrmConnector/test/docker/mongo.js +93 -0
  26. package/dist/TypeOrmConnector/test/docker/mysql.js +1 -1
  27. package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +4 -2
  28. package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +6 -1
  29. package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +3 -2
  30. package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +3 -1
  31. package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +2 -2
  32. package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +2 -1
  33. package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +6 -2
  34. package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +10 -1
  35. package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +1 -1
  36. package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +3 -2
  37. package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +3 -1
  38. package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +2 -2
  39. package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +2 -1
  40. package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +0 -1
  41. package/dist/TypeOrmConnector/test/relations/car/car.entity.js +0 -8
  42. package/dist/TypeOrmConnector/test/relations/car/car.output.schema.d.ts +511 -0
  43. package/dist/TypeOrmConnector/test/relations/car/car.output.schema.js +8 -0
  44. package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +4 -2
  45. package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +6 -1
  46. package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +2 -25
  47. package/dist/TypeOrmConnector/test/relations/car/car.schema.js +3 -8
  48. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +1 -1
  49. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +435 -35
  50. package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.d.ts +152 -0
  51. package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.js +14 -0
  52. package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +2 -25
  53. package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +2 -10
  54. package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -2
  55. package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +3 -1
  56. package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +2 -2
  57. package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +2 -1
  58. package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +465 -69
  59. package/dist/TypeOrmConnector/test/relations/user/user.schema.js +54 -5
  60. package/dist/TypeOrmConnector/util/clearEmpties.d.ts +1 -0
  61. package/dist/TypeOrmConnector/util/clearEmpties.js +25 -0
  62. package/dist/TypeOrmConnector/util/extractConditions.d.ts +6 -0
  63. package/dist/TypeOrmConnector/util/extractConditions.js +80 -0
  64. package/dist/TypeOrmConnector/util/extractInclude.d.ts +2 -0
  65. package/dist/TypeOrmConnector/util/extractInclude.js +25 -0
  66. package/dist/TypeOrmConnector/util/extractMetadataFromKeys.d.ts +12 -0
  67. package/dist/TypeOrmConnector/util/extractMetadataFromKeys.js +42 -0
  68. package/dist/TypeOrmConnector/util/extractOrderBy.d.ts +4 -0
  69. package/dist/TypeOrmConnector/util/extractOrderBy.js +18 -0
  70. package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.d.ts +19 -0
  71. package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.js +26 -0
  72. package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.d.ts +1 -0
  73. package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.js +20 -0
  74. package/dist/TypeOrmConnector/util/isAnyObject.d.ts +1 -0
  75. package/dist/TypeOrmConnector/util/isAnyObject.js +7 -0
  76. package/dist/TypeOrmConnector/util/nestQueryResults.d.ts +2 -0
  77. package/dist/TypeOrmConnector/util/nestQueryResults.js +31 -0
  78. package/dist/index.d.ts +12 -5
  79. package/dist/index.js +15 -2
  80. package/dist/loadRelations.js +8 -10
  81. package/dist/tsconfig.tsbuildinfo +1 -1
  82. package/dist/types.d.ts +37 -20
  83. package/package.json +4 -3
  84. package/CHANGELOG.md +0 -1072
  85. package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +0 -4
  86. package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +0 -43
@@ -0,0 +1,7 @@
1
+ import { AnyObject, FluentQuery } from '../../../types';
2
+ export interface getMongoBaseAggregationParams {
3
+ include: FluentQuery<AnyObject>['include'];
4
+ self: any;
5
+ alias?: string;
6
+ }
7
+ export declare const getMongoBaseAggregation: ({ include, self }: getMongoBaseAggregationParams) => any[];
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMongoBaseAggregation = void 0;
4
+ const getMongoWhere_1 = require("./getMongoWhere");
5
+ const getMongoBaseAggregation = ({ include, self }) => {
6
+ if (!include) {
7
+ return [];
8
+ }
9
+ const modelRelations = self.modelRelations;
10
+ const aggregations = [];
11
+ for (const relation of Object.keys(include)) {
12
+ if (!modelRelations[relation]) {
13
+ continue;
14
+ }
15
+ const innerLookups = [];
16
+ const dbRelation = modelRelations[relation];
17
+ if (include[relation]['include']) {
18
+ const newSelf = self[relation] && self[relation]();
19
+ const innerRelations = (0, exports.getMongoBaseAggregation)({
20
+ include: include[relation]['include'],
21
+ self: newSelf
22
+ });
23
+ innerLookups.push(...innerRelations);
24
+ }
25
+ const where = (0, getMongoWhere_1.getMongoWhere)({
26
+ where: include[relation]['where']
27
+ });
28
+ if (dbRelation.isManyToOne) {
29
+ const localField = dbRelation.joinColumns[0].propertyPath;
30
+ aggregations.push({
31
+ $addFields: {
32
+ [`${localField}_object`]: { $toObjectId: `$${localField}` }
33
+ }
34
+ });
35
+ aggregations.push({ $addFields: { id: { $toString: '$_id' } } });
36
+ aggregations.push({
37
+ $lookup: {
38
+ from: dbRelation.tableName,
39
+ localField: `${localField}_object`,
40
+ foreignField: '_id',
41
+ as: dbRelation.propertyName,
42
+ pipeline: [
43
+ {
44
+ $match: where
45
+ },
46
+ { $addFields: { id: { $toString: '$_id' } } },
47
+ ...innerLookups
48
+ ]
49
+ }
50
+ });
51
+ aggregations.push({
52
+ $unwind: {
53
+ path: `$${dbRelation.propertyName}`,
54
+ preserveNullAndEmptyArrays: true
55
+ }
56
+ });
57
+ }
58
+ if (dbRelation.isOneToMany) {
59
+ aggregations.push({ $addFields: { string_id: { $toString: '$_id' } } });
60
+ aggregations.push({ $addFields: { id: { $toString: '$_id' } } });
61
+ aggregations.push({
62
+ $lookup: {
63
+ from: dbRelation.tableName,
64
+ localField: 'string_id',
65
+ foreignField: dbRelation.inverseSidePropertyPath,
66
+ as: dbRelation.propertyName,
67
+ pipeline: [
68
+ {
69
+ $match: where
70
+ },
71
+ { $addFields: { id: { $toString: '$_id' } } },
72
+ ...innerLookups
73
+ ]
74
+ }
75
+ });
76
+ }
77
+ if (dbRelation.isManyToMany) {
78
+ const relatedTableName = dbRelation.tableName;
79
+ const pivotTableName = dbRelation.joinColumns[0].relationMetadata.joinTableName;
80
+ const pivotForeignField = dbRelation.joinColumns[0].propertyPath;
81
+ const inverseForeignField = dbRelation.inverseJoinColumns[0].propertyPath;
82
+ if (!relatedTableName ||
83
+ !pivotTableName ||
84
+ !pivotForeignField ||
85
+ !inverseForeignField) {
86
+ throw new Error(`Your many to many relation is not properly set up. Please check both your models and schema for relation: ${relation}`);
87
+ }
88
+ aggregations.push({ $addFields: { id: { $toString: '$_id' } } });
89
+ aggregations.push({
90
+ $addFields: { parent_string_id: { $toString: '$_id' } }
91
+ });
92
+ aggregations.push({
93
+ $lookup: {
94
+ from: pivotTableName,
95
+ localField: 'parent_string_id',
96
+ foreignField: pivotForeignField,
97
+ as: dbRelation.propertyName,
98
+ pipeline: [
99
+ { $addFields: { id: { $toString: '$_id' } } },
100
+ {
101
+ $addFields: {
102
+ [`${inverseForeignField}_object`]: {
103
+ $toObjectId: `$${inverseForeignField}`
104
+ }
105
+ }
106
+ },
107
+ {
108
+ $lookup: {
109
+ from: relatedTableName,
110
+ localField: `${inverseForeignField}_object`,
111
+ foreignField: '_id',
112
+ pipeline: [
113
+ {
114
+ $match: where
115
+ },
116
+ { $addFields: { id: { $toString: '$_id' } } }
117
+ ],
118
+ as: dbRelation.propertyName
119
+ }
120
+ },
121
+ {
122
+ $unwind: {
123
+ path: `$${dbRelation.propertyName}`,
124
+ preserveNullAndEmptyArrays: true
125
+ }
126
+ },
127
+ {
128
+ $project: {
129
+ [dbRelation.propertyName]: `$${dbRelation.propertyName}`,
130
+ pivot: '$$ROOT'
131
+ }
132
+ },
133
+ {
134
+ $replaceRoot: {
135
+ newRoot: {
136
+ $mergeObjects: ['$$ROOT', `$${dbRelation.propertyName}`]
137
+ }
138
+ }
139
+ },
140
+ { $project: { [dbRelation.propertyName]: 0 } }
141
+ ]
142
+ }
143
+ });
144
+ }
145
+ }
146
+ return aggregations;
147
+ };
148
+ exports.getMongoBaseAggregation = getMongoBaseAggregation;
@@ -0,0 +1,6 @@
1
+ import { FluentQuery } from '../../../types';
2
+ export declare type getFindAggregateQueryParams<T extends FluentQuery<any>> = {
3
+ query?: T;
4
+ self?: any;
5
+ };
6
+ export declare const getMongoFindAggregatedQuery: ({ query, self }: getFindAggregateQueryParams<any>) => any[];
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMongoFindAggregatedQuery = void 0;
4
+ const getMongoBaseAggregations_1 = require("./getMongoBaseAggregations");
5
+ const getMongoSelect_1 = require("./getMongoSelect");
6
+ const getMongoWhere_1 = require("./getMongoWhere");
7
+ const getMongoFindAggregatedQuery = ({ query, self }) => {
8
+ const selected = (0, getMongoSelect_1.getMongoSelect)(query?.select);
9
+ const where = (0, getMongoWhere_1.getMongoWhere)({
10
+ where: query?.where
11
+ });
12
+ const baseAggregations = (0, getMongoBaseAggregations_1.getMongoBaseAggregation)({
13
+ include: query?.include,
14
+ self
15
+ });
16
+ const aggregate = [
17
+ {
18
+ $match: where
19
+ }
20
+ ];
21
+ if (query?.limit) {
22
+ aggregate.push({ $limit: query.limit });
23
+ }
24
+ for (const lookup of baseAggregations) {
25
+ aggregate.push(lookup);
26
+ }
27
+ if (selected && Object.keys(selected).length) {
28
+ aggregate.push({
29
+ $project: selected
30
+ });
31
+ }
32
+ return aggregate;
33
+ };
34
+ exports.getMongoFindAggregatedQuery = getMongoFindAggregatedQuery;
@@ -0,0 +1,4 @@
1
+ import { FluentQuery } from '../../../types';
2
+ export declare const getMongoSelect: (select: FluentQuery<any>['select']) => {
3
+ [key: string]: any;
4
+ };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMongoSelect = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const getMongoSelect = (select) => {
6
+ const selected = js_utils_1.Objects.flatten(select || {});
7
+ for (const k of Object.keys(selected)) {
8
+ selected[k] = 1;
9
+ }
10
+ return selected;
11
+ };
12
+ exports.getMongoSelect = getMongoSelect;
@@ -0,0 +1,6 @@
1
+ import { FindManyOptions } from 'typeorm';
2
+ import { AnyObject, FluentQuery } from '../../../types';
3
+ export interface getTypeOrmMongoWhereParams {
4
+ where?: FluentQuery<AnyObject>['where'];
5
+ }
6
+ export declare const getMongoWhere: ({ where }: getTypeOrmMongoWhereParams) => FindManyOptions['where'];
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMongoWhere = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const clearEmpties_1 = require("../../util/clearEmpties");
6
+ const types_1 = require("../../../types");
7
+ const extractConditions_1 = require("../../util/extractConditions");
8
+ const getMongoWhere = ({ where }) => {
9
+ if (!where || Object.keys(where).length === 0) {
10
+ return {};
11
+ }
12
+ const Filters = {
13
+ where: { $or: [{ $and: [] }] }
14
+ };
15
+ const orConditions = (0, extractConditions_1.extractConditions)(where['OR']);
16
+ const andConditions = (0, extractConditions_1.extractConditions)(where['AND']);
17
+ const copy = js_utils_1.Objects.clone(where);
18
+ if (!!copy['AND']) {
19
+ delete copy['AND'];
20
+ }
21
+ if (!!copy['OR']) {
22
+ delete copy['OR'];
23
+ }
24
+ const rootLevelConditions = (0, extractConditions_1.extractConditions)([copy]);
25
+ for (const condition of andConditions) {
26
+ let { element, operator, value } = condition;
27
+ if (element === 'id') {
28
+ element = '_id';
29
+ value = (Array.isArray(value)
30
+ ? value.map(v => js_utils_1.Ids.objectID(v))
31
+ : js_utils_1.Ids.objectID(value));
32
+ }
33
+ switch (operator) {
34
+ case types_1.LogicOperator.equals:
35
+ Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
36
+ break;
37
+ case types_1.LogicOperator.isNot:
38
+ Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
39
+ break;
40
+ case types_1.LogicOperator.greaterThan:
41
+ Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
42
+ break;
43
+ case types_1.LogicOperator.greaterOrEqualThan:
44
+ Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
45
+ break;
46
+ case types_1.LogicOperator.lessThan:
47
+ Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
48
+ break;
49
+ case types_1.LogicOperator.lessOrEqualThan:
50
+ Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
51
+ break;
52
+ case types_1.LogicOperator.in:
53
+ Filters.where.$or[0].$and.push({ [element]: { $in: value } });
54
+ break;
55
+ case types_1.LogicOperator.notIn:
56
+ Filters.where.$or[0].$and.push({
57
+ [element]: { $not: { $in: value } }
58
+ });
59
+ break;
60
+ case types_1.LogicOperator.exists:
61
+ Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
62
+ break;
63
+ case types_1.LogicOperator.notExists:
64
+ Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
65
+ break;
66
+ case types_1.LogicOperator.regexp:
67
+ Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
68
+ break;
69
+ }
70
+ }
71
+ for (const condition of rootLevelConditions) {
72
+ let { element, operator, value } = condition;
73
+ if (element === 'id') {
74
+ element = '_id';
75
+ value = (Array.isArray(value)
76
+ ? value.map(v => js_utils_1.Ids.objectID(v))
77
+ : js_utils_1.Ids.objectID(value));
78
+ }
79
+ switch (operator) {
80
+ case types_1.LogicOperator.equals:
81
+ Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
82
+ break;
83
+ case types_1.LogicOperator.isNot:
84
+ Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
85
+ break;
86
+ case types_1.LogicOperator.greaterThan:
87
+ Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
88
+ break;
89
+ case types_1.LogicOperator.greaterOrEqualThan:
90
+ Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
91
+ break;
92
+ case types_1.LogicOperator.lessThan:
93
+ Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
94
+ break;
95
+ case types_1.LogicOperator.lessOrEqualThan:
96
+ Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
97
+ break;
98
+ case types_1.LogicOperator.in:
99
+ Filters.where.$or[0].$and.push({ [element]: { $in: value } });
100
+ break;
101
+ case types_1.LogicOperator.notIn:
102
+ Filters.where.$or[0].$and.push({
103
+ [element]: { $not: { $in: value } }
104
+ });
105
+ break;
106
+ case types_1.LogicOperator.exists:
107
+ Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
108
+ break;
109
+ case types_1.LogicOperator.notExists:
110
+ Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
111
+ break;
112
+ case types_1.LogicOperator.regexp:
113
+ Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
114
+ break;
115
+ }
116
+ }
117
+ for (const condition of orConditions) {
118
+ let { element, operator, value } = condition;
119
+ if (element === 'id') {
120
+ element = '_id';
121
+ value = (Array.isArray(value)
122
+ ? value.map(v => js_utils_1.Ids.objectID(v))
123
+ : js_utils_1.Ids.objectID(value));
124
+ }
125
+ switch (operator) {
126
+ case types_1.LogicOperator.equals:
127
+ Filters.where.$or.push({ [element]: { $eq: value } });
128
+ break;
129
+ case types_1.LogicOperator.isNot:
130
+ Filters.where.$or.push({ [element]: { $neq: value } });
131
+ break;
132
+ case types_1.LogicOperator.greaterThan:
133
+ Filters.where.$or.push({ [element]: { $gt: value } });
134
+ break;
135
+ case types_1.LogicOperator.greaterOrEqualThan:
136
+ Filters.where.$or.push({ [element]: { $gte: value } });
137
+ break;
138
+ case types_1.LogicOperator.lessThan:
139
+ Filters.where.$or.push({ [element]: { $lt: value } });
140
+ break;
141
+ case types_1.LogicOperator.lessOrEqualThan:
142
+ Filters.where.$or.push({ [element]: { $lte: value } });
143
+ break;
144
+ case types_1.LogicOperator.in:
145
+ Filters.where.$or.push({ [element]: { $in: value } });
146
+ break;
147
+ case types_1.LogicOperator.notIn:
148
+ Filters.where.$or.push({
149
+ [element]: { $not: { $in: value } }
150
+ });
151
+ break;
152
+ case types_1.LogicOperator.exists:
153
+ Filters.where.$or.push({ [element]: { $exists: true } });
154
+ break;
155
+ case types_1.LogicOperator.notExists:
156
+ Filters.where.$or.push({ [element]: { $exists: false } });
157
+ break;
158
+ case types_1.LogicOperator.regexp:
159
+ Filters.where.$or.push({ [element]: { $regex: value } });
160
+ break;
161
+ }
162
+ }
163
+ const filtered = (0, clearEmpties_1.clearEmpties)(Filters.where);
164
+ return filtered;
165
+ };
166
+ exports.getMongoWhere = getMongoWhere;
@@ -0,0 +1,8 @@
1
+ import { SelectQueryBuilder } from 'typeorm';
2
+ import { AnyObject, FluentQuery } from '../../../types';
3
+ export interface getQueryBuilderWhereParams {
4
+ where?: FluentQuery<AnyObject>['where'];
5
+ queryBuilder: SelectQueryBuilder<any>;
6
+ queryAlias: string;
7
+ }
8
+ export declare const getQueryBuilderWhere: ({ where, queryAlias, queryBuilder }: getQueryBuilderWhereParams) => SelectQueryBuilder<any>;
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getQueryBuilderWhere = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const typeorm_1 = require("typeorm");
6
+ const extractConditions_1 = require("../../util/extractConditions");
7
+ const types_1 = require("../../../types");
8
+ const queryId = js_utils_1.Ids.customId('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
9
+ const getQueryBuilderWhere = ({ where, queryAlias, queryBuilder }) => {
10
+ if (!where || Object.keys(where).length === 0) {
11
+ return queryBuilder;
12
+ }
13
+ const orConditions = (0, extractConditions_1.extractConditions)(where['OR']);
14
+ const andConditions = (0, extractConditions_1.extractConditions)(where['AND']);
15
+ const copy = js_utils_1.Objects.clone(where);
16
+ if (!!copy['AND']) {
17
+ delete copy['AND'];
18
+ }
19
+ if (!!copy['OR']) {
20
+ delete copy['OR'];
21
+ }
22
+ const rootLevelConditions = (0, extractConditions_1.extractConditions)([copy]);
23
+ queryBuilder.andWhere(new typeorm_1.Brackets(qbAnd => {
24
+ for (const condition of andConditions) {
25
+ const { element, operator, value } = condition;
26
+ const customId = queryId(4);
27
+ switch (operator) {
28
+ case types_1.LogicOperator.equals:
29
+ qbAnd.andWhere(`${queryAlias}.${element} = :${element}_${customId}`, {
30
+ [`${element}_${customId}`]: value
31
+ });
32
+ break;
33
+ case types_1.LogicOperator.isNot:
34
+ qbAnd.andWhere(`${queryAlias}.${element} != :${element}_${customId}`, {
35
+ [`${element}_${customId}`]: value
36
+ });
37
+ break;
38
+ case types_1.LogicOperator.greaterThan:
39
+ qbAnd.andWhere(`${queryAlias}.${element} > :${element}_${customId}`, {
40
+ [`${element}_${customId}`]: value
41
+ });
42
+ break;
43
+ case types_1.LogicOperator.greaterOrEqualThan:
44
+ qbAnd.andWhere(`${queryAlias}.${element} >= :${element}_${customId}`, {
45
+ [`${element}_${customId}`]: value
46
+ });
47
+ break;
48
+ case types_1.LogicOperator.lessThan:
49
+ qbAnd.andWhere(`${queryAlias}.${element} < :${element}_${customId}`, {
50
+ [`${element}_${customId}`]: value
51
+ });
52
+ break;
53
+ case types_1.LogicOperator.lessOrEqualThan:
54
+ qbAnd.andWhere(`${queryAlias}.${element} <= :${element}_${customId}`, {
55
+ [`${element}_${customId}`]: value
56
+ });
57
+ break;
58
+ case types_1.LogicOperator.in:
59
+ qbAnd.andWhere(`${queryAlias}.${element} IN :${element}_${customId}`, {
60
+ [`${element}_${customId}`]: value
61
+ });
62
+ break;
63
+ case types_1.LogicOperator.notIn:
64
+ qbAnd.andWhere(`${queryAlias}.${element} NOT IN :${element}_${customId}`, {
65
+ [`${element}_${customId}`]: value
66
+ });
67
+ break;
68
+ case types_1.LogicOperator.exists:
69
+ qbAnd.andWhere(`${queryAlias}.${element} IS NOT NULL`);
70
+ break;
71
+ case types_1.LogicOperator.notExists:
72
+ qbAnd.andWhere(`${queryAlias}.${element} IS NULL`);
73
+ break;
74
+ case types_1.LogicOperator.regexp:
75
+ qbAnd.andWhere(`${queryAlias}.${element} LIKE :${element}_${customId}`, {
76
+ [`${element}_${customId}`]: value
77
+ });
78
+ break;
79
+ }
80
+ }
81
+ for (const condition of rootLevelConditions) {
82
+ const { element, operator, value } = condition;
83
+ const customId = queryId(4);
84
+ switch (operator) {
85
+ case types_1.LogicOperator.equals:
86
+ qbAnd.andWhere(`${queryAlias}.${element} = :${element}_${customId}`, {
87
+ [`${element}_${customId}`]: value
88
+ });
89
+ break;
90
+ case types_1.LogicOperator.isNot:
91
+ qbAnd.andWhere(`${queryAlias}.${element} != :${element}_${customId}`, {
92
+ [`${element}_${customId}`]: value
93
+ });
94
+ break;
95
+ case types_1.LogicOperator.greaterThan:
96
+ qbAnd.andWhere(`${queryAlias}.${element} > :${element}_${customId}`, {
97
+ [`${element}_${customId}`]: value
98
+ });
99
+ break;
100
+ case types_1.LogicOperator.greaterOrEqualThan:
101
+ qbAnd.andWhere(`${queryAlias}.${element} >= :${element}_${customId}`, {
102
+ [`${element}_${customId}`]: value
103
+ });
104
+ break;
105
+ case types_1.LogicOperator.lessThan:
106
+ qbAnd.andWhere(`${queryAlias}.${element} < :${element}_${customId}`, {
107
+ [`${element}_${customId}`]: value
108
+ });
109
+ break;
110
+ case types_1.LogicOperator.lessOrEqualThan:
111
+ qbAnd.andWhere(`${queryAlias}.${element} <= :${element}_${customId}`, {
112
+ [`${element}_${customId}`]: value
113
+ });
114
+ break;
115
+ case types_1.LogicOperator.in:
116
+ qbAnd.andWhere(`${queryAlias}.${element} IN :${element}_${customId}`, {
117
+ [`${element}_${customId}`]: value
118
+ });
119
+ break;
120
+ case types_1.LogicOperator.notIn:
121
+ qbAnd.andWhere(`${queryAlias}.${element} NOT IN :${element}_${customId}`, {
122
+ [`${element}_${customId}`]: value
123
+ });
124
+ break;
125
+ case types_1.LogicOperator.exists:
126
+ qbAnd.andWhere(`${queryAlias}.${element} IS NOT NULL`);
127
+ break;
128
+ case types_1.LogicOperator.notExists:
129
+ qbAnd.andWhere(`${queryAlias}.${element} IS NULL`);
130
+ break;
131
+ case types_1.LogicOperator.regexp:
132
+ qbAnd.andWhere(`${queryAlias}.${element} LIKE :${element}_${customId}`, {
133
+ [`${element}_${customId}`]: value
134
+ });
135
+ break;
136
+ }
137
+ }
138
+ qbAnd.andWhere(new typeorm_1.Brackets(qbOr => {
139
+ for (const condition of orConditions) {
140
+ const { element, operator, value } = condition;
141
+ const customId = queryId(4);
142
+ switch (operator) {
143
+ case types_1.LogicOperator.equals:
144
+ qbOr.andWhere(`${queryAlias}.${element} = :${element}_${customId}`, {
145
+ [`${element}_${customId}`]: value
146
+ });
147
+ break;
148
+ case types_1.LogicOperator.isNot:
149
+ qbOr.andWhere(`${queryAlias}.${element} != :${element}_${customId}`, {
150
+ [`${element}_${customId}`]: value
151
+ });
152
+ break;
153
+ case types_1.LogicOperator.greaterThan:
154
+ qbOr.andWhere(`${queryAlias}.${element} > :${element}_${customId}`, {
155
+ [`${element}_${customId}`]: value
156
+ });
157
+ break;
158
+ case types_1.LogicOperator.greaterOrEqualThan:
159
+ qbOr.andWhere(`${queryAlias}.${element} >= :${element}_${customId}`, {
160
+ [`${element}_${customId}`]: value
161
+ });
162
+ break;
163
+ case types_1.LogicOperator.lessThan:
164
+ qbOr.andWhere(`${queryAlias}.${element} < :${element}_${customId}`, {
165
+ [`${element}_${customId}`]: value
166
+ });
167
+ break;
168
+ case types_1.LogicOperator.lessOrEqualThan:
169
+ qbOr.andWhere(`${queryAlias}.${element} <= :${element}_${customId}`, {
170
+ [`${element}_${customId}`]: value
171
+ });
172
+ break;
173
+ case types_1.LogicOperator.in:
174
+ qbOr.andWhere(`${queryAlias}.${element} IN :${element}_${customId}`, {
175
+ [`${element}_${customId}`]: value
176
+ });
177
+ break;
178
+ case types_1.LogicOperator.notIn:
179
+ qbOr.andWhere(`${queryAlias}.${element} NOT IN :${element}_${customId}`, {
180
+ [`${element}_${customId}`]: value
181
+ });
182
+ break;
183
+ case types_1.LogicOperator.exists:
184
+ qbOr.andWhere(`${queryAlias}.${element} IS NOT NULL`);
185
+ break;
186
+ case types_1.LogicOperator.notExists:
187
+ qbOr.andWhere(`${queryAlias}.${element} IS NULL`);
188
+ break;
189
+ case types_1.LogicOperator.regexp:
190
+ qbOr.andWhere(`${queryAlias}.${element} LIKE :${element}_${customId}`, {
191
+ [`${element}_${customId}`]: value
192
+ });
193
+ break;
194
+ }
195
+ }
196
+ }));
197
+ }));
198
+ return queryBuilder;
199
+ };
200
+ exports.getQueryBuilderWhere = getQueryBuilderWhere;
@@ -0,0 +1,6 @@
1
+ import { FindManyOptions } from 'typeorm';
2
+ import { AnyObject, FluentQuery } from '../../../types';
3
+ export interface getTypeOrmWhereParams {
4
+ where?: FluentQuery<AnyObject>['where'];
5
+ }
6
+ export declare const getTypeOrmWhere: ({ where }: getTypeOrmWhereParams) => FindManyOptions['where'];