@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.
- package/dist/BaseConnector.d.ts +8 -31
- package/dist/BaseConnector.js +11 -104
- package/dist/FluentConnectorInterface.d.ts +17 -0
- package/dist/FluentConnectorInterface.js +2 -0
- package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +8 -12
- package/dist/TypeOrmConnector/TypeOrmConnector.js +183 -546
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.d.ts +7 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js +148 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js +34 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.d.ts +4 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js +12 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js +166 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.d.ts +8 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js +200 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js +207 -0
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +164 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +3 -3
- package/dist/TypeOrmConnector/test/basic/goat.entity.js +1 -1
- package/dist/TypeOrmConnector/test/docker/docker.d.ts +1 -1
- package/dist/TypeOrmConnector/test/docker/docker.js +3 -4
- package/dist/TypeOrmConnector/test/docker/mongo.d.ts +16 -0
- package/dist/TypeOrmConnector/test/docker/mongo.js +93 -0
- package/dist/TypeOrmConnector/test/docker/mysql.js +1 -1
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +4 -2
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +6 -1
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +3 -2
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +3 -1
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +2 -2
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +2 -1
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +6 -2
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +10 -1
- package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +1 -1
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +3 -2
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +3 -1
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +2 -2
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +2 -1
- package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +0 -1
- package/dist/TypeOrmConnector/test/relations/car/car.entity.js +0 -8
- package/dist/TypeOrmConnector/test/relations/car/car.output.schema.d.ts +511 -0
- package/dist/TypeOrmConnector/test/relations/car/car.output.schema.js +8 -0
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +4 -2
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +6 -1
- package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +2 -25
- package/dist/TypeOrmConnector/test/relations/car/car.schema.js +3 -8
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +1 -1
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +435 -35
- package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.d.ts +152 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.js +14 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +2 -25
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +2 -10
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -2
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +3 -1
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +2 -2
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +2 -1
- package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +465 -69
- package/dist/TypeOrmConnector/test/relations/user/user.schema.js +54 -5
- package/dist/TypeOrmConnector/util/clearEmpties.d.ts +1 -0
- package/dist/TypeOrmConnector/util/clearEmpties.js +25 -0
- package/dist/TypeOrmConnector/util/extractConditions.d.ts +6 -0
- package/dist/TypeOrmConnector/util/extractConditions.js +80 -0
- package/dist/TypeOrmConnector/util/extractInclude.d.ts +2 -0
- package/dist/TypeOrmConnector/util/extractInclude.js +25 -0
- package/dist/TypeOrmConnector/util/extractMetadataFromKeys.d.ts +12 -0
- package/dist/TypeOrmConnector/util/extractMetadataFromKeys.js +42 -0
- package/dist/TypeOrmConnector/util/extractOrderBy.d.ts +4 -0
- package/dist/TypeOrmConnector/util/extractOrderBy.js +18 -0
- package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.d.ts +19 -0
- package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.js +26 -0
- package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.d.ts +1 -0
- package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.js +20 -0
- package/dist/TypeOrmConnector/util/isAnyObject.d.ts +1 -0
- package/dist/TypeOrmConnector/util/isAnyObject.js +7 -0
- package/dist/TypeOrmConnector/util/nestQueryResults.d.ts +2 -0
- package/dist/TypeOrmConnector/util/nestQueryResults.js +31 -0
- package/dist/index.d.ts +12 -5
- package/dist/index.js +15 -2
- package/dist/loadRelations.js +8 -10
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +37 -20
- package/package.json +4 -3
- package/CHANGELOG.md +0 -1072
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +0 -4
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +0 -43
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTypeOrmWhere = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const clearEmpties_1 = require("../..//util/clearEmpties");
|
|
7
|
+
const types_1 = require("../../../types");
|
|
8
|
+
const extractConditions_1 = require("../../util/extractConditions");
|
|
9
|
+
const getTypeOrmWhere = ({ where }) => {
|
|
10
|
+
if (!where || Object.keys(where).length === 0) {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
const Filters = { where: [{}] };
|
|
14
|
+
const orConditions = (0, extractConditions_1.extractConditions)(where['OR']);
|
|
15
|
+
const andConditions = (0, extractConditions_1.extractConditions)(where['AND']);
|
|
16
|
+
const copy = js_utils_1.Objects.clone(where);
|
|
17
|
+
if (!!copy['AND']) {
|
|
18
|
+
delete copy['AND'];
|
|
19
|
+
}
|
|
20
|
+
if (!!copy['OR']) {
|
|
21
|
+
delete copy['OR'];
|
|
22
|
+
}
|
|
23
|
+
const rootLevelConditions = (0, extractConditions_1.extractConditions)([copy]);
|
|
24
|
+
for (const condition of andConditions) {
|
|
25
|
+
const { element, operator, value } = condition;
|
|
26
|
+
switch (operator) {
|
|
27
|
+
case types_1.LogicOperator.equals:
|
|
28
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
29
|
+
...Filters.where[0],
|
|
30
|
+
...{ [element]: (0, typeorm_1.Equal)(value) }
|
|
31
|
+
});
|
|
32
|
+
break;
|
|
33
|
+
case types_1.LogicOperator.isNot:
|
|
34
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
35
|
+
...Filters.where[0],
|
|
36
|
+
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.Equal)(value)) }
|
|
37
|
+
});
|
|
38
|
+
break;
|
|
39
|
+
case types_1.LogicOperator.greaterThan:
|
|
40
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
41
|
+
...Filters.where[0],
|
|
42
|
+
...{ [element]: (0, typeorm_1.MoreThan)(value) }
|
|
43
|
+
});
|
|
44
|
+
break;
|
|
45
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
46
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
47
|
+
...Filters.where[0],
|
|
48
|
+
...{ [element]: (0, typeorm_1.MoreThanOrEqual)(value) }
|
|
49
|
+
});
|
|
50
|
+
break;
|
|
51
|
+
case types_1.LogicOperator.lessThan:
|
|
52
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
53
|
+
...Filters.where[0],
|
|
54
|
+
...{ [element]: (0, typeorm_1.LessThan)(value) }
|
|
55
|
+
});
|
|
56
|
+
break;
|
|
57
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
58
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
59
|
+
...Filters.where[0],
|
|
60
|
+
...{ [element]: (0, typeorm_1.LessThanOrEqual)(value) }
|
|
61
|
+
});
|
|
62
|
+
break;
|
|
63
|
+
case types_1.LogicOperator.in:
|
|
64
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
65
|
+
...Filters.where[0],
|
|
66
|
+
...{ [element]: (0, typeorm_1.In)(value) }
|
|
67
|
+
});
|
|
68
|
+
break;
|
|
69
|
+
case types_1.LogicOperator.notIn:
|
|
70
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
71
|
+
...Filters.where[0],
|
|
72
|
+
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.In)(value)) }
|
|
73
|
+
});
|
|
74
|
+
break;
|
|
75
|
+
case types_1.LogicOperator.exists:
|
|
76
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
77
|
+
...Filters.where[0],
|
|
78
|
+
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) }
|
|
79
|
+
});
|
|
80
|
+
break;
|
|
81
|
+
case types_1.LogicOperator.notExists:
|
|
82
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
83
|
+
...Filters.where[0],
|
|
84
|
+
...{ [element]: (0, typeorm_1.IsNull)() }
|
|
85
|
+
});
|
|
86
|
+
break;
|
|
87
|
+
case types_1.LogicOperator.regexp:
|
|
88
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
89
|
+
...Filters.where[0],
|
|
90
|
+
...{ [element]: (0, typeorm_1.Like)(value) }
|
|
91
|
+
});
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const condition of rootLevelConditions) {
|
|
96
|
+
const { element, operator, value } = condition;
|
|
97
|
+
switch (operator) {
|
|
98
|
+
case types_1.LogicOperator.equals:
|
|
99
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
100
|
+
...Filters.where[0],
|
|
101
|
+
...{ [element]: (0, typeorm_1.Equal)(value) }
|
|
102
|
+
});
|
|
103
|
+
break;
|
|
104
|
+
case types_1.LogicOperator.isNot:
|
|
105
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
106
|
+
...Filters.where[0],
|
|
107
|
+
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.Equal)(value)) }
|
|
108
|
+
});
|
|
109
|
+
break;
|
|
110
|
+
case types_1.LogicOperator.greaterThan:
|
|
111
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
112
|
+
...Filters.where[0],
|
|
113
|
+
...{ [element]: (0, typeorm_1.MoreThan)(value) }
|
|
114
|
+
});
|
|
115
|
+
break;
|
|
116
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
117
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
118
|
+
...Filters.where[0],
|
|
119
|
+
...{ [element]: (0, typeorm_1.MoreThanOrEqual)(value) }
|
|
120
|
+
});
|
|
121
|
+
break;
|
|
122
|
+
case types_1.LogicOperator.lessThan:
|
|
123
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
124
|
+
...Filters.where[0],
|
|
125
|
+
...{ [element]: (0, typeorm_1.LessThan)(value) }
|
|
126
|
+
});
|
|
127
|
+
break;
|
|
128
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
129
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
130
|
+
...Filters.where[0],
|
|
131
|
+
...{ [element]: (0, typeorm_1.LessThanOrEqual)(value) }
|
|
132
|
+
});
|
|
133
|
+
break;
|
|
134
|
+
case types_1.LogicOperator.in:
|
|
135
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
136
|
+
...Filters.where[0],
|
|
137
|
+
...{ [element]: (0, typeorm_1.In)(value) }
|
|
138
|
+
});
|
|
139
|
+
break;
|
|
140
|
+
case types_1.LogicOperator.notIn:
|
|
141
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
142
|
+
...Filters.where[0],
|
|
143
|
+
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.In)(value)) }
|
|
144
|
+
});
|
|
145
|
+
break;
|
|
146
|
+
case types_1.LogicOperator.exists:
|
|
147
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
148
|
+
...Filters.where[0],
|
|
149
|
+
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) }
|
|
150
|
+
});
|
|
151
|
+
break;
|
|
152
|
+
case types_1.LogicOperator.notExists:
|
|
153
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
154
|
+
...Filters.where[0],
|
|
155
|
+
...{ [element]: (0, typeorm_1.IsNull)() }
|
|
156
|
+
});
|
|
157
|
+
break;
|
|
158
|
+
case types_1.LogicOperator.regexp:
|
|
159
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
160
|
+
...Filters.where[0],
|
|
161
|
+
...{ [element]: (0, typeorm_1.Like)(value) }
|
|
162
|
+
});
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
for (const condition of orConditions) {
|
|
167
|
+
const { element, operator, value } = condition;
|
|
168
|
+
switch (operator) {
|
|
169
|
+
case types_1.LogicOperator.equals:
|
|
170
|
+
Filters.where.push({ [element]: (0, typeorm_1.Equal)(value) });
|
|
171
|
+
break;
|
|
172
|
+
case types_1.LogicOperator.isNot:
|
|
173
|
+
Filters.where.push({ [element]: (0, typeorm_1.Not)((0, typeorm_1.Equal)(value)) });
|
|
174
|
+
break;
|
|
175
|
+
case types_1.LogicOperator.greaterThan:
|
|
176
|
+
Filters.where.push({ [element]: (0, typeorm_1.MoreThan)(value) });
|
|
177
|
+
break;
|
|
178
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
179
|
+
Filters.where.push({ [element]: (0, typeorm_1.MoreThanOrEqual)(value) });
|
|
180
|
+
break;
|
|
181
|
+
case types_1.LogicOperator.lessThan:
|
|
182
|
+
Filters.where.push({ [element]: (0, typeorm_1.LessThan)(value) });
|
|
183
|
+
break;
|
|
184
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
185
|
+
Filters.where.push({ [element]: (0, typeorm_1.LessThanOrEqual)(value) });
|
|
186
|
+
break;
|
|
187
|
+
case types_1.LogicOperator.in:
|
|
188
|
+
Filters.where.push({ [element]: (0, typeorm_1.In)(value) });
|
|
189
|
+
break;
|
|
190
|
+
case types_1.LogicOperator.notIn:
|
|
191
|
+
Filters.where.push({ [element]: (0, typeorm_1.Not)((0, typeorm_1.In)(value)) });
|
|
192
|
+
break;
|
|
193
|
+
case types_1.LogicOperator.exists:
|
|
194
|
+
Filters.where.push({ [element]: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) });
|
|
195
|
+
break;
|
|
196
|
+
case types_1.LogicOperator.notExists:
|
|
197
|
+
Filters.where.push({ [element]: (0, typeorm_1.IsNull)() });
|
|
198
|
+
break;
|
|
199
|
+
case types_1.LogicOperator.regexp:
|
|
200
|
+
Filters.where.push({ [element]: (0, typeorm_1.Like)(value) });
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const filtered = (0, clearEmpties_1.clearEmpties)(Filters.where);
|
|
205
|
+
return filtered;
|
|
206
|
+
};
|
|
207
|
+
exports.getTypeOrmWhere = getTypeOrmWhere;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.basicTestSuite = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
4
5
|
const flock_1 = require("../flock");
|
|
5
6
|
const basicTestSuite = Repo => {
|
|
6
7
|
let storedId;
|
|
@@ -8,6 +9,35 @@ const basicTestSuite = Repo => {
|
|
|
8
9
|
beforeAll(() => {
|
|
9
10
|
Repository = new Repo();
|
|
10
11
|
});
|
|
12
|
+
test('insert - Should insert data', async () => {
|
|
13
|
+
const a = await Repository.insert({ name: 'myGoat', age: 13 });
|
|
14
|
+
expect(typeof a.id).toBe('string');
|
|
15
|
+
expect(a.name).toBe('myGoat');
|
|
16
|
+
expect(0).toBe(0);
|
|
17
|
+
});
|
|
18
|
+
it('insertMany - Should insert Multiple elements', async () => {
|
|
19
|
+
const insertedFlock = await Repository.insertMany(flock_1.flock);
|
|
20
|
+
expect(insertedFlock[0].name).toBe('Goatee');
|
|
21
|
+
storedId = insertedFlock[0].id;
|
|
22
|
+
});
|
|
23
|
+
test('findById - Should GET an object by its ID', async () => {
|
|
24
|
+
const goats = await Repository.insertMany(flock_1.flock);
|
|
25
|
+
const goat = await Repository.findById(goats[0].id);
|
|
26
|
+
expect(goat?.id).toBe(goats[0].id);
|
|
27
|
+
expect(typeof goat?.id).toBe('string');
|
|
28
|
+
const anotherGoat = await Repository.findById('507f1f77bcf86cd799439011');
|
|
29
|
+
expect(anotherGoat).toBe(null);
|
|
30
|
+
});
|
|
31
|
+
test('findById - Should GET selected Data', async () => {
|
|
32
|
+
const goats = await Repository.insertMany(flock_1.flock);
|
|
33
|
+
const goat = await Repository.findById(goats[0].id, {
|
|
34
|
+
select: {
|
|
35
|
+
age: true
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
expect(goat).not.toHaveProperty('name');
|
|
39
|
+
expect(goat?.age).toBe(goats[0].age);
|
|
40
|
+
});
|
|
11
41
|
test('findByIds - Should GET data', async () => {
|
|
12
42
|
const goats = await Repository.insertMany(flock_1.flock);
|
|
13
43
|
const ids = [goats[0].id, goats[1].id];
|
|
@@ -15,5 +45,139 @@ const basicTestSuite = Repo => {
|
|
|
15
45
|
expect(selectedGoats.length).toBe(2);
|
|
16
46
|
expect(selectedGoats[0].id === ids[0] || selectedGoats[1].id === ids[0]).toBe(true);
|
|
17
47
|
});
|
|
48
|
+
test('findByIds - Should GET selectedData', async () => {
|
|
49
|
+
const goats = await Repository.insertMany(flock_1.flock);
|
|
50
|
+
const ids = [goats[0].id, goats[1].id];
|
|
51
|
+
const ages = [goats[0].age, goats[1].age];
|
|
52
|
+
const selectedGoats = await Repository.findByIds(ids, {
|
|
53
|
+
select: {
|
|
54
|
+
age: true
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
expect(selectedGoats.length).toBe(2);
|
|
58
|
+
expect(selectedGoats[0].age === ages[0] || selectedGoats[1].age === ages[0]).toBe(true);
|
|
59
|
+
expect(selectedGoats[0]).not.toHaveProperty('name');
|
|
60
|
+
});
|
|
61
|
+
test('findMany - Should GET data', async () => {
|
|
62
|
+
await Repository.insertMany(flock_1.flock);
|
|
63
|
+
const storedGoats = await Repository.findMany();
|
|
64
|
+
expect(Array.isArray(storedGoats)).toBe(true);
|
|
65
|
+
expect(typeof storedGoats[0].id).toBe('string');
|
|
66
|
+
});
|
|
67
|
+
test('findMany - Should FILTER data', async () => {
|
|
68
|
+
await Repository.insertMany(flock_1.flock);
|
|
69
|
+
const storedGoats = await Repository.findMany({
|
|
70
|
+
where: {
|
|
71
|
+
name: 'Goatee'
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
expect(Array.isArray(storedGoats)).toBe(true);
|
|
75
|
+
for (const goat of storedGoats) {
|
|
76
|
+
expect(goat.name).toBe('Goatee');
|
|
77
|
+
}
|
|
78
|
+
expect(typeof storedGoats[0].id).toBe('string');
|
|
79
|
+
});
|
|
80
|
+
test('findMany - Should FILTER not existing data', async () => {
|
|
81
|
+
await Repository.insertMany(flock_1.flock);
|
|
82
|
+
const storedGoats = await Repository.findMany({
|
|
83
|
+
where: {
|
|
84
|
+
name: 'SOMENOTEXISTINGGOAT'
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
expect(Array.isArray(storedGoats)).toBe(true);
|
|
88
|
+
expect(storedGoats.length).toBe(0);
|
|
89
|
+
});
|
|
90
|
+
test('findMany - Should SELECT attributes', async () => {
|
|
91
|
+
await Repository.insertMany(flock_1.flock);
|
|
92
|
+
const storedGoats = await Repository.findMany({
|
|
93
|
+
where: {
|
|
94
|
+
name: 'Goatee'
|
|
95
|
+
},
|
|
96
|
+
select: {
|
|
97
|
+
age: true
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
expect(Array.isArray(storedGoats)).toBe(true);
|
|
101
|
+
expect(storedGoats.length > 0).toBe(true);
|
|
102
|
+
expect(storedGoats[0]).not.toHaveProperty('name');
|
|
103
|
+
});
|
|
104
|
+
test('findFirst - Should get only 1 object back', async () => {
|
|
105
|
+
await Repository.insertMany(flock_1.flock);
|
|
106
|
+
const storedGoats = await Repository.findFirst({
|
|
107
|
+
where: {
|
|
108
|
+
name: 'Goatee'
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
expect(Array.isArray(storedGoats)).toBe(false);
|
|
112
|
+
expect(typeof storedGoats.id).toBe('string');
|
|
113
|
+
});
|
|
114
|
+
test('findFirst - Should FILTER AND SELECT DATA', async () => {
|
|
115
|
+
await Repository.insertMany(flock_1.flock);
|
|
116
|
+
const storedGoats = await Repository.findFirst({
|
|
117
|
+
where: {
|
|
118
|
+
name: 'Goatee'
|
|
119
|
+
},
|
|
120
|
+
select: {
|
|
121
|
+
name: true
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
expect(Array.isArray(storedGoats)).toBe(false);
|
|
125
|
+
expect(storedGoats.name).toBe('Goatee');
|
|
126
|
+
expect(storedGoats).not.toHaveProperty('age');
|
|
127
|
+
});
|
|
128
|
+
test('requireFirst - Should fail if not found', async () => {
|
|
129
|
+
const insertedUser = await Repository.insert({
|
|
130
|
+
name: 'testGoat',
|
|
131
|
+
age: 20
|
|
132
|
+
});
|
|
133
|
+
const [error] = await js_utils_1.Promises.try(Repository.requireFirst({
|
|
134
|
+
where: {
|
|
135
|
+
name: 'noneExistingGoat'
|
|
136
|
+
}
|
|
137
|
+
}));
|
|
138
|
+
expect(error?.message).toBe('No objects found matching: {"where":{"name":"noneExistingGoat"}}');
|
|
139
|
+
});
|
|
140
|
+
test('requireFirst - Should find first item', async () => {
|
|
141
|
+
const insertedUser = await Repository.insert({
|
|
142
|
+
name: 'testGoat',
|
|
143
|
+
age: 20
|
|
144
|
+
});
|
|
145
|
+
const [error, goat] = await js_utils_1.Promises.try(Repository.requireFirst({
|
|
146
|
+
where: {
|
|
147
|
+
name: 'testGoat'
|
|
148
|
+
}
|
|
149
|
+
}));
|
|
150
|
+
expect(error).toBe(null);
|
|
151
|
+
expect(goat.name).toBe(insertedUser.name);
|
|
152
|
+
});
|
|
153
|
+
it('UpdateById - Should Update a single element', async () => {
|
|
154
|
+
await Repository.insertMany(flock_1.flock);
|
|
155
|
+
const goats = await Repository.findMany();
|
|
156
|
+
const data = await Repository.updateById(goats[0].id, {
|
|
157
|
+
age: 99,
|
|
158
|
+
name: 'MyUpdatedGoat'
|
|
159
|
+
});
|
|
160
|
+
expect(data.name).toBe('MyUpdatedGoat');
|
|
161
|
+
expect(data.id).toBe(goats[0].id);
|
|
162
|
+
});
|
|
163
|
+
it('ReplaceById - Should Update a single element', async () => {
|
|
164
|
+
await Repository.insertMany(flock_1.flock);
|
|
165
|
+
const goats = await Repository.findMany();
|
|
166
|
+
const data = await Repository.replaceById(goats[0].id, {
|
|
167
|
+
age: 2,
|
|
168
|
+
name: 'MyReplacedGoat'
|
|
169
|
+
});
|
|
170
|
+
expect(data.name).toBe('MyReplacedGoat');
|
|
171
|
+
expect(data.id).toBe(goats[0].id);
|
|
172
|
+
});
|
|
173
|
+
it('deleteById - Should delete an item', async () => {
|
|
174
|
+
await Repository.insertMany(flock_1.flock);
|
|
175
|
+
const goats = await Repository.findMany();
|
|
176
|
+
const foundGoat = await Repository.requireById(goats[0].id);
|
|
177
|
+
expect(foundGoat.id).toBe(goats[0].id);
|
|
178
|
+
await Repository.deleteById(foundGoat.id);
|
|
179
|
+
const [error] = await js_utils_1.Promises.try(Repository.requireById(goats[0].id));
|
|
180
|
+
expect(error?.message).toBe(`Object ${goats[0].id} not found`);
|
|
181
|
+
});
|
|
18
182
|
};
|
|
19
183
|
exports.basicTestSuite = basicTestSuite;
|
|
@@ -21,7 +21,7 @@ export declare const BreedSchema: z.ZodObject<{
|
|
|
21
21
|
}>;
|
|
22
22
|
export declare const GoatSchema: z.ZodObject<{
|
|
23
23
|
id: z.ZodOptional<z.ZodString>;
|
|
24
|
-
name: z.ZodString
|
|
24
|
+
name: z.ZodOptional<z.ZodString>;
|
|
25
25
|
age: z.ZodNumber;
|
|
26
26
|
breed: z.ZodOptional<z.ZodObject<{
|
|
27
27
|
family: z.ZodString;
|
|
@@ -35,19 +35,19 @@ export declare const GoatSchema: z.ZodObject<{
|
|
|
35
35
|
}>>;
|
|
36
36
|
}, "strip", z.ZodTypeAny, {
|
|
37
37
|
id?: string | undefined;
|
|
38
|
+
name?: string | undefined;
|
|
38
39
|
breed?: {
|
|
39
40
|
family: string;
|
|
40
41
|
members: number;
|
|
41
42
|
} | undefined;
|
|
42
|
-
name: string;
|
|
43
43
|
age: number;
|
|
44
44
|
}, {
|
|
45
45
|
id?: string | undefined;
|
|
46
|
+
name?: string | undefined;
|
|
46
47
|
breed?: {
|
|
47
48
|
family: string;
|
|
48
49
|
members: number;
|
|
49
50
|
} | undefined;
|
|
50
|
-
name: string;
|
|
51
51
|
age: number;
|
|
52
52
|
}>;
|
|
53
53
|
export declare type GoatInputSchema = z.infer<typeof GoatSchema>;
|
|
@@ -47,7 +47,7 @@ exports.BreedSchema = zod_1.z.object({
|
|
|
47
47
|
});
|
|
48
48
|
exports.GoatSchema = zod_1.z.object({
|
|
49
49
|
id: zod_1.z.string().optional(),
|
|
50
|
-
name: zod_1.z.string(),
|
|
50
|
+
name: zod_1.z.string().optional(),
|
|
51
51
|
age: zod_1.z.number(),
|
|
52
52
|
breed: exports.BreedSchema.optional()
|
|
53
53
|
});
|
|
@@ -57,8 +57,7 @@ function startDockerContainer(options) {
|
|
|
57
57
|
`${options.externalPort}:${options.internalPort}`,
|
|
58
58
|
...(options.detached ? ['--detach'] : []),
|
|
59
59
|
...envArgs,
|
|
60
|
-
options.image
|
|
61
|
-
'--default_authentication_plugin=mysql_native_password'
|
|
60
|
+
options.image
|
|
62
61
|
], {
|
|
63
62
|
stdio: options.debug ? 'inherit' : 'ignore'
|
|
64
63
|
});
|
|
@@ -141,8 +140,8 @@ async function startContainer(options) {
|
|
|
141
140
|
return {
|
|
142
141
|
proc,
|
|
143
142
|
externalPort,
|
|
144
|
-
async
|
|
145
|
-
await killOldContainers(options);
|
|
143
|
+
kill: async () => {
|
|
144
|
+
return await killOldContainers(options);
|
|
146
145
|
}
|
|
147
146
|
};
|
|
148
147
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Options as WithContainerOptions } from './docker';
|
|
2
|
+
export interface Options extends Omit<WithContainerOptions, 'internalPort' | 'enableDebugInstructions' | 'testConnection'> {
|
|
3
|
+
mongoUser: string;
|
|
4
|
+
mongoPassword: string;
|
|
5
|
+
mongoDb: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function waitForConnection(databaseURL: string, timeoutSeconds: number): Promise<void>;
|
|
8
|
+
export default function getDatabase(options?: Partial<Options>): Promise<{
|
|
9
|
+
proc: any;
|
|
10
|
+
databaseURL: string;
|
|
11
|
+
kill: () => Promise<void>;
|
|
12
|
+
user: string;
|
|
13
|
+
password: string;
|
|
14
|
+
port: number;
|
|
15
|
+
dbName: string;
|
|
16
|
+
}>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.waitForConnection = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const docker_1 = tslib_1.__importDefault(require("./docker"));
|
|
6
|
+
const mongodb_1 = require("mongodb");
|
|
7
|
+
const DEFAULT_IMAGE = 'mongo:6.0.1';
|
|
8
|
+
const DEFAULT_CONTAINER_NAME = `fluent-${DEFAULT_IMAGE.replace(':', '-')}-test`;
|
|
9
|
+
const DEFAULT_CONNECT_TIMEOUT_SECONDS = 10;
|
|
10
|
+
const DEFAULT_MONGO_PORT = 27017;
|
|
11
|
+
const DEFAULT_MONGO_USER = 'test-user';
|
|
12
|
+
const DEFAULT_MONGO_PASSWORD = 'password';
|
|
13
|
+
const DEFAULT_MONGO_DB = 'test-db';
|
|
14
|
+
const DEFAULT_MONGO_DEBUG = false;
|
|
15
|
+
async function waitForConnection(databaseURL, timeoutSeconds) {
|
|
16
|
+
const start = Date.now();
|
|
17
|
+
const timeoutMilliseconds = timeoutSeconds * 1000;
|
|
18
|
+
let lastAttempt = false;
|
|
19
|
+
while (true) {
|
|
20
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
21
|
+
const conn = new mongodb_1.MongoClient(databaseURL);
|
|
22
|
+
try {
|
|
23
|
+
try {
|
|
24
|
+
await conn.connect();
|
|
25
|
+
const db = conn.db('anyDB');
|
|
26
|
+
const result = await db.command({
|
|
27
|
+
ping: 1
|
|
28
|
+
});
|
|
29
|
+
if (result.ok) {
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
if (lastAttempt) {
|
|
34
|
+
throw new Error('Got unexpected result: ' + JSON.stringify(result));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (ex) {
|
|
39
|
+
console.log(ex);
|
|
40
|
+
if (lastAttempt) {
|
|
41
|
+
throw ex;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await conn.close();
|
|
47
|
+
}
|
|
48
|
+
if (Date.now() - timeoutMilliseconds > start) {
|
|
49
|
+
lastAttempt = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.waitForConnection = waitForConnection;
|
|
54
|
+
async function getDatabase(options = {}) {
|
|
55
|
+
const { mongoUser, mongoPassword, mongoDb, environment, ...rawOptions } = {
|
|
56
|
+
debug: DEFAULT_MONGO_DEBUG,
|
|
57
|
+
image: DEFAULT_IMAGE,
|
|
58
|
+
containerName: DEFAULT_CONTAINER_NAME,
|
|
59
|
+
connectTimeoutSeconds: DEFAULT_CONNECT_TIMEOUT_SECONDS,
|
|
60
|
+
mongoUser: DEFAULT_MONGO_USER,
|
|
61
|
+
mongoPassword: DEFAULT_MONGO_PASSWORD,
|
|
62
|
+
mongoDb: DEFAULT_MONGO_DB,
|
|
63
|
+
defaultExternalPort: DEFAULT_MONGO_PORT,
|
|
64
|
+
...options
|
|
65
|
+
};
|
|
66
|
+
const { proc, externalPort, kill } = await (0, docker_1.default)({
|
|
67
|
+
...rawOptions,
|
|
68
|
+
internalPort: DEFAULT_MONGO_PORT,
|
|
69
|
+
environment: {
|
|
70
|
+
MONGO_HOST: '127.0.0.1',
|
|
71
|
+
...environment,
|
|
72
|
+
MONGO_INITDB_ROOT_USERNAME: mongoUser,
|
|
73
|
+
MONGO_INITDB_ROOT_PASSWORD: mongoPassword,
|
|
74
|
+
MONGO_DB_USER: mongoUser,
|
|
75
|
+
MONGO_DB_PASSWORD: mongoPassword,
|
|
76
|
+
MONGO_PASSWORD: mongoPassword,
|
|
77
|
+
MONGO_INITDB_DATABASE: mongoDb
|
|
78
|
+
},
|
|
79
|
+
enableDebugInstructions: `To view logs, run with MONGO_TEST_DEBUG=true environment variable.`
|
|
80
|
+
});
|
|
81
|
+
const databaseURL = `mongodb://${mongoUser}:${mongoPassword}@localhost:${externalPort}`;
|
|
82
|
+
await waitForConnection(databaseURL, rawOptions.connectTimeoutSeconds);
|
|
83
|
+
return {
|
|
84
|
+
proc,
|
|
85
|
+
databaseURL,
|
|
86
|
+
kill,
|
|
87
|
+
user: mongoUser,
|
|
88
|
+
password: mongoPassword,
|
|
89
|
+
port: externalPort,
|
|
90
|
+
dbName: mongoDb
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
exports.default = getDatabase;
|
|
@@ -5,7 +5,7 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const docker_1 = tslib_1.__importStar(require("./docker"));
|
|
6
6
|
const { createConnection } = require('mysql2');
|
|
7
7
|
const DEFAULT_IMAGE = 'mysql:8.0';
|
|
8
|
-
const DEFAULT_CONTAINER_NAME = '
|
|
8
|
+
const DEFAULT_CONTAINER_NAME = `fluent-${DEFAULT_IMAGE.replace(':', '-')}-test`;
|
|
9
9
|
const DEFAULT_CONNECT_TIMEOUT_SECONDS = 10;
|
|
10
10
|
const DEFAULT_MYSQL_PORT = 3306;
|
|
11
11
|
const DEFAULT_MYSQL_USER = 'test-user';
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { TypeOrmConnector } from '../../TypeOrmConnector';
|
|
2
2
|
import { CarsEntity } from '../relations/car/car.entity';
|
|
3
|
-
import {
|
|
3
|
+
import { CarDtoOutput } from '../relations/car/car.output.schema';
|
|
4
|
+
import { CarDtoInput } from '../relations/car/car.schema';
|
|
4
5
|
import { UserRepository } from './user.mongo.repository';
|
|
5
|
-
export declare class CarsRepository extends TypeOrmConnector<CarsEntity,
|
|
6
|
+
export declare class CarsRepository extends TypeOrmConnector<CarsEntity, CarDtoInput, CarDtoOutput> {
|
|
6
7
|
constructor();
|
|
7
8
|
user: () => UserRepository;
|
|
9
|
+
anotherRelation: () => UserRepository;
|
|
8
10
|
}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CarsRepository = void 0;
|
|
4
4
|
const TypeOrmConnector_1 = require("../../TypeOrmConnector");
|
|
5
5
|
const car_entity_1 = require("../relations/car/car.entity");
|
|
6
|
+
const car_output_schema_1 = require("../relations/car/car.output.schema");
|
|
6
7
|
const car_schema_1 = require("../relations/car/car.schema");
|
|
7
8
|
const user_entity_1 = require("../relations/user/user.entity");
|
|
8
9
|
const mongoDatasource_1 = require("./mongoDatasource");
|
|
@@ -12,12 +13,16 @@ class CarsRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
|
12
13
|
super({
|
|
13
14
|
entity: car_entity_1.CarsEntity,
|
|
14
15
|
dataSource: mongoDatasource_1.MongoDataSource,
|
|
15
|
-
inputSchema: car_schema_1.
|
|
16
|
+
inputSchema: car_schema_1.carInputSchema,
|
|
17
|
+
outputSchema: car_output_schema_1.carOutputSchema
|
|
16
18
|
});
|
|
17
19
|
this.user = () => this.belongsTo({
|
|
18
20
|
repository: user_mongo_repository_1.UserRepository,
|
|
19
21
|
model: user_entity_1.UsersEntity
|
|
20
22
|
});
|
|
23
|
+
this.anotherRelation = () => this.belongsTo({
|
|
24
|
+
repository: user_mongo_repository_1.UserRepository
|
|
25
|
+
});
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
exports.CarsRepository = CarsRepository;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { TypeOrmConnector } from '../../TypeOrmConnector';
|
|
2
|
-
import {
|
|
2
|
+
import { RoleDtoInput } from '../relations/roles/role.schema';
|
|
3
3
|
import { RoleEntity } from '../relations/roles/roles.entity';
|
|
4
4
|
import { UserRepository } from './user.mongo.repository';
|
|
5
|
-
|
|
5
|
+
import { RoleDtoOut } from '../relations/roles/role.output.schema';
|
|
6
|
+
export declare class RoleRepository extends TypeOrmConnector<RoleEntity, RoleDtoInput, RoleDtoOut> {
|
|
6
7
|
constructor();
|
|
7
8
|
users: () => UserRepository;
|
|
8
9
|
}
|
|
@@ -7,12 +7,14 @@ const roles_user_mongo_repository_1 = require("./roles_user.mongo.repository");
|
|
|
7
7
|
const roles_entity_1 = require("../relations/roles/roles.entity");
|
|
8
8
|
const mongoDatasource_1 = require("./mongoDatasource");
|
|
9
9
|
const user_mongo_repository_1 = require("./user.mongo.repository");
|
|
10
|
+
const role_output_schema_1 = require("../relations/roles/role.output.schema");
|
|
10
11
|
class RoleRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
11
12
|
constructor() {
|
|
12
13
|
super({
|
|
13
14
|
entity: roles_entity_1.RoleEntity,
|
|
14
15
|
dataSource: mongoDatasource_1.MongoDataSource,
|
|
15
|
-
inputSchema: role_schema_1.
|
|
16
|
+
inputSchema: role_schema_1.RoleInputSchema,
|
|
17
|
+
outputSchema: role_output_schema_1.RoleOuputSchema
|
|
16
18
|
});
|
|
17
19
|
this.users = () => this.belongsToMany({
|
|
18
20
|
repository: user_mongo_repository_1.UserRepository,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TypeOrmConnector } from '../../TypeOrmConnector';
|
|
2
2
|
import { UsersEntity } from '../relations/user/user.entity';
|
|
3
|
-
import {
|
|
3
|
+
import { UsersDtoIn, UsersDtoOut } from '../relations/user/user.schema';
|
|
4
4
|
import { CarsRepository } from './car.mongo.repository';
|
|
5
5
|
import { RoleRepository } from './roles.mongo.repository';
|
|
6
|
-
export declare class UserRepository extends TypeOrmConnector<UsersEntity,
|
|
6
|
+
export declare class UserRepository extends TypeOrmConnector<UsersEntity, UsersDtoIn, UsersDtoOut> {
|
|
7
7
|
constructor();
|
|
8
8
|
cars: () => CarsRepository;
|
|
9
9
|
roles: () => RoleRepository;
|
|
@@ -14,7 +14,8 @@ class UserRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
|
14
14
|
super({
|
|
15
15
|
entity: user_entity_1.UsersEntity,
|
|
16
16
|
dataSource: mongoDatasource_1.MongoDataSource,
|
|
17
|
-
inputSchema: user_schema_1.
|
|
17
|
+
inputSchema: user_schema_1.userInputSchema,
|
|
18
|
+
outputSchema: user_schema_1.userOutputSchema
|
|
18
19
|
});
|
|
19
20
|
this.cars = () => {
|
|
20
21
|
return this.hasMany({
|