itlab-internal-services 2.15.4 → 2.15.6

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 (52) hide show
  1. package/dist/classes/document-merger.class.js +27 -37
  2. package/dist/classes/document-updater.class.js +2 -2
  3. package/dist/factories/virtuals.factory.js +2 -2
  4. package/dist/functions/create-duplicate-checker.function.js +3 -12
  5. package/dist/functions/create-internal-axios-client.function.d.ts +0 -1
  6. package/dist/functions/create-schema-transformer.function.js +1 -1
  7. package/dist/models/thumbnail/thumbnail.model.js +1 -0
  8. package/dist/modules/cache/cache.service.js +50 -71
  9. package/dist/modules/comment/comment.controller.js +3 -13
  10. package/dist/modules/comment/comment.module.js +5 -1
  11. package/dist/modules/comment/comment.service.js +31 -41
  12. package/dist/modules/content/content.module.js +4 -1
  13. package/dist/modules/content/content.property.js +1 -0
  14. package/dist/modules/content/content.service.js +56 -68
  15. package/dist/modules/database/database.liveness-controller.js +19 -30
  16. package/dist/modules/database/database.module.js +4 -12
  17. package/dist/modules/database/lock-service/lock.service.js +22 -35
  18. package/dist/modules/database/model-service/dbs/hub-account.db.d.ts +2 -2
  19. package/dist/modules/database/model-service/dbs/hub-account.db.js +1 -1
  20. package/dist/modules/database/model-service/dbs/hub-books.db.d.ts +2 -2
  21. package/dist/modules/database/model-service/dbs/hub-comments.db.d.ts +2 -2
  22. package/dist/modules/database/model-service/dbs/hub-content.db.d.ts +2 -2
  23. package/dist/modules/database/model-service/dbs/hub-demo-hive.db.d.ts +2 -2
  24. package/dist/modules/database/model-service/dbs/hub-events.db.d.ts +2 -2
  25. package/dist/modules/database/model-service/dbs/hub-hackschool.db.d.ts +6 -6
  26. package/dist/modules/database/model-service/dbs/hub-newsroom.db.d.ts +2 -2
  27. package/dist/modules/database/model-service/dbs/hub-podcasts.db.d.ts +2 -2
  28. package/dist/modules/database/model-service/dbs/hub-team.db.d.ts +2 -2
  29. package/dist/modules/database/model-service/dbs/hub-tech-radar.db.d.ts +4 -4
  30. package/dist/modules/database/model-service/model.service.d.ts +392 -224
  31. package/dist/modules/database/model-service/model.service.js +4 -17
  32. package/dist/modules/fetch/fetch.module.js +4 -1
  33. package/dist/modules/fetch/fetch.service.js +56 -94
  34. package/dist/modules/like/like.controller.js +7 -21
  35. package/dist/modules/like/like.module.js +5 -1
  36. package/dist/modules/like/like.service.js +13 -28
  37. package/dist/modules/mail/mail.module.js +4 -1
  38. package/dist/modules/mail/mail.service.d.ts +5 -5
  39. package/dist/modules/mail/mail.service.js +10 -9
  40. package/dist/modules/notification/notification.module.js +4 -1
  41. package/dist/modules/notification/notification.service.js +2 -2
  42. package/dist/modules/pass/pass.module.js +4 -1
  43. package/dist/modules/pass/pass.service.js +41 -63
  44. package/dist/modules/search/search.module.js +4 -1
  45. package/dist/modules/search/search.service.js +13 -24
  46. package/dist/transform/boolean.transform.js +3 -2
  47. package/dist/transform/image-url.transform.js +1 -1
  48. package/dist/transform/number.transform.js +2 -1
  49. package/dist/transform/string-array.transform.js +1 -1
  50. package/dist/transform/string.transform.js +1 -1
  51. package/dist/transform/timestamp.transform.js +2 -1
  52. package/package.json +54 -24
@@ -11,15 +11,6 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
- return new (P || (P = Promise))(function (resolve, reject) {
17
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
- step((generator = generator.apply(thisArg, _arguments || [])).next());
21
- });
22
- };
23
14
  var PassService_1;
24
15
  Object.defineProperty(exports, "__esModule", { value: true });
25
16
  exports.PassService = void 0;
@@ -30,6 +21,7 @@ const authentication_1 = require("../authentication");
30
21
  /**
31
22
  * Constant list of supported digital pass types.
32
23
  */
24
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
33
25
  const supportedPassTypes = ['team-member', 'guild-member'];
34
26
  /**
35
27
  * PassService
@@ -70,18 +62,16 @@ let PassService = PassService_1 = class PassService {
70
62
  * @param {string} serialNumber - Unique serial number of the pass.
71
63
  * @returns {Promise<string>} - Returns the SAS URL of the pass.
72
64
  */
73
- getPassBySerial(serialNumber) {
74
- return __awaiter(this, void 0, void 0, function* () {
75
- try {
76
- const response = yield this.axiosInstance.get(serialNumber);
77
- this.logger.log(`Pass retrieved using serial: ${serialNumber}`);
78
- return response.data;
79
- }
80
- catch (error) {
81
- this.logger.error(`Error retrieving pass with serial ${serialNumber}: ${error.message}`);
82
- throw error;
83
- }
84
- });
65
+ async getPassBySerial(serialNumber) {
66
+ try {
67
+ const response = await this.axiosInstance.get(serialNumber);
68
+ this.logger.log(`Pass retrieved using serial: ${serialNumber}`);
69
+ return response.data;
70
+ }
71
+ catch (error) {
72
+ this.logger.error(`Error retrieving pass with serial ${serialNumber}: ${error.message}`);
73
+ throw error;
74
+ }
85
75
  }
86
76
  /**
87
77
  * Deletes a pass using its serial number.
@@ -96,7 +86,7 @@ let PassService = PassService_1 = class PassService {
96
86
  this.logger.log(`Pass deleted for serial: ${serialNumber}`);
97
87
  })
98
88
  .catch(({ response }) => {
99
- this.logger.error(`Error deleting pass with serial ${serialNumber}: ${response === null || response === void 0 ? void 0 : response.data}`);
89
+ this.logger.error(`Error deleting pass with serial ${serialNumber}: ${JSON.stringify(response === null || response === void 0 ? void 0 : response.data)}`);
100
90
  });
101
91
  }
102
92
  // ─────────────────────────────────────────────
@@ -110,18 +100,16 @@ let PassService = PassService_1 = class PassService {
110
100
  * @param {string} memberId - Identifier of the associated member.
111
101
  * @returns {Promise<string>} - Returns the SAS URL of the pass.
112
102
  */
113
- getPassByType(type, memberId) {
114
- return __awaiter(this, void 0, void 0, function* () {
115
- try {
116
- const response = yield this.axiosInstance.get(`${type}/${memberId}`);
117
- this.logger.log(`Pass retrieved for ${type} member ID: ${memberId}`);
118
- return response.data;
119
- }
120
- catch (error) {
121
- this.logger.error(`Error retrieving ${type} pass for ${memberId}: ${error.message}`);
122
- throw error;
123
- }
124
- });
103
+ async getPassByType(type, memberId) {
104
+ try {
105
+ const response = await this.axiosInstance.get(`${type}/${memberId}`);
106
+ this.logger.log(`Pass retrieved for ${type} member ID: ${memberId}`);
107
+ return response.data;
108
+ }
109
+ catch (error) {
110
+ this.logger.error(`Error retrieving ${type} pass for ${memberId}: ${error.message}`);
111
+ throw error;
112
+ }
125
113
  }
126
114
  /**
127
115
  * Deletes a pass based on its type and member ID.
@@ -137,7 +125,7 @@ let PassService = PassService_1 = class PassService {
137
125
  this.logger.log(`Pass deleted for ${type} member ID: ${memberId}`);
138
126
  })
139
127
  .catch(({ response }) => {
140
- this.logger.error(`Error deleting ${type} pass for ${memberId}: ${response === null || response === void 0 ? void 0 : response.data}`);
128
+ this.logger.error(`Error deleting ${type} pass for ${memberId}: ${JSON.stringify(response === null || response === void 0 ? void 0 : response.data)}`);
141
129
  });
142
130
  }
143
131
  /**
@@ -149,18 +137,16 @@ let PassService = PassService_1 = class PassService {
149
137
  * @param {PassTypeDtoMap[Type]} payload - DTO matching the type of pass.
150
138
  * @returns {Promise<string>} - The resulting pass URL or identifier.
151
139
  */
152
- createPass(type, payload) {
153
- return __awaiter(this, void 0, void 0, function* () {
154
- try {
155
- const response = yield this.axiosInstance.post(type, payload);
156
- this.logger.log(`Pass successfully created for ${type}`);
157
- return response.data;
158
- }
159
- catch (error) {
160
- this.logger.error(`Error creating pass for ${type}: ${error.message}`);
161
- throw error;
162
- }
163
- });
140
+ async createPass(type, payload) {
141
+ try {
142
+ const response = await this.axiosInstance.post(type, payload);
143
+ this.logger.log(`Pass successfully created for ${type}`);
144
+ return response.data;
145
+ }
146
+ catch (error) {
147
+ this.logger.error(`Error creating pass for ${type}: ${error.message}`);
148
+ throw error;
149
+ }
164
150
  }
165
151
  // ─────────────────────────────────────────────
166
152
  // Team Member Pass Helpers
@@ -171,10 +157,8 @@ let PassService = PassService_1 = class PassService {
171
157
  * @param {string} memberId - Identifier of the team member.
172
158
  * @returns {Promise<string>} - SAS URL of the team member's pass.
173
159
  */
174
- getTeamMemberPass(memberId) {
175
- return __awaiter(this, void 0, void 0, function* () {
176
- return this.getPassByType('team-member', memberId);
177
- });
160
+ async getTeamMemberPass(memberId) {
161
+ return this.getPassByType('team-member', memberId);
178
162
  }
179
163
  /**
180
164
  * Creates a pass for a team member.
@@ -182,10 +166,8 @@ let PassService = PassService_1 = class PassService {
182
166
  * @param {CreateTeamMemberPassDto} data - Required details to generate the team member pass.
183
167
  * @returns {Promise<string>} - URL or ID of the created pass.
184
168
  */
185
- createTeamMemberPass(data) {
186
- return __awaiter(this, void 0, void 0, function* () {
187
- return this.createPass('team-member', data);
188
- });
169
+ async createTeamMemberPass(data) {
170
+ return this.createPass('team-member', data);
189
171
  }
190
172
  /**
191
173
  * Deletes a team member’s pass.
@@ -204,10 +186,8 @@ let PassService = PassService_1 = class PassService {
204
186
  * @param {string} memberId - Identifier of the guild member.
205
187
  * @returns {Promise<string>} - SAS URL of the guild member's pass.
206
188
  */
207
- getGuildMemberPass(memberId) {
208
- return __awaiter(this, void 0, void 0, function* () {
209
- return this.getPassByType('guild-member', memberId);
210
- });
189
+ async getGuildMemberPass(memberId) {
190
+ return this.getPassByType('guild-member', memberId);
211
191
  }
212
192
  /**
213
193
  * Creates a pass for a guild member.
@@ -215,10 +195,8 @@ let PassService = PassService_1 = class PassService {
215
195
  * @param {CreateGuildMemberPassDto} data - Required details to generate the guild member pass.
216
196
  * @returns {Promise<string>} - URL or ID of the created pass.
217
197
  */
218
- createGuildMemberPass(data) {
219
- return __awaiter(this, void 0, void 0, function* () {
220
- return this.createPass('guild-member', data);
221
- });
198
+ async createGuildMemberPass(data) {
199
+ return this.createPass('guild-member', data);
222
200
  }
223
201
  /**
224
202
  * Deletes a guild member’s pass.
@@ -55,5 +55,8 @@ let SearchModule = SearchModule_1 = class SearchModule {
55
55
  };
56
56
  exports.SearchModule = SearchModule;
57
57
  exports.SearchModule = SearchModule = SearchModule_1 = __decorate([
58
- (0, common_1.Module)({})
58
+ (0, common_1.Module)({
59
+ providers: [search_service_1.SearchService],
60
+ exports: [search_service_1.SearchService],
61
+ })
59
62
  ], SearchModule);
@@ -11,15 +11,6 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
- return new (P || (P = Promise))(function (resolve, reject) {
17
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
- step((generator = generator.apply(thisArg, _arguments || [])).next());
21
- });
22
- };
23
14
  var SearchService_1;
24
15
  Object.defineProperty(exports, "__esModule", { value: true });
25
16
  exports.SearchService = void 0;
@@ -77,7 +68,7 @@ let SearchService = SearchService_1 = class SearchService {
77
68
  this.logger.log(`Indexed ${this.resource} (${resourceId}) successfully.`);
78
69
  })
79
70
  .catch(({ response }) => {
80
- this.logger.error(`Failed to index ${this.resource} (${resourceId}): ${response === null || response === void 0 ? void 0 : response.data}`);
71
+ this.logger.error(`Failed to index ${this.resource} (${resourceId}): ${JSON.stringify(response === null || response === void 0 ? void 0 : response.data)}`);
81
72
  });
82
73
  }
83
74
  /**
@@ -94,7 +85,7 @@ let SearchService = SearchService_1 = class SearchService {
94
85
  this.logger.log(`Removed ${this.resource} (${resourceId}) from index.`);
95
86
  })
96
87
  .catch(({ response }) => {
97
- this.logger.error(`Failed to remove ${this.resource} (${resourceId}) from index: ${response === null || response === void 0 ? void 0 : response.data}`);
88
+ this.logger.error(`Failed to remove ${this.resource} (${resourceId}) from index: ${JSON.stringify(response === null || response === void 0 ? void 0 : response.data)}`);
98
89
  });
99
90
  }
100
91
  // ─────────────────────────────────────────────
@@ -107,19 +98,17 @@ let SearchService = SearchService_1 = class SearchService {
107
98
  * @param {string} resourceId - Identifier of the base resource for similarity matching.
108
99
  * @returns {Promise<SearchDocument[]>} - Array of documents similar to the given resource.
109
100
  */
110
- findSimilarDocuments(resourceId) {
111
- return __awaiter(this, void 0, void 0, function* () {
112
- this.logger.log(`Searching for documents similar to "${this.resource}" with ID: ${resourceId}`);
113
- try {
114
- const response = yield this.axiosInstance.get(`${resourceId}/similar`);
115
- this.logger.log(`Similar documents retrieved for ${this.resource} (${resourceId})`);
116
- return response.data;
117
- }
118
- catch (error) {
119
- this.logger.error(`Error retrieving similar documents for ${this.resource} (${resourceId}): ${error.message}`);
120
- throw error;
121
- }
122
- });
101
+ async findSimilarDocuments(resourceId) {
102
+ this.logger.log(`Searching for documents similar to "${this.resource}" with ID: ${resourceId}`);
103
+ try {
104
+ const response = await this.axiosInstance.get(`${resourceId}/similar`);
105
+ this.logger.log(`Similar documents retrieved for ${this.resource} (${resourceId})`);
106
+ return response.data;
107
+ }
108
+ catch (error) {
109
+ this.logger.error(`Error retrieving similar documents for ${this.resource} (${resourceId}): ${error.message}`);
110
+ throw error;
111
+ }
123
112
  }
124
113
  };
125
114
  exports.SearchService = SearchService;
@@ -14,11 +14,12 @@ function BooleanTransform() {
14
14
  // Standardize boolean input formats (string, number, or boolean)
15
15
  const trueValues = [true, 'true', 1, '1', 'yes', 'on'];
16
16
  const falseValues = [false, 'false', 0, '0', 'no', 'off'];
17
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
17
18
  if (trueValues.includes(value))
18
19
  return true;
20
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
19
21
  if (falseValues.includes(value))
20
22
  return false;
21
- // Fallback to original value for unsupported formats
22
- return value;
23
+ return undefined;
23
24
  });
24
25
  }
@@ -13,6 +13,6 @@ const itlab_functions_1 = require("itlab-functions");
13
13
  function ImageUrlTransform() {
14
14
  return (0, class_transformer_1.Transform)(({ value }) => {
15
15
  // Apply trimming and custom transformation if the value is a string
16
- return (0, class_validator_1.isString)(value) ? (0, itlab_functions_1.transformImageUrl)(value.trim()) : value;
16
+ return (0, class_validator_1.isString)(value) ? (0, itlab_functions_1.transformImageUrl)(value.trim()) : undefined;
17
17
  });
18
18
  }
@@ -11,10 +11,11 @@ const class_transformer_1 = require("class-transformer");
11
11
  function NumberTransform(opts = {}) {
12
12
  return (0, class_transformer_1.Transform)(({ value }) => {
13
13
  var _a;
14
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
14
15
  let parsed = Number.parseFloat(value !== null && value !== void 0 ? value : opts.default);
15
16
  // Fallback to default if parsing failed
16
17
  if (Number.isNaN(parsed))
17
- return (_a = opts.default) !== null && _a !== void 0 ? _a : value;
18
+ return (_a = opts.default) !== null && _a !== void 0 ? _a : undefined;
18
19
  // Optionally round to nearest integer
19
20
  if (opts.round)
20
21
  parsed = Math.round(parsed);
@@ -13,7 +13,7 @@ const class_validator_1 = require("class-validator");
13
13
  function StringArrayTransform(opts = {}) {
14
14
  return (0, class_transformer_1.Transform)(({ value }) => {
15
15
  if (!(0, class_validator_1.isArray)(value))
16
- return value;
16
+ return undefined;
17
17
  const transformed = value.map((item) => {
18
18
  let str = String(item);
19
19
  if (opts.trim)
@@ -14,7 +14,7 @@ const itlab_functions_1 = require("itlab-functions");
14
14
  function StringTransform(opts = {}) {
15
15
  return (0, class_transformer_1.Transform)(({ value }) => {
16
16
  if (!(0, class_validator_1.isString)(value))
17
- return value;
17
+ return undefined;
18
18
  let str = value;
19
19
  if (opts.trim)
20
20
  str = str.trim();
@@ -11,9 +11,10 @@ const class_transformer_1 = require("class-transformer");
11
11
  function TimestampTransform(opts = {}) {
12
12
  return (0, class_transformer_1.Transform)(({ value }) => {
13
13
  var _a;
14
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
14
15
  let timestamp = Number.parseInt(value !== null && value !== void 0 ? value : opts.default, 10);
15
16
  if (Number.isNaN(timestamp))
16
- return (_a = opts.default) !== null && _a !== void 0 ? _a : value;
17
+ return (_a = opts.default) !== null && _a !== void 0 ? _a : undefined;
17
18
  if (opts.min !== undefined && timestamp < opts.min)
18
19
  timestamp = opts.min;
19
20
  if (opts.max !== undefined && timestamp > opts.max)
package/package.json CHANGED
@@ -2,10 +2,9 @@
2
2
  "name": "itlab-internal-services",
3
3
  "author": {
4
4
  "name": "Timo Scheuermann",
5
- "email": "timo.scheuermann@sv-informatik.de",
6
- "url": "https://timos.design"
5
+ "email": "timo.scheuermann@sv-informatik.de"
7
6
  },
8
- "version": "2.15.4",
7
+ "version": "2.15.6",
9
8
  "type": "commonjs",
10
9
  "files": [
11
10
  "dist"
@@ -23,33 +22,64 @@
23
22
  "release:patch": "npm version patch && git push origin master --follow-tags"
24
23
  },
25
24
  "dependencies": {
26
- "@azure/identity": "^4.10.1",
27
- "@keyv/redis": "^4.4.0",
25
+ "@azure/identity": "^4.11.1",
26
+ "@keyv/redis": "^5.1.0",
28
27
  "@nestjs/cache-manager": "^3.0.1",
29
- "@nestjs/jwt": "^11.0.0",
30
- "axios": "^1.10.0",
31
- "cache-manager": "^7.0.0",
32
- "itlab-functions": "^1.0.1"
33
- },
34
- "devDependencies": {
35
- "@nestjs/common": "^11.1.3",
28
+ "@nestjs/common": "^11.1.6",
36
29
  "@nestjs/config": "^4.0.2",
37
- "@nestjs/core": "^11.1.3",
30
+ "@nestjs/core": "^11.1.6",
31
+ "@nestjs/jwt": "^11.0.0",
38
32
  "@nestjs/mongoose": "^11.0.3",
39
- "@nestjs/platform-express": "^11.1.3",
40
33
  "@nestjs/swagger": "^11.2.0",
41
- "@types/express": "^5.0.3",
42
- "@typescript-eslint/eslint-plugin": "^8.34.1",
43
- "@typescript-eslint/parser": "^8.34.1",
34
+ "axios": "^1.11.0",
35
+ "cache-manager": "^7.1.1",
44
36
  "class-transformer": "^0.5.1",
45
37
  "class-validator": "^0.14.2",
46
- "eslint": "^9.29.0",
47
- "eslint-config-prettier": "^10.1.5",
48
- "eslint-plugin-import": "^2.31.0",
49
- "mongoose": "^8.16.0",
50
- "prettier": "^3.5.3",
38
+ "itlab-functions": "^1.0.2",
39
+ "mongoose": "^8.17.1",
40
+ "rxjs": "^7.8.2"
41
+ },
42
+ "devDependencies": {
43
+ "@eslint/eslintrc": "^3.3.1",
44
+ "@eslint/js": "^9.32.0",
45
+ "@nestjs/cli": "^11.0.10",
46
+ "@nestjs/schematics": "^11.0.7",
47
+ "@nestjs/testing": "^11.1.6",
48
+ "@types/express": "^5.0.3",
49
+ "@types/jest": "^30.0.0",
50
+ "@types/node": "^24.2.0",
51
+ "@types/supertest": "^6.0.3",
52
+ "eslint": "^9.32.0",
53
+ "eslint-config-prettier": "^10.1.8",
54
+ "eslint-plugin-prettier": "^5.5.4",
55
+ "globals": "^16.3.0",
56
+ "jest": "^30.0.5",
57
+ "prettier": "^3.6.2",
51
58
  "reflect-metadata": "^0.2.2",
52
- "typescript": "^5.8.3"
59
+ "source-map-support": "^0.5.21",
60
+ "supertest": "^7.1.4",
61
+ "ts-jest": "^29.4.1",
62
+ "ts-loader": "^9.5.2",
63
+ "ts-node": "^10.9.2",
64
+ "tsconfig-paths": "^4.2.0",
65
+ "typescript": "^5.9.2",
66
+ "typescript-eslint": "^8.39.0"
53
67
  },
54
- "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610"
68
+ "jest": {
69
+ "moduleFileExtensions": [
70
+ "js",
71
+ "json",
72
+ "ts"
73
+ ],
74
+ "rootDir": "src",
75
+ "testRegex": ".*\\.spec\\.ts$",
76
+ "transform": {
77
+ "^.+\\.(t|j)s$": "ts-jest"
78
+ },
79
+ "collectCoverageFrom": [
80
+ "**/*.(t|j)s"
81
+ ],
82
+ "coverageDirectory": "../coverage",
83
+ "testEnvironment": "node"
84
+ }
55
85
  }