@adaptivestone/framework 5.0.0-beta.10 → 5.0.0-beta.12
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/CHANGELOG.md +12 -0
- package/LICENCE +1 -1
- package/cliCommand.ts +10 -0
- package/dist/Cli.d.ts +7 -0
- package/dist/Cli.js +19 -0
- package/dist/Cli.js.map +1 -0
- package/dist/cluster.d.ts +1 -0
- package/dist/cluster.js +18 -0
- package/dist/cluster.js.map +1 -0
- package/dist/commands/CreateUser.d.ts +32 -0
- package/dist/commands/CreateUser.js +81 -0
- package/dist/commands/CreateUser.js.map +1 -0
- package/dist/commands/Documentation.d.ts +5 -0
- package/dist/commands/Documentation.js +15 -0
- package/dist/commands/Documentation.js.map +1 -0
- package/dist/commands/DropIndex.d.ts +16 -0
- package/dist/commands/DropIndex.js +30 -0
- package/dist/commands/DropIndex.js.map +1 -0
- package/dist/commands/GenerateRandomBytes.d.ts +7 -0
- package/dist/commands/GenerateRandomBytes.js +18 -0
- package/dist/commands/GenerateRandomBytes.js.map +1 -0
- package/dist/commands/GetOpenApiJson.d.ts +17 -0
- package/dist/commands/GetOpenApiJson.js +272 -0
- package/dist/commands/GetOpenApiJson.js.map +1 -0
- package/dist/commands/SyncIndexes.d.ts +6 -0
- package/dist/commands/SyncIndexes.js +32 -0
- package/dist/commands/SyncIndexes.js.map +1 -0
- package/dist/commands/migration/Create.d.ts +18 -0
- package/dist/commands/migration/Create.js +57 -0
- package/dist/commands/migration/Create.js.map +1 -0
- package/dist/commands/migration/Migrate.d.ts +6 -0
- package/dist/commands/migration/Migrate.js +46 -0
- package/dist/commands/migration/Migrate.js.map +1 -0
- package/dist/config/auth.d.ts +6 -0
- package/dist/config/auth.js +7 -0
- package/dist/config/auth.js.map +1 -0
- package/dist/config/http.d.ts +8 -0
- package/dist/config/http.js +10 -0
- package/dist/config/http.js.map +1 -0
- package/dist/config/i18n.d.ts +10 -0
- package/dist/config/i18n.js +13 -0
- package/dist/config/i18n.js.map +1 -0
- package/dist/config/ipDetector.d.ts +5 -0
- package/dist/config/ipDetector.js +15 -0
- package/dist/config/ipDetector.js.map +1 -0
- package/dist/config/log.d.ts +22 -0
- package/dist/config/log.js +23 -0
- package/dist/config/log.js.map +1 -0
- package/dist/config/mongo.d.ts +4 -0
- package/dist/config/mongo.js +4 -0
- package/dist/config/mongo.js.map +1 -0
- package/dist/config/rateLimiter.d.ts +15 -0
- package/dist/config/rateLimiter.js +17 -0
- package/dist/config/rateLimiter.js.map +1 -0
- package/dist/config/redis.d.ts +5 -0
- package/dist/config/redis.js +5 -0
- package/dist/config/redis.js.map +1 -0
- package/dist/config/validate.d.ts +4 -0
- package/dist/config/validate.js +4 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/controllers/Auth.d.ts +74 -0
- package/dist/controllers/Auth.js +181 -0
- package/dist/controllers/Auth.js.map +1 -0
- package/dist/controllers/Home.d.ts +15 -0
- package/dist/controllers/Home.js +24 -0
- package/dist/controllers/Home.js.map +1 -0
- package/dist/controllers/index.d.ts +16 -0
- package/dist/controllers/index.js +59 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/folderConfig.d.ts +34 -0
- package/dist/folderConfig.js +15 -0
- package/dist/folderConfig.js.map +1 -0
- package/dist/helpers/files.d.ts +16 -0
- package/dist/helpers/files.js +73 -0
- package/dist/helpers/files.js.map +1 -0
- package/dist/helpers/logger.d.ts +4 -0
- package/dist/helpers/logger.js +28 -0
- package/dist/helpers/logger.js.map +1 -0
- package/dist/helpers/redis/clearNamespace.d.ts +3 -0
- package/dist/helpers/redis/clearNamespace.js +15 -0
- package/dist/helpers/redis/clearNamespace.js.map +1 -0
- package/dist/helpers/yup.d.ts +13 -0
- package/{helpers → dist/helpers}/yup.js +8 -9
- package/dist/helpers/yup.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/models/Lock.d.ts +62 -0
- package/dist/models/Lock.js +94 -0
- package/dist/models/Lock.js.map +1 -0
- package/dist/models/Migration.d.ts +11 -0
- package/dist/models/Migration.js +14 -0
- package/dist/models/Migration.js.map +1 -0
- package/dist/models/Sequence.d.ts +16 -0
- package/dist/models/Sequence.js +16 -0
- package/dist/models/Sequence.js.map +1 -0
- package/dist/models/User.d.ts +101 -0
- package/dist/models/User.js +230 -0
- package/dist/models/User.js.map +1 -0
- package/dist/modules/AbstractCommand.d.ts +30 -0
- package/dist/modules/AbstractCommand.js +44 -0
- package/dist/modules/AbstractCommand.js.map +1 -0
- package/dist/modules/AbstractConnector.d.ts +5 -0
- package/dist/modules/AbstractConnector.js +8 -0
- package/dist/modules/AbstractConnector.js.map +1 -0
- package/dist/modules/AbstractController.d.ts +90 -0
- package/dist/modules/AbstractController.js +324 -0
- package/dist/modules/AbstractController.js.map +1 -0
- package/dist/modules/AbstractModel.d.ts +32 -0
- package/dist/modules/AbstractModel.js +73 -0
- package/dist/modules/AbstractModel.js.map +1 -0
- package/dist/modules/Base.d.ts +29 -0
- package/dist/modules/Base.js +54 -0
- package/dist/modules/Base.js.map +1 -0
- package/dist/modules/BaseCli.d.ts +25 -0
- package/dist/modules/BaseCli.js +138 -0
- package/dist/modules/BaseCli.js.map +1 -0
- package/dist/server.d.ts +110 -0
- package/dist/server.js +372 -0
- package/dist/server.js.map +1 -0
- package/dist/services/cache/Cache.d.ts +31 -0
- package/dist/services/cache/Cache.js +115 -0
- package/dist/services/cache/Cache.js.map +1 -0
- package/dist/services/documentation/DocumentationGenerator.d.ts +11 -0
- package/dist/services/documentation/DocumentationGenerator.js +134 -0
- package/dist/services/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/services/http/HttpServer.d.ts +35 -0
- package/dist/services/http/HttpServer.js +71 -0
- package/dist/services/http/HttpServer.js.map +1 -0
- package/dist/services/http/middleware/AbstractMiddleware.d.ts +25 -0
- package/dist/services/http/middleware/AbstractMiddleware.js +43 -0
- package/dist/services/http/middleware/AbstractMiddleware.js.map +1 -0
- package/dist/services/http/middleware/Auth.d.ts +9 -0
- package/dist/services/http/middleware/Auth.js +18 -0
- package/dist/services/http/middleware/Auth.js.map +1 -0
- package/dist/services/http/middleware/Cors.d.ts +10 -0
- package/dist/services/http/middleware/Cors.js +36 -0
- package/dist/services/http/middleware/Cors.js.map +1 -0
- package/dist/services/http/middleware/GetUserByToken.d.ts +19 -0
- package/dist/services/http/middleware/GetUserByToken.js +40 -0
- package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
- package/dist/services/http/middleware/I18n.d.ts +26 -0
- package/dist/services/http/middleware/I18n.js +97 -0
- package/dist/services/http/middleware/I18n.js.map +1 -0
- package/dist/services/http/middleware/IpDetector.d.ts +12 -0
- package/dist/services/http/middleware/IpDetector.js +51 -0
- package/dist/services/http/middleware/IpDetector.js.map +1 -0
- package/dist/services/http/middleware/Pagination.d.ts +27 -0
- package/dist/services/http/middleware/Pagination.js +47 -0
- package/dist/services/http/middleware/Pagination.js.map +1 -0
- package/dist/services/http/middleware/PrepareAppInfo.d.ts +8 -0
- package/dist/services/http/middleware/PrepareAppInfo.js +17 -0
- package/dist/services/http/middleware/PrepareAppInfo.js.map +1 -0
- package/dist/services/http/middleware/RateLimiter.d.ts +18 -0
- package/dist/services/http/middleware/RateLimiter.js +106 -0
- package/dist/services/http/middleware/RateLimiter.js.map +1 -0
- package/dist/services/http/middleware/RequestLogger.d.ts +8 -0
- package/dist/services/http/middleware/RequestLogger.js +18 -0
- package/dist/services/http/middleware/RequestLogger.js.map +1 -0
- package/dist/services/http/middleware/RequestParser.d.ts +8 -0
- package/dist/services/http/middleware/RequestParser.js +35 -0
- package/dist/services/http/middleware/RequestParser.js.map +1 -0
- package/dist/services/http/middleware/Role.d.ts +9 -0
- package/dist/services/http/middleware/Role.js +24 -0
- package/dist/services/http/middleware/Role.js.map +1 -0
- package/dist/services/validate/ValidateService.d.ts +31 -0
- package/dist/services/validate/ValidateService.js +96 -0
- package/dist/services/validate/ValidateService.js.map +1 -0
- package/dist/services/validate/drivers/AbstractValidator.d.ts +14 -0
- package/dist/services/validate/drivers/AbstractValidator.js +32 -0
- package/dist/services/validate/drivers/AbstractValidator.js.map +1 -0
- package/dist/services/validate/drivers/CustomValidator.d.ts +14 -0
- package/dist/services/validate/drivers/CustomValidator.js +48 -0
- package/dist/services/validate/drivers/CustomValidator.js.map +1 -0
- package/dist/services/validate/drivers/YupValidator.d.ts +13 -0
- package/dist/services/validate/drivers/YupValidator.js +86 -0
- package/dist/services/validate/drivers/YupValidator.js.map +1 -0
- package/dist/tests/globalSetupVitest.d.ts +2 -0
- package/dist/tests/globalSetupVitest.js +29 -0
- package/dist/tests/globalSetupVitest.js.map +1 -0
- package/dist/tests/setupVitest.d.ts +1 -0
- package/dist/tests/setupVitest.js +99 -0
- package/dist/tests/setupVitest.js.map +1 -0
- package/package.json +19 -10
- package/Cli.js +0 -21
- package/cluster.js +0 -25
- package/commands/.gitkeep +0 -0
- package/commands/CreateUser.js +0 -106
- package/commands/Documentation.js +0 -17
- package/commands/DropIndex.js +0 -38
- package/commands/GenerateRandomBytes.js +0 -21
- package/commands/GetOpenApiJson.js +0 -336
- package/commands/SyncIndexes.js +0 -40
- package/commands/migration/Create.js +0 -72
- package/commands/migration/Migrate.js +0 -56
- package/config/auth.js +0 -9
- package/config/http.js +0 -9
- package/config/i18n.js +0 -12
- package/config/ipDetector.js +0 -14
- package/config/log.js +0 -22
- package/config/mongo.js +0 -3
- package/config/rateLimiter.js +0 -16
- package/config/redis.js +0 -4
- package/config/validate.js +0 -3
- package/controllers/Auth.js +0 -201
- package/controllers/Home.js +0 -28
- package/controllers/index.js +0 -60
- package/eslint.config.js +0 -68
- package/folderConfig.js +0 -13
- package/helpers/files.js +0 -76
- package/helpers/logger.js +0 -16
- package/helpers/redis/clearNamespace.js +0 -14
- package/index.js +0 -8
- package/jsconfig.json +0 -9
- package/locales/en/translation.json +0 -27
- package/locales/ru/translation.json +0 -27
- package/migrations/.gitkeep +0 -0
- package/models/Lock.js +0 -107
- package/models/Migration.js +0 -15
- package/models/Sequence.js +0 -22
- package/models/User.js +0 -280
- package/modules/AbstractCommand.js +0 -52
- package/modules/AbstractConnector.js +0 -9
- package/modules/AbstractController.js +0 -406
- package/modules/AbstractModel.d.ts +0 -48
- package/modules/AbstractModel.js +0 -92
- package/modules/Base.d.ts +0 -37
- package/modules/Base.js +0 -64
- package/modules/BaseCli.js +0 -157
- package/server.d.ts +0 -100
- package/server.js +0 -439
- package/services/cache/Cache.d.ts +0 -35
- package/services/cache/Cache.js +0 -124
- package/services/documentation/DocumentationGenerator.js +0 -169
- package/services/http/HttpServer.js +0 -89
- package/services/http/middleware/AbstractMiddleware.js +0 -51
- package/services/http/middleware/Auth.js +0 -20
- package/services/http/middleware/Cors.js +0 -46
- package/services/http/middleware/GetUserByToken.js +0 -47
- package/services/http/middleware/I18n.js +0 -117
- package/services/http/middleware/IpDetector.js +0 -59
- package/services/http/middleware/Pagination.js +0 -57
- package/services/http/middleware/PrepareAppInfo.js +0 -18
- package/services/http/middleware/RateLimiter.js +0 -134
- package/services/http/middleware/RequestLogger.js +0 -22
- package/services/http/middleware/RequestParser.js +0 -40
- package/services/http/middleware/Role.js +0 -29
- package/services/messaging/email/resources/.gitkeep +0 -1
- package/services/messaging/email/templates/.gitkeep +0 -0
- package/services/messaging/email/templates/recovery/html.pug +0 -8
- package/services/messaging/email/templates/recovery/subject.pug +0 -2
- package/services/messaging/email/templates/recovery/text.pug +0 -3
- package/services/messaging/email/templates/verification/html.pug +0 -10
- package/services/messaging/email/templates/verification/subject.pug +0 -1
- package/services/messaging/email/templates/verification/text.pug +0 -1
- package/services/validate/ValidateService.js +0 -157
- package/services/validate/drivers/AbstractValidator.js +0 -37
- package/services/validate/drivers/CustomValidator.js +0 -51
- package/services/validate/drivers/YupValidator.js +0 -103
- package/tests/globalSetupVitest.js +0 -35
- package/tests/setup.js +0 -120
- package/tests/setupVitest.js +0 -111
- package/types/Expand.d.ts +0 -11
- package/types/ICommandArguments.d.ts +0 -41
- package/types/TFoldersConfig.d.ts +0 -20
- package/views/404.pug +0 -3
- package/views/home.pug +0 -3
- package/views/layouts/base.pug +0 -39
- package/vitest.config.js +0 -17
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { ValidationError } from 'yup';
|
|
2
|
-
import AbstractValidator from './AbstractValidator.js';
|
|
3
|
-
|
|
4
|
-
class YupValidator extends AbstractValidator {
|
|
5
|
-
get fieldsInJsonFormat() {
|
|
6
|
-
return YupValidator.convertFieldsToJson(this.body);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
static convertFieldsToJson(fields) {
|
|
10
|
-
const convertedFields = {};
|
|
11
|
-
const entries = Object.entries(fields.describe().fields);
|
|
12
|
-
|
|
13
|
-
if (!entries?.length) {
|
|
14
|
-
return convertedFields;
|
|
15
|
-
}
|
|
16
|
-
const requiredFields = [];
|
|
17
|
-
|
|
18
|
-
for (const [field, fieldProp] of entries) {
|
|
19
|
-
const isRequired = fieldProp?.tests?.find(
|
|
20
|
-
(prop) => prop.name === 'required',
|
|
21
|
-
);
|
|
22
|
-
if (isRequired) {
|
|
23
|
-
requiredFields.push(field);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
entries.forEach(([key, value]) => {
|
|
28
|
-
if (!convertedFields[key]) {
|
|
29
|
-
convertedFields[key] = {};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
convertedFields[key] = {
|
|
33
|
-
type: value.type,
|
|
34
|
-
required: requiredFields?.includes(key),
|
|
35
|
-
};
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
return convertedFields;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async validateFields(data, { query, body, appInfo }) {
|
|
42
|
-
const yupSchema = this.body;
|
|
43
|
-
const { controllerValidationAbortEarly } = this.app.getConfig('validate');
|
|
44
|
-
if (yupSchema) {
|
|
45
|
-
if (typeof yupSchema.validate !== 'function') {
|
|
46
|
-
this.logger.error('request.validate should be a function');
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
try {
|
|
51
|
-
await yupSchema.validate(data, {
|
|
52
|
-
abortEarly: controllerValidationAbortEarly,
|
|
53
|
-
req: { query, body },
|
|
54
|
-
});
|
|
55
|
-
} catch (e) {
|
|
56
|
-
let { errors } = e;
|
|
57
|
-
// translate it
|
|
58
|
-
if (appInfo.i18n && errors) {
|
|
59
|
-
errors = errors.map((err) => appInfo.i18n.t(err, err));
|
|
60
|
-
}
|
|
61
|
-
this.logger.error(
|
|
62
|
-
`Request validation failed with message: ${e.message}. errors: ${errors}`,
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
const errorAnswer = {};
|
|
66
|
-
if (!e.inner || !e.inner.length) {
|
|
67
|
-
errorAnswer[e.path] = errors;
|
|
68
|
-
} else {
|
|
69
|
-
e.inner.forEach((err) => {
|
|
70
|
-
errorAnswer[err.path] = err.errors;
|
|
71
|
-
if (appInfo.i18n && err.errors) {
|
|
72
|
-
errorAnswer[err.path] = err.errors.map((err1) =>
|
|
73
|
-
appInfo.i18n.t(err1, err1, err.params),
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
throw new ValidationError({
|
|
80
|
-
...errorAnswer,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
async castFields(data, { query, body }) {
|
|
86
|
-
const yupSchema = this.body;
|
|
87
|
-
if (yupSchema) {
|
|
88
|
-
if (typeof yupSchema.cast !== 'function') {
|
|
89
|
-
this.logger.error('request.cast should be a function');
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return yupSchema.cast(data, {
|
|
94
|
-
stripUnknown: true,
|
|
95
|
-
req: { query, body },
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
static get loggerGroup() {
|
|
100
|
-
return 'YupValidator_';
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
export default YupValidator;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { MongoMemoryReplSet } from 'mongodb-memory-server';
|
|
2
|
-
|
|
3
|
-
let isTeardown = false;
|
|
4
|
-
let mongoMemoryServerInstance;
|
|
5
|
-
|
|
6
|
-
const setup = async () => {
|
|
7
|
-
console.log('GLOBAL SETUP PREPARE RUNNING...');
|
|
8
|
-
console.time('GLOBAL TEST PREPARE. DONE');
|
|
9
|
-
mongoMemoryServerInstance = await MongoMemoryReplSet.create({
|
|
10
|
-
// binary: { version: '4.4.6' },
|
|
11
|
-
replSet: { count: 1, storageEngine: 'wiredTiger' },
|
|
12
|
-
});
|
|
13
|
-
await mongoMemoryServerInstance.waitUntilRunning();
|
|
14
|
-
const connectionStringMongo =
|
|
15
|
-
await mongoMemoryServerInstance.getUri('__DB_TO_REPLACE__');
|
|
16
|
-
process.env.TEST_MONGO_URI = connectionStringMongo;
|
|
17
|
-
// console.info('MONGO_URI: ', connectionStringMongo);
|
|
18
|
-
console.timeEnd('GLOBAL TEST PREPARE. DONE');
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const teardown = async () => {
|
|
22
|
-
if (isTeardown) {
|
|
23
|
-
throw new Error('teardown called twice');
|
|
24
|
-
}
|
|
25
|
-
console.time('GLOBAL TEARDOWN RUNNING. DONE');
|
|
26
|
-
|
|
27
|
-
isTeardown = true;
|
|
28
|
-
console.log('GLOBAL TEARDOWN RUNNING...');
|
|
29
|
-
await mongoMemoryServerInstance.stop();
|
|
30
|
-
console.timeEnd('GLOBAL TEARDOWN RUNNING. DONE');
|
|
31
|
-
|
|
32
|
-
return Promise.resolve();
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export { setup, teardown };
|
package/tests/setup.js
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-undef */
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { randomBytes } from 'node:crypto';
|
|
4
|
-
import { MongoMemoryReplSet } from 'mongodb-memory-server';
|
|
5
|
-
import mongoose from 'mongoose';
|
|
6
|
-
import { createClient } from '@redis/client';
|
|
7
|
-
import Server from '../server.js';
|
|
8
|
-
|
|
9
|
-
import clearRedisNamespace from '../helpers/redis/clearNamespace.js';
|
|
10
|
-
|
|
11
|
-
mongoose.set('autoIndex', false);
|
|
12
|
-
|
|
13
|
-
let mongoMemoryServerInstance;
|
|
14
|
-
|
|
15
|
-
// @ts-ignore
|
|
16
|
-
jest.setTimeout(1000000);
|
|
17
|
-
// @ts-ignore
|
|
18
|
-
beforeAll(async () => {
|
|
19
|
-
mongoMemoryServerInstance = await MongoMemoryReplSet.create({
|
|
20
|
-
// binary: { version: '4.4.6' },
|
|
21
|
-
replSet: { count: 1, storageEngine: 'wiredTiger' },
|
|
22
|
-
});
|
|
23
|
-
await mongoMemoryServerInstance.waitUntilRunning();
|
|
24
|
-
process.env.LOGGER_CONSOLE_LEVEL = 'error';
|
|
25
|
-
process.env.AUTH_SALT = randomBytes(16).toString('hex');
|
|
26
|
-
|
|
27
|
-
const connectionStringMongo = await mongoMemoryServerInstance.getUri();
|
|
28
|
-
// console.info('MONGO_URI: ', connectionStringMongo);
|
|
29
|
-
global.server = new Server({
|
|
30
|
-
folders: {
|
|
31
|
-
config: process.env.TEST_FOLDER_CONFIG || path.resolve('./config'),
|
|
32
|
-
controllers:
|
|
33
|
-
process.env.TEST_FOLDER_CONTROLLERS || path.resolve('./controllers'),
|
|
34
|
-
models: process.env.TEST_FOLDER_MODELS || path.resolve('./models'),
|
|
35
|
-
emails:
|
|
36
|
-
process.env.TEST_FOLDER_EMAIL ||
|
|
37
|
-
process.env.TEST_FOLDER_EMAILS ||
|
|
38
|
-
path.resolve('./services/messaging/email/templates'),
|
|
39
|
-
locales: process.env.TEST_FOLDER_LOCALES || path.resolve('./locales'),
|
|
40
|
-
commands: process.env.TEST_FOLDER_COMMANDS || path.resolve('./commands'),
|
|
41
|
-
migrations:
|
|
42
|
-
process.env.TEST_FOLDER_MIGRATIONS || path.resolve('./migrations'),
|
|
43
|
-
},
|
|
44
|
-
});
|
|
45
|
-
await global.server.init({ isSkipModelInit: true });
|
|
46
|
-
global.server.updateConfig('mongo', {
|
|
47
|
-
connectionString: connectionStringMongo,
|
|
48
|
-
});
|
|
49
|
-
global.server.updateConfig('http', { port: 0 }); // allow to use random
|
|
50
|
-
global.server.updateConfig('mail', { transport: 'stub' });
|
|
51
|
-
await global.server.initAllModels();
|
|
52
|
-
|
|
53
|
-
if (!global.testSetup) {
|
|
54
|
-
global.testSetup = {};
|
|
55
|
-
}
|
|
56
|
-
global.server.testingGetUrl = (urlPart) =>
|
|
57
|
-
`http://127.0.0.1:${global.server.getConfig('http').port}${urlPart}`;
|
|
58
|
-
if (!global.testSetup.disableUserCreate) {
|
|
59
|
-
const User = global.server.app.getModel('User');
|
|
60
|
-
global.user = await User.create({
|
|
61
|
-
email: 'test@test.com',
|
|
62
|
-
password: 'testPassword',
|
|
63
|
-
isVerified: true,
|
|
64
|
-
name: {
|
|
65
|
-
nick: 'testUserNickName',
|
|
66
|
-
},
|
|
67
|
-
}).catch((e) => {
|
|
68
|
-
console.error(e);
|
|
69
|
-
console.info(
|
|
70
|
-
'That error can happens in case you have custom user model. Please use global.testSetup.disableUserCreate flag to skip user creating',
|
|
71
|
-
);
|
|
72
|
-
});
|
|
73
|
-
global.authToken = await global.user.generateToken();
|
|
74
|
-
}
|
|
75
|
-
if (typeof global.testSetup.beforeAll === 'function') {
|
|
76
|
-
await global.testSetup.beforeAll();
|
|
77
|
-
}
|
|
78
|
-
await global.server.startServer();
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// @ts-ignore
|
|
82
|
-
beforeEach(() => {
|
|
83
|
-
if (global.server) {
|
|
84
|
-
const key = `test-${Math.random().toString(36).substring(7)}`;
|
|
85
|
-
global.server.app.updateConfig('redis', {
|
|
86
|
-
namespace: key,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
// @ts-ignore
|
|
92
|
-
afterEach(async () => {
|
|
93
|
-
if (global.server) {
|
|
94
|
-
const { url, namespace } = global.server.getConfig('redis');
|
|
95
|
-
const redisClient = createClient({ url });
|
|
96
|
-
|
|
97
|
-
try {
|
|
98
|
-
await redisClient.connect();
|
|
99
|
-
await clearRedisNamespace(redisClient, namespace);
|
|
100
|
-
await redisClient.disconnect();
|
|
101
|
-
} catch {
|
|
102
|
-
// that ok. No redis connection
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
// @ts-ignore
|
|
108
|
-
afterAll(async () => {
|
|
109
|
-
if (global.server) {
|
|
110
|
-
global.server.app.httpServer.shutdown();
|
|
111
|
-
global.server.app.events.emit('shutdown');
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (typeof global.testSetup.afterAll === 'function') {
|
|
115
|
-
await global.testSetup.afterAll();
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
await mongoose.disconnect();
|
|
119
|
-
await mongoMemoryServerInstance.stop();
|
|
120
|
-
});
|
package/tests/setupVitest.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import crypto from 'node:crypto';
|
|
3
|
-
import { beforeAll, beforeEach, afterEach, afterAll } from 'vitest';
|
|
4
|
-
|
|
5
|
-
import mongoose from 'mongoose'; // we do not need create indexes on tests
|
|
6
|
-
|
|
7
|
-
import { createClient } from '@redis/client';
|
|
8
|
-
import clearRedisNamespace from '../helpers/redis/clearNamespace.js';
|
|
9
|
-
import Server from '../server.js';
|
|
10
|
-
|
|
11
|
-
mongoose.set('autoIndex', false);
|
|
12
|
-
|
|
13
|
-
beforeAll(async () => {
|
|
14
|
-
process.env.LOGGER_CONSOLE_LEVEL = 'error';
|
|
15
|
-
process.env.AUTH_SALT = crypto.randomBytes(16).toString('hex');
|
|
16
|
-
global.server = new Server({
|
|
17
|
-
folders: {
|
|
18
|
-
config: process.env.TEST_FOLDER_CONFIG || path.resolve('./config'),
|
|
19
|
-
controllers:
|
|
20
|
-
process.env.TEST_FOLDER_CONTROLLERS || path.resolve('./controllers'),
|
|
21
|
-
models: process.env.TEST_FOLDER_MODELS || path.resolve('./models'),
|
|
22
|
-
emails:
|
|
23
|
-
process.env.TEST_FOLDER_EMAIL ||
|
|
24
|
-
process.env.TEST_FOLDER_EMAILS ||
|
|
25
|
-
path.resolve('./services/messaging/email/templates'),
|
|
26
|
-
locales: process.env.TEST_FOLDER_LOCALES || path.resolve('./locales'),
|
|
27
|
-
commands: process.env.TEST_FOLDER_COMMANDS || path.resolve('./commands'),
|
|
28
|
-
migrations:
|
|
29
|
-
process.env.TEST_FOLDER_MIGRATIONS || path.resolve('./migrations'),
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
await global.server.init({ isSkipModelInit: true });
|
|
33
|
-
const connectionString = process.env.TEST_MONGO_URI.replace(
|
|
34
|
-
'__DB_TO_REPLACE__',
|
|
35
|
-
`TEST_${crypto.randomUUID()}`,
|
|
36
|
-
);
|
|
37
|
-
global.server.updateConfig('mongo', {
|
|
38
|
-
connectionString,
|
|
39
|
-
});
|
|
40
|
-
global.server.updateConfig('http', { port: 0 }); // allow to use random
|
|
41
|
-
global.server.updateConfig('mail', { transport: 'stub' });
|
|
42
|
-
await global.server.initAllModels();
|
|
43
|
-
|
|
44
|
-
if (!global.testSetup) {
|
|
45
|
-
global.testSetup = {};
|
|
46
|
-
}
|
|
47
|
-
global.server.testingGetUrl = (urlPart) =>
|
|
48
|
-
`http://127.0.0.1:${global.server.getConfig('http').port}${urlPart}`;
|
|
49
|
-
if (!global.testSetup.disableUserCreate) {
|
|
50
|
-
const User = global.server.app.getModel('User');
|
|
51
|
-
global.user = await User.create({
|
|
52
|
-
email: 'test@test.com',
|
|
53
|
-
password: 'testPassword',
|
|
54
|
-
isVerified: true,
|
|
55
|
-
name: {
|
|
56
|
-
nick: 'testUserNickName',
|
|
57
|
-
},
|
|
58
|
-
}).catch((e) => {
|
|
59
|
-
console.error(e);
|
|
60
|
-
console.info(
|
|
61
|
-
'That error can happens in case you have custom user model. Please use global.testSetup.disableUserCreate flag to skip user creating',
|
|
62
|
-
);
|
|
63
|
-
});
|
|
64
|
-
global.authToken = await global.user.generateToken();
|
|
65
|
-
}
|
|
66
|
-
if (typeof global.testSetup.beforeAll === 'function') {
|
|
67
|
-
await global.testSetup.beforeAll();
|
|
68
|
-
}
|
|
69
|
-
await global.server.startServer();
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
beforeEach(() => {
|
|
73
|
-
if (global.server) {
|
|
74
|
-
const key = `test-${Math.random().toString(36).substring(7)}`;
|
|
75
|
-
global.server.app.updateConfig('redis', {
|
|
76
|
-
namespace: key,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
afterEach(async () => {
|
|
82
|
-
if (global.server) {
|
|
83
|
-
const { url, namespace } = global.server.getConfig('redis');
|
|
84
|
-
const redisClient = createClient({ url });
|
|
85
|
-
|
|
86
|
-
try {
|
|
87
|
-
await redisClient.connect();
|
|
88
|
-
await clearRedisNamespace(redisClient, namespace);
|
|
89
|
-
await redisClient.disconnect();
|
|
90
|
-
} catch {
|
|
91
|
-
// that ok. No redis connection
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
afterAll(async () => {
|
|
97
|
-
if (global.server) {
|
|
98
|
-
global.server.app.httpServer.shutdown();
|
|
99
|
-
global.server.app.events.emit('shutdown');
|
|
100
|
-
}
|
|
101
|
-
if (typeof global.testSetup.afterAll === 'function') {
|
|
102
|
-
await global.testSetup.afterAll();
|
|
103
|
-
}
|
|
104
|
-
try {
|
|
105
|
-
await mongoose.connection.db.dropDatabase(); // clean database after test
|
|
106
|
-
} catch {
|
|
107
|
-
// that ok. No mongoose connection
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
await mongoose.disconnect();
|
|
111
|
-
});
|
package/types/Expand.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// this is from nodejs types
|
|
2
|
-
interface ParseArgsOptionConfig {
|
|
3
|
-
/**
|
|
4
|
-
* Type of argument.
|
|
5
|
-
*/
|
|
6
|
-
type: 'string' | 'boolean';
|
|
7
|
-
/**
|
|
8
|
-
* Whether this option can be provided multiple times.
|
|
9
|
-
* If `true`, all values will be collected in an array.
|
|
10
|
-
* If `false`, values for the option are last-wins.
|
|
11
|
-
* @default false.
|
|
12
|
-
*/
|
|
13
|
-
multiple?: boolean | undefined;
|
|
14
|
-
/**
|
|
15
|
-
* A single character alias for the option.
|
|
16
|
-
*/
|
|
17
|
-
short?: string | undefined;
|
|
18
|
-
/**
|
|
19
|
-
* The default option value when it is not set by args.
|
|
20
|
-
* It must be of the same type as the the `type` property.
|
|
21
|
-
* When `multiple` is `true`, it must be an array.
|
|
22
|
-
* @since v18.11.0
|
|
23
|
-
*/
|
|
24
|
-
default?: string | boolean | string[] | boolean[] | undefined;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
interface ParseArgsOptionsConfigExtended extends ParseArgsOptionConfig {
|
|
28
|
-
/**
|
|
29
|
-
* A description of the option.
|
|
30
|
-
*/
|
|
31
|
-
description?: string;
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Is it required?
|
|
35
|
-
*/
|
|
36
|
-
required?: boolean;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface ICommandArguments {
|
|
40
|
-
[longOption: string]: ParseArgsOptionsConfigExtended;
|
|
41
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @param config path to folder with config files
|
|
3
|
-
* @param models path to folder with moidels files
|
|
4
|
-
* @param controllers path to folder with controllers files
|
|
5
|
-
* @param migrations path to folder with migrations files
|
|
6
|
-
* @param locales path to folder with locales files
|
|
7
|
-
* @param migrations path to folder with migrations files
|
|
8
|
-
* @param [emails] path to folder with emails files. Optional
|
|
9
|
-
*/
|
|
10
|
-
type FolderConfig = {
|
|
11
|
-
config: string;
|
|
12
|
-
models: string;
|
|
13
|
-
controllers: string;
|
|
14
|
-
commands: string;
|
|
15
|
-
locales: string;
|
|
16
|
-
migrations: string;
|
|
17
|
-
emails?: string;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export default FolderConfig;
|
package/views/404.pug
DELETED
package/views/home.pug
DELETED
package/views/layouts/base.pug
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
doctype html
|
|
2
|
-
html(lang=language)
|
|
3
|
-
head
|
|
4
|
-
meta(charset='utf-8')
|
|
5
|
-
meta(http-equiv='X-UA-Compatible', content='IE=edge')
|
|
6
|
-
meta(name='viewport', content='width=device-width, initial-scale=1')
|
|
7
|
-
// Title Of Site
|
|
8
|
-
title Site title
|
|
9
|
-
meta(name='description', content='Site description')
|
|
10
|
-
meta(name='keywords', content='Site keywords')
|
|
11
|
-
|
|
12
|
-
meta(name='viewport', content='width=device-width, initial-scale=1, maximum-scale=1')
|
|
13
|
-
|
|
14
|
-
// Standard Favicon
|
|
15
|
-
link(rel='icon', type='image/x-icon', href='/favicon.png')
|
|
16
|
-
// For non-Retina iPhone, iPod Touch, and Android 2.1+ devices:
|
|
17
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='57x57', href='/favicons/apple-touch-icon-57x57-precomposed.png')
|
|
18
|
-
// iOS 7 devices:
|
|
19
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='60x60', href='/favicons/apple-touch-icon-60x60-precomposed.png')
|
|
20
|
-
// For the iPad mini and the first- and second-generation iPad on iOS ≤ 6:
|
|
21
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='72x72', href='/favicons/apple-touch-icon-72x72-precomposed.png')
|
|
22
|
-
// For the iPad mini and the first- and second-generation iPad on iOS ≥ 7:
|
|
23
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='76x76', href='/favicons/apple-touch-icon-76x76-precomposed.png')
|
|
24
|
-
// For iPhone with high-resolution Retina display running iOS ≤ 6:
|
|
25
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='114x114', href='/favicons/apple-touch-icon-114x114-precomposed.png')
|
|
26
|
-
// For iPhone with high-resolution Retina display running iOS ≥ 7:
|
|
27
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='120x120', href='/favicons/apple-touch-icon-120x120-precomposed.png')
|
|
28
|
-
// For iPad with high-resolution Retina display running iOS ≤ 6:
|
|
29
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='144x144', href='/favicons/apple-touch-icon-144x144-precomposed.png')
|
|
30
|
-
// For iPad with high-resolution Retina display running iOS ≥ 7:
|
|
31
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='152x152', href='/favicons/apple-touch-icon-152x152-precomposed.png')
|
|
32
|
-
// For Android :
|
|
33
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='196x196', href='/favicons/apple-touch-icon-196x196-precomposed.png')
|
|
34
|
-
// Opera Coast
|
|
35
|
-
link(rel='apple-touch-icon-precomposed apple-touch-icon icon', sizes='228x228', href='/favicons/apple-touch-icon-228x228-precomposed.png')
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
body
|
|
39
|
-
block content
|
package/vitest.config.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
// eslint-disable-next-line import-x/no-unresolved
|
|
2
|
-
import { defineConfig } from 'vitest/config';
|
|
3
|
-
|
|
4
|
-
export default defineConfig({
|
|
5
|
-
test: {
|
|
6
|
-
globalSetup: './tests/globalSetupVitest.js',
|
|
7
|
-
setupFiles: './tests/setupVitest.js',
|
|
8
|
-
testTimeout: 10000,
|
|
9
|
-
outputFile: './coverage/junit.rspec.xml',
|
|
10
|
-
reporters: ['default', 'junit'],
|
|
11
|
-
coverage: {
|
|
12
|
-
provider: 'v8',
|
|
13
|
-
enabled: true,
|
|
14
|
-
reporter: ['text', 'html', 'clover', 'json'],
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
});
|