@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.
- package/.github/workflows/main.yml +11 -0
- package/build/_collections/archive.util.d.ts +10 -0
- package/build/_collections/archive.util.d.ts.map +1 -1
- package/build/_collections/archive.util.js +10 -0
- package/build/_collections/archive.util.js.map +1 -1
- package/build/_collections/global-settings.const.d.ts +4 -0
- package/build/_collections/global-settings.const.d.ts.map +1 -1
- package/build/_collections/global-settings.const.js +4 -0
- package/build/_collections/global-settings.const.js.map +1 -1
- package/build/_enums/data-model-type.enum.d.ts +4 -4
- package/build/_enums/data-model-type.enum.js +4 -4
- package/build/_enums/data-service-function.enum.d.ts +8 -2
- package/build/_enums/data-service-function.enum.d.ts.map +1 -1
- package/build/_enums/data-service-function.enum.js +8 -2
- package/build/_enums/data-service-function.enum.js.map +1 -1
- package/build/_enums/predefined-data-types.enum.d.ts +4 -15
- package/build/_enums/predefined-data-types.enum.d.ts.map +1 -1
- package/build/_enums/predefined-data-types.enum.js +4 -15
- package/build/_enums/predefined-data-types.enum.js.map +1 -1
- package/build/_models/control-models/app-params.control-model.d.ts.map +1 -1
- package/build/_models/control-models/app-params.control-model.js +17 -19
- package/build/_models/control-models/app-params.control-model.js.map +1 -1
- package/build/_models/control-models/app-params.control-model.spec.js +3 -3
- package/build/_models/control-models/app-params.control-model.spec.js.map +1 -1
- package/build/_modules/mock/app-extended-server.mock.d.ts.map +1 -1
- package/build/_modules/mock/app-extended-server.mock.js +3 -0
- package/build/_modules/mock/app-extended-server.mock.js.map +1 -1
- package/build/_modules/mock/app-server.mock.d.ts.map +1 -1
- package/build/_modules/mock/app-server.mock.js +3 -0
- package/build/_modules/mock/app-server.mock.js.map +1 -1
- package/build/_modules/socket/app-extended.server.spec.js +24 -9
- package/build/_modules/socket/app-extended.server.spec.js.map +1 -1
- package/build/_services/server/app.server.d.ts.map +1 -1
- package/build/_services/server/app.server.js +24 -2
- package/build/_services/server/app.server.js.map +1 -1
- package/build/_services/server/app.server.spec.js +16 -7
- package/build/_services/server/app.server.spec.js.map +1 -1
- package/build/_services/shared.static-service.d.ts +13 -9
- package/build/_services/shared.static-service.d.ts.map +1 -1
- package/build/_services/shared.static-service.js +13 -9
- package/build/_services/shared.static-service.js.map +1 -1
- package/build/index.d.ts +46 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +46 -1
- package/build/index.js.map +1 -1
- package/package.json +3 -3
- package/src/_collections/archive.util.ts +10 -1
- package/src/_collections/global-settings.const.ts +4 -0
- package/src/_enums/data-model-type.enum.ts +5 -5
- package/src/_enums/data-service-function.enum.ts +12 -3
- package/src/_enums/predefined-data-types.enum.ts +5 -16
- package/src/_models/control-models/app-params.control-model.spec.ts +3 -3
- package/src/_models/control-models/app-params.control-model.ts +12 -17
- package/src/_modules/mock/app-extended-server.mock.ts +3 -0
- package/src/_modules/mock/app-server.mock.ts +3 -0
- package/src/_modules/socket/app-extended.server.spec.ts +99 -15
- package/src/_services/server/app.server.spec.ts +66 -10
- package/src/_services/server/app.server.ts +31 -2
- package/src/_services/shared.static-service.ts +17 -13
- package/src/index.ts +62 -1
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,cAAc;AACd,sEAA4C;
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* dataModel
|
|
6
|
-
* controlModel
|
|
7
|
-
* interfaceModel
|
|
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
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
15
|
-
*
|
|
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://
|
|
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://
|
|
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://
|
|
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
|
-
|
|
60
|
-
|
|
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 ?? '
|
|
64
|
-
this.secureHost = set.secureHost ?? '
|
|
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
|
-
|
|
8
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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 =
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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);
|