@adaptivestone/framework 4.11.4 → 5.0.0-alpha.2
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/.eslintrc.cjs +41 -0
- package/CHANGELOG.md +10 -0
- package/Cli.js +5 -5
- package/cluster.js +5 -3
- package/commands/CreateUser.js +2 -2
- package/commands/Documentation.js +3 -3
- package/commands/DropIndex.js +2 -2
- package/commands/Generate.js +2 -2
- package/commands/GetOpenApiJson.js +3 -3
- package/commands/SyncIndexes.js +6 -4
- package/commands/migration/Create.js +4 -7
- package/commands/migration/Migrate.js +7 -3
- package/config/auth.js +1 -1
- package/config/http.js +1 -1
- package/config/i18n.js +1 -1
- package/config/log.js +1 -1
- package/config/mail.js +2 -2
- package/config/mongo.js +1 -1
- package/config/rateLimiter.js +1 -1
- package/config/redis.js +1 -1
- package/config/validate.js +1 -1
- package/controllers/Auth.js +5 -5
- package/controllers/Home.js +3 -3
- package/controllers/index.js +6 -4
- package/folderConfig.js +2 -2
- package/helpers/files.js +11 -7
- package/helpers/logger.js +2 -4
- package/helpers/redis/clearNamespace.js +1 -1
- package/helpers/yup.js +4 -5
- package/index.js +2 -2
- package/models/Migration.js +2 -2
- package/models/Sequence.js +2 -2
- package/models/User.js +5 -6
- package/modules/AbstractCommand.js +2 -2
- package/modules/AbstractConnector.js +2 -2
- package/modules/AbstractController.js +8 -7
- package/modules/AbstractModel.js +3 -3
- package/modules/Base.js +2 -2
- package/modules/BaseCli.js +6 -4
- package/modules/Modules.test.js +2 -2
- package/package.json +10 -9
- package/server.js +16 -13
- package/services/cache/Cache.js +2 -2
- package/services/documentation/DocumentationGenerator.js +3 -3
- package/services/http/HttpServer.js +15 -15
- package/services/http/middleware/AbstractMiddleware.js +3 -3
- package/services/http/middleware/Auth.js +2 -2
- package/services/http/middleware/Auth.test.js +1 -1
- package/services/http/middleware/Cors.js +2 -2
- package/services/http/middleware/Cors.test.js +1 -1
- package/services/http/middleware/GetUserByToken.js +2 -2
- package/services/http/middleware/GetUserByToken.test.js +1 -1
- package/services/http/middleware/I18n.js +5 -6
- package/services/http/middleware/I18n.test.js +1 -1
- package/services/http/middleware/Pagination.js +3 -3
- package/services/http/middleware/PrepareAppInfo.js +2 -2
- package/services/http/middleware/PrepareAppInfo.test.js +1 -1
- package/services/http/middleware/RateLimiter.js +7 -8
- package/services/http/middleware/RateLimiter.test.js +1 -1
- package/services/http/middleware/RequestLogger.js +2 -2
- package/services/http/middleware/RequestParser.js +3 -4
- package/services/http/middleware/RequestParser.test.js +3 -5
- package/services/http/middleware/Role.js +2 -2
- package/services/http/middleware/Role.test.js +1 -1
- package/services/http/middleware/StaticFiles.js +6 -7
- package/services/messaging/email/index.js +21 -14
- package/services/messaging/index.js +2 -4
- package/services/validate/ValidateService.js +5 -5
- package/services/validate/ValidateService.test.js +4 -4
- package/services/validate/drivers/AbstractValidator.js +2 -2
- package/services/validate/drivers/CustomValidator.js +3 -4
- package/services/validate/drivers/YupValidator.js +3 -3
- package/tests/globalSetupVitest.js +1 -1
- package/tests/setup.js +7 -8
- package/tests/setupVitest.js +5 -6
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adaptivestone/framework",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-alpha.2",
|
|
4
4
|
"description": "Adaptive stone node js framework",
|
|
5
5
|
"main": "index.js",
|
|
6
|
+
"type": "module",
|
|
6
7
|
"engines": {
|
|
7
8
|
"node": ">=18.17.0"
|
|
8
9
|
},
|
|
@@ -19,7 +20,7 @@
|
|
|
19
20
|
"lint": "eslint '**/*.js'",
|
|
20
21
|
"lint:fix": "eslint '**/*.js' --fix",
|
|
21
22
|
"codestyle": "npm run prettier && npm run lint",
|
|
22
|
-
"prepare": "husky
|
|
23
|
+
"prepare": "husky",
|
|
23
24
|
"cli": "node cliCommand",
|
|
24
25
|
"benchmark": "h2load -n 10000 -c 50 -p 'http/1.1' http://localhost:3300/",
|
|
25
26
|
"benchmark2": "h2load -n 10000 -c 50 https://localhost:3300/",
|
|
@@ -36,33 +37,33 @@
|
|
|
36
37
|
"i18next": "^23.2.8",
|
|
37
38
|
"i18next-chained-backend": "^4.0.0",
|
|
38
39
|
"i18next-fs-backend": "^2.0.0",
|
|
39
|
-
"juice": "^
|
|
40
|
-
"mime": "^
|
|
40
|
+
"juice": "^10.0.0",
|
|
41
|
+
"mime": "^4.0.0",
|
|
41
42
|
"minimist": "^1.2.5",
|
|
42
|
-
"mongoose": "^
|
|
43
|
+
"mongoose": "^8.0.0",
|
|
43
44
|
"nodemailer": "^6.6.3",
|
|
44
45
|
"nodemailer-sendmail-transport": "^1.0.2",
|
|
45
46
|
"nodemailer-stub-transport": "^1.1.0",
|
|
46
47
|
"pug": "^3.0.2",
|
|
47
|
-
"rate-limiter-flexible": "^
|
|
48
|
+
"rate-limiter-flexible": "^4.0.0",
|
|
48
49
|
"redis": "^4.3.1",
|
|
49
50
|
"winston": "^3.3.3",
|
|
50
51
|
"winston-transport-sentry-node": "^2.0.0",
|
|
51
52
|
"yup": "^1.0.0"
|
|
52
53
|
},
|
|
53
54
|
"devDependencies": {
|
|
54
|
-
"@vitest/coverage-v8": "^0.
|
|
55
|
+
"@vitest/coverage-v8": "^1.0.0",
|
|
55
56
|
"eslint": "^8.0.0",
|
|
56
57
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
57
58
|
"eslint-config-prettier": "^9.0.0",
|
|
58
59
|
"eslint-plugin-prettier": "^5.0.0",
|
|
59
60
|
"eslint-plugin-vitest": "^0.3.1",
|
|
60
|
-
"husky": "^
|
|
61
|
+
"husky": "^9.0.0",
|
|
61
62
|
"lint-staged": "^15.0.0",
|
|
62
63
|
"mongodb-memory-server": "^9.0.0",
|
|
63
64
|
"nodemon": "^3.0.1",
|
|
64
65
|
"prettier": "^3.0.0",
|
|
65
|
-
"vitest": "^0.
|
|
66
|
+
"vitest": "^1.0.0"
|
|
66
67
|
},
|
|
67
68
|
"lint-staged": {
|
|
68
69
|
"**/*.{js,jsx,ts,tsx,json,css,scss,md}": [
|
package/server.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
import EventEmitter from 'node:events';
|
|
3
|
+
import { hrtime } from 'node:process';
|
|
4
|
+
import * as url from 'node:url';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
|
|
7
|
+
import 'dotenv/config';
|
|
8
|
+
import merge from 'deepmerge';
|
|
9
|
+
import winston from 'winston';
|
|
10
|
+
import { getFilesPathWithInheritance } from './helpers/files.js';
|
|
11
|
+
import { consoleLogger } from './helpers/logger.js';
|
|
12
|
+
import Cache from './services/cache/Cache.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Main framework class.
|
|
@@ -139,8 +140,9 @@ class Server {
|
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
async #initConfigFiles() {
|
|
143
|
+
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
142
144
|
const files = await getFilesPathWithInheritance({
|
|
143
|
-
internalFolder:
|
|
145
|
+
internalFolder: path.join(dirname, '/config'),
|
|
144
146
|
externalFolder: this.app.foldersConfig.config,
|
|
145
147
|
loggerFileType: 'CONFIG',
|
|
146
148
|
logger: (m) => consoleLogger('info', m),
|
|
@@ -192,8 +194,9 @@ class Server {
|
|
|
192
194
|
}
|
|
193
195
|
|
|
194
196
|
async #loadModelFiles() {
|
|
197
|
+
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
195
198
|
const files = await getFilesPathWithInheritance({
|
|
196
|
-
internalFolder:
|
|
199
|
+
internalFolder: path.join(dirname, '/models'),
|
|
197
200
|
externalFolder: this.app.foldersConfig.models,
|
|
198
201
|
loggerFileType: 'MODEL',
|
|
199
202
|
logger: (m) => consoleLogger('info', m),
|
|
@@ -395,4 +398,4 @@ class Server {
|
|
|
395
398
|
}
|
|
396
399
|
}
|
|
397
400
|
|
|
398
|
-
|
|
401
|
+
export default Server;
|
package/services/cache/Cache.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import Base from '../../modules/Base.js';
|
|
2
2
|
|
|
3
3
|
class Cache extends Base {
|
|
4
4
|
constructor(app) {
|
|
@@ -117,4 +117,4 @@ class Cache extends Base {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
export default Cache;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import Base from '../../modules/Base.js';
|
|
2
|
+
import ValidateService from '../validate/ValidateService.js';
|
|
3
3
|
|
|
4
4
|
class DocumentationGenerator extends Base {
|
|
5
5
|
// eslint-disable-next-line class-methods-use-this
|
|
@@ -166,4 +166,4 @@ class DocumentationGenerator extends Base {
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
|
|
169
|
+
export default DocumentationGenerator;
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const Base = require('../../modules/Base');
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import * as url from 'node:url';
|
|
4
|
+
import express from 'express';
|
|
5
|
+
import RequestLoggerMiddleware from './middleware/RequestLogger.js';
|
|
6
|
+
import I18nMiddleware from './middleware/I18n.js';
|
|
7
|
+
import PrepareAppInfoMiddleware from './middleware/PrepareAppInfo.js';
|
|
8
|
+
import RequestParserMiddleware from './middleware/RequestParser.js';
|
|
9
|
+
import StaticFilesMiddleware from './middleware/StaticFiles.js';
|
|
10
|
+
import Cors from './middleware/Cors.js';
|
|
11
|
+
import Base from '../../modules/Base.js';
|
|
13
12
|
|
|
14
13
|
/**
|
|
15
14
|
* HTTP server based on Express
|
|
@@ -19,9 +18,10 @@ class HttpServer extends Base {
|
|
|
19
18
|
super(app);
|
|
20
19
|
this.express = express();
|
|
21
20
|
this.express.disable('x-powered-by');
|
|
21
|
+
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
22
22
|
this.express.set('views', [
|
|
23
23
|
this.app.foldersConfig.views,
|
|
24
|
-
path.join(
|
|
24
|
+
path.join(dirname, '../../views'),
|
|
25
25
|
]);
|
|
26
26
|
this.express.set('view engine', 'pug');
|
|
27
27
|
|
|
@@ -40,7 +40,7 @@ class HttpServer extends Base {
|
|
|
40
40
|
new StaticFilesMiddleware(this.app, {
|
|
41
41
|
folders: [
|
|
42
42
|
this.app.foldersConfig.public,
|
|
43
|
-
path.join(
|
|
43
|
+
path.join(dirname, '../../public/files'),
|
|
44
44
|
],
|
|
45
45
|
}).getMiddleware(),
|
|
46
46
|
);
|
|
@@ -101,4 +101,4 @@ class HttpServer extends Base {
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
export default HttpServer;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import yup from 'yup';
|
|
2
|
+
import Base from '../../../modules/Base.js';
|
|
3
3
|
|
|
4
4
|
class AbstractMiddleware extends Base {
|
|
5
5
|
constructor(app, params) {
|
|
@@ -48,4 +48,4 @@ class AbstractMiddleware extends Base {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
export default AbstractMiddleware;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
2
2
|
|
|
3
3
|
class AuthMiddleware extends AbstractMiddleware {
|
|
4
4
|
static get description() {
|
|
@@ -17,4 +17,4 @@ class AuthMiddleware extends AbstractMiddleware {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
export default AuthMiddleware;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
2
2
|
|
|
3
3
|
class Cors extends AbstractMiddleware {
|
|
4
4
|
constructor(app, params) {
|
|
@@ -43,4 +43,4 @@ class Cors extends AbstractMiddleware {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
export default Cors;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
2
2
|
|
|
3
3
|
class GetUserByToken extends AbstractMiddleware {
|
|
4
4
|
static get description() {
|
|
@@ -43,4 +43,4 @@ class GetUserByToken extends AbstractMiddleware {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
export default GetUserByToken;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const AbstractMiddleware = require('./AbstractMiddleware');
|
|
1
|
+
import i18next from 'i18next';
|
|
2
|
+
import BackendFS from 'i18next-fs-backend';
|
|
3
|
+
import Backend from 'i18next-chained-backend';
|
|
4
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
6
5
|
|
|
7
6
|
class I18n extends AbstractMiddleware {
|
|
8
7
|
constructor(app, params) {
|
|
@@ -116,4 +115,4 @@ class I18n extends AbstractMiddleware {
|
|
|
116
115
|
}
|
|
117
116
|
}
|
|
118
117
|
|
|
119
|
-
|
|
118
|
+
export default I18n;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import yup from 'yup';
|
|
2
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
3
3
|
/**
|
|
4
4
|
* Middleware for reusing pagination
|
|
5
5
|
*/
|
|
@@ -53,4 +53,4 @@ class Pagination extends AbstractMiddleware {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
export default Pagination;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
2
2
|
|
|
3
3
|
class PrepareAppInfo extends AbstractMiddleware {
|
|
4
4
|
static get description() {
|
|
@@ -15,4 +15,4 @@ class PrepareAppInfo extends AbstractMiddleware {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
export default PrepareAppInfo;
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import {
|
|
2
2
|
RateLimiterMemory,
|
|
3
3
|
RateLimiterRedis,
|
|
4
4
|
RateLimiterMongo,
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const AbstractMiddleware = require('./AbstractMiddleware');
|
|
5
|
+
} from 'rate-limiter-flexible';
|
|
6
|
+
import merge from 'deepmerge';
|
|
7
|
+
import redis from 'redis';
|
|
8
|
+
import mongoose from 'mongoose';
|
|
9
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
11
10
|
|
|
12
11
|
class RateLimiter extends AbstractMiddleware {
|
|
13
12
|
static get description() {
|
|
@@ -126,4 +125,4 @@ class RateLimiter extends AbstractMiddleware {
|
|
|
126
125
|
}
|
|
127
126
|
}
|
|
128
127
|
|
|
129
|
-
|
|
128
|
+
export default RateLimiter;
|
|
@@ -2,7 +2,7 @@ import { setTimeout } from 'node:timers/promises';
|
|
|
2
2
|
import crypto from 'node:crypto';
|
|
3
3
|
import { beforeAll, afterAll, describe, it, expect } from 'vitest';
|
|
4
4
|
|
|
5
|
-
import RateLimiter from './RateLimiter';
|
|
5
|
+
import RateLimiter from './RateLimiter.js';
|
|
6
6
|
|
|
7
7
|
let mongoRateLimiter;
|
|
8
8
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
2
2
|
|
|
3
3
|
class RequestLogger extends AbstractMiddleware {
|
|
4
4
|
static get description() {
|
|
@@ -19,4 +19,4 @@ class RequestLogger extends AbstractMiddleware {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
export default RequestLogger;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const AbstractMiddleware = require('./AbstractMiddleware');
|
|
1
|
+
import formidable from 'formidable';
|
|
2
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
4
3
|
|
|
5
4
|
class RequestParser extends AbstractMiddleware {
|
|
6
5
|
static get description() {
|
|
@@ -35,4 +34,4 @@ class RequestParser extends AbstractMiddleware {
|
|
|
35
34
|
}
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
export default RequestParser;
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
2
|
import { describe, it, expect } from 'vitest';
|
|
3
|
+
import { PersistentFile } from 'formidable';
|
|
3
4
|
|
|
4
|
-
import RequestParser from './RequestParser';
|
|
5
|
-
|
|
6
|
-
// TODO change on ESM
|
|
7
|
-
const formidable = require('formidable');
|
|
5
|
+
import RequestParser from './RequestParser.js';
|
|
8
6
|
|
|
9
7
|
describe('reqest parser limiter methods', () => {
|
|
10
8
|
it('have description fields', async () => {
|
|
@@ -26,7 +24,7 @@ describe('reqest parser limiter methods', () => {
|
|
|
26
24
|
expect(req.body.title).toBeDefined();
|
|
27
25
|
expect(req.body.multipleFiles).toBeDefined();
|
|
28
26
|
expect(
|
|
29
|
-
req.body.multipleFiles[0] instanceof
|
|
27
|
+
req.body.multipleFiles[0] instanceof PersistentFile,
|
|
30
28
|
).toBeTruthy();
|
|
31
29
|
|
|
32
30
|
res.writeHead(200);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
2
2
|
|
|
3
3
|
class RoleMiddleware extends AbstractMiddleware {
|
|
4
4
|
static get description() {
|
|
@@ -26,4 +26,4 @@ class RoleMiddleware extends AbstractMiddleware {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
export default RoleMiddleware;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const AbstractMiddleware = require('./AbstractMiddleware');
|
|
1
|
+
import fsPromises from 'node:fs/promises';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import mime from 'mime';
|
|
5
|
+
import AbstractMiddleware from './AbstractMiddleware.js';
|
|
7
6
|
/**
|
|
8
7
|
* Middleware for static files
|
|
9
8
|
*/
|
|
@@ -57,4 +56,4 @@ class StaticFiles extends AbstractMiddleware {
|
|
|
57
56
|
}
|
|
58
57
|
}
|
|
59
58
|
|
|
60
|
-
|
|
59
|
+
export default StaticFiles;
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import * as url from 'node:url';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
import nodemailer from 'nodemailer';
|
|
6
|
+
import sendMail from 'nodemailer-sendmail-transport';
|
|
7
|
+
import stub from 'nodemailer-stub-transport';
|
|
8
|
+
import pug from 'pug';
|
|
9
|
+
import juice from 'juice';
|
|
10
|
+
import { convert } from 'html-to-text';
|
|
11
|
+
import Base from '../../../modules/Base.js';
|
|
10
12
|
|
|
11
13
|
const mailTransports = {
|
|
12
14
|
sendMail,
|
|
13
15
|
stub,
|
|
14
16
|
smtp: (data) => data,
|
|
15
17
|
};
|
|
16
|
-
const Base = require('../../../modules/Base');
|
|
17
18
|
|
|
18
19
|
class Mail extends Base {
|
|
19
20
|
/**
|
|
@@ -25,6 +26,7 @@ class Mail extends Base {
|
|
|
25
26
|
*/
|
|
26
27
|
constructor(app, template, templateData = {}, i18n = null) {
|
|
27
28
|
super(app);
|
|
29
|
+
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
28
30
|
if (!path.isAbsolute(template)) {
|
|
29
31
|
if (
|
|
30
32
|
fs.existsSync(
|
|
@@ -35,11 +37,16 @@ class Mail extends Base {
|
|
|
35
37
|
template,
|
|
36
38
|
)}`;
|
|
37
39
|
} else if (
|
|
38
|
-
fs.existsSync(
|
|
40
|
+
fs.existsSync(
|
|
41
|
+
path.join(dirname, `/templates/${path.basename(template)}`),
|
|
42
|
+
)
|
|
39
43
|
) {
|
|
40
|
-
this.template =
|
|
44
|
+
this.template = path.join(
|
|
45
|
+
dirname,
|
|
46
|
+
`/templates/${path.basename(template)}`,
|
|
47
|
+
);
|
|
41
48
|
} else {
|
|
42
|
-
this.template =
|
|
49
|
+
this.template = path.join(dirname, `/templates/emptyTemplate`);
|
|
43
50
|
this.logger.error(
|
|
44
51
|
`Template '${template}' not found. Using 'emptyTemplate' as a fallback`,
|
|
45
52
|
);
|
|
@@ -215,4 +222,4 @@ class Mail extends Base {
|
|
|
215
222
|
}
|
|
216
223
|
}
|
|
217
224
|
|
|
218
|
-
|
|
225
|
+
export default Mail;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import yup from 'yup';
|
|
2
|
+
import YupValidator from './drivers/YupValidator.js';
|
|
3
|
+
import CustomValidator from './drivers/CustomValidator.js';
|
|
4
|
+
import Base from '../../modules/Base.js';
|
|
5
5
|
|
|
6
6
|
class ValidateService extends Base {
|
|
7
7
|
constructor(app, validator) {
|
|
@@ -154,4 +154,4 @@ class ValidateService extends Base {
|
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
|
|
157
|
+
export default ValidateService;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
import yup from 'yup';
|
|
4
|
+
import ValidateService from './ValidateService.js';
|
|
5
|
+
import YupValidator from './drivers/YupValidator.js';
|
|
6
|
+
import CustomValidator from './drivers/CustomValidator.js';
|
|
7
7
|
|
|
8
8
|
describe('validate service', () => {
|
|
9
9
|
describe('validateSchema funtion', () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import Base from '../../../modules/Base.js';
|
|
2
2
|
|
|
3
3
|
class AbstractValidator extends Base {
|
|
4
4
|
constructor(app, body) {
|
|
@@ -34,4 +34,4 @@ class AbstractValidator extends Base {
|
|
|
34
34
|
return 'AbstractValidator_';
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
|
|
37
|
+
export default AbstractValidator;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const AbstractValidator = require('./AbstractValidator');
|
|
1
|
+
import yup from 'yup';
|
|
2
|
+
import AbstractValidator from './AbstractValidator.js';
|
|
4
3
|
|
|
5
4
|
class CustomValidator extends AbstractValidator {
|
|
6
5
|
async validateFields(data, { query, body, appInfo }) {
|
|
@@ -49,4 +48,4 @@ class CustomValidator extends AbstractValidator {
|
|
|
49
48
|
}
|
|
50
49
|
}
|
|
51
50
|
|
|
52
|
-
|
|
51
|
+
export default CustomValidator;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import yup from 'yup';
|
|
2
|
+
import AbstractValidator from './AbstractValidator.js';
|
|
3
3
|
|
|
4
4
|
class YupValidator extends AbstractValidator {
|
|
5
5
|
get fieldsInJsonFormat() {
|
|
@@ -100,4 +100,4 @@ class YupValidator extends AbstractValidator {
|
|
|
100
100
|
return 'YupValidator_';
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
|
-
|
|
103
|
+
export default YupValidator;
|