@adaptivestone/framework 5.0.0-beta.3 → 5.0.0-beta.30
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 +1044 -526
- package/LICENCE +1 -1
- 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 +83 -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/GenerateTypes.d.ts +11 -0
- package/dist/commands/GenerateTypes.js +52 -0
- package/dist/commands/GenerateTypes.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 +31 -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 +43 -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 +13 -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 +11 -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 +13 -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 +131 -0
- package/dist/controllers/Auth.js +186 -0
- package/dist/controllers/Auth.js.map +1 -0
- package/dist/controllers/Home.d.ts +15 -0
- package/dist/controllers/Home.js +22 -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 +14 -0
- package/dist/folderConfig.js.map +1 -0
- package/dist/helpers/appInstance.d.ts +3 -0
- package/dist/helpers/appInstance.js +8 -0
- package/dist/helpers/appInstance.js.map +1 -0
- package/dist/helpers/crypto.d.ts +3 -0
- package/dist/helpers/crypto.js +17 -0
- package/dist/helpers/crypto.js.map +1 -0
- package/dist/helpers/files.d.ts +16 -0
- package/dist/helpers/files.js +76 -0
- package/dist/helpers/files.js.map +1 -0
- package/dist/helpers/logger.d.ts +4 -0
- package/dist/helpers/logger.js +20 -0
- package/dist/helpers/logger.js.map +1 -0
- package/dist/helpers/redis/clearNamespace.d.ts +2 -0
- package/dist/helpers/redis/clearNamespace.js +14 -0
- package/dist/helpers/redis/clearNamespace.js.map +1 -0
- package/dist/helpers/yup.d.ts +13 -0
- package/dist/helpers/yup.js +21 -0
- 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 +90 -0
- package/dist/models/Lock.js +97 -0
- package/dist/models/Lock.js.map +1 -0
- package/dist/models/Migration.d.ts +13 -0
- package/dist/models/Migration.js +14 -0
- package/dist/models/Migration.js.map +1 -0
- package/dist/models/Sequence.d.ts +28 -0
- package/dist/models/Sequence.js +19 -0
- package/dist/models/Sequence.js.map +1 -0
- package/dist/models/User.d.ts +656 -0
- package/dist/models/User.js +291 -0
- package/dist/models/User.js.map +1 -0
- package/dist/models/UserOld.d.ts +179 -0
- package/dist/models/UserOld.js +230 -0
- package/dist/models/UserOld.js.map +1 -0
- package/dist/modules/AbstractCommand.d.ts +51 -0
- package/dist/modules/AbstractCommand.js +60 -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 +94 -0
- package/dist/modules/AbstractController.js +323 -0
- package/dist/modules/AbstractController.js.map +1 -0
- package/dist/modules/AbstractModel.d.ts +29 -0
- package/dist/modules/AbstractModel.js +42 -0
- package/dist/modules/AbstractModel.js.map +1 -0
- package/dist/modules/Base.d.ts +29 -0
- package/dist/modules/Base.js +58 -0
- package/dist/modules/Base.js.map +1 -0
- package/dist/modules/BaseCli.d.ts +25 -0
- package/dist/modules/BaseCli.js +147 -0
- package/dist/modules/BaseCli.js.map +1 -0
- package/dist/modules/BaseModel.d.ts +55 -0
- package/dist/modules/BaseModel.js +37 -0
- package/dist/modules/BaseModel.js.map +1 -0
- package/dist/server.d.ts +120 -0
- package/dist/server.js +440 -0
- package/dist/server.js.map +1 -0
- package/dist/services/cache/Cache.d.ts +31 -0
- package/dist/services/cache/Cache.js +113 -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 +130 -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 +70 -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 +41 -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 +12 -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 +20 -0
- package/dist/services/http/middleware/GetUserByToken.js +39 -0
- package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
- package/dist/services/http/middleware/I18n.d.ts +30 -0
- package/dist/services/http/middleware/I18n.js +96 -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 +46 -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 +12 -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 +95 -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 +29 -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/frameworkVitestSetup.d.ts +1 -0
- package/dist/tests/frameworkVitestSetup.js +9 -0
- package/dist/tests/frameworkVitestSetup.js.map +1 -0
- package/dist/tests/globalSetupVitest.d.ts +3 -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 +91 -0
- package/dist/tests/setupVitest.js.map +1 -0
- package/dist/tests/testHelpers.d.ts +340 -0
- package/dist/tests/testHelpers.js +48 -0
- package/dist/tests/testHelpers.js.map +1 -0
- package/package.json +38 -35
- package/Cli.js +0 -22
- package/cluster.js +0 -27
- package/commands/CreateUser.js +0 -75
- package/commands/Documentation.js +0 -17
- package/commands/DropIndex.js +0 -29
- package/commands/GenerateRandomBytes.js +0 -21
- package/commands/GetOpenApiJson.js +0 -325
- package/commands/SyncIndexes.js +0 -39
- package/commands/migration/Create.js +0 -61
- package/commands/migration/Migrate.js +0 -55
- 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/mail.js +0 -29
- 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 -210
- package/controllers/Home.js +0 -28
- package/controllers/index.js +0 -60
- package/folderConfig.js +0 -14
- package/helpers/files.js +0 -79
- package/helpers/logger.js +0 -17
- package/helpers/redis/clearNamespace.js +0 -14
- package/helpers/yup.js +0 -24
- 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/Migration.js +0 -15
- package/models/Sequence.js +0 -22
- package/models/User.js +0 -263
- package/modules/AbstractCommand.js +0 -43
- package/modules/AbstractConnector.js +0 -9
- package/modules/AbstractController.js +0 -413
- package/modules/AbstractModel.d.ts +0 -48
- package/modules/AbstractModel.js +0 -88
- package/modules/Base.d.ts +0 -37
- package/modules/Base.js +0 -63
- package/modules/BaseCli.js +0 -97
- package/server.d.ts +0 -98
- package/server.js +0 -429
- 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 -96
- 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/index.js +0 -217
- package/services/messaging/email/resources/.gitkeep +0 -1
- package/services/messaging/email/templates/emptyTemplate/html.pug +0 -9
- package/services/messaging/email/templates/emptyTemplate/subject.pug +0 -1
- package/services/messaging/email/templates/emptyTemplate/text.pug +0 -1
- 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/messaging/index.js +0 -3
- 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 -118
- package/tests/setupVitest.js +0 -109
- package/types/Expand.d.ts +0 -11
- package/types/TFoldersConfig.d.ts +0 -17
- package/views/404.pug +0 -3
- package/views/home.pug +0 -3
- package/views/layouts/base.pug +0 -39
- package/vitest.config.js +0 -16
- /package/{commands → dist/migrations}/.gitkeep +0 -0
package/commands/SyncIndexes.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import * as url from 'node:url';
|
|
3
|
-
import AbstractCommand from '../modules/AbstractCommand.js';
|
|
4
|
-
|
|
5
|
-
class SyncIndexes extends AbstractCommand {
|
|
6
|
-
async run() {
|
|
7
|
-
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
8
|
-
const files = await this.getFilesPathWithInheritance(
|
|
9
|
-
path.join(dirname, '/../models'),
|
|
10
|
-
this.app.foldersConfig.models,
|
|
11
|
-
);
|
|
12
|
-
let models = [];
|
|
13
|
-
|
|
14
|
-
for (const file of files) {
|
|
15
|
-
models.push(path.basename(file.file, path.extname(file.file)));
|
|
16
|
-
}
|
|
17
|
-
models = models.sort();
|
|
18
|
-
this.logger.info(`Total found ${models.length} models`);
|
|
19
|
-
|
|
20
|
-
for (const modelName of models) {
|
|
21
|
-
const Model = this.app.getModel(modelName);
|
|
22
|
-
// eslint-disable-next-line no-await-in-loop
|
|
23
|
-
const removedIndexes = await Model.syncIndexes(); // await in loop not a bug. Lets do one by one
|
|
24
|
-
if (removedIndexes.length) {
|
|
25
|
-
this.logger.info(
|
|
26
|
-
`Model - ${modelName} removed indexes: ${removedIndexes}`,
|
|
27
|
-
);
|
|
28
|
-
} else {
|
|
29
|
-
this.logger.info(`Model - ${modelName} NO removed indexes`);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
static get description() {
|
|
35
|
-
return 'Synchronize indexes defined in models with a real one indexed on the database. Command will remove all indexes from the database that do not exist on model OR have different parameters. Then it will create a new indexes ';
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export default SyncIndexes;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { promises as fs } from 'node:fs';
|
|
3
|
-
import AbstractCommand from '../../modules/AbstractCommand.js';
|
|
4
|
-
|
|
5
|
-
class CreateMigration extends AbstractCommand {
|
|
6
|
-
static get description() {
|
|
7
|
-
return 'Create new migration';
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
async run() {
|
|
11
|
-
if (!this.args.name) {
|
|
12
|
-
return this.logger.error(
|
|
13
|
-
'Please provide migration name with key "--name={someName}"',
|
|
14
|
-
);
|
|
15
|
-
}
|
|
16
|
-
if (this.args.name.match(/^\d/)) {
|
|
17
|
-
return this.logger.error('Command cant start from nubmer');
|
|
18
|
-
}
|
|
19
|
-
const fileName = `${Date.now()}_${this.constructor.camelSentence(
|
|
20
|
-
this.args.name,
|
|
21
|
-
)}.js`;
|
|
22
|
-
|
|
23
|
-
const fileContent = this.constructor.getTemplate(
|
|
24
|
-
this.constructor.camelSentence(this.args.name),
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
await fs.writeFile(
|
|
28
|
-
path.join(this.app.foldersConfig.migrations, fileName),
|
|
29
|
-
fileContent,
|
|
30
|
-
);
|
|
31
|
-
return this.logger.info(`Migration created ${fileName}`);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
static camelSentence(str) {
|
|
35
|
-
return ` ${str}`
|
|
36
|
-
.toLowerCase()
|
|
37
|
-
.replace(/[^a-zA-Z0-9]+(.)/g, (match, chr) => chr.toUpperCase());
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
static getTemplate(name) {
|
|
41
|
-
return `/* eslint-disable class-methods-use-this */
|
|
42
|
-
|
|
43
|
-
import Base from '@adaptivestone/framework/modules/Base.js';
|
|
44
|
-
|
|
45
|
-
class ${name} extends Base {
|
|
46
|
-
async up() {
|
|
47
|
-
// put here your mirgation up logic
|
|
48
|
-
// const YourModel = this.app.getModel('ModelName');
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async down() {
|
|
52
|
-
// put here your mirgation down logic
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export default ${name};
|
|
57
|
-
`;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export default CreateMigration;
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import * as url from 'node:url';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import AbstractCommand from '../../modules/AbstractCommand.js';
|
|
4
|
-
|
|
5
|
-
class Migrate extends AbstractCommand {
|
|
6
|
-
static get description() {
|
|
7
|
-
return 'Run all pending migrations';
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
async run() {
|
|
11
|
-
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
12
|
-
|
|
13
|
-
const files = await this.getFilesPathWithInheritance(
|
|
14
|
-
path.join(dirname, '/../../migrations'),
|
|
15
|
-
this.app.foldersConfig.migrations,
|
|
16
|
-
);
|
|
17
|
-
files.sort(
|
|
18
|
-
(a, b) => Number(a.file.split('_')[0]) - Number(b.file.split('_')[0]),
|
|
19
|
-
);
|
|
20
|
-
const MigrationModel = this.app.getModel('Migration');
|
|
21
|
-
const lastMigration = await MigrationModel.findOne({})
|
|
22
|
-
.sort({ createdAt: -1 })
|
|
23
|
-
.exec();
|
|
24
|
-
|
|
25
|
-
let migrations = files;
|
|
26
|
-
|
|
27
|
-
if (lastMigration) {
|
|
28
|
-
const lastMigrationTime = Number(
|
|
29
|
-
lastMigration.migrationFile.split('_')[0],
|
|
30
|
-
);
|
|
31
|
-
migrations = files.filter(
|
|
32
|
-
(val) => Number(val.file.split('_')[0]) > lastMigrationTime,
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
for (const migration of migrations) {
|
|
37
|
-
this.logger.info(`=== Start migration ${migration.file} ===`);
|
|
38
|
-
// eslint-disable-next-line no-await-in-loop
|
|
39
|
-
const { default: MigrationCommand } = await import(migration.path);
|
|
40
|
-
const migrationCommand = new MigrationCommand(this.app);
|
|
41
|
-
// eslint-disable-next-line no-await-in-loop
|
|
42
|
-
await migrationCommand.up();
|
|
43
|
-
// eslint-disable-next-line no-await-in-loop
|
|
44
|
-
await MigrationModel.create({
|
|
45
|
-
migrationFile: migration.file,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
this.logger.info(
|
|
50
|
-
`=== Migration Finished. Migrated ${migrations.length} files ===`,
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export default Migrate;
|
package/config/auth.js
DELETED
package/config/http.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
port: process.env.HTTP_PORT || 3300,
|
|
3
|
-
hostname: process.env.HTTP_HOST || '0.0.0.0',
|
|
4
|
-
// if you want to use 'all' domains please copy this file to your app
|
|
5
|
-
// and set "corsDomains: [/./]
|
|
6
|
-
corsDomains: ['http://localhost:3000'],
|
|
7
|
-
myDomain: process.env.HTTP_DOMAIN || 'http://localhost:3300',
|
|
8
|
-
siteDomain: process.env.FRONT_DOMAIN || 'http://localhost:3000',
|
|
9
|
-
};
|
package/config/i18n.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* You can use any options from https://www.i18next.com/overview/configuration-options
|
|
3
|
-
*/
|
|
4
|
-
export default {
|
|
5
|
-
enabled: true,
|
|
6
|
-
preload: ['en', 'ru'],
|
|
7
|
-
supportedLngs: ['en', 'ru'], // should be at least one supported
|
|
8
|
-
fallbackLng: 'en',
|
|
9
|
-
saveMissing: false,
|
|
10
|
-
debug: false,
|
|
11
|
-
lookupQuerystring: 'lng', // string to detect language on query
|
|
12
|
-
};
|
package/config/ipDetector.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
headers: ['X-Forwarded-For'],
|
|
3
|
-
trustedProxy: [
|
|
4
|
-
// list of trusted proxies.
|
|
5
|
-
'169.254.0.0/16', // linklocal
|
|
6
|
-
'fe80::/10', // linklocal
|
|
7
|
-
'127.0.0.1/8', // loopback
|
|
8
|
-
'::1/128', // loopback
|
|
9
|
-
'10.0.0.0/8', // uniquelocal
|
|
10
|
-
'172.16.0.0/12', // uniquelocal
|
|
11
|
-
'192.168.0.0/16', // uniquelocal
|
|
12
|
-
'fc00::/7', // uniquelocal
|
|
13
|
-
],
|
|
14
|
-
};
|
package/config/log.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
transports: [
|
|
3
|
-
{
|
|
4
|
-
transport: 'winston-transport-sentry-node',
|
|
5
|
-
transportOptions: {
|
|
6
|
-
sentry: {
|
|
7
|
-
dsn: process.env.LOGGER_SENTRY_DSN || process.env.SENTRY_DSN,
|
|
8
|
-
},
|
|
9
|
-
level: process.env.LOGGER_SENTRY_LEVEL || 'info',
|
|
10
|
-
},
|
|
11
|
-
enable: process.env.LOGGER_SENTRY_ENABLE || false,
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
transport: 'console',
|
|
15
|
-
transportOptions: {
|
|
16
|
-
level: process.env.LOGGER_CONSOLE_LEVEL || 'silly',
|
|
17
|
-
timestamp: true,
|
|
18
|
-
},
|
|
19
|
-
enable: process.env.LOGGER_CONSOLE_ENABLE || true,
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
};
|
package/config/mail.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
from: 'Localhost <info@localhost>',
|
|
5
|
-
transports: {
|
|
6
|
-
sendMail: {
|
|
7
|
-
// path: "path to the sendmail command (defaults to 'sendmail')"
|
|
8
|
-
// args: 'an array of extra command line options to pass to the sendmail command (ie. ["-f", "foo@blurdybloop.com"]).'
|
|
9
|
-
},
|
|
10
|
-
stub: {},
|
|
11
|
-
smtp: {
|
|
12
|
-
// https://github.com/nodemailer/nodemailer#set-up-smtp
|
|
13
|
-
host: process.env.EMAIL_HOST || 'smtp.mailtrap.io',
|
|
14
|
-
port: process.env.EMAIL_PORT || 2525,
|
|
15
|
-
auth: {
|
|
16
|
-
user: process.env.EMAIL_USER,
|
|
17
|
-
pass: process.env.EMAIL_PASSWORD,
|
|
18
|
-
},
|
|
19
|
-
connectionTimeout: 10000, // timeout to 10 seconds
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
transport: process.env.EMAIL_TRANSPORT || 'smtp',
|
|
23
|
-
webResources: {
|
|
24
|
-
// https://github.com/jrit/web-resource-inliner path to find resources
|
|
25
|
-
relativeTo: path.resolve('src/services/messaging/email/resources'),
|
|
26
|
-
images: false,
|
|
27
|
-
},
|
|
28
|
-
globalVariablesToTemplates: {},
|
|
29
|
-
};
|
package/config/mongo.js
DELETED
package/config/rateLimiter.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
limiterOptions: {
|
|
3
|
-
// https://github.com/animir/node-rate-limiter-flexible
|
|
4
|
-
// https://github.com/animir/node-rate-limiter-flexible/wiki/Options
|
|
5
|
-
points: 10, // 10 points
|
|
6
|
-
duration: 60, // Per 60 seconds
|
|
7
|
-
},
|
|
8
|
-
driver: 'memory', // can be 'mongo', 'redis'
|
|
9
|
-
consumePoints: 1,
|
|
10
|
-
consumeKeyComponents: {
|
|
11
|
-
ip: true, // include ip to key generation
|
|
12
|
-
route: true, // include route to key generation
|
|
13
|
-
user: true, // include user id to key generation (if user exits)
|
|
14
|
-
request: [], // what should be included from request (req.appInfo.request) if it presented
|
|
15
|
-
},
|
|
16
|
-
};
|
package/config/redis.js
DELETED
package/config/validate.js
DELETED
package/controllers/Auth.js
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import yup from 'yup';
|
|
2
|
-
import AbstractController from '../modules/AbstractController.js';
|
|
3
|
-
import GetUserByToken from '../services/http/middleware/GetUserByToken.js';
|
|
4
|
-
import RateLimiter from '../services/http/middleware/RateLimiter.js';
|
|
5
|
-
|
|
6
|
-
class Auth extends AbstractController {
|
|
7
|
-
get routes() {
|
|
8
|
-
return {
|
|
9
|
-
post: {
|
|
10
|
-
'/login': {
|
|
11
|
-
handler: this.postLogin,
|
|
12
|
-
request: yup.object().shape({
|
|
13
|
-
email: yup.string().email().required('auth.emailProvided'), // if not provided then error will be generated
|
|
14
|
-
password: yup.string().required('auth.passwordProvided'), // possible to provide values from translation
|
|
15
|
-
}),
|
|
16
|
-
},
|
|
17
|
-
'/register': {
|
|
18
|
-
handler: this.postRegister,
|
|
19
|
-
request: yup.object().shape({
|
|
20
|
-
email: yup
|
|
21
|
-
.string()
|
|
22
|
-
.email('auth.emailValid')
|
|
23
|
-
.required('auth.emailProvided'),
|
|
24
|
-
password: yup
|
|
25
|
-
.string()
|
|
26
|
-
.matches(
|
|
27
|
-
/^[a-zA-Z0-9!@#$%ˆ^&*()_+\-{}[\]<>]+$/,
|
|
28
|
-
'auth.passwordValid',
|
|
29
|
-
)
|
|
30
|
-
.required('auth.passwordProvided'),
|
|
31
|
-
nickName: yup
|
|
32
|
-
.string()
|
|
33
|
-
.matches(/^[a-zA-Z0-9_\-.]+$/, 'auth.nickNameValid'),
|
|
34
|
-
firstName: yup.string(),
|
|
35
|
-
lastName: yup.string(),
|
|
36
|
-
}),
|
|
37
|
-
},
|
|
38
|
-
'/logout': this.postLogout,
|
|
39
|
-
'/verify': this.verifyUser,
|
|
40
|
-
'/send-recovery-email': {
|
|
41
|
-
handler: this.sendPasswordRecoveryEmail,
|
|
42
|
-
request: yup
|
|
43
|
-
.object()
|
|
44
|
-
.shape({ email: yup.string().email().required() }),
|
|
45
|
-
},
|
|
46
|
-
'/recover-password': {
|
|
47
|
-
handler: this.recoverPassword,
|
|
48
|
-
request: yup.object().shape({
|
|
49
|
-
password: yup
|
|
50
|
-
.string()
|
|
51
|
-
.matches(
|
|
52
|
-
/^[a-zA-Z0-9!@#$%ˆ^&*()_+\-{}[\]<>]+$/,
|
|
53
|
-
'auth.passwordValid',
|
|
54
|
-
)
|
|
55
|
-
.required(),
|
|
56
|
-
passwordRecoveryToken: yup.string().required(),
|
|
57
|
-
}),
|
|
58
|
-
},
|
|
59
|
-
'/send-verification': {
|
|
60
|
-
handler: this.sendVerification,
|
|
61
|
-
request: yup
|
|
62
|
-
.object()
|
|
63
|
-
.shape({ email: yup.string().email().required() }),
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async postLogin(req, res) {
|
|
70
|
-
const User = this.app.getModel('User');
|
|
71
|
-
const user = await User.getUserByEmailAndPassword(
|
|
72
|
-
req.appInfo.request.email, // we do a request casting
|
|
73
|
-
req.appInfo.request.password, // we do a request casting
|
|
74
|
-
);
|
|
75
|
-
if (!user) {
|
|
76
|
-
return res.status(400).json({ message: req.i18n.t('auth.errorUPValid') });
|
|
77
|
-
}
|
|
78
|
-
const { isAuthWithVefificationFlow } = this.app.getConfig('auth');
|
|
79
|
-
if (isAuthWithVefificationFlow && !user.isVerified) {
|
|
80
|
-
return res
|
|
81
|
-
.status(400)
|
|
82
|
-
.json({ message: req.i18n.t('email.notVerified'), notVerified: true });
|
|
83
|
-
}
|
|
84
|
-
const token = await user.generateToken();
|
|
85
|
-
|
|
86
|
-
return res.status(200).json({ data: { token, user: user.getPublic() } });
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async postRegister(req, res) {
|
|
90
|
-
const User = req.appInfo.app.getModel('User');
|
|
91
|
-
let user = await User.getUserByEmail(req.appInfo.request.email);
|
|
92
|
-
if (user) {
|
|
93
|
-
return res.status(400).json({ message: req.i18n.t('email.registered') });
|
|
94
|
-
}
|
|
95
|
-
if (req.appInfo.request.nickName) {
|
|
96
|
-
user = await User.findOne({ 'name.nick': req.appInfo.request.nickName });
|
|
97
|
-
if (user) {
|
|
98
|
-
return res
|
|
99
|
-
.status(400)
|
|
100
|
-
.json({ message: req.i18n.t('auth.nicknameExists') });
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
user = await User.create({
|
|
105
|
-
email: req.appInfo.request.email,
|
|
106
|
-
password: req.appInfo.request.password,
|
|
107
|
-
name: {
|
|
108
|
-
first: req.appInfo.request.firstName,
|
|
109
|
-
last: req.appInfo.request.lastName,
|
|
110
|
-
nick: req.appInfo.request.nickName,
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
const { isAuthWithVefificationFlow } = this.app.getConfig('auth');
|
|
115
|
-
if (isAuthWithVefificationFlow) {
|
|
116
|
-
const answer = await user.sendVerificationEmail(req.i18n).catch((e) => {
|
|
117
|
-
this.logger.error(e);
|
|
118
|
-
});
|
|
119
|
-
if (!answer) {
|
|
120
|
-
return res.status(500).json();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return res.status(201).json();
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// eslint-disable-next-line class-methods-use-this
|
|
127
|
-
async postLogout(req, res) {
|
|
128
|
-
// todo remove token
|
|
129
|
-
return res.status(200).json();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
async verifyUser(req, res) {
|
|
133
|
-
const User = req.appInfo.app.getModel('User');
|
|
134
|
-
let user;
|
|
135
|
-
try {
|
|
136
|
-
user = await User.getUserByVerificationToken(
|
|
137
|
-
req.query.verification_token,
|
|
138
|
-
);
|
|
139
|
-
} catch (e) {
|
|
140
|
-
return res.status(400).json({
|
|
141
|
-
message: req.i18n.t('email.alreadyVerifiedOrWrongToken'),
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
this.logger.debug(`Verify user user is :${user}`);
|
|
145
|
-
if (!user) {
|
|
146
|
-
return res.status(400).json({
|
|
147
|
-
message: req.i18n.t('email.alreadyVerifiedOrWrongToken'),
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
user.isVerified = true;
|
|
152
|
-
await user.save();
|
|
153
|
-
return res.status(200).json();
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
async sendPasswordRecoveryEmail(req, res) {
|
|
157
|
-
const User = req.appInfo.app.getModel('User');
|
|
158
|
-
try {
|
|
159
|
-
const user = await User.getUserByEmail(req.appInfo.request.email);
|
|
160
|
-
if (!user) {
|
|
161
|
-
return res
|
|
162
|
-
.status(400)
|
|
163
|
-
.json({ message: req.i18n.t('auth.errorUExist') });
|
|
164
|
-
}
|
|
165
|
-
await user.sendPasswordRecoveryEmail(req.i18n);
|
|
166
|
-
return res.status(200).json();
|
|
167
|
-
} catch (e) {
|
|
168
|
-
this.logger.error(e);
|
|
169
|
-
return res.status(400).json({ message: req.i18n.t('auth.errorUExist') });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
async recoverPassword(req, res) {
|
|
174
|
-
const User = this.app.getModel('User');
|
|
175
|
-
const user = await User.getUserByPasswordRecoveryToken(
|
|
176
|
-
req.appInfo.request.passwordRecoveryToken,
|
|
177
|
-
).catch((e) => {
|
|
178
|
-
this.logger.error(e);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
if (!user) {
|
|
182
|
-
return res
|
|
183
|
-
.status(400)
|
|
184
|
-
.json({ message: req.i18n.t('password.wrongToken') });
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
this.logger.debug(`Password recovery user is :${user}`);
|
|
188
|
-
|
|
189
|
-
user.password = req.appInfo.request.password;
|
|
190
|
-
user.isVerified = true;
|
|
191
|
-
await user.save();
|
|
192
|
-
return res.status(200).json();
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
async sendVerification(req, res) {
|
|
196
|
-
const User = this.app.getModel('User');
|
|
197
|
-
const user = await User.getUserByEmail(req.appInfo.request.email);
|
|
198
|
-
if (!user) {
|
|
199
|
-
return res.status(400).json({ message: req.i18n.t('auth.errorUExist') });
|
|
200
|
-
}
|
|
201
|
-
await user.sendVerificationEmail(req.i18n);
|
|
202
|
-
return res.status(200).json();
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
static get middleware() {
|
|
206
|
-
return new Map([['/{*splat}', [GetUserByToken, RateLimiter]]]);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export default Auth;
|
package/controllers/Home.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import AbstractController from '../modules/AbstractController.js';
|
|
2
|
-
import GetUserByToken from '../services/http/middleware/GetUserByToken.js';
|
|
3
|
-
|
|
4
|
-
class Home extends AbstractController {
|
|
5
|
-
get routes() {
|
|
6
|
-
return {
|
|
7
|
-
get: {
|
|
8
|
-
'/': this.home,
|
|
9
|
-
},
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// eslint-disable-next-line class-methods-use-this
|
|
14
|
-
async home(req, res) {
|
|
15
|
-
return res.json({ message: 'Home' });
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// eslint-disable-next-line class-methods-use-this
|
|
19
|
-
getHttpPath() {
|
|
20
|
-
return '/';
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
static get middleware() {
|
|
24
|
-
return new Map([['/{*splat}', [GetUserByToken]]]);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export default Home;
|
package/controllers/index.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import * as url from 'node:url';
|
|
3
|
-
import Base from '../modules/Base.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Class do autoloading a http controllers
|
|
7
|
-
*/
|
|
8
|
-
class ControllerManager extends Base {
|
|
9
|
-
constructor(app) {
|
|
10
|
-
super(app);
|
|
11
|
-
this.controllers = {};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Load controllers
|
|
16
|
-
*/
|
|
17
|
-
async initControllers() {
|
|
18
|
-
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
19
|
-
const controllersToLoad = await this.getFilesPathWithInheritance(
|
|
20
|
-
dirname,
|
|
21
|
-
this.app.foldersConfig.controllers,
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
controllersToLoad.sort((a, b) => {
|
|
25
|
-
if (a.file.toLowerCase().endsWith('index.js')) {
|
|
26
|
-
if (b.file.toLowerCase().endsWith('index.js')) {
|
|
27
|
-
return 0;
|
|
28
|
-
}
|
|
29
|
-
return -1;
|
|
30
|
-
}
|
|
31
|
-
return 0;
|
|
32
|
-
});
|
|
33
|
-
const controllers = [];
|
|
34
|
-
for (const controller of controllersToLoad) {
|
|
35
|
-
controllers.push(
|
|
36
|
-
import(controller.path).then(({ default: ControllerModule }) => {
|
|
37
|
-
const contollerName = ControllerModule.name.toLowerCase();
|
|
38
|
-
let prefix = path.dirname(controller.file);
|
|
39
|
-
if (prefix === '.') {
|
|
40
|
-
prefix = '';
|
|
41
|
-
}
|
|
42
|
-
const controllePath = prefix
|
|
43
|
-
? `${prefix}/${contollerName}`
|
|
44
|
-
: contollerName;
|
|
45
|
-
this.controllers[controllePath] = new ControllerModule(
|
|
46
|
-
this.app,
|
|
47
|
-
prefix,
|
|
48
|
-
);
|
|
49
|
-
}),
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
await Promise.all(controllers);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
static get loggerGroup() {
|
|
56
|
-
return 'controller';
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export default ControllerManager;
|
package/folderConfig.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
folders: {
|
|
5
|
-
config: path.resolve('./config'),
|
|
6
|
-
models: path.resolve('./models'),
|
|
7
|
-
controllers: path.resolve('./controllers'),
|
|
8
|
-
views: path.resolve('./views'),
|
|
9
|
-
locales: path.resolve('./locales'),
|
|
10
|
-
emails: path.resolve('./services/messaging/email/templates'),
|
|
11
|
-
commands: path.resolve('./commands'),
|
|
12
|
-
migrations: path.resolve('./migrations'),
|
|
13
|
-
},
|
|
14
|
-
};
|
package/helpers/files.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
|
|
4
|
-
const getFilesPathWithInheritance = async ({
|
|
5
|
-
internalFolder,
|
|
6
|
-
externalFolder,
|
|
7
|
-
logger,
|
|
8
|
-
loggerFileType = '',
|
|
9
|
-
filter: { startWithCapital = true, notTests = true, notHidden = true } = {},
|
|
10
|
-
}) => {
|
|
11
|
-
const [internalFiles, externalFiles] = await Promise.all([
|
|
12
|
-
fs.readdir(internalFolder, { recursive: true, withFileTypes: true }),
|
|
13
|
-
fs.readdir(externalFolder, { recursive: true, withFileTypes: true }),
|
|
14
|
-
]);
|
|
15
|
-
|
|
16
|
-
const filterIndexFile = (fileDirent) => {
|
|
17
|
-
if (!fileDirent.isFile()) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
const fileArray = fileDirent.name.split('/');
|
|
21
|
-
const file = fileArray[fileArray.length - 1];
|
|
22
|
-
if (startWithCapital && file[0] !== file[0].toUpperCase()) {
|
|
23
|
-
// not start with capital
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
if (notTests && file.endsWith('.test.js')) {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
if (notHidden && file[0] === '.') {
|
|
30
|
-
// not start with dot
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
return true;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const internalFilesString = internalFiles
|
|
37
|
-
.filter(filterIndexFile)
|
|
38
|
-
.map((fileDirent) =>
|
|
39
|
-
join(fileDirent.parentPath, fileDirent.name)
|
|
40
|
-
.replace(`${internalFolder}/`, '')
|
|
41
|
-
.replace(`${internalFolder}`, ''),
|
|
42
|
-
);
|
|
43
|
-
const externalFilesString = externalFiles
|
|
44
|
-
.filter(filterIndexFile)
|
|
45
|
-
.map((fileDirent) =>
|
|
46
|
-
join(fileDirent.parentPath, fileDirent.name)
|
|
47
|
-
.replace(`${externalFolder}/`, '')
|
|
48
|
-
.replace(`${externalFolder}`, ''),
|
|
49
|
-
);
|
|
50
|
-
|
|
51
|
-
const filesToLoad = [];
|
|
52
|
-
for (const file of internalFilesString) {
|
|
53
|
-
if (externalFilesString.includes(file)) {
|
|
54
|
-
logger(
|
|
55
|
-
`Skipping register INTERNAL file '${file}' ${
|
|
56
|
-
loggerFileType ? `of type ${loggerFileType}` : ''
|
|
57
|
-
} as it override by EXTERNAL ONE`,
|
|
58
|
-
);
|
|
59
|
-
} else {
|
|
60
|
-
filesToLoad.push({
|
|
61
|
-
path: join(internalFolder, file),
|
|
62
|
-
file,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
for (const file of externalFilesString) {
|
|
68
|
-
filesToLoad.push({
|
|
69
|
-
path: join(externalFolder, file),
|
|
70
|
-
file,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
return filesToLoad;
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
export {
|
|
77
|
-
// eslint-disable-next-line import/prefer-default-export
|
|
78
|
-
getFilesPathWithInheritance,
|
|
79
|
-
};
|