@futdevpro/nts-dynamo 1.10.9 → 1.10.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 (95) hide show
  1. package/build/_collections/global-settings.const.d.ts.map +1 -1
  2. package/build/_collections/global-settings.const.js +1 -0
  3. package/build/_collections/global-settings.const.js.map +1 -1
  4. package/build/_models/control-models/api-call-params.control-model.d.ts.map +1 -1
  5. package/build/_models/control-models/api-call-params.control-model.js +1 -2
  6. package/build/_models/control-models/api-call-params.control-model.js.map +1 -1
  7. package/build/_models/control-models/app-params.control-model.d.ts.map +1 -1
  8. package/build/_models/control-models/app-params.control-model.js +16 -0
  9. package/build/_models/control-models/app-params.control-model.js.map +1 -1
  10. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  11. package/build/_models/control-models/endpoint-params.control-model.js +1 -2
  12. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  13. package/build/_models/interfaces/global-settings.interface.d.ts +4 -0
  14. package/build/_models/interfaces/global-settings.interface.d.ts.map +1 -1
  15. package/build/_modules/mock/data-model.mock.spec.js +2 -2
  16. package/build/_modules/mock/data-model.mock.spec.js.map +1 -1
  17. package/build/_modules/server/error/error.controller.d.ts +13 -0
  18. package/build/_modules/server/error/error.controller.d.ts.map +1 -0
  19. package/build/_modules/server/error/error.controller.js +155 -0
  20. package/build/_modules/server/error/error.controller.js.map +1 -0
  21. package/build/_modules/server/error/error.data-service.d.ts +13 -0
  22. package/build/_modules/server/error/error.data-service.d.ts.map +1 -0
  23. package/build/_modules/server/error/error.data-service.js +249 -0
  24. package/build/_modules/server/error/error.data-service.js.map +1 -0
  25. package/build/_modules/server/index.d.ts +5 -0
  26. package/build/_modules/server/index.d.ts.map +1 -0
  27. package/build/_modules/server/index.js +10 -0
  28. package/build/_modules/server/index.js.map +1 -0
  29. package/build/_modules/server/server-status/server-status.control-service.d.ts +24 -0
  30. package/build/_modules/server/server-status/server-status.control-service.d.ts.map +1 -0
  31. package/build/_modules/server/server-status/server-status.control-service.js +102 -0
  32. package/build/_modules/server/server-status/server-status.control-service.js.map +1 -0
  33. package/build/_modules/server/server-status/server-status.controller.d.ts +9 -0
  34. package/build/_modules/server/server-status/server-status.controller.d.ts.map +1 -0
  35. package/build/_modules/server/server-status/server-status.controller.js +61 -0
  36. package/build/_modules/server/server-status/server-status.controller.js.map +1 -0
  37. package/build/_modules/socket/_services/socket-server.service.d.ts.map +1 -1
  38. package/build/_modules/socket/_services/socket-server.service.js.map +1 -1
  39. package/build/_modules/socket/index.d.ts +1 -0
  40. package/build/_modules/socket/index.d.ts.map +1 -1
  41. package/build/_modules/socket/index.js +1 -0
  42. package/build/_modules/socket/index.js.map +1 -1
  43. package/build/_services/base/data.service.d.ts +18 -10
  44. package/build/_services/base/data.service.d.ts.map +1 -1
  45. package/build/_services/base/data.service.js +151 -106
  46. package/build/_services/base/data.service.js.map +1 -1
  47. package/build/_services/base/db.service.d.ts +21 -10
  48. package/build/_services/base/db.service.d.ts.map +1 -1
  49. package/build/_services/base/db.service.js +79 -47
  50. package/build/_services/base/db.service.js.map +1 -1
  51. package/build/_services/core/api.service.d.ts.map +1 -1
  52. package/build/_services/core/api.service.js +18 -2
  53. package/build/_services/core/api.service.js.map +1 -1
  54. package/build/_services/core/global.service.d.ts.map +1 -1
  55. package/build/_services/core/global.service.js +8 -2
  56. package/build/_services/core/global.service.js.map +1 -1
  57. package/build/_services/server/app.server.d.ts.map +1 -1
  58. package/build/_services/server/app.server.js +13 -1
  59. package/build/_services/server/app.server.js.map +1 -1
  60. package/build/index.d.ts +0 -1
  61. package/build/index.d.ts.map +1 -1
  62. package/build/index.js +0 -1
  63. package/build/index.js.map +1 -1
  64. package/nodemon.json +2 -0
  65. package/package.json +11 -4
  66. package/src/_collections/global-settings.const.ts +1 -0
  67. package/src/_models/control-models/api-call-params.control-model.ts +2 -3
  68. package/src/_models/control-models/app-params.control-model.ts +25 -0
  69. package/src/_models/control-models/endpoint-params.control-model.ts +3 -3
  70. package/src/_models/interfaces/global-settings.interface.ts +5 -0
  71. package/src/_modules/mock/data-model.mock.spec.ts +2 -2
  72. package/src/_modules/server/error/error.controller.ts +210 -0
  73. package/src/_modules/server/error/error.data-service.ts +337 -0
  74. package/src/_modules/server/index.ts +11 -0
  75. package/src/_modules/server/server-status/server-status.control-service.ts +217 -0
  76. package/src/_modules/server/server-status/server-status.controller.ts +90 -0
  77. package/src/_modules/socket/_services/socket-server.service.ts +0 -1
  78. package/src/_modules/socket/index.ts +1 -1
  79. package/src/_services/base/data.service.ts +233 -164
  80. package/src/_services/base/db.service.ts +105 -60
  81. package/src/_services/core/api.service.ts +23 -2
  82. package/src/_services/core/global.service.ts +12 -5
  83. package/src/_services/server/app.server.ts +17 -4
  84. package/src/index.ts +0 -1
  85. package/tsconfig.json +1 -1
  86. package/build/_collections/stack.util.d.ts +0 -7
  87. package/build/_collections/stack.util.d.ts.map +0 -1
  88. package/build/_collections/stack.util.js +0 -31
  89. package/build/_collections/stack.util.js.map +0 -1
  90. package/build/_collections/stack.util.test.d.ts +0 -2
  91. package/build/_collections/stack.util.test.d.ts.map +0 -1
  92. package/build/_collections/stack.util.test.js +0 -96
  93. package/build/_collections/stack.util.test.js.map +0 -1
  94. package/src/_collections/stack.util.test.ts +0 -111
  95. package/src/_collections/stack.util.ts +0 -33
@@ -25,7 +25,8 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
25
25
 
26
26
  dataModel/* : mongoose.Model<T> */; // = mongoose.model(this.dataParams.dataName, this.getSchema());
27
27
 
28
- private depDataName: string;
28
+ /* private depDataName: string; */
29
+ private readonly depKeys: string[] = [];
29
30
 
30
31
  defaultErrorUserMsg =
31
32
  `We encountered an unhandled DB Error, ` +
@@ -43,7 +44,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
43
44
  try {
44
45
  this.serviceName = this.constructor?.name;
45
46
 
46
- if (!this.dataParams.dataName) {
47
+ if (!this.dataParams.dataName || typeof this.dataParams.dataName !== 'string') {
47
48
  throw new Error(
48
49
  `dbName not setted up for this db-service (${this.dataParams.dataName}) (NTS DB)`
49
50
  );
@@ -204,11 +205,11 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
204
205
  * get data by dependency data id,
205
206
  * !!!: throws error if not found (errorCode on not found: NTS-DBS-GD2)
206
207
  *
207
- * @param dependencyId id
208
+ * @param dependencyIdsFilter id
208
209
  * @returns data
209
210
  */
210
- async getDataByDependencyId(dependencyId: string): Promise<T> {
211
- if (!this.depDataName) {
211
+ async getDataByDependencyId(dependencyIdsFilter: { [key: string]: string }): Promise<T> {
212
+ if (!this.depKeys.length) {
212
213
  throw new DyFM_Error({
213
214
  ...this._getDefaultErrorSettings(
214
215
  'getDataByDependencyId',
@@ -222,31 +223,51 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
222
223
  }
223
224
 
224
225
  const data: T = await this.dataModel
225
- .findOne({ [this.depDataName]: dependencyId })
226
+ .findOne(dependencyIdsFilter)
226
227
  .then((res): T => res?.toObject() as T ?? null)
227
228
  .catch((error): void => {
228
229
  throw new DyFM_Error({
229
230
  ...this._getDefaultErrorSettings('getDataByDependencyId', error),
230
231
 
231
232
  errorCode: 'NTS-DBS-GD1',
232
- additionalContent: { dependencyId },
233
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
233
234
  message:
234
- `get "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful (NTS DB)`,
235
+ `get "${this.dataParams.dataName}" by ` +
236
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful (NTS DB)`,
235
237
  });
236
238
  });
237
239
 
238
240
  return this.stringifyDataId(data, 'getDataByDependencyId');
239
241
  }
240
242
 
243
+ async getDataListByIds(ids: string[]): Promise<T[]> {
244
+ const dataList: T[] = await this.dataModel
245
+ .find({ _id: { $in: ids } })
246
+ .then((res): T[] => res as T[] ?? [])
247
+ .catch((error): void => {
248
+ throw new DyFM_Error({
249
+ ...this._getDefaultErrorSettings('getDataListByIds', error),
250
+ errorCode: 'NTS-DBS-GDL0',
251
+ additionalContent: { ids },
252
+ });
253
+ });
254
+
255
+ return dataList.filter(
256
+ (data: T): boolean => !data._deleted
257
+ ).map(
258
+ (data: T): T => this.stringifyDataId(data, 'getDataListByDependencyId')
259
+ );
260
+ }
261
+
241
262
  /**
242
263
  * get data by dependency data id,
243
264
  * !!!: throws error if not found (errorCode on not found: NTS-DBS-GLD2)
244
265
  *
245
- * @param dependencyId id
266
+ * @param dependencyIdsFilter id
246
267
  * @returns dataList
247
268
  */
248
- async getDataListByDependencyId(dependencyId: string): Promise<T[]> {
249
- if (!this.depDataName) {
269
+ async getDataListByDependencyId(dependencyIdsFilter: { [key: string]: string }): Promise<T[]> {
270
+ if (!this.depKeys.length) {
250
271
  throw new DyFM_Error({
251
272
  ...this._getDefaultErrorSettings(
252
273
  'getDataListByDependencyId',
@@ -263,17 +284,16 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
263
284
  }
264
285
 
265
286
  const dataList: T[] = await this.dataModel
266
- .find({
267
- [this.depDataName]: dependencyId,
268
- })
287
+ .find(dependencyIdsFilter)
269
288
  .then((res): T[] => res as T[] ?? [])
270
289
  .catch((error): void => {
271
290
  throw new DyFM_Error({
272
291
  ...this._getDefaultErrorSettings('getDataListByDependencyId', error),
273
292
  errorCode: 'NTS-DBS-GLD1',
274
- additionalContent: { dependencyId },
293
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
275
294
  message:
276
- `get "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful (NTS DB)`,
295
+ `get "${this.dataParams.dataName}" by ` +
296
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful (NTS DB)`,
277
297
  });
278
298
  });
279
299
 
@@ -291,8 +311,8 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
291
311
  * @param ids ids
292
312
  * @returns dataList
293
313
  */
294
- async getDataListByDependencyIds(dependencyIds: string[]): Promise<T[]> {
295
- if (!this.depDataName) {
314
+ async getDataListByDependencyIds(dependencyKey: string, dependencyIds: string[]): Promise<T[]> {
315
+ if (!this.depKeys.length) {
296
316
  throw new DyFM_Error({
297
317
  ...this._getDefaultErrorSettings(
298
318
  'getDataListByDependencyIds',
@@ -305,9 +325,31 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
305
325
  });
306
326
  }
307
327
 
328
+ if (!dependencyIds?.length) {
329
+ return [];
330
+ }
331
+
332
+ if (!dependencyKey) {
333
+ throw new DyFM_Error({
334
+ ...this._getDefaultErrorSettings(
335
+ 'getDataListByDependencyIds',
336
+ new Error(`dependencyKey is missing! (${this.dataParams.dataName}) (NTS DB)`),
337
+ ),
338
+ });
339
+ }
340
+
341
+ if (!this.depKeys.includes(dependencyKey)) {
342
+ throw new DyFM_Error({
343
+ ...this._getDefaultErrorSettings(
344
+ 'getDataListByDependencyIds',
345
+ new Error(`dependencyKey is not valid! (${dependencyKey}) (NTS DB)`),
346
+ ),
347
+ });
348
+ }
349
+
308
350
  const dataList: T[] = await this.dataModel
309
351
  .find({
310
- [this.depDataName]: { $in: dependencyIds },
352
+ [dependencyKey]: { $in: dependencyIds },
311
353
  })
312
354
  .then((res): T[] => res as T[] ?? [])
313
355
  .catch((error): void => {
@@ -316,7 +358,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
316
358
  errorCode: 'NTS-DBS-GLDS1',
317
359
  additionalContent: { dependencyIds },
318
360
  message:
319
- `get "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful (NTS DB)`,
361
+ `get "${this.dataParams.dataName}" by "${dependencyKey}" was unsuccessful (NTS DB)`,
320
362
  });
321
363
  });
322
364
 
@@ -375,9 +417,9 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
375
417
  );
376
418
  }
377
419
 
378
- async markDeletedByDependencyId(dependencyId: string, issuer: string): Promise<void> {
420
+ async markDeletedByDependencyId(dependencyIdsFilter: { [key: string]: string }, issuer: string): Promise<void> {
379
421
  await this.dataModel.updateMany(
380
- { [this.depDataName]: dependencyId },
422
+ dependencyIdsFilter,
381
423
  {
382
424
  _deleted: new Date(),
383
425
  _deletedBy: issuer,
@@ -386,9 +428,10 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
386
428
  throw new DyFM_Error({
387
429
  ...this._getDefaultErrorSettings('markDeletedByDependencyId', error, issuer),
388
430
  errorCode: 'NTS-DBS-MDD0',
389
- additionalContent: { dependencyId },
431
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
390
432
  message:
391
- `markDeleted "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful ` +
433
+ `markDeleted "${this.dataParams.dataName}" by ` +
434
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful ` +
392
435
  `(NTS DB)`,
393
436
  issuer,
394
437
  });
@@ -415,9 +458,12 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
415
458
  });
416
459
  }
417
460
 
418
- async restoreDeletedByDependencyId(dependencyId: string, issuer: string): Promise<void> {
461
+ async restoreDeletedByDependencyId(
462
+ dependencyIdsFilter: { [key: string]: string },
463
+ issuer: string
464
+ ): Promise<void> {
419
465
  await this.dataModel.updateMany(
420
- { [this.depDataName]: dependencyId },
466
+ dependencyIdsFilter,
421
467
  {
422
468
  _deleted: null,
423
469
  __lastModified: new Date(),
@@ -427,9 +473,10 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
427
473
  throw new DyFM_Error({
428
474
  ...this._getDefaultErrorSettings('restoreDeletedByDependencyId', error, issuer),
429
475
  errorCode: 'NTS-DBS-RDD0',
430
- additionalContent: { dependencyId },
476
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
431
477
  message:
432
- `restoreDeleted "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful ` +
478
+ `restoreDeleted "${this.dataParams.dataName}" by ` +
479
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful ` +
433
480
  `(NTS DB)`,
434
481
  issuer,
435
482
  });
@@ -474,8 +521,8 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
474
521
  * deleted data by id
475
522
  * @param dependencyId id
476
523
  */
477
- async deleteDataByDependencyId(dependencyId: string): Promise<void> {
478
- if (!this.depDataName) {
524
+ async deleteDataByDependencyId(dependencyIdsFilter: { [key: string]: string }): Promise<void> {
525
+ if (!this.depKeys.length) {
479
526
  throw new DyFM_Error({
480
527
  ...this._getDefaultErrorSettings(
481
528
  'deleteDataByDependencyId',
@@ -489,14 +536,15 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
489
536
  }
490
537
 
491
538
  await this.dataModel
492
- .deleteMany({ [this.depDataName]: dependencyId })
539
+ .deleteMany(dependencyIdsFilter)
493
540
  .catch((error): void => {
494
541
  throw new DyFM_Error({
495
542
  ...this._getDefaultErrorSettings('deleteDataByDependencyId', error),
496
543
  errorCode: 'NTS-DBS-DDD1',
497
- additionalContent: { dependencyId },
544
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
498
545
  message:
499
- `delete "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful (NTS DB)`,
546
+ `delete "${this.dataParams.dataName}" by ` +
547
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful (NTS DB)`,
500
548
  });
501
549
  });
502
550
  }
@@ -521,12 +569,13 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
521
569
  */
522
570
  async searchData(
523
571
  filterBy: DyFM_DBFilter<T>,
524
- narrowByDependencyIds?: string[]
572
+ narrowByDependencyIds?: string[],
573
+ narrowByDependencyKey?: string,
525
574
  ): Promise<T[]> {
526
575
  const filter = {};
527
576
 
528
577
  if (0 < narrowByDependencyIds.length) {
529
- if (!this.depDataName) {
578
+ if (!this.depKeys.length) {
530
579
  throw new DyFM_Error({
531
580
  ...this._getDefaultErrorSettings(
532
581
  'searchData',
@@ -538,8 +587,21 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
538
587
  errorCode: 'NTS-DBS-SD0',
539
588
  });
540
589
  }
541
-
542
- filter[this.depDataName] = { $in: narrowByDependencyIds };
590
+
591
+ if (!narrowByDependencyKey) {
592
+ if (this.depKeys.length === 1) {
593
+ narrowByDependencyKey = this.depKeys[0];
594
+ } else {
595
+ throw new DyFM_Error({
596
+ ...this._getDefaultErrorSettings(
597
+ 'searchData',
598
+ new Error(`dependencyKey is missing! (${this.dataParams.dataName}) (NTS DB)`),
599
+ ),
600
+ });
601
+ }
602
+ }
603
+
604
+ filter[narrowByDependencyKey] = { $in: narrowByDependencyIds };
543
605
  }
544
606
 
545
607
  Object.values(this.dataParams.properties).forEach(
@@ -1231,33 +1293,16 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
1231
1293
  * sets depDataKey
1232
1294
  */
1233
1295
  private lookForDependencyDataSettings(): void {
1234
- const dependencyParam: DyFM_DataProperty_Params<any> =
1235
- Object.values(this.dataParams.properties).find(
1236
- (modelParams: DyFM_DataProperty_Params<any>): boolean =>
1237
- Boolean(modelParams.dependencyDataName)
1238
- );
1239
-
1240
- if (
1296
+ const dependencyParams: DyFM_DataProperty_Params<any>[] =
1241
1297
  Object.values(this.dataParams.properties).filter(
1242
1298
  (modelParams: DyFM_DataProperty_Params<any>): boolean =>
1243
1299
  Boolean(modelParams.dependencyDataName)
1244
- ).length > 1
1245
- ) {
1246
- throw new DyFM_Error({
1247
- ...this._getDefaultErrorSettings(
1248
- 'lookForDependencyDataSettings',
1249
- new Error(
1250
- `Multiple "dependencyDataName" found for this dataModel (${this.dataParams.dataName}) ` +
1251
- `(NTS DB)` +
1252
- `\nSorry, but this is not supported yet! (Donate to Dynamo to get this feature!)`
1253
- )
1254
- ),
1255
- errorCode: 'NTS-DBS-LFDD0',
1256
- });
1257
- }
1300
+ );
1258
1301
 
1259
- if (dependencyParam) {
1260
- this.depDataName = dependencyParam.key;
1302
+ if (dependencyParams) {
1303
+ this.depKeys.push(...dependencyParams.map(
1304
+ (dependencyParam: DyFM_DataProperty_Params<any>): string => dependencyParam.key
1305
+ ));
1261
1306
  }
1262
1307
  }
1263
1308
  }
@@ -195,7 +195,11 @@ export class DyNTS_ApiService {
195
195
  DyFM_Log.error(msg);
196
196
  }
197
197
 
198
- if (error && callParams?.httpOptions?.responseType === DyFM_HttpResponseType.text) {
198
+ if (
199
+ error &&
200
+ typeof error.error === 'string' &&
201
+ callParams?.httpOptions?.responseType === DyFM_HttpResponseType.text
202
+ ) {
199
203
  error.error = JSON.parse(error?.error);
200
204
  }
201
205
 
@@ -215,6 +219,7 @@ export class DyNTS_ApiService {
215
219
  additionalContent: {
216
220
  callParams,
217
221
  inputParams,
222
+ response: error.response,
218
223
  },
219
224
  });
220
225
 
@@ -233,6 +238,7 @@ export class DyNTS_ApiService {
233
238
  additionalContent: {
234
239
  callParams,
235
240
  inputParams,
241
+ response: error.response,
236
242
  },
237
243
  });
238
244
 
@@ -252,22 +258,37 @@ export class DyNTS_ApiService {
252
258
  callParams,
253
259
  inputParams,
254
260
  url,
261
+ response: error.response,
255
262
  },
256
263
  });
257
264
 
258
265
  } else if (error.config && error.message) {
259
266
 
267
+ let msg: string = error.message;
268
+ let status: number = +error.message.substring(error.message.length - 4, 3);
269
+
270
+ if (error.message.includes('status code')) {msg += `\nendpoint: ${callParams.baseUrl}${callParams.endpoint}` +
271
+ `\npathParams: ${
272
+ inputParams.pathParams ?
273
+ Object.keys(inputParams.pathParams).join(', ') :
274
+ '-no path params-'
275
+ }` +
276
+ `\nenpointStackLocation: ${callParams.stack}`;
277
+ }
278
+
260
279
  throw new DyFM_Error({
261
280
  ...this._getDefaultErrorSettings(
262
281
  callParams.name + ' startApiCall',
263
282
  error
264
283
  ),
265
284
 
266
- status: +error.message.substring(error.message.length - 4, 3),
285
+ status: status,
286
+ message: msg,
267
287
  errorCode: 'NTS-API-HE4',
268
288
  additionalContent: {
269
289
  callParams,
270
290
  inputParams,
291
+ response: error.response,
271
292
  },
272
293
  });
273
294
  } else {
@@ -235,11 +235,18 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
235
235
  );
236
236
  }
237
237
  } catch (error) {
238
- DyFM_Log.error(
239
- `NTS GLOBAL MULTILEVEL ERROR: ` +
240
- `\nFailed to handle error on globalErrorHandler.`,
241
- (error as DyFM_Error)?.getErrorSimplified?.() ?? error
242
- );
238
+ if (error instanceof DyFM_Error) {
239
+ error.logSimple(
240
+ `NTS GLOBAL MULTILEVEL ERROR: ` +
241
+ `\nFailed to handle error on globalErrorHandler.`,
242
+ );
243
+ } else {
244
+ DyFM_Log.error(
245
+ `NTS GLOBAL MULTILEVEL ERROR: ` +
246
+ `\nFailed to handle error on globalErrorHandler.`,
247
+ (error as DyFM_Error)?.getErrorSimplified?.() ?? error
248
+ );
249
+ }
243
250
  }
244
251
  });
245
252
  } catch (error) {
@@ -308,10 +308,23 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
308
308
 
309
309
  this.asyncConstruct(/* extended */).catch((error: any): void => {
310
310
  if (error instanceof DyFM_Error) {
311
- DyFM_Log.H_warn(
312
- '(constructor asyncConstruct.catch) additional error content:\n',
313
- error?.additionalContent
314
- );
311
+ if (error.additionalContent?.constructErrors?.length) {
312
+ error.additionalContent.constructErrors.forEach((errorItem: DyFM_Error): void => {
313
+ if (errorItem instanceof DyFM_Error) {
314
+ errorItem.logSimple(`(constructor asyncConstruct.catch) error:\n`);
315
+ } else {
316
+ DyFM_Log.H_warn(
317
+ '(constructor asyncConstruct.catch) additional error content:\n',
318
+ errorItem
319
+ );
320
+ }
321
+ });
322
+ } else {
323
+ DyFM_Log.H_warn(
324
+ '(constructor asyncConstruct.catch) additional error content:\n',
325
+ error?.additionalContent
326
+ );
327
+ }
315
328
  }
316
329
 
317
330
  if (
package/src/index.ts CHANGED
@@ -2,7 +2,6 @@
2
2
  // COLLECTIONS
3
3
  export * from './_collections/archive.util';
4
4
  export * from './_collections/global-settings.const';
5
- export * from './_collections/stack.util';
6
5
 
7
6
 
8
7
  // ENUMS
package/tsconfig.json CHANGED
@@ -37,6 +37,6 @@
37
37
  }
38
38
  },
39
39
  "include": [
40
- "src"
40
+ "src"
41
41
  ]
42
42
  }
@@ -1,7 +0,0 @@
1
- /**
2
- * Get the stack location of the constructor call
3
- * use it in the constructor of a class to get the stack location of the constructor call
4
- * @returns The stack location of the constructor call
5
- */
6
- export declare function DyNTS_getStackLocation(): string;
7
- //# sourceMappingURL=stack.util.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stack.util.d.ts","sourceRoot":"","sources":["../../src/_collections/stack.util.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAyB/C"}
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DyNTS_getStackLocation = void 0;
4
- const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
5
- /**
6
- * Get the stack location of the constructor call
7
- * use it in the constructor of a class to get the stack location of the constructor call
8
- * @returns The stack location of the constructor call
9
- */
10
- function DyNTS_getStackLocation() {
11
- let stack = new Error().stack;
12
- // Split the stack into lines and remove the first line (Error:)
13
- const stackLines = stack?.split('\n')?.slice(1);
14
- // Find the line that contains the constructor call
15
- // It will be the FIRST line that doesn't contain 'getStackLocation'
16
- let constructorLine = stackLines?.find(line => !line.includes('getStackLocation') &&
17
- !line.includes('at new'));
18
- if (!constructorLine) {
19
- fsm_dynamo_1.DyFM_Log.warn('No constructor line found');
20
- return '';
21
- }
22
- // Remove the 'constructorLine at ... (' and the ')'
23
- constructorLine = constructorLine.split('(')[1]?.split(')')[0];
24
- if (!constructorLine) {
25
- fsm_dynamo_1.DyFM_Log.warn('No constructor line found');
26
- return '';
27
- }
28
- return constructorLine;
29
- }
30
- exports.DyNTS_getStackLocation = DyNTS_getStackLocation;
31
- //# sourceMappingURL=stack.util.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stack.util.js","sourceRoot":"","sources":["../../src/_collections/stack.util.ts"],"names":[],"mappings":";;;AAAA,sDAAiD;AAEjD;;;;GAIG;AACH,SAAgB,sBAAsB;IACpC,IAAI,KAAK,GAAW,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC;IAEtC,gEAAgE;IAChE,MAAM,UAAU,GAAG,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEhD,mDAAmD;IACnD,oEAAoE;IACpE,IAAI,eAAe,GAAG,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5C,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAClC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACzB,CAAC;IACF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,qBAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,wDAAwD;IACxD,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,qBAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAzBD,wDAyBC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=stack.util.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stack.util.test.d.ts","sourceRoot":"","sources":["../../src/_collections/stack.util.test.ts"],"names":[],"mappings":""}
@@ -1,96 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const stack_util_1 = require("./stack.util");
4
- describe('stack.util.ts', () => {
5
- describe('DyNTS_getStackLocation', () => {
6
- // Test class for basic functionality
7
- class TestClass {
8
- constructor() {
9
- this.location = (0, stack_util_1.DyNTS_getStackLocation)();
10
- }
11
- location;
12
- }
13
- // Test class for nested instantiation
14
- class NestedTestClass {
15
- constructor() {
16
- this.location = (0, stack_util_1.DyNTS_getStackLocation)();
17
- }
18
- location;
19
- }
20
- // Test class with parameters
21
- class ParamTestClass {
22
- constructor(param) {
23
- this.location = (0, stack_util_1.DyNTS_getStackLocation)();
24
- }
25
- location;
26
- }
27
- // Test class for async instantiation
28
- class AsyncTestClass {
29
- constructor() {
30
- this.location = (0, stack_util_1.DyNTS_getStackLocation)();
31
- }
32
- location;
33
- }
34
- describe('format validation', () => {
35
- it('should return location in correct file:line:column format', () => {
36
- const instance = new TestClass();
37
- const [file, line, column] = instance.location.split(':');
38
- expect(file).toBeTruthy();
39
- expect(parseInt(line)).toBeGreaterThan(0);
40
- expect(parseInt(column)).toBeGreaterThan(0);
41
- expect(instance.location).toMatch(/^[^:]+:\d+:\d+$/);
42
- });
43
- it('should include the correct file path', () => {
44
- const instance = new TestClass();
45
- expect(instance.location).toContain('stack.util.test.ts');
46
- });
47
- });
48
- describe('location uniqueness', () => {
49
- it('should return different locations for different instantiation points', () => {
50
- const instance1 = new TestClass();
51
- const instance2 = new TestClass();
52
- expect(instance1.location).not.toBe(instance2.location);
53
- });
54
- it('should return different locations for different classes', () => {
55
- const instance1 = new TestClass();
56
- const instance2 = new NestedTestClass();
57
- expect(instance1.location).not.toBe(instance2.location);
58
- });
59
- });
60
- describe('class instantiation variations', () => {
61
- it('should work with nested class instantiation', () => {
62
- const instance = new NestedTestClass();
63
- expect(instance.location).toContain('NestedTestClass');
64
- });
65
- it('should handle class instantiation with parameters', () => {
66
- const instance = new ParamTestClass('test');
67
- expect(instance.location).toMatch(/^[^:]+:\d+:\d+$/);
68
- });
69
- it('should work with async class instantiation', async () => {
70
- const instance = new AsyncTestClass();
71
- expect(instance.location).toMatch(/^[^:]+:\d+:\d+$/);
72
- });
73
- });
74
- describe('error handling', () => {
75
- it('should handle invalid stack trace gracefully', () => {
76
- // Mock Error.stack to be undefined
77
- const originalStack = Error.prototype.stack;
78
- Error.prototype.stack = undefined;
79
- const instance = new TestClass();
80
- expect(instance.location).toBe('');
81
- // Restore original stack
82
- Error.prototype.stack = originalStack;
83
- });
84
- it('should handle malformed stack trace gracefully', () => {
85
- // Mock Error.stack to be malformed
86
- const originalStack = Error.prototype.stack;
87
- Error.prototype.stack = 'Invalid stack trace';
88
- const instance = new TestClass();
89
- expect(instance.location).toBe('');
90
- // Restore original stack
91
- Error.prototype.stack = originalStack;
92
- });
93
- });
94
- });
95
- });
96
- //# sourceMappingURL=stack.util.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stack.util.test.js","sourceRoot":"","sources":["../../src/_collections/stack.util.test.ts"],"names":[],"mappings":"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"}