@futdevpro/nts-dynamo 1.10.49 → 1.10.51

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 (60) hide show
  1. package/.github/workflows/main.yml +11 -0
  2. package/build/_collections/archive.util.d.ts +10 -0
  3. package/build/_collections/archive.util.d.ts.map +1 -1
  4. package/build/_collections/archive.util.js +10 -0
  5. package/build/_collections/archive.util.js.map +1 -1
  6. package/build/_collections/global-settings.const.d.ts +4 -0
  7. package/build/_collections/global-settings.const.d.ts.map +1 -1
  8. package/build/_collections/global-settings.const.js +4 -0
  9. package/build/_collections/global-settings.const.js.map +1 -1
  10. package/build/_enums/data-model-type.enum.d.ts +4 -4
  11. package/build/_enums/data-model-type.enum.js +4 -4
  12. package/build/_enums/data-service-function.enum.d.ts +8 -2
  13. package/build/_enums/data-service-function.enum.d.ts.map +1 -1
  14. package/build/_enums/data-service-function.enum.js +8 -2
  15. package/build/_enums/data-service-function.enum.js.map +1 -1
  16. package/build/_enums/predefined-data-types.enum.d.ts +4 -15
  17. package/build/_enums/predefined-data-types.enum.d.ts.map +1 -1
  18. package/build/_enums/predefined-data-types.enum.js +4 -15
  19. package/build/_enums/predefined-data-types.enum.js.map +1 -1
  20. package/build/_models/control-models/app-params.control-model.d.ts.map +1 -1
  21. package/build/_models/control-models/app-params.control-model.js +17 -19
  22. package/build/_models/control-models/app-params.control-model.js.map +1 -1
  23. package/build/_models/control-models/app-params.control-model.spec.js +3 -3
  24. package/build/_models/control-models/app-params.control-model.spec.js.map +1 -1
  25. package/build/_modules/mock/app-extended-server.mock.d.ts.map +1 -1
  26. package/build/_modules/mock/app-extended-server.mock.js +3 -0
  27. package/build/_modules/mock/app-extended-server.mock.js.map +1 -1
  28. package/build/_modules/mock/app-server.mock.d.ts.map +1 -1
  29. package/build/_modules/mock/app-server.mock.js +3 -0
  30. package/build/_modules/mock/app-server.mock.js.map +1 -1
  31. package/build/_modules/socket/app-extended.server.spec.js +24 -9
  32. package/build/_modules/socket/app-extended.server.spec.js.map +1 -1
  33. package/build/_services/server/app.server.d.ts.map +1 -1
  34. package/build/_services/server/app.server.js +24 -2
  35. package/build/_services/server/app.server.js.map +1 -1
  36. package/build/_services/server/app.server.spec.js +16 -7
  37. package/build/_services/server/app.server.spec.js.map +1 -1
  38. package/build/_services/shared.static-service.d.ts +13 -9
  39. package/build/_services/shared.static-service.d.ts.map +1 -1
  40. package/build/_services/shared.static-service.js +13 -9
  41. package/build/_services/shared.static-service.js.map +1 -1
  42. package/build/index.d.ts +46 -0
  43. package/build/index.d.ts.map +1 -1
  44. package/build/index.js +46 -1
  45. package/build/index.js.map +1 -1
  46. package/package.json +3 -3
  47. package/src/_collections/archive.util.ts +10 -1
  48. package/src/_collections/global-settings.const.ts +4 -0
  49. package/src/_enums/data-model-type.enum.ts +5 -5
  50. package/src/_enums/data-service-function.enum.ts +12 -3
  51. package/src/_enums/predefined-data-types.enum.ts +5 -16
  52. package/src/_models/control-models/app-params.control-model.spec.ts +3 -3
  53. package/src/_models/control-models/app-params.control-model.ts +12 -17
  54. package/src/_modules/mock/app-extended-server.mock.ts +3 -0
  55. package/src/_modules/mock/app-server.mock.ts +3 -0
  56. package/src/_modules/socket/app-extended.server.spec.ts +99 -15
  57. package/src/_services/server/app.server.spec.ts +66 -10
  58. package/src/_services/server/app.server.ts +31 -2
  59. package/src/_services/shared.static-service.ts +17 -13
  60. package/src/index.ts +62 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,cAAc;AACd,sEAA4C;AAC5C,+EAAqD;AAGrD,QAAQ;AACR,wEAA8C;AAC9C,8EAAoD;AACpD,8EAAoD;AACpD,uEAA6C;AAG7C,6CAA6C;AAC7C,oBAAoB;AACpB,gGAAsE;AACtE,iGAAuE;AACvE,yFAA+D;AAC/D,iGAAuE;AAEvE,wBAAwB;AACxB,iGAAuE;AACvE,yGAA8E;AAC9E,4FAAkE;AAClE,qGAA2E;AAC3E,iGAAuE;AACvE,+FAAqE;AACrE,gGAAsE;AAEtE,eAAe;AACf,yEAA+C;AAG/C,WAAW;AACX,gBAAgB;AAChB,uEAA6C;AAC7C,wEAA8C;AAC9C,yEAA+C;AAC/C,0EAAgD;AAChD,sFAA4D;AAE5D,gBAAgB;AAChB,gFAAsD;AACtD,wEAA8C;AAC9C,sEAA4C;AAC5C,6EAAmD;AAEnD,kBAAkB;AAClB,wEAA8C;AAC9C,qEAA2C;AAE3C,iBAAiB;AACjB,+EAAqD;AACrD,mFAAyD;AAEzD,kBAAkB;AAClB,4EAAkD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,cAAc;AACd;;;;;;;;GAQG;AACH,sEAA4C;AAE5C;;;;;;;GAOG;AACH,+EAAqD;AAGrD,QAAQ;AACR;;GAEG;AACH,wEAA8C;AAE9C;;GAEG;AACH,8EAAoD;AAEpD;;GAEG;AACH,8EAAoD;AAEpD;;GAEG;AACH,uEAA6C;AAG7C,6CAA6C;AAE7C,mEAAmE;AACnE,gGAAsE;AACtE,iGAAuE;AACvE,yFAA+D;AAC/D,iGAAuE;AAEvE,wBAAwB;AAExB,wEAAwE;AACxE,iGAAuE;AACvE,yGAA8E;AAC9E,4FAAkE;AAClE,qGAA2E;AAC3E,iGAAuE;AACvE,+FAAqE;AACrE,gGAAsE;AAEtE,eAAe;AAEf,qDAAqD;AACrD,yEAA+C;AAG/C,WAAW;AACX,gBAAgB;AAChB,mDAAmD;AACnD,uEAA6C;AAE7C,6CAA6C;AAC7C,wEAA8C;AAE9C,gDAAgD;AAChD,yEAA+C;AAE/C,2DAA2D;AAC3D,0EAAgD;AAEhD,mCAAmC;AACnC,sFAA4D;AAE5D,gBAAgB;AAChB,kDAAkD;AAClD,gFAAsD;AAEtD,kDAAkD;AAClD,wEAA8C;AAE9C,+CAA+C;AAC/C,sEAA4C;AAE5C,sDAAsD;AACtD,6EAAmD;AAEnD,kBAAkB;AAClB,8BAA8B;AAC9B,wEAA8C;AAE9C,qCAAqC;AACrC,qEAA2C;AAE3C,iBAAiB;AACjB,oDAAoD;AACpD,+EAAqD;AAErD,+CAA+C;AAC/C,mFAAyD;AAEzD,kBAAkB;AAClB,qDAAqD;AACrD,4EAAkD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/nts-dynamo",
3
- "version": "01.10.49",
3
+ "version": "01.10.51",
4
4
  "description": "Dynamic NodeTS (NodeJS-Typescript), MongoDB Backend System Framework by Future Development Program Ltd.",
5
5
  "DyBu_settings": {
6
6
  "packageType": "server-package",
@@ -136,12 +136,12 @@
136
136
  },
137
137
  "homepage": "https:/futdevpro.hu/projects/dynamo",
138
138
  "DISABLED": {
139
- "@futdevpro/fsm-dynamo": "file:../tgz-collection/dynamo-fsm/futdevpro-fsm-dynamo-01.10.38.tgz",
139
+ "@futdevpro/fsm-dynamo": "file:../tgz-collection/dynamo-fsm/futdevpro-fsm-dynamo-01.10.39.tgz",
140
140
 
141
141
  "empty": ""
142
142
  },
143
143
  "peerDependencies": {
144
- "@futdevpro/fsm-dynamo": "1.10.38",
144
+ "@futdevpro/fsm-dynamo": "1.10.39",
145
145
 
146
146
  "@types/express": "4.17.21",
147
147
  "@types/geoip-lite": "~1.4.1",
@@ -1,8 +1,17 @@
1
1
 
2
2
 
3
-
3
+ /** Suffix appended to database names when archived. */
4
4
  export const DyNTS_archiveSuffix = 'archived';
5
5
 
6
+ /**
7
+ * Create the archive database name for a given base database.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const name = DyNTS_getArchivedDBName('users');
12
+ * // => 'users_archived'
13
+ * ```
14
+ */
6
15
  export function DyNTS_getArchivedDBName(dbName: string): string {
7
16
  return `${dbName}_${DyNTS_archiveSuffix}`;
8
17
  }
@@ -5,6 +5,10 @@ import { DyNTS_RouteSecurity } from '../_enums/route-security.enum';
5
5
  import { DyNTS_Global_Settings } from '../_models/interfaces/global-settings.interface';
6
6
  import { DyNTS_SocketSecurity } from '../_modules/socket/_enums/socket-security.enum';
7
7
 
8
+ /**
9
+ * Default configuration used across the NodeTS framework.
10
+ * These values can be overridden when bootstrapping the server.
11
+ */
8
12
  export const DyNTS_global_settings: DyNTS_Global_Settings = {
9
13
  baseUrl: '/api',
10
14
  systemVersion: 'unknown-version',
@@ -1,10 +1,10 @@
1
1
 
2
2
  /**
3
- * DataModelType is declaring where the data type is used
4
- *
5
- * dataModel: used in DB
6
- * controlModel: used only in runtime
7
- * interfaceModel: used only in runtime and doesnt need constructor
3
+ * Declares where a given model definition is used.
4
+ *
5
+ * - `dataModel`: persisted in the database
6
+ * - `controlModel`: runtime only
7
+ * - `interfaceModel`: runtime without constructor
8
8
  */
9
9
  /** @deprecated */
10
10
  export enum DyNTS_DataModelType {
@@ -1,15 +1,24 @@
1
1
 
2
2
  /**
3
- * DataServiceFunctions
4
- *
5
- * #unconnected TODO
3
+ * Commonly used operations within data services.
4
+ *
5
+ * Each value represents a standard CRUD style method
6
+ * that can be implemented by a service.
6
7
  */
7
8
  export enum DyNTS_DSF {
9
+ /** Retrieve all documents from the store. */
8
10
  getAll = 'getAll',
11
+
12
+ /** Load a single document by its identifier. */
9
13
  getDataById = 'getDataById',
10
14
  /* checkIfDataExists = 'checkIfDataExists',
11
15
  createData = 'createNewData', */
16
+ /** Update an existing document. */
12
17
  modifyData = 'modifyData',
18
+
19
+ /** Remove a document. */
13
20
  deleteData = 'deleteData',
21
+
22
+ /** Return data supplied directly rather than fetched. */
14
23
  getProvidedData = 'getProvidedData',
15
24
  }
@@ -1,9 +1,10 @@
1
1
 
2
2
  /**
3
- * the most basic data types
3
+ * A small set of primitive data type names used when
4
+ * describing field types in various models.
4
5
  */
5
6
  export enum DyanmoNTS_PredefinedDataTypes {
6
- 'string',
7
+ 'string',
7
8
  'number',
8
9
  'boolean',
9
10
  'Date',
@@ -11,18 +12,6 @@ export enum DyanmoNTS_PredefinedDataTypes {
11
12
  }
12
13
 
13
14
  /**
14
- * 'null' | 'boolean' | 'number' | 'string' | 'array' | 'object' |
15
- * 'date' | 'objectId' | 'mixed' | 'decimal128' | 'buffer' | 'map' |
16
- * 'documentArray' | 'embedded' | 'array' | 'objectId' | 'string' |
17
- * 'number' | 'boolean' | 'date' | 'buffer' | 'mixed' | 'decimal128' |
18
- * 'map' | 'documentArray' | 'embedded' | 'array' | 'objectId' |
19
- * 'string' | 'number' | 'boolean' | 'date' | 'buffer' | 'mixed' |
20
- * 'decimal128' | 'map' | 'documentArray' | 'embedded' | 'array' |
21
- * 'objectId' | 'string' | 'number' | 'boolean' | 'date' | 'buffer' |
22
- * 'mixed' | 'decimal128' | 'map' | 'documentArray' | 'embedded' |
23
- * 'array' | 'objectId' | 'string' | 'number' | 'boolean' | 'date' |
24
- * 'buffer' | 'mixed' | 'decimal128' | 'map' | 'documentArray' |
25
- * 'embedded' | 'array' | 'objectId' | 'string' | 'number' | 'boolean' |
26
- * 'date' | 'buffer' | 'mixed' | 'decimal128' | 'map' | 'documentArray' |
27
- * 'embedded'
15
+ * Full list of complex types supported by the framework
16
+ * when interacting with the database.
28
17
  */
@@ -8,7 +8,7 @@ describe('| DyNTS_App_Params', () => {
8
8
  title: 'Test Application',
9
9
  version: '1.0.0',
10
10
  dbName: 'testdb',
11
- dbUri: 'mongodb://localhost:27017/testdb',
11
+ dbUri: 'mongodb://0.0.0.0:27017/testdb',
12
12
  systemName: 'Test-App',
13
13
  systemShortCodeName: 'TA'
14
14
  };
@@ -19,7 +19,7 @@ describe('| DyNTS_App_Params', () => {
19
19
  expect(appParams.title).toBe('Test Application');
20
20
  expect(appParams.version).toBe('1.0.0');
21
21
  expect(appParams.dbName).toBe('testdb');
22
- expect(appParams.dbUri).toBe('mongodb://localhost:27017/testdb');
22
+ expect(appParams.dbUri).toBe('mongodb://0.0.0.0:27017/testdb');
23
23
  expect(appParams.systemName).toBe('Test-App');
24
24
  expect(appParams.systemShortCodeName).toBe('TA');
25
25
  });
@@ -37,7 +37,7 @@ describe('| DyNTS_App_Params', () => {
37
37
  expect(appParams.title).toBe('');
38
38
  expect(appParams.version).toBe('1.0.0');
39
39
  expect(appParams.dbName).toBe('testdb');
40
- expect(appParams.dbUri).toBe('mongodb://localhost:27017/testdb');
40
+ expect(appParams.dbUri).toBe('mongodb://0.0.0.0:27017/testdb');
41
41
  expect(appParams.systemName).toBe('TestApp');
42
42
  expect(appParams.systemShortCodeName).toBe('TA');
43
43
  });
@@ -33,9 +33,7 @@ export class DyNTS_App_Params {
33
33
  /**
34
34
  * options for the MongoDB connection
35
35
  */
36
- readonly dbOptions?: ConnectOptions = {
37
- directConnection: true,
38
- }
36
+ readonly dbOptions?: ConnectOptions;
39
37
 
40
38
  readonly openHost?: string;
41
39
  readonly secureHost?: string;
@@ -56,12 +54,17 @@ export class DyNTS_App_Params {
56
54
  this.name = set.name;
57
55
  this.title = set.title ?? '';
58
56
  this.version = set.version;
59
- this.dbName = set.dbName;
60
- this.dbUri = set.dbUri ?? `mongodb://localhost:27017/${this.dbName}`;
57
+ if (set.dbName || set.dbUri || set.dbOptions) {
58
+ this.dbName = set.dbName;
59
+ this.dbUri = set.dbUri ?? `mongodb://0.0.0.0:27017/${this.dbName}`;
60
+ this.dbOptions = set.dbOptions ?? {
61
+ directConnection: true,
62
+ };
63
+ }
61
64
  this.systemName = set.systemName ?? this.name.replace(' ', '-');
62
65
  this.systemShortCodeName = set.systemShortCodeName ?? this.systemName.replace(/[^A-Z]/g, '');
63
- this.openHost = set.openHost ?? 'localhost';
64
- this.secureHost = set.secureHost ?? 'localhost';
66
+ this.openHost = set.openHost ?? '0.0.0.0';
67
+ this.secureHost = set.secureHost ?? '0.0.0.0';
65
68
  this.expressBacklog = set.expressBacklog ?? 0;
66
69
 
67
70
  if (!this.dbName) {
@@ -80,20 +83,12 @@ export class DyNTS_App_Params {
80
83
  );
81
84
  }
82
85
 
83
- if (this.dbName?.includes('-')) {
86
+ /* if (this.dbName?.includes('-')) {
84
87
  DyFM_Log.warn(
85
88
  'DyNTS_App_Params.constructor: ' +
86
89
  `dbName should not contain "-" in "${this.dbName}" model.` +
87
90
  'For future compatibility.'
88
91
  );
89
- }
92
+ } */
90
93
  }
91
94
  }
92
-
93
- /* export function DyNTS_App_Params_Settings(
94
- set: DyNTS_App_Params
95
- ) {
96
- return function (target: Function) {
97
- target.prototype._params = set;
98
- }
99
- } */
@@ -34,6 +34,7 @@ export class DyNTS_AppExtendedBase_Mock extends DyNTS_AppExtended {
34
34
  name: 'test-extended-base',
35
35
  version: '1.0.1',
36
36
  dbName: 'test-base',
37
+ systemShortCodeName: 'MEB',
37
38
  });
38
39
  }
39
40
 
@@ -70,6 +71,7 @@ export class DyNTS_AppExtendedFull_Mock extends DyNTS_AppExtended {
70
71
  name: 'test-extended-full',
71
72
  version: 'x.0.101',
72
73
  dbName: 'test-full',
74
+ systemShortCodeName: 'MEF',
73
75
  });
74
76
  }
75
77
 
@@ -140,6 +142,7 @@ export class DyNTS_AppWbMock_Mock extends DyNTS_AppExtended {
140
142
  name: 'test-wb-mock',
141
143
  version: 'x.0.101',
142
144
  dbName: 'test-full',
145
+ systemShortCodeName: 'MWB',
143
146
  });
144
147
  }
145
148
 
@@ -27,6 +27,7 @@ export class DyNTS_AppBase_Mock extends DyNTS_App {
27
27
  name: 'test-base',
28
28
  version: 'x1.0.1',
29
29
  dbName: 'test-base',
30
+ systemShortCodeName: 'ABM',
30
31
  });
31
32
  }
32
33
 
@@ -58,6 +59,7 @@ export class DyNTS_AppFull_Mock extends DyNTS_App {
58
59
  name: 'test-full',
59
60
  version: 'xx.0.101',
60
61
  dbName: 'test-full',
62
+ systemShortCodeName: 'AFM',
61
63
  });
62
64
  }
63
65
 
@@ -149,6 +151,7 @@ export class DyNTS_AppTEST_Mock extends DyNTS_App {
149
151
  name: 'test-partial',
150
152
  version: 'p.0.1',
151
153
  dbName: 'test-partial',
154
+ systemShortCodeName: 'APM',
152
155
  });
153
156
  }
154
157
 
@@ -1,14 +1,22 @@
1
- import { DyFM_delay, DyFM_Error, DyFM_Log } from '@futdevpro/fsm-dynamo';
1
+ import { DyFM_delay, DyFM_Error, DyFM_Log, DyFM_waitUntil, second } from '@futdevpro/fsm-dynamo';
2
2
  import {
3
3
  DyNTS_AppExtendedBase_Mock, DyNTS_AppExtendedFull_Mock, DyNTS_AppWbMock_Mock
4
4
  } from '../mock/app-extended-server.mock';
5
+ import { DyNTS_AppExtended } from './app-extended.server';
5
6
 
6
7
  describe('| DyNTS_AppExtended;', (): void => {
7
- describe('| a extended-base instance;', (): void => {
8
- let app: DyNTS_AppExtendedBase_Mock;
8
+ jasmine.DEFAULT_TIMEOUT_INTERVAL = 30 * second;
9
+ process.setMaxListeners(20);
10
+ let app: DyNTS_AppExtended;
9
11
 
12
+ describe('| a extended-base instance;', (): void => {
10
13
  beforeEach(async (): Promise<void> => {
11
14
  try {
15
+ await DyFM_waitUntil(
16
+ (): boolean => !app,
17
+ second
18
+ );
19
+
12
20
  app = new DyNTS_AppExtendedBase_Mock();
13
21
 
14
22
  await DyFM_delay(100);
@@ -17,7 +25,19 @@ describe('| DyNTS_AppExtended;', (): void => {
17
25
 
18
26
  await DyFM_delay(100);
19
27
  } catch (error) {
20
- DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
28
+ DyFM_Log.testError(
29
+ '| DyNTS_AppExtended; | a extended-base instance; test beforeEach error:\n',
30
+ (error as DyFM_Error)?._message,
31
+ '\nadditionalContent:',
32
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
33
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
34
+ (error as DyFM_Error)._message ??
35
+ (error as Error).message
36
+ ) ?? (error as DyFM_Error)?.additionalContent,
37
+ '\n\n Stack:',
38
+ (new Error()).stack,
39
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
40
+ );
21
41
  }
22
42
  });
23
43
 
@@ -29,7 +49,19 @@ describe('| DyNTS_AppExtended;', (): void => {
29
49
 
30
50
  app = null;
31
51
  } catch (error) {
32
- DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
52
+ DyFM_Log.testError(
53
+ '| DyNTS_AppExtended; | a extended-base instance; test afterEach error:\n',
54
+ (error as DyFM_Error)?._message,
55
+ '\nadditionalContent:',
56
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
57
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
58
+ (error as DyFM_Error)._message ??
59
+ (error as Error).message
60
+ ) ?? (error as DyFM_Error)?.additionalContent,
61
+ '\n\n Stack:',
62
+ (new Error()).stack,
63
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
64
+ );
33
65
  }
34
66
  });
35
67
 
@@ -43,10 +75,13 @@ describe('| DyNTS_AppExtended;', (): void => {
43
75
  });
44
76
 
45
77
  describe('| a extended-full instance;', (): void => {
46
- let app: DyNTS_AppExtendedFull_Mock;
47
-
48
78
  beforeEach(async (): Promise<void> => {
49
79
  try {
80
+ await DyFM_waitUntil(
81
+ (): boolean => !app,
82
+ second
83
+ );
84
+
50
85
  app = new DyNTS_AppExtendedFull_Mock();
51
86
 
52
87
  await DyFM_delay(100);
@@ -55,7 +90,19 @@ describe('| DyNTS_AppExtended;', (): void => {
55
90
 
56
91
  await DyFM_delay(100);
57
92
  } catch (error) {
58
- DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
93
+ DyFM_Log.testError(
94
+ '| DyNTS_AppExtended; | a extended-full instance; test beforeEach error:\n',
95
+ (error as DyFM_Error)?._message,
96
+ '\nadditionalContent:',
97
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
98
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
99
+ (error as DyFM_Error)._message ??
100
+ (error as Error).message
101
+ ) ?? (error as DyFM_Error)?.additionalContent,
102
+ '\n\n Stack:',
103
+ (new Error()).stack,
104
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
105
+ );
59
106
  }
60
107
  });
61
108
 
@@ -67,7 +114,19 @@ describe('| DyNTS_AppExtended;', (): void => {
67
114
 
68
115
  app = null;
69
116
  } catch (error) {
70
- DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
117
+ DyFM_Log.testError(
118
+ '| DyNTS_AppExtended; | a extended-full instance; test afterEach error:\n',
119
+ (error as DyFM_Error)?._message,
120
+ '\nadditionalContent:',
121
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
122
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
123
+ (error as DyFM_Error)._message ??
124
+ (error as Error).message
125
+ ) ?? (error as DyFM_Error)?.additionalContent,
126
+ '\n\n Stack:',
127
+ (new Error()).stack,
128
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
129
+ );
71
130
  }
72
131
  });
73
132
 
@@ -81,22 +140,35 @@ describe('| DyNTS_AppExtended;', (): void => {
81
140
  });
82
141
 
83
142
  describe('| a wb-mock instance;', (): void => {
84
- let app: DyNTS_AppWbMock_Mock;
85
-
86
143
  beforeEach(async (): Promise<void> => {
87
144
  try {
88
- app = new DyNTS_AppWbMock_Mock();
145
+ await DyFM_waitUntil(
146
+ (): boolean => !app,
147
+ second
148
+ );
89
149
 
150
+ app = new DyNTS_AppWbMock_Mock();
90
151
  await DyFM_delay(100);
91
152
 
92
153
  await app.ready();
93
154
 
94
155
  await DyFM_delay(100);
95
156
  } catch (error) {
96
- DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
157
+ DyFM_Log.testError(
158
+ '| DyNTS_AppExtended; | a wb-mock instance; test beforeEach error:\n',
159
+ (error as DyFM_Error)?._message,
160
+ '\nadditionalContent:',
161
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
162
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
163
+ (error as DyFM_Error)._message ??
164
+ (error as Error).message
165
+ ) ?? (error as DyFM_Error)?.additionalContent,
166
+ '\n\n Stack:',
167
+ (new Error()).stack,
168
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
169
+ );
97
170
  }
98
171
  });
99
-
100
172
  afterEach(async (): Promise<void> => {
101
173
  try {
102
174
  await DyFM_delay(100);
@@ -105,7 +177,19 @@ describe('| DyNTS_AppExtended;', (): void => {
105
177
 
106
178
  app = null;
107
179
  } catch (error) {
108
- DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
180
+ DyFM_Log.testError(
181
+ '| DyNTS_AppExtended; | a wb-mock instance; test afterEach error:\n',
182
+ (error as DyFM_Error)?._message,
183
+ '\nadditionalContent:',
184
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
185
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
186
+ (error as DyFM_Error)._message ??
187
+ (error as Error).message
188
+ ) ?? (error as DyFM_Error)?.additionalContent,
189
+ '\n\n Stack:',
190
+ (new Error()).stack,
191
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
192
+ );
109
193
  }
110
194
  });
111
195
 
@@ -1,16 +1,21 @@
1
1
 
2
- import { DyFM_Error, DyFM_Log, DyFM_delay, second } from '@futdevpro/fsm-dynamo';
2
+ import { DyFM_Error, DyFM_Log, DyFM_delay, DyFM_waitUntil, second } from '@futdevpro/fsm-dynamo';
3
3
  import { DyNTS_AppBase_Mock, DyNTS_AppFull_Mock } from '../../_modules/mock/app-server.mock';
4
+ import { DyNTS_App } from './app.server';
4
5
 
5
6
  describe('| DyNTS_App AND DyNTS_AppExtended?;', (): void => {
6
- jasmine.DEFAULT_TIMEOUT_INTERVAL = 15 * second;
7
+ jasmine.DEFAULT_TIMEOUT_INTERVAL = 30 * second;
7
8
  process.setMaxListeners(20);
9
+ let app: DyNTS_App;
8
10
 
9
11
  describe('| a base instance;', (): void => {
10
- let app: DyNTS_AppBase_Mock;
11
-
12
12
  beforeEach(async (): Promise<void> => {
13
13
  try {
14
+ await DyFM_waitUntil(
15
+ (): boolean => !app,
16
+ second
17
+ );
18
+
14
19
  app = new DyNTS_AppBase_Mock();
15
20
 
16
21
  await DyFM_delay(100);
@@ -19,7 +24,19 @@ describe('| DyNTS_App AND DyNTS_AppExtended?;', (): void => {
19
24
 
20
25
  await DyFM_delay(100);
21
26
  } catch (error) {
22
- DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
27
+ DyFM_Log.testError(
28
+ '| DyNTS_App; | a base instance; test beforeEach error:\n',
29
+ (error as DyFM_Error)?._message,
30
+ '\nadditionalContent:',
31
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
32
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
33
+ (error as DyFM_Error)._message ??
34
+ (error as Error).message
35
+ ) ?? (error as DyFM_Error)?.additionalContent,
36
+ '\n\n Stack:',
37
+ (new Error()).stack,
38
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
39
+ );
23
40
  }
24
41
  });
25
42
 
@@ -33,7 +50,19 @@ describe('| DyNTS_App AND DyNTS_AppExtended?;', (): void => {
33
50
 
34
51
  await DyFM_delay(100);
35
52
  } catch (error) {
36
- DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
53
+ DyFM_Log.testError(
54
+ '| DyNTS_App; | a base instance; test afterEach error:\n',
55
+ (error as DyFM_Error)?._message,
56
+ '\nadditionalContent:',
57
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
58
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
59
+ (error as DyFM_Error)._message ??
60
+ (error as Error).message
61
+ ) ?? (error as DyFM_Error)?.additionalContent,
62
+ '\n\n Stack:',
63
+ (new Error()).stack,
64
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
65
+ );
37
66
  }
38
67
  });
39
68
 
@@ -47,10 +76,13 @@ describe('| DyNTS_App AND DyNTS_AppExtended?;', (): void => {
47
76
  });
48
77
 
49
78
  describe('| a full instance;', (): void => {
50
- let app: DyNTS_AppFull_Mock;
51
-
52
79
  beforeEach(async (): Promise<void> => {
53
80
  try {
81
+ await DyFM_waitUntil(
82
+ (): boolean => !app,
83
+ second
84
+ );
85
+
54
86
  app = new DyNTS_AppFull_Mock();
55
87
 
56
88
  await DyFM_delay(100);
@@ -59,7 +91,19 @@ describe('| DyNTS_App AND DyNTS_AppExtended?;', (): void => {
59
91
 
60
92
  await DyFM_delay(100);
61
93
  } catch (error) {
62
- DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
94
+ DyFM_Log.testError(
95
+ '| DyNTS_App; | a full instance; test beforeEach error:\n',
96
+ (error as DyFM_Error)?._message,
97
+ '\nadditionalContent:',
98
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
99
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
100
+ (error as DyFM_Error)._message ??
101
+ (error as Error).message
102
+ ) ?? (error as DyFM_Error)?.additionalContent,
103
+ '\n\n Stack:',
104
+ (new Error()).stack,
105
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
106
+ );
63
107
  }
64
108
  });
65
109
 
@@ -73,7 +117,19 @@ describe('| DyNTS_App AND DyNTS_AppExtended?;', (): void => {
73
117
 
74
118
  await DyFM_delay(100);
75
119
  } catch (error) {
76
- DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
120
+ DyFM_Log.testError(
121
+ '| DyNTS_App; | a full instance; test afterEach error:\n',
122
+ (error as DyFM_Error)?._message,
123
+ '\nadditionalContent:',
124
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.map(
125
+ (error: DyFM_Error | Error) => (error as DyFM_Error)._messages?.join('\n') ??
126
+ (error as DyFM_Error)._message ??
127
+ (error as Error).message
128
+ ) ?? (error as DyFM_Error)?.additionalContent,
129
+ '\n\n Stack:',
130
+ (new Error()).stack,
131
+ (error as DyFM_Error)?.additionalContent?.errors?.reverse()?.unshift()?.stack
132
+ );
77
133
  }
78
134
  });
79
135
 
@@ -414,7 +414,9 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
414
414
  this._routingModules = this.getRoutingModules();
415
415
  }
416
416
 
417
- await this.startDB();
417
+ if (this._params.dbUri) {
418
+ await this.startDB();
419
+ }
418
420
 
419
421
  await this.createEntries?.();
420
422
 
@@ -706,6 +708,8 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
706
708
  await this.mongoose.connection.close();
707
709
  await disconnect;
708
710
 
711
+ this.mongoose.connection.removeAllListeners();
712
+
709
713
  while (
710
714
  this.mongoose.connection.readyState !== 0 &&
711
715
  !this.constructErrors.length
@@ -766,6 +770,30 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
766
770
  private async startDB(): Promise<void> {
767
771
  if (this.fnLogs && this.deepLog) DyFM_Log.log('\nfn:. startDB');
768
772
 
773
+ if (!this._params.dbUri) {
774
+ throw new DyFM_Error({
775
+ ...this._getDefaultErrorSettings('startDB', new Error('DB URI is not set.')),
776
+
777
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AS0-SDB0`,
778
+ });
779
+ }
780
+
781
+ if (!this._params.dbOptions) {
782
+ throw new DyFM_Error({
783
+ ...this._getDefaultErrorSettings('startDB', new Error('DB OPTIONS are not set.')),
784
+
785
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AS0-SDB0`,
786
+ });
787
+ }
788
+
789
+ if (this.systemControls.mongoose.init || this.systemControls.mongoose.started) {
790
+ throw new DyFM_Error({
791
+ ...this._getDefaultErrorSettings('startDB', new Error('Mongoose is already initialized.')),
792
+
793
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AS0-SDB0`,
794
+ });
795
+ }
796
+
769
797
  try {
770
798
  await new Promise<void>(
771
799
  (resolve, reject): void => {
@@ -791,7 +819,8 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
791
819
  ...this._getDefaultErrorSettings('startDB', error),
792
820
 
793
821
  errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AS0-SDB1`,
794
- message: `Unable to start connection to MongoDB server, ERROR: ${error}`,
822
+ message: `Unable to start connection to MongoDB server (${this._params.dbUri}), ` +
823
+ `ERROR: ${error}`,
795
824
  });
796
825
 
797
826
  DyNTS_GlobalService.globalErrorHandler?.(d_error);